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 
69   virtual internal::AssemblerBase* AsAssemblerBase() VIXL_OVERRIDE {
70     return this;
71   }
72 
73   virtual bool ArePoolsBlocked() const VIXL_OVERRIDE {
74     return pool_manager_.IsBlocked();
75   }
76 
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 #ifndef PANDA_BUILD
86     pool_end_ = new Label();
87 #else
88     pool_end_ = allocator_.New<Label>(allocator_);
89 #endif
90     ExactAssemblyScopeWithoutPoolsCheck guard(this,
91                                               kMaxInstructionSizeInBytes,
92                                               ExactAssemblyScope::kMaximumSize);
93     b(pool_end_);
94   }
95   virtual void EmitPoolFooter() VIXL_OVERRIDE {
96     // Align buffer to 4 bytes.
97     GetBuffer()->Align();
98     if (pool_end_ != NULL) {
99       Bind(pool_end_);
100 #ifndef VIXL_USE_PANDA_ALLOC
101       delete pool_end_;
102 #endif
103       pool_end_ = NULL;
104     }
105   }
106   virtual void EmitPaddingBytes(int n) VIXL_OVERRIDE {
107     GetBuffer()->EmitZeroedBytes(n);
108   }
109   virtual void EmitNopBytes(int n) VIXL_OVERRIDE {
110     int nops = 0;
111     int nop_size = IsUsingT32() ? k16BitT32InstructionSizeInBytes
112                                 : kA32InstructionSizeInBytes;
113     VIXL_ASSERT(n % nop_size == 0);
114     nops = n / nop_size;
115     ExactAssemblyScopeWithoutPoolsCheck guard(this,
116                                               n,
117                                               ExactAssemblyScope::kExactSize);
118     for (int i = 0; i < nops; ++i) {
119       nop();
120     }
121   }
122 
123 
124  private:
125   class MacroEmissionCheckScope : public EmissionCheckScope {
126    public:
MacroEmissionCheckScope(MacroAssemblerInterface* masm, PoolPolicy pool_policy = kBlockPools)127     explicit MacroEmissionCheckScope(MacroAssemblerInterface* masm,
128                                      PoolPolicy pool_policy = kBlockPools)
129         : EmissionCheckScope(masm,
130                              kTypicalMacroInstructionMaxSize,
131                              kMaximumSize,
132                              pool_policy) {}
133 
134    private:
135     static const size_t kTypicalMacroInstructionMaxSize =
136         8 * kMaxInstructionSizeInBytes;
137   };
138 
139   class MacroAssemblerContext {
140    public:
MacroAssemblerContext()141     MacroAssemblerContext() : count_(0) {}
~MacroAssemblerContext()142     ~MacroAssemblerContext() {}
GetRecursiveCount() const143     unsigned GetRecursiveCount() const { return count_; }
Up(const char* loc)144     void Up(const char* loc) {
145       location_stack_[count_] = loc;
146       count_++;
147       if (count_ >= kMaxRecursion) {
148         printf(
149             "Recursion limit reached; unable to resolve macro assembler "
150             "call.\n");
151         printf("Macro assembler context stack:\n");
152         for (unsigned i = 0; i < kMaxRecursion; i++) {
153           printf("%10s %s\n", (i == 0) ? "oldest -> " : "", location_stack_[i]);
154         }
155         VIXL_ABORT();
156       }
157     }
Down()158     void Down() {
159       VIXL_ASSERT((count_ > 0) && (count_ < kMaxRecursion));
160       count_--;
161     }
162 
163    private:
164     unsigned count_;
165     static const uint32_t kMaxRecursion = 6;
166     const char* location_stack_[kMaxRecursion];
167   };
168 
169   // This scope is used at each Delegate entry to avoid infinite recursion of
170   // Delegate calls. The limit is defined by
171   // MacroAssemblerContext::kMaxRecursion.
172   class ContextScope {
173    public:
ContextScope(MacroAssembler* const masm, const char* loc)174     explicit ContextScope(MacroAssembler* const masm, const char* loc)
175         : masm_(masm) {
176       VIXL_ASSERT(masm_->AllowMacroInstructions());
177       masm_->GetContext()->Up(loc);
178     }
~ContextScope()179     ~ContextScope() { masm_->GetContext()->Down(); }
180 
181    private:
182     MacroAssembler* const masm_;
183   };
184 
GetContext()185   MacroAssemblerContext* GetContext() { return &context_; }
186 
187   class ITScope {
188    public:
189 #ifndef PANDA_BUILD
ITScope(MacroAssembler* masm, Condition* cond, const MacroEmissionCheckScope& scope, bool can_use_it = false)190     ITScope(MacroAssembler* masm,
191             Condition* cond,
192             const MacroEmissionCheckScope& scope,
193             bool can_use_it = false)
194         : masm_(masm), cond_(*cond), can_use_it_(can_use_it) {
195 #else
196 ITScope(MacroAssembler* , Condition* , const MacroEmissionCheckScope& ,
197         bool can_use_it = false) = delete;
198 ITScope(AllocatorWrapper allocator, MacroAssembler* masm,
199         Condition* cond,
200         const MacroEmissionCheckScope& scope,
201         bool can_use_it = false)
202     : masm_(masm), cond_(*cond), label_(allocator), can_use_it_(can_use_it) {
203 #endif
204       // The 'scope' argument is used to remind us to only use this scope inside
205       // a MacroEmissionCheckScope. This way, we do not need to check whether
206       // we need to emit the pools or grow the code buffer when emitting the
207       // IT or B instructions.
208       USE(scope);
209       if (!cond_.Is(al) && masm->IsUsingT32()) {
210         if (can_use_it_) {
211           // IT is not deprecated (that implies a 16 bit T32 instruction).
212           // We generate an IT instruction and a conditional instruction.
213           masm->it(cond_);
214         } else {
215           // The usage of IT is deprecated for the instruction.
216           // We generate a conditional branch and an unconditional instruction.
217           // Generate the branch.
218           masm_->b(cond_.Negate(), Narrow, &label_);
219           // Tell the macro-assembler to generate unconditional instructions.
220           *cond = al;
221         }
222       }
223 #ifdef VIXL_DEBUG
224       initial_cursor_offset_ = masm->GetCursorOffset();
225 #else
226       USE(initial_cursor_offset_);
227 #endif
228     }
229     ~ITScope() {
230       if (label_.IsReferenced()) {
231         // We only use the label for conditional T32 instructions for which we
232         // cannot use IT.
233         VIXL_ASSERT(!cond_.Is(al));
234         VIXL_ASSERT(masm_->IsUsingT32());
235         VIXL_ASSERT(!can_use_it_);
236         VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <=
237                     kMaxT32MacroInstructionSizeInBytes);
238         masm_->BindHelper(&label_);
239       } else if (masm_->IsUsingT32() && !cond_.Is(al)) {
240         // If we've generated a conditional T32 instruction but haven't used the
241         // label, we must have used IT. Check that we did not generate a
242         // deprecated sequence.
243         VIXL_ASSERT(can_use_it_);
244         VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <=
245                     k16BitT32InstructionSizeInBytes);
246       }
247     }
248 
249    private:
250     MacroAssembler* masm_;
251     Condition cond_;
252     Label label_;
253     bool can_use_it_;
254     uint32_t initial_cursor_offset_;
255   };
256 
257  protected:
258   virtual void BlockPools() VIXL_OVERRIDE { pool_manager_.Block(); }
259   virtual void ReleasePools() VIXL_OVERRIDE {
260     pool_manager_.Release(GetCursorOffset());
261   }
262   virtual void EnsureEmitPoolsFor(size_t size) VIXL_OVERRIDE;
263 
264   // Tell whether any of the macro instruction can be used. When false the
265   // MacroAssembler will assert if a method which can emit a variable number
266   // of instructions is called.
267   virtual void SetAllowMacroInstructions(bool value) VIXL_OVERRIDE {
268     allow_macro_instructions_ = value;
269   }
270 
271   void HandleOutOfBoundsImmediate(Condition cond, Register tmp, uint32_t imm);
272 
273  public:
274   // TODO: If we change the MacroAssembler to disallow setting a different ISA,
275   // we can change the alignment of the pool in the pool manager constructor to
276   // be 2 bytes for T32.
277 #ifdef PANDA_BUILD
MacroAssembler(PandaAllocator* allocator, InstructionSet isa = kDefaultISA)278   explicit MacroAssembler(PandaAllocator* allocator, InstructionSet isa = kDefaultISA)
279 #else
280   explicit MacroAssembler(InstructionSet isa = kDefaultISA)
281 #endif
282       : Assembler(isa),
283         available_(r12),
284         current_scratch_scope_(NULL),
285 #ifndef PANDA_BUILD
286         pool_manager_(4 /*header_size*/,
287                       4 /*alignment*/,
288                       4 /*buffer_alignment*/),
289         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
290         pool_end_(NULL) {
291 #else
292         pool_manager_(allocator,
293                       4 /*header_size*/,
294                       4 /*alignment*/,
295                       4 /*buffer_alignment*/),
296         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
297         pool_end_(NULL), allocator_(allocator) {
298 #endif
299 #ifdef VIXL_DEBUG
300     SetAllowMacroInstructions(  // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall)
301         true);
302 #else
303     USE(allow_macro_instructions_);
304 #endif
305   }
306 
307 #ifdef PANDA_BUILD
308   explicit MacroAssembler(size_t size, InstructionSet isa = kDefaultISA) = delete;
309 #else
310   explicit MacroAssembler(size_t size, InstructionSet isa = kDefaultISA)
311       : Assembler(size, isa),
312         available_(r12),
313         current_scratch_scope_(NULL),
314         pool_manager_(4 /*header_size*/,
315                       4 /*alignment*/,
316                       4 /*buffer_alignment*/),
317         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
318         pool_end_(NULL) {
319 #ifdef VIXL_DEBUG
320     SetAllowMacroInstructions(  // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall)
321         true);
322 #endif
323   }
324 #endif
325 
326 #ifndef PANDA_BUILD
327   MacroAssembler(byte* buffer, size_t size, InstructionSet isa = kDefaultISA)
328       : Assembler(buffer, size, isa),
329         available_(r12),
330         current_scratch_scope_(NULL),
331         pool_manager_(4 /*header_size*/,
332                       4 /*alignment*/,
333                       4 /*buffer_alignment*/),
334         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
335         pool_end_(NULL) {
336 #else
337   MacroAssembler(PandaAllocator* allocator, byte* buffer, size_t size, InstructionSet isa = kDefaultISA)
338       : Assembler(buffer, size, isa),
339         available_(r12),
340         current_scratch_scope_(NULL),
341         pool_manager_(allocator,
342                       4 /*header_size*/,
343                       4 /*alignment*/,
344                       4 /*buffer_alignment*/),
345         generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
346         pool_end_(NULL), allocator_(allocator) {
347 #endif
348 #ifdef VIXL_DEBUG
349     SetAllowMacroInstructions(  // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall)
350         true);
351 #endif
352   }
353 
354   bool GenerateSimulatorCode() const { return generate_simulator_code_; }
355 
356   virtual bool AllowMacroInstructions() const VIXL_OVERRIDE {
357     return allow_macro_instructions_;
358   }
359 
360   void FinalizeCode(FinalizeOption option = kUnreachable) {
361     EmitLiteralPool(option == kUnreachable
362                         ? PoolManager<int32_t>::kNoBranchRequired
363                         : PoolManager<int32_t>::kBranchRequired);
364     Assembler::FinalizeCode();
365   }
366 
367   RegisterList* GetScratchRegisterList() { return &available_; }
368   VRegisterList* GetScratchVRegisterList() { return &available_vfp_; }
369 
370   // Get or set the current (most-deeply-nested) UseScratchRegisterScope.
371   void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) {
372     current_scratch_scope_ = scope;
373   }
374   UseScratchRegisterScope* GetCurrentScratchRegisterScope() {
375     return current_scratch_scope_;
376   }
377 
378   // Given an address calculation (Register + immediate), generate code to
379   // partially compute the address. The returned MemOperand will perform any
380   // remaining computation in a subsequent load or store instruction.
381   //
382   // The offset provided should be the offset that would be used in a load or
383   // store instruction (if it had sufficient range). This only matters where
384   // base.Is(pc), since load and store instructions align the pc before
385   // dereferencing it.
386   //
387   // TODO: Improve the handling of negative offsets. They are not implemented
388   // precisely for now because they only have a marginal benefit for the
389   // existing uses (in delegates).
390   MemOperand MemOperandComputationHelper(Condition cond,
391                                          Register scratch,
392                                          Register base,
393                                          uint32_t offset,
394                                          uint32_t extra_offset_mask = 0);
395 
396   MemOperand MemOperandComputationHelper(Register scratch,
397                                          Register base,
398                                          uint32_t offset,
399                                          uint32_t extra_offset_mask = 0) {
400     return MemOperandComputationHelper(al,
401                                        scratch,
402                                        base,
403                                        offset,
404                                        extra_offset_mask);
405   }
406   MemOperand MemOperandComputationHelper(Condition cond,
407                                          Register scratch,
408                                          Location* location,
409                                          uint32_t extra_offset_mask = 0) {
410     // Check for buffer space _before_ calculating the offset, in case we
411     // generate a pool that affects the offset calculation.
412     CodeBufferCheckScope scope(this, 4 * kMaxInstructionSizeInBytes);
413     Label::Offset offset =
414         location->GetLocation() -
415         AlignDown(GetCursorOffset() + GetArchitectureStatePCOffset(), 4);
416     return MemOperandComputationHelper(cond,
417                                        scratch,
418                                        pc,
419                                        offset,
420                                        extra_offset_mask);
421   }
422   MemOperand MemOperandComputationHelper(Register scratch,
423                                          Location* location,
424                                          uint32_t extra_offset_mask = 0) {
425     return MemOperandComputationHelper(al,
426                                        scratch,
427                                        location,
428                                        extra_offset_mask);
429   }
430 
431   // Determine the appropriate mask to pass into MemOperandComputationHelper.
432   uint32_t GetOffsetMask(InstructionType type, AddrMode addrmode);
433 
434   // State and type helpers.
435   bool IsModifiedImmediate(uint32_t imm) {
436     return IsUsingT32() ? ImmediateT32::IsImmediateT32(imm)
437                         : ImmediateA32::IsImmediateA32(imm);
438   }
439 
440   void Bind(Label* label) {
441     VIXL_ASSERT(allow_macro_instructions_);
442     BindHelper(label);
443   }
444 
445   virtual void BindHelper(Label* label) VIXL_OVERRIDE {
446     // Assert that we have the correct buffer alignment.
447     if (IsUsingT32()) {
448       VIXL_ASSERT(GetBuffer()->Is16bitAligned());
449     } else {
450       VIXL_ASSERT(GetBuffer()->Is32bitAligned());
451     }
452     // If we need to add padding, check if we have to emit the pool.
453     const int32_t cursor = GetCursorOffset();
454     if (label->Needs16BitPadding(cursor)) {
455       const int kPaddingBytes = 2;
456       if (pool_manager_.MustEmit(cursor, kPaddingBytes)) {
457         int32_t new_cursor = pool_manager_.Emit(this, cursor, kPaddingBytes);
458         USE(new_cursor);
459         VIXL_ASSERT(new_cursor == GetCursorOffset());
460       }
461     }
462     pool_manager_.Bind(this, label, GetCursorOffset());
463   }
464 
465   void RegisterLiteralReference(RawLiteral* literal) {
466     if (literal->IsManuallyPlaced()) return;
467     RegisterForwardReference(literal);
468   }
469 
470   void RegisterForwardReference(Location* location) {
471     if (location->IsBound()) return;
472     VIXL_ASSERT(location->HasForwardReferences());
473     const Location::ForwardRef& reference = location->GetLastForwardReference();
474     pool_manager_.AddObjectReference(&reference, location);
475   }
476 
477   void CheckEmitPoolForInstruction(const ReferenceInfo* info,
478                                    Location* location,
479                                    Condition* cond = NULL) {
480     int size = info->size;
481     int32_t cursor = GetCursorOffset();
482     // If we need to emit a branch over the instruction, take this into account.
483     if ((cond != NULL) && NeedBranch(cond)) {
484       size += kBranchSize;
485       cursor += kBranchSize;
486     }
487     int32_t from = cursor;
488     from += IsUsingT32() ? kT32PcDelta : kA32PcDelta;
489     if (info->pc_needs_aligning) from = AlignDown(from, 4);
490     int32_t min = from + info->min_offset;
491     int32_t max = from + info->max_offset;
492     ForwardReference<int32_t> temp_ref(cursor,
493                                        info->size,
494                                        min,
495                                        max,
496                                        info->alignment);
497     if (pool_manager_.MustEmit(GetCursorOffset(), size, &temp_ref, location)) {
498       int32_t new_cursor = pool_manager_.Emit(this,
499                                               GetCursorOffset(),
500                                               info->size,
501                                               &temp_ref,
502                                               location);
503       USE(new_cursor);
504       VIXL_ASSERT(new_cursor == GetCursorOffset());
505     }
506   }
507 
508   void Place(RawLiteral* literal) {
509     VIXL_ASSERT(allow_macro_instructions_);
510     VIXL_ASSERT(literal->IsManuallyPlaced());
511     // Check if we need to emit the pools. Take the alignment of the literal
512     // into account, as well as potential 16-bit padding needed to reach the
513     // minimum accessible location.
514     int alignment = literal->GetMaxAlignment();
515     int32_t cursor = GetCursorOffset();
516     int total_size = AlignUp(cursor, alignment) - cursor + literal->GetSize();
517     if (literal->Needs16BitPadding(cursor)) total_size += 2;
518     if (pool_manager_.MustEmit(cursor, total_size)) {
519       int32_t new_cursor = pool_manager_.Emit(this, cursor, total_size);
520       USE(new_cursor);
521       VIXL_ASSERT(new_cursor == GetCursorOffset());
522     }
523     pool_manager_.Bind(this, literal, GetCursorOffset());
524     literal->EmitPoolObject(this);
525     // Align the buffer, to be ready to generate instructions right after
526     // this.
527     GetBuffer()->Align();
528   }
529 
530   void EmitLiteralPool(PoolManager<int32_t>::EmitOption option =
531                            PoolManager<int32_t>::kBranchRequired) {
532     VIXL_ASSERT(!ArePoolsBlocked());
533     int32_t new_pc =
534         pool_manager_.Emit(this, GetCursorOffset(), 0, NULL, NULL, option);
535     VIXL_ASSERT(new_pc == GetCursorOffset());
536     USE(new_pc);
537   }
538 
539   void EnsureEmitFor(uint32_t size) {
540     EnsureEmitPoolsFor(size);
541     GetBuffer()->EnsureSpaceFor(size);
542   }
543 
544   bool AliasesAvailableScratchRegister([[maybe_unused]] Register reg) {
545 #ifndef PANDA_BUILD
546     return GetScratchRegisterList()->Includes(reg);
547 #endif
548     return false;
549   }
550 
551   bool AliasesAvailableScratchRegister([[maybe_unused]] RegisterOrAPSR_nzcv reg) {
552 #ifndef PANDA_BUILD
553     if (reg.IsAPSR_nzcv()) return false;
554     return GetScratchRegisterList()->Includes(reg.AsRegister());
555 #endif
556     return false;
557   }
558 
559   bool AliasesAvailableScratchRegister([[maybe_unused]] VRegister reg) {
560 #ifndef PANDA_BUILD
561     return GetScratchVRegisterList()->IncludesAliasOf(reg);
562 #endif
563     return false;
564   }
565 
566   bool AliasesAvailableScratchRegister([[maybe_unused]] const Operand& operand) {
567 #ifndef PANDA_BUILD
568     if (operand.IsImmediate()) return false;
569     return AliasesAvailableScratchRegister(operand.GetBaseRegister()) ||
570            (operand.IsRegisterShiftedRegister() &&
571             AliasesAvailableScratchRegister(operand.GetShiftRegister()));
572 #endif
573     return false;
574   }
575 
576   bool AliasesAvailableScratchRegister([[maybe_unused]] const NeonOperand& operand) {
577 #ifndef PANDA_BUILD
578     if (operand.IsImmediate()) return false;
579     return AliasesAvailableScratchRegister(operand.GetRegister());
580 #endif
581     return false;
582   }
583 
584   bool AliasesAvailableScratchRegister([[maybe_unused]] SRegisterList list) {
585 #ifndef PANDA_BUILD
586     for (int n = 0; n < list.GetLength(); n++) {
587       if (AliasesAvailableScratchRegister(list.GetSRegister(n))) return true;
588     }
589     return false;
590 #endif
591     return false;
592   }
593 
594   bool AliasesAvailableScratchRegister([[maybe_unused]] DRegisterList list) {
595 #ifndef PANDA_BUILD
596     for (int n = 0; n < list.GetLength(); n++) {
597       if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true;
598     }
599     return false;
600 #endif
601     return false;
602   }
603 
604   bool AliasesAvailableScratchRegister([[maybe_unused]] NeonRegisterList list) {
605 #ifndef PANDA_BUILD
606     for (int n = 0; n < list.GetLength(); n++) {
607       if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true;
608     }
609     return false;
610 #endif
611     return false;
612   }
613 
614   bool AliasesAvailableScratchRegister([[maybe_unused]] RegisterList list) {
615 #ifndef PANDA_BUILD
616     return GetScratchRegisterList()->Overlaps(list);
617 #endif
618     return false;
619   }
620 
621   bool AliasesAvailableScratchRegister([[maybe_unused]] const MemOperand& operand) {
622 #ifndef PANDA_BUILD
623     return AliasesAvailableScratchRegister(operand.GetBaseRegister()) ||
624            (operand.IsShiftedRegister() &&
625             AliasesAvailableScratchRegister(operand.GetOffsetRegister()));
626 #endif
627     return false;
628   }
629 
630   // Adr with a literal already constructed. Add the literal to the pool if it
631   // is not already done.
632   void Adr(Condition cond, Register rd, RawLiteral* literal) {
633     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
634     VIXL_ASSERT(allow_macro_instructions_);
635     VIXL_ASSERT(OutsideITBlock());
636     MacroEmissionCheckScope::PoolPolicy pool_policy =
637         MacroEmissionCheckScope::kBlockPools;
638     if (!literal->IsBound()) {
639       const ReferenceInfo* info;
640       bool can_encode = adr_info(cond, Best, rd, literal, &info);
641       VIXL_CHECK(can_encode);
642       CheckEmitPoolForInstruction(info, literal, &cond);
643       // We have already checked for pool emission.
644       pool_policy = MacroEmissionCheckScope::kIgnorePools;
645     }
646     MacroEmissionCheckScope guard(this, pool_policy);
647 #ifndef PANDA_BUILD
648     ITScope it_scope(this, &cond, guard);
649 #else
650     ITScope it_scope(allocator_, this, &cond, guard);
651 #endif
652     adr(cond, Best, rd, literal);
653     RegisterLiteralReference(literal);
654   }
655   void Adr(Register rd, RawLiteral* literal) { Adr(al, rd, literal); }
656 
657   // Loads with literals already constructed. Add the literal to the pool
658   // if it is not already done.
659   void Ldr(Condition cond, Register rt, RawLiteral* literal) {
660     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
661     VIXL_ASSERT(allow_macro_instructions_);
662     VIXL_ASSERT(OutsideITBlock());
663     MacroEmissionCheckScope::PoolPolicy pool_policy =
664         MacroEmissionCheckScope::kBlockPools;
665     if (!literal->IsBound()) {
666       const ReferenceInfo* info;
667       bool can_encode = ldr_info(cond, Best, rt, literal, &info);
668       VIXL_CHECK(can_encode);
669       CheckEmitPoolForInstruction(info, literal, &cond);
670       // We have already checked for pool emission.
671       pool_policy = MacroEmissionCheckScope::kIgnorePools;
672     }
673     MacroEmissionCheckScope guard(this, pool_policy);
674 #ifndef PANDA_BUILD
675     ITScope it_scope(this, &cond, guard);
676 #else
677     ITScope it_scope(allocator_, this, &cond, guard);
678 #endif
679     ldr(cond, rt, literal);
680     RegisterLiteralReference(literal);
681   }
682   void Ldr(Register rt, RawLiteral* literal) { Ldr(al, rt, literal); }
683 
684   void Ldrb(Condition cond, Register rt, RawLiteral* literal) {
685     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
686     VIXL_ASSERT(allow_macro_instructions_);
687     VIXL_ASSERT(OutsideITBlock());
688     MacroEmissionCheckScope::PoolPolicy pool_policy =
689         MacroEmissionCheckScope::kBlockPools;
690     if (!literal->IsBound()) {
691       const ReferenceInfo* info;
692       bool can_encode = ldrb_info(cond, rt, literal, &info);
693       VIXL_CHECK(can_encode);
694       CheckEmitPoolForInstruction(info, literal, &cond);
695       // We have already checked for pool emission.
696       pool_policy = MacroEmissionCheckScope::kIgnorePools;
697     }
698     MacroEmissionCheckScope guard(this, pool_policy);
699 #ifndef PANDA_BUILD
700     ITScope it_scope(this, &cond, guard);
701 #else
702     ITScope it_scope(allocator_, this, &cond, guard);
703 #endif
704     ldrb(cond, rt, literal);
705     RegisterLiteralReference(literal);
706   }
707   void Ldrb(Register rt, RawLiteral* literal) { Ldrb(al, rt, literal); }
708 
709   void Ldrd(Condition cond, Register rt, Register rt2, RawLiteral* literal) {
710     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
711     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
712     VIXL_ASSERT(allow_macro_instructions_);
713     VIXL_ASSERT(OutsideITBlock());
714     MacroEmissionCheckScope::PoolPolicy pool_policy =
715         MacroEmissionCheckScope::kBlockPools;
716     if (!literal->IsBound()) {
717       const ReferenceInfo* info;
718       bool can_encode = ldrd_info(cond, rt, rt2, literal, &info);
719       VIXL_CHECK(can_encode);
720       CheckEmitPoolForInstruction(info, literal, &cond);
721       // We have already checked for pool emission.
722       pool_policy = MacroEmissionCheckScope::kIgnorePools;
723     }
724     MacroEmissionCheckScope guard(this, pool_policy);
725 #ifndef PANDA_BUILD
726     ITScope it_scope(this, &cond, guard);
727 #else
728     ITScope it_scope(allocator_, this, &cond, guard);
729 #endif
730     ldrd(cond, rt, rt2, literal);
731     RegisterLiteralReference(literal);
732   }
733   void Ldrd(Register rt, Register rt2, RawLiteral* literal) {
734     Ldrd(al, rt, rt2, literal);
735   }
736 
737   void Ldrh(Condition cond, Register rt, RawLiteral* literal) {
738     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
739     VIXL_ASSERT(allow_macro_instructions_);
740     VIXL_ASSERT(OutsideITBlock());
741     MacroEmissionCheckScope::PoolPolicy pool_policy =
742         MacroEmissionCheckScope::kBlockPools;
743     if (!literal->IsBound()) {
744       const ReferenceInfo* info;
745       bool can_encode = ldrh_info(cond, rt, literal, &info);
746       VIXL_CHECK(can_encode);
747       CheckEmitPoolForInstruction(info, literal, &cond);
748       // We have already checked for pool emission.
749       pool_policy = MacroEmissionCheckScope::kIgnorePools;
750     }
751     MacroEmissionCheckScope guard(this, pool_policy);
752 #ifndef PANDA_BUILD
753     ITScope it_scope(this, &cond, guard);
754 #else
755     ITScope it_scope(allocator_, this, &cond, guard);
756 #endif
757     ldrh(cond, rt, literal);
758     RegisterLiteralReference(literal);
759   }
760   void Ldrh(Register rt, RawLiteral* literal) { Ldrh(al, rt, literal); }
761 
762   void Ldrsb(Condition cond, Register rt, RawLiteral* literal) {
763     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
764     VIXL_ASSERT(allow_macro_instructions_);
765     VIXL_ASSERT(OutsideITBlock());
766     MacroEmissionCheckScope::PoolPolicy pool_policy =
767         MacroEmissionCheckScope::kBlockPools;
768     if (!literal->IsBound()) {
769       const ReferenceInfo* info;
770       bool can_encode = ldrsb_info(cond, rt, literal, &info);
771       VIXL_CHECK(can_encode);
772       CheckEmitPoolForInstruction(info, literal, &cond);
773       // We have already checked for pool emission.
774       pool_policy = MacroEmissionCheckScope::kIgnorePools;
775     }
776     MacroEmissionCheckScope guard(this, pool_policy);
777 #ifndef PANDA_BUILD
778     ITScope it_scope(this, &cond, guard);
779 #else
780     ITScope it_scope(allocator_, this, &cond, guard);
781 #endif
782     ldrsb(cond, rt, literal);
783     RegisterLiteralReference(literal);
784   }
785   void Ldrsb(Register rt, RawLiteral* literal) { Ldrsb(al, rt, literal); }
786 
787   void Ldrsh(Condition cond, Register rt, RawLiteral* literal) {
788     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
789     VIXL_ASSERT(allow_macro_instructions_);
790     VIXL_ASSERT(OutsideITBlock());
791     MacroEmissionCheckScope::PoolPolicy pool_policy =
792         MacroEmissionCheckScope::kBlockPools;
793     if (!literal->IsBound()) {
794       const ReferenceInfo* info;
795       bool can_encode = ldrsh_info(cond, rt, literal, &info);
796       VIXL_CHECK(can_encode);
797       CheckEmitPoolForInstruction(info, literal, &cond);
798       // We have already checked for pool emission.
799       pool_policy = MacroEmissionCheckScope::kIgnorePools;
800     }
801     MacroEmissionCheckScope guard(this, pool_policy);
802 #ifndef PANDA_BUILD
803     ITScope it_scope(this, &cond, guard);
804 #else
805     ITScope it_scope(allocator_, this, &cond, guard);
806 #endif
807     ldrsh(cond, rt, literal);
808     RegisterLiteralReference(literal);
809   }
810   void Ldrsh(Register rt, RawLiteral* literal) { Ldrsh(al, rt, literal); }
811 
812   void Vldr(Condition cond, DataType dt, DRegister rd, RawLiteral* literal) {
813     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
814     VIXL_ASSERT(allow_macro_instructions_);
815     VIXL_ASSERT(OutsideITBlock());
816     MacroEmissionCheckScope::PoolPolicy pool_policy =
817         MacroEmissionCheckScope::kBlockPools;
818     if (!literal->IsBound()) {
819       const ReferenceInfo* info;
820       bool can_encode = vldr_info(cond, dt, rd, literal, &info);
821       VIXL_CHECK(can_encode);
822       CheckEmitPoolForInstruction(info, literal, &cond);
823       // We have already checked for pool emission.
824       pool_policy = MacroEmissionCheckScope::kIgnorePools;
825     }
826     MacroEmissionCheckScope guard(this, pool_policy);
827 #ifndef PANDA_BUILD
828     ITScope it_scope(this, &cond, guard);
829 #else
830     ITScope it_scope(allocator_, this, &cond, guard);
831 #endif
832     vldr(cond, dt, rd, literal);
833     RegisterLiteralReference(literal);
834   }
835   void Vldr(DataType dt, DRegister rd, RawLiteral* literal) {
836     Vldr(al, dt, rd, literal);
837   }
838   void Vldr(Condition cond, DRegister rd, RawLiteral* literal) {
839     Vldr(cond, Untyped64, rd, literal);
840   }
841   void Vldr(DRegister rd, RawLiteral* literal) {
842     Vldr(al, Untyped64, rd, literal);
843   }
844 
845   void Vldr(Condition cond, DataType dt, SRegister rd, RawLiteral* literal) {
846     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
847     VIXL_ASSERT(allow_macro_instructions_);
848     VIXL_ASSERT(OutsideITBlock());
849     MacroEmissionCheckScope::PoolPolicy pool_policy =
850         MacroEmissionCheckScope::kBlockPools;
851     if (!literal->IsBound()) {
852       const ReferenceInfo* info;
853       bool can_encode = vldr_info(cond, dt, rd, literal, &info);
854       VIXL_CHECK(can_encode);
855       CheckEmitPoolForInstruction(info, literal, &cond);
856       // We have already checked for pool emission.
857       pool_policy = MacroEmissionCheckScope::kIgnorePools;
858     }
859     MacroEmissionCheckScope guard(this, pool_policy);
860 #ifndef PANDA_BUILD
861     ITScope it_scope(this, &cond, guard);
862 #else
863     ITScope it_scope(allocator_, this, &cond, guard);
864 #endif
865     vldr(cond, dt, rd, literal);
866     RegisterLiteralReference(literal);
867   }
868   void Vldr(DataType dt, SRegister rd, RawLiteral* literal) {
869     Vldr(al, dt, rd, literal);
870   }
871   void Vldr(Condition cond, SRegister rd, RawLiteral* literal) {
872     Vldr(cond, Untyped32, rd, literal);
873   }
874   void Vldr(SRegister rd, RawLiteral* literal) {
875     Vldr(al, Untyped32, rd, literal);
876   }
877 
878   // Generic Ldr(register, data)
879   void Ldr(Condition cond, Register rt, uint32_t v) {
880     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
881     VIXL_ASSERT(allow_macro_instructions_);
882     VIXL_ASSERT(OutsideITBlock());
883 #ifndef PANDA_BUILD
884     RawLiteral* literal =
885         new Literal<uint32_t>(v, RawLiteral::kDeletedOnPlacementByPool);
886 #else
887     RawLiteral* literal = allocator_.New<Literal<uint32_t>>(
888         allocator_, v, RawLiteral::kDeletedOnPlacementByPool);
889 #endif
890     Ldr(cond, rt, literal);
891   }
892   template <typename T>
893   void Ldr(Register rt, T v) {
894     Ldr(al, rt, v);
895   }
896 
897   // Generic Ldrd(rt, rt2, data)
898   void Ldrd(Condition cond, Register rt, Register rt2, uint64_t v) {
899     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
900     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
901     VIXL_ASSERT(allow_macro_instructions_);
902     VIXL_ASSERT(OutsideITBlock());
903 #ifndef PANDA_BUILD
904     RawLiteral* literal =
905         new Literal<uint64_t>(v, RawLiteral::kDeletedOnPlacementByPool);
906 #else
907     RawLiteral* literal = allocator_.New<Literal<uint64_t>>(
908         allocator_, v, RawLiteral::kDeletedOnPlacementByPool);
909 #endif
910     Ldrd(cond, rt, rt2, literal);
911   }
912   template <typename T>
913   void Ldrd(Register rt, Register rt2, T v) {
914     Ldrd(al, rt, rt2, v);
915   }
916 
917   void Vldr(Condition cond, SRegister rd, float v) {
918     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
919     VIXL_ASSERT(allow_macro_instructions_);
920     VIXL_ASSERT(OutsideITBlock());
921 #ifndef PANDA_BUILD
922     RawLiteral* literal =
923         new Literal<float>(v, RawLiteral::kDeletedOnPlacementByPool);
924 #else
925     RawLiteral* literal = allocator_.New<Literal<float>>(
926         allocator_, v, RawLiteral::kDeletedOnPlacementByPool);
927 #endif
928     Vldr(cond, rd, literal);
929   }
930   void Vldr(SRegister rd, float v) { Vldr(al, rd, v); }
931 
932   void Vldr(Condition cond, DRegister rd, double v) {
933     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
934     VIXL_ASSERT(allow_macro_instructions_);
935     VIXL_ASSERT(OutsideITBlock());
936 #ifndef PANDA_BUILD
937     RawLiteral* literal =
938         new Literal<double>(v, RawLiteral::kDeletedOnPlacementByPool);
939 #else
940     RawLiteral* literal = allocator_.New<Literal<double>>(
941         allocator_, v, RawLiteral::kDeletedOnPlacementByPool);
942 #endif
943     Vldr(cond, rd, literal);
944   }
945   void Vldr(DRegister rd, double v) { Vldr(al, rd, v); }
946 
947   void Vmov(Condition cond, DRegister rt, double v) { Vmov(cond, F64, rt, v); }
948   void Vmov(DRegister rt, double v) { Vmov(al, F64, rt, v); }
949   void Vmov(Condition cond, SRegister rt, float v) { Vmov(cond, F32, rt, v); }
950   void Vmov(SRegister rt, float v) { Vmov(al, F32, rt, v); }
951 
952   // Claim memory on the stack.
953   // Note that the Claim, Drop, and Peek helpers below ensure that offsets used
954   // are multiples of 32 bits to help maintain 32-bit SP alignment.
955   // We could `Align{Up,Down}(size, 4)`, but that's potentially problematic:
956   //     Claim(3)
957   //     Claim(1)
958   //     Drop(4)
959   // would seem correct, when in fact:
960   //    Claim(3) -> sp = sp - 4
961   //    Claim(1) -> sp = sp - 4
962   //    Drop(4)  -> sp = sp + 4
963   //
964   void Claim(int32_t size) {
965     if (size == 0) return;
966     // The stack must be kept 32bit aligned.
967     VIXL_ASSERT((size > 0) && ((size % 4) == 0));
968     Sub(sp, sp, size);
969   }
970   // Release memory on the stack
971   void Drop(int32_t size) {
972     if (size == 0) return;
973     // The stack must be kept 32bit aligned.
974     VIXL_ASSERT((size > 0) && ((size % 4) == 0));
975     Add(sp, sp, size);
976   }
977   void Peek(Register dst, int32_t offset) {
978     VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
979     Ldr(dst, MemOperand(sp, offset));
980   }
981   void Poke(Register src, int32_t offset) {
982     VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
983     Str(src, MemOperand(sp, offset));
984   }
985   void Printf(const char* format,
986               CPURegister reg1 = NoReg,
987               CPURegister reg2 = NoReg,
988               CPURegister reg3 = NoReg,
989               CPURegister reg4 = NoReg);
990   // Functions used by Printf for generation.
991   void PushRegister(CPURegister reg);
992   void PreparePrintfArgument(CPURegister reg,
993                              int* core_count,
994                              int* vfp_count,
995                              uint32_t* printf_type);
996   // Handlers for cases not handled by the assembler.
997   // ADD, MOVT, MOVW, SUB, SXTB16, TEQ, UXTB16
998   virtual void Delegate(InstructionType type,
999                         InstructionCondROp instruction,
1000                         Condition cond,
1001                         Register rn,
1002                         const Operand& operand) VIXL_OVERRIDE;
1003   // CMN, CMP, MOV, MOVS, MVN, MVNS, SXTB, SXTH, TST, UXTB, UXTH
1004   virtual void Delegate(InstructionType type,
1005                         InstructionCondSizeROp instruction,
1006                         Condition cond,
1007                         EncodingSize size,
1008                         Register rn,
1009                         const Operand& operand) VIXL_OVERRIDE;
1010   // ADDW, ORN, ORNS, PKHBT, PKHTB, RSC, RSCS, SUBW, SXTAB, SXTAB16, SXTAH,
1011   // UXTAB, UXTAB16, UXTAH
1012   virtual void Delegate(InstructionType type,
1013                         InstructionCondRROp instruction,
1014                         Condition cond,
1015                         Register rd,
1016                         Register rn,
1017                         const Operand& operand) VIXL_OVERRIDE;
1018   // ADC, ADCS, ADD, ADDS, AND, ANDS, ASR, ASRS, BIC, BICS, EOR, EORS, LSL,
1019   // LSLS, LSR, LSRS, ORR, ORRS, ROR, RORS, RSB, RSBS, SBC, SBCS, SUB, SUBS
1020   virtual void Delegate(InstructionType type,
1021                         InstructionCondSizeRL instruction,
1022                         Condition cond,
1023                         EncodingSize size,
1024                         Register rd,
1025                         Location* location) VIXL_OVERRIDE;
1026   bool GenerateSplitInstruction(InstructionCondSizeRROp instruction,
1027                                 Condition cond,
1028                                 Register rd,
1029                                 Register rn,
1030                                 uint32_t imm,
1031                                 uint32_t mask);
1032   virtual void Delegate(InstructionType type,
1033                         InstructionCondSizeRROp instruction,
1034                         Condition cond,
1035                         EncodingSize size,
1036                         Register rd,
1037                         Register rn,
1038                         const Operand& operand) VIXL_OVERRIDE;
1039   // CBNZ, CBZ
1040   virtual void Delegate(InstructionType type,
1041                         InstructionRL instruction,
1042                         Register rn,
1043                         Location* location) VIXL_OVERRIDE;
1044   // VMOV
1045   virtual void Delegate(InstructionType type,
1046                         InstructionCondDtSSop instruction,
1047                         Condition cond,
1048                         DataType dt,
1049                         SRegister rd,
1050                         const SOperand& operand) VIXL_OVERRIDE;
1051   // VMOV, VMVN
1052   virtual void Delegate(InstructionType type,
1053                         InstructionCondDtDDop instruction,
1054                         Condition cond,
1055                         DataType dt,
1056                         DRegister rd,
1057                         const DOperand& operand) VIXL_OVERRIDE;
1058   // VMOV, VMVN
1059   virtual void Delegate(InstructionType type,
1060                         InstructionCondDtQQop instruction,
1061                         Condition cond,
1062                         DataType dt,
1063                         QRegister rd,
1064                         const QOperand& operand) VIXL_OVERRIDE;
1065   // LDR, LDRB, LDRH, LDRSB, LDRSH, STR, STRB, STRH
1066   virtual void Delegate(InstructionType type,
1067                         InstructionCondSizeRMop instruction,
1068                         Condition cond,
1069                         EncodingSize size,
1070                         Register rd,
1071                         const MemOperand& operand) VIXL_OVERRIDE;
1072   // LDAEXD, LDRD, LDREXD, STLEX, STLEXB, STLEXH, STRD, STREX, STREXB, STREXH
1073   virtual void Delegate(InstructionType type,
1074                         InstructionCondRL instruction,
1075                         Condition cond,
1076                         Register rt,
1077                         Location* location) VIXL_OVERRIDE;
1078   virtual void Delegate(InstructionType type,
1079                         InstructionCondRRL instruction,
1080                         Condition cond,
1081                         Register rt,
1082                         Register rt2,
1083                         Location* location) VIXL_OVERRIDE;
1084   virtual void Delegate(InstructionType type,
1085                         InstructionCondRRMop instruction,
1086                         Condition cond,
1087                         Register rt,
1088                         Register rt2,
1089                         const MemOperand& operand) VIXL_OVERRIDE;
1090   // VLDR, VSTR
1091   virtual void Delegate(InstructionType type,
1092                         InstructionCondDtSMop instruction,
1093                         Condition cond,
1094                         DataType dt,
1095                         SRegister rd,
1096                         const MemOperand& operand) VIXL_OVERRIDE;
1097   // VLDR, VSTR
1098   virtual void Delegate(InstructionType type,
1099                         InstructionCondDtDMop instruction,
1100                         Condition cond,
1101                         DataType dt,
1102                         DRegister rd,
1103                         const MemOperand& operand) VIXL_OVERRIDE;
1104   // MSR
1105   virtual void Delegate(InstructionType type,
1106                         InstructionCondMsrOp instruction,
1107                         Condition cond,
1108                         MaskedSpecialRegister spec_reg,
1109                         const Operand& operand) VIXL_OVERRIDE;
1110   virtual void Delegate(InstructionType type,
1111                         InstructionCondDtDL instruction,
1112                         Condition cond,
1113                         DataType dt,
1114                         DRegister rd,
1115                         Location* location) VIXL_OVERRIDE;
1116   virtual void Delegate(InstructionType type,
1117                         InstructionCondDtSL instruction,
1118                         Condition cond,
1119                         DataType dt,
1120                         SRegister rd,
1121                         Location* location) VIXL_OVERRIDE;
1122 
1123   // Start of generated code.
1124 
1125   void Adc(Condition cond, Register rd, Register rn, const Operand& operand) {
1126     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1127     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1128     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1129     VIXL_ASSERT(allow_macro_instructions_);
1130     VIXL_ASSERT(OutsideITBlock());
1131     MacroEmissionCheckScope guard(this);
1132     bool can_use_it =
1133         // ADC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1134         operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
1135         operand.GetBaseRegister().IsLow();
1136 #ifndef PANDA_BUILD
1137     ITScope it_scope(this, &cond, guard, can_use_it);
1138 #else
1139     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
1140 #endif
1141     adc(cond, rd, rn, operand);
1142   }
1143   void Adc(Register rd, Register rn, const Operand& operand) {
1144     Adc(al, rd, rn, operand);
1145   }
1146   void Adc(FlagsUpdate flags,
1147            Condition cond,
1148            Register rd,
1149            Register rn,
1150            const Operand& operand) {
1151     switch (flags) {
1152       case LeaveFlags:
1153         Adc(cond, rd, rn, operand);
1154         break;
1155       case SetFlags:
1156         Adcs(cond, rd, rn, operand);
1157         break;
1158       case DontCare:
1159         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1160                                    rn.Is(rd) && operand.IsPlainRegister() &&
1161                                    operand.GetBaseRegister().IsLow();
1162         if (setflags_is_smaller) {
1163           Adcs(cond, rd, rn, operand);
1164         } else {
1165           Adc(cond, rd, rn, operand);
1166         }
1167         break;
1168     }
1169   }
1170   void Adc(FlagsUpdate flags,
1171            Register rd,
1172            Register rn,
1173            const Operand& operand) {
1174     Adc(flags, al, rd, rn, operand);
1175   }
1176 
1177   void Adcs(Condition cond, Register rd, Register rn, const Operand& operand) {
1178     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1179     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1180     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1181     VIXL_ASSERT(allow_macro_instructions_);
1182     VIXL_ASSERT(OutsideITBlock());
1183     MacroEmissionCheckScope guard(this);
1184 #ifndef PANDA_BUILD
1185     ITScope it_scope(this, &cond, guard);
1186 #else
1187     ITScope it_scope(allocator_, this, &cond, guard);
1188 #endif
1189     adcs(cond, rd, rn, operand);
1190   }
1191   void Adcs(Register rd, Register rn, const Operand& operand) {
1192     Adcs(al, rd, rn, operand);
1193   }
1194 
1195   void Add(Condition cond, Register rd, Register rn, const Operand& operand) {
1196     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1197     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1198     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1199     VIXL_ASSERT(allow_macro_instructions_);
1200     VIXL_ASSERT(OutsideITBlock());
1201     MacroEmissionCheckScope guard(this);
1202     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
1203       uint32_t immediate = operand.GetImmediate();
1204       if (immediate == 0) {
1205         return;
1206       }
1207     }
1208     bool can_use_it =
1209         // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
1210         (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
1211          rd.IsLow()) ||
1212         // ADD<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
1213         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
1214          rd.IsLow() && rn.Is(rd)) ||
1215         // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
1216         (operand.IsImmediate() && (operand.GetImmediate() <= 1020) &&
1217          ((operand.GetImmediate() & 0x3) == 0) && rd.IsLow() && rn.IsSP()) ||
1218         // ADD<c>{<q>} <Rd>, <Rn>, <Rm>
1219         (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
1220          operand.GetBaseRegister().IsLow()) ||
1221         // ADD<c>{<q>} <Rdn>, <Rm> ; T2
1222         (operand.IsPlainRegister() && !rd.IsPC() && rn.Is(rd) &&
1223          !operand.GetBaseRegister().IsSP() &&
1224          !operand.GetBaseRegister().IsPC()) ||
1225         // ADD{<c>}{<q>} {<Rdm>,} SP, <Rdm> ; T1
1226         (operand.IsPlainRegister() && !rd.IsPC() && rn.IsSP() &&
1227          operand.GetBaseRegister().Is(rd));
1228 #ifndef PANDA_BUILD
1229     ITScope it_scope(this, &cond, guard, can_use_it);
1230 #else
1231     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
1232 #endif
1233     add(cond, rd, rn, operand);
1234   }
1235   void Add(Register rd, Register rn, const Operand& operand) {
1236     Add(al, rd, rn, operand);
1237   }
1238   void Add(FlagsUpdate flags,
1239            Condition cond,
1240            Register rd,
1241            Register rn,
1242            const Operand& operand) {
1243     switch (flags) {
1244       case LeaveFlags:
1245         Add(cond, rd, rn, operand);
1246         break;
1247       case SetFlags:
1248         Adds(cond, rd, rn, operand);
1249         break;
1250       case DontCare:
1251         bool setflags_is_smaller =
1252             IsUsingT32() && cond.Is(al) &&
1253             ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
1254               !rd.Is(rn) && operand.GetBaseRegister().IsLow()) ||
1255              (operand.IsImmediate() &&
1256               ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
1257                (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
1258         if (setflags_is_smaller) {
1259           Adds(cond, rd, rn, operand);
1260         } else {
1261           bool changed_op_is_smaller =
1262               operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
1263               ((rd.IsLow() && rn.IsLow() &&
1264                 (operand.GetSignedImmediate() >= -7)) ||
1265                (rd.IsLow() && rn.Is(rd) &&
1266                 (operand.GetSignedImmediate() >= -255)));
1267           if (changed_op_is_smaller) {
1268             Subs(cond, rd, rn, -operand.GetSignedImmediate());
1269           } else {
1270             Add(cond, rd, rn, operand);
1271           }
1272         }
1273         break;
1274     }
1275   }
1276   void Add(FlagsUpdate flags,
1277            Register rd,
1278            Register rn,
1279            const Operand& operand) {
1280     Add(flags, al, rd, rn, operand);
1281   }
1282 
1283   void Adds(Condition cond, Register rd, Register rn, const Operand& operand) {
1284     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1285     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1286     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1287     VIXL_ASSERT(allow_macro_instructions_);
1288     VIXL_ASSERT(OutsideITBlock());
1289     MacroEmissionCheckScope guard(this);
1290 #ifndef PANDA_BUILD
1291     ITScope it_scope(this, &cond, guard);
1292 #else
1293     ITScope it_scope(allocator_, this, &cond, guard);
1294 #endif
1295     adds(cond, rd, rn, operand);
1296   }
1297   void Adds(Register rd, Register rn, const Operand& operand) {
1298     Adds(al, rd, rn, operand);
1299   }
1300 
1301   void And(Condition cond, Register rd, Register rn, const Operand& operand) {
1302     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1303     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1304     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1305     VIXL_ASSERT(allow_macro_instructions_);
1306     VIXL_ASSERT(OutsideITBlock());
1307     MacroEmissionCheckScope guard(this);
1308     if (rd.Is(rn) && operand.IsPlainRegister() &&
1309         rd.Is(operand.GetBaseRegister())) {
1310       return;
1311     }
1312     if (cond.Is(al) && operand.IsImmediate()) {
1313       uint32_t immediate = operand.GetImmediate();
1314       if (immediate == 0) {
1315         mov(rd, 0);
1316         return;
1317       }
1318       if ((immediate == 0xffffffff) && rd.Is(rn)) {
1319         return;
1320       }
1321     }
1322     bool can_use_it =
1323         // AND<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1324         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1325         operand.GetBaseRegister().IsLow();
1326 #ifndef PANDA_BUILD
1327     ITScope it_scope(this, &cond, guard, can_use_it);
1328 #else
1329     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
1330 #endif
1331     and_(cond, rd, rn, operand);
1332   }
1333   void And(Register rd, Register rn, const Operand& operand) {
1334     And(al, rd, rn, operand);
1335   }
1336   void And(FlagsUpdate flags,
1337            Condition cond,
1338            Register rd,
1339            Register rn,
1340            const Operand& operand) {
1341     switch (flags) {
1342       case LeaveFlags:
1343         And(cond, rd, rn, operand);
1344         break;
1345       case SetFlags:
1346         Ands(cond, rd, rn, operand);
1347         break;
1348       case DontCare:
1349         if (operand.IsPlainRegister() && rd.Is(rn) &&
1350             rd.Is(operand.GetBaseRegister())) {
1351           return;
1352         }
1353         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1354                                    rn.Is(rd) && operand.IsPlainRegister() &&
1355                                    operand.GetBaseRegister().IsLow();
1356         if (setflags_is_smaller) {
1357           Ands(cond, rd, rn, operand);
1358         } else {
1359           And(cond, rd, rn, operand);
1360         }
1361         break;
1362     }
1363   }
1364   void And(FlagsUpdate flags,
1365            Register rd,
1366            Register rn,
1367            const Operand& operand) {
1368     And(flags, al, rd, rn, operand);
1369   }
1370 
1371   void Ands(Condition cond, Register rd, Register rn, const Operand& operand) {
1372     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1373     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1374     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1375     VIXL_ASSERT(allow_macro_instructions_);
1376     VIXL_ASSERT(OutsideITBlock());
1377     MacroEmissionCheckScope guard(this);
1378 #ifndef PANDA_BUILD
1379     ITScope it_scope(this, &cond, guard);
1380 #else
1381     ITScope it_scope(allocator_, this, &cond, guard);
1382 #endif
1383     ands(cond, rd, rn, operand);
1384   }
1385   void Ands(Register rd, Register rn, const Operand& operand) {
1386     Ands(al, rd, rn, operand);
1387   }
1388 
1389   void Asr(Condition cond, Register rd, Register rm, const Operand& operand) {
1390     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1391     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1392     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1393     VIXL_ASSERT(allow_macro_instructions_);
1394     VIXL_ASSERT(OutsideITBlock());
1395     MacroEmissionCheckScope guard(this);
1396     bool can_use_it =
1397         // ASR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
1398         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
1399          (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
1400         // ASR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
1401         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
1402          operand.GetBaseRegister().IsLow());
1403 #ifndef PANDA_BUILD
1404     ITScope it_scope(this, &cond, guard, can_use_it);
1405 #else
1406     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
1407 #endif
1408     asr(cond, rd, rm, operand);
1409   }
1410   void Asr(Register rd, Register rm, const Operand& operand) {
1411     Asr(al, rd, rm, operand);
1412   }
1413   void Asr(FlagsUpdate flags,
1414            Condition cond,
1415            Register rd,
1416            Register rm,
1417            const Operand& operand) {
1418     switch (flags) {
1419       case LeaveFlags:
1420         Asr(cond, rd, rm, operand);
1421         break;
1422       case SetFlags:
1423         Asrs(cond, rd, rm, operand);
1424         break;
1425       case DontCare:
1426         bool setflags_is_smaller =
1427             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
1428             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
1429               (operand.GetImmediate() <= 32)) ||
1430              (operand.IsPlainRegister() && rd.Is(rm)));
1431         if (setflags_is_smaller) {
1432           Asrs(cond, rd, rm, operand);
1433         } else {
1434           Asr(cond, rd, rm, operand);
1435         }
1436         break;
1437     }
1438   }
1439   void Asr(FlagsUpdate flags,
1440            Register rd,
1441            Register rm,
1442            const Operand& operand) {
1443     Asr(flags, al, rd, rm, operand);
1444   }
1445 
1446   void Asrs(Condition cond, Register rd, Register rm, const Operand& operand) {
1447     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1448     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1449     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1450     VIXL_ASSERT(allow_macro_instructions_);
1451     VIXL_ASSERT(OutsideITBlock());
1452     MacroEmissionCheckScope guard(this);
1453 #ifndef PANDA_BUILD
1454     ITScope it_scope(this, &cond, guard);
1455 #else
1456     ITScope it_scope(allocator_, this, &cond, guard);
1457 #endif
1458     asrs(cond, rd, rm, operand);
1459   }
1460   void Asrs(Register rd, Register rm, const Operand& operand) {
1461     Asrs(al, rd, rm, operand);
1462   }
1463 
1464   void B(Condition cond, Label* label, BranchHint hint = kBranchWithoutHint) {
1465     VIXL_ASSERT(allow_macro_instructions_);
1466     VIXL_ASSERT(OutsideITBlock());
1467     EncodingSize size = Best;
1468     MacroEmissionCheckScope::PoolPolicy pool_policy =
1469         MacroEmissionCheckScope::kBlockPools;
1470     if (!label->IsBound()) {
1471       if (hint == kNear) size = Narrow;
1472       const ReferenceInfo* info;
1473       bool can_encode = b_info(cond, size, label, &info);
1474       VIXL_CHECK(can_encode);
1475       CheckEmitPoolForInstruction(info, label, &cond);
1476       // We have already checked for pool emission.
1477       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1478     }
1479     MacroEmissionCheckScope guard(this, pool_policy);
1480     b(cond, size, label);
1481     RegisterForwardReference(label);
1482   }
1483   void B(Label* label, BranchHint hint = kBranchWithoutHint) {
1484     B(al, label, hint);
1485   }
1486   void BPreferNear(Condition cond, Label* label) { B(cond, label, kNear); }
1487   void BPreferNear(Label* label) { B(al, label, kNear); }
1488 
1489   void Bfc(Condition cond, Register rd, uint32_t lsb, uint32_t width) {
1490     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1491     VIXL_ASSERT(allow_macro_instructions_);
1492     VIXL_ASSERT(OutsideITBlock());
1493     MacroEmissionCheckScope guard(this);
1494 #ifndef PANDA_BUILD
1495     ITScope it_scope(this, &cond, guard);
1496 #else
1497     ITScope it_scope(allocator_, this, &cond, guard);
1498 #endif
1499     bfc(cond, rd, lsb, width);
1500   }
1501   void Bfc(Register rd, uint32_t lsb, uint32_t width) {
1502     Bfc(al, rd, lsb, width);
1503   }
1504 
1505   void Bfi(
1506       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
1507     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1508     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1509     VIXL_ASSERT(allow_macro_instructions_);
1510     VIXL_ASSERT(OutsideITBlock());
1511     MacroEmissionCheckScope guard(this);
1512 #ifndef PANDA_BUILD
1513     ITScope it_scope(this, &cond, guard);
1514 #else
1515     ITScope it_scope(allocator_, this, &cond, guard);
1516 #endif
1517     bfi(cond, rd, rn, lsb, width);
1518   }
1519   void Bfi(Register rd, Register rn, uint32_t lsb, uint32_t width) {
1520     Bfi(al, rd, rn, lsb, width);
1521   }
1522 
1523   void Bic(Condition cond, Register rd, Register rn, const Operand& operand) {
1524     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1525     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1526     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1527     VIXL_ASSERT(allow_macro_instructions_);
1528     VIXL_ASSERT(OutsideITBlock());
1529     MacroEmissionCheckScope guard(this);
1530     if (cond.Is(al) && operand.IsImmediate()) {
1531       uint32_t immediate = operand.GetImmediate();
1532       if ((immediate == 0) && rd.Is(rn)) {
1533         return;
1534       }
1535       if (immediate == 0xffffffff) {
1536         mov(rd, 0);
1537         return;
1538       }
1539     }
1540     bool can_use_it =
1541         // BIC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1542         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1543         operand.GetBaseRegister().IsLow();
1544 #ifndef PANDA_BUILD
1545     ITScope it_scope(this, &cond, guard, can_use_it);
1546 #else
1547     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
1548 #endif
1549     bic(cond, rd, rn, operand);
1550   }
1551   void Bic(Register rd, Register rn, const Operand& operand) {
1552     Bic(al, rd, rn, operand);
1553   }
1554   void Bic(FlagsUpdate flags,
1555            Condition cond,
1556            Register rd,
1557            Register rn,
1558            const Operand& operand) {
1559     switch (flags) {
1560       case LeaveFlags:
1561         Bic(cond, rd, rn, operand);
1562         break;
1563       case SetFlags:
1564         Bics(cond, rd, rn, operand);
1565         break;
1566       case DontCare:
1567         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1568                                    rn.Is(rd) && operand.IsPlainRegister() &&
1569                                    operand.GetBaseRegister().IsLow();
1570         if (setflags_is_smaller) {
1571           Bics(cond, rd, rn, operand);
1572         } else {
1573           Bic(cond, rd, rn, operand);
1574         }
1575         break;
1576     }
1577   }
1578   void Bic(FlagsUpdate flags,
1579            Register rd,
1580            Register rn,
1581            const Operand& operand) {
1582     Bic(flags, al, rd, rn, operand);
1583   }
1584 
1585   void Bics(Condition cond, Register rd, Register rn, const Operand& operand) {
1586     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1587     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1588     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1589     VIXL_ASSERT(allow_macro_instructions_);
1590     VIXL_ASSERT(OutsideITBlock());
1591     MacroEmissionCheckScope guard(this);
1592 #ifndef PANDA_BUILD
1593     ITScope it_scope(this, &cond, guard);
1594 #else
1595     ITScope it_scope(allocator_, this, &cond, guard);
1596 #endif
1597     bics(cond, rd, rn, operand);
1598   }
1599   void Bics(Register rd, Register rn, const Operand& operand) {
1600     Bics(al, rd, rn, operand);
1601   }
1602 
1603   void Bkpt(Condition cond, uint32_t imm) {
1604     VIXL_ASSERT(allow_macro_instructions_);
1605     VIXL_ASSERT(OutsideITBlock());
1606     MacroEmissionCheckScope guard(this);
1607 #ifndef PANDA_BUILD
1608     ITScope it_scope(this, &cond, guard);
1609 #else
1610     ITScope it_scope(allocator_, this, &cond, guard);
1611 #endif
1612     bkpt(cond, imm);
1613   }
1614   void Bkpt(uint32_t imm) { Bkpt(al, imm); }
1615 
1616   void Bl(Condition cond, Label* label) {
1617     VIXL_ASSERT(allow_macro_instructions_);
1618     VIXL_ASSERT(OutsideITBlock());
1619     MacroEmissionCheckScope::PoolPolicy pool_policy =
1620         MacroEmissionCheckScope::kBlockPools;
1621     if (!label->IsBound()) {
1622       const ReferenceInfo* info;
1623       bool can_encode = bl_info(cond, label, &info);
1624       VIXL_CHECK(can_encode);
1625       CheckEmitPoolForInstruction(info, label, &cond);
1626       // We have already checked for pool emission.
1627       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1628     }
1629     MacroEmissionCheckScope guard(this, pool_policy);
1630 #ifndef PANDA_BUILD
1631     ITScope it_scope(this, &cond, guard);
1632 #else
1633     ITScope it_scope(allocator_, this, &cond, guard);
1634 #endif
1635     bl(cond, label);
1636     RegisterForwardReference(label);
1637   }
1638   void Bl(Label* label) { Bl(al, label); }
1639 
1640   void Blx(Condition cond, Label* label) {
1641     VIXL_ASSERT(allow_macro_instructions_);
1642     VIXL_ASSERT(OutsideITBlock());
1643     MacroEmissionCheckScope::PoolPolicy pool_policy =
1644         MacroEmissionCheckScope::kBlockPools;
1645     if (!label->IsBound()) {
1646       const ReferenceInfo* info;
1647       bool can_encode = blx_info(cond, label, &info);
1648       VIXL_CHECK(can_encode);
1649       CheckEmitPoolForInstruction(info, label, &cond);
1650       // We have already checked for pool emission.
1651       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1652     }
1653     MacroEmissionCheckScope guard(this, pool_policy);
1654 #ifndef PANDA_BUILD
1655     ITScope it_scope(this, &cond, guard);
1656 #else
1657     ITScope it_scope(allocator_, this, &cond, guard);
1658 #endif
1659     blx(cond, label);
1660     RegisterForwardReference(label);
1661   }
1662   void Blx(Label* label) { Blx(al, label); }
1663 
1664   void Blx(Condition cond, Register rm) {
1665     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1666     VIXL_ASSERT(allow_macro_instructions_);
1667     VIXL_ASSERT(OutsideITBlock());
1668     MacroEmissionCheckScope guard(this);
1669     bool can_use_it =
1670         // BLX{<c>}{<q>} <Rm> ; T1
1671         !rm.IsPC();
1672 #ifndef PANDA_BUILD
1673     ITScope it_scope(this, &cond, guard, can_use_it);
1674 #else
1675     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
1676 #endif
1677     blx(cond, rm);
1678   }
1679   void Blx(Register rm) { Blx(al, rm); }
1680 
1681   void Bx(Condition cond, Register rm) {
1682     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1683     VIXL_ASSERT(allow_macro_instructions_);
1684     VIXL_ASSERT(OutsideITBlock());
1685     MacroEmissionCheckScope guard(this);
1686     bool can_use_it =
1687         // BX{<c>}{<q>} <Rm> ; T1
1688         !rm.IsPC();
1689 #ifndef PANDA_BUILD
1690     ITScope it_scope(this, &cond, guard, can_use_it);
1691 #else
1692     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
1693 #endif
1694     bx(cond, rm);
1695   }
1696   void Bx(Register rm) { Bx(al, rm); }
1697 
1698   void Bxj(Condition cond, Register rm) {
1699     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1700     VIXL_ASSERT(allow_macro_instructions_);
1701     VIXL_ASSERT(OutsideITBlock());
1702     MacroEmissionCheckScope guard(this);
1703 #ifndef PANDA_BUILD
1704     ITScope it_scope(this, &cond, guard);
1705 #else
1706     ITScope it_scope(allocator_, this, &cond, guard);
1707 #endif
1708     bxj(cond, rm);
1709   }
1710   void Bxj(Register rm) { Bxj(al, rm); }
1711 
1712   void Cbnz(Register rn, Label* label) {
1713     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1714     VIXL_ASSERT(allow_macro_instructions_);
1715     VIXL_ASSERT(OutsideITBlock());
1716     MacroEmissionCheckScope::PoolPolicy pool_policy =
1717         MacroEmissionCheckScope::kBlockPools;
1718     if (!label->IsBound()) {
1719       const ReferenceInfo* info;
1720       bool can_encode = cbnz_info(rn, label, &info);
1721       VIXL_CHECK(can_encode);
1722       CheckEmitPoolForInstruction(info, label);
1723       // We have already checked for pool emission.
1724       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1725     }
1726     MacroEmissionCheckScope guard(this, pool_policy);
1727     cbnz(rn, label);
1728     RegisterForwardReference(label);
1729   }
1730 
1731   void Cbz(Register rn, Label* label) {
1732     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1733     VIXL_ASSERT(allow_macro_instructions_);
1734     VIXL_ASSERT(OutsideITBlock());
1735     MacroEmissionCheckScope::PoolPolicy pool_policy =
1736         MacroEmissionCheckScope::kBlockPools;
1737     if (!label->IsBound()) {
1738       const ReferenceInfo* info;
1739       bool can_encode = cbz_info(rn, label, &info);
1740       VIXL_CHECK(can_encode);
1741       CheckEmitPoolForInstruction(info, label);
1742       // We have already checked for pool emission.
1743       pool_policy = MacroEmissionCheckScope::kIgnorePools;
1744     }
1745     MacroEmissionCheckScope guard(this, pool_policy);
1746     cbz(rn, label);
1747     RegisterForwardReference(label);
1748   }
1749 
1750   void Clrex(Condition cond) {
1751     VIXL_ASSERT(allow_macro_instructions_);
1752     VIXL_ASSERT(OutsideITBlock());
1753     MacroEmissionCheckScope guard(this);
1754 #ifndef PANDA_BUILD
1755     ITScope it_scope(this, &cond, guard);
1756 #else
1757     ITScope it_scope(allocator_, this, &cond, guard);
1758 #endif
1759     clrex(cond);
1760   }
1761   void Clrex() { Clrex(al); }
1762 
1763   void Clz(Condition cond, Register rd, Register rm) {
1764     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1765     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1766     VIXL_ASSERT(allow_macro_instructions_);
1767     VIXL_ASSERT(OutsideITBlock());
1768     MacroEmissionCheckScope guard(this);
1769 #ifndef PANDA_BUILD
1770     ITScope it_scope(this, &cond, guard);
1771 #else
1772     ITScope it_scope(allocator_, this, &cond, guard);
1773 #endif
1774     clz(cond, rd, rm);
1775   }
1776   void Clz(Register rd, Register rm) { Clz(al, rd, rm); }
1777 
1778   void Cmn(Condition cond, Register rn, const Operand& operand) {
1779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1780     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1781     VIXL_ASSERT(allow_macro_instructions_);
1782     VIXL_ASSERT(OutsideITBlock());
1783     MacroEmissionCheckScope guard(this);
1784     bool can_use_it =
1785         // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
1786         operand.IsPlainRegister() && rn.IsLow() &&
1787         operand.GetBaseRegister().IsLow();
1788 #ifndef PANDA_BUILD
1789     ITScope it_scope(this, &cond, guard, can_use_it);
1790 #else
1791     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
1792 #endif
1793     cmn(cond, rn, operand);
1794   }
1795   void Cmn(Register rn, const Operand& operand) { Cmn(al, rn, operand); }
1796 
1797   void Cmp(Condition cond, Register rn, const Operand& operand) {
1798     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1799     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1800     VIXL_ASSERT(allow_macro_instructions_);
1801     VIXL_ASSERT(OutsideITBlock());
1802     MacroEmissionCheckScope guard(this);
1803     bool can_use_it =
1804         // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
1805         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
1806          rn.IsLow()) ||
1807         // CMP{<c>}{<q>} <Rn>, <Rm> ; T1 T2
1808         (operand.IsPlainRegister() && !rn.IsPC() &&
1809          !operand.GetBaseRegister().IsPC());
1810 #ifndef PANDA_BUILD
1811     ITScope it_scope(this, &cond, guard, can_use_it);
1812 #else
1813     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
1814 #endif
1815     cmp(cond, rn, operand);
1816   }
1817   void Cmp(Register rn, const Operand& operand) { Cmp(al, rn, operand); }
1818 
1819   void Crc32b(Condition cond, Register rd, Register rn, Register rm) {
1820     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1821     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1822     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1823     VIXL_ASSERT(allow_macro_instructions_);
1824     VIXL_ASSERT(OutsideITBlock());
1825     MacroEmissionCheckScope guard(this);
1826 #ifndef PANDA_BUILD
1827     ITScope it_scope(this, &cond, guard);
1828 #else
1829     ITScope it_scope(allocator_, this, &cond, guard);
1830 #endif
1831     crc32b(cond, rd, rn, rm);
1832   }
1833   void Crc32b(Register rd, Register rn, Register rm) { Crc32b(al, rd, rn, rm); }
1834 
1835   void Crc32cb(Condition cond, Register rd, Register rn, Register rm) {
1836     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1837     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1839     VIXL_ASSERT(allow_macro_instructions_);
1840     VIXL_ASSERT(OutsideITBlock());
1841     MacroEmissionCheckScope guard(this);
1842 #ifndef PANDA_BUILD
1843     ITScope it_scope(this, &cond, guard);
1844 #else
1845     ITScope it_scope(allocator_, this, &cond, guard);
1846 #endif
1847     crc32cb(cond, rd, rn, rm);
1848   }
1849   void Crc32cb(Register rd, Register rn, Register rm) {
1850     Crc32cb(al, rd, rn, rm);
1851   }
1852 
1853   void Crc32ch(Condition cond, Register rd, Register rn, Register rm) {
1854     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1855     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1856     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1857     VIXL_ASSERT(allow_macro_instructions_);
1858     VIXL_ASSERT(OutsideITBlock());
1859     MacroEmissionCheckScope guard(this);
1860 #ifndef PANDA_BUILD
1861     ITScope it_scope(this, &cond, guard);
1862 #else
1863     ITScope it_scope(allocator_, this, &cond, guard);
1864 #endif
1865     crc32ch(cond, rd, rn, rm);
1866   }
1867   void Crc32ch(Register rd, Register rn, Register rm) {
1868     Crc32ch(al, rd, rn, rm);
1869   }
1870 
1871   void Crc32cw(Condition cond, Register rd, Register rn, Register rm) {
1872     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1873     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1874     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1875     VIXL_ASSERT(allow_macro_instructions_);
1876     VIXL_ASSERT(OutsideITBlock());
1877     MacroEmissionCheckScope guard(this);
1878 #ifndef PANDA_BUILD
1879     ITScope it_scope(this, &cond, guard);
1880 #else
1881     ITScope it_scope(allocator_, this, &cond, guard);
1882 #endif
1883     crc32cw(cond, rd, rn, rm);
1884   }
1885   void Crc32cw(Register rd, Register rn, Register rm) {
1886     Crc32cw(al, rd, rn, rm);
1887   }
1888 
1889   void Crc32h(Condition cond, Register rd, Register rn, Register rm) {
1890     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1891     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1892     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1893     VIXL_ASSERT(allow_macro_instructions_);
1894     VIXL_ASSERT(OutsideITBlock());
1895     MacroEmissionCheckScope guard(this);
1896 #ifndef PANDA_BUILD
1897     ITScope it_scope(this, &cond, guard);
1898 #else
1899     ITScope it_scope(allocator_, this, &cond, guard);
1900 #endif
1901     crc32h(cond, rd, rn, rm);
1902   }
1903   void Crc32h(Register rd, Register rn, Register rm) { Crc32h(al, rd, rn, rm); }
1904 
1905   void Crc32w(Condition cond, Register rd, Register rn, Register rm) {
1906     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1907     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1908     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1909     VIXL_ASSERT(allow_macro_instructions_);
1910     VIXL_ASSERT(OutsideITBlock());
1911     MacroEmissionCheckScope guard(this);
1912 #ifndef PANDA_BUILD
1913     ITScope it_scope(this, &cond, guard);
1914 #else
1915     ITScope it_scope(allocator_, this, &cond, guard);
1916 #endif
1917     crc32w(cond, rd, rn, rm);
1918   }
1919   void Crc32w(Register rd, Register rn, Register rm) { Crc32w(al, rd, rn, rm); }
1920 
1921   void Dmb(Condition cond, MemoryBarrier option) {
1922     VIXL_ASSERT(allow_macro_instructions_);
1923     VIXL_ASSERT(OutsideITBlock());
1924     MacroEmissionCheckScope guard(this);
1925 #ifndef PANDA_BUILD
1926     ITScope it_scope(this, &cond, guard);
1927 #else
1928     ITScope it_scope(allocator_, this, &cond, guard);
1929 #endif
1930     dmb(cond, option);
1931   }
1932   void Dmb(MemoryBarrier option) { Dmb(al, option); }
1933 
1934   void Dsb(Condition cond, MemoryBarrier option) {
1935     VIXL_ASSERT(allow_macro_instructions_);
1936     VIXL_ASSERT(OutsideITBlock());
1937     MacroEmissionCheckScope guard(this);
1938 #ifndef PANDA_BUILD
1939     ITScope it_scope(this, &cond, guard);
1940 #else
1941     ITScope it_scope(allocator_, this, &cond, guard);
1942 #endif
1943     dsb(cond, option);
1944   }
1945   void Dsb(MemoryBarrier option) { Dsb(al, option); }
1946 
1947   void Eor(Condition cond, Register rd, Register rn, const Operand& operand) {
1948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1949     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1950     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1951     VIXL_ASSERT(allow_macro_instructions_);
1952     VIXL_ASSERT(OutsideITBlock());
1953     MacroEmissionCheckScope guard(this);
1954     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
1955       uint32_t immediate = operand.GetImmediate();
1956       if (immediate == 0) {
1957         return;
1958       }
1959       if (immediate == 0xffffffff) {
1960         mvn(rd, rn);
1961         return;
1962       }
1963     }
1964     bool can_use_it =
1965         // EOR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1966         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1967         operand.GetBaseRegister().IsLow();
1968 #ifndef PANDA_BUILD
1969     ITScope it_scope(this, &cond, guard, can_use_it);
1970 #else
1971     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
1972 #endif
1973     eor(cond, rd, rn, operand);
1974   }
1975   void Eor(Register rd, Register rn, const Operand& operand) {
1976     Eor(al, rd, rn, operand);
1977   }
1978   void Eor(FlagsUpdate flags,
1979            Condition cond,
1980            Register rd,
1981            Register rn,
1982            const Operand& operand) {
1983     switch (flags) {
1984       case LeaveFlags:
1985         Eor(cond, rd, rn, operand);
1986         break;
1987       case SetFlags:
1988         Eors(cond, rd, rn, operand);
1989         break;
1990       case DontCare:
1991         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1992                                    rn.Is(rd) && operand.IsPlainRegister() &&
1993                                    operand.GetBaseRegister().IsLow();
1994         if (setflags_is_smaller) {
1995           Eors(cond, rd, rn, operand);
1996         } else {
1997           Eor(cond, rd, rn, operand);
1998         }
1999         break;
2000     }
2001   }
2002   void Eor(FlagsUpdate flags,
2003            Register rd,
2004            Register rn,
2005            const Operand& operand) {
2006     Eor(flags, al, rd, rn, operand);
2007   }
2008 
2009   void Eors(Condition cond, Register rd, Register rn, const Operand& operand) {
2010     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2011     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2012     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2013     VIXL_ASSERT(allow_macro_instructions_);
2014     VIXL_ASSERT(OutsideITBlock());
2015     MacroEmissionCheckScope guard(this);
2016 #ifndef PANDA_BUILD
2017     ITScope it_scope(this, &cond, guard);
2018 #else
2019     ITScope it_scope(allocator_, this, &cond, guard);
2020 #endif
2021     eors(cond, rd, rn, operand);
2022   }
2023   void Eors(Register rd, Register rn, const Operand& operand) {
2024     Eors(al, rd, rn, operand);
2025   }
2026 
2027   void Fldmdbx(Condition cond,
2028                Register rn,
2029                WriteBack write_back,
2030                DRegisterList dreglist) {
2031     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2032     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
2033     VIXL_ASSERT(allow_macro_instructions_);
2034     VIXL_ASSERT(OutsideITBlock());
2035     MacroEmissionCheckScope guard(this);
2036 #ifndef PANDA_BUILD
2037     ITScope it_scope(this, &cond, guard);
2038 #else
2039     ITScope it_scope(allocator_, this, &cond, guard);
2040 #endif
2041     fldmdbx(cond, rn, write_back, dreglist);
2042   }
2043   void Fldmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
2044     Fldmdbx(al, rn, write_back, dreglist);
2045   }
2046 
2047   void Fldmiax(Condition cond,
2048                Register rn,
2049                WriteBack write_back,
2050                DRegisterList dreglist) {
2051     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2052     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
2053     VIXL_ASSERT(allow_macro_instructions_);
2054     VIXL_ASSERT(OutsideITBlock());
2055     MacroEmissionCheckScope guard(this);
2056 #ifndef PANDA_BUILD
2057     ITScope it_scope(this, &cond, guard);
2058 #else
2059     ITScope it_scope(allocator_, this, &cond, guard);
2060 #endif
2061     fldmiax(cond, rn, write_back, dreglist);
2062   }
2063   void Fldmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
2064     Fldmiax(al, rn, write_back, dreglist);
2065   }
2066 
2067   void Fstmdbx(Condition cond,
2068                Register rn,
2069                WriteBack write_back,
2070                DRegisterList dreglist) {
2071     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2072     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
2073     VIXL_ASSERT(allow_macro_instructions_);
2074     VIXL_ASSERT(OutsideITBlock());
2075     MacroEmissionCheckScope guard(this);
2076 #ifndef PANDA_BUILD
2077     ITScope it_scope(this, &cond, guard);
2078 #else
2079     ITScope it_scope(allocator_, this, &cond, guard);
2080 #endif
2081     fstmdbx(cond, rn, write_back, dreglist);
2082   }
2083   void Fstmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
2084     Fstmdbx(al, rn, write_back, dreglist);
2085   }
2086 
2087   void Fstmiax(Condition cond,
2088                Register rn,
2089                WriteBack write_back,
2090                DRegisterList dreglist) {
2091     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2092     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
2093     VIXL_ASSERT(allow_macro_instructions_);
2094     VIXL_ASSERT(OutsideITBlock());
2095     MacroEmissionCheckScope guard(this);
2096 #ifndef PANDA_BUILD
2097     ITScope it_scope(this, &cond, guard);
2098 #else
2099     ITScope it_scope(allocator_, this, &cond, guard);
2100 #endif
2101     fstmiax(cond, rn, write_back, dreglist);
2102   }
2103   void Fstmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
2104     Fstmiax(al, rn, write_back, dreglist);
2105   }
2106 
2107   void Hlt(Condition cond, uint32_t imm) {
2108     VIXL_ASSERT(allow_macro_instructions_);
2109     VIXL_ASSERT(OutsideITBlock());
2110     MacroEmissionCheckScope guard(this);
2111 #ifndef PANDA_BUILD
2112     ITScope it_scope(this, &cond, guard);
2113 #else
2114     ITScope it_scope(allocator_, this, &cond, guard);
2115 #endif
2116     hlt(cond, imm);
2117   }
2118   void Hlt(uint32_t imm) { Hlt(al, imm); }
2119 
2120   void Hvc(Condition cond, uint32_t imm) {
2121     VIXL_ASSERT(allow_macro_instructions_);
2122     VIXL_ASSERT(OutsideITBlock());
2123     MacroEmissionCheckScope guard(this);
2124 #ifndef PANDA_BUILD
2125     ITScope it_scope(this, &cond, guard);
2126 #else
2127     ITScope it_scope(allocator_, this, &cond, guard);
2128 #endif
2129     hvc(cond, imm);
2130   }
2131   void Hvc(uint32_t imm) { Hvc(al, imm); }
2132 
2133   void Isb(Condition cond, MemoryBarrier option) {
2134     VIXL_ASSERT(allow_macro_instructions_);
2135     VIXL_ASSERT(OutsideITBlock());
2136     MacroEmissionCheckScope guard(this);
2137 #ifndef PANDA_BUILD
2138     ITScope it_scope(this, &cond, guard);
2139 #else
2140     ITScope it_scope(allocator_, this, &cond, guard);
2141 #endif
2142     isb(cond, option);
2143   }
2144   void Isb(MemoryBarrier option) { Isb(al, option); }
2145 
2146   void Lda(Condition cond, Register rt, const MemOperand& operand) {
2147     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2148     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2149     VIXL_ASSERT(allow_macro_instructions_);
2150     VIXL_ASSERT(OutsideITBlock());
2151     MacroEmissionCheckScope guard(this);
2152 #ifndef PANDA_BUILD
2153     ITScope it_scope(this, &cond, guard);
2154 #else
2155     ITScope it_scope(allocator_, this, &cond, guard);
2156 #endif
2157     lda(cond, rt, operand);
2158   }
2159   void Lda(Register rt, const MemOperand& operand) { Lda(al, rt, operand); }
2160 
2161   void Ldab(Condition cond, Register rt, const MemOperand& operand) {
2162     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2163     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2164     VIXL_ASSERT(allow_macro_instructions_);
2165     VIXL_ASSERT(OutsideITBlock());
2166     MacroEmissionCheckScope guard(this);
2167 #ifndef PANDA_BUILD
2168     ITScope it_scope(this, &cond, guard);
2169 #else
2170     ITScope it_scope(allocator_, this, &cond, guard);
2171 #endif
2172     ldab(cond, rt, operand);
2173   }
2174   void Ldab(Register rt, const MemOperand& operand) { Ldab(al, rt, operand); }
2175 
2176   void Ldaex(Condition cond, Register rt, const MemOperand& operand) {
2177     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2178     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2179     VIXL_ASSERT(allow_macro_instructions_);
2180     VIXL_ASSERT(OutsideITBlock());
2181     MacroEmissionCheckScope guard(this);
2182 #ifndef PANDA_BUILD
2183     ITScope it_scope(this, &cond, guard);
2184 #else
2185     ITScope it_scope(allocator_, this, &cond, guard);
2186 #endif
2187     ldaex(cond, rt, operand);
2188   }
2189   void Ldaex(Register rt, const MemOperand& operand) { Ldaex(al, rt, operand); }
2190 
2191   void Ldaexb(Condition cond, Register rt, const MemOperand& operand) {
2192     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2193     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2194     VIXL_ASSERT(allow_macro_instructions_);
2195     VIXL_ASSERT(OutsideITBlock());
2196     MacroEmissionCheckScope guard(this);
2197 #ifndef PANDA_BUILD
2198     ITScope it_scope(this, &cond, guard);
2199 #else
2200     ITScope it_scope(allocator_, this, &cond, guard);
2201 #endif
2202     ldaexb(cond, rt, operand);
2203   }
2204   void Ldaexb(Register rt, const MemOperand& operand) {
2205     Ldaexb(al, rt, operand);
2206   }
2207 
2208   void Ldaexd(Condition cond,
2209               Register rt,
2210               Register rt2,
2211               const MemOperand& operand) {
2212     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2213     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2214     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2215     VIXL_ASSERT(allow_macro_instructions_);
2216     VIXL_ASSERT(OutsideITBlock());
2217     MacroEmissionCheckScope guard(this);
2218 #ifndef PANDA_BUILD
2219     ITScope it_scope(this, &cond, guard);
2220 #else
2221     ITScope it_scope(allocator_, this, &cond, guard);
2222 #endif
2223     ldaexd(cond, rt, rt2, operand);
2224   }
2225   void Ldaexd(Register rt, Register rt2, const MemOperand& operand) {
2226     Ldaexd(al, rt, rt2, operand);
2227   }
2228 
2229   void Ldaexh(Condition cond, Register rt, const MemOperand& operand) {
2230     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2231     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2232     VIXL_ASSERT(allow_macro_instructions_);
2233     VIXL_ASSERT(OutsideITBlock());
2234     MacroEmissionCheckScope guard(this);
2235 #ifndef PANDA_BUILD
2236     ITScope it_scope(this, &cond, guard);
2237 #else
2238     ITScope it_scope(allocator_, this, &cond, guard);
2239 #endif
2240     ldaexh(cond, rt, operand);
2241   }
2242   void Ldaexh(Register rt, const MemOperand& operand) {
2243     Ldaexh(al, rt, operand);
2244   }
2245 
2246   void Ldah(Condition cond, Register rt, const MemOperand& operand) {
2247     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2248     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2249     VIXL_ASSERT(allow_macro_instructions_);
2250     VIXL_ASSERT(OutsideITBlock());
2251     MacroEmissionCheckScope guard(this);
2252 #ifndef PANDA_BUILD
2253     ITScope it_scope(this, &cond, guard);
2254 #else
2255     ITScope it_scope(allocator_, this, &cond, guard);
2256 #endif
2257     ldah(cond, rt, operand);
2258   }
2259   void Ldah(Register rt, const MemOperand& operand) { Ldah(al, rt, operand); }
2260 
2261   void Ldm(Condition cond,
2262            Register rn,
2263            WriteBack write_back,
2264            RegisterList registers) {
2265     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2266     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2267     VIXL_ASSERT(allow_macro_instructions_);
2268     VIXL_ASSERT(OutsideITBlock());
2269     MacroEmissionCheckScope guard(this);
2270 #ifndef PANDA_BUILD
2271     ITScope it_scope(this, &cond, guard);
2272 #else
2273     ITScope it_scope(allocator_, this, &cond, guard);
2274 #endif
2275     ldm(cond, rn, write_back, registers);
2276   }
2277   void Ldm(Register rn, WriteBack write_back, RegisterList registers) {
2278     Ldm(al, rn, write_back, registers);
2279   }
2280 
2281   void Ldmda(Condition cond,
2282              Register rn,
2283              WriteBack write_back,
2284              RegisterList registers) {
2285     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2286     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2287     VIXL_ASSERT(allow_macro_instructions_);
2288     VIXL_ASSERT(OutsideITBlock());
2289     MacroEmissionCheckScope guard(this);
2290 #ifndef PANDA_BUILD
2291     ITScope it_scope(this, &cond, guard);
2292 #else
2293     ITScope it_scope(allocator_, this, &cond, guard);
2294 #endif
2295     ldmda(cond, rn, write_back, registers);
2296   }
2297   void Ldmda(Register rn, WriteBack write_back, RegisterList registers) {
2298     Ldmda(al, rn, write_back, registers);
2299   }
2300 
2301   void Ldmdb(Condition cond,
2302              Register rn,
2303              WriteBack write_back,
2304              RegisterList registers) {
2305     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2306     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2307     VIXL_ASSERT(allow_macro_instructions_);
2308     VIXL_ASSERT(OutsideITBlock());
2309     MacroEmissionCheckScope guard(this);
2310 #ifndef PANDA_BUILD
2311     ITScope it_scope(this, &cond, guard);
2312 #else
2313     ITScope it_scope(allocator_, this, &cond, guard);
2314 #endif
2315     ldmdb(cond, rn, write_back, registers);
2316   }
2317   void Ldmdb(Register rn, WriteBack write_back, RegisterList registers) {
2318     Ldmdb(al, rn, write_back, registers);
2319   }
2320 
2321   void Ldmea(Condition cond,
2322              Register rn,
2323              WriteBack write_back,
2324              RegisterList registers) {
2325     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2326     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2327     VIXL_ASSERT(allow_macro_instructions_);
2328     VIXL_ASSERT(OutsideITBlock());
2329     MacroEmissionCheckScope guard(this);
2330 #ifndef PANDA_BUILD
2331     ITScope it_scope(this, &cond, guard);
2332 #else
2333     ITScope it_scope(allocator_, this, &cond, guard);
2334 #endif
2335     ldmea(cond, rn, write_back, registers);
2336   }
2337   void Ldmea(Register rn, WriteBack write_back, RegisterList registers) {
2338     Ldmea(al, rn, write_back, registers);
2339   }
2340 
2341   void Ldmed(Condition cond,
2342              Register rn,
2343              WriteBack write_back,
2344              RegisterList registers) {
2345     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2346     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2347     VIXL_ASSERT(allow_macro_instructions_);
2348     VIXL_ASSERT(OutsideITBlock());
2349     MacroEmissionCheckScope guard(this);
2350 #ifndef PANDA_BUILD
2351     ITScope it_scope(this, &cond, guard);
2352 #else
2353     ITScope it_scope(allocator_, this, &cond, guard);
2354 #endif
2355     ldmed(cond, rn, write_back, registers);
2356   }
2357   void Ldmed(Register rn, WriteBack write_back, RegisterList registers) {
2358     Ldmed(al, rn, write_back, registers);
2359   }
2360 
2361   void Ldmfa(Condition cond,
2362              Register rn,
2363              WriteBack write_back,
2364              RegisterList registers) {
2365     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2366     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2367     VIXL_ASSERT(allow_macro_instructions_);
2368     VIXL_ASSERT(OutsideITBlock());
2369     MacroEmissionCheckScope guard(this);
2370 #ifndef PANDA_BUILD
2371     ITScope it_scope(this, &cond, guard);
2372 #else
2373     ITScope it_scope(allocator_, this, &cond, guard);
2374 #endif
2375     ldmfa(cond, rn, write_back, registers);
2376   }
2377   void Ldmfa(Register rn, WriteBack write_back, RegisterList registers) {
2378     Ldmfa(al, rn, write_back, registers);
2379   }
2380 
2381   void Ldmfd(Condition cond,
2382              Register rn,
2383              WriteBack write_back,
2384              RegisterList registers) {
2385     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2386     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2387     VIXL_ASSERT(allow_macro_instructions_);
2388     VIXL_ASSERT(OutsideITBlock());
2389     MacroEmissionCheckScope guard(this);
2390 #ifndef PANDA_BUILD
2391     ITScope it_scope(this, &cond, guard);
2392 #else
2393     ITScope it_scope(allocator_, this, &cond, guard);
2394 #endif
2395     ldmfd(cond, rn, write_back, registers);
2396   }
2397   void Ldmfd(Register rn, WriteBack write_back, RegisterList registers) {
2398     Ldmfd(al, rn, write_back, registers);
2399   }
2400 
2401   void Ldmib(Condition cond,
2402              Register rn,
2403              WriteBack write_back,
2404              RegisterList registers) {
2405     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2406     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2407     VIXL_ASSERT(allow_macro_instructions_);
2408     VIXL_ASSERT(OutsideITBlock());
2409     MacroEmissionCheckScope guard(this);
2410 #ifndef PANDA_BUILD
2411     ITScope it_scope(this, &cond, guard);
2412 #else
2413     ITScope it_scope(allocator_, this, &cond, guard);
2414 #endif
2415     ldmib(cond, rn, write_back, registers);
2416   }
2417   void Ldmib(Register rn, WriteBack write_back, RegisterList registers) {
2418     Ldmib(al, rn, write_back, registers);
2419   }
2420 
2421   void Ldr(Condition cond, Register rt, const MemOperand& operand) {
2422     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2423     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2424     VIXL_ASSERT(allow_macro_instructions_);
2425     VIXL_ASSERT(OutsideITBlock());
2426     MacroEmissionCheckScope guard(this);
2427     bool can_use_it =
2428         // LDR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2429         (operand.IsImmediate() && rt.IsLow() &&
2430          operand.GetBaseRegister().IsLow() &&
2431          operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
2432          (operand.GetAddrMode() == Offset)) ||
2433         // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
2434         (operand.IsImmediate() && rt.IsLow() &&
2435          operand.GetBaseRegister().IsSP() &&
2436          operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
2437          (operand.GetAddrMode() == Offset)) ||
2438         // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2439         (operand.IsPlainRegister() && rt.IsLow() &&
2440          operand.GetBaseRegister().IsLow() &&
2441          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2442          (operand.GetAddrMode() == Offset));
2443 #ifndef PANDA_BUILD
2444     ITScope it_scope(this, &cond, guard, can_use_it);
2445 #else
2446     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
2447 #endif
2448     ldr(cond, rt, operand);
2449   }
2450   void Ldr(Register rt, const MemOperand& operand) { Ldr(al, rt, operand); }
2451 
2452 
2453   void Ldrb(Condition cond, Register rt, const MemOperand& operand) {
2454     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2455     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2456     VIXL_ASSERT(allow_macro_instructions_);
2457     VIXL_ASSERT(OutsideITBlock());
2458     MacroEmissionCheckScope guard(this);
2459     bool can_use_it =
2460         // LDRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2461         (operand.IsImmediate() && rt.IsLow() &&
2462          operand.GetBaseRegister().IsLow() &&
2463          operand.IsOffsetImmediateWithinRange(0, 31) &&
2464          (operand.GetAddrMode() == Offset)) ||
2465         // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2466         (operand.IsPlainRegister() && rt.IsLow() &&
2467          operand.GetBaseRegister().IsLow() &&
2468          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2469          (operand.GetAddrMode() == Offset));
2470 #ifndef PANDA_BUILD
2471     ITScope it_scope(this, &cond, guard, can_use_it);
2472 #else
2473     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
2474 #endif
2475     ldrb(cond, rt, operand);
2476   }
2477   void Ldrb(Register rt, const MemOperand& operand) { Ldrb(al, rt, operand); }
2478 
2479 
2480   void Ldrd(Condition cond,
2481             Register rt,
2482             Register rt2,
2483             const MemOperand& operand) {
2484     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2486     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2487     VIXL_ASSERT(allow_macro_instructions_);
2488     VIXL_ASSERT(OutsideITBlock());
2489     MacroEmissionCheckScope guard(this);
2490 #ifndef PANDA_BUILD
2491     ITScope it_scope(this, &cond, guard);
2492 #else
2493     ITScope it_scope(allocator_, this, &cond, guard);
2494 #endif
2495     ldrd(cond, rt, rt2, operand);
2496   }
2497   void Ldrd(Register rt, Register rt2, const MemOperand& operand) {
2498     Ldrd(al, rt, rt2, operand);
2499   }
2500 
2501 
2502   void Ldrex(Condition cond, Register rt, const MemOperand& operand) {
2503     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2504     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2505     VIXL_ASSERT(allow_macro_instructions_);
2506     VIXL_ASSERT(OutsideITBlock());
2507     MacroEmissionCheckScope guard(this);
2508 #ifndef PANDA_BUILD
2509     ITScope it_scope(this, &cond, guard);
2510 #else
2511     ITScope it_scope(allocator_, this, &cond, guard);
2512 #endif
2513     ldrex(cond, rt, operand);
2514   }
2515   void Ldrex(Register rt, const MemOperand& operand) { Ldrex(al, rt, operand); }
2516 
2517   void Ldrexb(Condition cond, Register rt, const MemOperand& operand) {
2518     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2519     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2520     VIXL_ASSERT(allow_macro_instructions_);
2521     VIXL_ASSERT(OutsideITBlock());
2522     MacroEmissionCheckScope guard(this);
2523 #ifndef PANDA_BUILD
2524     ITScope it_scope(this, &cond, guard);
2525 #else
2526     ITScope it_scope(allocator_, this, &cond, guard);
2527 #endif
2528     ldrexb(cond, rt, operand);
2529   }
2530   void Ldrexb(Register rt, const MemOperand& operand) {
2531     Ldrexb(al, rt, operand);
2532   }
2533 
2534   void Ldrexd(Condition cond,
2535               Register rt,
2536               Register rt2,
2537               const MemOperand& operand) {
2538     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2539     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2540     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2541     VIXL_ASSERT(allow_macro_instructions_);
2542     VIXL_ASSERT(OutsideITBlock());
2543     MacroEmissionCheckScope guard(this);
2544 #ifndef PANDA_BUILD
2545     ITScope it_scope(this, &cond, guard);
2546 #else
2547     ITScope it_scope(allocator_, this, &cond, guard);
2548 #endif
2549     ldrexd(cond, rt, rt2, operand);
2550   }
2551   void Ldrexd(Register rt, Register rt2, const MemOperand& operand) {
2552     Ldrexd(al, rt, rt2, operand);
2553   }
2554 
2555   void Ldrexh(Condition cond, Register rt, const MemOperand& operand) {
2556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2557     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2558     VIXL_ASSERT(allow_macro_instructions_);
2559     VIXL_ASSERT(OutsideITBlock());
2560     MacroEmissionCheckScope guard(this);
2561 #ifndef PANDA_BUILD
2562     ITScope it_scope(this, &cond, guard);
2563 #else
2564     ITScope it_scope(allocator_, this, &cond, guard);
2565 #endif
2566     ldrexh(cond, rt, operand);
2567   }
2568   void Ldrexh(Register rt, const MemOperand& operand) {
2569     Ldrexh(al, rt, operand);
2570   }
2571 
2572   void Ldrh(Condition cond, Register rt, const MemOperand& operand) {
2573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2574     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2575     VIXL_ASSERT(allow_macro_instructions_);
2576     VIXL_ASSERT(OutsideITBlock());
2577     MacroEmissionCheckScope guard(this);
2578     bool can_use_it =
2579         // LDRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2580         (operand.IsImmediate() && rt.IsLow() &&
2581          operand.GetBaseRegister().IsLow() &&
2582          operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
2583          (operand.GetAddrMode() == Offset)) ||
2584         // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2585         (operand.IsPlainRegister() && rt.IsLow() &&
2586          operand.GetBaseRegister().IsLow() &&
2587          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2588          (operand.GetAddrMode() == Offset));
2589 #ifndef PANDA_BUILD
2590     ITScope it_scope(this, &cond, guard, can_use_it);
2591 #else
2592     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
2593 #endif
2594     ldrh(cond, rt, operand);
2595   }
2596   void Ldrh(Register rt, const MemOperand& operand) { Ldrh(al, rt, operand); }
2597 
2598 
2599   void Ldrsb(Condition cond, Register rt, const MemOperand& operand) {
2600     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2601     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2602     VIXL_ASSERT(allow_macro_instructions_);
2603     VIXL_ASSERT(OutsideITBlock());
2604     MacroEmissionCheckScope guard(this);
2605     bool can_use_it =
2606         // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2607         operand.IsPlainRegister() && rt.IsLow() &&
2608         operand.GetBaseRegister().IsLow() &&
2609         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2610         (operand.GetAddrMode() == Offset);
2611 #ifndef PANDA_BUILD
2612     ITScope it_scope(this, &cond, guard, can_use_it);
2613 #else
2614     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
2615 #endif
2616     ldrsb(cond, rt, operand);
2617   }
2618   void Ldrsb(Register rt, const MemOperand& operand) { Ldrsb(al, rt, operand); }
2619 
2620 
2621   void Ldrsh(Condition cond, Register rt, const MemOperand& operand) {
2622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2623     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2624     VIXL_ASSERT(allow_macro_instructions_);
2625     VIXL_ASSERT(OutsideITBlock());
2626     MacroEmissionCheckScope guard(this);
2627     bool can_use_it =
2628         // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2629         operand.IsPlainRegister() && rt.IsLow() &&
2630         operand.GetBaseRegister().IsLow() &&
2631         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2632         (operand.GetAddrMode() == Offset);
2633 #ifndef PANDA_BUILD
2634     ITScope it_scope(this, &cond, guard, can_use_it);
2635 #else
2636     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
2637 #endif
2638     ldrsh(cond, rt, operand);
2639   }
2640   void Ldrsh(Register rt, const MemOperand& operand) { Ldrsh(al, rt, operand); }
2641 
2642 
2643   void Lsl(Condition cond, Register rd, Register rm, const Operand& operand) {
2644     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2645     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2646     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2647     VIXL_ASSERT(allow_macro_instructions_);
2648     VIXL_ASSERT(OutsideITBlock());
2649     MacroEmissionCheckScope guard(this);
2650     bool can_use_it =
2651         // LSL<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
2652         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2653          (operand.GetImmediate() <= 31) && rd.IsLow() && rm.IsLow()) ||
2654         // LSL<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
2655         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
2656          operand.GetBaseRegister().IsLow());
2657 #ifndef PANDA_BUILD
2658     ITScope it_scope(this, &cond, guard, can_use_it);
2659 #else
2660     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
2661 #endif
2662     lsl(cond, rd, rm, operand);
2663   }
2664   void Lsl(Register rd, Register rm, const Operand& operand) {
2665     Lsl(al, rd, rm, operand);
2666   }
2667   void Lsl(FlagsUpdate flags,
2668            Condition cond,
2669            Register rd,
2670            Register rm,
2671            const Operand& operand) {
2672     switch (flags) {
2673       case LeaveFlags:
2674         Lsl(cond, rd, rm, operand);
2675         break;
2676       case SetFlags:
2677         Lsls(cond, rd, rm, operand);
2678         break;
2679       case DontCare:
2680         bool setflags_is_smaller =
2681             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
2682             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2683               (operand.GetImmediate() < 32)) ||
2684              (operand.IsPlainRegister() && rd.Is(rm)));
2685         if (setflags_is_smaller) {
2686           Lsls(cond, rd, rm, operand);
2687         } else {
2688           Lsl(cond, rd, rm, operand);
2689         }
2690         break;
2691     }
2692   }
2693   void Lsl(FlagsUpdate flags,
2694            Register rd,
2695            Register rm,
2696            const Operand& operand) {
2697     Lsl(flags, al, rd, rm, operand);
2698   }
2699 
2700   void Lsls(Condition cond, Register rd, Register rm, const Operand& operand) {
2701     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2702     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2703     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2704     VIXL_ASSERT(allow_macro_instructions_);
2705     VIXL_ASSERT(OutsideITBlock());
2706     MacroEmissionCheckScope guard(this);
2707 #ifndef PANDA_BUILD
2708     ITScope it_scope(this, &cond, guard);
2709 #else
2710     ITScope it_scope(allocator_, this, &cond, guard);
2711 #endif
2712     lsls(cond, rd, rm, operand);
2713   }
2714   void Lsls(Register rd, Register rm, const Operand& operand) {
2715     Lsls(al, rd, rm, operand);
2716   }
2717 
2718   void Lsr(Condition cond, Register rd, Register rm, const Operand& operand) {
2719     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2720     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2721     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2722     VIXL_ASSERT(allow_macro_instructions_);
2723     VIXL_ASSERT(OutsideITBlock());
2724     MacroEmissionCheckScope guard(this);
2725     bool can_use_it =
2726         // LSR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
2727         (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2728          (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
2729         // LSR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
2730         (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
2731          operand.GetBaseRegister().IsLow());
2732 #ifndef PANDA_BUILD
2733     ITScope it_scope(this, &cond, guard, can_use_it);
2734 #else
2735     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
2736 #endif
2737     lsr(cond, rd, rm, operand);
2738   }
2739   void Lsr(Register rd, Register rm, const Operand& operand) {
2740     Lsr(al, rd, rm, operand);
2741   }
2742   void Lsr(FlagsUpdate flags,
2743            Condition cond,
2744            Register rd,
2745            Register rm,
2746            const Operand& operand) {
2747     switch (flags) {
2748       case LeaveFlags:
2749         Lsr(cond, rd, rm, operand);
2750         break;
2751       case SetFlags:
2752         Lsrs(cond, rd, rm, operand);
2753         break;
2754       case DontCare:
2755         bool setflags_is_smaller =
2756             IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
2757             ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2758               (operand.GetImmediate() <= 32)) ||
2759              (operand.IsPlainRegister() && rd.Is(rm)));
2760         if (setflags_is_smaller) {
2761           Lsrs(cond, rd, rm, operand);
2762         } else {
2763           Lsr(cond, rd, rm, operand);
2764         }
2765         break;
2766     }
2767   }
2768   void Lsr(FlagsUpdate flags,
2769            Register rd,
2770            Register rm,
2771            const Operand& operand) {
2772     Lsr(flags, al, rd, rm, operand);
2773   }
2774 
2775   void Lsrs(Condition cond, Register rd, Register rm, const Operand& operand) {
2776     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2777     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2778     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2779     VIXL_ASSERT(allow_macro_instructions_);
2780     VIXL_ASSERT(OutsideITBlock());
2781     MacroEmissionCheckScope guard(this);
2782 #ifndef PANDA_BUILD
2783     ITScope it_scope(this, &cond, guard);
2784 #else
2785     ITScope it_scope(allocator_, this, &cond, guard);
2786 #endif
2787     lsrs(cond, rd, rm, operand);
2788   }
2789   void Lsrs(Register rd, Register rm, const Operand& operand) {
2790     Lsrs(al, rd, rm, operand);
2791   }
2792 
2793   void Mla(Condition cond, Register rd, Register rn, Register rm, Register ra) {
2794     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2795     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2796     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2797     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2798     VIXL_ASSERT(allow_macro_instructions_);
2799     VIXL_ASSERT(OutsideITBlock());
2800     MacroEmissionCheckScope guard(this);
2801 #ifndef PANDA_BUILD
2802     ITScope it_scope(this, &cond, guard);
2803 #else
2804     ITScope it_scope(allocator_, this, &cond, guard);
2805 #endif
2806     mla(cond, rd, rn, rm, ra);
2807   }
2808   void Mla(Register rd, Register rn, Register rm, Register ra) {
2809     Mla(al, rd, rn, rm, ra);
2810   }
2811   void Mla(FlagsUpdate flags,
2812            Condition cond,
2813            Register rd,
2814            Register rn,
2815            Register rm,
2816            Register ra) {
2817     switch (flags) {
2818       case LeaveFlags:
2819         Mla(cond, rd, rn, rm, ra);
2820         break;
2821       case SetFlags:
2822         Mlas(cond, rd, rn, rm, ra);
2823         break;
2824       case DontCare:
2825         Mla(cond, rd, rn, rm, ra);
2826         break;
2827     }
2828   }
2829   void Mla(
2830       FlagsUpdate flags, Register rd, Register rn, Register rm, Register ra) {
2831     Mla(flags, al, rd, rn, rm, ra);
2832   }
2833 
2834   void Mlas(
2835       Condition cond, Register rd, Register rn, Register rm, Register ra) {
2836     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2837     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2839     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2840     VIXL_ASSERT(allow_macro_instructions_);
2841     VIXL_ASSERT(OutsideITBlock());
2842     MacroEmissionCheckScope guard(this);
2843 #ifndef PANDA_BUILD
2844     ITScope it_scope(this, &cond, guard);
2845 #else
2846     ITScope it_scope(allocator_, this, &cond, guard);
2847 #endif
2848     mlas(cond, rd, rn, rm, ra);
2849   }
2850   void Mlas(Register rd, Register rn, Register rm, Register ra) {
2851     Mlas(al, rd, rn, rm, ra);
2852   }
2853 
2854   void Mls(Condition cond, Register rd, Register rn, Register rm, Register ra) {
2855     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2856     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2857     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2858     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2859     VIXL_ASSERT(allow_macro_instructions_);
2860     VIXL_ASSERT(OutsideITBlock());
2861     MacroEmissionCheckScope guard(this);
2862 #ifndef PANDA_BUILD
2863     ITScope it_scope(this, &cond, guard);
2864 #else
2865     ITScope it_scope(allocator_, this, &cond, guard);
2866 #endif
2867     mls(cond, rd, rn, rm, ra);
2868   }
2869   void Mls(Register rd, Register rn, Register rm, Register ra) {
2870     Mls(al, rd, rn, rm, ra);
2871   }
2872 
2873   void Mov(Condition cond, Register rd, const Operand& operand) {
2874     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2875     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2876     VIXL_ASSERT(allow_macro_instructions_);
2877     VIXL_ASSERT(OutsideITBlock());
2878     MacroEmissionCheckScope guard(this);
2879     if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) {
2880       return;
2881     }
2882     bool can_use_it =
2883         // MOV<c>{<q>} <Rd>, #<imm8> ; T1
2884         (operand.IsImmediate() && rd.IsLow() &&
2885          (operand.GetImmediate() <= 255)) ||
2886         // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
2887         (operand.IsPlainRegister() && !rd.IsPC() &&
2888          !operand.GetBaseRegister().IsPC()) ||
2889         // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount>} ; T2
2890         (operand.IsImmediateShiftedRegister() && rd.IsLow() &&
2891          operand.GetBaseRegister().IsLow() &&
2892          (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
2893           operand.GetShift().Is(ASR))) ||
2894         // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
2895         // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
2896         // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
2897         // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
2898         (operand.IsRegisterShiftedRegister() &&
2899          rd.Is(operand.GetBaseRegister()) && rd.IsLow() &&
2900          (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
2901           operand.GetShift().Is(ASR) || operand.GetShift().Is(ROR)) &&
2902          operand.GetShiftRegister().IsLow());
2903 #ifndef PANDA_BUILD
2904     ITScope it_scope(this, &cond, guard, can_use_it);
2905 #else
2906     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
2907 #endif
2908     mov(cond, rd, operand);
2909   }
2910   void Mov(Register rd, const Operand& operand) { Mov(al, rd, operand); }
2911   void Mov(FlagsUpdate flags,
2912            Condition cond,
2913            Register rd,
2914            const Operand& operand) {
2915     switch (flags) {
2916       case LeaveFlags:
2917         Mov(cond, rd, operand);
2918         break;
2919       case SetFlags:
2920         Movs(cond, rd, operand);
2921         break;
2922       case DontCare:
2923         if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) {
2924           return;
2925         }
2926         bool setflags_is_smaller =
2927             IsUsingT32() && cond.Is(al) &&
2928             ((operand.IsImmediateShiftedRegister() && rd.IsLow() &&
2929               operand.GetBaseRegister().IsLow() &&
2930               (operand.GetShiftAmount() >= 1) &&
2931               (((operand.GetShiftAmount() <= 32) &&
2932                 ((operand.GetShift().IsLSR() || operand.GetShift().IsASR()))) ||
2933                ((operand.GetShiftAmount() < 32) &&
2934                 operand.GetShift().IsLSL()))) ||
2935              (operand.IsRegisterShiftedRegister() && rd.IsLow() &&
2936               operand.GetBaseRegister().Is(rd) &&
2937               operand.GetShiftRegister().IsLow() &&
2938               (operand.GetShift().IsLSL() || operand.GetShift().IsLSR() ||
2939                operand.GetShift().IsASR() || operand.GetShift().IsROR())) ||
2940              (operand.IsImmediate() && rd.IsLow() &&
2941               (operand.GetImmediate() < 256)));
2942         if (setflags_is_smaller) {
2943           Movs(cond, rd, operand);
2944         } else {
2945           Mov(cond, rd, operand);
2946         }
2947         break;
2948     }
2949   }
2950   void Mov(FlagsUpdate flags, Register rd, const Operand& operand) {
2951     Mov(flags, al, rd, operand);
2952   }
2953 
2954   void Movs(Condition cond, Register rd, const Operand& operand) {
2955     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2956     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2957     VIXL_ASSERT(allow_macro_instructions_);
2958     VIXL_ASSERT(OutsideITBlock());
2959     MacroEmissionCheckScope guard(this);
2960 #ifndef PANDA_BUILD
2961     ITScope it_scope(this, &cond, guard);
2962 #else
2963     ITScope it_scope(allocator_, this, &cond, guard);
2964 #endif
2965     movs(cond, rd, operand);
2966   }
2967   void Movs(Register rd, const Operand& operand) { Movs(al, rd, operand); }
2968 
2969   void Movt(Condition cond, Register rd, const Operand& operand) {
2970     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2971     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2972     VIXL_ASSERT(allow_macro_instructions_);
2973     VIXL_ASSERT(OutsideITBlock());
2974     MacroEmissionCheckScope guard(this);
2975 #ifndef PANDA_BUILD
2976     ITScope it_scope(this, &cond, guard);
2977 #else
2978     ITScope it_scope(allocator_, this, &cond, guard);
2979 #endif
2980     movt(cond, rd, operand);
2981   }
2982   void Movt(Register rd, const Operand& operand) { Movt(al, rd, operand); }
2983 
2984   void Mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
2985     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2986     VIXL_ASSERT(allow_macro_instructions_);
2987     VIXL_ASSERT(OutsideITBlock());
2988     MacroEmissionCheckScope guard(this);
2989 #ifndef PANDA_BUILD
2990     ITScope it_scope(this, &cond, guard);
2991 #else
2992     ITScope it_scope(allocator_, this, &cond, guard);
2993 #endif
2994     mrs(cond, rd, spec_reg);
2995   }
2996   void Mrs(Register rd, SpecialRegister spec_reg) { Mrs(al, rd, spec_reg); }
2997 
2998   void Msr(Condition cond,
2999            MaskedSpecialRegister spec_reg,
3000            const Operand& operand) {
3001     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3002     VIXL_ASSERT(allow_macro_instructions_);
3003     VIXL_ASSERT(OutsideITBlock());
3004     MacroEmissionCheckScope guard(this);
3005 #ifndef PANDA_BUILD
3006     ITScope it_scope(this, &cond, guard);
3007 #else
3008     ITScope it_scope(allocator_, this, &cond, guard);
3009 #endif
3010     msr(cond, spec_reg, operand);
3011   }
3012   void Msr(MaskedSpecialRegister spec_reg, const Operand& operand) {
3013     Msr(al, spec_reg, operand);
3014   }
3015 
3016   void Mul(Condition cond, Register rd, Register rn, Register rm) {
3017     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3018     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3019     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3020     VIXL_ASSERT(allow_macro_instructions_);
3021     VIXL_ASSERT(OutsideITBlock());
3022     MacroEmissionCheckScope guard(this);
3023     bool can_use_it =
3024         // MUL<c>{<q>} <Rdm>, <Rn>{, <Rdm>} ; T1
3025         rd.Is(rm) && rn.IsLow() && rm.IsLow();
3026 #ifndef PANDA_BUILD
3027     ITScope it_scope(this, &cond, guard, can_use_it);
3028 #else
3029     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
3030 #endif
3031     mul(cond, rd, rn, rm);
3032   }
3033   void Mul(Register rd, Register rn, Register rm) { Mul(al, rd, rn, rm); }
3034   void Mul(FlagsUpdate flags,
3035            Condition cond,
3036            Register rd,
3037            Register rn,
3038            Register rm) {
3039     switch (flags) {
3040       case LeaveFlags:
3041         Mul(cond, rd, rn, rm);
3042         break;
3043       case SetFlags:
3044         Muls(cond, rd, rn, rm);
3045         break;
3046       case DontCare:
3047         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3048                                    rn.IsLow() && rm.Is(rd);
3049         if (setflags_is_smaller) {
3050           Muls(cond, rd, rn, rm);
3051         } else {
3052           Mul(cond, rd, rn, rm);
3053         }
3054         break;
3055     }
3056   }
3057   void Mul(FlagsUpdate flags, Register rd, Register rn, Register rm) {
3058     Mul(flags, al, rd, rn, rm);
3059   }
3060 
3061   void Muls(Condition cond, Register rd, Register rn, Register rm) {
3062     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3063     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3064     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3065     VIXL_ASSERT(allow_macro_instructions_);
3066     VIXL_ASSERT(OutsideITBlock());
3067     MacroEmissionCheckScope guard(this);
3068 #ifndef PANDA_BUILD
3069     ITScope it_scope(this, &cond, guard);
3070 #else
3071     ITScope it_scope(allocator_, this, &cond, guard);
3072 #endif
3073     muls(cond, rd, rn, rm);
3074   }
3075   void Muls(Register rd, Register rn, Register rm) { Muls(al, rd, rn, rm); }
3076 
3077   void Mvn(Condition cond, Register rd, const Operand& operand) {
3078     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3079     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3080     VIXL_ASSERT(allow_macro_instructions_);
3081     VIXL_ASSERT(OutsideITBlock());
3082     MacroEmissionCheckScope guard(this);
3083     bool can_use_it =
3084         // MVN<c>{<q>} <Rd>, <Rm> ; T1
3085         operand.IsPlainRegister() && rd.IsLow() &&
3086         operand.GetBaseRegister().IsLow();
3087 #ifndef PANDA_BUILD
3088     ITScope it_scope(this, &cond, guard, can_use_it);
3089 #else
3090     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
3091 #endif
3092     mvn(cond, rd, operand);
3093   }
3094   void Mvn(Register rd, const Operand& operand) { Mvn(al, rd, operand); }
3095   void Mvn(FlagsUpdate flags,
3096            Condition cond,
3097            Register rd,
3098            const Operand& operand) {
3099     switch (flags) {
3100       case LeaveFlags:
3101         Mvn(cond, rd, operand);
3102         break;
3103       case SetFlags:
3104         Mvns(cond, rd, operand);
3105         break;
3106       case DontCare:
3107         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3108                                    operand.IsPlainRegister() &&
3109                                    operand.GetBaseRegister().IsLow();
3110         if (setflags_is_smaller) {
3111           Mvns(cond, rd, operand);
3112         } else {
3113           Mvn(cond, rd, operand);
3114         }
3115         break;
3116     }
3117   }
3118   void Mvn(FlagsUpdate flags, Register rd, const Operand& operand) {
3119     Mvn(flags, al, rd, operand);
3120   }
3121 
3122   void Mvns(Condition cond, Register rd, const Operand& operand) {
3123     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3124     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3125     VIXL_ASSERT(allow_macro_instructions_);
3126     VIXL_ASSERT(OutsideITBlock());
3127     MacroEmissionCheckScope guard(this);
3128 #ifndef PANDA_BUILD
3129     ITScope it_scope(this, &cond, guard);
3130 #else
3131     ITScope it_scope(allocator_, this, &cond, guard);
3132 #endif
3133     mvns(cond, rd, operand);
3134   }
3135   void Mvns(Register rd, const Operand& operand) { Mvns(al, rd, operand); }
3136 
3137   void Nop(Condition cond) {
3138     VIXL_ASSERT(allow_macro_instructions_);
3139     VIXL_ASSERT(OutsideITBlock());
3140     MacroEmissionCheckScope guard(this);
3141 #ifndef PANDA_BUILD
3142     ITScope it_scope(this, &cond, guard);
3143 #else
3144     ITScope it_scope(allocator_, this, &cond, guard);
3145 #endif
3146     nop(cond);
3147   }
3148   void Nop() { Nop(al); }
3149 
3150   void Orn(Condition cond, Register rd, Register rn, const Operand& operand) {
3151     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3152     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3153     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3154     VIXL_ASSERT(allow_macro_instructions_);
3155     VIXL_ASSERT(OutsideITBlock());
3156     MacroEmissionCheckScope guard(this);
3157     if (cond.Is(al) && operand.IsImmediate()) {
3158       uint32_t immediate = operand.GetImmediate();
3159       if (immediate == 0) {
3160         mvn(rd, 0);
3161         return;
3162       }
3163       if ((immediate == 0xffffffff) && rd.Is(rn)) {
3164         return;
3165       }
3166     }
3167 #ifndef PANDA_BUILD
3168     ITScope it_scope(this, &cond, guard);
3169 #else
3170     ITScope it_scope(allocator_, this, &cond, guard);
3171 #endif
3172     orn(cond, rd, rn, operand);
3173   }
3174   void Orn(Register rd, Register rn, const Operand& operand) {
3175     Orn(al, rd, rn, operand);
3176   }
3177   void Orn(FlagsUpdate flags,
3178            Condition cond,
3179            Register rd,
3180            Register rn,
3181            const Operand& operand) {
3182     switch (flags) {
3183       case LeaveFlags:
3184         Orn(cond, rd, rn, operand);
3185         break;
3186       case SetFlags:
3187         Orns(cond, rd, rn, operand);
3188         break;
3189       case DontCare:
3190         Orn(cond, rd, rn, operand);
3191         break;
3192     }
3193   }
3194   void Orn(FlagsUpdate flags,
3195            Register rd,
3196            Register rn,
3197            const Operand& operand) {
3198     Orn(flags, al, rd, rn, operand);
3199   }
3200 
3201   void Orns(Condition cond, Register rd, Register rn, const Operand& operand) {
3202     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3203     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3204     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3205     VIXL_ASSERT(allow_macro_instructions_);
3206     VIXL_ASSERT(OutsideITBlock());
3207     MacroEmissionCheckScope guard(this);
3208 #ifndef PANDA_BUILD
3209     ITScope it_scope(this, &cond, guard);
3210 #else
3211     ITScope it_scope(allocator_, this, &cond, guard);
3212 #endif
3213     orns(cond, rd, rn, operand);
3214   }
3215   void Orns(Register rd, Register rn, const Operand& operand) {
3216     Orns(al, rd, rn, operand);
3217   }
3218 
3219   void Orr(Condition cond, Register rd, Register rn, const Operand& operand) {
3220     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3221     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3222     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3223     VIXL_ASSERT(allow_macro_instructions_);
3224     VIXL_ASSERT(OutsideITBlock());
3225     MacroEmissionCheckScope guard(this);
3226     if (rd.Is(rn) && operand.IsPlainRegister() &&
3227         rd.Is(operand.GetBaseRegister())) {
3228       return;
3229     }
3230     if (cond.Is(al) && operand.IsImmediate()) {
3231       uint32_t immediate = operand.GetImmediate();
3232       if ((immediate == 0) && rd.Is(rn)) {
3233         return;
3234       }
3235       if (immediate == 0xffffffff) {
3236         mvn(rd, 0);
3237         return;
3238       }
3239     }
3240     bool can_use_it =
3241         // ORR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
3242         operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
3243         operand.GetBaseRegister().IsLow();
3244 #ifndef PANDA_BUILD
3245     ITScope it_scope(this, &cond, guard, can_use_it);
3246 #else
3247     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
3248 #endif
3249     orr(cond, rd, rn, operand);
3250   }
3251   void Orr(Register rd, Register rn, const Operand& operand) {
3252     Orr(al, rd, rn, operand);
3253   }
3254   void Orr(FlagsUpdate flags,
3255            Condition cond,
3256            Register rd,
3257            Register rn,
3258            const Operand& operand) {
3259     switch (flags) {
3260       case LeaveFlags:
3261         Orr(cond, rd, rn, operand);
3262         break;
3263       case SetFlags:
3264         Orrs(cond, rd, rn, operand);
3265         break;
3266       case DontCare:
3267         if (operand.IsPlainRegister() && rd.Is(rn) &&
3268             rd.Is(operand.GetBaseRegister())) {
3269           return;
3270         }
3271         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3272                                    rn.Is(rd) && operand.IsPlainRegister() &&
3273                                    operand.GetBaseRegister().IsLow();
3274         if (setflags_is_smaller) {
3275           Orrs(cond, rd, rn, operand);
3276         } else {
3277           Orr(cond, rd, rn, operand);
3278         }
3279         break;
3280     }
3281   }
3282   void Orr(FlagsUpdate flags,
3283            Register rd,
3284            Register rn,
3285            const Operand& operand) {
3286     Orr(flags, al, rd, rn, operand);
3287   }
3288 
3289   void Orrs(Condition cond, Register rd, Register rn, const Operand& operand) {
3290     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3291     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3292     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3293     VIXL_ASSERT(allow_macro_instructions_);
3294     VIXL_ASSERT(OutsideITBlock());
3295     MacroEmissionCheckScope guard(this);
3296 #ifndef PANDA_BUILD
3297     ITScope it_scope(this, &cond, guard);
3298 #else
3299     ITScope it_scope(allocator_, this, &cond, guard);
3300 #endif
3301     orrs(cond, rd, rn, operand);
3302   }
3303   void Orrs(Register rd, Register rn, const Operand& operand) {
3304     Orrs(al, rd, rn, operand);
3305   }
3306 
3307   void Pkhbt(Condition cond, Register rd, Register rn, const Operand& operand) {
3308     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3309     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3310     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3311     VIXL_ASSERT(allow_macro_instructions_);
3312     VIXL_ASSERT(OutsideITBlock());
3313     MacroEmissionCheckScope guard(this);
3314 #ifndef PANDA_BUILD
3315     ITScope it_scope(this, &cond, guard);
3316 #else
3317     ITScope it_scope(allocator_, this, &cond, guard);
3318 #endif
3319     pkhbt(cond, rd, rn, operand);
3320   }
3321   void Pkhbt(Register rd, Register rn, const Operand& operand) {
3322     Pkhbt(al, rd, rn, operand);
3323   }
3324 
3325   void Pkhtb(Condition cond, Register rd, Register rn, const Operand& operand) {
3326     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3327     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3328     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3329     VIXL_ASSERT(allow_macro_instructions_);
3330     VIXL_ASSERT(OutsideITBlock());
3331     MacroEmissionCheckScope guard(this);
3332 #ifndef PANDA_BUILD
3333     ITScope it_scope(this, &cond, guard);
3334 #else
3335     ITScope it_scope(allocator_, this, &cond, guard);
3336 #endif
3337     pkhtb(cond, rd, rn, operand);
3338   }
3339   void Pkhtb(Register rd, Register rn, const Operand& operand) {
3340     Pkhtb(al, rd, rn, operand);
3341   }
3342 
3343 
3344   void Pld(Condition cond, const MemOperand& operand) {
3345     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3346     VIXL_ASSERT(allow_macro_instructions_);
3347     VIXL_ASSERT(OutsideITBlock());
3348     MacroEmissionCheckScope guard(this);
3349 #ifndef PANDA_BUILD
3350     ITScope it_scope(this, &cond, guard);
3351 #else
3352     ITScope it_scope(allocator_, this, &cond, guard);
3353 #endif
3354     pld(cond, operand);
3355   }
3356   void Pld(const MemOperand& operand) { Pld(al, operand); }
3357 
3358   void Pldw(Condition cond, const MemOperand& operand) {
3359     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3360     VIXL_ASSERT(allow_macro_instructions_);
3361     VIXL_ASSERT(OutsideITBlock());
3362     MacroEmissionCheckScope guard(this);
3363 #ifndef PANDA_BUILD
3364     ITScope it_scope(this, &cond, guard);
3365 #else
3366     ITScope it_scope(allocator_, this, &cond, guard);
3367 #endif
3368     pldw(cond, operand);
3369   }
3370   void Pldw(const MemOperand& operand) { Pldw(al, operand); }
3371 
3372   void Pli(Condition cond, const MemOperand& operand) {
3373     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3374     VIXL_ASSERT(allow_macro_instructions_);
3375     VIXL_ASSERT(OutsideITBlock());
3376     MacroEmissionCheckScope guard(this);
3377 #ifndef PANDA_BUILD
3378     ITScope it_scope(this, &cond, guard);
3379 #else
3380     ITScope it_scope(allocator_, this, &cond, guard);
3381 #endif
3382     pli(cond, operand);
3383   }
3384   void Pli(const MemOperand& operand) { Pli(al, operand); }
3385 
3386 
3387   void Pop(Condition cond, RegisterList registers) {
3388     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
3389     VIXL_ASSERT(allow_macro_instructions_);
3390     VIXL_ASSERT(OutsideITBlock());
3391     MacroEmissionCheckScope guard(this);
3392 #ifndef PANDA_BUILD
3393     ITScope it_scope(this, &cond, guard);
3394 #else
3395     ITScope it_scope(allocator_, this, &cond, guard);
3396 #endif
3397     if (registers.IsSingleRegister() &&
3398         (!IsUsingT32() || !registers.IsR0toR7orPC())) {
3399       pop(cond, registers.GetFirstAvailableRegister());
3400     } else if (!registers.IsEmpty()) {
3401       pop(cond, registers);
3402     }
3403   }
3404   void Pop(RegisterList registers) { Pop(al, registers); }
3405 
3406   void Pop(Condition cond, Register rt) {
3407     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
3408     VIXL_ASSERT(allow_macro_instructions_);
3409     VIXL_ASSERT(OutsideITBlock());
3410     MacroEmissionCheckScope guard(this);
3411 #ifndef PANDA_BUILD
3412     ITScope it_scope(this, &cond, guard);
3413 #else
3414     ITScope it_scope(allocator_, this, &cond, guard);
3415 #endif
3416     pop(cond, rt);
3417   }
3418   void Pop(Register rt) { Pop(al, rt); }
3419 
3420   void Push(Condition cond, RegisterList registers) {
3421     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
3422     VIXL_ASSERT(allow_macro_instructions_);
3423     VIXL_ASSERT(OutsideITBlock());
3424     MacroEmissionCheckScope guard(this);
3425 #ifndef PANDA_BUILD
3426     ITScope it_scope(this, &cond, guard);
3427 #else
3428     ITScope it_scope(allocator_, this, &cond, guard);
3429 #endif
3430     if (registers.IsSingleRegister() && !registers.Includes(sp) &&
3431         (!IsUsingT32() || !registers.IsR0toR7orLR())) {
3432       push(cond, registers.GetFirstAvailableRegister());
3433     } else if (!registers.IsEmpty()) {
3434       push(cond, registers);
3435     }
3436   }
3437   void Push(RegisterList registers) { Push(al, registers); }
3438 
3439   void Push(Condition cond, Register rt) {
3440     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
3441     VIXL_ASSERT(allow_macro_instructions_);
3442     VIXL_ASSERT(OutsideITBlock());
3443     MacroEmissionCheckScope guard(this);
3444 #ifndef PANDA_BUILD
3445     ITScope it_scope(this, &cond, guard);
3446 #else
3447     ITScope it_scope(allocator_, this, &cond, guard);
3448 #endif
3449     if (IsUsingA32() && rt.IsSP()) {
3450       // Only the A32 multiple-register form can push sp.
3451       push(cond, RegisterList(rt));
3452     } else {
3453       push(cond, rt);
3454     }
3455   }
3456   void Push(Register rt) { Push(al, rt); }
3457 
3458   void Qadd(Condition cond, Register rd, Register rm, Register rn) {
3459     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3460     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3461     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3462     VIXL_ASSERT(allow_macro_instructions_);
3463     VIXL_ASSERT(OutsideITBlock());
3464     MacroEmissionCheckScope guard(this);
3465 #ifndef PANDA_BUILD
3466     ITScope it_scope(this, &cond, guard);
3467 #else
3468     ITScope it_scope(allocator_, this, &cond, guard);
3469 #endif
3470     qadd(cond, rd, rm, rn);
3471   }
3472   void Qadd(Register rd, Register rm, Register rn) { Qadd(al, rd, rm, rn); }
3473 
3474   void Qadd16(Condition cond, Register rd, Register rn, Register rm) {
3475     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3477     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3478     VIXL_ASSERT(allow_macro_instructions_);
3479     VIXL_ASSERT(OutsideITBlock());
3480     MacroEmissionCheckScope guard(this);
3481 #ifndef PANDA_BUILD
3482     ITScope it_scope(this, &cond, guard);
3483 #else
3484     ITScope it_scope(allocator_, this, &cond, guard);
3485 #endif
3486     qadd16(cond, rd, rn, rm);
3487   }
3488   void Qadd16(Register rd, Register rn, Register rm) { Qadd16(al, rd, rn, rm); }
3489 
3490   void Qadd8(Condition cond, Register rd, Register rn, Register rm) {
3491     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3492     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3493     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3494     VIXL_ASSERT(allow_macro_instructions_);
3495     VIXL_ASSERT(OutsideITBlock());
3496     MacroEmissionCheckScope guard(this);
3497 #ifndef PANDA_BUILD
3498     ITScope it_scope(this, &cond, guard);
3499 #else
3500     ITScope it_scope(allocator_, this, &cond, guard);
3501 #endif
3502     qadd8(cond, rd, rn, rm);
3503   }
3504   void Qadd8(Register rd, Register rn, Register rm) { Qadd8(al, rd, rn, rm); }
3505 
3506   void Qasx(Condition cond, Register rd, Register rn, Register rm) {
3507     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3508     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3509     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3510     VIXL_ASSERT(allow_macro_instructions_);
3511     VIXL_ASSERT(OutsideITBlock());
3512     MacroEmissionCheckScope guard(this);
3513 #ifndef PANDA_BUILD
3514     ITScope it_scope(this, &cond, guard);
3515 #else
3516     ITScope it_scope(allocator_, this, &cond, guard);
3517 #endif
3518     qasx(cond, rd, rn, rm);
3519   }
3520   void Qasx(Register rd, Register rn, Register rm) { Qasx(al, rd, rn, rm); }
3521 
3522   void Qdadd(Condition cond, Register rd, Register rm, Register rn) {
3523     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3524     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3525     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3526     VIXL_ASSERT(allow_macro_instructions_);
3527     VIXL_ASSERT(OutsideITBlock());
3528     MacroEmissionCheckScope guard(this);
3529 #ifndef PANDA_BUILD
3530     ITScope it_scope(this, &cond, guard);
3531 #else
3532     ITScope it_scope(allocator_, this, &cond, guard);
3533 #endif
3534     qdadd(cond, rd, rm, rn);
3535   }
3536   void Qdadd(Register rd, Register rm, Register rn) { Qdadd(al, rd, rm, rn); }
3537 
3538   void Qdsub(Condition cond, Register rd, Register rm, Register rn) {
3539     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3540     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3541     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3542     VIXL_ASSERT(allow_macro_instructions_);
3543     VIXL_ASSERT(OutsideITBlock());
3544     MacroEmissionCheckScope guard(this);
3545 #ifndef PANDA_BUILD
3546     ITScope it_scope(this, &cond, guard);
3547 #else
3548     ITScope it_scope(allocator_, this, &cond, guard);
3549 #endif
3550     qdsub(cond, rd, rm, rn);
3551   }
3552   void Qdsub(Register rd, Register rm, Register rn) { Qdsub(al, rd, rm, rn); }
3553 
3554   void Qsax(Condition cond, Register rd, Register rn, Register rm) {
3555     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3557     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3558     VIXL_ASSERT(allow_macro_instructions_);
3559     VIXL_ASSERT(OutsideITBlock());
3560     MacroEmissionCheckScope guard(this);
3561 #ifndef PANDA_BUILD
3562     ITScope it_scope(this, &cond, guard);
3563 #else
3564     ITScope it_scope(allocator_, this, &cond, guard);
3565 #endif
3566     qsax(cond, rd, rn, rm);
3567   }
3568   void Qsax(Register rd, Register rn, Register rm) { Qsax(al, rd, rn, rm); }
3569 
3570   void Qsub(Condition cond, Register rd, Register rm, Register rn) {
3571     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3572     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3574     VIXL_ASSERT(allow_macro_instructions_);
3575     VIXL_ASSERT(OutsideITBlock());
3576     MacroEmissionCheckScope guard(this);
3577 #ifndef PANDA_BUILD
3578     ITScope it_scope(this, &cond, guard);
3579 #else
3580     ITScope it_scope(allocator_, this, &cond, guard);
3581 #endif
3582     qsub(cond, rd, rm, rn);
3583   }
3584   void Qsub(Register rd, Register rm, Register rn) { Qsub(al, rd, rm, rn); }
3585 
3586   void Qsub16(Condition cond, Register rd, Register rn, Register rm) {
3587     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3588     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3589     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3590     VIXL_ASSERT(allow_macro_instructions_);
3591     VIXL_ASSERT(OutsideITBlock());
3592     MacroEmissionCheckScope guard(this);
3593 #ifndef PANDA_BUILD
3594     ITScope it_scope(this, &cond, guard);
3595 #else
3596     ITScope it_scope(allocator_, this, &cond, guard);
3597 #endif
3598     qsub16(cond, rd, rn, rm);
3599   }
3600   void Qsub16(Register rd, Register rn, Register rm) { Qsub16(al, rd, rn, rm); }
3601 
3602   void Qsub8(Condition cond, Register rd, Register rn, Register rm) {
3603     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3604     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3605     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3606     VIXL_ASSERT(allow_macro_instructions_);
3607     VIXL_ASSERT(OutsideITBlock());
3608     MacroEmissionCheckScope guard(this);
3609 #ifndef PANDA_BUILD
3610     ITScope it_scope(this, &cond, guard);
3611 #else
3612     ITScope it_scope(allocator_, this, &cond, guard);
3613 #endif
3614     qsub8(cond, rd, rn, rm);
3615   }
3616   void Qsub8(Register rd, Register rn, Register rm) { Qsub8(al, rd, rn, rm); }
3617 
3618   void Rbit(Condition cond, Register rd, Register rm) {
3619     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3620     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3621     VIXL_ASSERT(allow_macro_instructions_);
3622     VIXL_ASSERT(OutsideITBlock());
3623     MacroEmissionCheckScope guard(this);
3624 #ifndef PANDA_BUILD
3625     ITScope it_scope(this, &cond, guard);
3626 #else
3627     ITScope it_scope(allocator_, this, &cond, guard);
3628 #endif
3629     rbit(cond, rd, rm);
3630   }
3631   void Rbit(Register rd, Register rm) { Rbit(al, rd, rm); }
3632 
3633   void Rev(Condition cond, Register rd, Register rm) {
3634     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3635     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3636     VIXL_ASSERT(allow_macro_instructions_);
3637     VIXL_ASSERT(OutsideITBlock());
3638     MacroEmissionCheckScope guard(this);
3639 #ifndef PANDA_BUILD
3640     ITScope it_scope(this, &cond, guard);
3641 #else
3642     ITScope it_scope(allocator_, this, &cond, guard);
3643 #endif
3644     rev(cond, rd, rm);
3645   }
3646   void Rev(Register rd, Register rm) { Rev(al, rd, rm); }
3647 
3648   void Rev16(Condition cond, Register rd, Register rm) {
3649     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3650     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3651     VIXL_ASSERT(allow_macro_instructions_);
3652     VIXL_ASSERT(OutsideITBlock());
3653     MacroEmissionCheckScope guard(this);
3654 #ifndef PANDA_BUILD
3655     ITScope it_scope(this, &cond, guard);
3656 #else
3657     ITScope it_scope(allocator_, this, &cond, guard);
3658 #endif
3659     rev16(cond, rd, rm);
3660   }
3661   void Rev16(Register rd, Register rm) { Rev16(al, rd, rm); }
3662 
3663   void Revsh(Condition cond, Register rd, Register rm) {
3664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3665     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3666     VIXL_ASSERT(allow_macro_instructions_);
3667     VIXL_ASSERT(OutsideITBlock());
3668     MacroEmissionCheckScope guard(this);
3669 #ifndef PANDA_BUILD
3670     ITScope it_scope(this, &cond, guard);
3671 #else
3672     ITScope it_scope(allocator_, this, &cond, guard);
3673 #endif
3674     revsh(cond, rd, rm);
3675   }
3676   void Revsh(Register rd, Register rm) { Revsh(al, rd, rm); }
3677 
3678   void Ror(Condition cond, Register rd, Register rm, const Operand& operand) {
3679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3680     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3681     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3682     VIXL_ASSERT(allow_macro_instructions_);
3683     VIXL_ASSERT(OutsideITBlock());
3684     MacroEmissionCheckScope guard(this);
3685     bool can_use_it =
3686         // ROR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
3687         operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
3688         operand.GetBaseRegister().IsLow();
3689 #ifndef PANDA_BUILD
3690     ITScope it_scope(this, &cond, guard, can_use_it);
3691 #else
3692     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
3693 #endif
3694     ror(cond, rd, rm, operand);
3695   }
3696   void Ror(Register rd, Register rm, const Operand& operand) {
3697     Ror(al, rd, rm, operand);
3698   }
3699   void Ror(FlagsUpdate flags,
3700            Condition cond,
3701            Register rd,
3702            Register rm,
3703            const Operand& operand) {
3704     switch (flags) {
3705       case LeaveFlags:
3706         Ror(cond, rd, rm, operand);
3707         break;
3708       case SetFlags:
3709         Rors(cond, rd, rm, operand);
3710         break;
3711       case DontCare:
3712         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3713                                    rm.IsLow() && operand.IsPlainRegister() &&
3714                                    rd.Is(rm);
3715         if (setflags_is_smaller) {
3716           Rors(cond, rd, rm, operand);
3717         } else {
3718           Ror(cond, rd, rm, operand);
3719         }
3720         break;
3721     }
3722   }
3723   void Ror(FlagsUpdate flags,
3724            Register rd,
3725            Register rm,
3726            const Operand& operand) {
3727     Ror(flags, al, rd, rm, operand);
3728   }
3729 
3730   void Rors(Condition cond, Register rd, Register rm, const Operand& operand) {
3731     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3732     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3733     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3734     VIXL_ASSERT(allow_macro_instructions_);
3735     VIXL_ASSERT(OutsideITBlock());
3736     MacroEmissionCheckScope guard(this);
3737 #ifndef PANDA_BUILD
3738     ITScope it_scope(this, &cond, guard);
3739 #else
3740     ITScope it_scope(allocator_, this, &cond, guard);
3741 #endif
3742     rors(cond, rd, rm, operand);
3743   }
3744   void Rors(Register rd, Register rm, const Operand& operand) {
3745     Rors(al, rd, rm, operand);
3746   }
3747 
3748   void Rrx(Condition cond, Register rd, Register rm) {
3749     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3750     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3751     VIXL_ASSERT(allow_macro_instructions_);
3752     VIXL_ASSERT(OutsideITBlock());
3753     MacroEmissionCheckScope guard(this);
3754 #ifndef PANDA_BUILD
3755     ITScope it_scope(this, &cond, guard);
3756 #else
3757     ITScope it_scope(allocator_, this, &cond, guard);
3758 #endif
3759     rrx(cond, rd, rm);
3760   }
3761   void Rrx(Register rd, Register rm) { Rrx(al, rd, rm); }
3762   void Rrx(FlagsUpdate flags, Condition cond, Register rd, Register rm) {
3763     switch (flags) {
3764       case LeaveFlags:
3765         Rrx(cond, rd, rm);
3766         break;
3767       case SetFlags:
3768         Rrxs(cond, rd, rm);
3769         break;
3770       case DontCare:
3771         Rrx(cond, rd, rm);
3772         break;
3773     }
3774   }
3775   void Rrx(FlagsUpdate flags, Register rd, Register rm) {
3776     Rrx(flags, al, rd, rm);
3777   }
3778 
3779   void Rrxs(Condition cond, Register rd, Register rm) {
3780     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3781     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3782     VIXL_ASSERT(allow_macro_instructions_);
3783     VIXL_ASSERT(OutsideITBlock());
3784     MacroEmissionCheckScope guard(this);
3785 #ifndef PANDA_BUILD
3786     ITScope it_scope(this, &cond, guard);
3787 #else
3788     ITScope it_scope(allocator_, this, &cond, guard);
3789 #endif
3790     rrxs(cond, rd, rm);
3791   }
3792   void Rrxs(Register rd, Register rm) { Rrxs(al, rd, rm); }
3793 
3794   void Rsb(Condition cond, Register rd, Register rn, const Operand& operand) {
3795     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3796     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3797     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3798     VIXL_ASSERT(allow_macro_instructions_);
3799     VIXL_ASSERT(OutsideITBlock());
3800     MacroEmissionCheckScope guard(this);
3801     bool can_use_it =
3802         // RSB<c>{<q>} {<Rd>, }<Rn>, #0 ; T1
3803         operand.IsImmediate() && rd.IsLow() && rn.IsLow() &&
3804         (operand.GetImmediate() == 0);
3805 #ifndef PANDA_BUILD
3806     ITScope it_scope(this, &cond, guard, can_use_it);
3807 #else
3808     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
3809 #endif
3810     rsb(cond, rd, rn, operand);
3811   }
3812   void Rsb(Register rd, Register rn, const Operand& operand) {
3813     Rsb(al, rd, rn, operand);
3814   }
3815   void Rsb(FlagsUpdate flags,
3816            Condition cond,
3817            Register rd,
3818            Register rn,
3819            const Operand& operand) {
3820     switch (flags) {
3821       case LeaveFlags:
3822         Rsb(cond, rd, rn, operand);
3823         break;
3824       case SetFlags:
3825         Rsbs(cond, rd, rn, operand);
3826         break;
3827       case DontCare:
3828         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3829                                    rn.IsLow() && operand.IsImmediate() &&
3830                                    (operand.GetImmediate() == 0);
3831         if (setflags_is_smaller) {
3832           Rsbs(cond, rd, rn, operand);
3833         } else {
3834           Rsb(cond, rd, rn, operand);
3835         }
3836         break;
3837     }
3838   }
3839   void Rsb(FlagsUpdate flags,
3840            Register rd,
3841            Register rn,
3842            const Operand& operand) {
3843     Rsb(flags, al, rd, rn, operand);
3844   }
3845 
3846   void Rsbs(Condition cond, Register rd, Register rn, const Operand& operand) {
3847     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3848     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3849     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3850     VIXL_ASSERT(allow_macro_instructions_);
3851     VIXL_ASSERT(OutsideITBlock());
3852     MacroEmissionCheckScope guard(this);
3853 #ifndef PANDA_BUILD
3854     ITScope it_scope(this, &cond, guard);
3855 #else
3856     ITScope it_scope(allocator_, this, &cond, guard);
3857 #endif
3858     rsbs(cond, rd, rn, operand);
3859   }
3860   void Rsbs(Register rd, Register rn, const Operand& operand) {
3861     Rsbs(al, rd, rn, operand);
3862   }
3863 
3864   void Rsc(Condition cond, Register rd, Register rn, const Operand& operand) {
3865     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3866     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3867     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3868     VIXL_ASSERT(allow_macro_instructions_);
3869     VIXL_ASSERT(OutsideITBlock());
3870     MacroEmissionCheckScope guard(this);
3871 #ifndef PANDA_BUILD
3872     ITScope it_scope(this, &cond, guard);
3873 #else
3874     ITScope it_scope(allocator_, this, &cond, guard);
3875 #endif
3876     rsc(cond, rd, rn, operand);
3877   }
3878   void Rsc(Register rd, Register rn, const Operand& operand) {
3879     Rsc(al, rd, rn, operand);
3880   }
3881   void Rsc(FlagsUpdate flags,
3882            Condition cond,
3883            Register rd,
3884            Register rn,
3885            const Operand& operand) {
3886     switch (flags) {
3887       case LeaveFlags:
3888         Rsc(cond, rd, rn, operand);
3889         break;
3890       case SetFlags:
3891         Rscs(cond, rd, rn, operand);
3892         break;
3893       case DontCare:
3894         Rsc(cond, rd, rn, operand);
3895         break;
3896     }
3897   }
3898   void Rsc(FlagsUpdate flags,
3899            Register rd,
3900            Register rn,
3901            const Operand& operand) {
3902     Rsc(flags, al, rd, rn, operand);
3903   }
3904 
3905   void Rscs(Condition cond, Register rd, Register rn, const Operand& operand) {
3906     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3907     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3908     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3909     VIXL_ASSERT(allow_macro_instructions_);
3910     VIXL_ASSERT(OutsideITBlock());
3911     MacroEmissionCheckScope guard(this);
3912 #ifndef PANDA_BUILD
3913     ITScope it_scope(this, &cond, guard);
3914 #else
3915     ITScope it_scope(allocator_, this, &cond, guard);
3916 #endif
3917     rscs(cond, rd, rn, operand);
3918   }
3919   void Rscs(Register rd, Register rn, const Operand& operand) {
3920     Rscs(al, rd, rn, operand);
3921   }
3922 
3923   void Sadd16(Condition cond, Register rd, Register rn, Register rm) {
3924     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3925     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3926     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3927     VIXL_ASSERT(allow_macro_instructions_);
3928     VIXL_ASSERT(OutsideITBlock());
3929     MacroEmissionCheckScope guard(this);
3930 #ifndef PANDA_BUILD
3931     ITScope it_scope(this, &cond, guard);
3932 #else
3933     ITScope it_scope(allocator_, this, &cond, guard);
3934 #endif
3935     sadd16(cond, rd, rn, rm);
3936   }
3937   void Sadd16(Register rd, Register rn, Register rm) { Sadd16(al, rd, rn, rm); }
3938 
3939   void Sadd8(Condition cond, Register rd, Register rn, Register rm) {
3940     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3941     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3942     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3943     VIXL_ASSERT(allow_macro_instructions_);
3944     VIXL_ASSERT(OutsideITBlock());
3945     MacroEmissionCheckScope guard(this);
3946 #ifndef PANDA_BUILD
3947     ITScope it_scope(this, &cond, guard);
3948 #else
3949     ITScope it_scope(allocator_, this, &cond, guard);
3950 #endif
3951     sadd8(cond, rd, rn, rm);
3952   }
3953   void Sadd8(Register rd, Register rn, Register rm) { Sadd8(al, rd, rn, rm); }
3954 
3955   void Sasx(Condition cond, Register rd, Register rn, Register rm) {
3956     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3957     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3958     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3959     VIXL_ASSERT(allow_macro_instructions_);
3960     VIXL_ASSERT(OutsideITBlock());
3961     MacroEmissionCheckScope guard(this);
3962 #ifndef PANDA_BUILD
3963     ITScope it_scope(this, &cond, guard);
3964 #else
3965     ITScope it_scope(allocator_, this, &cond, guard);
3966 #endif
3967     sasx(cond, rd, rn, rm);
3968   }
3969   void Sasx(Register rd, Register rn, Register rm) { Sasx(al, rd, rn, rm); }
3970 
3971   void Sbc(Condition cond, Register rd, Register rn, const Operand& operand) {
3972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3973     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3974     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3975     VIXL_ASSERT(allow_macro_instructions_);
3976     VIXL_ASSERT(OutsideITBlock());
3977     MacroEmissionCheckScope guard(this);
3978     bool can_use_it =
3979         // SBC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
3980         operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
3981         operand.GetBaseRegister().IsLow();
3982 #ifndef PANDA_BUILD
3983     ITScope it_scope(this, &cond, guard, can_use_it);
3984 #else
3985     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
3986 #endif
3987     sbc(cond, rd, rn, operand);
3988   }
3989   void Sbc(Register rd, Register rn, const Operand& operand) {
3990     Sbc(al, rd, rn, operand);
3991   }
3992   void Sbc(FlagsUpdate flags,
3993            Condition cond,
3994            Register rd,
3995            Register rn,
3996            const Operand& operand) {
3997     switch (flags) {
3998       case LeaveFlags:
3999         Sbc(cond, rd, rn, operand);
4000         break;
4001       case SetFlags:
4002         Sbcs(cond, rd, rn, operand);
4003         break;
4004       case DontCare:
4005         bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
4006                                    rn.Is(rd) && operand.IsPlainRegister() &&
4007                                    operand.GetBaseRegister().IsLow();
4008         if (setflags_is_smaller) {
4009           Sbcs(cond, rd, rn, operand);
4010         } else {
4011           Sbc(cond, rd, rn, operand);
4012         }
4013         break;
4014     }
4015   }
4016   void Sbc(FlagsUpdate flags,
4017            Register rd,
4018            Register rn,
4019            const Operand& operand) {
4020     Sbc(flags, al, rd, rn, operand);
4021   }
4022 
4023   void Sbcs(Condition cond, Register rd, Register rn, const Operand& operand) {
4024     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4025     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4026     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4027     VIXL_ASSERT(allow_macro_instructions_);
4028     VIXL_ASSERT(OutsideITBlock());
4029     MacroEmissionCheckScope guard(this);
4030 #ifndef PANDA_BUILD
4031     ITScope it_scope(this, &cond, guard);
4032 #else
4033     ITScope it_scope(allocator_, this, &cond, guard);
4034 #endif
4035     sbcs(cond, rd, rn, operand);
4036   }
4037   void Sbcs(Register rd, Register rn, const Operand& operand) {
4038     Sbcs(al, rd, rn, operand);
4039   }
4040 
4041   void Sbfx(
4042       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
4043     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4044     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4045     VIXL_ASSERT(allow_macro_instructions_);
4046     VIXL_ASSERT(OutsideITBlock());
4047     MacroEmissionCheckScope guard(this);
4048 #ifndef PANDA_BUILD
4049     ITScope it_scope(this, &cond, guard);
4050 #else
4051     ITScope it_scope(allocator_, this, &cond, guard);
4052 #endif
4053     sbfx(cond, rd, rn, lsb, width);
4054   }
4055   void Sbfx(Register rd, Register rn, uint32_t lsb, uint32_t width) {
4056     Sbfx(al, rd, rn, lsb, width);
4057   }
4058 
4059   void Sdiv(Condition cond, Register rd, Register rn, Register rm) {
4060     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4061     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4062     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4063     VIXL_ASSERT(allow_macro_instructions_);
4064     VIXL_ASSERT(OutsideITBlock());
4065     MacroEmissionCheckScope guard(this);
4066 #ifndef PANDA_BUILD
4067     ITScope it_scope(this, &cond, guard);
4068 #else
4069     ITScope it_scope(allocator_, this, &cond, guard);
4070 #endif
4071     sdiv(cond, rd, rn, rm);
4072   }
4073   void Sdiv(Register rd, Register rn, Register rm) { Sdiv(al, rd, rn, rm); }
4074 
4075   void Sel(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 #ifndef PANDA_BUILD
4083     ITScope it_scope(this, &cond, guard);
4084 #else
4085     ITScope it_scope(allocator_, this, &cond, guard);
4086 #endif
4087     sel(cond, rd, rn, rm);
4088   }
4089   void Sel(Register rd, Register rn, Register rm) { Sel(al, rd, rn, rm); }
4090 
4091   void Shadd16(Condition cond, Register rd, Register rn, Register rm) {
4092     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4093     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4094     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4095     VIXL_ASSERT(allow_macro_instructions_);
4096     VIXL_ASSERT(OutsideITBlock());
4097     MacroEmissionCheckScope guard(this);
4098 #ifndef PANDA_BUILD
4099     ITScope it_scope(this, &cond, guard);
4100 #else
4101     ITScope it_scope(allocator_, this, &cond, guard);
4102 #endif
4103     shadd16(cond, rd, rn, rm);
4104   }
4105   void Shadd16(Register rd, Register rn, Register rm) {
4106     Shadd16(al, rd, rn, rm);
4107   }
4108 
4109   void Shadd8(Condition cond, Register rd, Register rn, Register rm) {
4110     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4111     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4112     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4113     VIXL_ASSERT(allow_macro_instructions_);
4114     VIXL_ASSERT(OutsideITBlock());
4115     MacroEmissionCheckScope guard(this);
4116 #ifndef PANDA_BUILD
4117     ITScope it_scope(this, &cond, guard);
4118 #else
4119     ITScope it_scope(allocator_, this, &cond, guard);
4120 #endif
4121     shadd8(cond, rd, rn, rm);
4122   }
4123   void Shadd8(Register rd, Register rn, Register rm) { Shadd8(al, rd, rn, rm); }
4124 
4125   void Shasx(Condition cond, Register rd, Register rn, Register rm) {
4126     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4127     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4128     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4129     VIXL_ASSERT(allow_macro_instructions_);
4130     VIXL_ASSERT(OutsideITBlock());
4131     MacroEmissionCheckScope guard(this);
4132 #ifndef PANDA_BUILD
4133     ITScope it_scope(this, &cond, guard);
4134 #else
4135     ITScope it_scope(allocator_, this, &cond, guard);
4136 #endif
4137     shasx(cond, rd, rn, rm);
4138   }
4139   void Shasx(Register rd, Register rn, Register rm) { Shasx(al, rd, rn, rm); }
4140 
4141   void Shsax(Condition cond, Register rd, Register rn, Register rm) {
4142     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4143     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4144     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4145     VIXL_ASSERT(allow_macro_instructions_);
4146     VIXL_ASSERT(OutsideITBlock());
4147     MacroEmissionCheckScope guard(this);
4148 #ifndef PANDA_BUILD
4149     ITScope it_scope(this, &cond, guard);
4150 #else
4151     ITScope it_scope(allocator_, this, &cond, guard);
4152 #endif
4153     shsax(cond, rd, rn, rm);
4154   }
4155   void Shsax(Register rd, Register rn, Register rm) { Shsax(al, rd, rn, rm); }
4156 
4157   void Shsub16(Condition cond, Register rd, Register rn, Register rm) {
4158     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4159     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4160     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4161     VIXL_ASSERT(allow_macro_instructions_);
4162     VIXL_ASSERT(OutsideITBlock());
4163     MacroEmissionCheckScope guard(this);
4164 #ifndef PANDA_BUILD
4165     ITScope it_scope(this, &cond, guard);
4166 #else
4167     ITScope it_scope(allocator_, this, &cond, guard);
4168 #endif
4169     shsub16(cond, rd, rn, rm);
4170   }
4171   void Shsub16(Register rd, Register rn, Register rm) {
4172     Shsub16(al, rd, rn, rm);
4173   }
4174 
4175   void Shsub8(Condition cond, Register rd, Register rn, Register rm) {
4176     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4177     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4178     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4179     VIXL_ASSERT(allow_macro_instructions_);
4180     VIXL_ASSERT(OutsideITBlock());
4181     MacroEmissionCheckScope guard(this);
4182 #ifndef PANDA_BUILD
4183     ITScope it_scope(this, &cond, guard);
4184 #else
4185     ITScope it_scope(allocator_, this, &cond, guard);
4186 #endif
4187     shsub8(cond, rd, rn, rm);
4188   }
4189   void Shsub8(Register rd, Register rn, Register rm) { Shsub8(al, rd, rn, rm); }
4190 
4191   void Smlabb(
4192       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4193     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4194     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4195     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4196     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4197     VIXL_ASSERT(allow_macro_instructions_);
4198     VIXL_ASSERT(OutsideITBlock());
4199     MacroEmissionCheckScope guard(this);
4200 #ifndef PANDA_BUILD
4201     ITScope it_scope(this, &cond, guard);
4202 #else
4203     ITScope it_scope(allocator_, this, &cond, guard);
4204 #endif
4205     smlabb(cond, rd, rn, rm, ra);
4206   }
4207   void Smlabb(Register rd, Register rn, Register rm, Register ra) {
4208     Smlabb(al, rd, rn, rm, ra);
4209   }
4210 
4211   void Smlabt(
4212       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4213     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4214     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4215     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4216     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4217     VIXL_ASSERT(allow_macro_instructions_);
4218     VIXL_ASSERT(OutsideITBlock());
4219     MacroEmissionCheckScope guard(this);
4220 #ifndef PANDA_BUILD
4221     ITScope it_scope(this, &cond, guard);
4222 #else
4223     ITScope it_scope(allocator_, this, &cond, guard);
4224 #endif
4225     smlabt(cond, rd, rn, rm, ra);
4226   }
4227   void Smlabt(Register rd, Register rn, Register rm, Register ra) {
4228     Smlabt(al, rd, rn, rm, ra);
4229   }
4230 
4231   void Smlad(
4232       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4233     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4234     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4235     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4236     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4237     VIXL_ASSERT(allow_macro_instructions_);
4238     VIXL_ASSERT(OutsideITBlock());
4239     MacroEmissionCheckScope guard(this);
4240 #ifndef PANDA_BUILD
4241     ITScope it_scope(this, &cond, guard);
4242 #else
4243     ITScope it_scope(allocator_, this, &cond, guard);
4244 #endif
4245     smlad(cond, rd, rn, rm, ra);
4246   }
4247   void Smlad(Register rd, Register rn, Register rm, Register ra) {
4248     Smlad(al, rd, rn, rm, ra);
4249   }
4250 
4251   void Smladx(
4252       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4253     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4254     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4255     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4256     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4257     VIXL_ASSERT(allow_macro_instructions_);
4258     VIXL_ASSERT(OutsideITBlock());
4259     MacroEmissionCheckScope guard(this);
4260 #ifndef PANDA_BUILD
4261     ITScope it_scope(this, &cond, guard);
4262 #else
4263     ITScope it_scope(allocator_, this, &cond, guard);
4264 #endif
4265     smladx(cond, rd, rn, rm, ra);
4266   }
4267   void Smladx(Register rd, Register rn, Register rm, Register ra) {
4268     Smladx(al, rd, rn, rm, ra);
4269   }
4270 
4271   void Smlal(
4272       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4273     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4274     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4275     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4276     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4277     VIXL_ASSERT(allow_macro_instructions_);
4278     VIXL_ASSERT(OutsideITBlock());
4279     MacroEmissionCheckScope guard(this);
4280 #ifndef PANDA_BUILD
4281     ITScope it_scope(this, &cond, guard);
4282 #else
4283     ITScope it_scope(allocator_, this, &cond, guard);
4284 #endif
4285     smlal(cond, rdlo, rdhi, rn, rm);
4286   }
4287   void Smlal(Register rdlo, Register rdhi, Register rn, Register rm) {
4288     Smlal(al, rdlo, rdhi, rn, rm);
4289   }
4290 
4291   void Smlalbb(
4292       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4293     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4294     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4295     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4296     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4297     VIXL_ASSERT(allow_macro_instructions_);
4298     VIXL_ASSERT(OutsideITBlock());
4299     MacroEmissionCheckScope guard(this);
4300 #ifndef PANDA_BUILD
4301     ITScope it_scope(this, &cond, guard);
4302 #else
4303     ITScope it_scope(allocator_, this, &cond, guard);
4304 #endif
4305     smlalbb(cond, rdlo, rdhi, rn, rm);
4306   }
4307   void Smlalbb(Register rdlo, Register rdhi, Register rn, Register rm) {
4308     Smlalbb(al, rdlo, rdhi, rn, rm);
4309   }
4310 
4311   void Smlalbt(
4312       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4313     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4314     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4315     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4316     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4317     VIXL_ASSERT(allow_macro_instructions_);
4318     VIXL_ASSERT(OutsideITBlock());
4319     MacroEmissionCheckScope guard(this);
4320 #ifndef PANDA_BUILD
4321     ITScope it_scope(this, &cond, guard);
4322 #else
4323     ITScope it_scope(allocator_, this, &cond, guard);
4324 #endif
4325     smlalbt(cond, rdlo, rdhi, rn, rm);
4326   }
4327   void Smlalbt(Register rdlo, Register rdhi, Register rn, Register rm) {
4328     Smlalbt(al, rdlo, rdhi, rn, rm);
4329   }
4330 
4331   void Smlald(
4332       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4333     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4334     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4335     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4336     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4337     VIXL_ASSERT(allow_macro_instructions_);
4338     VIXL_ASSERT(OutsideITBlock());
4339     MacroEmissionCheckScope guard(this);
4340 #ifndef PANDA_BUILD
4341     ITScope it_scope(this, &cond, guard);
4342 #else
4343     ITScope it_scope(allocator_, this, &cond, guard);
4344 #endif
4345     smlald(cond, rdlo, rdhi, rn, rm);
4346   }
4347   void Smlald(Register rdlo, Register rdhi, Register rn, Register rm) {
4348     Smlald(al, rdlo, rdhi, rn, rm);
4349   }
4350 
4351   void Smlaldx(
4352       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4353     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4354     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4355     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4356     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4357     VIXL_ASSERT(allow_macro_instructions_);
4358     VIXL_ASSERT(OutsideITBlock());
4359     MacroEmissionCheckScope guard(this);
4360 #ifndef PANDA_BUILD
4361     ITScope it_scope(this, &cond, guard);
4362 #else
4363     ITScope it_scope(allocator_, this, &cond, guard);
4364 #endif
4365     smlaldx(cond, rdlo, rdhi, rn, rm);
4366   }
4367   void Smlaldx(Register rdlo, Register rdhi, Register rn, Register rm) {
4368     Smlaldx(al, rdlo, rdhi, rn, rm);
4369   }
4370 
4371   void Smlals(
4372       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4373     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4374     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4375     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4376     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4377     VIXL_ASSERT(allow_macro_instructions_);
4378     VIXL_ASSERT(OutsideITBlock());
4379     MacroEmissionCheckScope guard(this);
4380 #ifndef PANDA_BUILD
4381     ITScope it_scope(this, &cond, guard);
4382 #else
4383     ITScope it_scope(allocator_, this, &cond, guard);
4384 #endif
4385     smlals(cond, rdlo, rdhi, rn, rm);
4386   }
4387   void Smlals(Register rdlo, Register rdhi, Register rn, Register rm) {
4388     Smlals(al, rdlo, rdhi, rn, rm);
4389   }
4390 
4391   void Smlaltb(
4392       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4393     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4394     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4395     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4396     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4397     VIXL_ASSERT(allow_macro_instructions_);
4398     VIXL_ASSERT(OutsideITBlock());
4399     MacroEmissionCheckScope guard(this);
4400 #ifndef PANDA_BUILD
4401     ITScope it_scope(this, &cond, guard);
4402 #else
4403     ITScope it_scope(allocator_, this, &cond, guard);
4404 #endif
4405     smlaltb(cond, rdlo, rdhi, rn, rm);
4406   }
4407   void Smlaltb(Register rdlo, Register rdhi, Register rn, Register rm) {
4408     Smlaltb(al, rdlo, rdhi, rn, rm);
4409   }
4410 
4411   void Smlaltt(
4412       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4413     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4414     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4415     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4416     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4417     VIXL_ASSERT(allow_macro_instructions_);
4418     VIXL_ASSERT(OutsideITBlock());
4419     MacroEmissionCheckScope guard(this);
4420 #ifndef PANDA_BUILD
4421     ITScope it_scope(this, &cond, guard);
4422 #else
4423     ITScope it_scope(allocator_, this, &cond, guard);
4424 #endif
4425     smlaltt(cond, rdlo, rdhi, rn, rm);
4426   }
4427   void Smlaltt(Register rdlo, Register rdhi, Register rn, Register rm) {
4428     Smlaltt(al, rdlo, rdhi, rn, rm);
4429   }
4430 
4431   void Smlatb(
4432       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4433     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4434     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4435     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4436     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4437     VIXL_ASSERT(allow_macro_instructions_);
4438     VIXL_ASSERT(OutsideITBlock());
4439     MacroEmissionCheckScope guard(this);
4440 #ifndef PANDA_BUILD
4441     ITScope it_scope(this, &cond, guard);
4442 #else
4443     ITScope it_scope(allocator_, this, &cond, guard);
4444 #endif
4445     smlatb(cond, rd, rn, rm, ra);
4446   }
4447   void Smlatb(Register rd, Register rn, Register rm, Register ra) {
4448     Smlatb(al, rd, rn, rm, ra);
4449   }
4450 
4451   void Smlatt(
4452       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4453     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4454     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4455     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4456     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4457     VIXL_ASSERT(allow_macro_instructions_);
4458     VIXL_ASSERT(OutsideITBlock());
4459     MacroEmissionCheckScope guard(this);
4460 #ifndef PANDA_BUILD
4461     ITScope it_scope(this, &cond, guard);
4462 #else
4463     ITScope it_scope(allocator_, this, &cond, guard);
4464 #endif
4465     smlatt(cond, rd, rn, rm, ra);
4466   }
4467   void Smlatt(Register rd, Register rn, Register rm, Register ra) {
4468     Smlatt(al, rd, rn, rm, ra);
4469   }
4470 
4471   void Smlawb(
4472       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4473     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4474     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4475     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4476     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4477     VIXL_ASSERT(allow_macro_instructions_);
4478     VIXL_ASSERT(OutsideITBlock());
4479     MacroEmissionCheckScope guard(this);
4480 #ifndef PANDA_BUILD
4481     ITScope it_scope(this, &cond, guard);
4482 #else
4483     ITScope it_scope(allocator_, this, &cond, guard);
4484 #endif
4485     smlawb(cond, rd, rn, rm, ra);
4486   }
4487   void Smlawb(Register rd, Register rn, Register rm, Register ra) {
4488     Smlawb(al, rd, rn, rm, ra);
4489   }
4490 
4491   void Smlawt(
4492       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4493     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4494     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4495     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4496     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4497     VIXL_ASSERT(allow_macro_instructions_);
4498     VIXL_ASSERT(OutsideITBlock());
4499     MacroEmissionCheckScope guard(this);
4500 #ifndef PANDA_BUILD
4501     ITScope it_scope(this, &cond, guard);
4502 #else
4503     ITScope it_scope(allocator_, this, &cond, guard);
4504 #endif
4505     smlawt(cond, rd, rn, rm, ra);
4506   }
4507   void Smlawt(Register rd, Register rn, Register rm, Register ra) {
4508     Smlawt(al, rd, rn, rm, ra);
4509   }
4510 
4511   void Smlsd(
4512       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4513     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4514     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4515     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4516     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4517     VIXL_ASSERT(allow_macro_instructions_);
4518     VIXL_ASSERT(OutsideITBlock());
4519     MacroEmissionCheckScope guard(this);
4520 #ifndef PANDA_BUILD
4521     ITScope it_scope(this, &cond, guard);
4522 #else
4523     ITScope it_scope(allocator_, this, &cond, guard);
4524 #endif
4525     smlsd(cond, rd, rn, rm, ra);
4526   }
4527   void Smlsd(Register rd, Register rn, Register rm, Register ra) {
4528     Smlsd(al, rd, rn, rm, ra);
4529   }
4530 
4531   void Smlsdx(
4532       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4533     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4535     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4536     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4537     VIXL_ASSERT(allow_macro_instructions_);
4538     VIXL_ASSERT(OutsideITBlock());
4539     MacroEmissionCheckScope guard(this);
4540 #ifndef PANDA_BUILD
4541     ITScope it_scope(this, &cond, guard);
4542 #else
4543     ITScope it_scope(allocator_, this, &cond, guard);
4544 #endif
4545     smlsdx(cond, rd, rn, rm, ra);
4546   }
4547   void Smlsdx(Register rd, Register rn, Register rm, Register ra) {
4548     Smlsdx(al, rd, rn, rm, ra);
4549   }
4550 
4551   void Smlsld(
4552       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4553     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4554     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4555     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4557     VIXL_ASSERT(allow_macro_instructions_);
4558     VIXL_ASSERT(OutsideITBlock());
4559     MacroEmissionCheckScope guard(this);
4560 #ifndef PANDA_BUILD
4561     ITScope it_scope(this, &cond, guard);
4562 #else
4563     ITScope it_scope(allocator_, this, &cond, guard);
4564 #endif
4565     smlsld(cond, rdlo, rdhi, rn, rm);
4566   }
4567   void Smlsld(Register rdlo, Register rdhi, Register rn, Register rm) {
4568     Smlsld(al, rdlo, rdhi, rn, rm);
4569   }
4570 
4571   void Smlsldx(
4572       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4574     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4575     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4576     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4577     VIXL_ASSERT(allow_macro_instructions_);
4578     VIXL_ASSERT(OutsideITBlock());
4579     MacroEmissionCheckScope guard(this);
4580 #ifndef PANDA_BUILD
4581     ITScope it_scope(this, &cond, guard);
4582 #else
4583     ITScope it_scope(allocator_, this, &cond, guard);
4584 #endif
4585     smlsldx(cond, rdlo, rdhi, rn, rm);
4586   }
4587   void Smlsldx(Register rdlo, Register rdhi, Register rn, Register rm) {
4588     Smlsldx(al, rdlo, rdhi, rn, rm);
4589   }
4590 
4591   void Smmla(
4592       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4593     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4594     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4595     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4596     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4597     VIXL_ASSERT(allow_macro_instructions_);
4598     VIXL_ASSERT(OutsideITBlock());
4599     MacroEmissionCheckScope guard(this);
4600 #ifndef PANDA_BUILD
4601     ITScope it_scope(this, &cond, guard);
4602 #else
4603     ITScope it_scope(allocator_, this, &cond, guard);
4604 #endif
4605     smmla(cond, rd, rn, rm, ra);
4606   }
4607   void Smmla(Register rd, Register rn, Register rm, Register ra) {
4608     Smmla(al, rd, rn, rm, ra);
4609   }
4610 
4611   void Smmlar(
4612       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4613     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4614     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4615     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4616     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4617     VIXL_ASSERT(allow_macro_instructions_);
4618     VIXL_ASSERT(OutsideITBlock());
4619     MacroEmissionCheckScope guard(this);
4620 #ifndef PANDA_BUILD
4621     ITScope it_scope(this, &cond, guard);
4622 #else
4623     ITScope it_scope(allocator_, this, &cond, guard);
4624 #endif
4625     smmlar(cond, rd, rn, rm, ra);
4626   }
4627   void Smmlar(Register rd, Register rn, Register rm, Register ra) {
4628     Smmlar(al, rd, rn, rm, ra);
4629   }
4630 
4631   void Smmls(
4632       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4633     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4634     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4635     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4636     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4637     VIXL_ASSERT(allow_macro_instructions_);
4638     VIXL_ASSERT(OutsideITBlock());
4639     MacroEmissionCheckScope guard(this);
4640 #ifndef PANDA_BUILD
4641     ITScope it_scope(this, &cond, guard);
4642 #else
4643     ITScope it_scope(allocator_, this, &cond, guard);
4644 #endif
4645     smmls(cond, rd, rn, rm, ra);
4646   }
4647   void Smmls(Register rd, Register rn, Register rm, Register ra) {
4648     Smmls(al, rd, rn, rm, ra);
4649   }
4650 
4651   void Smmlsr(
4652       Condition cond, Register rd, Register rn, Register rm, Register ra) {
4653     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4654     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4655     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4656     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4657     VIXL_ASSERT(allow_macro_instructions_);
4658     VIXL_ASSERT(OutsideITBlock());
4659     MacroEmissionCheckScope guard(this);
4660 #ifndef PANDA_BUILD
4661     ITScope it_scope(this, &cond, guard);
4662 #else
4663     ITScope it_scope(allocator_, this, &cond, guard);
4664 #endif
4665     smmlsr(cond, rd, rn, rm, ra);
4666   }
4667   void Smmlsr(Register rd, Register rn, Register rm, Register ra) {
4668     Smmlsr(al, rd, rn, rm, ra);
4669   }
4670 
4671   void Smmul(Condition cond, Register rd, Register rn, Register rm) {
4672     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4673     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4674     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4675     VIXL_ASSERT(allow_macro_instructions_);
4676     VIXL_ASSERT(OutsideITBlock());
4677     MacroEmissionCheckScope guard(this);
4678 #ifndef PANDA_BUILD
4679     ITScope it_scope(this, &cond, guard);
4680 #else
4681     ITScope it_scope(allocator_, this, &cond, guard);
4682 #endif
4683     smmul(cond, rd, rn, rm);
4684   }
4685   void Smmul(Register rd, Register rn, Register rm) { Smmul(al, rd, rn, rm); }
4686 
4687   void Smmulr(Condition cond, Register rd, Register rn, Register rm) {
4688     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4689     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4690     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4691     VIXL_ASSERT(allow_macro_instructions_);
4692     VIXL_ASSERT(OutsideITBlock());
4693     MacroEmissionCheckScope guard(this);
4694 #ifndef PANDA_BUILD
4695     ITScope it_scope(this, &cond, guard);
4696 #else
4697     ITScope it_scope(allocator_, this, &cond, guard);
4698 #endif
4699     smmulr(cond, rd, rn, rm);
4700   }
4701   void Smmulr(Register rd, Register rn, Register rm) { Smmulr(al, rd, rn, rm); }
4702 
4703   void Smuad(Condition cond, Register rd, Register rn, Register rm) {
4704     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4705     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4706     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4707     VIXL_ASSERT(allow_macro_instructions_);
4708     VIXL_ASSERT(OutsideITBlock());
4709     MacroEmissionCheckScope guard(this);
4710 #ifndef PANDA_BUILD
4711     ITScope it_scope(this, &cond, guard);
4712 #else
4713     ITScope it_scope(allocator_, this, &cond, guard);
4714 #endif
4715     smuad(cond, rd, rn, rm);
4716   }
4717   void Smuad(Register rd, Register rn, Register rm) { Smuad(al, rd, rn, rm); }
4718 
4719   void Smuadx(Condition cond, Register rd, Register rn, Register rm) {
4720     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4721     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4722     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4723     VIXL_ASSERT(allow_macro_instructions_);
4724     VIXL_ASSERT(OutsideITBlock());
4725     MacroEmissionCheckScope guard(this);
4726 #ifndef PANDA_BUILD
4727     ITScope it_scope(this, &cond, guard);
4728 #else
4729     ITScope it_scope(allocator_, this, &cond, guard);
4730 #endif
4731     smuadx(cond, rd, rn, rm);
4732   }
4733   void Smuadx(Register rd, Register rn, Register rm) { Smuadx(al, rd, rn, rm); }
4734 
4735   void Smulbb(Condition cond, Register rd, Register rn, Register rm) {
4736     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4737     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4738     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4739     VIXL_ASSERT(allow_macro_instructions_);
4740     VIXL_ASSERT(OutsideITBlock());
4741     MacroEmissionCheckScope guard(this);
4742 #ifndef PANDA_BUILD
4743     ITScope it_scope(this, &cond, guard);
4744 #else
4745     ITScope it_scope(allocator_, this, &cond, guard);
4746 #endif
4747     smulbb(cond, rd, rn, rm);
4748   }
4749   void Smulbb(Register rd, Register rn, Register rm) { Smulbb(al, rd, rn, rm); }
4750 
4751   void Smulbt(Condition cond, Register rd, Register rn, Register rm) {
4752     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4753     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4754     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4755     VIXL_ASSERT(allow_macro_instructions_);
4756     VIXL_ASSERT(OutsideITBlock());
4757     MacroEmissionCheckScope guard(this);
4758 #ifndef PANDA_BUILD
4759     ITScope it_scope(this, &cond, guard);
4760 #else
4761     ITScope it_scope(allocator_, this, &cond, guard);
4762 #endif
4763     smulbt(cond, rd, rn, rm);
4764   }
4765   void Smulbt(Register rd, Register rn, Register rm) { Smulbt(al, rd, rn, rm); }
4766 
4767   void Smull(
4768       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4769     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4770     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4771     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4772     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4773     VIXL_ASSERT(allow_macro_instructions_);
4774     VIXL_ASSERT(OutsideITBlock());
4775     MacroEmissionCheckScope guard(this);
4776 #ifndef PANDA_BUILD
4777     ITScope it_scope(this, &cond, guard);
4778 #else
4779     ITScope it_scope(allocator_, this, &cond, guard);
4780 #endif
4781     smull(cond, rdlo, rdhi, rn, rm);
4782   }
4783   void Smull(Register rdlo, Register rdhi, Register rn, Register rm) {
4784     Smull(al, rdlo, rdhi, rn, rm);
4785   }
4786   void Smull(FlagsUpdate flags,
4787              Condition cond,
4788              Register rdlo,
4789              Register rdhi,
4790              Register rn,
4791              Register rm) {
4792     switch (flags) {
4793       case LeaveFlags:
4794         Smull(cond, rdlo, rdhi, rn, rm);
4795         break;
4796       case SetFlags:
4797         Smulls(cond, rdlo, rdhi, rn, rm);
4798         break;
4799       case DontCare:
4800         Smull(cond, rdlo, rdhi, rn, rm);
4801         break;
4802     }
4803   }
4804   void Smull(FlagsUpdate flags,
4805              Register rdlo,
4806              Register rdhi,
4807              Register rn,
4808              Register rm) {
4809     Smull(flags, al, rdlo, rdhi, rn, rm);
4810   }
4811 
4812   void Smulls(
4813       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4814     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4815     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4816     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4817     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4818     VIXL_ASSERT(allow_macro_instructions_);
4819     VIXL_ASSERT(OutsideITBlock());
4820     MacroEmissionCheckScope guard(this);
4821 #ifndef PANDA_BUILD
4822     ITScope it_scope(this, &cond, guard);
4823 #else
4824     ITScope it_scope(allocator_, this, &cond, guard);
4825 #endif
4826     smulls(cond, rdlo, rdhi, rn, rm);
4827   }
4828   void Smulls(Register rdlo, Register rdhi, Register rn, Register rm) {
4829     Smulls(al, rdlo, rdhi, rn, rm);
4830   }
4831 
4832   void Smultb(Condition cond, Register rd, Register rn, Register rm) {
4833     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4834     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4835     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4836     VIXL_ASSERT(allow_macro_instructions_);
4837     VIXL_ASSERT(OutsideITBlock());
4838     MacroEmissionCheckScope guard(this);
4839 #ifndef PANDA_BUILD
4840     ITScope it_scope(this, &cond, guard);
4841 #else
4842     ITScope it_scope(allocator_, this, &cond, guard);
4843 #endif
4844     smultb(cond, rd, rn, rm);
4845   }
4846   void Smultb(Register rd, Register rn, Register rm) { Smultb(al, rd, rn, rm); }
4847 
4848   void Smultt(Condition cond, Register rd, Register rn, Register rm) {
4849     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4850     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4851     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4852     VIXL_ASSERT(allow_macro_instructions_);
4853     VIXL_ASSERT(OutsideITBlock());
4854     MacroEmissionCheckScope guard(this);
4855 #ifndef PANDA_BUILD
4856     ITScope it_scope(this, &cond, guard);
4857 #else
4858     ITScope it_scope(allocator_, this, &cond, guard);
4859 #endif
4860     smultt(cond, rd, rn, rm);
4861   }
4862   void Smultt(Register rd, Register rn, Register rm) { Smultt(al, rd, rn, rm); }
4863 
4864   void Smulwb(Condition cond, Register rd, Register rn, Register rm) {
4865     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4866     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4867     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4868     VIXL_ASSERT(allow_macro_instructions_);
4869     VIXL_ASSERT(OutsideITBlock());
4870     MacroEmissionCheckScope guard(this);
4871 #ifndef PANDA_BUILD
4872     ITScope it_scope(this, &cond, guard);
4873 #else
4874     ITScope it_scope(allocator_, this, &cond, guard);
4875 #endif
4876     smulwb(cond, rd, rn, rm);
4877   }
4878   void Smulwb(Register rd, Register rn, Register rm) { Smulwb(al, rd, rn, rm); }
4879 
4880   void Smulwt(Condition cond, Register rd, Register rn, Register rm) {
4881     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4882     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4883     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4884     VIXL_ASSERT(allow_macro_instructions_);
4885     VIXL_ASSERT(OutsideITBlock());
4886     MacroEmissionCheckScope guard(this);
4887 #ifndef PANDA_BUILD
4888     ITScope it_scope(this, &cond, guard);
4889 #else
4890     ITScope it_scope(allocator_, this, &cond, guard);
4891 #endif
4892     smulwt(cond, rd, rn, rm);
4893   }
4894   void Smulwt(Register rd, Register rn, Register rm) { Smulwt(al, rd, rn, rm); }
4895 
4896   void Smusd(Condition cond, Register rd, Register rn, Register rm) {
4897     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4898     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4899     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4900     VIXL_ASSERT(allow_macro_instructions_);
4901     VIXL_ASSERT(OutsideITBlock());
4902     MacroEmissionCheckScope guard(this);
4903 #ifndef PANDA_BUILD
4904     ITScope it_scope(this, &cond, guard);
4905 #else
4906     ITScope it_scope(allocator_, this, &cond, guard);
4907 #endif
4908     smusd(cond, rd, rn, rm);
4909   }
4910   void Smusd(Register rd, Register rn, Register rm) { Smusd(al, rd, rn, rm); }
4911 
4912   void Smusdx(Condition cond, Register rd, Register rn, Register rm) {
4913     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4914     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4915     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4916     VIXL_ASSERT(allow_macro_instructions_);
4917     VIXL_ASSERT(OutsideITBlock());
4918     MacroEmissionCheckScope guard(this);
4919 #ifndef PANDA_BUILD
4920     ITScope it_scope(this, &cond, guard);
4921 #else
4922     ITScope it_scope(allocator_, this, &cond, guard);
4923 #endif
4924     smusdx(cond, rd, rn, rm);
4925   }
4926   void Smusdx(Register rd, Register rn, Register rm) { Smusdx(al, rd, rn, rm); }
4927 
4928   void Ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
4929     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4930     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4931     VIXL_ASSERT(allow_macro_instructions_);
4932     VIXL_ASSERT(OutsideITBlock());
4933     MacroEmissionCheckScope guard(this);
4934 #ifndef PANDA_BUILD
4935     ITScope it_scope(this, &cond, guard);
4936 #else
4937     ITScope it_scope(allocator_, this, &cond, guard);
4938 #endif
4939     ssat(cond, rd, imm, operand);
4940   }
4941   void Ssat(Register rd, uint32_t imm, const Operand& operand) {
4942     Ssat(al, rd, imm, operand);
4943   }
4944 
4945   void Ssat16(Condition cond, Register rd, uint32_t imm, Register rn) {
4946     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4947     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4948     VIXL_ASSERT(allow_macro_instructions_);
4949     VIXL_ASSERT(OutsideITBlock());
4950     MacroEmissionCheckScope guard(this);
4951 #ifndef PANDA_BUILD
4952     ITScope it_scope(this, &cond, guard);
4953 #else
4954     ITScope it_scope(allocator_, this, &cond, guard);
4955 #endif
4956     ssat16(cond, rd, imm, rn);
4957   }
4958   void Ssat16(Register rd, uint32_t imm, Register rn) {
4959     Ssat16(al, rd, imm, rn);
4960   }
4961 
4962   void Ssax(Condition cond, Register rd, Register rn, Register rm) {
4963     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4964     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4965     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4966     VIXL_ASSERT(allow_macro_instructions_);
4967     VIXL_ASSERT(OutsideITBlock());
4968     MacroEmissionCheckScope guard(this);
4969 #ifndef PANDA_BUILD
4970     ITScope it_scope(this, &cond, guard);
4971 #else
4972     ITScope it_scope(allocator_, this, &cond, guard);
4973 #endif
4974     ssax(cond, rd, rn, rm);
4975   }
4976   void Ssax(Register rd, Register rn, Register rm) { Ssax(al, rd, rn, rm); }
4977 
4978   void Ssub16(Condition cond, Register rd, Register rn, Register rm) {
4979     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4980     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4981     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4982     VIXL_ASSERT(allow_macro_instructions_);
4983     VIXL_ASSERT(OutsideITBlock());
4984     MacroEmissionCheckScope guard(this);
4985 #ifndef PANDA_BUILD
4986     ITScope it_scope(this, &cond, guard);
4987 #else
4988     ITScope it_scope(allocator_, this, &cond, guard);
4989 #endif
4990     ssub16(cond, rd, rn, rm);
4991   }
4992   void Ssub16(Register rd, Register rn, Register rm) { Ssub16(al, rd, rn, rm); }
4993 
4994   void Ssub8(Condition cond, Register rd, Register rn, Register rm) {
4995     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4996     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4997     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4998     VIXL_ASSERT(allow_macro_instructions_);
4999     VIXL_ASSERT(OutsideITBlock());
5000     MacroEmissionCheckScope guard(this);
5001 #ifndef PANDA_BUILD
5002     ITScope it_scope(this, &cond, guard);
5003 #else
5004     ITScope it_scope(allocator_, this, &cond, guard);
5005 #endif
5006     ssub8(cond, rd, rn, rm);
5007   }
5008   void Ssub8(Register rd, Register rn, Register rm) { Ssub8(al, rd, rn, rm); }
5009 
5010   void Stl(Condition cond, Register rt, const MemOperand& operand) {
5011     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5012     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5013     VIXL_ASSERT(allow_macro_instructions_);
5014     VIXL_ASSERT(OutsideITBlock());
5015     MacroEmissionCheckScope guard(this);
5016 #ifndef PANDA_BUILD
5017     ITScope it_scope(this, &cond, guard);
5018 #else
5019     ITScope it_scope(allocator_, this, &cond, guard);
5020 #endif
5021     stl(cond, rt, operand);
5022   }
5023   void Stl(Register rt, const MemOperand& operand) { Stl(al, rt, operand); }
5024 
5025   void Stlb(Condition cond, Register rt, const MemOperand& operand) {
5026     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5027     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5028     VIXL_ASSERT(allow_macro_instructions_);
5029     VIXL_ASSERT(OutsideITBlock());
5030     MacroEmissionCheckScope guard(this);
5031 #ifndef PANDA_BUILD
5032     ITScope it_scope(this, &cond, guard);
5033 #else
5034     ITScope it_scope(allocator_, this, &cond, guard);
5035 #endif
5036     stlb(cond, rt, operand);
5037   }
5038   void Stlb(Register rt, const MemOperand& operand) { Stlb(al, rt, operand); }
5039 
5040   void Stlex(Condition cond,
5041              Register rd,
5042              Register rt,
5043              const MemOperand& operand) {
5044     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5045     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5046     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5047     VIXL_ASSERT(allow_macro_instructions_);
5048     VIXL_ASSERT(OutsideITBlock());
5049     MacroEmissionCheckScope guard(this);
5050 #ifndef PANDA_BUILD
5051     ITScope it_scope(this, &cond, guard);
5052 #else
5053     ITScope it_scope(allocator_, this, &cond, guard);
5054 #endif
5055     stlex(cond, rd, rt, operand);
5056   }
5057   void Stlex(Register rd, Register rt, const MemOperand& operand) {
5058     Stlex(al, rd, rt, operand);
5059   }
5060 
5061   void Stlexb(Condition cond,
5062               Register rd,
5063               Register rt,
5064               const MemOperand& operand) {
5065     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5066     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5067     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5068     VIXL_ASSERT(allow_macro_instructions_);
5069     VIXL_ASSERT(OutsideITBlock());
5070     MacroEmissionCheckScope guard(this);
5071 #ifndef PANDA_BUILD
5072     ITScope it_scope(this, &cond, guard);
5073 #else
5074     ITScope it_scope(allocator_, this, &cond, guard);
5075 #endif
5076     stlexb(cond, rd, rt, operand);
5077   }
5078   void Stlexb(Register rd, Register rt, const MemOperand& operand) {
5079     Stlexb(al, rd, rt, operand);
5080   }
5081 
5082   void Stlexd(Condition cond,
5083               Register rd,
5084               Register rt,
5085               Register rt2,
5086               const MemOperand& operand) {
5087     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5088     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5089     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
5090     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5091     VIXL_ASSERT(allow_macro_instructions_);
5092     VIXL_ASSERT(OutsideITBlock());
5093     MacroEmissionCheckScope guard(this);
5094 #ifndef PANDA_BUILD
5095     ITScope it_scope(this, &cond, guard);
5096 #else
5097     ITScope it_scope(allocator_, this, &cond, guard);
5098 #endif
5099     stlexd(cond, rd, rt, rt2, operand);
5100   }
5101   void Stlexd(Register rd,
5102               Register rt,
5103               Register rt2,
5104               const MemOperand& operand) {
5105     Stlexd(al, rd, rt, rt2, operand);
5106   }
5107 
5108   void Stlexh(Condition cond,
5109               Register rd,
5110               Register rt,
5111               const MemOperand& operand) {
5112     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5113     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5114     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5115     VIXL_ASSERT(allow_macro_instructions_);
5116     VIXL_ASSERT(OutsideITBlock());
5117     MacroEmissionCheckScope guard(this);
5118 #ifndef PANDA_BUILD
5119     ITScope it_scope(this, &cond, guard);
5120 #else
5121     ITScope it_scope(allocator_, this, &cond, guard);
5122 #endif
5123     stlexh(cond, rd, rt, operand);
5124   }
5125   void Stlexh(Register rd, Register rt, const MemOperand& operand) {
5126     Stlexh(al, rd, rt, operand);
5127   }
5128 
5129   void Stlh(Condition cond, Register rt, const MemOperand& operand) {
5130     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5131     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5132     VIXL_ASSERT(allow_macro_instructions_);
5133     VIXL_ASSERT(OutsideITBlock());
5134     MacroEmissionCheckScope guard(this);
5135 #ifndef PANDA_BUILD
5136     ITScope it_scope(this, &cond, guard);
5137 #else
5138     ITScope it_scope(allocator_, this, &cond, guard);
5139 #endif
5140     stlh(cond, rt, operand);
5141   }
5142   void Stlh(Register rt, const MemOperand& operand) { Stlh(al, rt, operand); }
5143 
5144   void Stm(Condition cond,
5145            Register rn,
5146            WriteBack write_back,
5147            RegisterList registers) {
5148     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5149     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
5150     VIXL_ASSERT(allow_macro_instructions_);
5151     VIXL_ASSERT(OutsideITBlock());
5152     MacroEmissionCheckScope guard(this);
5153 #ifndef PANDA_BUILD
5154     ITScope it_scope(this, &cond, guard);
5155 #else
5156     ITScope it_scope(allocator_, this, &cond, guard);
5157 #endif
5158     stm(cond, rn, write_back, registers);
5159   }
5160   void Stm(Register rn, WriteBack write_back, RegisterList registers) {
5161     Stm(al, rn, write_back, registers);
5162   }
5163 
5164   void Stmda(Condition cond,
5165              Register rn,
5166              WriteBack write_back,
5167              RegisterList registers) {
5168     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5169     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
5170     VIXL_ASSERT(allow_macro_instructions_);
5171     VIXL_ASSERT(OutsideITBlock());
5172     MacroEmissionCheckScope guard(this);
5173 #ifndef PANDA_BUILD
5174     ITScope it_scope(this, &cond, guard);
5175 #else
5176     ITScope it_scope(allocator_, this, &cond, guard);
5177 #endif
5178     stmda(cond, rn, write_back, registers);
5179   }
5180   void Stmda(Register rn, WriteBack write_back, RegisterList registers) {
5181     Stmda(al, rn, write_back, registers);
5182   }
5183 
5184   void Stmdb(Condition cond,
5185              Register rn,
5186              WriteBack write_back,
5187              RegisterList registers) {
5188     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5189     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
5190     VIXL_ASSERT(allow_macro_instructions_);
5191     VIXL_ASSERT(OutsideITBlock());
5192     MacroEmissionCheckScope guard(this);
5193 #ifndef PANDA_BUILD
5194     ITScope it_scope(this, &cond, guard);
5195 #else
5196     ITScope it_scope(allocator_, this, &cond, guard);
5197 #endif
5198     stmdb(cond, rn, write_back, registers);
5199   }
5200   void Stmdb(Register rn, WriteBack write_back, RegisterList registers) {
5201     Stmdb(al, rn, write_back, registers);
5202   }
5203 
5204   void Stmea(Condition cond,
5205              Register rn,
5206              WriteBack write_back,
5207              RegisterList registers) {
5208     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5209     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
5210     VIXL_ASSERT(allow_macro_instructions_);
5211     VIXL_ASSERT(OutsideITBlock());
5212     MacroEmissionCheckScope guard(this);
5213 #ifndef PANDA_BUILD
5214     ITScope it_scope(this, &cond, guard);
5215 #else
5216     ITScope it_scope(allocator_, this, &cond, guard);
5217 #endif
5218     stmea(cond, rn, write_back, registers);
5219   }
5220   void Stmea(Register rn, WriteBack write_back, RegisterList registers) {
5221     Stmea(al, rn, write_back, registers);
5222   }
5223 
5224   void Stmed(Condition cond,
5225              Register rn,
5226              WriteBack write_back,
5227              RegisterList registers) {
5228     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5229     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
5230     VIXL_ASSERT(allow_macro_instructions_);
5231     VIXL_ASSERT(OutsideITBlock());
5232     MacroEmissionCheckScope guard(this);
5233 #ifndef PANDA_BUILD
5234     ITScope it_scope(this, &cond, guard);
5235 #else
5236     ITScope it_scope(allocator_, this, &cond, guard);
5237 #endif
5238     stmed(cond, rn, write_back, registers);
5239   }
5240   void Stmed(Register rn, WriteBack write_back, RegisterList registers) {
5241     Stmed(al, rn, write_back, registers);
5242   }
5243 
5244   void Stmfa(Condition cond,
5245              Register rn,
5246              WriteBack write_back,
5247              RegisterList registers) {
5248     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5249     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
5250     VIXL_ASSERT(allow_macro_instructions_);
5251     VIXL_ASSERT(OutsideITBlock());
5252     MacroEmissionCheckScope guard(this);
5253 #ifndef PANDA_BUILD
5254     ITScope it_scope(this, &cond, guard);
5255 #else
5256     ITScope it_scope(allocator_, this, &cond, guard);
5257 #endif
5258     stmfa(cond, rn, write_back, registers);
5259   }
5260   void Stmfa(Register rn, WriteBack write_back, RegisterList registers) {
5261     Stmfa(al, rn, write_back, registers);
5262   }
5263 
5264   void Stmfd(Condition cond,
5265              Register rn,
5266              WriteBack write_back,
5267              RegisterList registers) {
5268     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5269     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
5270     VIXL_ASSERT(allow_macro_instructions_);
5271     VIXL_ASSERT(OutsideITBlock());
5272     MacroEmissionCheckScope guard(this);
5273 #ifndef PANDA_BUILD
5274     ITScope it_scope(this, &cond, guard);
5275 #else
5276     ITScope it_scope(allocator_, this, &cond, guard);
5277 #endif
5278     stmfd(cond, rn, write_back, registers);
5279   }
5280   void Stmfd(Register rn, WriteBack write_back, RegisterList registers) {
5281     Stmfd(al, rn, write_back, registers);
5282   }
5283 
5284   void Stmib(Condition cond,
5285              Register rn,
5286              WriteBack write_back,
5287              RegisterList registers) {
5288     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5289     VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
5290     VIXL_ASSERT(allow_macro_instructions_);
5291     VIXL_ASSERT(OutsideITBlock());
5292     MacroEmissionCheckScope guard(this);
5293 #ifndef PANDA_BUILD
5294     ITScope it_scope(this, &cond, guard);
5295 #else
5296     ITScope it_scope(allocator_, this, &cond, guard);
5297 #endif
5298     stmib(cond, rn, write_back, registers);
5299   }
5300   void Stmib(Register rn, WriteBack write_back, RegisterList registers) {
5301     Stmib(al, rn, write_back, registers);
5302   }
5303 
5304   void Str(Condition cond, Register rt, const MemOperand& operand) {
5305     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5306     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5307     VIXL_ASSERT(allow_macro_instructions_);
5308     VIXL_ASSERT(OutsideITBlock());
5309     MacroEmissionCheckScope guard(this);
5310     bool can_use_it =
5311         // STR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
5312         (operand.IsImmediate() && rt.IsLow() &&
5313          operand.GetBaseRegister().IsLow() &&
5314          operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
5315          (operand.GetAddrMode() == Offset)) ||
5316         // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
5317         (operand.IsImmediate() && rt.IsLow() &&
5318          operand.GetBaseRegister().IsSP() &&
5319          operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
5320          (operand.GetAddrMode() == Offset)) ||
5321         // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
5322         (operand.IsPlainRegister() && rt.IsLow() &&
5323          operand.GetBaseRegister().IsLow() &&
5324          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
5325          (operand.GetAddrMode() == Offset));
5326 #ifndef PANDA_BUILD
5327     ITScope it_scope(this, &cond, guard, can_use_it);
5328 #else
5329     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
5330 #endif
5331     str(cond, rt, operand);
5332   }
5333   void Str(Register rt, const MemOperand& operand) { Str(al, rt, operand); }
5334 
5335   void Strb(Condition cond, Register rt, const MemOperand& operand) {
5336     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5337     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5338     VIXL_ASSERT(allow_macro_instructions_);
5339     VIXL_ASSERT(OutsideITBlock());
5340     MacroEmissionCheckScope guard(this);
5341     bool can_use_it =
5342         // STRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
5343         (operand.IsImmediate() && rt.IsLow() &&
5344          operand.GetBaseRegister().IsLow() &&
5345          operand.IsOffsetImmediateWithinRange(0, 31) &&
5346          (operand.GetAddrMode() == Offset)) ||
5347         // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
5348         (operand.IsPlainRegister() && rt.IsLow() &&
5349          operand.GetBaseRegister().IsLow() &&
5350          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
5351          (operand.GetAddrMode() == Offset));
5352 #ifndef PANDA_BUILD
5353     ITScope it_scope(this, &cond, guard, can_use_it);
5354 #else
5355     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
5356 #endif
5357     strb(cond, rt, operand);
5358   }
5359   void Strb(Register rt, const MemOperand& operand) { Strb(al, rt, operand); }
5360 
5361   void Strd(Condition cond,
5362             Register rt,
5363             Register rt2,
5364             const MemOperand& operand) {
5365     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5366     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
5367     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5368     VIXL_ASSERT(allow_macro_instructions_);
5369     VIXL_ASSERT(OutsideITBlock());
5370     MacroEmissionCheckScope guard(this);
5371 #ifndef PANDA_BUILD
5372     ITScope it_scope(this, &cond, guard);
5373 #else
5374     ITScope it_scope(allocator_, this, &cond, guard);
5375 #endif
5376     strd(cond, rt, rt2, operand);
5377   }
5378   void Strd(Register rt, Register rt2, const MemOperand& operand) {
5379     Strd(al, rt, rt2, operand);
5380   }
5381 
5382   void Strex(Condition cond,
5383              Register rd,
5384              Register rt,
5385              const MemOperand& operand) {
5386     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5387     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5388     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5389     VIXL_ASSERT(allow_macro_instructions_);
5390     VIXL_ASSERT(OutsideITBlock());
5391     MacroEmissionCheckScope guard(this);
5392 #ifndef PANDA_BUILD
5393     ITScope it_scope(this, &cond, guard);
5394 #else
5395     ITScope it_scope(allocator_, this, &cond, guard);
5396 #endif
5397     strex(cond, rd, rt, operand);
5398   }
5399   void Strex(Register rd, Register rt, const MemOperand& operand) {
5400     Strex(al, rd, rt, operand);
5401   }
5402 
5403   void Strexb(Condition cond,
5404               Register rd,
5405               Register rt,
5406               const MemOperand& operand) {
5407     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5408     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5409     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5410     VIXL_ASSERT(allow_macro_instructions_);
5411     VIXL_ASSERT(OutsideITBlock());
5412     MacroEmissionCheckScope guard(this);
5413 #ifndef PANDA_BUILD
5414     ITScope it_scope(this, &cond, guard);
5415 #else
5416     ITScope it_scope(allocator_, this, &cond, guard);
5417 #endif
5418     strexb(cond, rd, rt, operand);
5419   }
5420   void Strexb(Register rd, Register rt, const MemOperand& operand) {
5421     Strexb(al, rd, rt, operand);
5422   }
5423 
5424   void Strexd(Condition cond,
5425               Register rd,
5426               Register rt,
5427               Register rt2,
5428               const MemOperand& operand) {
5429     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5430     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5431     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
5432     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5433     VIXL_ASSERT(allow_macro_instructions_);
5434     VIXL_ASSERT(OutsideITBlock());
5435     MacroEmissionCheckScope guard(this);
5436 #ifndef PANDA_BUILD
5437     ITScope it_scope(this, &cond, guard);
5438 #else
5439     ITScope it_scope(allocator_, this, &cond, guard);
5440 #endif
5441     strexd(cond, rd, rt, rt2, operand);
5442   }
5443   void Strexd(Register rd,
5444               Register rt,
5445               Register rt2,
5446               const MemOperand& operand) {
5447     Strexd(al, rd, rt, rt2, operand);
5448   }
5449 
5450   void Strexh(Condition cond,
5451               Register rd,
5452               Register rt,
5453               const MemOperand& operand) {
5454     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5455     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5456     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5457     VIXL_ASSERT(allow_macro_instructions_);
5458     VIXL_ASSERT(OutsideITBlock());
5459     MacroEmissionCheckScope guard(this);
5460 #ifndef PANDA_BUILD
5461     ITScope it_scope(this, &cond, guard);
5462 #else
5463     ITScope it_scope(allocator_, this, &cond, guard);
5464 #endif
5465     strexh(cond, rd, rt, operand);
5466   }
5467   void Strexh(Register rd, Register rt, const MemOperand& operand) {
5468     Strexh(al, rd, rt, operand);
5469   }
5470 
5471   void Strh(Condition cond, Register rt, const MemOperand& operand) {
5472     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
5473     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5474     VIXL_ASSERT(allow_macro_instructions_);
5475     VIXL_ASSERT(OutsideITBlock());
5476     MacroEmissionCheckScope guard(this);
5477     bool can_use_it =
5478         // STRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
5479         (operand.IsImmediate() && rt.IsLow() &&
5480          operand.GetBaseRegister().IsLow() &&
5481          operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
5482          (operand.GetAddrMode() == Offset)) ||
5483         // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
5484         (operand.IsPlainRegister() && rt.IsLow() &&
5485          operand.GetBaseRegister().IsLow() &&
5486          operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
5487          (operand.GetAddrMode() == Offset));
5488 #ifndef PANDA_BUILD
5489     ITScope it_scope(this, &cond, guard, can_use_it);
5490 #else
5491     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
5492 #endif
5493     strh(cond, rt, operand);
5494   }
5495   void Strh(Register rt, const MemOperand& operand) { Strh(al, rt, operand); }
5496 
5497   void Sub(Condition cond, Register rd, Register rn, const Operand& operand) {
5498     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5499     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5500     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5501     VIXL_ASSERT(allow_macro_instructions_);
5502     VIXL_ASSERT(OutsideITBlock());
5503     MacroEmissionCheckScope guard(this);
5504     if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
5505       uint32_t immediate = operand.GetImmediate();
5506       if (immediate == 0) {
5507         return;
5508       }
5509     }
5510     bool can_use_it =
5511         // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
5512         (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
5513          rd.IsLow()) ||
5514         // SUB<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
5515         (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
5516          rd.IsLow() && rn.Is(rd)) ||
5517         // SUB<c>{<q>} <Rd>, <Rn>, <Rm>
5518         (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
5519          operand.GetBaseRegister().IsLow());
5520 #ifndef PANDA_BUILD
5521     ITScope it_scope(this, &cond, guard, can_use_it);
5522 #else
5523     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
5524 #endif
5525     sub(cond, rd, rn, operand);
5526   }
5527   void Sub(Register rd, Register rn, const Operand& operand) {
5528     Sub(al, rd, rn, operand);
5529   }
5530   void Sub(FlagsUpdate flags,
5531            Condition cond,
5532            Register rd,
5533            Register rn,
5534            const Operand& operand) {
5535     switch (flags) {
5536       case LeaveFlags:
5537         Sub(cond, rd, rn, operand);
5538         break;
5539       case SetFlags:
5540         Subs(cond, rd, rn, operand);
5541         break;
5542       case DontCare:
5543         bool setflags_is_smaller =
5544             IsUsingT32() && cond.Is(al) &&
5545             ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
5546               operand.GetBaseRegister().IsLow()) ||
5547              (operand.IsImmediate() &&
5548               ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
5549                (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
5550         if (setflags_is_smaller) {
5551           Subs(cond, rd, rn, operand);
5552         } else {
5553           bool changed_op_is_smaller =
5554               operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
5555               ((rd.IsLow() && rn.IsLow() &&
5556                 (operand.GetSignedImmediate() >= -7)) ||
5557                (rd.IsLow() && rn.Is(rd) &&
5558                 (operand.GetSignedImmediate() >= -255)));
5559           if (changed_op_is_smaller) {
5560             Adds(cond, rd, rn, -operand.GetSignedImmediate());
5561           } else {
5562             Sub(cond, rd, rn, operand);
5563           }
5564         }
5565         break;
5566     }
5567   }
5568   void Sub(FlagsUpdate flags,
5569            Register rd,
5570            Register rn,
5571            const Operand& operand) {
5572     Sub(flags, al, rd, rn, operand);
5573   }
5574 
5575   void Subs(Condition cond, Register rd, Register rn, const Operand& operand) {
5576     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5577     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5578     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5579     VIXL_ASSERT(allow_macro_instructions_);
5580     VIXL_ASSERT(OutsideITBlock());
5581     MacroEmissionCheckScope guard(this);
5582 #ifndef PANDA_BUILD
5583     ITScope it_scope(this, &cond, guard);
5584 #else
5585     ITScope it_scope(allocator_, this, &cond, guard);
5586 #endif
5587     subs(cond, rd, rn, operand);
5588   }
5589   void Subs(Register rd, Register rn, const Operand& operand) {
5590     Subs(al, rd, rn, operand);
5591   }
5592 
5593   void Svc(Condition cond, uint32_t imm) {
5594     VIXL_ASSERT(allow_macro_instructions_);
5595     VIXL_ASSERT(OutsideITBlock());
5596     MacroEmissionCheckScope guard(this);
5597 #ifndef PANDA_BUILD
5598     ITScope it_scope(this, &cond, guard);
5599 #else
5600     ITScope it_scope(allocator_, this, &cond, guard);
5601 #endif
5602     svc(cond, imm);
5603   }
5604   void Svc(uint32_t imm) { Svc(al, imm); }
5605 
5606   void Sxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
5607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5609     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5610     VIXL_ASSERT(allow_macro_instructions_);
5611     VIXL_ASSERT(OutsideITBlock());
5612     MacroEmissionCheckScope guard(this);
5613 #ifndef PANDA_BUILD
5614     ITScope it_scope(this, &cond, guard);
5615 #else
5616     ITScope it_scope(allocator_, this, &cond, guard);
5617 #endif
5618     sxtab(cond, rd, rn, operand);
5619   }
5620   void Sxtab(Register rd, Register rn, const Operand& operand) {
5621     Sxtab(al, rd, rn, operand);
5622   }
5623 
5624   void Sxtab16(Condition cond,
5625                Register rd,
5626                Register rn,
5627                const Operand& operand) {
5628     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5629     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5630     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5631     VIXL_ASSERT(allow_macro_instructions_);
5632     VIXL_ASSERT(OutsideITBlock());
5633     MacroEmissionCheckScope guard(this);
5634 #ifndef PANDA_BUILD
5635     ITScope it_scope(this, &cond, guard);
5636 #else
5637     ITScope it_scope(allocator_, this, &cond, guard);
5638 #endif
5639     sxtab16(cond, rd, rn, operand);
5640   }
5641   void Sxtab16(Register rd, Register rn, const Operand& operand) {
5642     Sxtab16(al, rd, rn, operand);
5643   }
5644 
5645   void Sxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
5646     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5647     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5648     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5649     VIXL_ASSERT(allow_macro_instructions_);
5650     VIXL_ASSERT(OutsideITBlock());
5651     MacroEmissionCheckScope guard(this);
5652 #ifndef PANDA_BUILD
5653     ITScope it_scope(this, &cond, guard);
5654 #else
5655     ITScope it_scope(allocator_, this, &cond, guard);
5656 #endif
5657     sxtah(cond, rd, rn, operand);
5658   }
5659   void Sxtah(Register rd, Register rn, const Operand& operand) {
5660     Sxtah(al, rd, rn, operand);
5661   }
5662 
5663   void Sxtb(Condition cond, Register rd, const Operand& operand) {
5664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5665     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5666     VIXL_ASSERT(allow_macro_instructions_);
5667     VIXL_ASSERT(OutsideITBlock());
5668     MacroEmissionCheckScope guard(this);
5669 #ifndef PANDA_BUILD
5670     ITScope it_scope(this, &cond, guard);
5671 #else
5672     ITScope it_scope(allocator_, this, &cond, guard);
5673 #endif
5674     sxtb(cond, rd, operand);
5675   }
5676   void Sxtb(Register rd, const Operand& operand) { Sxtb(al, rd, operand); }
5677 
5678   void Sxtb16(Condition cond, Register rd, const Operand& operand) {
5679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5680     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5681     VIXL_ASSERT(allow_macro_instructions_);
5682     VIXL_ASSERT(OutsideITBlock());
5683     MacroEmissionCheckScope guard(this);
5684 #ifndef PANDA_BUILD
5685     ITScope it_scope(this, &cond, guard);
5686 #else
5687     ITScope it_scope(allocator_, this, &cond, guard);
5688 #endif
5689     sxtb16(cond, rd, operand);
5690   }
5691   void Sxtb16(Register rd, const Operand& operand) { Sxtb16(al, rd, operand); }
5692 
5693   void Sxth(Condition cond, Register rd, const Operand& operand) {
5694     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5695     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5696     VIXL_ASSERT(allow_macro_instructions_);
5697     VIXL_ASSERT(OutsideITBlock());
5698     MacroEmissionCheckScope guard(this);
5699 #ifndef PANDA_BUILD
5700     ITScope it_scope(this, &cond, guard);
5701 #else
5702     ITScope it_scope(allocator_, this, &cond, guard);
5703 #endif
5704     sxth(cond, rd, operand);
5705   }
5706   void Sxth(Register rd, const Operand& operand) { Sxth(al, rd, operand); }
5707 
5708   void Teq(Condition cond, Register rn, const Operand& operand) {
5709     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5710     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5711     VIXL_ASSERT(allow_macro_instructions_);
5712     VIXL_ASSERT(OutsideITBlock());
5713     MacroEmissionCheckScope guard(this);
5714 #ifndef PANDA_BUILD
5715     ITScope it_scope(this, &cond, guard);
5716 #else
5717     ITScope it_scope(allocator_, this, &cond, guard);
5718 #endif
5719     teq(cond, rn, operand);
5720   }
5721   void Teq(Register rn, const Operand& operand) { Teq(al, rn, operand); }
5722 
5723   void Tst(Condition cond, Register rn, const Operand& operand) {
5724     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5725     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5726     VIXL_ASSERT(allow_macro_instructions_);
5727     VIXL_ASSERT(OutsideITBlock());
5728     MacroEmissionCheckScope guard(this);
5729     bool can_use_it =
5730         // TST{<c>}{<q>} <Rn>, <Rm> ; T1
5731         operand.IsPlainRegister() && rn.IsLow() &&
5732         operand.GetBaseRegister().IsLow();
5733 #ifndef PANDA_BUILD
5734     ITScope it_scope(this, &cond, guard, can_use_it);
5735 #else
5736     ITScope it_scope(allocator_, this, &cond, guard, can_use_it);
5737 #endif
5738     tst(cond, rn, operand);
5739   }
5740   void Tst(Register rn, const Operand& operand) { Tst(al, rn, operand); }
5741 
5742   void Uadd16(Condition cond, Register rd, Register rn, Register rm) {
5743     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5744     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5745     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5746     VIXL_ASSERT(allow_macro_instructions_);
5747     VIXL_ASSERT(OutsideITBlock());
5748     MacroEmissionCheckScope guard(this);
5749 #ifndef PANDA_BUILD
5750     ITScope it_scope(this, &cond, guard);
5751 #else
5752     ITScope it_scope(allocator_, this, &cond, guard);
5753 #endif
5754     uadd16(cond, rd, rn, rm);
5755   }
5756   void Uadd16(Register rd, Register rn, Register rm) { Uadd16(al, rd, rn, rm); }
5757 
5758   void Uadd8(Condition cond, Register rd, Register rn, Register rm) {
5759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5760     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5761     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5762     VIXL_ASSERT(allow_macro_instructions_);
5763     VIXL_ASSERT(OutsideITBlock());
5764     MacroEmissionCheckScope guard(this);
5765 #ifndef PANDA_BUILD
5766     ITScope it_scope(this, &cond, guard);
5767 #else
5768     ITScope it_scope(allocator_, this, &cond, guard);
5769 #endif
5770     uadd8(cond, rd, rn, rm);
5771   }
5772   void Uadd8(Register rd, Register rn, Register rm) { Uadd8(al, rd, rn, rm); }
5773 
5774   void Uasx(Condition cond, Register rd, Register rn, Register rm) {
5775     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5776     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5777     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5778     VIXL_ASSERT(allow_macro_instructions_);
5779     VIXL_ASSERT(OutsideITBlock());
5780     MacroEmissionCheckScope guard(this);
5781 #ifndef PANDA_BUILD
5782     ITScope it_scope(this, &cond, guard);
5783 #else
5784     ITScope it_scope(allocator_, this, &cond, guard);
5785 #endif
5786     uasx(cond, rd, rn, rm);
5787   }
5788   void Uasx(Register rd, Register rn, Register rm) { Uasx(al, rd, rn, rm); }
5789 
5790   void Ubfx(
5791       Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) {
5792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5793     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5794     VIXL_ASSERT(allow_macro_instructions_);
5795     VIXL_ASSERT(OutsideITBlock());
5796     MacroEmissionCheckScope guard(this);
5797 #ifndef PANDA_BUILD
5798     ITScope it_scope(this, &cond, guard);
5799 #else
5800     ITScope it_scope(allocator_, this, &cond, guard);
5801 #endif
5802     ubfx(cond, rd, rn, lsb, width);
5803   }
5804   void Ubfx(Register rd, Register rn, uint32_t lsb, uint32_t width) {
5805     Ubfx(al, rd, rn, lsb, width);
5806   }
5807 
5808   void Udf(Condition cond, uint32_t imm) {
5809     VIXL_ASSERT(allow_macro_instructions_);
5810     VIXL_ASSERT(OutsideITBlock());
5811     MacroEmissionCheckScope guard(this);
5812 #ifndef PANDA_BUILD
5813     ITScope it_scope(this, &cond, guard);
5814 #else
5815     ITScope it_scope(allocator_, this, &cond, guard);
5816 #endif
5817     udf(cond, imm);
5818   }
5819   void Udf(uint32_t imm) { Udf(al, imm); }
5820 
5821   void Udiv(Condition cond, Register rd, Register rn, Register rm) {
5822     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5823     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5824     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5825     VIXL_ASSERT(allow_macro_instructions_);
5826     VIXL_ASSERT(OutsideITBlock());
5827     MacroEmissionCheckScope guard(this);
5828 #ifndef PANDA_BUILD
5829     ITScope it_scope(this, &cond, guard);
5830 #else
5831     ITScope it_scope(allocator_, this, &cond, guard);
5832 #endif
5833     udiv(cond, rd, rn, rm);
5834   }
5835   void Udiv(Register rd, Register rn, Register rm) { Udiv(al, rd, rn, rm); }
5836 
5837   void Uhadd16(Condition cond, Register rd, Register rn, Register rm) {
5838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5839     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5840     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5841     VIXL_ASSERT(allow_macro_instructions_);
5842     VIXL_ASSERT(OutsideITBlock());
5843     MacroEmissionCheckScope guard(this);
5844 #ifndef PANDA_BUILD
5845     ITScope it_scope(this, &cond, guard);
5846 #else
5847     ITScope it_scope(allocator_, this, &cond, guard);
5848 #endif
5849     uhadd16(cond, rd, rn, rm);
5850   }
5851   void Uhadd16(Register rd, Register rn, Register rm) {
5852     Uhadd16(al, rd, rn, rm);
5853   }
5854 
5855   void Uhadd8(Condition cond, Register rd, Register rn, Register rm) {
5856     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5857     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5858     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5859     VIXL_ASSERT(allow_macro_instructions_);
5860     VIXL_ASSERT(OutsideITBlock());
5861     MacroEmissionCheckScope guard(this);
5862 #ifndef PANDA_BUILD
5863     ITScope it_scope(this, &cond, guard);
5864 #else
5865     ITScope it_scope(allocator_, this, &cond, guard);
5866 #endif
5867     uhadd8(cond, rd, rn, rm);
5868   }
5869   void Uhadd8(Register rd, Register rn, Register rm) { Uhadd8(al, rd, rn, rm); }
5870 
5871   void Uhasx(Condition cond, Register rd, Register rn, Register rm) {
5872     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5873     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5874     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5875     VIXL_ASSERT(allow_macro_instructions_);
5876     VIXL_ASSERT(OutsideITBlock());
5877     MacroEmissionCheckScope guard(this);
5878 #ifndef PANDA_BUILD
5879     ITScope it_scope(this, &cond, guard);
5880 #else
5881     ITScope it_scope(allocator_, this, &cond, guard);
5882 #endif
5883     uhasx(cond, rd, rn, rm);
5884   }
5885   void Uhasx(Register rd, Register rn, Register rm) { Uhasx(al, rd, rn, rm); }
5886 
5887   void Uhsax(Condition cond, Register rd, Register rn, Register rm) {
5888     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5889     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5890     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5891     VIXL_ASSERT(allow_macro_instructions_);
5892     VIXL_ASSERT(OutsideITBlock());
5893     MacroEmissionCheckScope guard(this);
5894 #ifndef PANDA_BUILD
5895     ITScope it_scope(this, &cond, guard);
5896 #else
5897     ITScope it_scope(allocator_, this, &cond, guard);
5898 #endif
5899     uhsax(cond, rd, rn, rm);
5900   }
5901   void Uhsax(Register rd, Register rn, Register rm) { Uhsax(al, rd, rn, rm); }
5902 
5903   void Uhsub16(Condition cond, Register rd, Register rn, Register rm) {
5904     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5905     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5906     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5907     VIXL_ASSERT(allow_macro_instructions_);
5908     VIXL_ASSERT(OutsideITBlock());
5909     MacroEmissionCheckScope guard(this);
5910 #ifndef PANDA_BUILD
5911     ITScope it_scope(this, &cond, guard);
5912 #else
5913     ITScope it_scope(allocator_, this, &cond, guard);
5914 #endif
5915     uhsub16(cond, rd, rn, rm);
5916   }
5917   void Uhsub16(Register rd, Register rn, Register rm) {
5918     Uhsub16(al, rd, rn, rm);
5919   }
5920 
5921   void Uhsub8(Condition cond, Register rd, Register rn, Register rm) {
5922     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5923     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5924     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5925     VIXL_ASSERT(allow_macro_instructions_);
5926     VIXL_ASSERT(OutsideITBlock());
5927     MacroEmissionCheckScope guard(this);
5928 #ifndef PANDA_BUILD
5929     ITScope it_scope(this, &cond, guard);
5930 #else
5931     ITScope it_scope(allocator_, this, &cond, guard);
5932 #endif
5933     uhsub8(cond, rd, rn, rm);
5934   }
5935   void Uhsub8(Register rd, Register rn, Register rm) { Uhsub8(al, rd, rn, rm); }
5936 
5937   void Umaal(
5938       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5939     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5940     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5941     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5942     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5943     VIXL_ASSERT(allow_macro_instructions_);
5944     VIXL_ASSERT(OutsideITBlock());
5945     MacroEmissionCheckScope guard(this);
5946 #ifndef PANDA_BUILD
5947     ITScope it_scope(this, &cond, guard);
5948 #else
5949     ITScope it_scope(allocator_, this, &cond, guard);
5950 #endif
5951     umaal(cond, rdlo, rdhi, rn, rm);
5952   }
5953   void Umaal(Register rdlo, Register rdhi, Register rn, Register rm) {
5954     Umaal(al, rdlo, rdhi, rn, rm);
5955   }
5956 
5957   void Umlal(
5958       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5959     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5960     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5961     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5962     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5963     VIXL_ASSERT(allow_macro_instructions_);
5964     VIXL_ASSERT(OutsideITBlock());
5965     MacroEmissionCheckScope guard(this);
5966 #ifndef PANDA_BUILD
5967     ITScope it_scope(this, &cond, guard);
5968 #else
5969     ITScope it_scope(allocator_, this, &cond, guard);
5970 #endif
5971     umlal(cond, rdlo, rdhi, rn, rm);
5972   }
5973   void Umlal(Register rdlo, Register rdhi, Register rn, Register rm) {
5974     Umlal(al, rdlo, rdhi, rn, rm);
5975   }
5976   void Umlal(FlagsUpdate flags,
5977              Condition cond,
5978              Register rdlo,
5979              Register rdhi,
5980              Register rn,
5981              Register rm) {
5982     switch (flags) {
5983       case LeaveFlags:
5984         Umlal(cond, rdlo, rdhi, rn, rm);
5985         break;
5986       case SetFlags:
5987         Umlals(cond, rdlo, rdhi, rn, rm);
5988         break;
5989       case DontCare:
5990         Umlal(cond, rdlo, rdhi, rn, rm);
5991         break;
5992     }
5993   }
5994   void Umlal(FlagsUpdate flags,
5995              Register rdlo,
5996              Register rdhi,
5997              Register rn,
5998              Register rm) {
5999     Umlal(flags, al, rdlo, rdhi, rn, rm);
6000   }
6001 
6002   void Umlals(
6003       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
6004     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
6005     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
6006     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6007     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6008     VIXL_ASSERT(allow_macro_instructions_);
6009     VIXL_ASSERT(OutsideITBlock());
6010     MacroEmissionCheckScope guard(this);
6011 #ifndef PANDA_BUILD
6012     ITScope it_scope(this, &cond, guard);
6013 #else
6014     ITScope it_scope(allocator_, this, &cond, guard);
6015 #endif
6016     umlals(cond, rdlo, rdhi, rn, rm);
6017   }
6018   void Umlals(Register rdlo, Register rdhi, Register rn, Register rm) {
6019     Umlals(al, rdlo, rdhi, rn, rm);
6020   }
6021 
6022   void Umull(
6023       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
6024     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
6025     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
6026     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6027     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6028     VIXL_ASSERT(allow_macro_instructions_);
6029     VIXL_ASSERT(OutsideITBlock());
6030     MacroEmissionCheckScope guard(this);
6031 #ifndef PANDA_BUILD
6032     ITScope it_scope(this, &cond, guard);
6033 #else
6034     ITScope it_scope(allocator_, this, &cond, guard);
6035 #endif
6036     umull(cond, rdlo, rdhi, rn, rm);
6037   }
6038   void Umull(Register rdlo, Register rdhi, Register rn, Register rm) {
6039     Umull(al, rdlo, rdhi, rn, rm);
6040   }
6041   void Umull(FlagsUpdate flags,
6042              Condition cond,
6043              Register rdlo,
6044              Register rdhi,
6045              Register rn,
6046              Register rm) {
6047     switch (flags) {
6048       case LeaveFlags:
6049         Umull(cond, rdlo, rdhi, rn, rm);
6050         break;
6051       case SetFlags:
6052         Umulls(cond, rdlo, rdhi, rn, rm);
6053         break;
6054       case DontCare:
6055         Umull(cond, rdlo, rdhi, rn, rm);
6056         break;
6057     }
6058   }
6059   void Umull(FlagsUpdate flags,
6060              Register rdlo,
6061              Register rdhi,
6062              Register rn,
6063              Register rm) {
6064     Umull(flags, al, rdlo, rdhi, rn, rm);
6065   }
6066 
6067   void Umulls(
6068       Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
6069     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
6070     VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
6071     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6072     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6073     VIXL_ASSERT(allow_macro_instructions_);
6074     VIXL_ASSERT(OutsideITBlock());
6075     MacroEmissionCheckScope guard(this);
6076 #ifndef PANDA_BUILD
6077     ITScope it_scope(this, &cond, guard);
6078 #else
6079     ITScope it_scope(allocator_, this, &cond, guard);
6080 #endif
6081     umulls(cond, rdlo, rdhi, rn, rm);
6082   }
6083   void Umulls(Register rdlo, Register rdhi, Register rn, Register rm) {
6084     Umulls(al, rdlo, rdhi, rn, rm);
6085   }
6086 
6087   void Uqadd16(Condition cond, Register rd, Register rn, Register rm) {
6088     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6089     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6090     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6091     VIXL_ASSERT(allow_macro_instructions_);
6092     VIXL_ASSERT(OutsideITBlock());
6093     MacroEmissionCheckScope guard(this);
6094 #ifndef PANDA_BUILD
6095     ITScope it_scope(this, &cond, guard);
6096 #else
6097     ITScope it_scope(allocator_, this, &cond, guard);
6098 #endif
6099     uqadd16(cond, rd, rn, rm);
6100   }
6101   void Uqadd16(Register rd, Register rn, Register rm) {
6102     Uqadd16(al, rd, rn, rm);
6103   }
6104 
6105   void Uqadd8(Condition cond, Register rd, Register rn, Register rm) {
6106     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6107     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6108     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6109     VIXL_ASSERT(allow_macro_instructions_);
6110     VIXL_ASSERT(OutsideITBlock());
6111     MacroEmissionCheckScope guard(this);
6112 #ifndef PANDA_BUILD
6113     ITScope it_scope(this, &cond, guard);
6114 #else
6115     ITScope it_scope(allocator_, this, &cond, guard);
6116 #endif
6117     uqadd8(cond, rd, rn, rm);
6118   }
6119   void Uqadd8(Register rd, Register rn, Register rm) { Uqadd8(al, rd, rn, rm); }
6120 
6121   void Uqasx(Condition cond, Register rd, Register rn, Register rm) {
6122     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6123     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6124     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6125     VIXL_ASSERT(allow_macro_instructions_);
6126     VIXL_ASSERT(OutsideITBlock());
6127     MacroEmissionCheckScope guard(this);
6128 #ifndef PANDA_BUILD
6129     ITScope it_scope(this, &cond, guard);
6130 #else
6131     ITScope it_scope(allocator_, this, &cond, guard);
6132 #endif
6133     uqasx(cond, rd, rn, rm);
6134   }
6135   void Uqasx(Register rd, Register rn, Register rm) { Uqasx(al, rd, rn, rm); }
6136 
6137   void Uqsax(Condition cond, Register rd, Register rn, Register rm) {
6138     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6139     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6140     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6141     VIXL_ASSERT(allow_macro_instructions_);
6142     VIXL_ASSERT(OutsideITBlock());
6143     MacroEmissionCheckScope guard(this);
6144 #ifndef PANDA_BUILD
6145     ITScope it_scope(this, &cond, guard);
6146 #else
6147     ITScope it_scope(allocator_, this, &cond, guard);
6148 #endif
6149     uqsax(cond, rd, rn, rm);
6150   }
6151   void Uqsax(Register rd, Register rn, Register rm) { Uqsax(al, rd, rn, rm); }
6152 
6153   void Uqsub16(Condition cond, Register rd, Register rn, Register rm) {
6154     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6155     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6156     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6157     VIXL_ASSERT(allow_macro_instructions_);
6158     VIXL_ASSERT(OutsideITBlock());
6159     MacroEmissionCheckScope guard(this);
6160 #ifndef PANDA_BUILD
6161     ITScope it_scope(this, &cond, guard);
6162 #else
6163     ITScope it_scope(allocator_, this, &cond, guard);
6164 #endif
6165     uqsub16(cond, rd, rn, rm);
6166   }
6167   void Uqsub16(Register rd, Register rn, Register rm) {
6168     Uqsub16(al, rd, rn, rm);
6169   }
6170 
6171   void Uqsub8(Condition cond, Register rd, Register rn, Register 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 #ifndef PANDA_BUILD
6179     ITScope it_scope(this, &cond, guard);
6180 #else
6181     ITScope it_scope(allocator_, this, &cond, guard);
6182 #endif
6183     uqsub8(cond, rd, rn, rm);
6184   }
6185   void Uqsub8(Register rd, Register rn, Register rm) { Uqsub8(al, rd, rn, rm); }
6186 
6187   void Usad8(Condition cond, Register rd, Register rn, Register rm) {
6188     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6189     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6190     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6191     VIXL_ASSERT(allow_macro_instructions_);
6192     VIXL_ASSERT(OutsideITBlock());
6193     MacroEmissionCheckScope guard(this);
6194 #ifndef PANDA_BUILD
6195     ITScope it_scope(this, &cond, guard);
6196 #else
6197     ITScope it_scope(allocator_, this, &cond, guard);
6198 #endif
6199     usad8(cond, rd, rn, rm);
6200   }
6201   void Usad8(Register rd, Register rn, Register rm) { Usad8(al, rd, rn, rm); }
6202 
6203   void Usada8(
6204       Condition cond, Register rd, Register rn, Register rm, Register ra) {
6205     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6206     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6207     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6208     VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
6209     VIXL_ASSERT(allow_macro_instructions_);
6210     VIXL_ASSERT(OutsideITBlock());
6211     MacroEmissionCheckScope guard(this);
6212 #ifndef PANDA_BUILD
6213     ITScope it_scope(this, &cond, guard);
6214 #else
6215     ITScope it_scope(allocator_, this, &cond, guard);
6216 #endif
6217     usada8(cond, rd, rn, rm, ra);
6218   }
6219   void Usada8(Register rd, Register rn, Register rm, Register ra) {
6220     Usada8(al, rd, rn, rm, ra);
6221   }
6222 
6223   void Usat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
6224     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6225     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6226     VIXL_ASSERT(allow_macro_instructions_);
6227     VIXL_ASSERT(OutsideITBlock());
6228     MacroEmissionCheckScope guard(this);
6229 #ifndef PANDA_BUILD
6230     ITScope it_scope(this, &cond, guard);
6231 #else
6232     ITScope it_scope(allocator_, this, &cond, guard);
6233 #endif
6234     usat(cond, rd, imm, operand);
6235   }
6236   void Usat(Register rd, uint32_t imm, const Operand& operand) {
6237     Usat(al, rd, imm, operand);
6238   }
6239 
6240   void Usat16(Condition cond, Register rd, uint32_t imm, Register rn) {
6241     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6242     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6243     VIXL_ASSERT(allow_macro_instructions_);
6244     VIXL_ASSERT(OutsideITBlock());
6245     MacroEmissionCheckScope guard(this);
6246 #ifndef PANDA_BUILD
6247     ITScope it_scope(this, &cond, guard);
6248 #else
6249     ITScope it_scope(allocator_, this, &cond, guard);
6250 #endif
6251     usat16(cond, rd, imm, rn);
6252   }
6253   void Usat16(Register rd, uint32_t imm, Register rn) {
6254     Usat16(al, rd, imm, rn);
6255   }
6256 
6257   void Usax(Condition cond, Register rd, Register rn, Register rm) {
6258     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6259     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6260     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6261     VIXL_ASSERT(allow_macro_instructions_);
6262     VIXL_ASSERT(OutsideITBlock());
6263     MacroEmissionCheckScope guard(this);
6264 #ifndef PANDA_BUILD
6265     ITScope it_scope(this, &cond, guard);
6266 #else
6267     ITScope it_scope(allocator_, this, &cond, guard);
6268 #endif
6269     usax(cond, rd, rn, rm);
6270   }
6271   void Usax(Register rd, Register rn, Register rm) { Usax(al, rd, rn, rm); }
6272 
6273   void Usub16(Condition cond, Register rd, Register rn, Register rm) {
6274     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6275     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6276     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6277     VIXL_ASSERT(allow_macro_instructions_);
6278     VIXL_ASSERT(OutsideITBlock());
6279     MacroEmissionCheckScope guard(this);
6280 #ifndef PANDA_BUILD
6281     ITScope it_scope(this, &cond, guard);
6282 #else
6283     ITScope it_scope(allocator_, this, &cond, guard);
6284 #endif
6285     usub16(cond, rd, rn, rm);
6286   }
6287   void Usub16(Register rd, Register rn, Register rm) { Usub16(al, rd, rn, rm); }
6288 
6289   void Usub8(Condition cond, Register rd, Register rn, Register rm) {
6290     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6291     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6292     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6293     VIXL_ASSERT(allow_macro_instructions_);
6294     VIXL_ASSERT(OutsideITBlock());
6295     MacroEmissionCheckScope guard(this);
6296 #ifndef PANDA_BUILD
6297     ITScope it_scope(this, &cond, guard);
6298 #else
6299     ITScope it_scope(allocator_, this, &cond, guard);
6300 #endif
6301     usub8(cond, rd, rn, rm);
6302   }
6303   void Usub8(Register rd, Register rn, Register rm) { Usub8(al, rd, rn, rm); }
6304 
6305   void Uxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
6306     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6307     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6308     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6309     VIXL_ASSERT(allow_macro_instructions_);
6310     VIXL_ASSERT(OutsideITBlock());
6311     MacroEmissionCheckScope guard(this);
6312 #ifndef PANDA_BUILD
6313     ITScope it_scope(this, &cond, guard);
6314 #else
6315     ITScope it_scope(allocator_, this, &cond, guard);
6316 #endif
6317     uxtab(cond, rd, rn, operand);
6318   }
6319   void Uxtab(Register rd, Register rn, const Operand& operand) {
6320     Uxtab(al, rd, rn, operand);
6321   }
6322 
6323   void Uxtab16(Condition cond,
6324                Register rd,
6325                Register rn,
6326                const Operand& operand) {
6327     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6329     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6330     VIXL_ASSERT(allow_macro_instructions_);
6331     VIXL_ASSERT(OutsideITBlock());
6332     MacroEmissionCheckScope guard(this);
6333 #ifndef PANDA_BUILD
6334     ITScope it_scope(this, &cond, guard);
6335 #else
6336     ITScope it_scope(allocator_, this, &cond, guard);
6337 #endif
6338     uxtab16(cond, rd, rn, operand);
6339   }
6340   void Uxtab16(Register rd, Register rn, const Operand& operand) {
6341     Uxtab16(al, rd, rn, operand);
6342   }
6343 
6344   void Uxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
6345     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6346     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6347     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6348     VIXL_ASSERT(allow_macro_instructions_);
6349     VIXL_ASSERT(OutsideITBlock());
6350     MacroEmissionCheckScope guard(this);
6351 #ifndef PANDA_BUILD
6352     ITScope it_scope(this, &cond, guard);
6353 #else
6354     ITScope it_scope(allocator_, this, &cond, guard);
6355 #endif
6356     uxtah(cond, rd, rn, operand);
6357   }
6358   void Uxtah(Register rd, Register rn, const Operand& operand) {
6359     Uxtah(al, rd, rn, operand);
6360   }
6361 
6362   void Uxtb(Condition cond, Register rd, const Operand& operand) {
6363     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6364     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6365     VIXL_ASSERT(allow_macro_instructions_);
6366     VIXL_ASSERT(OutsideITBlock());
6367     MacroEmissionCheckScope guard(this);
6368 #ifndef PANDA_BUILD
6369     ITScope it_scope(this, &cond, guard);
6370 #else
6371     ITScope it_scope(allocator_, this, &cond, guard);
6372 #endif
6373     uxtb(cond, rd, operand);
6374   }
6375   void Uxtb(Register rd, const Operand& operand) { Uxtb(al, rd, operand); }
6376 
6377   void Uxtb16(Condition cond, Register rd, const Operand& operand) {
6378     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6379     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6380     VIXL_ASSERT(allow_macro_instructions_);
6381     VIXL_ASSERT(OutsideITBlock());
6382     MacroEmissionCheckScope guard(this);
6383 #ifndef PANDA_BUILD
6384     ITScope it_scope(this, &cond, guard);
6385 #else
6386     ITScope it_scope(allocator_, this, &cond, guard);
6387 #endif
6388     uxtb16(cond, rd, operand);
6389   }
6390   void Uxtb16(Register rd, const Operand& operand) { Uxtb16(al, rd, operand); }
6391 
6392   void Uxth(Condition cond, Register rd, const Operand& operand) {
6393     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6394     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6395     VIXL_ASSERT(allow_macro_instructions_);
6396     VIXL_ASSERT(OutsideITBlock());
6397     MacroEmissionCheckScope guard(this);
6398 #ifndef PANDA_BUILD
6399     ITScope it_scope(this, &cond, guard);
6400 #else
6401     ITScope it_scope(allocator_, this, &cond, guard);
6402 #endif
6403     uxth(cond, rd, operand);
6404   }
6405   void Uxth(Register rd, const Operand& operand) { Uxth(al, rd, operand); }
6406 
6407   void Vaba(
6408       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6409     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6410     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6411     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6412     VIXL_ASSERT(allow_macro_instructions_);
6413     VIXL_ASSERT(OutsideITBlock());
6414     MacroEmissionCheckScope guard(this);
6415 #ifndef PANDA_BUILD
6416     ITScope it_scope(this, &cond, guard);
6417 #else
6418     ITScope it_scope(allocator_, this, &cond, guard);
6419 #endif
6420     vaba(cond, dt, rd, rn, rm);
6421   }
6422   void Vaba(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6423     Vaba(al, dt, rd, rn, rm);
6424   }
6425 
6426   void Vaba(
6427       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6428     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6429     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6430     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6431     VIXL_ASSERT(allow_macro_instructions_);
6432     VIXL_ASSERT(OutsideITBlock());
6433     MacroEmissionCheckScope guard(this);
6434 #ifndef PANDA_BUILD
6435     ITScope it_scope(this, &cond, guard);
6436 #else
6437     ITScope it_scope(allocator_, this, &cond, guard);
6438 #endif
6439     vaba(cond, dt, rd, rn, rm);
6440   }
6441   void Vaba(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6442     Vaba(al, dt, rd, rn, rm);
6443   }
6444 
6445   void Vabal(
6446       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
6447     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6448     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6449     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6450     VIXL_ASSERT(allow_macro_instructions_);
6451     VIXL_ASSERT(OutsideITBlock());
6452     MacroEmissionCheckScope guard(this);
6453 #ifndef PANDA_BUILD
6454     ITScope it_scope(this, &cond, guard);
6455 #else
6456     ITScope it_scope(allocator_, this, &cond, guard);
6457 #endif
6458     vabal(cond, dt, rd, rn, rm);
6459   }
6460   void Vabal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
6461     Vabal(al, dt, rd, rn, rm);
6462   }
6463 
6464   void Vabd(
6465       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6466     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6467     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6468     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6469     VIXL_ASSERT(allow_macro_instructions_);
6470     VIXL_ASSERT(OutsideITBlock());
6471     MacroEmissionCheckScope guard(this);
6472 #ifndef PANDA_BUILD
6473     ITScope it_scope(this, &cond, guard);
6474 #else
6475     ITScope it_scope(allocator_, this, &cond, guard);
6476 #endif
6477     vabd(cond, dt, rd, rn, rm);
6478   }
6479   void Vabd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6480     Vabd(al, dt, rd, rn, rm);
6481   }
6482 
6483   void Vabd(
6484       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6485     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6486     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6487     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6488     VIXL_ASSERT(allow_macro_instructions_);
6489     VIXL_ASSERT(OutsideITBlock());
6490     MacroEmissionCheckScope guard(this);
6491 #ifndef PANDA_BUILD
6492     ITScope it_scope(this, &cond, guard);
6493 #else
6494     ITScope it_scope(allocator_, this, &cond, guard);
6495 #endif
6496     vabd(cond, dt, rd, rn, rm);
6497   }
6498   void Vabd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6499     Vabd(al, dt, rd, rn, rm);
6500   }
6501 
6502   void Vabdl(
6503       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
6504     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6505     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6506     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6507     VIXL_ASSERT(allow_macro_instructions_);
6508     VIXL_ASSERT(OutsideITBlock());
6509     MacroEmissionCheckScope guard(this);
6510 #ifndef PANDA_BUILD
6511     ITScope it_scope(this, &cond, guard);
6512 #else
6513     ITScope it_scope(allocator_, this, &cond, guard);
6514 #endif
6515     vabdl(cond, dt, rd, rn, rm);
6516   }
6517   void Vabdl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
6518     Vabdl(al, dt, rd, rn, rm);
6519   }
6520 
6521   void Vabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6522     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6523     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6524     VIXL_ASSERT(allow_macro_instructions_);
6525     VIXL_ASSERT(OutsideITBlock());
6526     MacroEmissionCheckScope guard(this);
6527 #ifndef PANDA_BUILD
6528     ITScope it_scope(this, &cond, guard);
6529 #else
6530     ITScope it_scope(allocator_, this, &cond, guard);
6531 #endif
6532     vabs(cond, dt, rd, rm);
6533   }
6534   void Vabs(DataType dt, DRegister rd, DRegister rm) { Vabs(al, dt, rd, rm); }
6535 
6536   void Vabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6537     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6538     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6539     VIXL_ASSERT(allow_macro_instructions_);
6540     VIXL_ASSERT(OutsideITBlock());
6541     MacroEmissionCheckScope guard(this);
6542 #ifndef PANDA_BUILD
6543     ITScope it_scope(this, &cond, guard);
6544 #else
6545     ITScope it_scope(allocator_, this, &cond, guard);
6546 #endif
6547     vabs(cond, dt, rd, rm);
6548   }
6549   void Vabs(DataType dt, QRegister rd, QRegister rm) { Vabs(al, dt, rd, rm); }
6550 
6551   void Vabs(Condition cond, DataType dt, SRegister rd, SRegister rm) {
6552     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6553     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6554     VIXL_ASSERT(allow_macro_instructions_);
6555     VIXL_ASSERT(OutsideITBlock());
6556     MacroEmissionCheckScope guard(this);
6557 #ifndef PANDA_BUILD
6558     ITScope it_scope(this, &cond, guard);
6559 #else
6560     ITScope it_scope(allocator_, this, &cond, guard);
6561 #endif
6562     vabs(cond, dt, rd, rm);
6563   }
6564   void Vabs(DataType dt, SRegister rd, SRegister rm) { Vabs(al, dt, rd, rm); }
6565 
6566   void Vacge(
6567       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6568     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6569     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6570     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6571     VIXL_ASSERT(allow_macro_instructions_);
6572     VIXL_ASSERT(OutsideITBlock());
6573     MacroEmissionCheckScope guard(this);
6574 #ifndef PANDA_BUILD
6575     ITScope it_scope(this, &cond, guard);
6576 #else
6577     ITScope it_scope(allocator_, this, &cond, guard);
6578 #endif
6579     vacge(cond, dt, rd, rn, rm);
6580   }
6581   void Vacge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6582     Vacge(al, dt, rd, rn, rm);
6583   }
6584 
6585   void Vacge(
6586       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6587     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6588     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6589     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6590     VIXL_ASSERT(allow_macro_instructions_);
6591     VIXL_ASSERT(OutsideITBlock());
6592     MacroEmissionCheckScope guard(this);
6593 #ifndef PANDA_BUILD
6594     ITScope it_scope(this, &cond, guard);
6595 #else
6596     ITScope it_scope(allocator_, this, &cond, guard);
6597 #endif
6598     vacge(cond, dt, rd, rn, rm);
6599   }
6600   void Vacge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6601     Vacge(al, dt, rd, rn, rm);
6602   }
6603 
6604   void Vacgt(
6605       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6606     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6607     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6609     VIXL_ASSERT(allow_macro_instructions_);
6610     VIXL_ASSERT(OutsideITBlock());
6611     MacroEmissionCheckScope guard(this);
6612 #ifndef PANDA_BUILD
6613     ITScope it_scope(this, &cond, guard);
6614 #else
6615     ITScope it_scope(allocator_, this, &cond, guard);
6616 #endif
6617     vacgt(cond, dt, rd, rn, rm);
6618   }
6619   void Vacgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6620     Vacgt(al, dt, rd, rn, rm);
6621   }
6622 
6623   void Vacgt(
6624       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6625     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6626     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6627     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6628     VIXL_ASSERT(allow_macro_instructions_);
6629     VIXL_ASSERT(OutsideITBlock());
6630     MacroEmissionCheckScope guard(this);
6631 #ifndef PANDA_BUILD
6632     ITScope it_scope(this, &cond, guard);
6633 #else
6634     ITScope it_scope(allocator_, this, &cond, guard);
6635 #endif
6636     vacgt(cond, dt, rd, rn, rm);
6637   }
6638   void Vacgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6639     Vacgt(al, dt, rd, rn, rm);
6640   }
6641 
6642   void Vacle(
6643       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6644     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6645     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6646     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6647     VIXL_ASSERT(allow_macro_instructions_);
6648     VIXL_ASSERT(OutsideITBlock());
6649     MacroEmissionCheckScope guard(this);
6650 #ifndef PANDA_BUILD
6651     ITScope it_scope(this, &cond, guard);
6652 #else
6653     ITScope it_scope(allocator_, this, &cond, guard);
6654 #endif
6655     vacle(cond, dt, rd, rn, rm);
6656   }
6657   void Vacle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6658     Vacle(al, dt, rd, rn, rm);
6659   }
6660 
6661   void Vacle(
6662       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6665     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6666     VIXL_ASSERT(allow_macro_instructions_);
6667     VIXL_ASSERT(OutsideITBlock());
6668     MacroEmissionCheckScope guard(this);
6669 #ifndef PANDA_BUILD
6670     ITScope it_scope(this, &cond, guard);
6671 #else
6672     ITScope it_scope(allocator_, this, &cond, guard);
6673 #endif
6674     vacle(cond, dt, rd, rn, rm);
6675   }
6676   void Vacle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6677     Vacle(al, dt, rd, rn, rm);
6678   }
6679 
6680   void Vaclt(
6681       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6682     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6683     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6684     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6685     VIXL_ASSERT(allow_macro_instructions_);
6686     VIXL_ASSERT(OutsideITBlock());
6687     MacroEmissionCheckScope guard(this);
6688 #ifndef PANDA_BUILD
6689     ITScope it_scope(this, &cond, guard);
6690 #else
6691     ITScope it_scope(allocator_, this, &cond, guard);
6692 #endif
6693     vaclt(cond, dt, rd, rn, rm);
6694   }
6695   void Vaclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6696     Vaclt(al, dt, rd, rn, rm);
6697   }
6698 
6699   void Vaclt(
6700       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6701     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6702     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6703     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6704     VIXL_ASSERT(allow_macro_instructions_);
6705     VIXL_ASSERT(OutsideITBlock());
6706     MacroEmissionCheckScope guard(this);
6707 #ifndef PANDA_BUILD
6708     ITScope it_scope(this, &cond, guard);
6709 #else
6710     ITScope it_scope(allocator_, this, &cond, guard);
6711 #endif
6712     vaclt(cond, dt, rd, rn, rm);
6713   }
6714   void Vaclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6715     Vaclt(al, dt, rd, rn, rm);
6716   }
6717 
6718   void Vadd(
6719       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6720     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6721     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6722     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6723     VIXL_ASSERT(allow_macro_instructions_);
6724     VIXL_ASSERT(OutsideITBlock());
6725     MacroEmissionCheckScope guard(this);
6726 #ifndef PANDA_BUILD
6727     ITScope it_scope(this, &cond, guard);
6728 #else
6729     ITScope it_scope(allocator_, this, &cond, guard);
6730 #endif
6731     vadd(cond, dt, rd, rn, rm);
6732   }
6733   void Vadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6734     Vadd(al, dt, rd, rn, rm);
6735   }
6736 
6737   void Vadd(
6738       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6739     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6740     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6741     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6742     VIXL_ASSERT(allow_macro_instructions_);
6743     VIXL_ASSERT(OutsideITBlock());
6744     MacroEmissionCheckScope guard(this);
6745 #ifndef PANDA_BUILD
6746     ITScope it_scope(this, &cond, guard);
6747 #else
6748     ITScope it_scope(allocator_, this, &cond, guard);
6749 #endif
6750     vadd(cond, dt, rd, rn, rm);
6751   }
6752   void Vadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6753     Vadd(al, dt, rd, rn, rm);
6754   }
6755 
6756   void Vadd(
6757       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6760     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6761     VIXL_ASSERT(allow_macro_instructions_);
6762     VIXL_ASSERT(OutsideITBlock());
6763     MacroEmissionCheckScope guard(this);
6764 #ifndef PANDA_BUILD
6765     ITScope it_scope(this, &cond, guard);
6766 #else
6767     ITScope it_scope(allocator_, this, &cond, guard);
6768 #endif
6769     vadd(cond, dt, rd, rn, rm);
6770   }
6771   void Vadd(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6772     Vadd(al, dt, rd, rn, rm);
6773   }
6774 
6775   void Vaddhn(
6776       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6777     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6778     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6780     VIXL_ASSERT(allow_macro_instructions_);
6781     VIXL_ASSERT(OutsideITBlock());
6782     MacroEmissionCheckScope guard(this);
6783 #ifndef PANDA_BUILD
6784     ITScope it_scope(this, &cond, guard);
6785 #else
6786     ITScope it_scope(allocator_, this, &cond, guard);
6787 #endif
6788     vaddhn(cond, dt, rd, rn, rm);
6789   }
6790   void Vaddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
6791     Vaddhn(al, dt, rd, rn, rm);
6792   }
6793 
6794   void Vaddl(
6795       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
6796     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6797     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6798     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6799     VIXL_ASSERT(allow_macro_instructions_);
6800     VIXL_ASSERT(OutsideITBlock());
6801     MacroEmissionCheckScope guard(this);
6802 #ifndef PANDA_BUILD
6803     ITScope it_scope(this, &cond, guard);
6804 #else
6805     ITScope it_scope(allocator_, this, &cond, guard);
6806 #endif
6807     vaddl(cond, dt, rd, rn, rm);
6808   }
6809   void Vaddl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
6810     Vaddl(al, dt, rd, rn, rm);
6811   }
6812 
6813   void Vaddw(
6814       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
6815     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6816     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6817     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6818     VIXL_ASSERT(allow_macro_instructions_);
6819     VIXL_ASSERT(OutsideITBlock());
6820     MacroEmissionCheckScope guard(this);
6821 #ifndef PANDA_BUILD
6822     ITScope it_scope(this, &cond, guard);
6823 #else
6824     ITScope it_scope(allocator_, this, &cond, guard);
6825 #endif
6826     vaddw(cond, dt, rd, rn, rm);
6827   }
6828   void Vaddw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
6829     Vaddw(al, dt, rd, rn, rm);
6830   }
6831 
6832   void Vand(Condition cond,
6833             DataType dt,
6834             DRegister rd,
6835             DRegister rn,
6836             const DOperand& operand) {
6837     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6838     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6839     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6840     VIXL_ASSERT(allow_macro_instructions_);
6841     VIXL_ASSERT(OutsideITBlock());
6842     MacroEmissionCheckScope guard(this);
6843 #ifndef PANDA_BUILD
6844     ITScope it_scope(this, &cond, guard);
6845 #else
6846     ITScope it_scope(allocator_, this, &cond, guard);
6847 #endif
6848     vand(cond, dt, rd, rn, operand);
6849   }
6850   void Vand(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
6851     Vand(al, dt, rd, rn, operand);
6852   }
6853 
6854   void Vand(Condition cond,
6855             DataType dt,
6856             QRegister rd,
6857             QRegister rn,
6858             const QOperand& operand) {
6859     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6860     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6861     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6862     VIXL_ASSERT(allow_macro_instructions_);
6863     VIXL_ASSERT(OutsideITBlock());
6864     MacroEmissionCheckScope guard(this);
6865 #ifndef PANDA_BUILD
6866     ITScope it_scope(this, &cond, guard);
6867 #else
6868     ITScope it_scope(allocator_, this, &cond, guard);
6869 #endif
6870     vand(cond, dt, rd, rn, operand);
6871   }
6872   void Vand(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
6873     Vand(al, dt, rd, rn, operand);
6874   }
6875 
6876   void Vbic(Condition cond,
6877             DataType dt,
6878             DRegister rd,
6879             DRegister rn,
6880             const DOperand& operand) {
6881     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6882     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6883     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6884     VIXL_ASSERT(allow_macro_instructions_);
6885     VIXL_ASSERT(OutsideITBlock());
6886     MacroEmissionCheckScope guard(this);
6887 #ifndef PANDA_BUILD
6888     ITScope it_scope(this, &cond, guard);
6889 #else
6890     ITScope it_scope(allocator_, this, &cond, guard);
6891 #endif
6892     vbic(cond, dt, rd, rn, operand);
6893   }
6894   void Vbic(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
6895     Vbic(al, dt, rd, rn, operand);
6896   }
6897 
6898   void Vbic(Condition cond,
6899             DataType dt,
6900             QRegister rd,
6901             QRegister rn,
6902             const QOperand& operand) {
6903     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6904     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6905     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6906     VIXL_ASSERT(allow_macro_instructions_);
6907     VIXL_ASSERT(OutsideITBlock());
6908     MacroEmissionCheckScope guard(this);
6909 #ifndef PANDA_BUILD
6910     ITScope it_scope(this, &cond, guard);
6911 #else
6912     ITScope it_scope(allocator_, this, &cond, guard);
6913 #endif
6914     vbic(cond, dt, rd, rn, operand);
6915   }
6916   void Vbic(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
6917     Vbic(al, dt, rd, rn, operand);
6918   }
6919 
6920   void Vbif(
6921       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6922     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6923     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6924     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6925     VIXL_ASSERT(allow_macro_instructions_);
6926     VIXL_ASSERT(OutsideITBlock());
6927     MacroEmissionCheckScope guard(this);
6928 #ifndef PANDA_BUILD
6929     ITScope it_scope(this, &cond, guard);
6930 #else
6931     ITScope it_scope(allocator_, this, &cond, guard);
6932 #endif
6933     vbif(cond, dt, rd, rn, rm);
6934   }
6935   void Vbif(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6936     Vbif(al, dt, rd, rn, rm);
6937   }
6938   void Vbif(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
6939     Vbif(cond, kDataTypeValueNone, rd, rn, rm);
6940   }
6941   void Vbif(DRegister rd, DRegister rn, DRegister rm) {
6942     Vbif(al, kDataTypeValueNone, rd, rn, rm);
6943   }
6944 
6945   void Vbif(
6946       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6947     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6949     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6950     VIXL_ASSERT(allow_macro_instructions_);
6951     VIXL_ASSERT(OutsideITBlock());
6952     MacroEmissionCheckScope guard(this);
6953 #ifndef PANDA_BUILD
6954     ITScope it_scope(this, &cond, guard);
6955 #else
6956     ITScope it_scope(allocator_, this, &cond, guard);
6957 #endif
6958     vbif(cond, dt, rd, rn, rm);
6959   }
6960   void Vbif(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6961     Vbif(al, dt, rd, rn, rm);
6962   }
6963   void Vbif(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
6964     Vbif(cond, kDataTypeValueNone, rd, rn, rm);
6965   }
6966   void Vbif(QRegister rd, QRegister rn, QRegister rm) {
6967     Vbif(al, kDataTypeValueNone, rd, rn, rm);
6968   }
6969 
6970   void Vbit(
6971       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6973     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6974     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6975     VIXL_ASSERT(allow_macro_instructions_);
6976     VIXL_ASSERT(OutsideITBlock());
6977     MacroEmissionCheckScope guard(this);
6978 #ifndef PANDA_BUILD
6979     ITScope it_scope(this, &cond, guard);
6980 #else
6981     ITScope it_scope(allocator_, this, &cond, guard);
6982 #endif
6983     vbit(cond, dt, rd, rn, rm);
6984   }
6985   void Vbit(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6986     Vbit(al, dt, rd, rn, rm);
6987   }
6988   void Vbit(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
6989     Vbit(cond, kDataTypeValueNone, rd, rn, rm);
6990   }
6991   void Vbit(DRegister rd, DRegister rn, DRegister rm) {
6992     Vbit(al, kDataTypeValueNone, rd, rn, rm);
6993   }
6994 
6995   void Vbit(
6996       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6997     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6998     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6999     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7000     VIXL_ASSERT(allow_macro_instructions_);
7001     VIXL_ASSERT(OutsideITBlock());
7002     MacroEmissionCheckScope guard(this);
7003 #ifndef PANDA_BUILD
7004     ITScope it_scope(this, &cond, guard);
7005 #else
7006     ITScope it_scope(allocator_, this, &cond, guard);
7007 #endif
7008     vbit(cond, dt, rd, rn, rm);
7009   }
7010   void Vbit(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7011     Vbit(al, dt, rd, rn, rm);
7012   }
7013   void Vbit(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
7014     Vbit(cond, kDataTypeValueNone, rd, rn, rm);
7015   }
7016   void Vbit(QRegister rd, QRegister rn, QRegister rm) {
7017     Vbit(al, kDataTypeValueNone, rd, rn, rm);
7018   }
7019 
7020   void Vbsl(
7021       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7022     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7023     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7024     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7025     VIXL_ASSERT(allow_macro_instructions_);
7026     VIXL_ASSERT(OutsideITBlock());
7027     MacroEmissionCheckScope guard(this);
7028 #ifndef PANDA_BUILD
7029     ITScope it_scope(this, &cond, guard);
7030 #else
7031     ITScope it_scope(allocator_, this, &cond, guard);
7032 #endif
7033     vbsl(cond, dt, rd, rn, rm);
7034   }
7035   void Vbsl(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7036     Vbsl(al, dt, rd, rn, rm);
7037   }
7038   void Vbsl(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
7039     Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
7040   }
7041   void Vbsl(DRegister rd, DRegister rn, DRegister rm) {
7042     Vbsl(al, kDataTypeValueNone, rd, rn, rm);
7043   }
7044 
7045   void Vbsl(
7046       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7047     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7048     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7049     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7050     VIXL_ASSERT(allow_macro_instructions_);
7051     VIXL_ASSERT(OutsideITBlock());
7052     MacroEmissionCheckScope guard(this);
7053 #ifndef PANDA_BUILD
7054     ITScope it_scope(this, &cond, guard);
7055 #else
7056     ITScope it_scope(allocator_, this, &cond, guard);
7057 #endif
7058     vbsl(cond, dt, rd, rn, rm);
7059   }
7060   void Vbsl(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7061     Vbsl(al, dt, rd, rn, rm);
7062   }
7063   void Vbsl(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
7064     Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
7065   }
7066   void Vbsl(QRegister rd, QRegister rn, QRegister rm) {
7067     Vbsl(al, kDataTypeValueNone, rd, rn, rm);
7068   }
7069 
7070   void Vceq(Condition cond,
7071             DataType dt,
7072             DRegister rd,
7073             DRegister rm,
7074             const DOperand& operand) {
7075     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7076     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7077     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7078     VIXL_ASSERT(allow_macro_instructions_);
7079     VIXL_ASSERT(OutsideITBlock());
7080     MacroEmissionCheckScope guard(this);
7081 #ifndef PANDA_BUILD
7082     ITScope it_scope(this, &cond, guard);
7083 #else
7084     ITScope it_scope(allocator_, this, &cond, guard);
7085 #endif
7086     vceq(cond, dt, rd, rm, operand);
7087   }
7088   void Vceq(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
7089     Vceq(al, dt, rd, rm, operand);
7090   }
7091 
7092   void Vceq(Condition cond,
7093             DataType dt,
7094             QRegister rd,
7095             QRegister rm,
7096             const QOperand& operand) {
7097     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7098     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7099     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7100     VIXL_ASSERT(allow_macro_instructions_);
7101     VIXL_ASSERT(OutsideITBlock());
7102     MacroEmissionCheckScope guard(this);
7103 #ifndef PANDA_BUILD
7104     ITScope it_scope(this, &cond, guard);
7105 #else
7106     ITScope it_scope(allocator_, this, &cond, guard);
7107 #endif
7108     vceq(cond, dt, rd, rm, operand);
7109   }
7110   void Vceq(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
7111     Vceq(al, dt, rd, rm, operand);
7112   }
7113 
7114   void Vceq(
7115       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7116     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7117     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7118     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7119     VIXL_ASSERT(allow_macro_instructions_);
7120     VIXL_ASSERT(OutsideITBlock());
7121     MacroEmissionCheckScope guard(this);
7122 #ifndef PANDA_BUILD
7123     ITScope it_scope(this, &cond, guard);
7124 #else
7125     ITScope it_scope(allocator_, this, &cond, guard);
7126 #endif
7127     vceq(cond, dt, rd, rn, rm);
7128   }
7129   void Vceq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7130     Vceq(al, dt, rd, rn, rm);
7131   }
7132 
7133   void Vceq(
7134       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7135     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7136     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7137     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7138     VIXL_ASSERT(allow_macro_instructions_);
7139     VIXL_ASSERT(OutsideITBlock());
7140     MacroEmissionCheckScope guard(this);
7141 #ifndef PANDA_BUILD
7142     ITScope it_scope(this, &cond, guard);
7143 #else
7144     ITScope it_scope(allocator_, this, &cond, guard);
7145 #endif
7146     vceq(cond, dt, rd, rn, rm);
7147   }
7148   void Vceq(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7149     Vceq(al, dt, rd, rn, rm);
7150   }
7151 
7152   void Vcge(Condition cond,
7153             DataType dt,
7154             DRegister rd,
7155             DRegister rm,
7156             const DOperand& operand) {
7157     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7158     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7159     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7160     VIXL_ASSERT(allow_macro_instructions_);
7161     VIXL_ASSERT(OutsideITBlock());
7162     MacroEmissionCheckScope guard(this);
7163 #ifndef PANDA_BUILD
7164     ITScope it_scope(this, &cond, guard);
7165 #else
7166     ITScope it_scope(allocator_, this, &cond, guard);
7167 #endif
7168     vcge(cond, dt, rd, rm, operand);
7169   }
7170   void Vcge(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
7171     Vcge(al, dt, rd, rm, operand);
7172   }
7173 
7174   void Vcge(Condition cond,
7175             DataType dt,
7176             QRegister rd,
7177             QRegister rm,
7178             const QOperand& operand) {
7179     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7180     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7181     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7182     VIXL_ASSERT(allow_macro_instructions_);
7183     VIXL_ASSERT(OutsideITBlock());
7184     MacroEmissionCheckScope guard(this);
7185 #ifndef PANDA_BUILD
7186     ITScope it_scope(this, &cond, guard);
7187 #else
7188     ITScope it_scope(allocator_, this, &cond, guard);
7189 #endif
7190     vcge(cond, dt, rd, rm, operand);
7191   }
7192   void Vcge(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
7193     Vcge(al, dt, rd, rm, operand);
7194   }
7195 
7196   void Vcge(
7197       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7198     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7199     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7200     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7201     VIXL_ASSERT(allow_macro_instructions_);
7202     VIXL_ASSERT(OutsideITBlock());
7203     MacroEmissionCheckScope guard(this);
7204 #ifndef PANDA_BUILD
7205     ITScope it_scope(this, &cond, guard);
7206 #else
7207     ITScope it_scope(allocator_, this, &cond, guard);
7208 #endif
7209     vcge(cond, dt, rd, rn, rm);
7210   }
7211   void Vcge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7212     Vcge(al, dt, rd, rn, rm);
7213   }
7214 
7215   void Vcge(
7216       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7217     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7218     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7219     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7220     VIXL_ASSERT(allow_macro_instructions_);
7221     VIXL_ASSERT(OutsideITBlock());
7222     MacroEmissionCheckScope guard(this);
7223 #ifndef PANDA_BUILD
7224     ITScope it_scope(this, &cond, guard);
7225 #else
7226     ITScope it_scope(allocator_, this, &cond, guard);
7227 #endif
7228     vcge(cond, dt, rd, rn, rm);
7229   }
7230   void Vcge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7231     Vcge(al, dt, rd, rn, rm);
7232   }
7233 
7234   void Vcgt(Condition cond,
7235             DataType dt,
7236             DRegister rd,
7237             DRegister rm,
7238             const DOperand& operand) {
7239     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7240     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7241     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7242     VIXL_ASSERT(allow_macro_instructions_);
7243     VIXL_ASSERT(OutsideITBlock());
7244     MacroEmissionCheckScope guard(this);
7245 #ifndef PANDA_BUILD
7246     ITScope it_scope(this, &cond, guard);
7247 #else
7248     ITScope it_scope(allocator_, this, &cond, guard);
7249 #endif
7250     vcgt(cond, dt, rd, rm, operand);
7251   }
7252   void Vcgt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
7253     Vcgt(al, dt, rd, rm, operand);
7254   }
7255 
7256   void Vcgt(Condition cond,
7257             DataType dt,
7258             QRegister rd,
7259             QRegister rm,
7260             const QOperand& operand) {
7261     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7262     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7263     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7264     VIXL_ASSERT(allow_macro_instructions_);
7265     VIXL_ASSERT(OutsideITBlock());
7266     MacroEmissionCheckScope guard(this);
7267 #ifndef PANDA_BUILD
7268     ITScope it_scope(this, &cond, guard);
7269 #else
7270     ITScope it_scope(allocator_, this, &cond, guard);
7271 #endif
7272     vcgt(cond, dt, rd, rm, operand);
7273   }
7274   void Vcgt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
7275     Vcgt(al, dt, rd, rm, operand);
7276   }
7277 
7278   void Vcgt(
7279       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7280     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7281     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7282     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7283     VIXL_ASSERT(allow_macro_instructions_);
7284     VIXL_ASSERT(OutsideITBlock());
7285     MacroEmissionCheckScope guard(this);
7286 #ifndef PANDA_BUILD
7287     ITScope it_scope(this, &cond, guard);
7288 #else
7289     ITScope it_scope(allocator_, this, &cond, guard);
7290 #endif
7291     vcgt(cond, dt, rd, rn, rm);
7292   }
7293   void Vcgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7294     Vcgt(al, dt, rd, rn, rm);
7295   }
7296 
7297   void Vcgt(
7298       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7299     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7300     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7301     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7302     VIXL_ASSERT(allow_macro_instructions_);
7303     VIXL_ASSERT(OutsideITBlock());
7304     MacroEmissionCheckScope guard(this);
7305 #ifndef PANDA_BUILD
7306     ITScope it_scope(this, &cond, guard);
7307 #else
7308     ITScope it_scope(allocator_, this, &cond, guard);
7309 #endif
7310     vcgt(cond, dt, rd, rn, rm);
7311   }
7312   void Vcgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7313     Vcgt(al, dt, rd, rn, rm);
7314   }
7315 
7316   void Vcle(Condition cond,
7317             DataType dt,
7318             DRegister rd,
7319             DRegister rm,
7320             const DOperand& operand) {
7321     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7322     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7323     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7324     VIXL_ASSERT(allow_macro_instructions_);
7325     VIXL_ASSERT(OutsideITBlock());
7326     MacroEmissionCheckScope guard(this);
7327 #ifndef PANDA_BUILD
7328     ITScope it_scope(this, &cond, guard);
7329 #else
7330     ITScope it_scope(allocator_, this, &cond, guard);
7331 #endif
7332     vcle(cond, dt, rd, rm, operand);
7333   }
7334   void Vcle(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
7335     Vcle(al, dt, rd, rm, operand);
7336   }
7337 
7338   void Vcle(Condition cond,
7339             DataType dt,
7340             QRegister rd,
7341             QRegister rm,
7342             const QOperand& operand) {
7343     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7344     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7345     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7346     VIXL_ASSERT(allow_macro_instructions_);
7347     VIXL_ASSERT(OutsideITBlock());
7348     MacroEmissionCheckScope guard(this);
7349 #ifndef PANDA_BUILD
7350     ITScope it_scope(this, &cond, guard);
7351 #else
7352     ITScope it_scope(allocator_, this, &cond, guard);
7353 #endif
7354     vcle(cond, dt, rd, rm, operand);
7355   }
7356   void Vcle(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
7357     Vcle(al, dt, rd, rm, operand);
7358   }
7359 
7360   void Vcle(
7361       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7362     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7363     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7364     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7365     VIXL_ASSERT(allow_macro_instructions_);
7366     VIXL_ASSERT(OutsideITBlock());
7367     MacroEmissionCheckScope guard(this);
7368 #ifndef PANDA_BUILD
7369     ITScope it_scope(this, &cond, guard);
7370 #else
7371     ITScope it_scope(allocator_, this, &cond, guard);
7372 #endif
7373     vcle(cond, dt, rd, rn, rm);
7374   }
7375   void Vcle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7376     Vcle(al, dt, rd, rn, rm);
7377   }
7378 
7379   void Vcle(
7380       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7382     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7383     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7384     VIXL_ASSERT(allow_macro_instructions_);
7385     VIXL_ASSERT(OutsideITBlock());
7386     MacroEmissionCheckScope guard(this);
7387 #ifndef PANDA_BUILD
7388     ITScope it_scope(this, &cond, guard);
7389 #else
7390     ITScope it_scope(allocator_, this, &cond, guard);
7391 #endif
7392     vcle(cond, dt, rd, rn, rm);
7393   }
7394   void Vcle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7395     Vcle(al, dt, rd, rn, rm);
7396   }
7397 
7398   void Vcls(Condition cond, DataType dt, DRegister rd, DRegister rm) {
7399     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7400     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7401     VIXL_ASSERT(allow_macro_instructions_);
7402     VIXL_ASSERT(OutsideITBlock());
7403     MacroEmissionCheckScope guard(this);
7404 #ifndef PANDA_BUILD
7405     ITScope it_scope(this, &cond, guard);
7406 #else
7407     ITScope it_scope(allocator_, this, &cond, guard);
7408 #endif
7409     vcls(cond, dt, rd, rm);
7410   }
7411   void Vcls(DataType dt, DRegister rd, DRegister rm) { Vcls(al, dt, rd, rm); }
7412 
7413   void Vcls(Condition cond, DataType dt, QRegister rd, QRegister rm) {
7414     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7415     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7416     VIXL_ASSERT(allow_macro_instructions_);
7417     VIXL_ASSERT(OutsideITBlock());
7418     MacroEmissionCheckScope guard(this);
7419 #ifndef PANDA_BUILD
7420     ITScope it_scope(this, &cond, guard);
7421 #else
7422     ITScope it_scope(allocator_, this, &cond, guard);
7423 #endif
7424     vcls(cond, dt, rd, rm);
7425   }
7426   void Vcls(DataType dt, QRegister rd, QRegister rm) { Vcls(al, dt, rd, rm); }
7427 
7428   void Vclt(Condition cond,
7429             DataType dt,
7430             DRegister rd,
7431             DRegister rm,
7432             const DOperand& operand) {
7433     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7434     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7435     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7436     VIXL_ASSERT(allow_macro_instructions_);
7437     VIXL_ASSERT(OutsideITBlock());
7438     MacroEmissionCheckScope guard(this);
7439 #ifndef PANDA_BUILD
7440     ITScope it_scope(this, &cond, guard);
7441 #else
7442     ITScope it_scope(allocator_, this, &cond, guard);
7443 #endif
7444     vclt(cond, dt, rd, rm, operand);
7445   }
7446   void Vclt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
7447     Vclt(al, dt, rd, rm, operand);
7448   }
7449 
7450   void Vclt(Condition cond,
7451             DataType dt,
7452             QRegister rd,
7453             QRegister rm,
7454             const QOperand& operand) {
7455     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7456     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7457     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7458     VIXL_ASSERT(allow_macro_instructions_);
7459     VIXL_ASSERT(OutsideITBlock());
7460     MacroEmissionCheckScope guard(this);
7461 #ifndef PANDA_BUILD
7462     ITScope it_scope(this, &cond, guard);
7463 #else
7464     ITScope it_scope(allocator_, this, &cond, guard);
7465 #endif
7466     vclt(cond, dt, rd, rm, operand);
7467   }
7468   void Vclt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
7469     Vclt(al, dt, rd, rm, operand);
7470   }
7471 
7472   void Vclt(
7473       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7474     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7475     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7477     VIXL_ASSERT(allow_macro_instructions_);
7478     VIXL_ASSERT(OutsideITBlock());
7479     MacroEmissionCheckScope guard(this);
7480 #ifndef PANDA_BUILD
7481     ITScope it_scope(this, &cond, guard);
7482 #else
7483     ITScope it_scope(allocator_, this, &cond, guard);
7484 #endif
7485     vclt(cond, dt, rd, rn, rm);
7486   }
7487   void Vclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7488     Vclt(al, dt, rd, rn, rm);
7489   }
7490 
7491   void Vclt(
7492       Condition cond, 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 #ifndef PANDA_BUILD
7500     ITScope it_scope(this, &cond, guard);
7501 #else
7502     ITScope it_scope(allocator_, this, &cond, guard);
7503 #endif
7504     vclt(cond, dt, rd, rn, rm);
7505   }
7506   void Vclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7507     Vclt(al, dt, rd, rn, rm);
7508   }
7509 
7510   void Vclz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
7511     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7512     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7513     VIXL_ASSERT(allow_macro_instructions_);
7514     VIXL_ASSERT(OutsideITBlock());
7515     MacroEmissionCheckScope guard(this);
7516 #ifndef PANDA_BUILD
7517     ITScope it_scope(this, &cond, guard);
7518 #else
7519     ITScope it_scope(allocator_, this, &cond, guard);
7520 #endif
7521     vclz(cond, dt, rd, rm);
7522   }
7523   void Vclz(DataType dt, DRegister rd, DRegister rm) { Vclz(al, dt, rd, rm); }
7524 
7525   void Vclz(Condition cond, DataType dt, QRegister rd, QRegister rm) {
7526     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7527     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7528     VIXL_ASSERT(allow_macro_instructions_);
7529     VIXL_ASSERT(OutsideITBlock());
7530     MacroEmissionCheckScope guard(this);
7531 #ifndef PANDA_BUILD
7532     ITScope it_scope(this, &cond, guard);
7533 #else
7534     ITScope it_scope(allocator_, this, &cond, guard);
7535 #endif
7536     vclz(cond, dt, rd, rm);
7537   }
7538   void Vclz(DataType dt, QRegister rd, QRegister rm) { Vclz(al, dt, rd, rm); }
7539 
7540   void Vcmp(Condition cond,
7541             DataType dt,
7542             SRegister rd,
7543             const SOperand& operand) {
7544     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7545     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7546     VIXL_ASSERT(allow_macro_instructions_);
7547     VIXL_ASSERT(OutsideITBlock());
7548     MacroEmissionCheckScope guard(this);
7549 #ifndef PANDA_BUILD
7550     ITScope it_scope(this, &cond, guard);
7551 #else
7552     ITScope it_scope(allocator_, this, &cond, guard);
7553 #endif
7554     vcmp(cond, dt, rd, operand);
7555   }
7556   void Vcmp(DataType dt, SRegister rd, const SOperand& operand) {
7557     Vcmp(al, dt, rd, operand);
7558   }
7559 
7560   void Vcmp(Condition cond,
7561             DataType dt,
7562             DRegister rd,
7563             const DOperand& operand) {
7564     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7565     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7566     VIXL_ASSERT(allow_macro_instructions_);
7567     VIXL_ASSERT(OutsideITBlock());
7568     MacroEmissionCheckScope guard(this);
7569 #ifndef PANDA_BUILD
7570     ITScope it_scope(this, &cond, guard);
7571 #else
7572     ITScope it_scope(allocator_, this, &cond, guard);
7573 #endif
7574     vcmp(cond, dt, rd, operand);
7575   }
7576   void Vcmp(DataType dt, DRegister rd, const DOperand& operand) {
7577     Vcmp(al, dt, rd, operand);
7578   }
7579 
7580   void Vcmpe(Condition cond,
7581              DataType dt,
7582              SRegister rd,
7583              const SOperand& operand) {
7584     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7585     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7586     VIXL_ASSERT(allow_macro_instructions_);
7587     VIXL_ASSERT(OutsideITBlock());
7588     MacroEmissionCheckScope guard(this);
7589 #ifndef PANDA_BUILD
7590     ITScope it_scope(this, &cond, guard);
7591 #else
7592     ITScope it_scope(allocator_, this, &cond, guard);
7593 #endif
7594     vcmpe(cond, dt, rd, operand);
7595   }
7596   void Vcmpe(DataType dt, SRegister rd, const SOperand& operand) {
7597     Vcmpe(al, dt, rd, operand);
7598   }
7599 
7600   void Vcmpe(Condition cond,
7601              DataType dt,
7602              DRegister rd,
7603              const DOperand& operand) {
7604     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7605     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7606     VIXL_ASSERT(allow_macro_instructions_);
7607     VIXL_ASSERT(OutsideITBlock());
7608     MacroEmissionCheckScope guard(this);
7609 #ifndef PANDA_BUILD
7610     ITScope it_scope(this, &cond, guard);
7611 #else
7612     ITScope it_scope(allocator_, this, &cond, guard);
7613 #endif
7614     vcmpe(cond, dt, rd, operand);
7615   }
7616   void Vcmpe(DataType dt, DRegister rd, const DOperand& operand) {
7617     Vcmpe(al, dt, rd, operand);
7618   }
7619 
7620   void Vcnt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
7621     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7622     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7623     VIXL_ASSERT(allow_macro_instructions_);
7624     VIXL_ASSERT(OutsideITBlock());
7625     MacroEmissionCheckScope guard(this);
7626 #ifndef PANDA_BUILD
7627     ITScope it_scope(this, &cond, guard);
7628 #else
7629     ITScope it_scope(allocator_, this, &cond, guard);
7630 #endif
7631     vcnt(cond, dt, rd, rm);
7632   }
7633   void Vcnt(DataType dt, DRegister rd, DRegister rm) { Vcnt(al, dt, rd, rm); }
7634 
7635   void Vcnt(Condition cond, DataType dt, QRegister rd, QRegister rm) {
7636     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7637     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7638     VIXL_ASSERT(allow_macro_instructions_);
7639     VIXL_ASSERT(OutsideITBlock());
7640     MacroEmissionCheckScope guard(this);
7641 #ifndef PANDA_BUILD
7642     ITScope it_scope(this, &cond, guard);
7643 #else
7644     ITScope it_scope(allocator_, this, &cond, guard);
7645 #endif
7646     vcnt(cond, dt, rd, rm);
7647   }
7648   void Vcnt(DataType dt, QRegister rd, QRegister rm) { Vcnt(al, dt, rd, rm); }
7649 
7650   void Vcvt(
7651       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
7652     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7653     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7654     VIXL_ASSERT(allow_macro_instructions_);
7655     VIXL_ASSERT(OutsideITBlock());
7656     MacroEmissionCheckScope guard(this);
7657 #ifndef PANDA_BUILD
7658     ITScope it_scope(this, &cond, guard);
7659 #else
7660     ITScope it_scope(allocator_, this, &cond, guard);
7661 #endif
7662     vcvt(cond, dt1, dt2, rd, rm);
7663   }
7664   void Vcvt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
7665     Vcvt(al, dt1, dt2, rd, rm);
7666   }
7667 
7668   void Vcvt(
7669       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
7670     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7671     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7672     VIXL_ASSERT(allow_macro_instructions_);
7673     VIXL_ASSERT(OutsideITBlock());
7674     MacroEmissionCheckScope guard(this);
7675 #ifndef PANDA_BUILD
7676     ITScope it_scope(this, &cond, guard);
7677 #else
7678     ITScope it_scope(allocator_, this, &cond, guard);
7679 #endif
7680     vcvt(cond, dt1, dt2, rd, rm);
7681   }
7682   void Vcvt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
7683     Vcvt(al, dt1, dt2, rd, rm);
7684   }
7685 
7686   void Vcvt(Condition cond,
7687             DataType dt1,
7688             DataType dt2,
7689             DRegister rd,
7690             DRegister rm,
7691             int32_t fbits) {
7692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7693     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7694     VIXL_ASSERT(allow_macro_instructions_);
7695     VIXL_ASSERT(OutsideITBlock());
7696     MacroEmissionCheckScope guard(this);
7697 #ifndef PANDA_BUILD
7698     ITScope it_scope(this, &cond, guard);
7699 #else
7700     ITScope it_scope(allocator_, this, &cond, guard);
7701 #endif
7702     vcvt(cond, dt1, dt2, rd, rm, fbits);
7703   }
7704   void Vcvt(
7705       DataType dt1, DataType dt2, DRegister rd, DRegister rm, int32_t fbits) {
7706     Vcvt(al, dt1, dt2, rd, rm, fbits);
7707   }
7708 
7709   void Vcvt(Condition cond,
7710             DataType dt1,
7711             DataType dt2,
7712             QRegister rd,
7713             QRegister rm,
7714             int32_t fbits) {
7715     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7716     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7717     VIXL_ASSERT(allow_macro_instructions_);
7718     VIXL_ASSERT(OutsideITBlock());
7719     MacroEmissionCheckScope guard(this);
7720 #ifndef PANDA_BUILD
7721     ITScope it_scope(this, &cond, guard);
7722 #else
7723     ITScope it_scope(allocator_, this, &cond, guard);
7724 #endif
7725     vcvt(cond, dt1, dt2, rd, rm, fbits);
7726   }
7727   void Vcvt(
7728       DataType dt1, DataType dt2, QRegister rd, QRegister rm, int32_t fbits) {
7729     Vcvt(al, dt1, dt2, rd, rm, fbits);
7730   }
7731 
7732   void Vcvt(Condition cond,
7733             DataType dt1,
7734             DataType dt2,
7735             SRegister rd,
7736             SRegister rm,
7737             int32_t fbits) {
7738     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7739     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7740     VIXL_ASSERT(allow_macro_instructions_);
7741     VIXL_ASSERT(OutsideITBlock());
7742     MacroEmissionCheckScope guard(this);
7743 #ifndef PANDA_BUILD
7744     ITScope it_scope(this, &cond, guard);
7745 #else
7746     ITScope it_scope(allocator_, this, &cond, guard);
7747 #endif
7748     vcvt(cond, dt1, dt2, rd, rm, fbits);
7749   }
7750   void Vcvt(
7751       DataType dt1, DataType dt2, SRegister rd, SRegister rm, int32_t fbits) {
7752     Vcvt(al, dt1, dt2, rd, rm, fbits);
7753   }
7754 
7755   void Vcvt(
7756       Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
7757     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7759     VIXL_ASSERT(allow_macro_instructions_);
7760     VIXL_ASSERT(OutsideITBlock());
7761     MacroEmissionCheckScope guard(this);
7762 #ifndef PANDA_BUILD
7763     ITScope it_scope(this, &cond, guard);
7764 #else
7765     ITScope it_scope(allocator_, this, &cond, guard);
7766 #endif
7767     vcvt(cond, dt1, dt2, rd, rm);
7768   }
7769   void Vcvt(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
7770     Vcvt(al, dt1, dt2, rd, rm);
7771   }
7772 
7773   void Vcvt(
7774       Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
7775     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7776     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7777     VIXL_ASSERT(allow_macro_instructions_);
7778     VIXL_ASSERT(OutsideITBlock());
7779     MacroEmissionCheckScope guard(this);
7780 #ifndef PANDA_BUILD
7781     ITScope it_scope(this, &cond, guard);
7782 #else
7783     ITScope it_scope(allocator_, this, &cond, guard);
7784 #endif
7785     vcvt(cond, dt1, dt2, rd, rm);
7786   }
7787   void Vcvt(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
7788     Vcvt(al, dt1, dt2, rd, rm);
7789   }
7790 
7791   void Vcvt(
7792       Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
7793     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7794     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7795     VIXL_ASSERT(allow_macro_instructions_);
7796     VIXL_ASSERT(OutsideITBlock());
7797     MacroEmissionCheckScope guard(this);
7798 #ifndef PANDA_BUILD
7799     ITScope it_scope(this, &cond, guard);
7800 #else
7801     ITScope it_scope(allocator_, this, &cond, guard);
7802 #endif
7803     vcvt(cond, dt1, dt2, rd, rm);
7804   }
7805   void Vcvt(DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
7806     Vcvt(al, dt1, dt2, rd, rm);
7807   }
7808 
7809   void Vcvt(
7810       Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
7811     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7812     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7813     VIXL_ASSERT(allow_macro_instructions_);
7814     VIXL_ASSERT(OutsideITBlock());
7815     MacroEmissionCheckScope guard(this);
7816 #ifndef PANDA_BUILD
7817     ITScope it_scope(this, &cond, guard);
7818 #else
7819     ITScope it_scope(allocator_, this, &cond, guard);
7820 #endif
7821     vcvt(cond, dt1, dt2, rd, rm);
7822   }
7823   void Vcvt(DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
7824     Vcvt(al, dt1, dt2, rd, rm);
7825   }
7826 
7827   void Vcvt(
7828       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
7829     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7830     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7831     VIXL_ASSERT(allow_macro_instructions_);
7832     VIXL_ASSERT(OutsideITBlock());
7833     MacroEmissionCheckScope guard(this);
7834 #ifndef PANDA_BUILD
7835     ITScope it_scope(this, &cond, guard);
7836 #else
7837     ITScope it_scope(allocator_, this, &cond, guard);
7838 #endif
7839     vcvt(cond, dt1, dt2, rd, rm);
7840   }
7841   void Vcvt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
7842     Vcvt(al, dt1, dt2, rd, rm);
7843   }
7844 
7845   void Vcvta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
7846     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7847     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7848     VIXL_ASSERT(allow_macro_instructions_);
7849     VIXL_ASSERT(OutsideITBlock());
7850     MacroEmissionCheckScope guard(this);
7851     vcvta(dt1, dt2, rd, rm);
7852   }
7853 
7854   void Vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
7855     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7856     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7857     VIXL_ASSERT(allow_macro_instructions_);
7858     VIXL_ASSERT(OutsideITBlock());
7859     MacroEmissionCheckScope guard(this);
7860     vcvta(dt1, dt2, rd, rm);
7861   }
7862 
7863   void Vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
7864     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7865     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7866     VIXL_ASSERT(allow_macro_instructions_);
7867     VIXL_ASSERT(OutsideITBlock());
7868     MacroEmissionCheckScope guard(this);
7869     vcvta(dt1, dt2, rd, rm);
7870   }
7871 
7872   void Vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
7873     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7874     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7875     VIXL_ASSERT(allow_macro_instructions_);
7876     VIXL_ASSERT(OutsideITBlock());
7877     MacroEmissionCheckScope guard(this);
7878     vcvta(dt1, dt2, rd, rm);
7879   }
7880 
7881   void Vcvtb(
7882       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
7883     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7884     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7885     VIXL_ASSERT(allow_macro_instructions_);
7886     VIXL_ASSERT(OutsideITBlock());
7887     MacroEmissionCheckScope guard(this);
7888 #ifndef PANDA_BUILD
7889     ITScope it_scope(this, &cond, guard);
7890 #else
7891     ITScope it_scope(allocator_, this, &cond, guard);
7892 #endif
7893     vcvtb(cond, dt1, dt2, rd, rm);
7894   }
7895   void Vcvtb(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
7896     Vcvtb(al, dt1, dt2, rd, rm);
7897   }
7898 
7899   void Vcvtb(
7900       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
7901     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7902     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7903     VIXL_ASSERT(allow_macro_instructions_);
7904     VIXL_ASSERT(OutsideITBlock());
7905     MacroEmissionCheckScope guard(this);
7906 #ifndef PANDA_BUILD
7907     ITScope it_scope(this, &cond, guard);
7908 #else
7909     ITScope it_scope(allocator_, this, &cond, guard);
7910 #endif
7911     vcvtb(cond, dt1, dt2, rd, rm);
7912   }
7913   void Vcvtb(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
7914     Vcvtb(al, dt1, dt2, rd, rm);
7915   }
7916 
7917   void Vcvtb(
7918       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
7919     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7920     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7921     VIXL_ASSERT(allow_macro_instructions_);
7922     VIXL_ASSERT(OutsideITBlock());
7923     MacroEmissionCheckScope guard(this);
7924 #ifndef PANDA_BUILD
7925     ITScope it_scope(this, &cond, guard);
7926 #else
7927     ITScope it_scope(allocator_, this, &cond, guard);
7928 #endif
7929     vcvtb(cond, dt1, dt2, rd, rm);
7930   }
7931   void Vcvtb(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
7932     Vcvtb(al, dt1, dt2, rd, rm);
7933   }
7934 
7935   void Vcvtm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
7936     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7937     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7938     VIXL_ASSERT(allow_macro_instructions_);
7939     VIXL_ASSERT(OutsideITBlock());
7940     MacroEmissionCheckScope guard(this);
7941     vcvtm(dt1, dt2, rd, rm);
7942   }
7943 
7944   void Vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
7945     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7946     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7947     VIXL_ASSERT(allow_macro_instructions_);
7948     VIXL_ASSERT(OutsideITBlock());
7949     MacroEmissionCheckScope guard(this);
7950     vcvtm(dt1, dt2, rd, rm);
7951   }
7952 
7953   void Vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
7954     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7955     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7956     VIXL_ASSERT(allow_macro_instructions_);
7957     VIXL_ASSERT(OutsideITBlock());
7958     MacroEmissionCheckScope guard(this);
7959     vcvtm(dt1, dt2, rd, rm);
7960   }
7961 
7962   void Vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
7963     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7964     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7965     VIXL_ASSERT(allow_macro_instructions_);
7966     VIXL_ASSERT(OutsideITBlock());
7967     MacroEmissionCheckScope guard(this);
7968     vcvtm(dt1, dt2, rd, rm);
7969   }
7970 
7971   void Vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
7972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7973     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7974     VIXL_ASSERT(allow_macro_instructions_);
7975     VIXL_ASSERT(OutsideITBlock());
7976     MacroEmissionCheckScope guard(this);
7977     vcvtn(dt1, dt2, rd, rm);
7978   }
7979 
7980   void Vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
7981     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7982     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7983     VIXL_ASSERT(allow_macro_instructions_);
7984     VIXL_ASSERT(OutsideITBlock());
7985     MacroEmissionCheckScope guard(this);
7986     vcvtn(dt1, dt2, rd, rm);
7987   }
7988 
7989   void Vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
7990     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7991     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7992     VIXL_ASSERT(allow_macro_instructions_);
7993     VIXL_ASSERT(OutsideITBlock());
7994     MacroEmissionCheckScope guard(this);
7995     vcvtn(dt1, dt2, rd, rm);
7996   }
7997 
7998   void Vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
7999     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8000     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8001     VIXL_ASSERT(allow_macro_instructions_);
8002     VIXL_ASSERT(OutsideITBlock());
8003     MacroEmissionCheckScope guard(this);
8004     vcvtn(dt1, dt2, rd, rm);
8005   }
8006 
8007   void Vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
8008     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8009     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8010     VIXL_ASSERT(allow_macro_instructions_);
8011     VIXL_ASSERT(OutsideITBlock());
8012     MacroEmissionCheckScope guard(this);
8013     vcvtp(dt1, dt2, rd, rm);
8014   }
8015 
8016   void Vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
8017     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8018     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8019     VIXL_ASSERT(allow_macro_instructions_);
8020     VIXL_ASSERT(OutsideITBlock());
8021     MacroEmissionCheckScope guard(this);
8022     vcvtp(dt1, dt2, rd, rm);
8023   }
8024 
8025   void Vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
8026     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8027     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8028     VIXL_ASSERT(allow_macro_instructions_);
8029     VIXL_ASSERT(OutsideITBlock());
8030     MacroEmissionCheckScope guard(this);
8031     vcvtp(dt1, dt2, rd, rm);
8032   }
8033 
8034   void Vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
8035     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8036     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8037     VIXL_ASSERT(allow_macro_instructions_);
8038     VIXL_ASSERT(OutsideITBlock());
8039     MacroEmissionCheckScope guard(this);
8040     vcvtp(dt1, dt2, rd, rm);
8041   }
8042 
8043   void Vcvtr(
8044       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
8045     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8046     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8047     VIXL_ASSERT(allow_macro_instructions_);
8048     VIXL_ASSERT(OutsideITBlock());
8049     MacroEmissionCheckScope guard(this);
8050 #ifndef PANDA_BUILD
8051     ITScope it_scope(this, &cond, guard);
8052 #else
8053     ITScope it_scope(allocator_, this, &cond, guard);
8054 #endif
8055     vcvtr(cond, dt1, dt2, rd, rm);
8056   }
8057   void Vcvtr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
8058     Vcvtr(al, dt1, dt2, rd, rm);
8059   }
8060 
8061   void Vcvtr(
8062       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
8063     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8064     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8065     VIXL_ASSERT(allow_macro_instructions_);
8066     VIXL_ASSERT(OutsideITBlock());
8067     MacroEmissionCheckScope guard(this);
8068 #ifndef PANDA_BUILD
8069     ITScope it_scope(this, &cond, guard);
8070 #else
8071     ITScope it_scope(allocator_, this, &cond, guard);
8072 #endif
8073     vcvtr(cond, dt1, dt2, rd, rm);
8074   }
8075   void Vcvtr(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
8076     Vcvtr(al, dt1, dt2, rd, rm);
8077   }
8078 
8079   void Vcvtt(
8080       Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
8081     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8082     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8083     VIXL_ASSERT(allow_macro_instructions_);
8084     VIXL_ASSERT(OutsideITBlock());
8085     MacroEmissionCheckScope guard(this);
8086 #ifndef PANDA_BUILD
8087     ITScope it_scope(this, &cond, guard);
8088 #else
8089     ITScope it_scope(allocator_, this, &cond, guard);
8090 #endif
8091     vcvtt(cond, dt1, dt2, rd, rm);
8092   }
8093   void Vcvtt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
8094     Vcvtt(al, dt1, dt2, rd, rm);
8095   }
8096 
8097   void Vcvtt(
8098       Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
8099     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8100     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8101     VIXL_ASSERT(allow_macro_instructions_);
8102     VIXL_ASSERT(OutsideITBlock());
8103     MacroEmissionCheckScope guard(this);
8104 #ifndef PANDA_BUILD
8105     ITScope it_scope(this, &cond, guard);
8106 #else
8107     ITScope it_scope(allocator_, this, &cond, guard);
8108 #endif
8109     vcvtt(cond, dt1, dt2, rd, rm);
8110   }
8111   void Vcvtt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
8112     Vcvtt(al, dt1, dt2, rd, rm);
8113   }
8114 
8115   void Vcvtt(
8116       Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
8117     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8118     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8119     VIXL_ASSERT(allow_macro_instructions_);
8120     VIXL_ASSERT(OutsideITBlock());
8121     MacroEmissionCheckScope guard(this);
8122 #ifndef PANDA_BUILD
8123     ITScope it_scope(this, &cond, guard);
8124 #else
8125     ITScope it_scope(allocator_, this, &cond, guard);
8126 #endif
8127     vcvtt(cond, dt1, dt2, rd, rm);
8128   }
8129   void Vcvtt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
8130     Vcvtt(al, dt1, dt2, rd, rm);
8131   }
8132 
8133   void Vdiv(
8134       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8135     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8136     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8137     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8138     VIXL_ASSERT(allow_macro_instructions_);
8139     VIXL_ASSERT(OutsideITBlock());
8140     MacroEmissionCheckScope guard(this);
8141 #ifndef PANDA_BUILD
8142     ITScope it_scope(this, &cond, guard);
8143 #else
8144     ITScope it_scope(allocator_, this, &cond, guard);
8145 #endif
8146     vdiv(cond, dt, rd, rn, rm);
8147   }
8148   void Vdiv(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8149     Vdiv(al, dt, rd, rn, rm);
8150   }
8151 
8152   void Vdiv(
8153       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8154     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8155     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8156     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8157     VIXL_ASSERT(allow_macro_instructions_);
8158     VIXL_ASSERT(OutsideITBlock());
8159     MacroEmissionCheckScope guard(this);
8160 #ifndef PANDA_BUILD
8161     ITScope it_scope(this, &cond, guard);
8162 #else
8163     ITScope it_scope(allocator_, this, &cond, guard);
8164 #endif
8165     vdiv(cond, dt, rd, rn, rm);
8166   }
8167   void Vdiv(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8168     Vdiv(al, dt, rd, rn, rm);
8169   }
8170 
8171   void Vdup(Condition cond, DataType dt, QRegister rd, Register rt) {
8172     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8173     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
8174     VIXL_ASSERT(allow_macro_instructions_);
8175     VIXL_ASSERT(OutsideITBlock());
8176     MacroEmissionCheckScope guard(this);
8177 #ifndef PANDA_BUILD
8178     ITScope it_scope(this, &cond, guard);
8179 #else
8180     ITScope it_scope(allocator_, this, &cond, guard);
8181 #endif
8182     vdup(cond, dt, rd, rt);
8183   }
8184   void Vdup(DataType dt, QRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
8185 
8186   void Vdup(Condition cond, DataType dt, DRegister rd, Register rt) {
8187     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8188     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
8189     VIXL_ASSERT(allow_macro_instructions_);
8190     VIXL_ASSERT(OutsideITBlock());
8191     MacroEmissionCheckScope guard(this);
8192 #ifndef PANDA_BUILD
8193     ITScope it_scope(this, &cond, guard);
8194 #else
8195     ITScope it_scope(allocator_, this, &cond, guard);
8196 #endif
8197     vdup(cond, dt, rd, rt);
8198   }
8199   void Vdup(DataType dt, DRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
8200 
8201   void Vdup(Condition cond, DataType dt, DRegister rd, DRegisterLane rm) {
8202     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8203     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8204     VIXL_ASSERT(allow_macro_instructions_);
8205     VIXL_ASSERT(OutsideITBlock());
8206     MacroEmissionCheckScope guard(this);
8207 #ifndef PANDA_BUILD
8208     ITScope it_scope(this, &cond, guard);
8209 #else
8210     ITScope it_scope(allocator_, this, &cond, guard);
8211 #endif
8212     vdup(cond, dt, rd, rm);
8213   }
8214   void Vdup(DataType dt, DRegister rd, DRegisterLane rm) {
8215     Vdup(al, dt, rd, rm);
8216   }
8217 
8218   void Vdup(Condition cond, DataType dt, QRegister rd, DRegisterLane rm) {
8219     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8220     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8221     VIXL_ASSERT(allow_macro_instructions_);
8222     VIXL_ASSERT(OutsideITBlock());
8223     MacroEmissionCheckScope guard(this);
8224 #ifndef PANDA_BUILD
8225     ITScope it_scope(this, &cond, guard);
8226 #else
8227     ITScope it_scope(allocator_, this, &cond, guard);
8228 #endif
8229     vdup(cond, dt, rd, rm);
8230   }
8231   void Vdup(DataType dt, QRegister rd, DRegisterLane rm) {
8232     Vdup(al, dt, rd, rm);
8233   }
8234 
8235   void Veor(
8236       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8237     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8238     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8239     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8240     VIXL_ASSERT(allow_macro_instructions_);
8241     VIXL_ASSERT(OutsideITBlock());
8242     MacroEmissionCheckScope guard(this);
8243 #ifndef PANDA_BUILD
8244     ITScope it_scope(this, &cond, guard);
8245 #else
8246     ITScope it_scope(allocator_, this, &cond, guard);
8247 #endif
8248     veor(cond, dt, rd, rn, rm);
8249   }
8250   void Veor(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8251     Veor(al, dt, rd, rn, rm);
8252   }
8253   void Veor(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
8254     Veor(cond, kDataTypeValueNone, rd, rn, rm);
8255   }
8256   void Veor(DRegister rd, DRegister rn, DRegister rm) {
8257     Veor(al, kDataTypeValueNone, rd, rn, rm);
8258   }
8259 
8260   void Veor(
8261       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8262     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8263     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8264     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8265     VIXL_ASSERT(allow_macro_instructions_);
8266     VIXL_ASSERT(OutsideITBlock());
8267     MacroEmissionCheckScope guard(this);
8268 #ifndef PANDA_BUILD
8269     ITScope it_scope(this, &cond, guard);
8270 #else
8271     ITScope it_scope(allocator_, this, &cond, guard);
8272 #endif
8273     veor(cond, dt, rd, rn, rm);
8274   }
8275   void Veor(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8276     Veor(al, dt, rd, rn, rm);
8277   }
8278   void Veor(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
8279     Veor(cond, kDataTypeValueNone, rd, rn, rm);
8280   }
8281   void Veor(QRegister rd, QRegister rn, QRegister rm) {
8282     Veor(al, kDataTypeValueNone, rd, rn, rm);
8283   }
8284 
8285   void Vext(Condition cond,
8286             DataType dt,
8287             DRegister rd,
8288             DRegister rn,
8289             DRegister rm,
8290             const DOperand& operand) {
8291     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8292     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8293     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8294     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8295     VIXL_ASSERT(allow_macro_instructions_);
8296     VIXL_ASSERT(OutsideITBlock());
8297     MacroEmissionCheckScope guard(this);
8298 #ifndef PANDA_BUILD
8299     ITScope it_scope(this, &cond, guard);
8300 #else
8301     ITScope it_scope(allocator_, this, &cond, guard);
8302 #endif
8303     vext(cond, dt, rd, rn, rm, operand);
8304   }
8305   void Vext(DataType dt,
8306             DRegister rd,
8307             DRegister rn,
8308             DRegister rm,
8309             const DOperand& operand) {
8310     Vext(al, dt, rd, rn, rm, operand);
8311   }
8312 
8313   void Vext(Condition cond,
8314             DataType dt,
8315             QRegister rd,
8316             QRegister rn,
8317             QRegister rm,
8318             const QOperand& operand) {
8319     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8320     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8321     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8322     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8323     VIXL_ASSERT(allow_macro_instructions_);
8324     VIXL_ASSERT(OutsideITBlock());
8325     MacroEmissionCheckScope guard(this);
8326 #ifndef PANDA_BUILD
8327     ITScope it_scope(this, &cond, guard);
8328 #else
8329     ITScope it_scope(allocator_, this, &cond, guard);
8330 #endif
8331     vext(cond, dt, rd, rn, rm, operand);
8332   }
8333   void Vext(DataType dt,
8334             QRegister rd,
8335             QRegister rn,
8336             QRegister rm,
8337             const QOperand& operand) {
8338     Vext(al, dt, rd, rn, rm, operand);
8339   }
8340 
8341   void Vfma(
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 #ifndef PANDA_BUILD
8350     ITScope it_scope(this, &cond, guard);
8351 #else
8352     ITScope it_scope(allocator_, this, &cond, guard);
8353 #endif
8354     vfma(cond, dt, rd, rn, rm);
8355   }
8356   void Vfma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8357     Vfma(al, dt, rd, rn, rm);
8358   }
8359 
8360   void Vfma(
8361       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8362     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8363     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8364     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8365     VIXL_ASSERT(allow_macro_instructions_);
8366     VIXL_ASSERT(OutsideITBlock());
8367     MacroEmissionCheckScope guard(this);
8368 #ifndef PANDA_BUILD
8369     ITScope it_scope(this, &cond, guard);
8370 #else
8371     ITScope it_scope(allocator_, this, &cond, guard);
8372 #endif
8373     vfma(cond, dt, rd, rn, rm);
8374   }
8375   void Vfma(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8376     Vfma(al, dt, rd, rn, rm);
8377   }
8378 
8379   void Vfma(
8380       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8382     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8383     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8384     VIXL_ASSERT(allow_macro_instructions_);
8385     VIXL_ASSERT(OutsideITBlock());
8386     MacroEmissionCheckScope guard(this);
8387 #ifndef PANDA_BUILD
8388     ITScope it_scope(this, &cond, guard);
8389 #else
8390     ITScope it_scope(allocator_, this, &cond, guard);
8391 #endif
8392     vfma(cond, dt, rd, rn, rm);
8393   }
8394   void Vfma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8395     Vfma(al, dt, rd, rn, rm);
8396   }
8397 
8398   void Vfms(
8399       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8400     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8401     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8402     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8403     VIXL_ASSERT(allow_macro_instructions_);
8404     VIXL_ASSERT(OutsideITBlock());
8405     MacroEmissionCheckScope guard(this);
8406 #ifndef PANDA_BUILD
8407     ITScope it_scope(this, &cond, guard);
8408 #else
8409     ITScope it_scope(allocator_, this, &cond, guard);
8410 #endif
8411     vfms(cond, dt, rd, rn, rm);
8412   }
8413   void Vfms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8414     Vfms(al, dt, rd, rn, rm);
8415   }
8416 
8417   void Vfms(
8418       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8419     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8420     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8421     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8422     VIXL_ASSERT(allow_macro_instructions_);
8423     VIXL_ASSERT(OutsideITBlock());
8424     MacroEmissionCheckScope guard(this);
8425 #ifndef PANDA_BUILD
8426     ITScope it_scope(this, &cond, guard);
8427 #else
8428     ITScope it_scope(allocator_, this, &cond, guard);
8429 #endif
8430     vfms(cond, dt, rd, rn, rm);
8431   }
8432   void Vfms(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8433     Vfms(al, dt, rd, rn, rm);
8434   }
8435 
8436   void Vfms(
8437       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8438     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8439     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8440     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8441     VIXL_ASSERT(allow_macro_instructions_);
8442     VIXL_ASSERT(OutsideITBlock());
8443     MacroEmissionCheckScope guard(this);
8444 #ifndef PANDA_BUILD
8445     ITScope it_scope(this, &cond, guard);
8446 #else
8447     ITScope it_scope(allocator_, this, &cond, guard);
8448 #endif
8449     vfms(cond, dt, rd, rn, rm);
8450   }
8451   void Vfms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8452     Vfms(al, dt, rd, rn, rm);
8453   }
8454 
8455   void Vfnma(
8456       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8457     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8458     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8459     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8460     VIXL_ASSERT(allow_macro_instructions_);
8461     VIXL_ASSERT(OutsideITBlock());
8462     MacroEmissionCheckScope guard(this);
8463 #ifndef PANDA_BUILD
8464     ITScope it_scope(this, &cond, guard);
8465 #else
8466     ITScope it_scope(allocator_, this, &cond, guard);
8467 #endif
8468     vfnma(cond, dt, rd, rn, rm);
8469   }
8470   void Vfnma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8471     Vfnma(al, dt, rd, rn, rm);
8472   }
8473 
8474   void Vfnma(
8475       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8477     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8478     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8479     VIXL_ASSERT(allow_macro_instructions_);
8480     VIXL_ASSERT(OutsideITBlock());
8481     MacroEmissionCheckScope guard(this);
8482 #ifndef PANDA_BUILD
8483     ITScope it_scope(this, &cond, guard);
8484 #else
8485     ITScope it_scope(allocator_, this, &cond, guard);
8486 #endif
8487     vfnma(cond, dt, rd, rn, rm);
8488   }
8489   void Vfnma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8490     Vfnma(al, dt, rd, rn, rm);
8491   }
8492 
8493   void Vfnms(
8494       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8495     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8496     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8497     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8498     VIXL_ASSERT(allow_macro_instructions_);
8499     VIXL_ASSERT(OutsideITBlock());
8500     MacroEmissionCheckScope guard(this);
8501 #ifndef PANDA_BUILD
8502     ITScope it_scope(this, &cond, guard);
8503 #else
8504     ITScope it_scope(allocator_, this, &cond, guard);
8505 #endif
8506     vfnms(cond, dt, rd, rn, rm);
8507   }
8508   void Vfnms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8509     Vfnms(al, dt, rd, rn, rm);
8510   }
8511 
8512   void Vfnms(
8513       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8514     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8515     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8516     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8517     VIXL_ASSERT(allow_macro_instructions_);
8518     VIXL_ASSERT(OutsideITBlock());
8519     MacroEmissionCheckScope guard(this);
8520 #ifndef PANDA_BUILD
8521     ITScope it_scope(this, &cond, guard);
8522 #else
8523     ITScope it_scope(allocator_, this, &cond, guard);
8524 #endif
8525     vfnms(cond, dt, rd, rn, rm);
8526   }
8527   void Vfnms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8528     Vfnms(al, dt, rd, rn, rm);
8529   }
8530 
8531   void Vhadd(
8532       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8533     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8535     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8536     VIXL_ASSERT(allow_macro_instructions_);
8537     VIXL_ASSERT(OutsideITBlock());
8538     MacroEmissionCheckScope guard(this);
8539 #ifndef PANDA_BUILD
8540     ITScope it_scope(this, &cond, guard);
8541 #else
8542     ITScope it_scope(allocator_, this, &cond, guard);
8543 #endif
8544     vhadd(cond, dt, rd, rn, rm);
8545   }
8546   void Vhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8547     Vhadd(al, dt, rd, rn, rm);
8548   }
8549 
8550   void Vhadd(
8551       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8552     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8553     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8554     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8555     VIXL_ASSERT(allow_macro_instructions_);
8556     VIXL_ASSERT(OutsideITBlock());
8557     MacroEmissionCheckScope guard(this);
8558 #ifndef PANDA_BUILD
8559     ITScope it_scope(this, &cond, guard);
8560 #else
8561     ITScope it_scope(allocator_, this, &cond, guard);
8562 #endif
8563     vhadd(cond, dt, rd, rn, rm);
8564   }
8565   void Vhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8566     Vhadd(al, dt, rd, rn, rm);
8567   }
8568 
8569   void Vhsub(
8570       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8571     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8572     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8574     VIXL_ASSERT(allow_macro_instructions_);
8575     VIXL_ASSERT(OutsideITBlock());
8576     MacroEmissionCheckScope guard(this);
8577 #ifndef PANDA_BUILD
8578     ITScope it_scope(this, &cond, guard);
8579 #else
8580     ITScope it_scope(allocator_, this, &cond, guard);
8581 #endif
8582     vhsub(cond, dt, rd, rn, rm);
8583   }
8584   void Vhsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8585     Vhsub(al, dt, rd, rn, rm);
8586   }
8587 
8588   void Vhsub(
8589       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8590     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8591     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8592     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8593     VIXL_ASSERT(allow_macro_instructions_);
8594     VIXL_ASSERT(OutsideITBlock());
8595     MacroEmissionCheckScope guard(this);
8596 #ifndef PANDA_BUILD
8597     ITScope it_scope(this, &cond, guard);
8598 #else
8599     ITScope it_scope(allocator_, this, &cond, guard);
8600 #endif
8601     vhsub(cond, dt, rd, rn, rm);
8602   }
8603   void Vhsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8604     Vhsub(al, dt, rd, rn, rm);
8605   }
8606 
8607   void Vld1(Condition cond,
8608             DataType dt,
8609             const NeonRegisterList& nreglist,
8610             const AlignedMemOperand& operand) {
8611     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
8612     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8613     VIXL_ASSERT(allow_macro_instructions_);
8614     VIXL_ASSERT(OutsideITBlock());
8615     MacroEmissionCheckScope guard(this);
8616 #ifndef PANDA_BUILD
8617     ITScope it_scope(this, &cond, guard);
8618 #else
8619     ITScope it_scope(allocator_, this, &cond, guard);
8620 #endif
8621     vld1(cond, dt, nreglist, operand);
8622   }
8623   void Vld1(DataType dt,
8624             const NeonRegisterList& nreglist,
8625             const AlignedMemOperand& operand) {
8626     Vld1(al, dt, nreglist, operand);
8627   }
8628 
8629   void Vld2(Condition cond,
8630             DataType dt,
8631             const NeonRegisterList& nreglist,
8632             const AlignedMemOperand& operand) {
8633     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
8634     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8635     VIXL_ASSERT(allow_macro_instructions_);
8636     VIXL_ASSERT(OutsideITBlock());
8637     MacroEmissionCheckScope guard(this);
8638 #ifndef PANDA_BUILD
8639     ITScope it_scope(this, &cond, guard);
8640 #else
8641     ITScope it_scope(allocator_, this, &cond, guard);
8642 #endif
8643     vld2(cond, dt, nreglist, operand);
8644   }
8645   void Vld2(DataType dt,
8646             const NeonRegisterList& nreglist,
8647             const AlignedMemOperand& operand) {
8648     Vld2(al, dt, nreglist, operand);
8649   }
8650 
8651   void Vld3(Condition cond,
8652             DataType dt,
8653             const NeonRegisterList& nreglist,
8654             const AlignedMemOperand& operand) {
8655     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
8656     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8657     VIXL_ASSERT(allow_macro_instructions_);
8658     VIXL_ASSERT(OutsideITBlock());
8659     MacroEmissionCheckScope guard(this);
8660 #ifndef PANDA_BUILD
8661     ITScope it_scope(this, &cond, guard);
8662 #else
8663     ITScope it_scope(allocator_, this, &cond, guard);
8664 #endif
8665     vld3(cond, dt, nreglist, operand);
8666   }
8667   void Vld3(DataType dt,
8668             const NeonRegisterList& nreglist,
8669             const AlignedMemOperand& operand) {
8670     Vld3(al, dt, nreglist, operand);
8671   }
8672 
8673   void Vld3(Condition cond,
8674             DataType dt,
8675             const NeonRegisterList& nreglist,
8676             const MemOperand& operand) {
8677     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
8678     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8679     VIXL_ASSERT(allow_macro_instructions_);
8680     VIXL_ASSERT(OutsideITBlock());
8681     MacroEmissionCheckScope guard(this);
8682 #ifndef PANDA_BUILD
8683     ITScope it_scope(this, &cond, guard);
8684 #else
8685     ITScope it_scope(allocator_, this, &cond, guard);
8686 #endif
8687     vld3(cond, dt, nreglist, operand);
8688   }
8689   void Vld3(DataType dt,
8690             const NeonRegisterList& nreglist,
8691             const MemOperand& operand) {
8692     Vld3(al, dt, nreglist, operand);
8693   }
8694 
8695   void Vld4(Condition cond,
8696             DataType dt,
8697             const NeonRegisterList& nreglist,
8698             const AlignedMemOperand& operand) {
8699     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
8700     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8701     VIXL_ASSERT(allow_macro_instructions_);
8702     VIXL_ASSERT(OutsideITBlock());
8703     MacroEmissionCheckScope guard(this);
8704 #ifndef PANDA_BUILD
8705     ITScope it_scope(this, &cond, guard);
8706 #else
8707     ITScope it_scope(allocator_, this, &cond, guard);
8708 #endif
8709     vld4(cond, dt, nreglist, operand);
8710   }
8711   void Vld4(DataType dt,
8712             const NeonRegisterList& nreglist,
8713             const AlignedMemOperand& operand) {
8714     Vld4(al, dt, nreglist, operand);
8715   }
8716 
8717   void Vldm(Condition cond,
8718             DataType dt,
8719             Register rn,
8720             WriteBack write_back,
8721             DRegisterList dreglist) {
8722     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8723     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8724     VIXL_ASSERT(allow_macro_instructions_);
8725     VIXL_ASSERT(OutsideITBlock());
8726     MacroEmissionCheckScope guard(this);
8727 #ifndef PANDA_BUILD
8728     ITScope it_scope(this, &cond, guard);
8729 #else
8730     ITScope it_scope(allocator_, this, &cond, guard);
8731 #endif
8732     vldm(cond, dt, rn, write_back, dreglist);
8733   }
8734   void Vldm(DataType dt,
8735             Register rn,
8736             WriteBack write_back,
8737             DRegisterList dreglist) {
8738     Vldm(al, dt, rn, write_back, dreglist);
8739   }
8740   void Vldm(Condition cond,
8741             Register rn,
8742             WriteBack write_back,
8743             DRegisterList dreglist) {
8744     Vldm(cond, kDataTypeValueNone, rn, write_back, dreglist);
8745   }
8746   void Vldm(Register rn, WriteBack write_back, DRegisterList dreglist) {
8747     Vldm(al, kDataTypeValueNone, rn, write_back, dreglist);
8748   }
8749 
8750   void Vldm(Condition cond,
8751             DataType dt,
8752             Register rn,
8753             WriteBack write_back,
8754             SRegisterList sreglist) {
8755     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8756     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8757     VIXL_ASSERT(allow_macro_instructions_);
8758     VIXL_ASSERT(OutsideITBlock());
8759     MacroEmissionCheckScope guard(this);
8760 #ifndef PANDA_BUILD
8761     ITScope it_scope(this, &cond, guard);
8762 #else
8763     ITScope it_scope(allocator_, this, &cond, guard);
8764 #endif
8765     vldm(cond, dt, rn, write_back, sreglist);
8766   }
8767   void Vldm(DataType dt,
8768             Register rn,
8769             WriteBack write_back,
8770             SRegisterList sreglist) {
8771     Vldm(al, dt, rn, write_back, sreglist);
8772   }
8773   void Vldm(Condition cond,
8774             Register rn,
8775             WriteBack write_back,
8776             SRegisterList sreglist) {
8777     Vldm(cond, kDataTypeValueNone, rn, write_back, sreglist);
8778   }
8779   void Vldm(Register rn, WriteBack write_back, SRegisterList sreglist) {
8780     Vldm(al, kDataTypeValueNone, rn, write_back, sreglist);
8781   }
8782 
8783   void Vldmdb(Condition cond,
8784               DataType dt,
8785               Register rn,
8786               WriteBack write_back,
8787               DRegisterList dreglist) {
8788     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8789     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8790     VIXL_ASSERT(allow_macro_instructions_);
8791     VIXL_ASSERT(OutsideITBlock());
8792     MacroEmissionCheckScope guard(this);
8793 #ifndef PANDA_BUILD
8794     ITScope it_scope(this, &cond, guard);
8795 #else
8796     ITScope it_scope(allocator_, this, &cond, guard);
8797 #endif
8798     vldmdb(cond, dt, rn, write_back, dreglist);
8799   }
8800   void Vldmdb(DataType dt,
8801               Register rn,
8802               WriteBack write_back,
8803               DRegisterList dreglist) {
8804     Vldmdb(al, dt, rn, write_back, dreglist);
8805   }
8806   void Vldmdb(Condition cond,
8807               Register rn,
8808               WriteBack write_back,
8809               DRegisterList dreglist) {
8810     Vldmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
8811   }
8812   void Vldmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
8813     Vldmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
8814   }
8815 
8816   void Vldmdb(Condition cond,
8817               DataType dt,
8818               Register rn,
8819               WriteBack write_back,
8820               SRegisterList sreglist) {
8821     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8822     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8823     VIXL_ASSERT(allow_macro_instructions_);
8824     VIXL_ASSERT(OutsideITBlock());
8825     MacroEmissionCheckScope guard(this);
8826 #ifndef PANDA_BUILD
8827     ITScope it_scope(this, &cond, guard);
8828 #else
8829     ITScope it_scope(allocator_, this, &cond, guard);
8830 #endif
8831     vldmdb(cond, dt, rn, write_back, sreglist);
8832   }
8833   void Vldmdb(DataType dt,
8834               Register rn,
8835               WriteBack write_back,
8836               SRegisterList sreglist) {
8837     Vldmdb(al, dt, rn, write_back, sreglist);
8838   }
8839   void Vldmdb(Condition cond,
8840               Register rn,
8841               WriteBack write_back,
8842               SRegisterList sreglist) {
8843     Vldmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
8844   }
8845   void Vldmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
8846     Vldmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
8847   }
8848 
8849   void Vldmia(Condition cond,
8850               DataType dt,
8851               Register rn,
8852               WriteBack write_back,
8853               DRegisterList dreglist) {
8854     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8855     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8856     VIXL_ASSERT(allow_macro_instructions_);
8857     VIXL_ASSERT(OutsideITBlock());
8858     MacroEmissionCheckScope guard(this);
8859 #ifndef PANDA_BUILD
8860     ITScope it_scope(this, &cond, guard);
8861 #else
8862     ITScope it_scope(allocator_, this, &cond, guard);
8863 #endif
8864     vldmia(cond, dt, rn, write_back, dreglist);
8865   }
8866   void Vldmia(DataType dt,
8867               Register rn,
8868               WriteBack write_back,
8869               DRegisterList dreglist) {
8870     Vldmia(al, dt, rn, write_back, dreglist);
8871   }
8872   void Vldmia(Condition cond,
8873               Register rn,
8874               WriteBack write_back,
8875               DRegisterList dreglist) {
8876     Vldmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
8877   }
8878   void Vldmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
8879     Vldmia(al, kDataTypeValueNone, rn, write_back, dreglist);
8880   }
8881 
8882   void Vldmia(Condition cond,
8883               DataType dt,
8884               Register rn,
8885               WriteBack write_back,
8886               SRegisterList sreglist) {
8887     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8888     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8889     VIXL_ASSERT(allow_macro_instructions_);
8890     VIXL_ASSERT(OutsideITBlock());
8891     MacroEmissionCheckScope guard(this);
8892 #ifndef PANDA_BUILD
8893     ITScope it_scope(this, &cond, guard);
8894 #else
8895     ITScope it_scope(allocator_, this, &cond, guard);
8896 #endif
8897     vldmia(cond, dt, rn, write_back, sreglist);
8898   }
8899   void Vldmia(DataType dt,
8900               Register rn,
8901               WriteBack write_back,
8902               SRegisterList sreglist) {
8903     Vldmia(al, dt, rn, write_back, sreglist);
8904   }
8905   void Vldmia(Condition cond,
8906               Register rn,
8907               WriteBack write_back,
8908               SRegisterList sreglist) {
8909     Vldmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
8910   }
8911   void Vldmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
8912     Vldmia(al, kDataTypeValueNone, rn, write_back, sreglist);
8913   }
8914 
8915 
8916   void Vldr(Condition cond,
8917             DataType dt,
8918             DRegister rd,
8919             const MemOperand& operand) {
8920     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8921     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8922     VIXL_ASSERT(allow_macro_instructions_);
8923     VIXL_ASSERT(OutsideITBlock());
8924     MacroEmissionCheckScope guard(this);
8925 #ifndef PANDA_BUILD
8926     ITScope it_scope(this, &cond, guard);
8927 #else
8928     ITScope it_scope(allocator_, this, &cond, guard);
8929 #endif
8930     vldr(cond, dt, rd, operand);
8931   }
8932   void Vldr(DataType dt, DRegister rd, const MemOperand& operand) {
8933     Vldr(al, dt, rd, operand);
8934   }
8935   void Vldr(Condition cond, DRegister rd, const MemOperand& operand) {
8936     Vldr(cond, Untyped64, rd, operand);
8937   }
8938   void Vldr(DRegister rd, const MemOperand& operand) {
8939     Vldr(al, Untyped64, rd, operand);
8940   }
8941 
8942 
8943   void Vldr(Condition cond,
8944             DataType dt,
8945             SRegister rd,
8946             const MemOperand& operand) {
8947     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8948     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8949     VIXL_ASSERT(allow_macro_instructions_);
8950     VIXL_ASSERT(OutsideITBlock());
8951     MacroEmissionCheckScope guard(this);
8952 #ifndef PANDA_BUILD
8953     ITScope it_scope(this, &cond, guard);
8954 #else
8955     ITScope it_scope(allocator_, this, &cond, guard);
8956 #endif
8957     vldr(cond, dt, rd, operand);
8958   }
8959   void Vldr(DataType dt, SRegister rd, const MemOperand& operand) {
8960     Vldr(al, dt, rd, operand);
8961   }
8962   void Vldr(Condition cond, SRegister rd, const MemOperand& operand) {
8963     Vldr(cond, Untyped32, rd, operand);
8964   }
8965   void Vldr(SRegister rd, const MemOperand& operand) {
8966     Vldr(al, Untyped32, rd, operand);
8967   }
8968 
8969   void Vmax(
8970       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8971     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8973     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8974     VIXL_ASSERT(allow_macro_instructions_);
8975     VIXL_ASSERT(OutsideITBlock());
8976     MacroEmissionCheckScope guard(this);
8977 #ifndef PANDA_BUILD
8978     ITScope it_scope(this, &cond, guard);
8979 #else
8980     ITScope it_scope(allocator_, this, &cond, guard);
8981 #endif
8982     vmax(cond, dt, rd, rn, rm);
8983   }
8984   void Vmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8985     Vmax(al, dt, rd, rn, rm);
8986   }
8987 
8988   void Vmax(
8989       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8990     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8991     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8992     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8993     VIXL_ASSERT(allow_macro_instructions_);
8994     VIXL_ASSERT(OutsideITBlock());
8995     MacroEmissionCheckScope guard(this);
8996 #ifndef PANDA_BUILD
8997     ITScope it_scope(this, &cond, guard);
8998 #else
8999     ITScope it_scope(allocator_, this, &cond, guard);
9000 #endif
9001     vmax(cond, dt, rd, rn, rm);
9002   }
9003   void Vmax(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9004     Vmax(al, dt, rd, rn, rm);
9005   }
9006 
9007   void Vmaxnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9008     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9009     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9010     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9011     VIXL_ASSERT(allow_macro_instructions_);
9012     VIXL_ASSERT(OutsideITBlock());
9013     MacroEmissionCheckScope guard(this);
9014     vmaxnm(dt, rd, rn, rm);
9015   }
9016 
9017   void Vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9018     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9019     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9020     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9021     VIXL_ASSERT(allow_macro_instructions_);
9022     VIXL_ASSERT(OutsideITBlock());
9023     MacroEmissionCheckScope guard(this);
9024     vmaxnm(dt, rd, rn, rm);
9025   }
9026 
9027   void Vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9028     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9029     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9030     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9031     VIXL_ASSERT(allow_macro_instructions_);
9032     VIXL_ASSERT(OutsideITBlock());
9033     MacroEmissionCheckScope guard(this);
9034     vmaxnm(dt, rd, rn, rm);
9035   }
9036 
9037   void Vmin(
9038       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9039     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9040     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9041     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9042     VIXL_ASSERT(allow_macro_instructions_);
9043     VIXL_ASSERT(OutsideITBlock());
9044     MacroEmissionCheckScope guard(this);
9045 #ifndef PANDA_BUILD
9046     ITScope it_scope(this, &cond, guard);
9047 #else
9048     ITScope it_scope(allocator_, this, &cond, guard);
9049 #endif
9050     vmin(cond, dt, rd, rn, rm);
9051   }
9052   void Vmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9053     Vmin(al, dt, rd, rn, rm);
9054   }
9055 
9056   void Vmin(
9057       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9058     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9059     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9060     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9061     VIXL_ASSERT(allow_macro_instructions_);
9062     VIXL_ASSERT(OutsideITBlock());
9063     MacroEmissionCheckScope guard(this);
9064 #ifndef PANDA_BUILD
9065     ITScope it_scope(this, &cond, guard);
9066 #else
9067     ITScope it_scope(allocator_, this, &cond, guard);
9068 #endif
9069     vmin(cond, dt, rd, rn, rm);
9070   }
9071   void Vmin(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9072     Vmin(al, dt, rd, rn, rm);
9073   }
9074 
9075   void Vminnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9076     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9077     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9078     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9079     VIXL_ASSERT(allow_macro_instructions_);
9080     VIXL_ASSERT(OutsideITBlock());
9081     MacroEmissionCheckScope guard(this);
9082     vminnm(dt, rd, rn, rm);
9083   }
9084 
9085   void Vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9086     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9087     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9088     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9089     VIXL_ASSERT(allow_macro_instructions_);
9090     VIXL_ASSERT(OutsideITBlock());
9091     MacroEmissionCheckScope guard(this);
9092     vminnm(dt, rd, rn, rm);
9093   }
9094 
9095   void Vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9096     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9097     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9098     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9099     VIXL_ASSERT(allow_macro_instructions_);
9100     VIXL_ASSERT(OutsideITBlock());
9101     MacroEmissionCheckScope guard(this);
9102     vminnm(dt, rd, rn, rm);
9103   }
9104 
9105   void Vmla(Condition cond,
9106             DataType dt,
9107             DRegister rd,
9108             DRegister rn,
9109             DRegisterLane rm) {
9110     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9111     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9112     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9113     VIXL_ASSERT(allow_macro_instructions_);
9114     VIXL_ASSERT(OutsideITBlock());
9115     MacroEmissionCheckScope guard(this);
9116 #ifndef PANDA_BUILD
9117     ITScope it_scope(this, &cond, guard);
9118 #else
9119     ITScope it_scope(allocator_, this, &cond, guard);
9120 #endif
9121     vmla(cond, dt, rd, rn, rm);
9122   }
9123   void Vmla(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
9124     Vmla(al, dt, rd, rn, rm);
9125   }
9126 
9127   void Vmla(Condition cond,
9128             DataType dt,
9129             QRegister rd,
9130             QRegister rn,
9131             DRegisterLane rm) {
9132     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9133     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9134     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9135     VIXL_ASSERT(allow_macro_instructions_);
9136     VIXL_ASSERT(OutsideITBlock());
9137     MacroEmissionCheckScope guard(this);
9138 #ifndef PANDA_BUILD
9139     ITScope it_scope(this, &cond, guard);
9140 #else
9141     ITScope it_scope(allocator_, this, &cond, guard);
9142 #endif
9143     vmla(cond, dt, rd, rn, rm);
9144   }
9145   void Vmla(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
9146     Vmla(al, dt, rd, rn, rm);
9147   }
9148 
9149   void Vmla(
9150       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9151     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9152     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9153     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9154     VIXL_ASSERT(allow_macro_instructions_);
9155     VIXL_ASSERT(OutsideITBlock());
9156     MacroEmissionCheckScope guard(this);
9157 #ifndef PANDA_BUILD
9158     ITScope it_scope(this, &cond, guard);
9159 #else
9160     ITScope it_scope(allocator_, this, &cond, guard);
9161 #endif
9162     vmla(cond, dt, rd, rn, rm);
9163   }
9164   void Vmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9165     Vmla(al, dt, rd, rn, rm);
9166   }
9167 
9168   void Vmla(
9169       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9170     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9171     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9172     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9173     VIXL_ASSERT(allow_macro_instructions_);
9174     VIXL_ASSERT(OutsideITBlock());
9175     MacroEmissionCheckScope guard(this);
9176 #ifndef PANDA_BUILD
9177     ITScope it_scope(this, &cond, guard);
9178 #else
9179     ITScope it_scope(allocator_, this, &cond, guard);
9180 #endif
9181     vmla(cond, dt, rd, rn, rm);
9182   }
9183   void Vmla(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9184     Vmla(al, dt, rd, rn, rm);
9185   }
9186 
9187   void Vmla(
9188       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9189     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9190     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9191     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9192     VIXL_ASSERT(allow_macro_instructions_);
9193     VIXL_ASSERT(OutsideITBlock());
9194     MacroEmissionCheckScope guard(this);
9195 #ifndef PANDA_BUILD
9196     ITScope it_scope(this, &cond, guard);
9197 #else
9198     ITScope it_scope(allocator_, this, &cond, guard);
9199 #endif
9200     vmla(cond, dt, rd, rn, rm);
9201   }
9202   void Vmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9203     Vmla(al, dt, rd, rn, rm);
9204   }
9205 
9206   void Vmlal(Condition cond,
9207              DataType dt,
9208              QRegister rd,
9209              DRegister rn,
9210              DRegisterLane rm) {
9211     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9212     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9213     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9214     VIXL_ASSERT(allow_macro_instructions_);
9215     VIXL_ASSERT(OutsideITBlock());
9216     MacroEmissionCheckScope guard(this);
9217 #ifndef PANDA_BUILD
9218     ITScope it_scope(this, &cond, guard);
9219 #else
9220     ITScope it_scope(allocator_, this, &cond, guard);
9221 #endif
9222     vmlal(cond, dt, rd, rn, rm);
9223   }
9224   void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
9225     Vmlal(al, dt, rd, rn, rm);
9226   }
9227 
9228   void Vmlal(
9229       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
9230     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9231     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9232     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9233     VIXL_ASSERT(allow_macro_instructions_);
9234     VIXL_ASSERT(OutsideITBlock());
9235     MacroEmissionCheckScope guard(this);
9236 #ifndef PANDA_BUILD
9237     ITScope it_scope(this, &cond, guard);
9238 #else
9239     ITScope it_scope(allocator_, this, &cond, guard);
9240 #endif
9241     vmlal(cond, dt, rd, rn, rm);
9242   }
9243   void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
9244     Vmlal(al, dt, rd, rn, rm);
9245   }
9246 
9247   void Vmls(Condition cond,
9248             DataType dt,
9249             DRegister rd,
9250             DRegister rn,
9251             DRegisterLane rm) {
9252     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9253     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9254     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9255     VIXL_ASSERT(allow_macro_instructions_);
9256     VIXL_ASSERT(OutsideITBlock());
9257     MacroEmissionCheckScope guard(this);
9258 #ifndef PANDA_BUILD
9259     ITScope it_scope(this, &cond, guard);
9260 #else
9261     ITScope it_scope(allocator_, this, &cond, guard);
9262 #endif
9263     vmls(cond, dt, rd, rn, rm);
9264   }
9265   void Vmls(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
9266     Vmls(al, dt, rd, rn, rm);
9267   }
9268 
9269   void Vmls(Condition cond,
9270             DataType dt,
9271             QRegister rd,
9272             QRegister rn,
9273             DRegisterLane rm) {
9274     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9275     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9276     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9277     VIXL_ASSERT(allow_macro_instructions_);
9278     VIXL_ASSERT(OutsideITBlock());
9279     MacroEmissionCheckScope guard(this);
9280 #ifndef PANDA_BUILD
9281     ITScope it_scope(this, &cond, guard);
9282 #else
9283     ITScope it_scope(allocator_, this, &cond, guard);
9284 #endif
9285     vmls(cond, dt, rd, rn, rm);
9286   }
9287   void Vmls(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
9288     Vmls(al, dt, rd, rn, rm);
9289   }
9290 
9291   void Vmls(
9292       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9293     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9294     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9295     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9296     VIXL_ASSERT(allow_macro_instructions_);
9297     VIXL_ASSERT(OutsideITBlock());
9298     MacroEmissionCheckScope guard(this);
9299 #ifndef PANDA_BUILD
9300     ITScope it_scope(this, &cond, guard);
9301 #else
9302     ITScope it_scope(allocator_, this, &cond, guard);
9303 #endif
9304     vmls(cond, dt, rd, rn, rm);
9305   }
9306   void Vmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9307     Vmls(al, dt, rd, rn, rm);
9308   }
9309 
9310   void Vmls(
9311       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9312     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9313     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9314     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9315     VIXL_ASSERT(allow_macro_instructions_);
9316     VIXL_ASSERT(OutsideITBlock());
9317     MacroEmissionCheckScope guard(this);
9318 #ifndef PANDA_BUILD
9319     ITScope it_scope(this, &cond, guard);
9320 #else
9321     ITScope it_scope(allocator_, this, &cond, guard);
9322 #endif
9323     vmls(cond, dt, rd, rn, rm);
9324   }
9325   void Vmls(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9326     Vmls(al, dt, rd, rn, rm);
9327   }
9328 
9329   void Vmls(
9330       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9331     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9332     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9333     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9334     VIXL_ASSERT(allow_macro_instructions_);
9335     VIXL_ASSERT(OutsideITBlock());
9336     MacroEmissionCheckScope guard(this);
9337 #ifndef PANDA_BUILD
9338     ITScope it_scope(this, &cond, guard);
9339 #else
9340     ITScope it_scope(allocator_, this, &cond, guard);
9341 #endif
9342     vmls(cond, dt, rd, rn, rm);
9343   }
9344   void Vmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9345     Vmls(al, dt, rd, rn, rm);
9346   }
9347 
9348   void Vmlsl(Condition cond,
9349              DataType dt,
9350              QRegister rd,
9351              DRegister rn,
9352              DRegisterLane rm) {
9353     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9354     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9355     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9356     VIXL_ASSERT(allow_macro_instructions_);
9357     VIXL_ASSERT(OutsideITBlock());
9358     MacroEmissionCheckScope guard(this);
9359 #ifndef PANDA_BUILD
9360     ITScope it_scope(this, &cond, guard);
9361 #else
9362     ITScope it_scope(allocator_, this, &cond, guard);
9363 #endif
9364     vmlsl(cond, dt, rd, rn, rm);
9365   }
9366   void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
9367     Vmlsl(al, dt, rd, rn, rm);
9368   }
9369 
9370   void Vmlsl(
9371       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
9372     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9373     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9374     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9375     VIXL_ASSERT(allow_macro_instructions_);
9376     VIXL_ASSERT(OutsideITBlock());
9377     MacroEmissionCheckScope guard(this);
9378 #ifndef PANDA_BUILD
9379     ITScope it_scope(this, &cond, guard);
9380 #else
9381     ITScope it_scope(allocator_, this, &cond, guard);
9382 #endif
9383     vmlsl(cond, dt, rd, rn, rm);
9384   }
9385   void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
9386     Vmlsl(al, dt, rd, rn, rm);
9387   }
9388 
9389   void Vmov(Condition cond, Register rt, SRegister rn) {
9390     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
9391     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9392     VIXL_ASSERT(allow_macro_instructions_);
9393     VIXL_ASSERT(OutsideITBlock());
9394     MacroEmissionCheckScope guard(this);
9395 #ifndef PANDA_BUILD
9396     ITScope it_scope(this, &cond, guard);
9397 #else
9398     ITScope it_scope(allocator_, this, &cond, guard);
9399 #endif
9400     vmov(cond, rt, rn);
9401   }
9402   void Vmov(Register rt, SRegister rn) { Vmov(al, rt, rn); }
9403 
9404   void Vmov(Condition cond, SRegister rn, Register rt) {
9405     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9406     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
9407     VIXL_ASSERT(allow_macro_instructions_);
9408     VIXL_ASSERT(OutsideITBlock());
9409     MacroEmissionCheckScope guard(this);
9410 #ifndef PANDA_BUILD
9411     ITScope it_scope(this, &cond, guard);
9412 #else
9413     ITScope it_scope(allocator_, this, &cond, guard);
9414 #endif
9415     vmov(cond, rn, rt);
9416   }
9417   void Vmov(SRegister rn, Register rt) { Vmov(al, rn, rt); }
9418 
9419   void Vmov(Condition cond, Register rt, Register rt2, DRegister rm) {
9420     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
9421     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
9422     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9423     VIXL_ASSERT(allow_macro_instructions_);
9424     VIXL_ASSERT(OutsideITBlock());
9425     MacroEmissionCheckScope guard(this);
9426 #ifndef PANDA_BUILD
9427     ITScope it_scope(this, &cond, guard);
9428 #else
9429     ITScope it_scope(allocator_, this, &cond, guard);
9430 #endif
9431     vmov(cond, rt, rt2, rm);
9432   }
9433   void Vmov(Register rt, Register rt2, DRegister rm) { Vmov(al, rt, rt2, rm); }
9434 
9435   void Vmov(Condition cond, DRegister rm, Register rt, Register rt2) {
9436     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9437     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
9438     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
9439     VIXL_ASSERT(allow_macro_instructions_);
9440     VIXL_ASSERT(OutsideITBlock());
9441     MacroEmissionCheckScope guard(this);
9442 #ifndef PANDA_BUILD
9443     ITScope it_scope(this, &cond, guard);
9444 #else
9445     ITScope it_scope(allocator_, this, &cond, guard);
9446 #endif
9447     vmov(cond, rm, rt, rt2);
9448   }
9449   void Vmov(DRegister rm, Register rt, Register rt2) { Vmov(al, rm, rt, rt2); }
9450 
9451   void Vmov(
9452       Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
9453     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
9454     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
9455     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9456     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
9457     VIXL_ASSERT(allow_macro_instructions_);
9458     VIXL_ASSERT(OutsideITBlock());
9459     MacroEmissionCheckScope guard(this);
9460 #ifndef PANDA_BUILD
9461     ITScope it_scope(this, &cond, guard);
9462 #else
9463     ITScope it_scope(allocator_, this, &cond, guard);
9464 #endif
9465     vmov(cond, rt, rt2, rm, rm1);
9466   }
9467   void Vmov(Register rt, Register rt2, SRegister rm, SRegister rm1) {
9468     Vmov(al, rt, rt2, rm, rm1);
9469   }
9470 
9471   void Vmov(
9472       Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
9473     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9474     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
9475     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
9476     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
9477     VIXL_ASSERT(allow_macro_instructions_);
9478     VIXL_ASSERT(OutsideITBlock());
9479     MacroEmissionCheckScope guard(this);
9480 #ifndef PANDA_BUILD
9481     ITScope it_scope(this, &cond, guard);
9482 #else
9483     ITScope it_scope(allocator_, this, &cond, guard);
9484 #endif
9485     vmov(cond, rm, rm1, rt, rt2);
9486   }
9487   void Vmov(SRegister rm, SRegister rm1, Register rt, Register rt2) {
9488     Vmov(al, rm, rm1, rt, rt2);
9489   }
9490 
9491   void Vmov(Condition cond, DataType dt, DRegisterLane rd, Register rt) {
9492     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9493     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
9494     VIXL_ASSERT(allow_macro_instructions_);
9495     VIXL_ASSERT(OutsideITBlock());
9496     MacroEmissionCheckScope guard(this);
9497 #ifndef PANDA_BUILD
9498     ITScope it_scope(this, &cond, guard);
9499 #else
9500     ITScope it_scope(allocator_, this, &cond, guard);
9501 #endif
9502     vmov(cond, dt, rd, rt);
9503   }
9504   void Vmov(DataType dt, DRegisterLane rd, Register rt) {
9505     Vmov(al, dt, rd, rt);
9506   }
9507   void Vmov(Condition cond, DRegisterLane rd, Register rt) {
9508     Vmov(cond, kDataTypeValueNone, rd, rt);
9509   }
9510   void Vmov(DRegisterLane rd, Register rt) {
9511     Vmov(al, kDataTypeValueNone, rd, rt);
9512   }
9513 
9514   void Vmov(Condition cond,
9515             DataType dt,
9516             DRegister rd,
9517             const DOperand& operand) {
9518     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9519     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9520     VIXL_ASSERT(allow_macro_instructions_);
9521     VIXL_ASSERT(OutsideITBlock());
9522     MacroEmissionCheckScope guard(this);
9523 #ifndef PANDA_BUILD
9524     ITScope it_scope(this, &cond, guard);
9525 #else
9526     ITScope it_scope(allocator_, this, &cond, guard);
9527 #endif
9528     vmov(cond, dt, rd, operand);
9529   }
9530   void Vmov(DataType dt, DRegister rd, const DOperand& operand) {
9531     Vmov(al, dt, rd, operand);
9532   }
9533 
9534   void Vmov(Condition cond,
9535             DataType dt,
9536             QRegister rd,
9537             const QOperand& operand) {
9538     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9539     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9540     VIXL_ASSERT(allow_macro_instructions_);
9541     VIXL_ASSERT(OutsideITBlock());
9542     MacroEmissionCheckScope guard(this);
9543 #ifndef PANDA_BUILD
9544     ITScope it_scope(this, &cond, guard);
9545 #else
9546     ITScope it_scope(allocator_, this, &cond, guard);
9547 #endif
9548     vmov(cond, dt, rd, operand);
9549   }
9550   void Vmov(DataType dt, QRegister rd, const QOperand& operand) {
9551     Vmov(al, dt, rd, operand);
9552   }
9553 
9554   void Vmov(Condition cond,
9555             DataType dt,
9556             SRegister rd,
9557             const SOperand& operand) {
9558     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9559     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9560     VIXL_ASSERT(allow_macro_instructions_);
9561     VIXL_ASSERT(OutsideITBlock());
9562     MacroEmissionCheckScope guard(this);
9563 #ifndef PANDA_BUILD
9564     ITScope it_scope(this, &cond, guard);
9565 #else
9566     ITScope it_scope(allocator_, this, &cond, guard);
9567 #endif
9568     vmov(cond, dt, rd, operand);
9569   }
9570   void Vmov(DataType dt, SRegister rd, const SOperand& operand) {
9571     Vmov(al, dt, rd, operand);
9572   }
9573 
9574   void Vmov(Condition cond, DataType dt, Register rt, DRegisterLane rn) {
9575     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
9576     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9577     VIXL_ASSERT(allow_macro_instructions_);
9578     VIXL_ASSERT(OutsideITBlock());
9579     MacroEmissionCheckScope guard(this);
9580 #ifndef PANDA_BUILD
9581     ITScope it_scope(this, &cond, guard);
9582 #else
9583     ITScope it_scope(allocator_, this, &cond, guard);
9584 #endif
9585     vmov(cond, dt, rt, rn);
9586   }
9587   void Vmov(DataType dt, Register rt, DRegisterLane rn) {
9588     Vmov(al, dt, rt, rn);
9589   }
9590   void Vmov(Condition cond, Register rt, DRegisterLane rn) {
9591     Vmov(cond, kDataTypeValueNone, rt, rn);
9592   }
9593   void Vmov(Register rt, DRegisterLane rn) {
9594     Vmov(al, kDataTypeValueNone, rt, rn);
9595   }
9596 
9597   void Vmovl(Condition cond, DataType dt, QRegister rd, DRegister rm) {
9598     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9599     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9600     VIXL_ASSERT(allow_macro_instructions_);
9601     VIXL_ASSERT(OutsideITBlock());
9602     MacroEmissionCheckScope guard(this);
9603 #ifndef PANDA_BUILD
9604     ITScope it_scope(this, &cond, guard);
9605 #else
9606     ITScope it_scope(allocator_, this, &cond, guard);
9607 #endif
9608     vmovl(cond, dt, rd, rm);
9609   }
9610   void Vmovl(DataType dt, QRegister rd, DRegister rm) { Vmovl(al, dt, rd, rm); }
9611 
9612   void Vmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
9613     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9614     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9615     VIXL_ASSERT(allow_macro_instructions_);
9616     VIXL_ASSERT(OutsideITBlock());
9617     MacroEmissionCheckScope guard(this);
9618 #ifndef PANDA_BUILD
9619     ITScope it_scope(this, &cond, guard);
9620 #else
9621     ITScope it_scope(allocator_, this, &cond, guard);
9622 #endif
9623     vmovn(cond, dt, rd, rm);
9624   }
9625   void Vmovn(DataType dt, DRegister rd, QRegister rm) { Vmovn(al, dt, rd, rm); }
9626 
9627   void Vmrs(Condition cond,
9628             RegisterOrAPSR_nzcv rt,
9629             SpecialFPRegister spec_reg) {
9630     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
9631     VIXL_ASSERT(allow_macro_instructions_);
9632     VIXL_ASSERT(OutsideITBlock());
9633     MacroEmissionCheckScope guard(this);
9634 #ifndef PANDA_BUILD
9635     ITScope it_scope(this, &cond, guard);
9636 #else
9637     ITScope it_scope(allocator_, this, &cond, guard);
9638 #endif
9639     vmrs(cond, rt, spec_reg);
9640   }
9641   void Vmrs(RegisterOrAPSR_nzcv rt, SpecialFPRegister spec_reg) {
9642     Vmrs(al, rt, spec_reg);
9643   }
9644 
9645   void Vmsr(Condition cond, SpecialFPRegister spec_reg, Register rt) {
9646     VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
9647     VIXL_ASSERT(allow_macro_instructions_);
9648     VIXL_ASSERT(OutsideITBlock());
9649     MacroEmissionCheckScope guard(this);
9650 #ifndef PANDA_BUILD
9651     ITScope it_scope(this, &cond, guard);
9652 #else
9653     ITScope it_scope(allocator_, this, &cond, guard);
9654 #endif
9655     vmsr(cond, spec_reg, rt);
9656   }
9657   void Vmsr(SpecialFPRegister spec_reg, Register rt) { Vmsr(al, spec_reg, rt); }
9658 
9659   void Vmul(Condition cond,
9660             DataType dt,
9661             DRegister rd,
9662             DRegister rn,
9663             DRegister dm,
9664             unsigned index) {
9665     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9666     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9667     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
9668     VIXL_ASSERT(allow_macro_instructions_);
9669     VIXL_ASSERT(OutsideITBlock());
9670     MacroEmissionCheckScope guard(this);
9671 #ifndef PANDA_BUILD
9672     ITScope it_scope(this, &cond, guard);
9673 #else
9674     ITScope it_scope(allocator_, this, &cond, guard);
9675 #endif
9676     vmul(cond, dt, rd, rn, dm, index);
9677   }
9678   void Vmul(
9679       DataType dt, DRegister rd, DRegister rn, DRegister dm, unsigned index) {
9680     Vmul(al, dt, rd, rn, dm, index);
9681   }
9682 
9683   void Vmul(Condition cond,
9684             DataType dt,
9685             QRegister rd,
9686             QRegister rn,
9687             DRegister dm,
9688             unsigned index) {
9689     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9690     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9691     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
9692     VIXL_ASSERT(allow_macro_instructions_);
9693     VIXL_ASSERT(OutsideITBlock());
9694     MacroEmissionCheckScope guard(this);
9695 #ifndef PANDA_BUILD
9696     ITScope it_scope(this, &cond, guard);
9697 #else
9698     ITScope it_scope(allocator_, this, &cond, guard);
9699 #endif
9700     vmul(cond, dt, rd, rn, dm, index);
9701   }
9702   void Vmul(
9703       DataType dt, QRegister rd, QRegister rn, DRegister dm, unsigned index) {
9704     Vmul(al, dt, rd, rn, dm, index);
9705   }
9706 
9707   void Vmul(
9708       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9709     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9710     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9711     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9712     VIXL_ASSERT(allow_macro_instructions_);
9713     VIXL_ASSERT(OutsideITBlock());
9714     MacroEmissionCheckScope guard(this);
9715 #ifndef PANDA_BUILD
9716     ITScope it_scope(this, &cond, guard);
9717 #else
9718     ITScope it_scope(allocator_, this, &cond, guard);
9719 #endif
9720     vmul(cond, dt, rd, rn, rm);
9721   }
9722   void Vmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9723     Vmul(al, dt, rd, rn, rm);
9724   }
9725 
9726   void Vmul(
9727       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9728     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9729     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9730     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9731     VIXL_ASSERT(allow_macro_instructions_);
9732     VIXL_ASSERT(OutsideITBlock());
9733     MacroEmissionCheckScope guard(this);
9734 #ifndef PANDA_BUILD
9735     ITScope it_scope(this, &cond, guard);
9736 #else
9737     ITScope it_scope(allocator_, this, &cond, guard);
9738 #endif
9739     vmul(cond, dt, rd, rn, rm);
9740   }
9741   void Vmul(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9742     Vmul(al, dt, rd, rn, rm);
9743   }
9744 
9745   void Vmul(
9746       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9747     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9748     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9749     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9750     VIXL_ASSERT(allow_macro_instructions_);
9751     VIXL_ASSERT(OutsideITBlock());
9752     MacroEmissionCheckScope guard(this);
9753 #ifndef PANDA_BUILD
9754     ITScope it_scope(this, &cond, guard);
9755 #else
9756     ITScope it_scope(allocator_, this, &cond, guard);
9757 #endif
9758     vmul(cond, dt, rd, rn, rm);
9759   }
9760   void Vmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9761     Vmul(al, dt, rd, rn, rm);
9762   }
9763 
9764   void Vmull(Condition cond,
9765              DataType dt,
9766              QRegister rd,
9767              DRegister rn,
9768              DRegister dm,
9769              unsigned index) {
9770     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9771     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9772     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
9773     VIXL_ASSERT(allow_macro_instructions_);
9774     VIXL_ASSERT(OutsideITBlock());
9775     MacroEmissionCheckScope guard(this);
9776 #ifndef PANDA_BUILD
9777     ITScope it_scope(this, &cond, guard);
9778 #else
9779     ITScope it_scope(allocator_, this, &cond, guard);
9780 #endif
9781     vmull(cond, dt, rd, rn, dm, index);
9782   }
9783   void Vmull(
9784       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
9785     Vmull(al, dt, rd, rn, dm, index);
9786   }
9787 
9788   void Vmull(
9789       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
9790     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9791     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9793     VIXL_ASSERT(allow_macro_instructions_);
9794     VIXL_ASSERT(OutsideITBlock());
9795     MacroEmissionCheckScope guard(this);
9796 #ifndef PANDA_BUILD
9797     ITScope it_scope(this, &cond, guard);
9798 #else
9799     ITScope it_scope(allocator_, this, &cond, guard);
9800 #endif
9801     vmull(cond, dt, rd, rn, rm);
9802   }
9803   void Vmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
9804     Vmull(al, dt, rd, rn, rm);
9805   }
9806 
9807   void Vmvn(Condition cond,
9808             DataType dt,
9809             DRegister rd,
9810             const DOperand& operand) {
9811     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9812     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9813     VIXL_ASSERT(allow_macro_instructions_);
9814     VIXL_ASSERT(OutsideITBlock());
9815     MacroEmissionCheckScope guard(this);
9816 #ifndef PANDA_BUILD
9817     ITScope it_scope(this, &cond, guard);
9818 #else
9819     ITScope it_scope(allocator_, this, &cond, guard);
9820 #endif
9821     vmvn(cond, dt, rd, operand);
9822   }
9823   void Vmvn(DataType dt, DRegister rd, const DOperand& operand) {
9824     Vmvn(al, dt, rd, operand);
9825   }
9826 
9827   void Vmvn(Condition cond,
9828             DataType dt,
9829             QRegister rd,
9830             const QOperand& operand) {
9831     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9832     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9833     VIXL_ASSERT(allow_macro_instructions_);
9834     VIXL_ASSERT(OutsideITBlock());
9835     MacroEmissionCheckScope guard(this);
9836 #ifndef PANDA_BUILD
9837     ITScope it_scope(this, &cond, guard);
9838 #else
9839     ITScope it_scope(allocator_, this, &cond, guard);
9840 #endif
9841     vmvn(cond, dt, rd, operand);
9842   }
9843   void Vmvn(DataType dt, QRegister rd, const QOperand& operand) {
9844     Vmvn(al, dt, rd, operand);
9845   }
9846 
9847   void Vneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9848     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9849     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9850     VIXL_ASSERT(allow_macro_instructions_);
9851     VIXL_ASSERT(OutsideITBlock());
9852     MacroEmissionCheckScope guard(this);
9853 #ifndef PANDA_BUILD
9854     ITScope it_scope(this, &cond, guard);
9855 #else
9856     ITScope it_scope(allocator_, this, &cond, guard);
9857 #endif
9858     vneg(cond, dt, rd, rm);
9859   }
9860   void Vneg(DataType dt, DRegister rd, DRegister rm) { Vneg(al, dt, rd, rm); }
9861 
9862   void Vneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9863     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9864     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9865     VIXL_ASSERT(allow_macro_instructions_);
9866     VIXL_ASSERT(OutsideITBlock());
9867     MacroEmissionCheckScope guard(this);
9868 #ifndef PANDA_BUILD
9869     ITScope it_scope(this, &cond, guard);
9870 #else
9871     ITScope it_scope(allocator_, this, &cond, guard);
9872 #endif
9873     vneg(cond, dt, rd, rm);
9874   }
9875   void Vneg(DataType dt, QRegister rd, QRegister rm) { Vneg(al, dt, rd, rm); }
9876 
9877   void Vneg(Condition cond, DataType dt, SRegister rd, SRegister rm) {
9878     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9879     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9880     VIXL_ASSERT(allow_macro_instructions_);
9881     VIXL_ASSERT(OutsideITBlock());
9882     MacroEmissionCheckScope guard(this);
9883 #ifndef PANDA_BUILD
9884     ITScope it_scope(this, &cond, guard);
9885 #else
9886     ITScope it_scope(allocator_, this, &cond, guard);
9887 #endif
9888     vneg(cond, dt, rd, rm);
9889   }
9890   void Vneg(DataType dt, SRegister rd, SRegister rm) { Vneg(al, dt, rd, rm); }
9891 
9892   void Vnmla(
9893       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9894     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9895     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9896     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9897     VIXL_ASSERT(allow_macro_instructions_);
9898     VIXL_ASSERT(OutsideITBlock());
9899     MacroEmissionCheckScope guard(this);
9900 #ifndef PANDA_BUILD
9901     ITScope it_scope(this, &cond, guard);
9902 #else
9903     ITScope it_scope(allocator_, this, &cond, guard);
9904 #endif
9905     vnmla(cond, dt, rd, rn, rm);
9906   }
9907   void Vnmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9908     Vnmla(al, dt, rd, rn, rm);
9909   }
9910 
9911   void Vnmla(
9912       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9913     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9914     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9915     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9916     VIXL_ASSERT(allow_macro_instructions_);
9917     VIXL_ASSERT(OutsideITBlock());
9918     MacroEmissionCheckScope guard(this);
9919 #ifndef PANDA_BUILD
9920     ITScope it_scope(this, &cond, guard);
9921 #else
9922     ITScope it_scope(allocator_, this, &cond, guard);
9923 #endif
9924     vnmla(cond, dt, rd, rn, rm);
9925   }
9926   void Vnmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9927     Vnmla(al, dt, rd, rn, rm);
9928   }
9929 
9930   void Vnmls(
9931       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9932     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9933     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9934     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9935     VIXL_ASSERT(allow_macro_instructions_);
9936     VIXL_ASSERT(OutsideITBlock());
9937     MacroEmissionCheckScope guard(this);
9938 #ifndef PANDA_BUILD
9939     ITScope it_scope(this, &cond, guard);
9940 #else
9941     ITScope it_scope(allocator_, this, &cond, guard);
9942 #endif
9943     vnmls(cond, dt, rd, rn, rm);
9944   }
9945   void Vnmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9946     Vnmls(al, dt, rd, rn, rm);
9947   }
9948 
9949   void Vnmls(
9950       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9951     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9952     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9953     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9954     VIXL_ASSERT(allow_macro_instructions_);
9955     VIXL_ASSERT(OutsideITBlock());
9956     MacroEmissionCheckScope guard(this);
9957 #ifndef PANDA_BUILD
9958     ITScope it_scope(this, &cond, guard);
9959 #else
9960     ITScope it_scope(allocator_, this, &cond, guard);
9961 #endif
9962     vnmls(cond, dt, rd, rn, rm);
9963   }
9964   void Vnmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9965     Vnmls(al, dt, rd, rn, rm);
9966   }
9967 
9968   void Vnmul(
9969       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9970     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9971     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9973     VIXL_ASSERT(allow_macro_instructions_);
9974     VIXL_ASSERT(OutsideITBlock());
9975     MacroEmissionCheckScope guard(this);
9976 #ifndef PANDA_BUILD
9977     ITScope it_scope(this, &cond, guard);
9978 #else
9979     ITScope it_scope(allocator_, this, &cond, guard);
9980 #endif
9981     vnmul(cond, dt, rd, rn, rm);
9982   }
9983   void Vnmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9984     Vnmul(al, dt, rd, rn, rm);
9985   }
9986 
9987   void Vnmul(
9988       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9989     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9990     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9991     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9992     VIXL_ASSERT(allow_macro_instructions_);
9993     VIXL_ASSERT(OutsideITBlock());
9994     MacroEmissionCheckScope guard(this);
9995 #ifndef PANDA_BUILD
9996     ITScope it_scope(this, &cond, guard);
9997 #else
9998     ITScope it_scope(allocator_, this, &cond, guard);
9999 #endif
10000     vnmul(cond, dt, rd, rn, rm);
10001   }
10002   void Vnmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10003     Vnmul(al, dt, rd, rn, rm);
10004   }
10005 
10006   void Vorn(Condition cond,
10007             DataType dt,
10008             DRegister rd,
10009             DRegister rn,
10010             const DOperand& operand) {
10011     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10012     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10013     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10014     VIXL_ASSERT(allow_macro_instructions_);
10015     VIXL_ASSERT(OutsideITBlock());
10016     MacroEmissionCheckScope guard(this);
10017 #ifndef PANDA_BUILD
10018     ITScope it_scope(this, &cond, guard);
10019 #else
10020     ITScope it_scope(allocator_, this, &cond, guard);
10021 #endif
10022     vorn(cond, dt, rd, rn, operand);
10023   }
10024   void Vorn(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
10025     Vorn(al, dt, rd, rn, operand);
10026   }
10027 
10028   void Vorn(Condition cond,
10029             DataType dt,
10030             QRegister rd,
10031             QRegister rn,
10032             const QOperand& operand) {
10033     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10034     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10035     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10036     VIXL_ASSERT(allow_macro_instructions_);
10037     VIXL_ASSERT(OutsideITBlock());
10038     MacroEmissionCheckScope guard(this);
10039 #ifndef PANDA_BUILD
10040     ITScope it_scope(this, &cond, guard);
10041 #else
10042     ITScope it_scope(allocator_, this, &cond, guard);
10043 #endif
10044     vorn(cond, dt, rd, rn, operand);
10045   }
10046   void Vorn(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
10047     Vorn(al, dt, rd, rn, operand);
10048   }
10049 
10050   void Vorr(Condition cond,
10051             DataType dt,
10052             DRegister rd,
10053             DRegister rn,
10054             const DOperand& operand) {
10055     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10056     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10057     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10058     VIXL_ASSERT(allow_macro_instructions_);
10059     VIXL_ASSERT(OutsideITBlock());
10060     MacroEmissionCheckScope guard(this);
10061 #ifndef PANDA_BUILD
10062     ITScope it_scope(this, &cond, guard);
10063 #else
10064     ITScope it_scope(allocator_, this, &cond, guard);
10065 #endif
10066     vorr(cond, dt, rd, rn, operand);
10067   }
10068   void Vorr(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
10069     Vorr(al, dt, rd, rn, operand);
10070   }
10071   void Vorr(Condition cond,
10072             DRegister rd,
10073             DRegister rn,
10074             const DOperand& operand) {
10075     Vorr(cond, kDataTypeValueNone, rd, rn, operand);
10076   }
10077   void Vorr(DRegister rd, DRegister rn, const DOperand& operand) {
10078     Vorr(al, kDataTypeValueNone, rd, rn, operand);
10079   }
10080 
10081   void Vorr(Condition cond,
10082             DataType dt,
10083             QRegister rd,
10084             QRegister rn,
10085             const QOperand& operand) {
10086     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10087     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10088     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10089     VIXL_ASSERT(allow_macro_instructions_);
10090     VIXL_ASSERT(OutsideITBlock());
10091     MacroEmissionCheckScope guard(this);
10092 #ifndef PANDA_BUILD
10093     ITScope it_scope(this, &cond, guard);
10094 #else
10095     ITScope it_scope(allocator_, this, &cond, guard);
10096 #endif
10097     vorr(cond, dt, rd, rn, operand);
10098   }
10099   void Vorr(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
10100     Vorr(al, dt, rd, rn, operand);
10101   }
10102   void Vorr(Condition cond,
10103             QRegister rd,
10104             QRegister rn,
10105             const QOperand& operand) {
10106     Vorr(cond, kDataTypeValueNone, rd, rn, operand);
10107   }
10108   void Vorr(QRegister rd, QRegister rn, const QOperand& operand) {
10109     Vorr(al, kDataTypeValueNone, rd, rn, operand);
10110   }
10111 
10112   void Vpadal(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10113     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10114     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10115     VIXL_ASSERT(allow_macro_instructions_);
10116     VIXL_ASSERT(OutsideITBlock());
10117     MacroEmissionCheckScope guard(this);
10118 #ifndef PANDA_BUILD
10119     ITScope it_scope(this, &cond, guard);
10120 #else
10121     ITScope it_scope(allocator_, this, &cond, guard);
10122 #endif
10123     vpadal(cond, dt, rd, rm);
10124   }
10125   void Vpadal(DataType dt, DRegister rd, DRegister rm) {
10126     Vpadal(al, dt, rd, rm);
10127   }
10128 
10129   void Vpadal(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10130     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10131     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10132     VIXL_ASSERT(allow_macro_instructions_);
10133     VIXL_ASSERT(OutsideITBlock());
10134     MacroEmissionCheckScope guard(this);
10135 #ifndef PANDA_BUILD
10136     ITScope it_scope(this, &cond, guard);
10137 #else
10138     ITScope it_scope(allocator_, this, &cond, guard);
10139 #endif
10140     vpadal(cond, dt, rd, rm);
10141   }
10142   void Vpadal(DataType dt, QRegister rd, QRegister rm) {
10143     Vpadal(al, dt, rd, rm);
10144   }
10145 
10146   void Vpadd(
10147       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10148     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10149     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10150     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10151     VIXL_ASSERT(allow_macro_instructions_);
10152     VIXL_ASSERT(OutsideITBlock());
10153     MacroEmissionCheckScope guard(this);
10154 #ifndef PANDA_BUILD
10155     ITScope it_scope(this, &cond, guard);
10156 #else
10157     ITScope it_scope(allocator_, this, &cond, guard);
10158 #endif
10159     vpadd(cond, dt, rd, rn, rm);
10160   }
10161   void Vpadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10162     Vpadd(al, dt, rd, rn, rm);
10163   }
10164 
10165   void Vpaddl(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10166     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10167     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10168     VIXL_ASSERT(allow_macro_instructions_);
10169     VIXL_ASSERT(OutsideITBlock());
10170     MacroEmissionCheckScope guard(this);
10171 #ifndef PANDA_BUILD
10172     ITScope it_scope(this, &cond, guard);
10173 #else
10174     ITScope it_scope(allocator_, this, &cond, guard);
10175 #endif
10176     vpaddl(cond, dt, rd, rm);
10177   }
10178   void Vpaddl(DataType dt, DRegister rd, DRegister rm) {
10179     Vpaddl(al, dt, rd, rm);
10180   }
10181 
10182   void Vpaddl(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10183     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10184     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10185     VIXL_ASSERT(allow_macro_instructions_);
10186     VIXL_ASSERT(OutsideITBlock());
10187     MacroEmissionCheckScope guard(this);
10188 #ifndef PANDA_BUILD
10189     ITScope it_scope(this, &cond, guard);
10190 #else
10191     ITScope it_scope(allocator_, this, &cond, guard);
10192 #endif
10193     vpaddl(cond, dt, rd, rm);
10194   }
10195   void Vpaddl(DataType dt, QRegister rd, QRegister rm) {
10196     Vpaddl(al, dt, rd, rm);
10197   }
10198 
10199   void Vpmax(
10200       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10201     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10202     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10203     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10204     VIXL_ASSERT(allow_macro_instructions_);
10205     VIXL_ASSERT(OutsideITBlock());
10206     MacroEmissionCheckScope guard(this);
10207 #ifndef PANDA_BUILD
10208     ITScope it_scope(this, &cond, guard);
10209 #else
10210     ITScope it_scope(allocator_, this, &cond, guard);
10211 #endif
10212     vpmax(cond, dt, rd, rn, rm);
10213   }
10214   void Vpmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10215     Vpmax(al, dt, rd, rn, rm);
10216   }
10217 
10218   void Vpmin(
10219       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10220     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10221     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10222     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10223     VIXL_ASSERT(allow_macro_instructions_);
10224     VIXL_ASSERT(OutsideITBlock());
10225     MacroEmissionCheckScope guard(this);
10226 #ifndef PANDA_BUILD
10227     ITScope it_scope(this, &cond, guard);
10228 #else
10229     ITScope it_scope(allocator_, this, &cond, guard);
10230 #endif
10231     vpmin(cond, dt, rd, rn, rm);
10232   }
10233   void Vpmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10234     Vpmin(al, dt, rd, rn, rm);
10235   }
10236 
10237   void Vpop(Condition cond, DataType dt, DRegisterList dreglist) {
10238     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10239     VIXL_ASSERT(allow_macro_instructions_);
10240     VIXL_ASSERT(OutsideITBlock());
10241     MacroEmissionCheckScope guard(this);
10242 #ifndef PANDA_BUILD
10243     ITScope it_scope(this, &cond, guard);
10244 #else
10245     ITScope it_scope(allocator_, this, &cond, guard);
10246 #endif
10247     vpop(cond, dt, dreglist);
10248   }
10249   void Vpop(DataType dt, DRegisterList dreglist) { Vpop(al, dt, dreglist); }
10250   void Vpop(Condition cond, DRegisterList dreglist) {
10251     Vpop(cond, kDataTypeValueNone, dreglist);
10252   }
10253   void Vpop(DRegisterList dreglist) { Vpop(al, kDataTypeValueNone, dreglist); }
10254 
10255   void Vpop(Condition cond, DataType dt, SRegisterList sreglist) {
10256     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10257     VIXL_ASSERT(allow_macro_instructions_);
10258     VIXL_ASSERT(OutsideITBlock());
10259     MacroEmissionCheckScope guard(this);
10260 #ifndef PANDA_BUILD
10261     ITScope it_scope(this, &cond, guard);
10262 #else
10263     ITScope it_scope(allocator_, this, &cond, guard);
10264 #endif
10265     vpop(cond, dt, sreglist);
10266   }
10267   void Vpop(DataType dt, SRegisterList sreglist) { Vpop(al, dt, sreglist); }
10268   void Vpop(Condition cond, SRegisterList sreglist) {
10269     Vpop(cond, kDataTypeValueNone, sreglist);
10270   }
10271   void Vpop(SRegisterList sreglist) { Vpop(al, kDataTypeValueNone, sreglist); }
10272 
10273   void Vpush(Condition cond, DataType dt, DRegisterList dreglist) {
10274     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10275     VIXL_ASSERT(allow_macro_instructions_);
10276     VIXL_ASSERT(OutsideITBlock());
10277     MacroEmissionCheckScope guard(this);
10278 #ifndef PANDA_BUILD
10279     ITScope it_scope(this, &cond, guard);
10280 #else
10281     ITScope it_scope(allocator_, this, &cond, guard);
10282 #endif
10283     vpush(cond, dt, dreglist);
10284   }
10285   void Vpush(DataType dt, DRegisterList dreglist) { Vpush(al, dt, dreglist); }
10286   void Vpush(Condition cond, DRegisterList dreglist) {
10287     Vpush(cond, kDataTypeValueNone, dreglist);
10288   }
10289   void Vpush(DRegisterList dreglist) {
10290     Vpush(al, kDataTypeValueNone, dreglist);
10291   }
10292 
10293   void Vpush(Condition cond, DataType dt, SRegisterList sreglist) {
10294     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10295     VIXL_ASSERT(allow_macro_instructions_);
10296     VIXL_ASSERT(OutsideITBlock());
10297     MacroEmissionCheckScope guard(this);
10298 #ifndef PANDA_BUILD
10299     ITScope it_scope(this, &cond, guard);
10300 #else
10301     ITScope it_scope(allocator_, this, &cond, guard);
10302 #endif
10303     vpush(cond, dt, sreglist);
10304   }
10305   void Vpush(DataType dt, SRegisterList sreglist) { Vpush(al, dt, sreglist); }
10306   void Vpush(Condition cond, SRegisterList sreglist) {
10307     Vpush(cond, kDataTypeValueNone, sreglist);
10308   }
10309   void Vpush(SRegisterList sreglist) {
10310     Vpush(al, kDataTypeValueNone, sreglist);
10311   }
10312 
10313   void Vqabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10314     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10315     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10316     VIXL_ASSERT(allow_macro_instructions_);
10317     VIXL_ASSERT(OutsideITBlock());
10318     MacroEmissionCheckScope guard(this);
10319 #ifndef PANDA_BUILD
10320     ITScope it_scope(this, &cond, guard);
10321 #else
10322     ITScope it_scope(allocator_, this, &cond, guard);
10323 #endif
10324     vqabs(cond, dt, rd, rm);
10325   }
10326   void Vqabs(DataType dt, DRegister rd, DRegister rm) { Vqabs(al, dt, rd, rm); }
10327 
10328   void Vqabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10329     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10330     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10331     VIXL_ASSERT(allow_macro_instructions_);
10332     VIXL_ASSERT(OutsideITBlock());
10333     MacroEmissionCheckScope guard(this);
10334 #ifndef PANDA_BUILD
10335     ITScope it_scope(this, &cond, guard);
10336 #else
10337     ITScope it_scope(allocator_, this, &cond, guard);
10338 #endif
10339     vqabs(cond, dt, rd, rm);
10340   }
10341   void Vqabs(DataType dt, QRegister rd, QRegister rm) { Vqabs(al, dt, rd, rm); }
10342 
10343   void Vqadd(
10344       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10345     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10346     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10347     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10348     VIXL_ASSERT(allow_macro_instructions_);
10349     VIXL_ASSERT(OutsideITBlock());
10350     MacroEmissionCheckScope guard(this);
10351 #ifndef PANDA_BUILD
10352     ITScope it_scope(this, &cond, guard);
10353 #else
10354     ITScope it_scope(allocator_, this, &cond, guard);
10355 #endif
10356     vqadd(cond, dt, rd, rn, rm);
10357   }
10358   void Vqadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10359     Vqadd(al, dt, rd, rn, rm);
10360   }
10361 
10362   void Vqadd(
10363       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10364     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10365     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10366     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10367     VIXL_ASSERT(allow_macro_instructions_);
10368     VIXL_ASSERT(OutsideITBlock());
10369     MacroEmissionCheckScope guard(this);
10370 #ifndef PANDA_BUILD
10371     ITScope it_scope(this, &cond, guard);
10372 #else
10373     ITScope it_scope(allocator_, this, &cond, guard);
10374 #endif
10375     vqadd(cond, dt, rd, rn, rm);
10376   }
10377   void Vqadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10378     Vqadd(al, dt, rd, rn, rm);
10379   }
10380 
10381   void Vqdmlal(
10382       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10383     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10384     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10385     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10386     VIXL_ASSERT(allow_macro_instructions_);
10387     VIXL_ASSERT(OutsideITBlock());
10388     MacroEmissionCheckScope guard(this);
10389 #ifndef PANDA_BUILD
10390     ITScope it_scope(this, &cond, guard);
10391 #else
10392     ITScope it_scope(allocator_, this, &cond, guard);
10393 #endif
10394     vqdmlal(cond, dt, rd, rn, rm);
10395   }
10396   void Vqdmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10397     Vqdmlal(al, dt, rd, rn, rm);
10398   }
10399 
10400   void Vqdmlal(Condition cond,
10401                DataType dt,
10402                QRegister rd,
10403                DRegister rn,
10404                DRegister dm,
10405                unsigned index) {
10406     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10407     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10408     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
10409     VIXL_ASSERT(allow_macro_instructions_);
10410     VIXL_ASSERT(OutsideITBlock());
10411     MacroEmissionCheckScope guard(this);
10412 #ifndef PANDA_BUILD
10413     ITScope it_scope(this, &cond, guard);
10414 #else
10415     ITScope it_scope(allocator_, this, &cond, guard);
10416 #endif
10417     vqdmlal(cond, dt, rd, rn, dm, index);
10418   }
10419   void Vqdmlal(
10420       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
10421     Vqdmlal(al, dt, rd, rn, dm, index);
10422   }
10423 
10424   void Vqdmlsl(
10425       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10426     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10427     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10428     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10429     VIXL_ASSERT(allow_macro_instructions_);
10430     VIXL_ASSERT(OutsideITBlock());
10431     MacroEmissionCheckScope guard(this);
10432 #ifndef PANDA_BUILD
10433     ITScope it_scope(this, &cond, guard);
10434 #else
10435     ITScope it_scope(allocator_, this, &cond, guard);
10436 #endif
10437     vqdmlsl(cond, dt, rd, rn, rm);
10438   }
10439   void Vqdmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10440     Vqdmlsl(al, dt, rd, rn, rm);
10441   }
10442 
10443   void Vqdmlsl(Condition cond,
10444                DataType dt,
10445                QRegister rd,
10446                DRegister rn,
10447                DRegister dm,
10448                unsigned index) {
10449     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10450     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10451     VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
10452     VIXL_ASSERT(allow_macro_instructions_);
10453     VIXL_ASSERT(OutsideITBlock());
10454     MacroEmissionCheckScope guard(this);
10455 #ifndef PANDA_BUILD
10456     ITScope it_scope(this, &cond, guard);
10457 #else
10458     ITScope it_scope(allocator_, this, &cond, guard);
10459 #endif
10460     vqdmlsl(cond, dt, rd, rn, dm, index);
10461   }
10462   void Vqdmlsl(
10463       DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
10464     Vqdmlsl(al, dt, rd, rn, dm, index);
10465   }
10466 
10467   void Vqdmulh(
10468       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10469     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10470     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10471     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10472     VIXL_ASSERT(allow_macro_instructions_);
10473     VIXL_ASSERT(OutsideITBlock());
10474     MacroEmissionCheckScope guard(this);
10475 #ifndef PANDA_BUILD
10476     ITScope it_scope(this, &cond, guard);
10477 #else
10478     ITScope it_scope(allocator_, this, &cond, guard);
10479 #endif
10480     vqdmulh(cond, dt, rd, rn, rm);
10481   }
10482   void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10483     Vqdmulh(al, dt, rd, rn, rm);
10484   }
10485 
10486   void Vqdmulh(
10487       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10488     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10489     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10490     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10491     VIXL_ASSERT(allow_macro_instructions_);
10492     VIXL_ASSERT(OutsideITBlock());
10493     MacroEmissionCheckScope guard(this);
10494 #ifndef PANDA_BUILD
10495     ITScope it_scope(this, &cond, guard);
10496 #else
10497     ITScope it_scope(allocator_, this, &cond, guard);
10498 #endif
10499     vqdmulh(cond, dt, rd, rn, rm);
10500   }
10501   void Vqdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10502     Vqdmulh(al, dt, rd, rn, rm);
10503   }
10504 
10505   void Vqdmulh(Condition cond,
10506                DataType dt,
10507                DRegister rd,
10508                DRegister rn,
10509                DRegisterLane rm) {
10510     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10511     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10512     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10513     VIXL_ASSERT(allow_macro_instructions_);
10514     VIXL_ASSERT(OutsideITBlock());
10515     MacroEmissionCheckScope guard(this);
10516 #ifndef PANDA_BUILD
10517     ITScope it_scope(this, &cond, guard);
10518 #else
10519     ITScope it_scope(allocator_, this, &cond, guard);
10520 #endif
10521     vqdmulh(cond, dt, rd, rn, rm);
10522   }
10523   void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
10524     Vqdmulh(al, dt, rd, rn, rm);
10525   }
10526 
10527   void Vqdmulh(Condition cond,
10528                DataType dt,
10529                QRegister rd,
10530                QRegister rn,
10531                DRegisterLane rm) {
10532     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10533     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10534     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10535     VIXL_ASSERT(allow_macro_instructions_);
10536     VIXL_ASSERT(OutsideITBlock());
10537     MacroEmissionCheckScope guard(this);
10538 #ifndef PANDA_BUILD
10539     ITScope it_scope(this, &cond, guard);
10540 #else
10541     ITScope it_scope(allocator_, this, &cond, guard);
10542 #endif
10543     vqdmulh(cond, dt, rd, rn, rm);
10544   }
10545   void Vqdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
10546     Vqdmulh(al, dt, rd, rn, rm);
10547   }
10548 
10549   void Vqdmull(
10550       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10551     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10552     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10553     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10554     VIXL_ASSERT(allow_macro_instructions_);
10555     VIXL_ASSERT(OutsideITBlock());
10556     MacroEmissionCheckScope guard(this);
10557 #ifndef PANDA_BUILD
10558     ITScope it_scope(this, &cond, guard);
10559 #else
10560     ITScope it_scope(allocator_, this, &cond, guard);
10561 #endif
10562     vqdmull(cond, dt, rd, rn, rm);
10563   }
10564   void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10565     Vqdmull(al, dt, rd, rn, rm);
10566   }
10567 
10568   void Vqdmull(Condition cond,
10569                DataType dt,
10570                QRegister rd,
10571                DRegister rn,
10572                DRegisterLane rm) {
10573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10574     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10575     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10576     VIXL_ASSERT(allow_macro_instructions_);
10577     VIXL_ASSERT(OutsideITBlock());
10578     MacroEmissionCheckScope guard(this);
10579 #ifndef PANDA_BUILD
10580     ITScope it_scope(this, &cond, guard);
10581 #else
10582     ITScope it_scope(allocator_, this, &cond, guard);
10583 #endif
10584     vqdmull(cond, dt, rd, rn, rm);
10585   }
10586   void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
10587     Vqdmull(al, dt, rd, rn, rm);
10588   }
10589 
10590   void Vqmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
10591     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10592     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10593     VIXL_ASSERT(allow_macro_instructions_);
10594     VIXL_ASSERT(OutsideITBlock());
10595     MacroEmissionCheckScope guard(this);
10596 #ifndef PANDA_BUILD
10597     ITScope it_scope(this, &cond, guard);
10598 #else
10599     ITScope it_scope(allocator_, this, &cond, guard);
10600 #endif
10601     vqmovn(cond, dt, rd, rm);
10602   }
10603   void Vqmovn(DataType dt, DRegister rd, QRegister rm) {
10604     Vqmovn(al, dt, rd, rm);
10605   }
10606 
10607   void Vqmovun(Condition cond, DataType dt, DRegister rd, QRegister rm) {
10608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10609     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10610     VIXL_ASSERT(allow_macro_instructions_);
10611     VIXL_ASSERT(OutsideITBlock());
10612     MacroEmissionCheckScope guard(this);
10613 #ifndef PANDA_BUILD
10614     ITScope it_scope(this, &cond, guard);
10615 #else
10616     ITScope it_scope(allocator_, this, &cond, guard);
10617 #endif
10618     vqmovun(cond, dt, rd, rm);
10619   }
10620   void Vqmovun(DataType dt, DRegister rd, QRegister rm) {
10621     Vqmovun(al, dt, rd, rm);
10622   }
10623 
10624   void Vqneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10625     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10626     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10627     VIXL_ASSERT(allow_macro_instructions_);
10628     VIXL_ASSERT(OutsideITBlock());
10629     MacroEmissionCheckScope guard(this);
10630 #ifndef PANDA_BUILD
10631     ITScope it_scope(this, &cond, guard);
10632 #else
10633     ITScope it_scope(allocator_, this, &cond, guard);
10634 #endif
10635     vqneg(cond, dt, rd, rm);
10636   }
10637   void Vqneg(DataType dt, DRegister rd, DRegister rm) { Vqneg(al, dt, rd, rm); }
10638 
10639   void Vqneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10640     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10641     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10642     VIXL_ASSERT(allow_macro_instructions_);
10643     VIXL_ASSERT(OutsideITBlock());
10644     MacroEmissionCheckScope guard(this);
10645 #ifndef PANDA_BUILD
10646     ITScope it_scope(this, &cond, guard);
10647 #else
10648     ITScope it_scope(allocator_, this, &cond, guard);
10649 #endif
10650     vqneg(cond, dt, rd, rm);
10651   }
10652   void Vqneg(DataType dt, QRegister rd, QRegister rm) { Vqneg(al, dt, rd, rm); }
10653 
10654   void Vqrdmulh(
10655       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10656     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10657     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10658     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10659     VIXL_ASSERT(allow_macro_instructions_);
10660     VIXL_ASSERT(OutsideITBlock());
10661     MacroEmissionCheckScope guard(this);
10662 #ifndef PANDA_BUILD
10663     ITScope it_scope(this, &cond, guard);
10664 #else
10665     ITScope it_scope(allocator_, this, &cond, guard);
10666 #endif
10667     vqrdmulh(cond, dt, rd, rn, rm);
10668   }
10669   void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10670     Vqrdmulh(al, dt, rd, rn, rm);
10671   }
10672 
10673   void Vqrdmulh(
10674       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10675     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10676     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10677     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10678     VIXL_ASSERT(allow_macro_instructions_);
10679     VIXL_ASSERT(OutsideITBlock());
10680     MacroEmissionCheckScope guard(this);
10681 #ifndef PANDA_BUILD
10682     ITScope it_scope(this, &cond, guard);
10683 #else
10684     ITScope it_scope(allocator_, this, &cond, guard);
10685 #endif
10686     vqrdmulh(cond, dt, rd, rn, rm);
10687   }
10688   void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10689     Vqrdmulh(al, dt, rd, rn, rm);
10690   }
10691 
10692   void Vqrdmulh(Condition cond,
10693                 DataType dt,
10694                 DRegister rd,
10695                 DRegister rn,
10696                 DRegisterLane rm) {
10697     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10698     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10699     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10700     VIXL_ASSERT(allow_macro_instructions_);
10701     VIXL_ASSERT(OutsideITBlock());
10702     MacroEmissionCheckScope guard(this);
10703 #ifndef PANDA_BUILD
10704     ITScope it_scope(this, &cond, guard);
10705 #else
10706     ITScope it_scope(allocator_, this, &cond, guard);
10707 #endif
10708     vqrdmulh(cond, dt, rd, rn, rm);
10709   }
10710   void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
10711     Vqrdmulh(al, dt, rd, rn, rm);
10712   }
10713 
10714   void Vqrdmulh(Condition cond,
10715                 DataType dt,
10716                 QRegister rd,
10717                 QRegister rn,
10718                 DRegisterLane rm) {
10719     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10720     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10721     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10722     VIXL_ASSERT(allow_macro_instructions_);
10723     VIXL_ASSERT(OutsideITBlock());
10724     MacroEmissionCheckScope guard(this);
10725 #ifndef PANDA_BUILD
10726     ITScope it_scope(this, &cond, guard);
10727 #else
10728     ITScope it_scope(allocator_, this, &cond, guard);
10729 #endif
10730     vqrdmulh(cond, dt, rd, rn, rm);
10731   }
10732   void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
10733     Vqrdmulh(al, dt, rd, rn, rm);
10734   }
10735 
10736   void Vqrshl(
10737       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
10738     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10739     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10740     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10741     VIXL_ASSERT(allow_macro_instructions_);
10742     VIXL_ASSERT(OutsideITBlock());
10743     MacroEmissionCheckScope guard(this);
10744 #ifndef PANDA_BUILD
10745     ITScope it_scope(this, &cond, guard);
10746 #else
10747     ITScope it_scope(allocator_, this, &cond, guard);
10748 #endif
10749     vqrshl(cond, dt, rd, rm, rn);
10750   }
10751   void Vqrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
10752     Vqrshl(al, dt, rd, rm, rn);
10753   }
10754 
10755   void Vqrshl(
10756       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
10757     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10760     VIXL_ASSERT(allow_macro_instructions_);
10761     VIXL_ASSERT(OutsideITBlock());
10762     MacroEmissionCheckScope guard(this);
10763 #ifndef PANDA_BUILD
10764     ITScope it_scope(this, &cond, guard);
10765 #else
10766     ITScope it_scope(allocator_, this, &cond, guard);
10767 #endif
10768     vqrshl(cond, dt, rd, rm, rn);
10769   }
10770   void Vqrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
10771     Vqrshl(al, dt, rd, rm, rn);
10772   }
10773 
10774   void Vqrshrn(Condition cond,
10775                DataType dt,
10776                DRegister rd,
10777                QRegister rm,
10778                const QOperand& operand) {
10779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10780     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10781     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10782     VIXL_ASSERT(allow_macro_instructions_);
10783     VIXL_ASSERT(OutsideITBlock());
10784     MacroEmissionCheckScope guard(this);
10785 #ifndef PANDA_BUILD
10786     ITScope it_scope(this, &cond, guard);
10787 #else
10788     ITScope it_scope(allocator_, this, &cond, guard);
10789 #endif
10790     vqrshrn(cond, dt, rd, rm, operand);
10791   }
10792   void Vqrshrn(DataType dt,
10793                DRegister rd,
10794                QRegister rm,
10795                const QOperand& operand) {
10796     Vqrshrn(al, dt, rd, rm, operand);
10797   }
10798 
10799   void Vqrshrun(Condition cond,
10800                 DataType dt,
10801                 DRegister rd,
10802                 QRegister rm,
10803                 const QOperand& operand) {
10804     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10805     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10806     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10807     VIXL_ASSERT(allow_macro_instructions_);
10808     VIXL_ASSERT(OutsideITBlock());
10809     MacroEmissionCheckScope guard(this);
10810 #ifndef PANDA_BUILD
10811     ITScope it_scope(this, &cond, guard);
10812 #else
10813     ITScope it_scope(allocator_, this, &cond, guard);
10814 #endif
10815     vqrshrun(cond, dt, rd, rm, operand);
10816   }
10817   void Vqrshrun(DataType dt,
10818                 DRegister rd,
10819                 QRegister rm,
10820                 const QOperand& operand) {
10821     Vqrshrun(al, dt, rd, rm, operand);
10822   }
10823 
10824   void Vqshl(Condition cond,
10825              DataType dt,
10826              DRegister rd,
10827              DRegister rm,
10828              const DOperand& operand) {
10829     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10830     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10831     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10832     VIXL_ASSERT(allow_macro_instructions_);
10833     VIXL_ASSERT(OutsideITBlock());
10834     MacroEmissionCheckScope guard(this);
10835 #ifndef PANDA_BUILD
10836     ITScope it_scope(this, &cond, guard);
10837 #else
10838     ITScope it_scope(allocator_, this, &cond, guard);
10839 #endif
10840     vqshl(cond, dt, rd, rm, operand);
10841   }
10842   void Vqshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
10843     Vqshl(al, dt, rd, rm, operand);
10844   }
10845 
10846   void Vqshl(Condition cond,
10847              DataType dt,
10848              QRegister rd,
10849              QRegister rm,
10850              const QOperand& operand) {
10851     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10852     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10853     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10854     VIXL_ASSERT(allow_macro_instructions_);
10855     VIXL_ASSERT(OutsideITBlock());
10856     MacroEmissionCheckScope guard(this);
10857 #ifndef PANDA_BUILD
10858     ITScope it_scope(this, &cond, guard);
10859 #else
10860     ITScope it_scope(allocator_, this, &cond, guard);
10861 #endif
10862     vqshl(cond, dt, rd, rm, operand);
10863   }
10864   void Vqshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
10865     Vqshl(al, dt, rd, rm, operand);
10866   }
10867 
10868   void Vqshlu(Condition cond,
10869               DataType dt,
10870               DRegister rd,
10871               DRegister rm,
10872               const DOperand& operand) {
10873     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10874     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10875     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10876     VIXL_ASSERT(allow_macro_instructions_);
10877     VIXL_ASSERT(OutsideITBlock());
10878     MacroEmissionCheckScope guard(this);
10879 #ifndef PANDA_BUILD
10880     ITScope it_scope(this, &cond, guard);
10881 #else
10882     ITScope it_scope(allocator_, this, &cond, guard);
10883 #endif
10884     vqshlu(cond, dt, rd, rm, operand);
10885   }
10886   void Vqshlu(DataType dt,
10887               DRegister rd,
10888               DRegister rm,
10889               const DOperand& operand) {
10890     Vqshlu(al, dt, rd, rm, operand);
10891   }
10892 
10893   void Vqshlu(Condition cond,
10894               DataType dt,
10895               QRegister rd,
10896               QRegister rm,
10897               const QOperand& operand) {
10898     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10899     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10900     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10901     VIXL_ASSERT(allow_macro_instructions_);
10902     VIXL_ASSERT(OutsideITBlock());
10903     MacroEmissionCheckScope guard(this);
10904 #ifndef PANDA_BUILD
10905     ITScope it_scope(this, &cond, guard);
10906 #else
10907     ITScope it_scope(allocator_, this, &cond, guard);
10908 #endif
10909     vqshlu(cond, dt, rd, rm, operand);
10910   }
10911   void Vqshlu(DataType dt,
10912               QRegister rd,
10913               QRegister rm,
10914               const QOperand& operand) {
10915     Vqshlu(al, dt, rd, rm, operand);
10916   }
10917 
10918   void Vqshrn(Condition cond,
10919               DataType dt,
10920               DRegister rd,
10921               QRegister rm,
10922               const QOperand& operand) {
10923     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10924     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10925     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10926     VIXL_ASSERT(allow_macro_instructions_);
10927     VIXL_ASSERT(OutsideITBlock());
10928     MacroEmissionCheckScope guard(this);
10929 #ifndef PANDA_BUILD
10930     ITScope it_scope(this, &cond, guard);
10931 #else
10932     ITScope it_scope(allocator_, this, &cond, guard);
10933 #endif
10934     vqshrn(cond, dt, rd, rm, operand);
10935   }
10936   void Vqshrn(DataType dt,
10937               DRegister rd,
10938               QRegister rm,
10939               const QOperand& operand) {
10940     Vqshrn(al, dt, rd, rm, operand);
10941   }
10942 
10943   void Vqshrun(Condition cond,
10944                DataType dt,
10945                DRegister rd,
10946                QRegister rm,
10947                const QOperand& operand) {
10948     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10949     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10950     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10951     VIXL_ASSERT(allow_macro_instructions_);
10952     VIXL_ASSERT(OutsideITBlock());
10953     MacroEmissionCheckScope guard(this);
10954 #ifndef PANDA_BUILD
10955     ITScope it_scope(this, &cond, guard);
10956 #else
10957     ITScope it_scope(allocator_, this, &cond, guard);
10958 #endif
10959     vqshrun(cond, dt, rd, rm, operand);
10960   }
10961   void Vqshrun(DataType dt,
10962                DRegister rd,
10963                QRegister rm,
10964                const QOperand& operand) {
10965     Vqshrun(al, dt, rd, rm, operand);
10966   }
10967 
10968   void Vqsub(
10969       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10970     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10971     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10972     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10973     VIXL_ASSERT(allow_macro_instructions_);
10974     VIXL_ASSERT(OutsideITBlock());
10975     MacroEmissionCheckScope guard(this);
10976 #ifndef PANDA_BUILD
10977     ITScope it_scope(this, &cond, guard);
10978 #else
10979     ITScope it_scope(allocator_, this, &cond, guard);
10980 #endif
10981     vqsub(cond, dt, rd, rn, rm);
10982   }
10983   void Vqsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10984     Vqsub(al, dt, rd, rn, rm);
10985   }
10986 
10987   void Vqsub(
10988       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10989     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10990     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10991     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10992     VIXL_ASSERT(allow_macro_instructions_);
10993     VIXL_ASSERT(OutsideITBlock());
10994     MacroEmissionCheckScope guard(this);
10995 #ifndef PANDA_BUILD
10996     ITScope it_scope(this, &cond, guard);
10997 #else
10998     ITScope it_scope(allocator_, this, &cond, guard);
10999 #endif
11000     vqsub(cond, dt, rd, rn, rm);
11001   }
11002   void Vqsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
11003     Vqsub(al, dt, rd, rn, rm);
11004   }
11005 
11006   void Vraddhn(
11007       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
11008     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11009     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11010     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11011     VIXL_ASSERT(allow_macro_instructions_);
11012     VIXL_ASSERT(OutsideITBlock());
11013     MacroEmissionCheckScope guard(this);
11014 #ifndef PANDA_BUILD
11015     ITScope it_scope(this, &cond, guard);
11016 #else
11017     ITScope it_scope(allocator_, this, &cond, guard);
11018 #endif
11019     vraddhn(cond, dt, rd, rn, rm);
11020   }
11021   void Vraddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
11022     Vraddhn(al, dt, rd, rn, rm);
11023   }
11024 
11025   void Vrecpe(Condition cond, DataType dt, DRegister rd, DRegister rm) {
11026     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11027     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11028     VIXL_ASSERT(allow_macro_instructions_);
11029     VIXL_ASSERT(OutsideITBlock());
11030     MacroEmissionCheckScope guard(this);
11031 #ifndef PANDA_BUILD
11032     ITScope it_scope(this, &cond, guard);
11033 #else
11034     ITScope it_scope(allocator_, this, &cond, guard);
11035 #endif
11036     vrecpe(cond, dt, rd, rm);
11037   }
11038   void Vrecpe(DataType dt, DRegister rd, DRegister rm) {
11039     Vrecpe(al, dt, rd, rm);
11040   }
11041 
11042   void Vrecpe(Condition cond, DataType dt, QRegister rd, QRegister rm) {
11043     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11044     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11045     VIXL_ASSERT(allow_macro_instructions_);
11046     VIXL_ASSERT(OutsideITBlock());
11047     MacroEmissionCheckScope guard(this);
11048 #ifndef PANDA_BUILD
11049     ITScope it_scope(this, &cond, guard);
11050 #else
11051     ITScope it_scope(allocator_, this, &cond, guard);
11052 #endif
11053     vrecpe(cond, dt, rd, rm);
11054   }
11055   void Vrecpe(DataType dt, QRegister rd, QRegister rm) {
11056     Vrecpe(al, dt, rd, rm);
11057   }
11058 
11059   void Vrecps(
11060       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
11061     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11062     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11063     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11064     VIXL_ASSERT(allow_macro_instructions_);
11065     VIXL_ASSERT(OutsideITBlock());
11066     MacroEmissionCheckScope guard(this);
11067 #ifndef PANDA_BUILD
11068     ITScope it_scope(this, &cond, guard);
11069 #else
11070     ITScope it_scope(allocator_, this, &cond, guard);
11071 #endif
11072     vrecps(cond, dt, rd, rn, rm);
11073   }
11074   void Vrecps(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
11075     Vrecps(al, dt, rd, rn, rm);
11076   }
11077 
11078   void Vrecps(
11079       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
11080     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11081     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11082     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11083     VIXL_ASSERT(allow_macro_instructions_);
11084     VIXL_ASSERT(OutsideITBlock());
11085     MacroEmissionCheckScope guard(this);
11086 #ifndef PANDA_BUILD
11087     ITScope it_scope(this, &cond, guard);
11088 #else
11089     ITScope it_scope(allocator_, this, &cond, guard);
11090 #endif
11091     vrecps(cond, dt, rd, rn, rm);
11092   }
11093   void Vrecps(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
11094     Vrecps(al, dt, rd, rn, rm);
11095   }
11096 
11097   void Vrev16(Condition cond, DataType dt, DRegister rd, DRegister rm) {
11098     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11099     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11100     VIXL_ASSERT(allow_macro_instructions_);
11101     VIXL_ASSERT(OutsideITBlock());
11102     MacroEmissionCheckScope guard(this);
11103 #ifndef PANDA_BUILD
11104     ITScope it_scope(this, &cond, guard);
11105 #else
11106     ITScope it_scope(allocator_, this, &cond, guard);
11107 #endif
11108     vrev16(cond, dt, rd, rm);
11109   }
11110   void Vrev16(DataType dt, DRegister rd, DRegister rm) {
11111     Vrev16(al, dt, rd, rm);
11112   }
11113 
11114   void Vrev16(Condition cond, DataType dt, QRegister rd, QRegister rm) {
11115     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11116     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11117     VIXL_ASSERT(allow_macro_instructions_);
11118     VIXL_ASSERT(OutsideITBlock());
11119     MacroEmissionCheckScope guard(this);
11120 #ifndef PANDA_BUILD
11121     ITScope it_scope(this, &cond, guard);
11122 #else
11123     ITScope it_scope(allocator_, this, &cond, guard);
11124 #endif
11125     vrev16(cond, dt, rd, rm);
11126   }
11127   void Vrev16(DataType dt, QRegister rd, QRegister rm) {
11128     Vrev16(al, dt, rd, rm);
11129   }
11130 
11131   void Vrev32(Condition cond, DataType dt, DRegister rd, DRegister rm) {
11132     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11133     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11134     VIXL_ASSERT(allow_macro_instructions_);
11135     VIXL_ASSERT(OutsideITBlock());
11136     MacroEmissionCheckScope guard(this);
11137 #ifndef PANDA_BUILD
11138     ITScope it_scope(this, &cond, guard);
11139 #else
11140     ITScope it_scope(allocator_, this, &cond, guard);
11141 #endif
11142     vrev32(cond, dt, rd, rm);
11143   }
11144   void Vrev32(DataType dt, DRegister rd, DRegister rm) {
11145     Vrev32(al, dt, rd, rm);
11146   }
11147 
11148   void Vrev32(Condition cond, DataType dt, QRegister rd, QRegister rm) {
11149     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11150     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11151     VIXL_ASSERT(allow_macro_instructions_);
11152     VIXL_ASSERT(OutsideITBlock());
11153     MacroEmissionCheckScope guard(this);
11154 #ifndef PANDA_BUILD
11155     ITScope it_scope(this, &cond, guard);
11156 #else
11157     ITScope it_scope(allocator_, this, &cond, guard);
11158 #endif
11159     vrev32(cond, dt, rd, rm);
11160   }
11161   void Vrev32(DataType dt, QRegister rd, QRegister rm) {
11162     Vrev32(al, dt, rd, rm);
11163   }
11164 
11165   void Vrev64(Condition cond, DataType dt, DRegister rd, DRegister rm) {
11166     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11167     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11168     VIXL_ASSERT(allow_macro_instructions_);
11169     VIXL_ASSERT(OutsideITBlock());
11170     MacroEmissionCheckScope guard(this);
11171 #ifndef PANDA_BUILD
11172     ITScope it_scope(this, &cond, guard);
11173 #else
11174     ITScope it_scope(allocator_, this, &cond, guard);
11175 #endif
11176     vrev64(cond, dt, rd, rm);
11177   }
11178   void Vrev64(DataType dt, DRegister rd, DRegister rm) {
11179     Vrev64(al, dt, rd, rm);
11180   }
11181 
11182   void Vrev64(Condition cond, DataType dt, QRegister rd, QRegister rm) {
11183     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11184     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11185     VIXL_ASSERT(allow_macro_instructions_);
11186     VIXL_ASSERT(OutsideITBlock());
11187     MacroEmissionCheckScope guard(this);
11188 #ifndef PANDA_BUILD
11189     ITScope it_scope(this, &cond, guard);
11190 #else
11191     ITScope it_scope(allocator_, this, &cond, guard);
11192 #endif
11193     vrev64(cond, dt, rd, rm);
11194   }
11195   void Vrev64(DataType dt, QRegister rd, QRegister rm) {
11196     Vrev64(al, dt, rd, rm);
11197   }
11198 
11199   void Vrhadd(
11200       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
11201     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11202     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11203     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11204     VIXL_ASSERT(allow_macro_instructions_);
11205     VIXL_ASSERT(OutsideITBlock());
11206     MacroEmissionCheckScope guard(this);
11207 #ifndef PANDA_BUILD
11208     ITScope it_scope(this, &cond, guard);
11209 #else
11210     ITScope it_scope(allocator_, this, &cond, guard);
11211 #endif
11212     vrhadd(cond, dt, rd, rn, rm);
11213   }
11214   void Vrhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
11215     Vrhadd(al, dt, rd, rn, rm);
11216   }
11217 
11218   void Vrhadd(
11219       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
11220     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11221     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11222     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11223     VIXL_ASSERT(allow_macro_instructions_);
11224     VIXL_ASSERT(OutsideITBlock());
11225     MacroEmissionCheckScope guard(this);
11226 #ifndef PANDA_BUILD
11227     ITScope it_scope(this, &cond, guard);
11228 #else
11229     ITScope it_scope(allocator_, this, &cond, guard);
11230 #endif
11231     vrhadd(cond, dt, rd, rn, rm);
11232   }
11233   void Vrhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
11234     Vrhadd(al, dt, rd, rn, rm);
11235   }
11236 
11237   void Vrinta(DataType dt, DRegister rd, DRegister rm) {
11238     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11239     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11240     VIXL_ASSERT(allow_macro_instructions_);
11241     VIXL_ASSERT(OutsideITBlock());
11242     MacroEmissionCheckScope guard(this);
11243     vrinta(dt, rd, rm);
11244   }
11245 
11246   void Vrinta(DataType dt, QRegister rd, QRegister rm) {
11247     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11248     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11249     VIXL_ASSERT(allow_macro_instructions_);
11250     VIXL_ASSERT(OutsideITBlock());
11251     MacroEmissionCheckScope guard(this);
11252     vrinta(dt, rd, rm);
11253   }
11254 
11255   void Vrinta(DataType dt, SRegister rd, SRegister rm) {
11256     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11257     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11258     VIXL_ASSERT(allow_macro_instructions_);
11259     VIXL_ASSERT(OutsideITBlock());
11260     MacroEmissionCheckScope guard(this);
11261     vrinta(dt, rd, rm);
11262   }
11263 
11264   void Vrintm(DataType dt, DRegister rd, DRegister rm) {
11265     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11266     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11267     VIXL_ASSERT(allow_macro_instructions_);
11268     VIXL_ASSERT(OutsideITBlock());
11269     MacroEmissionCheckScope guard(this);
11270     vrintm(dt, rd, rm);
11271   }
11272 
11273   void Vrintm(DataType dt, QRegister rd, QRegister rm) {
11274     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11275     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11276     VIXL_ASSERT(allow_macro_instructions_);
11277     VIXL_ASSERT(OutsideITBlock());
11278     MacroEmissionCheckScope guard(this);
11279     vrintm(dt, rd, rm);
11280   }
11281 
11282   void Vrintm(DataType dt, SRegister rd, SRegister rm) {
11283     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11284     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11285     VIXL_ASSERT(allow_macro_instructions_);
11286     VIXL_ASSERT(OutsideITBlock());
11287     MacroEmissionCheckScope guard(this);
11288     vrintm(dt, rd, rm);
11289   }
11290 
11291   void Vrintn(DataType dt, DRegister rd, DRegister rm) {
11292     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11293     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11294     VIXL_ASSERT(allow_macro_instructions_);
11295     VIXL_ASSERT(OutsideITBlock());
11296     MacroEmissionCheckScope guard(this);
11297     vrintn(dt, rd, rm);
11298   }
11299 
11300   void Vrintn(DataType dt, QRegister rd, QRegister rm) {
11301     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11302     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11303     VIXL_ASSERT(allow_macro_instructions_);
11304     VIXL_ASSERT(OutsideITBlock());
11305     MacroEmissionCheckScope guard(this);
11306     vrintn(dt, rd, rm);
11307   }
11308 
11309   void Vrintn(DataType dt, SRegister rd, SRegister rm) {
11310     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11311     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11312     VIXL_ASSERT(allow_macro_instructions_);
11313     VIXL_ASSERT(OutsideITBlock());
11314     MacroEmissionCheckScope guard(this);
11315     vrintn(dt, rd, rm);
11316   }
11317 
11318   void Vrintp(DataType dt, DRegister rd, DRegister rm) {
11319     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11320     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11321     VIXL_ASSERT(allow_macro_instructions_);
11322     VIXL_ASSERT(OutsideITBlock());
11323     MacroEmissionCheckScope guard(this);
11324     vrintp(dt, rd, rm);
11325   }
11326 
11327   void Vrintp(DataType dt, QRegister rd, QRegister rm) {
11328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11329     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11330     VIXL_ASSERT(allow_macro_instructions_);
11331     VIXL_ASSERT(OutsideITBlock());
11332     MacroEmissionCheckScope guard(this);
11333     vrintp(dt, rd, rm);
11334   }
11335 
11336   void Vrintp(DataType dt, SRegister rd, SRegister rm) {
11337     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11338     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11339     VIXL_ASSERT(allow_macro_instructions_);
11340     VIXL_ASSERT(OutsideITBlock());
11341     MacroEmissionCheckScope guard(this);
11342     vrintp(dt, rd, rm);
11343   }
11344 
11345   void Vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm) {
11346     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11347     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11348     VIXL_ASSERT(allow_macro_instructions_);
11349     VIXL_ASSERT(OutsideITBlock());
11350     MacroEmissionCheckScope guard(this);
11351 #ifndef PANDA_BUILD
11352     ITScope it_scope(this, &cond, guard);
11353 #else
11354     ITScope it_scope(allocator_, this, &cond, guard);
11355 #endif
11356     vrintr(cond, dt, rd, rm);
11357   }
11358   void Vrintr(DataType dt, SRegister rd, SRegister rm) {
11359     Vrintr(al, dt, rd, rm);
11360   }
11361 
11362   void Vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm) {
11363     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11364     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11365     VIXL_ASSERT(allow_macro_instructions_);
11366     VIXL_ASSERT(OutsideITBlock());
11367     MacroEmissionCheckScope guard(this);
11368 #ifndef PANDA_BUILD
11369     ITScope it_scope(this, &cond, guard);
11370 #else
11371     ITScope it_scope(allocator_, this, &cond, guard);
11372 #endif
11373     vrintr(cond, dt, rd, rm);
11374   }
11375   void Vrintr(DataType dt, DRegister rd, DRegister rm) {
11376     Vrintr(al, dt, rd, rm);
11377   }
11378 
11379   void Vrintx(Condition cond, DataType dt, DRegister rd, DRegister rm) {
11380     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11381     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11382     VIXL_ASSERT(allow_macro_instructions_);
11383     VIXL_ASSERT(OutsideITBlock());
11384     MacroEmissionCheckScope guard(this);
11385 #ifndef PANDA_BUILD
11386     ITScope it_scope(this, &cond, guard);
11387 #else
11388     ITScope it_scope(allocator_, this, &cond, guard);
11389 #endif
11390     vrintx(cond, dt, rd, rm);
11391   }
11392   void Vrintx(DataType dt, DRegister rd, DRegister rm) {
11393     Vrintx(al, dt, rd, rm);
11394   }
11395 
11396   void Vrintx(DataType dt, QRegister rd, QRegister rm) {
11397     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11398     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11399     VIXL_ASSERT(allow_macro_instructions_);
11400     VIXL_ASSERT(OutsideITBlock());
11401     MacroEmissionCheckScope guard(this);
11402     vrintx(dt, rd, rm);
11403   }
11404 
11405   void Vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm) {
11406     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11407     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11408     VIXL_ASSERT(allow_macro_instructions_);
11409     VIXL_ASSERT(OutsideITBlock());
11410     MacroEmissionCheckScope guard(this);
11411 #ifndef PANDA_BUILD
11412     ITScope it_scope(this, &cond, guard);
11413 #else
11414     ITScope it_scope(allocator_, this, &cond, guard);
11415 #endif
11416     vrintx(cond, dt, rd, rm);
11417   }
11418   void Vrintx(DataType dt, SRegister rd, SRegister rm) {
11419     Vrintx(al, dt, rd, rm);
11420   }
11421 
11422   void Vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
11423     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11424     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11425     VIXL_ASSERT(allow_macro_instructions_);
11426     VIXL_ASSERT(OutsideITBlock());
11427     MacroEmissionCheckScope guard(this);
11428 #ifndef PANDA_BUILD
11429     ITScope it_scope(this, &cond, guard);
11430 #else
11431     ITScope it_scope(allocator_, this, &cond, guard);
11432 #endif
11433     vrintz(cond, dt, rd, rm);
11434   }
11435   void Vrintz(DataType dt, DRegister rd, DRegister rm) {
11436     Vrintz(al, dt, rd, rm);
11437   }
11438 
11439   void Vrintz(DataType dt, QRegister rd, QRegister rm) {
11440     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11441     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11442     VIXL_ASSERT(allow_macro_instructions_);
11443     VIXL_ASSERT(OutsideITBlock());
11444     MacroEmissionCheckScope guard(this);
11445     vrintz(dt, rd, rm);
11446   }
11447 
11448   void Vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm) {
11449     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11450     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11451     VIXL_ASSERT(allow_macro_instructions_);
11452     VIXL_ASSERT(OutsideITBlock());
11453     MacroEmissionCheckScope guard(this);
11454 #ifndef PANDA_BUILD
11455     ITScope it_scope(this, &cond, guard);
11456 #else
11457     ITScope it_scope(allocator_, this, &cond, guard);
11458 #endif
11459     vrintz(cond, dt, rd, rm);
11460   }
11461   void Vrintz(DataType dt, SRegister rd, SRegister rm) {
11462     Vrintz(al, dt, rd, rm);
11463   }
11464 
11465   void Vrshl(
11466       Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
11467     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11468     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11469     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11470     VIXL_ASSERT(allow_macro_instructions_);
11471     VIXL_ASSERT(OutsideITBlock());
11472     MacroEmissionCheckScope guard(this);
11473 #ifndef PANDA_BUILD
11474     ITScope it_scope(this, &cond, guard);
11475 #else
11476     ITScope it_scope(allocator_, this, &cond, guard);
11477 #endif
11478     vrshl(cond, dt, rd, rm, rn);
11479   }
11480   void Vrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
11481     Vrshl(al, dt, rd, rm, rn);
11482   }
11483 
11484   void Vrshl(
11485       Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
11486     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11487     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11488     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11489     VIXL_ASSERT(allow_macro_instructions_);
11490     VIXL_ASSERT(OutsideITBlock());
11491     MacroEmissionCheckScope guard(this);
11492 #ifndef PANDA_BUILD
11493     ITScope it_scope(this, &cond, guard);
11494 #else
11495     ITScope it_scope(allocator_, this, &cond, guard);
11496 #endif
11497     vrshl(cond, dt, rd, rm, rn);
11498   }
11499   void Vrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
11500     Vrshl(al, dt, rd, rm, rn);
11501   }
11502 
11503   void Vrshr(Condition cond,
11504              DataType dt,
11505              DRegister rd,
11506              DRegister rm,
11507              const DOperand& operand) {
11508     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11509     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11510     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11511     VIXL_ASSERT(allow_macro_instructions_);
11512     VIXL_ASSERT(OutsideITBlock());
11513     MacroEmissionCheckScope guard(this);
11514 #ifndef PANDA_BUILD
11515     ITScope it_scope(this, &cond, guard);
11516 #else
11517     ITScope it_scope(allocator_, this, &cond, guard);
11518 #endif
11519     vrshr(cond, dt, rd, rm, operand);
11520   }
11521   void Vrshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
11522     Vrshr(al, dt, rd, rm, operand);
11523   }
11524 
11525   void Vrshr(Condition cond,
11526              DataType dt,
11527              QRegister rd,
11528              QRegister rm,
11529              const QOperand& operand) {
11530     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11531     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11532     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11533     VIXL_ASSERT(allow_macro_instructions_);
11534     VIXL_ASSERT(OutsideITBlock());
11535     MacroEmissionCheckScope guard(this);
11536 #ifndef PANDA_BUILD
11537     ITScope it_scope(this, &cond, guard);
11538 #else
11539     ITScope it_scope(allocator_, this, &cond, guard);
11540 #endif
11541     vrshr(cond, dt, rd, rm, operand);
11542   }
11543   void Vrshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
11544     Vrshr(al, dt, rd, rm, operand);
11545   }
11546 
11547   void Vrshrn(Condition cond,
11548               DataType dt,
11549               DRegister rd,
11550               QRegister rm,
11551               const QOperand& operand) {
11552     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11553     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11554     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11555     VIXL_ASSERT(allow_macro_instructions_);
11556     VIXL_ASSERT(OutsideITBlock());
11557     MacroEmissionCheckScope guard(this);
11558 #ifndef PANDA_BUILD
11559     ITScope it_scope(this, &cond, guard);
11560 #else
11561     ITScope it_scope(allocator_, this, &cond, guard);
11562 #endif
11563     vrshrn(cond, dt, rd, rm, operand);
11564   }
11565   void Vrshrn(DataType dt,
11566               DRegister rd,
11567               QRegister rm,
11568               const QOperand& operand) {
11569     Vrshrn(al, dt, rd, rm, operand);
11570   }
11571 
11572   void Vrsqrte(Condition cond, DataType dt, DRegister rd, DRegister rm) {
11573     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11574     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11575     VIXL_ASSERT(allow_macro_instructions_);
11576     VIXL_ASSERT(OutsideITBlock());
11577     MacroEmissionCheckScope guard(this);
11578 #ifndef PANDA_BUILD
11579     ITScope it_scope(this, &cond, guard);
11580 #else
11581     ITScope it_scope(allocator_, this, &cond, guard);
11582 #endif
11583     vrsqrte(cond, dt, rd, rm);
11584   }
11585   void Vrsqrte(DataType dt, DRegister rd, DRegister rm) {
11586     Vrsqrte(al, dt, rd, rm);
11587   }
11588 
11589   void Vrsqrte(Condition cond, DataType dt, QRegister rd, QRegister rm) {
11590     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11591     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11592     VIXL_ASSERT(allow_macro_instructions_);
11593     VIXL_ASSERT(OutsideITBlock());
11594     MacroEmissionCheckScope guard(this);
11595 #ifndef PANDA_BUILD
11596     ITScope it_scope(this, &cond, guard);
11597 #else
11598     ITScope it_scope(allocator_, this, &cond, guard);
11599 #endif
11600     vrsqrte(cond, dt, rd, rm);
11601   }
11602   void Vrsqrte(DataType dt, QRegister rd, QRegister rm) {
11603     Vrsqrte(al, dt, rd, rm);
11604   }
11605 
11606   void Vrsqrts(
11607       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
11608     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11609     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11610     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11611     VIXL_ASSERT(allow_macro_instructions_);
11612     VIXL_ASSERT(OutsideITBlock());
11613     MacroEmissionCheckScope guard(this);
11614 #ifndef PANDA_BUILD
11615     ITScope it_scope(this, &cond, guard);
11616 #else
11617     ITScope it_scope(allocator_, this, &cond, guard);
11618 #endif
11619     vrsqrts(cond, dt, rd, rn, rm);
11620   }
11621   void Vrsqrts(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
11622     Vrsqrts(al, dt, rd, rn, rm);
11623   }
11624 
11625   void Vrsqrts(
11626       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
11627     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11628     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11629     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11630     VIXL_ASSERT(allow_macro_instructions_);
11631     VIXL_ASSERT(OutsideITBlock());
11632     MacroEmissionCheckScope guard(this);
11633 #ifndef PANDA_BUILD
11634     ITScope it_scope(this, &cond, guard);
11635 #else
11636     ITScope it_scope(allocator_, this, &cond, guard);
11637 #endif
11638     vrsqrts(cond, dt, rd, rn, rm);
11639   }
11640   void Vrsqrts(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
11641     Vrsqrts(al, dt, rd, rn, rm);
11642   }
11643 
11644   void Vrsra(Condition cond,
11645              DataType dt,
11646              DRegister rd,
11647              DRegister rm,
11648              const DOperand& operand) {
11649     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11650     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11651     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11652     VIXL_ASSERT(allow_macro_instructions_);
11653     VIXL_ASSERT(OutsideITBlock());
11654     MacroEmissionCheckScope guard(this);
11655 #ifndef PANDA_BUILD
11656     ITScope it_scope(this, &cond, guard);
11657 #else
11658     ITScope it_scope(allocator_, this, &cond, guard);
11659 #endif
11660     vrsra(cond, dt, rd, rm, operand);
11661   }
11662   void Vrsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
11663     Vrsra(al, dt, rd, rm, operand);
11664   }
11665 
11666   void Vrsra(Condition cond,
11667              DataType dt,
11668              QRegister rd,
11669              QRegister rm,
11670              const QOperand& operand) {
11671     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11672     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11673     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11674     VIXL_ASSERT(allow_macro_instructions_);
11675     VIXL_ASSERT(OutsideITBlock());
11676     MacroEmissionCheckScope guard(this);
11677 #ifndef PANDA_BUILD
11678     ITScope it_scope(this, &cond, guard);
11679 #else
11680     ITScope it_scope(allocator_, this, &cond, guard);
11681 #endif
11682     vrsra(cond, dt, rd, rm, operand);
11683   }
11684   void Vrsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
11685     Vrsra(al, dt, rd, rm, operand);
11686   }
11687 
11688   void Vrsubhn(
11689       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
11690     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11691     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11692     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11693     VIXL_ASSERT(allow_macro_instructions_);
11694     VIXL_ASSERT(OutsideITBlock());
11695     MacroEmissionCheckScope guard(this);
11696 #ifndef PANDA_BUILD
11697     ITScope it_scope(this, &cond, guard);
11698 #else
11699     ITScope it_scope(allocator_, this, &cond, guard);
11700 #endif
11701     vrsubhn(cond, dt, rd, rn, rm);
11702   }
11703   void Vrsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
11704     Vrsubhn(al, dt, rd, rn, rm);
11705   }
11706 
11707   void Vseleq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
11708     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11709     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11710     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11711     VIXL_ASSERT(allow_macro_instructions_);
11712     VIXL_ASSERT(OutsideITBlock());
11713     MacroEmissionCheckScope guard(this);
11714     vseleq(dt, rd, rn, rm);
11715   }
11716 
11717   void Vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
11718     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11719     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11720     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11721     VIXL_ASSERT(allow_macro_instructions_);
11722     VIXL_ASSERT(OutsideITBlock());
11723     MacroEmissionCheckScope guard(this);
11724     vseleq(dt, rd, rn, rm);
11725   }
11726 
11727   void Vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
11728     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11729     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11730     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11731     VIXL_ASSERT(allow_macro_instructions_);
11732     VIXL_ASSERT(OutsideITBlock());
11733     MacroEmissionCheckScope guard(this);
11734     vselge(dt, rd, rn, rm);
11735   }
11736 
11737   void Vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
11738     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11739     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11740     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11741     VIXL_ASSERT(allow_macro_instructions_);
11742     VIXL_ASSERT(OutsideITBlock());
11743     MacroEmissionCheckScope guard(this);
11744     vselge(dt, rd, rn, rm);
11745   }
11746 
11747   void Vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
11748     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11749     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11750     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11751     VIXL_ASSERT(allow_macro_instructions_);
11752     VIXL_ASSERT(OutsideITBlock());
11753     MacroEmissionCheckScope guard(this);
11754     vselgt(dt, rd, rn, rm);
11755   }
11756 
11757   void Vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
11758     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11759     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11760     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11761     VIXL_ASSERT(allow_macro_instructions_);
11762     VIXL_ASSERT(OutsideITBlock());
11763     MacroEmissionCheckScope guard(this);
11764     vselgt(dt, rd, rn, rm);
11765   }
11766 
11767   void Vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
11768     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11769     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11770     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11771     VIXL_ASSERT(allow_macro_instructions_);
11772     VIXL_ASSERT(OutsideITBlock());
11773     MacroEmissionCheckScope guard(this);
11774     vselvs(dt, rd, rn, rm);
11775   }
11776 
11777   void Vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
11778     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11779     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
11780     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11781     VIXL_ASSERT(allow_macro_instructions_);
11782     VIXL_ASSERT(OutsideITBlock());
11783     MacroEmissionCheckScope guard(this);
11784     vselvs(dt, rd, rn, rm);
11785   }
11786 
11787   void Vshl(Condition cond,
11788             DataType dt,
11789             DRegister rd,
11790             DRegister rm,
11791             const DOperand& operand) {
11792     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11793     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11794     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11795     VIXL_ASSERT(allow_macro_instructions_);
11796     VIXL_ASSERT(OutsideITBlock());
11797     MacroEmissionCheckScope guard(this);
11798 #ifndef PANDA_BUILD
11799     ITScope it_scope(this, &cond, guard);
11800 #else
11801     ITScope it_scope(allocator_, this, &cond, guard);
11802 #endif
11803     vshl(cond, dt, rd, rm, operand);
11804   }
11805   void Vshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
11806     Vshl(al, dt, rd, rm, operand);
11807   }
11808 
11809   void Vshl(Condition cond,
11810             DataType dt,
11811             QRegister rd,
11812             QRegister rm,
11813             const QOperand& operand) {
11814     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11815     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11816     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11817     VIXL_ASSERT(allow_macro_instructions_);
11818     VIXL_ASSERT(OutsideITBlock());
11819     MacroEmissionCheckScope guard(this);
11820 #ifndef PANDA_BUILD
11821     ITScope it_scope(this, &cond, guard);
11822 #else
11823     ITScope it_scope(allocator_, this, &cond, guard);
11824 #endif
11825     vshl(cond, dt, rd, rm, operand);
11826   }
11827   void Vshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
11828     Vshl(al, dt, rd, rm, operand);
11829   }
11830 
11831   void Vshll(Condition cond,
11832              DataType dt,
11833              QRegister rd,
11834              DRegister rm,
11835              const DOperand& operand) {
11836     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11837     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11838     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11839     VIXL_ASSERT(allow_macro_instructions_);
11840     VIXL_ASSERT(OutsideITBlock());
11841     MacroEmissionCheckScope guard(this);
11842 #ifndef PANDA_BUILD
11843     ITScope it_scope(this, &cond, guard);
11844 #else
11845     ITScope it_scope(allocator_, this, &cond, guard);
11846 #endif
11847     vshll(cond, dt, rd, rm, operand);
11848   }
11849   void Vshll(DataType dt, QRegister rd, DRegister rm, const DOperand& operand) {
11850     Vshll(al, dt, rd, rm, operand);
11851   }
11852 
11853   void Vshr(Condition cond,
11854             DataType dt,
11855             DRegister rd,
11856             DRegister rm,
11857             const DOperand& operand) {
11858     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11859     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11860     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11861     VIXL_ASSERT(allow_macro_instructions_);
11862     VIXL_ASSERT(OutsideITBlock());
11863     MacroEmissionCheckScope guard(this);
11864 #ifndef PANDA_BUILD
11865     ITScope it_scope(this, &cond, guard);
11866 #else
11867     ITScope it_scope(allocator_, this, &cond, guard);
11868 #endif
11869     vshr(cond, dt, rd, rm, operand);
11870   }
11871   void Vshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
11872     Vshr(al, dt, rd, rm, operand);
11873   }
11874 
11875   void Vshr(Condition cond,
11876             DataType dt,
11877             QRegister rd,
11878             QRegister rm,
11879             const QOperand& operand) {
11880     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11881     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11882     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11883     VIXL_ASSERT(allow_macro_instructions_);
11884     VIXL_ASSERT(OutsideITBlock());
11885     MacroEmissionCheckScope guard(this);
11886 #ifndef PANDA_BUILD
11887     ITScope it_scope(this, &cond, guard);
11888 #else
11889     ITScope it_scope(allocator_, this, &cond, guard);
11890 #endif
11891     vshr(cond, dt, rd, rm, operand);
11892   }
11893   void Vshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
11894     Vshr(al, dt, rd, rm, operand);
11895   }
11896 
11897   void Vshrn(Condition cond,
11898              DataType dt,
11899              DRegister rd,
11900              QRegister rm,
11901              const QOperand& operand) {
11902     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11903     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11904     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11905     VIXL_ASSERT(allow_macro_instructions_);
11906     VIXL_ASSERT(OutsideITBlock());
11907     MacroEmissionCheckScope guard(this);
11908 #ifndef PANDA_BUILD
11909     ITScope it_scope(this, &cond, guard);
11910 #else
11911     ITScope it_scope(allocator_, this, &cond, guard);
11912 #endif
11913     vshrn(cond, dt, rd, rm, operand);
11914   }
11915   void Vshrn(DataType dt, DRegister rd, QRegister rm, const QOperand& operand) {
11916     Vshrn(al, dt, rd, rm, operand);
11917   }
11918 
11919   void Vsli(Condition cond,
11920             DataType dt,
11921             DRegister rd,
11922             DRegister rm,
11923             const DOperand& operand) {
11924     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11925     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11926     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11927     VIXL_ASSERT(allow_macro_instructions_);
11928     VIXL_ASSERT(OutsideITBlock());
11929     MacroEmissionCheckScope guard(this);
11930 #ifndef PANDA_BUILD
11931     ITScope it_scope(this, &cond, guard);
11932 #else
11933     ITScope it_scope(allocator_, this, &cond, guard);
11934 #endif
11935     vsli(cond, dt, rd, rm, operand);
11936   }
11937   void Vsli(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
11938     Vsli(al, dt, rd, rm, operand);
11939   }
11940 
11941   void Vsli(Condition cond,
11942             DataType dt,
11943             QRegister rd,
11944             QRegister rm,
11945             const QOperand& operand) {
11946     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11947     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11948     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
11949     VIXL_ASSERT(allow_macro_instructions_);
11950     VIXL_ASSERT(OutsideITBlock());
11951     MacroEmissionCheckScope guard(this);
11952 #ifndef PANDA_BUILD
11953     ITScope it_scope(this, &cond, guard);
11954 #else
11955     ITScope it_scope(allocator_, this, &cond, guard);
11956 #endif
11957     vsli(cond, dt, rd, rm, operand);
11958   }
11959   void Vsli(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
11960     Vsli(al, dt, rd, rm, operand);
11961   }
11962 
11963   void Vsqrt(Condition cond, DataType dt, SRegister rd, SRegister rm) {
11964     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11965     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11966     VIXL_ASSERT(allow_macro_instructions_);
11967     VIXL_ASSERT(OutsideITBlock());
11968     MacroEmissionCheckScope guard(this);
11969 #ifndef PANDA_BUILD
11970     ITScope it_scope(this, &cond, guard);
11971 #else
11972     ITScope it_scope(allocator_, this, &cond, guard);
11973 #endif
11974     vsqrt(cond, dt, rd, rm);
11975   }
11976   void Vsqrt(DataType dt, SRegister rd, SRegister rm) { Vsqrt(al, dt, rd, rm); }
11977 
11978   void Vsqrt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
11979     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11980     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
11981     VIXL_ASSERT(allow_macro_instructions_);
11982     VIXL_ASSERT(OutsideITBlock());
11983     MacroEmissionCheckScope guard(this);
11984 #ifndef PANDA_BUILD
11985     ITScope it_scope(this, &cond, guard);
11986 #else
11987     ITScope it_scope(allocator_, this, &cond, guard);
11988 #endif
11989     vsqrt(cond, dt, rd, rm);
11990   }
11991   void Vsqrt(DataType dt, DRegister rd, DRegister rm) { Vsqrt(al, dt, rd, rm); }
11992 
11993   void Vsra(Condition cond,
11994             DataType dt,
11995             DRegister rd,
11996             DRegister rm,
11997             const DOperand& operand) {
11998     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
11999     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12000     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12001     VIXL_ASSERT(allow_macro_instructions_);
12002     VIXL_ASSERT(OutsideITBlock());
12003     MacroEmissionCheckScope guard(this);
12004 #ifndef PANDA_BUILD
12005     ITScope it_scope(this, &cond, guard);
12006 #else
12007     ITScope it_scope(allocator_, this, &cond, guard);
12008 #endif
12009     vsra(cond, dt, rd, rm, operand);
12010   }
12011   void Vsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
12012     Vsra(al, dt, rd, rm, operand);
12013   }
12014 
12015   void Vsra(Condition cond,
12016             DataType dt,
12017             QRegister rd,
12018             QRegister rm,
12019             const QOperand& operand) {
12020     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12021     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12022     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12023     VIXL_ASSERT(allow_macro_instructions_);
12024     VIXL_ASSERT(OutsideITBlock());
12025     MacroEmissionCheckScope guard(this);
12026 #ifndef PANDA_BUILD
12027     ITScope it_scope(this, &cond, guard);
12028 #else
12029     ITScope it_scope(allocator_, this, &cond, guard);
12030 #endif
12031     vsra(cond, dt, rd, rm, operand);
12032   }
12033   void Vsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
12034     Vsra(al, dt, rd, rm, operand);
12035   }
12036 
12037   void Vsri(Condition cond,
12038             DataType dt,
12039             DRegister rd,
12040             DRegister rm,
12041             const DOperand& operand) {
12042     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12043     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12044     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12045     VIXL_ASSERT(allow_macro_instructions_);
12046     VIXL_ASSERT(OutsideITBlock());
12047     MacroEmissionCheckScope guard(this);
12048 #ifndef PANDA_BUILD
12049     ITScope it_scope(this, &cond, guard);
12050 #else
12051     ITScope it_scope(allocator_, this, &cond, guard);
12052 #endif
12053     vsri(cond, dt, rd, rm, operand);
12054   }
12055   void Vsri(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
12056     Vsri(al, dt, rd, rm, operand);
12057   }
12058 
12059   void Vsri(Condition cond,
12060             DataType dt,
12061             QRegister rd,
12062             QRegister rm,
12063             const QOperand& operand) {
12064     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12065     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12066     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12067     VIXL_ASSERT(allow_macro_instructions_);
12068     VIXL_ASSERT(OutsideITBlock());
12069     MacroEmissionCheckScope guard(this);
12070 #ifndef PANDA_BUILD
12071     ITScope it_scope(this, &cond, guard);
12072 #else
12073     ITScope it_scope(allocator_, this, &cond, guard);
12074 #endif
12075     vsri(cond, dt, rd, rm, operand);
12076   }
12077   void Vsri(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
12078     Vsri(al, dt, rd, rm, operand);
12079   }
12080 
12081   void Vst1(Condition cond,
12082             DataType dt,
12083             const NeonRegisterList& nreglist,
12084             const AlignedMemOperand& operand) {
12085     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
12086     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12087     VIXL_ASSERT(allow_macro_instructions_);
12088     VIXL_ASSERT(OutsideITBlock());
12089     MacroEmissionCheckScope guard(this);
12090 #ifndef PANDA_BUILD
12091     ITScope it_scope(this, &cond, guard);
12092 #else
12093     ITScope it_scope(allocator_, this, &cond, guard);
12094 #endif
12095     vst1(cond, dt, nreglist, operand);
12096   }
12097   void Vst1(DataType dt,
12098             const NeonRegisterList& nreglist,
12099             const AlignedMemOperand& operand) {
12100     Vst1(al, dt, nreglist, operand);
12101   }
12102 
12103   void Vst2(Condition cond,
12104             DataType dt,
12105             const NeonRegisterList& nreglist,
12106             const AlignedMemOperand& operand) {
12107     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
12108     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12109     VIXL_ASSERT(allow_macro_instructions_);
12110     VIXL_ASSERT(OutsideITBlock());
12111     MacroEmissionCheckScope guard(this);
12112 #ifndef PANDA_BUILD
12113     ITScope it_scope(this, &cond, guard);
12114 #else
12115     ITScope it_scope(allocator_, this, &cond, guard);
12116 #endif
12117     vst2(cond, dt, nreglist, operand);
12118   }
12119   void Vst2(DataType dt,
12120             const NeonRegisterList& nreglist,
12121             const AlignedMemOperand& operand) {
12122     Vst2(al, dt, nreglist, operand);
12123   }
12124 
12125   void Vst3(Condition cond,
12126             DataType dt,
12127             const NeonRegisterList& nreglist,
12128             const AlignedMemOperand& operand) {
12129     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
12130     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12131     VIXL_ASSERT(allow_macro_instructions_);
12132     VIXL_ASSERT(OutsideITBlock());
12133     MacroEmissionCheckScope guard(this);
12134 #ifndef PANDA_BUILD
12135     ITScope it_scope(this, &cond, guard);
12136 #else
12137     ITScope it_scope(allocator_, this, &cond, guard);
12138 #endif
12139     vst3(cond, dt, nreglist, operand);
12140   }
12141   void Vst3(DataType dt,
12142             const NeonRegisterList& nreglist,
12143             const AlignedMemOperand& operand) {
12144     Vst3(al, dt, nreglist, operand);
12145   }
12146 
12147   void Vst3(Condition cond,
12148             DataType dt,
12149             const NeonRegisterList& nreglist,
12150             const MemOperand& operand) {
12151     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
12152     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12153     VIXL_ASSERT(allow_macro_instructions_);
12154     VIXL_ASSERT(OutsideITBlock());
12155     MacroEmissionCheckScope guard(this);
12156 #ifndef PANDA_BUILD
12157     ITScope it_scope(this, &cond, guard);
12158 #else
12159     ITScope it_scope(allocator_, this, &cond, guard);
12160 #endif
12161     vst3(cond, dt, nreglist, operand);
12162   }
12163   void Vst3(DataType dt,
12164             const NeonRegisterList& nreglist,
12165             const MemOperand& operand) {
12166     Vst3(al, dt, nreglist, operand);
12167   }
12168 
12169   void Vst4(Condition cond,
12170             DataType dt,
12171             const NeonRegisterList& nreglist,
12172             const AlignedMemOperand& operand) {
12173     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
12174     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12175     VIXL_ASSERT(allow_macro_instructions_);
12176     VIXL_ASSERT(OutsideITBlock());
12177     MacroEmissionCheckScope guard(this);
12178 #ifndef PANDA_BUILD
12179     ITScope it_scope(this, &cond, guard);
12180 #else
12181     ITScope it_scope(allocator_, this, &cond, guard);
12182 #endif
12183     vst4(cond, dt, nreglist, operand);
12184   }
12185   void Vst4(DataType dt,
12186             const NeonRegisterList& nreglist,
12187             const AlignedMemOperand& operand) {
12188     Vst4(al, dt, nreglist, operand);
12189   }
12190 
12191   void Vstm(Condition cond,
12192             DataType dt,
12193             Register rn,
12194             WriteBack write_back,
12195             DRegisterList dreglist) {
12196     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12197     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
12198     VIXL_ASSERT(allow_macro_instructions_);
12199     VIXL_ASSERT(OutsideITBlock());
12200     MacroEmissionCheckScope guard(this);
12201 #ifndef PANDA_BUILD
12202     ITScope it_scope(this, &cond, guard);
12203 #else
12204     ITScope it_scope(allocator_, this, &cond, guard);
12205 #endif
12206     vstm(cond, dt, rn, write_back, dreglist);
12207   }
12208   void Vstm(DataType dt,
12209             Register rn,
12210             WriteBack write_back,
12211             DRegisterList dreglist) {
12212     Vstm(al, dt, rn, write_back, dreglist);
12213   }
12214   void Vstm(Condition cond,
12215             Register rn,
12216             WriteBack write_back,
12217             DRegisterList dreglist) {
12218     Vstm(cond, kDataTypeValueNone, rn, write_back, dreglist);
12219   }
12220   void Vstm(Register rn, WriteBack write_back, DRegisterList dreglist) {
12221     Vstm(al, kDataTypeValueNone, rn, write_back, dreglist);
12222   }
12223 
12224   void Vstm(Condition cond,
12225             DataType dt,
12226             Register rn,
12227             WriteBack write_back,
12228             SRegisterList sreglist) {
12229     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12230     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
12231     VIXL_ASSERT(allow_macro_instructions_);
12232     VIXL_ASSERT(OutsideITBlock());
12233     MacroEmissionCheckScope guard(this);
12234 #ifndef PANDA_BUILD
12235     ITScope it_scope(this, &cond, guard);
12236 #else
12237     ITScope it_scope(allocator_, this, &cond, guard);
12238 #endif
12239     vstm(cond, dt, rn, write_back, sreglist);
12240   }
12241   void Vstm(DataType dt,
12242             Register rn,
12243             WriteBack write_back,
12244             SRegisterList sreglist) {
12245     Vstm(al, dt, rn, write_back, sreglist);
12246   }
12247   void Vstm(Condition cond,
12248             Register rn,
12249             WriteBack write_back,
12250             SRegisterList sreglist) {
12251     Vstm(cond, kDataTypeValueNone, rn, write_back, sreglist);
12252   }
12253   void Vstm(Register rn, WriteBack write_back, SRegisterList sreglist) {
12254     Vstm(al, kDataTypeValueNone, rn, write_back, sreglist);
12255   }
12256 
12257   void Vstmdb(Condition cond,
12258               DataType dt,
12259               Register rn,
12260               WriteBack write_back,
12261               DRegisterList dreglist) {
12262     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12263     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
12264     VIXL_ASSERT(allow_macro_instructions_);
12265     VIXL_ASSERT(OutsideITBlock());
12266     MacroEmissionCheckScope guard(this);
12267 #ifndef PANDA_BUILD
12268     ITScope it_scope(this, &cond, guard);
12269 #else
12270     ITScope it_scope(allocator_, this, &cond, guard);
12271 #endif
12272     vstmdb(cond, dt, rn, write_back, dreglist);
12273   }
12274   void Vstmdb(DataType dt,
12275               Register rn,
12276               WriteBack write_back,
12277               DRegisterList dreglist) {
12278     Vstmdb(al, dt, rn, write_back, dreglist);
12279   }
12280   void Vstmdb(Condition cond,
12281               Register rn,
12282               WriteBack write_back,
12283               DRegisterList dreglist) {
12284     Vstmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
12285   }
12286   void Vstmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
12287     Vstmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
12288   }
12289 
12290   void Vstmdb(Condition cond,
12291               DataType dt,
12292               Register rn,
12293               WriteBack write_back,
12294               SRegisterList sreglist) {
12295     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12296     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
12297     VIXL_ASSERT(allow_macro_instructions_);
12298     VIXL_ASSERT(OutsideITBlock());
12299     MacroEmissionCheckScope guard(this);
12300 #ifndef PANDA_BUILD
12301     ITScope it_scope(this, &cond, guard);
12302 #else
12303     ITScope it_scope(allocator_, this, &cond, guard);
12304 #endif
12305     vstmdb(cond, dt, rn, write_back, sreglist);
12306   }
12307   void Vstmdb(DataType dt,
12308               Register rn,
12309               WriteBack write_back,
12310               SRegisterList sreglist) {
12311     Vstmdb(al, dt, rn, write_back, sreglist);
12312   }
12313   void Vstmdb(Condition cond,
12314               Register rn,
12315               WriteBack write_back,
12316               SRegisterList sreglist) {
12317     Vstmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
12318   }
12319   void Vstmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
12320     Vstmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
12321   }
12322 
12323   void Vstmia(Condition cond,
12324               DataType dt,
12325               Register rn,
12326               WriteBack write_back,
12327               DRegisterList dreglist) {
12328     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12329     VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
12330     VIXL_ASSERT(allow_macro_instructions_);
12331     VIXL_ASSERT(OutsideITBlock());
12332     MacroEmissionCheckScope guard(this);
12333 #ifndef PANDA_BUILD
12334     ITScope it_scope(this, &cond, guard);
12335 #else
12336     ITScope it_scope(allocator_, this, &cond, guard);
12337 #endif
12338     vstmia(cond, dt, rn, write_back, dreglist);
12339   }
12340   void Vstmia(DataType dt,
12341               Register rn,
12342               WriteBack write_back,
12343               DRegisterList dreglist) {
12344     Vstmia(al, dt, rn, write_back, dreglist);
12345   }
12346   void Vstmia(Condition cond,
12347               Register rn,
12348               WriteBack write_back,
12349               DRegisterList dreglist) {
12350     Vstmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
12351   }
12352   void Vstmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
12353     Vstmia(al, kDataTypeValueNone, rn, write_back, dreglist);
12354   }
12355 
12356   void Vstmia(Condition cond,
12357               DataType dt,
12358               Register rn,
12359               WriteBack write_back,
12360               SRegisterList sreglist) {
12361     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12362     VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
12363     VIXL_ASSERT(allow_macro_instructions_);
12364     VIXL_ASSERT(OutsideITBlock());
12365     MacroEmissionCheckScope guard(this);
12366 #ifndef PANDA_BUILD
12367     ITScope it_scope(this, &cond, guard);
12368 #else
12369     ITScope it_scope(allocator_, this, &cond, guard);
12370 #endif
12371     vstmia(cond, dt, rn, write_back, sreglist);
12372   }
12373   void Vstmia(DataType dt,
12374               Register rn,
12375               WriteBack write_back,
12376               SRegisterList sreglist) {
12377     Vstmia(al, dt, rn, write_back, sreglist);
12378   }
12379   void Vstmia(Condition cond,
12380               Register rn,
12381               WriteBack write_back,
12382               SRegisterList sreglist) {
12383     Vstmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
12384   }
12385   void Vstmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
12386     Vstmia(al, kDataTypeValueNone, rn, write_back, sreglist);
12387   }
12388 
12389   void Vstr(Condition cond,
12390             DataType dt,
12391             DRegister rd,
12392             const MemOperand& operand) {
12393     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12394     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12395     VIXL_ASSERT(allow_macro_instructions_);
12396     VIXL_ASSERT(OutsideITBlock());
12397     MacroEmissionCheckScope guard(this);
12398 #ifndef PANDA_BUILD
12399     ITScope it_scope(this, &cond, guard);
12400 #else
12401     ITScope it_scope(allocator_, this, &cond, guard);
12402 #endif
12403     vstr(cond, dt, rd, operand);
12404   }
12405   void Vstr(DataType dt, DRegister rd, const MemOperand& operand) {
12406     Vstr(al, dt, rd, operand);
12407   }
12408   void Vstr(Condition cond, DRegister rd, const MemOperand& operand) {
12409     Vstr(cond, Untyped64, rd, operand);
12410   }
12411   void Vstr(DRegister rd, const MemOperand& operand) {
12412     Vstr(al, Untyped64, rd, operand);
12413   }
12414 
12415   void Vstr(Condition cond,
12416             DataType dt,
12417             SRegister rd,
12418             const MemOperand& operand) {
12419     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12420     VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
12421     VIXL_ASSERT(allow_macro_instructions_);
12422     VIXL_ASSERT(OutsideITBlock());
12423     MacroEmissionCheckScope guard(this);
12424 #ifndef PANDA_BUILD
12425     ITScope it_scope(this, &cond, guard);
12426 #else
12427     ITScope it_scope(allocator_, this, &cond, guard);
12428 #endif
12429     vstr(cond, dt, rd, operand);
12430   }
12431   void Vstr(DataType dt, SRegister rd, const MemOperand& operand) {
12432     Vstr(al, dt, rd, operand);
12433   }
12434   void Vstr(Condition cond, SRegister rd, const MemOperand& operand) {
12435     Vstr(cond, Untyped32, rd, operand);
12436   }
12437   void Vstr(SRegister rd, const MemOperand& operand) {
12438     Vstr(al, Untyped32, rd, operand);
12439   }
12440 
12441   void Vsub(
12442       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
12443     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12444     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12445     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12446     VIXL_ASSERT(allow_macro_instructions_);
12447     VIXL_ASSERT(OutsideITBlock());
12448     MacroEmissionCheckScope guard(this);
12449 #ifndef PANDA_BUILD
12450     ITScope it_scope(this, &cond, guard);
12451 #else
12452     ITScope it_scope(allocator_, this, &cond, guard);
12453 #endif
12454     vsub(cond, dt, rd, rn, rm);
12455   }
12456   void Vsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
12457     Vsub(al, dt, rd, rn, rm);
12458   }
12459 
12460   void Vsub(
12461       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
12462     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12463     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12464     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12465     VIXL_ASSERT(allow_macro_instructions_);
12466     VIXL_ASSERT(OutsideITBlock());
12467     MacroEmissionCheckScope guard(this);
12468 #ifndef PANDA_BUILD
12469     ITScope it_scope(this, &cond, guard);
12470 #else
12471     ITScope it_scope(allocator_, this, &cond, guard);
12472 #endif
12473     vsub(cond, dt, rd, rn, rm);
12474   }
12475   void Vsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
12476     Vsub(al, dt, rd, rn, rm);
12477   }
12478 
12479   void Vsub(
12480       Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
12481     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12482     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12483     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12484     VIXL_ASSERT(allow_macro_instructions_);
12485     VIXL_ASSERT(OutsideITBlock());
12486     MacroEmissionCheckScope guard(this);
12487 #ifndef PANDA_BUILD
12488     ITScope it_scope(this, &cond, guard);
12489 #else
12490     ITScope it_scope(allocator_, this, &cond, guard);
12491 #endif
12492     vsub(cond, dt, rd, rn, rm);
12493   }
12494   void Vsub(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
12495     Vsub(al, dt, rd, rn, rm);
12496   }
12497 
12498   void Vsubhn(
12499       Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
12500     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12501     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12502     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12503     VIXL_ASSERT(allow_macro_instructions_);
12504     VIXL_ASSERT(OutsideITBlock());
12505     MacroEmissionCheckScope guard(this);
12506 #ifndef PANDA_BUILD
12507     ITScope it_scope(this, &cond, guard);
12508 #else
12509     ITScope it_scope(allocator_, this, &cond, guard);
12510 #endif
12511     vsubhn(cond, dt, rd, rn, rm);
12512   }
12513   void Vsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
12514     Vsubhn(al, dt, rd, rn, rm);
12515   }
12516 
12517   void Vsubl(
12518       Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
12519     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12520     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12521     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12522     VIXL_ASSERT(allow_macro_instructions_);
12523     VIXL_ASSERT(OutsideITBlock());
12524     MacroEmissionCheckScope guard(this);
12525 #ifndef PANDA_BUILD
12526     ITScope it_scope(this, &cond, guard);
12527 #else
12528     ITScope it_scope(allocator_, this, &cond, guard);
12529 #endif
12530     vsubl(cond, dt, rd, rn, rm);
12531   }
12532   void Vsubl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
12533     Vsubl(al, dt, rd, rn, rm);
12534   }
12535 
12536   void Vsubw(
12537       Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
12538     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12539     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12540     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12541     VIXL_ASSERT(allow_macro_instructions_);
12542     VIXL_ASSERT(OutsideITBlock());
12543     MacroEmissionCheckScope guard(this);
12544 #ifndef PANDA_BUILD
12545     ITScope it_scope(this, &cond, guard);
12546 #else
12547     ITScope it_scope(allocator_, this, &cond, guard);
12548 #endif
12549     vsubw(cond, dt, rd, rn, rm);
12550   }
12551   void Vsubw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
12552     Vsubw(al, dt, rd, rn, rm);
12553   }
12554 
12555   void Vswp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
12556     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12557     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12558     VIXL_ASSERT(allow_macro_instructions_);
12559     VIXL_ASSERT(OutsideITBlock());
12560     MacroEmissionCheckScope guard(this);
12561 #ifndef PANDA_BUILD
12562     ITScope it_scope(this, &cond, guard);
12563 #else
12564     ITScope it_scope(allocator_, this, &cond, guard);
12565 #endif
12566     vswp(cond, dt, rd, rm);
12567   }
12568   void Vswp(DataType dt, DRegister rd, DRegister rm) { Vswp(al, dt, rd, rm); }
12569   void Vswp(Condition cond, DRegister rd, DRegister rm) {
12570     Vswp(cond, kDataTypeValueNone, rd, rm);
12571   }
12572   void Vswp(DRegister rd, DRegister rm) {
12573     Vswp(al, kDataTypeValueNone, rd, rm);
12574   }
12575 
12576   void Vswp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
12577     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12578     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12579     VIXL_ASSERT(allow_macro_instructions_);
12580     VIXL_ASSERT(OutsideITBlock());
12581     MacroEmissionCheckScope guard(this);
12582 #ifndef PANDA_BUILD
12583     ITScope it_scope(this, &cond, guard);
12584 #else
12585     ITScope it_scope(allocator_, this, &cond, guard);
12586 #endif
12587     vswp(cond, dt, rd, rm);
12588   }
12589   void Vswp(DataType dt, QRegister rd, QRegister rm) { Vswp(al, dt, rd, rm); }
12590   void Vswp(Condition cond, QRegister rd, QRegister rm) {
12591     Vswp(cond, kDataTypeValueNone, rd, rm);
12592   }
12593   void Vswp(QRegister rd, QRegister rm) {
12594     Vswp(al, kDataTypeValueNone, rd, rm);
12595   }
12596 
12597   void Vtbl(Condition cond,
12598             DataType dt,
12599             DRegister rd,
12600             const NeonRegisterList& nreglist,
12601             DRegister rm) {
12602     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12603     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
12604     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12605     VIXL_ASSERT(allow_macro_instructions_);
12606     VIXL_ASSERT(OutsideITBlock());
12607     MacroEmissionCheckScope guard(this);
12608 #ifndef PANDA_BUILD
12609     ITScope it_scope(this, &cond, guard);
12610 #else
12611     ITScope it_scope(allocator_, this, &cond, guard);
12612 #endif
12613     vtbl(cond, dt, rd, nreglist, rm);
12614   }
12615   void Vtbl(DataType dt,
12616             DRegister rd,
12617             const NeonRegisterList& nreglist,
12618             DRegister rm) {
12619     Vtbl(al, dt, rd, nreglist, rm);
12620   }
12621 
12622   void Vtbx(Condition cond,
12623             DataType dt,
12624             DRegister rd,
12625             const NeonRegisterList& nreglist,
12626             DRegister rm) {
12627     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12628     VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
12629     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12630     VIXL_ASSERT(allow_macro_instructions_);
12631     VIXL_ASSERT(OutsideITBlock());
12632     MacroEmissionCheckScope guard(this);
12633 #ifndef PANDA_BUILD
12634     ITScope it_scope(this, &cond, guard);
12635 #else
12636     ITScope it_scope(allocator_, this, &cond, guard);
12637 #endif
12638     vtbx(cond, dt, rd, nreglist, rm);
12639   }
12640   void Vtbx(DataType dt,
12641             DRegister rd,
12642             const NeonRegisterList& nreglist,
12643             DRegister rm) {
12644     Vtbx(al, dt, rd, nreglist, rm);
12645   }
12646 
12647   void Vtrn(Condition cond, DataType dt, DRegister rd, DRegister rm) {
12648     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12649     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12650     VIXL_ASSERT(allow_macro_instructions_);
12651     VIXL_ASSERT(OutsideITBlock());
12652     MacroEmissionCheckScope guard(this);
12653 #ifndef PANDA_BUILD
12654     ITScope it_scope(this, &cond, guard);
12655 #else
12656     ITScope it_scope(allocator_, this, &cond, guard);
12657 #endif
12658     vtrn(cond, dt, rd, rm);
12659   }
12660   void Vtrn(DataType dt, DRegister rd, DRegister rm) { Vtrn(al, dt, rd, rm); }
12661 
12662   void Vtrn(Condition cond, DataType dt, QRegister rd, QRegister rm) {
12663     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12664     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12665     VIXL_ASSERT(allow_macro_instructions_);
12666     VIXL_ASSERT(OutsideITBlock());
12667     MacroEmissionCheckScope guard(this);
12668 #ifndef PANDA_BUILD
12669     ITScope it_scope(this, &cond, guard);
12670 #else
12671     ITScope it_scope(allocator_, this, &cond, guard);
12672 #endif
12673     vtrn(cond, dt, rd, rm);
12674   }
12675   void Vtrn(DataType dt, QRegister rd, QRegister rm) { Vtrn(al, dt, rd, rm); }
12676 
12677   void Vtst(
12678       Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
12679     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12680     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12681     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12682     VIXL_ASSERT(allow_macro_instructions_);
12683     VIXL_ASSERT(OutsideITBlock());
12684     MacroEmissionCheckScope guard(this);
12685 #ifndef PANDA_BUILD
12686     ITScope it_scope(this, &cond, guard);
12687 #else
12688     ITScope it_scope(allocator_, this, &cond, guard);
12689 #endif
12690     vtst(cond, dt, rd, rn, rm);
12691   }
12692   void Vtst(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
12693     Vtst(al, dt, rd, rn, rm);
12694   }
12695 
12696   void Vtst(
12697       Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
12698     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12699     VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
12700     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12701     VIXL_ASSERT(allow_macro_instructions_);
12702     VIXL_ASSERT(OutsideITBlock());
12703     MacroEmissionCheckScope guard(this);
12704 #ifndef PANDA_BUILD
12705     ITScope it_scope(this, &cond, guard);
12706 #else
12707     ITScope it_scope(allocator_, this, &cond, guard);
12708 #endif
12709     vtst(cond, dt, rd, rn, rm);
12710   }
12711   void Vtst(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
12712     Vtst(al, dt, rd, rn, rm);
12713   }
12714 
12715   void Vuzp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
12716     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12717     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12718     VIXL_ASSERT(allow_macro_instructions_);
12719     VIXL_ASSERT(OutsideITBlock());
12720     MacroEmissionCheckScope guard(this);
12721 #ifndef PANDA_BUILD
12722     ITScope it_scope(this, &cond, guard);
12723 #else
12724     ITScope it_scope(allocator_, this, &cond, guard);
12725 #endif
12726     vuzp(cond, dt, rd, rm);
12727   }
12728   void Vuzp(DataType dt, DRegister rd, DRegister rm) { Vuzp(al, dt, rd, rm); }
12729 
12730   void Vuzp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
12731     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12732     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12733     VIXL_ASSERT(allow_macro_instructions_);
12734     VIXL_ASSERT(OutsideITBlock());
12735     MacroEmissionCheckScope guard(this);
12736 #ifndef PANDA_BUILD
12737     ITScope it_scope(this, &cond, guard);
12738 #else
12739     ITScope it_scope(allocator_, this, &cond, guard);
12740 #endif
12741     vuzp(cond, dt, rd, rm);
12742   }
12743   void Vuzp(DataType dt, QRegister rd, QRegister rm) { Vuzp(al, dt, rd, rm); }
12744 
12745   void Vzip(Condition cond, DataType dt, DRegister rd, DRegister rm) {
12746     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12747     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12748     VIXL_ASSERT(allow_macro_instructions_);
12749     VIXL_ASSERT(OutsideITBlock());
12750     MacroEmissionCheckScope guard(this);
12751 #ifndef PANDA_BUILD
12752     ITScope it_scope(this, &cond, guard);
12753 #else
12754     ITScope it_scope(allocator_, this, &cond, guard);
12755 #endif
12756     vzip(cond, dt, rd, rm);
12757   }
12758   void Vzip(DataType dt, DRegister rd, DRegister rm) { Vzip(al, dt, rd, rm); }
12759 
12760   void Vzip(Condition cond, DataType dt, QRegister rd, QRegister rm) {
12761     VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
12762     VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
12763     VIXL_ASSERT(allow_macro_instructions_);
12764     VIXL_ASSERT(OutsideITBlock());
12765     MacroEmissionCheckScope guard(this);
12766 #ifndef PANDA_BUILD
12767     ITScope it_scope(this, &cond, guard);
12768 #else
12769     ITScope it_scope(allocator_, this, &cond, guard);
12770 #endif
12771     vzip(cond, dt, rd, rm);
12772   }
12773   void Vzip(DataType dt, QRegister rd, QRegister rm) { Vzip(al, dt, rd, rm); }
12774 
12775   void Yield(Condition cond) {
12776     VIXL_ASSERT(allow_macro_instructions_);
12777     VIXL_ASSERT(OutsideITBlock());
12778     MacroEmissionCheckScope guard(this);
12779 #ifndef PANDA_BUILD
12780     ITScope it_scope(this, &cond, guard);
12781 #else
12782     ITScope it_scope(allocator_, this, &cond, guard);
12783 #endif
12784     yield(cond);
12785   }
12786   void Yield() { Yield(al); }
12787   void Vabs(Condition cond, VRegister rd, VRegister rm) {
12788     VIXL_ASSERT(rd.IsS() || rd.IsD());
12789     VIXL_ASSERT(rd.GetType() == rm.GetType());
12790     if (rd.IsS()) {
12791       Vabs(cond, F32, rd.S(), rm.S());
12792     } else {
12793       Vabs(cond, F64, rd.D(), rm.D());
12794     }
12795   }
12796   void Vabs(VRegister rd, VRegister rm) { Vabs(al, rd, rm); }
12797   void Vadd(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12798     VIXL_ASSERT(rd.IsS() || rd.IsD());
12799     VIXL_ASSERT(rd.GetType() == rn.GetType());
12800     VIXL_ASSERT(rd.GetType() == rm.GetType());
12801     if (rd.IsS()) {
12802       Vadd(cond, F32, rd.S(), rn.S(), rm.S());
12803     } else {
12804       Vadd(cond, F64, rd.D(), rn.D(), rm.D());
12805     }
12806   }
12807   void Vadd(VRegister rd, VRegister rn, VRegister rm) { Vadd(al, rd, rn, rm); }
12808   void Vcmp(Condition cond, VRegister rd, VRegister rm) {
12809     VIXL_ASSERT(rd.IsS() || rd.IsD());
12810     VIXL_ASSERT(rd.GetType() == rm.GetType());
12811     if (rd.IsS()) {
12812       Vcmp(cond, F32, rd.S(), rm.S());
12813     } else {
12814       Vcmp(cond, F64, rd.D(), rm.D());
12815     }
12816   }
12817   void Vcmp(VRegister rd, VRegister rm) { Vcmp(al, rd, rm); }
12818   void Vcmpe(Condition cond, VRegister rd, VRegister rm) {
12819     VIXL_ASSERT(rd.IsS() || rd.IsD());
12820     VIXL_ASSERT(rd.GetType() == rm.GetType());
12821     if (rd.IsS()) {
12822       Vcmpe(cond, F32, rd.S(), rm.S());
12823     } else {
12824       Vcmpe(cond, F64, rd.D(), rm.D());
12825     }
12826   }
12827   void Vcmpe(VRegister rd, VRegister rm) { Vcmpe(al, rd, rm); }
12828   void Vdiv(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12829     VIXL_ASSERT(rd.IsS() || rd.IsD());
12830     VIXL_ASSERT(rd.GetType() == rn.GetType());
12831     VIXL_ASSERT(rd.GetType() == rm.GetType());
12832     if (rd.IsS()) {
12833       Vdiv(cond, F32, rd.S(), rn.S(), rm.S());
12834     } else {
12835       Vdiv(cond, F64, rd.D(), rn.D(), rm.D());
12836     }
12837   }
12838   void Vdiv(VRegister rd, VRegister rn, VRegister rm) { Vdiv(al, rd, rn, rm); }
12839   void Vfma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12840     VIXL_ASSERT(rd.IsS() || rd.IsD());
12841     VIXL_ASSERT(rd.GetType() == rn.GetType());
12842     VIXL_ASSERT(rd.GetType() == rm.GetType());
12843     if (rd.IsS()) {
12844       Vfma(cond, F32, rd.S(), rn.S(), rm.S());
12845     } else {
12846       Vfma(cond, F64, rd.D(), rn.D(), rm.D());
12847     }
12848   }
12849   void Vfma(VRegister rd, VRegister rn, VRegister rm) { Vfma(al, rd, rn, rm); }
12850   void Vfms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12851     VIXL_ASSERT(rd.IsS() || rd.IsD());
12852     VIXL_ASSERT(rd.GetType() == rn.GetType());
12853     VIXL_ASSERT(rd.GetType() == rm.GetType());
12854     if (rd.IsS()) {
12855       Vfms(cond, F32, rd.S(), rn.S(), rm.S());
12856     } else {
12857       Vfms(cond, F64, rd.D(), rn.D(), rm.D());
12858     }
12859   }
12860   void Vfms(VRegister rd, VRegister rn, VRegister rm) { Vfms(al, rd, rn, rm); }
12861   void Vfnma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12862     VIXL_ASSERT(rd.IsS() || rd.IsD());
12863     VIXL_ASSERT(rd.GetType() == rn.GetType());
12864     VIXL_ASSERT(rd.GetType() == rm.GetType());
12865     if (rd.IsS()) {
12866       Vfnma(cond, F32, rd.S(), rn.S(), rm.S());
12867     } else {
12868       Vfnma(cond, F64, rd.D(), rn.D(), rm.D());
12869     }
12870   }
12871   void Vfnma(VRegister rd, VRegister rn, VRegister rm) {
12872     Vfnma(al, rd, rn, rm);
12873   }
12874   void Vfnms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12875     VIXL_ASSERT(rd.IsS() || rd.IsD());
12876     VIXL_ASSERT(rd.GetType() == rn.GetType());
12877     VIXL_ASSERT(rd.GetType() == rm.GetType());
12878     if (rd.IsS()) {
12879       Vfnms(cond, F32, rd.S(), rn.S(), rm.S());
12880     } else {
12881       Vfnms(cond, F64, rd.D(), rn.D(), rm.D());
12882     }
12883   }
12884   void Vfnms(VRegister rd, VRegister rn, VRegister rm) {
12885     Vfnms(al, rd, rn, rm);
12886   }
12887   void Vmaxnm(VRegister rd, VRegister rn, VRegister rm) {
12888     VIXL_ASSERT(rd.IsS() || rd.IsD());
12889     VIXL_ASSERT(rd.GetType() == rn.GetType());
12890     VIXL_ASSERT(rd.GetType() == rm.GetType());
12891     if (rd.IsS()) {
12892       Vmaxnm(F32, rd.S(), rn.S(), rm.S());
12893     } else {
12894       Vmaxnm(F64, rd.D(), rn.D(), rm.D());
12895     }
12896   }
12897   void Vminnm(VRegister rd, VRegister rn, VRegister rm) {
12898     VIXL_ASSERT(rd.IsS() || rd.IsD());
12899     VIXL_ASSERT(rd.GetType() == rn.GetType());
12900     VIXL_ASSERT(rd.GetType() == rm.GetType());
12901     if (rd.IsS()) {
12902       Vminnm(F32, rd.S(), rn.S(), rm.S());
12903     } else {
12904       Vminnm(F64, rd.D(), rn.D(), rm.D());
12905     }
12906   }
12907   void Vmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12908     VIXL_ASSERT(rd.IsS() || rd.IsD());
12909     VIXL_ASSERT(rd.GetType() == rn.GetType());
12910     VIXL_ASSERT(rd.GetType() == rm.GetType());
12911     if (rd.IsS()) {
12912       Vmla(cond, F32, rd.S(), rn.S(), rm.S());
12913     } else {
12914       Vmla(cond, F64, rd.D(), rn.D(), rm.D());
12915     }
12916   }
12917   void Vmla(VRegister rd, VRegister rn, VRegister rm) { Vmla(al, rd, rn, rm); }
12918   void Vmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12919     VIXL_ASSERT(rd.IsS() || rd.IsD());
12920     VIXL_ASSERT(rd.GetType() == rn.GetType());
12921     VIXL_ASSERT(rd.GetType() == rm.GetType());
12922     if (rd.IsS()) {
12923       Vmls(cond, F32, rd.S(), rn.S(), rm.S());
12924     } else {
12925       Vmls(cond, F64, rd.D(), rn.D(), rm.D());
12926     }
12927   }
12928   void Vmls(VRegister rd, VRegister rn, VRegister rm) { Vmls(al, rd, rn, rm); }
12929   void Vmov(Condition cond, VRegister rd, VRegister rm) {
12930     VIXL_ASSERT(rd.IsS() || rd.IsD());
12931     VIXL_ASSERT(rd.GetType() == rm.GetType());
12932     if (rd.IsS()) {
12933       Vmov(cond, F32, rd.S(), rm.S());
12934     } else {
12935       Vmov(cond, F64, rd.D(), rm.D());
12936     }
12937   }
12938   void Vmov(VRegister rd, VRegister rm) { Vmov(al, rd, rm); }
12939   void Vmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12940     VIXL_ASSERT(rd.IsS() || rd.IsD());
12941     VIXL_ASSERT(rd.GetType() == rn.GetType());
12942     VIXL_ASSERT(rd.GetType() == rm.GetType());
12943     if (rd.IsS()) {
12944       Vmul(cond, F32, rd.S(), rn.S(), rm.S());
12945     } else {
12946       Vmul(cond, F64, rd.D(), rn.D(), rm.D());
12947     }
12948   }
12949   void Vmul(VRegister rd, VRegister rn, VRegister rm) { Vmul(al, rd, rn, rm); }
12950   void Vneg(Condition cond, VRegister rd, VRegister rm) {
12951     VIXL_ASSERT(rd.IsS() || rd.IsD());
12952     VIXL_ASSERT(rd.GetType() == rm.GetType());
12953     if (rd.IsS()) {
12954       Vneg(cond, F32, rd.S(), rm.S());
12955     } else {
12956       Vneg(cond, F64, rd.D(), rm.D());
12957     }
12958   }
12959   void Vneg(VRegister rd, VRegister rm) { Vneg(al, rd, rm); }
12960   void Vnmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12961     VIXL_ASSERT(rd.IsS() || rd.IsD());
12962     VIXL_ASSERT(rd.GetType() == rn.GetType());
12963     VIXL_ASSERT(rd.GetType() == rm.GetType());
12964     if (rd.IsS()) {
12965       Vnmla(cond, F32, rd.S(), rn.S(), rm.S());
12966     } else {
12967       Vnmla(cond, F64, rd.D(), rn.D(), rm.D());
12968     }
12969   }
12970   void Vnmla(VRegister rd, VRegister rn, VRegister rm) {
12971     Vnmla(al, rd, rn, rm);
12972   }
12973   void Vnmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12974     VIXL_ASSERT(rd.IsS() || rd.IsD());
12975     VIXL_ASSERT(rd.GetType() == rn.GetType());
12976     VIXL_ASSERT(rd.GetType() == rm.GetType());
12977     if (rd.IsS()) {
12978       Vnmls(cond, F32, rd.S(), rn.S(), rm.S());
12979     } else {
12980       Vnmls(cond, F64, rd.D(), rn.D(), rm.D());
12981     }
12982   }
12983   void Vnmls(VRegister rd, VRegister rn, VRegister rm) {
12984     Vnmls(al, rd, rn, rm);
12985   }
12986   void Vnmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
12987     VIXL_ASSERT(rd.IsS() || rd.IsD());
12988     VIXL_ASSERT(rd.GetType() == rn.GetType());
12989     VIXL_ASSERT(rd.GetType() == rm.GetType());
12990     if (rd.IsS()) {
12991       Vnmul(cond, F32, rd.S(), rn.S(), rm.S());
12992     } else {
12993       Vnmul(cond, F64, rd.D(), rn.D(), rm.D());
12994     }
12995   }
12996   void Vnmul(VRegister rd, VRegister rn, VRegister rm) {
12997     Vnmul(al, rd, rn, rm);
12998   }
12999   void Vrinta(VRegister rd, VRegister rm) {
13000     VIXL_ASSERT(rd.IsS() || rd.IsD());
13001     VIXL_ASSERT(rd.GetType() == rm.GetType());
13002     if (rd.IsS()) {
13003       Vrinta(F32, rd.S(), rm.S());
13004     } else {
13005       Vrinta(F64, rd.D(), rm.D());
13006     }
13007   }
13008   void Vrintm(VRegister rd, VRegister rm) {
13009     VIXL_ASSERT(rd.IsS() || rd.IsD());
13010     VIXL_ASSERT(rd.GetType() == rm.GetType());
13011     if (rd.IsS()) {
13012       Vrintm(F32, rd.S(), rm.S());
13013     } else {
13014       Vrintm(F64, rd.D(), rm.D());
13015     }
13016   }
13017   void Vrintn(VRegister rd, VRegister rm) {
13018     VIXL_ASSERT(rd.IsS() || rd.IsD());
13019     VIXL_ASSERT(rd.GetType() == rm.GetType());
13020     if (rd.IsS()) {
13021       Vrintn(F32, rd.S(), rm.S());
13022     } else {
13023       Vrintn(F64, rd.D(), rm.D());
13024     }
13025   }
13026   void Vrintp(VRegister rd, VRegister rm) {
13027     VIXL_ASSERT(rd.IsS() || rd.IsD());
13028     VIXL_ASSERT(rd.GetType() == rm.GetType());
13029     if (rd.IsS()) {
13030       Vrintp(F32, rd.S(), rm.S());
13031     } else {
13032       Vrintp(F64, rd.D(), rm.D());
13033     }
13034   }
13035   void Vrintr(Condition cond, VRegister rd, VRegister rm) {
13036     VIXL_ASSERT(rd.IsS() || rd.IsD());
13037     VIXL_ASSERT(rd.GetType() == rm.GetType());
13038     if (rd.IsS()) {
13039       Vrintr(cond, F32, rd.S(), rm.S());
13040     } else {
13041       Vrintr(cond, F64, rd.D(), rm.D());
13042     }
13043   }
13044   void Vrintr(VRegister rd, VRegister rm) { Vrintr(al, rd, rm); }
13045   void Vrintx(Condition cond, VRegister rd, VRegister rm) {
13046     VIXL_ASSERT(rd.IsS() || rd.IsD());
13047     VIXL_ASSERT(rd.GetType() == rm.GetType());
13048     if (rd.IsS()) {
13049       Vrintx(cond, F32, rd.S(), rm.S());
13050     } else {
13051       Vrintx(cond, F64, rd.D(), rm.D());
13052     }
13053   }
13054   void Vrintx(VRegister rd, VRegister rm) { Vrintx(al, rd, rm); }
13055   void Vrintz(Condition cond, VRegister rd, VRegister rm) {
13056     VIXL_ASSERT(rd.IsS() || rd.IsD());
13057     VIXL_ASSERT(rd.GetType() == rm.GetType());
13058     if (rd.IsS()) {
13059       Vrintz(cond, F32, rd.S(), rm.S());
13060     } else {
13061       Vrintz(cond, F64, rd.D(), rm.D());
13062     }
13063   }
13064   void Vrintz(VRegister rd, VRegister rm) { Vrintz(al, rd, rm); }
13065   void Vseleq(VRegister rd, VRegister rn, VRegister rm) {
13066     VIXL_ASSERT(rd.IsS() || rd.IsD());
13067     VIXL_ASSERT(rd.GetType() == rn.GetType());
13068     VIXL_ASSERT(rd.GetType() == rm.GetType());
13069     if (rd.IsS()) {
13070       Vseleq(F32, rd.S(), rn.S(), rm.S());
13071     } else {
13072       Vseleq(F64, rd.D(), rn.D(), rm.D());
13073     }
13074   }
13075   void Vselge(VRegister rd, VRegister rn, VRegister rm) {
13076     VIXL_ASSERT(rd.IsS() || rd.IsD());
13077     VIXL_ASSERT(rd.GetType() == rn.GetType());
13078     VIXL_ASSERT(rd.GetType() == rm.GetType());
13079     if (rd.IsS()) {
13080       Vselge(F32, rd.S(), rn.S(), rm.S());
13081     } else {
13082       Vselge(F64, rd.D(), rn.D(), rm.D());
13083     }
13084   }
13085   void Vselgt(VRegister rd, VRegister rn, VRegister rm) {
13086     VIXL_ASSERT(rd.IsS() || rd.IsD());
13087     VIXL_ASSERT(rd.GetType() == rn.GetType());
13088     VIXL_ASSERT(rd.GetType() == rm.GetType());
13089     if (rd.IsS()) {
13090       Vselgt(F32, rd.S(), rn.S(), rm.S());
13091     } else {
13092       Vselgt(F64, rd.D(), rn.D(), rm.D());
13093     }
13094   }
13095   void Vselvs(VRegister rd, VRegister rn, VRegister rm) {
13096     VIXL_ASSERT(rd.IsS() || rd.IsD());
13097     VIXL_ASSERT(rd.GetType() == rn.GetType());
13098     VIXL_ASSERT(rd.GetType() == rm.GetType());
13099     if (rd.IsS()) {
13100       Vselvs(F32, rd.S(), rn.S(), rm.S());
13101     } else {
13102       Vselvs(F64, rd.D(), rn.D(), rm.D());
13103     }
13104   }
13105   void Vsqrt(Condition cond, VRegister rd, VRegister rm) {
13106     VIXL_ASSERT(rd.IsS() || rd.IsD());
13107     VIXL_ASSERT(rd.GetType() == rm.GetType());
13108     if (rd.IsS()) {
13109       Vsqrt(cond, F32, rd.S(), rm.S());
13110     } else {
13111       Vsqrt(cond, F64, rd.D(), rm.D());
13112     }
13113   }
13114   void Vsqrt(VRegister rd, VRegister rm) { Vsqrt(al, rd, rm); }
13115   void Vsub(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
13116     VIXL_ASSERT(rd.IsS() || rd.IsD());
13117     VIXL_ASSERT(rd.GetType() == rn.GetType());
13118     VIXL_ASSERT(rd.GetType() == rm.GetType());
13119     if (rd.IsS()) {
13120       Vsub(cond, F32, rd.S(), rn.S(), rm.S());
13121     } else {
13122       Vsub(cond, F64, rd.D(), rn.D(), rm.D());
13123     }
13124   }
13125   void Vsub(VRegister rd, VRegister rn, VRegister rm) { Vsub(al, rd, rn, rm); }
13126   // End of generated code.
13127 
13128   virtual bool AllowUnpredictable() VIXL_OVERRIDE {
13129     VIXL_ABORT_WITH_MSG("Unpredictable instruction.\n");
13130     return false;
13131   }
13132   virtual bool AllowStronglyDiscouraged() VIXL_OVERRIDE {
13133     VIXL_ABORT_WITH_MSG(
13134         "ARM strongly recommends to not use this instruction.\n");
13135     return false;
13136   }
13137   // Old syntax of vrint instructions.
13138   VIXL_DEPRECATED(
13139       "void Vrinta(DataType dt, DRegister rd, DRegister rm)",
13140       void Vrinta(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
13141     USE(dt2);
13142     VIXL_ASSERT(dt1.Is(dt2));
13143     return Vrinta(dt1, rd, rm);
13144   }
13145   VIXL_DEPRECATED(
13146       "void Vrinta(DataType dt, QRegister rd, QRegister rm)",
13147       void Vrinta(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
13148     USE(dt2);
13149     VIXL_ASSERT(dt1.Is(dt2));
13150     return Vrinta(dt1, rd, rm);
13151   }
13152   VIXL_DEPRECATED(
13153       "void Vrinta(DataType dt, SRegister rd, SRegister rm)",
13154       void Vrinta(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
13155     USE(dt2);
13156     VIXL_ASSERT(dt1.Is(dt2));
13157     return Vrinta(dt1, rd, rm);
13158   }
13159 
13160   VIXL_DEPRECATED(
13161       "void Vrintm(DataType dt, DRegister rd, DRegister rm)",
13162       void Vrintm(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
13163     USE(dt2);
13164     VIXL_ASSERT(dt1.Is(dt2));
13165     return Vrintm(dt1, rd, rm);
13166   }
13167   VIXL_DEPRECATED(
13168       "void Vrintm(DataType dt, QRegister rd, QRegister rm)",
13169       void Vrintm(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
13170     USE(dt2);
13171     VIXL_ASSERT(dt1.Is(dt2));
13172     return Vrintm(dt1, rd, rm);
13173   }
13174   VIXL_DEPRECATED(
13175       "void Vrintm(DataType dt, SRegister rd, SRegister rm)",
13176       void Vrintm(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
13177     USE(dt2);
13178     VIXL_ASSERT(dt1.Is(dt2));
13179     return Vrintm(dt1, rd, rm);
13180   }
13181 
13182   VIXL_DEPRECATED(
13183       "void Vrintn(DataType dt, DRegister rd, DRegister rm)",
13184       void Vrintn(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
13185     USE(dt2);
13186     VIXL_ASSERT(dt1.Is(dt2));
13187     return Vrintn(dt1, rd, rm);
13188   }
13189   VIXL_DEPRECATED(
13190       "void Vrintn(DataType dt, QRegister rd, QRegister rm)",
13191       void Vrintn(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
13192     USE(dt2);
13193     VIXL_ASSERT(dt1.Is(dt2));
13194     return Vrintn(dt1, rd, rm);
13195   }
13196   VIXL_DEPRECATED(
13197       "void Vrintn(DataType dt, SRegister rd, SRegister rm)",
13198       void Vrintn(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
13199     USE(dt2);
13200     VIXL_ASSERT(dt1.Is(dt2));
13201     return Vrintn(dt1, rd, rm);
13202   }
13203 
13204   VIXL_DEPRECATED(
13205       "void Vrintp(DataType dt, DRegister rd, DRegister rm)",
13206       void Vrintp(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
13207     USE(dt2);
13208     VIXL_ASSERT(dt1.Is(dt2));
13209     return Vrintp(dt1, rd, rm);
13210   }
13211   VIXL_DEPRECATED(
13212       "void Vrintp(DataType dt, QRegister rd, QRegister rm)",
13213       void Vrintp(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
13214     USE(dt2);
13215     VIXL_ASSERT(dt1.Is(dt2));
13216     return Vrintp(dt1, rd, rm);
13217   }
13218   VIXL_DEPRECATED(
13219       "void Vrintp(DataType dt, SRegister rd, SRegister rm)",
13220       void Vrintp(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
13221     USE(dt2);
13222     VIXL_ASSERT(dt1.Is(dt2));
13223     return Vrintp(dt1, rd, rm);
13224   }
13225 
13226   VIXL_DEPRECATED(
13227       "void Vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm)",
13228       void Vrintr(Condition cond,
13229                   DataType dt1,
13230                   DataType dt2,
13231                   SRegister rd,
13232                   SRegister rm)) {
13233     USE(dt2);
13234     VIXL_ASSERT(dt1.Is(dt2));
13235     return Vrintr(cond, dt1, rd, rm);
13236   }
13237   VIXL_DEPRECATED(
13238       "void Vrintr(DataType dt, SRegister rd, SRegister rm)",
13239       void Vrintr(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
13240     USE(dt2);
13241     VIXL_ASSERT(dt1.Is(dt2));
13242     return Vrintr(dt1, rd, rm);
13243   }
13244 
13245   VIXL_DEPRECATED(
13246       "void Vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm)",
13247       void Vrintr(Condition cond,
13248                   DataType dt1,
13249                   DataType dt2,
13250                   DRegister rd,
13251                   DRegister rm)) {
13252     USE(dt2);
13253     VIXL_ASSERT(dt1.Is(dt2));
13254     return Vrintr(cond, dt1, rd, rm);
13255   }
13256   VIXL_DEPRECATED(
13257       "void Vrintr(DataType dt, DRegister rd, DRegister rm)",
13258       void Vrintr(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
13259     USE(dt2);
13260     VIXL_ASSERT(dt1.Is(dt2));
13261     return Vrintr(dt1, rd, rm);
13262   }
13263 
13264   VIXL_DEPRECATED(
13265       "void Vrintx(Condition cond, DataType dt, DRegister rd, DRegister rm)",
13266       void Vrintx(Condition cond,
13267                   DataType dt1,
13268                   DataType dt2,
13269                   DRegister rd,
13270                   DRegister rm)) {
13271     USE(dt2);
13272     VIXL_ASSERT(dt1.Is(dt2));
13273     return Vrintx(cond, dt1, rd, rm);
13274   }
13275   VIXL_DEPRECATED(
13276       "void Vrintx(DataType dt, DRegister rd, DRegister rm)",
13277       void Vrintx(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
13278     USE(dt2);
13279     VIXL_ASSERT(dt1.Is(dt2));
13280     return Vrintx(dt1, rd, rm);
13281   }
13282 
13283   VIXL_DEPRECATED(
13284       "void Vrintx(DataType dt, QRegister rd, QRegister rm)",
13285       void Vrintx(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
13286     USE(dt2);
13287     VIXL_ASSERT(dt1.Is(dt2));
13288     return Vrintx(dt1, rd, rm);
13289   }
13290 
13291   VIXL_DEPRECATED(
13292       "void Vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm)",
13293       void Vrintx(Condition cond,
13294                   DataType dt1,
13295                   DataType dt2,
13296                   SRegister rd,
13297                   SRegister rm)) {
13298     USE(dt2);
13299     VIXL_ASSERT(dt1.Is(dt2));
13300     return Vrintx(cond, dt1, rd, rm);
13301   }
13302   VIXL_DEPRECATED(
13303       "void Vrintx(DataType dt, SRegister rd, SRegister rm)",
13304       void Vrintx(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
13305     USE(dt2);
13306     VIXL_ASSERT(dt1.Is(dt2));
13307     return Vrintx(dt1, rd, rm);
13308   }
13309 
13310   VIXL_DEPRECATED(
13311       "void Vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm)",
13312       void Vrintz(Condition cond,
13313                   DataType dt1,
13314                   DataType dt2,
13315                   DRegister rd,
13316                   DRegister rm)) {
13317     USE(dt2);
13318     VIXL_ASSERT(dt1.Is(dt2));
13319     return Vrintz(cond, dt1, rd, rm);
13320   }
13321   VIXL_DEPRECATED(
13322       "void Vrintz(DataType dt, DRegister rd, DRegister rm)",
13323       void Vrintz(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) {
13324     USE(dt2);
13325     VIXL_ASSERT(dt1.Is(dt2));
13326     return Vrintz(dt1, rd, rm);
13327   }
13328 
13329   VIXL_DEPRECATED(
13330       "void Vrintz(DataType dt, QRegister rd, QRegister rm)",
13331       void Vrintz(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) {
13332     USE(dt2);
13333     VIXL_ASSERT(dt1.Is(dt2));
13334     return Vrintz(dt1, rd, rm);
13335   }
13336 
13337   VIXL_DEPRECATED(
13338       "void Vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm)",
13339       void Vrintz(Condition cond,
13340                   DataType dt1,
13341                   DataType dt2,
13342                   SRegister rd,
13343                   SRegister rm)) {
13344     USE(dt2);
13345     VIXL_ASSERT(dt1.Is(dt2));
13346     return Vrintz(cond, dt1, rd, rm);
13347   }
13348   VIXL_DEPRECATED(
13349       "void Vrintz(DataType dt, SRegister rd, SRegister rm)",
13350       void Vrintz(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) {
13351     USE(dt2);
13352     VIXL_ASSERT(dt1.Is(dt2));
13353     return Vrintz(dt1, rd, rm);
13354   }
13355 
13356  private:
13357   bool NeedBranch(Condition* cond) { return !cond->Is(al) && IsUsingT32(); }
13358   static const int kBranchSize = kMaxInstructionSizeInBytes;
13359 
13360   RegisterList available_;
13361   VRegisterList available_vfp_;
13362   UseScratchRegisterScope* current_scratch_scope_;
13363   MacroAssemblerContext context_;
13364   PoolManager<int32_t> pool_manager_;
13365   bool generate_simulator_code_;
13366   bool allow_macro_instructions_;
13367   Label* pool_end_;
13368 #ifdef PANDA_BUILD
13369   AllocatorWrapper allocator_;
13370 #endif
13371   friend class TestMacroAssembler;
13372 };
13373 
13374 // This scope utility allows scratch registers to be managed safely. The
13375 // MacroAssembler's GetScratchRegisterList() is used as a pool of scratch
13376 // registers. These registers can be allocated on demand, and will be returned
13377 // at the end of the scope.
13378 //
13379 // When the scope ends, the MacroAssembler's lists will be restored to their
13380 // original state, even if the lists were modified by some other means.
13381 //
13382 // Scopes must nest perfectly. That is, they must be destructed in reverse
13383 // construction order. Otherwise, it is not clear how to handle cases where one
13384 // scope acquires a register that was included in a now-closing scope. With
13385 // perfect nesting, this cannot occur.
13386 class UseScratchRegisterScope {
13387  public:
13388   // This constructor implicitly calls the `Open` function to initialise the
13389   // scope, so it is ready to use immediately after it has been constructed.
13390   explicit UseScratchRegisterScope(MacroAssembler* masm)
13391       : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {
13392     Open(masm);
13393   }
13394   // This constructor allows deferred and optional initialisation of the scope.
13395   // The user is required to explicitly call the `Open` function before using
13396   // the scope.
13397   UseScratchRegisterScope()
13398       : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {}
13399 
13400   // This function performs the actual initialisation work.
13401   void Open(MacroAssembler* masm);
13402 
13403   // The destructor always implicitly calls the `Close` function.
13404   ~UseScratchRegisterScope() { Close(); }
13405 
13406   // This function performs the cleaning-up work. It must succeed even if the
13407   // scope has not been opened. It is safe to call multiple times.
13408   void Close();
13409 
13410   bool IsAvailable(const Register& reg) const;
13411   bool IsAvailable(const VRegister& reg) const;
13412 
13413   // Take a register from the temp list. It will be returned automatically when
13414   // the scope ends.
13415   Register Acquire();
13416   VRegister AcquireV(unsigned size_in_bits);
13417   QRegister AcquireQ();
13418   DRegister AcquireD();
13419   SRegister AcquireS();
13420 
13421   // Explicitly release an acquired (or excluded) register, putting it back in
13422   // the temp list.
13423   void Release(const Register& reg);
13424   void Release(const VRegister& reg);
13425 
13426   // Make the specified registers available as scratch registers for the
13427   // duration of this scope.
13428   void Include(const RegisterList& list);
13429   void Include(const Register& reg1,
13430                const Register& reg2 = NoReg,
13431                const Register& reg3 = NoReg,
13432                const Register& reg4 = NoReg) {
13433     Include(RegisterList(reg1, reg2, reg3, reg4));
13434   }
13435   void Include(const VRegisterList& list);
13436   void Include(const VRegister& reg1,
13437                const VRegister& reg2 = NoVReg,
13438                const VRegister& reg3 = NoVReg,
13439                const VRegister& reg4 = NoVReg) {
13440     Include(VRegisterList(reg1, reg2, reg3, reg4));
13441   }
13442 
13443   // Make sure that the specified registers are not available in this scope.
13444   // This can be used to prevent helper functions from using sensitive
13445   // registers, for example.
13446   void Exclude(const RegisterList& list);
13447   void Exclude(const Register& reg1,
13448                const Register& reg2 = NoReg,
13449                const Register& reg3 = NoReg,
13450                const Register& reg4 = NoReg) {
13451     Exclude(RegisterList(reg1, reg2, reg3, reg4));
13452   }
13453   void Exclude(const VRegisterList& list);
13454   void Exclude(const VRegister& reg1,
13455                const VRegister& reg2 = NoVReg,
13456                const VRegister& reg3 = NoVReg,
13457                const VRegister& reg4 = NoVReg) {
13458     Exclude(VRegisterList(reg1, reg2, reg3, reg4));
13459   }
13460 
13461   // A convenience helper to exclude any registers used by the operand.
13462   void Exclude(const Operand& operand);
13463 
13464   // Prevent any scratch registers from being used in this scope.
13465   void ExcludeAll();
13466 
13467  private:
13468   // The MacroAssembler maintains a list of available scratch registers, and
13469   // also keeps track of the most recently-opened scope so that on destruction
13470   // we can check that scopes do not outlive their parents.
13471   MacroAssembler* masm_;
13472   UseScratchRegisterScope* parent_;
13473 
13474   // The state of the available lists at the start of this scope.
13475   uint32_t old_available_;      // kRRegister
13476   uint64_t old_available_vfp_;  // kVRegister
13477 
13478   VIXL_NO_RETURN_IN_DEBUG_MODE UseScratchRegisterScope(
13479       const UseScratchRegisterScope&) {
13480     VIXL_UNREACHABLE();
13481   }
13482   VIXL_NO_RETURN_IN_DEBUG_MODE void operator=(const UseScratchRegisterScope&) {
13483     VIXL_UNREACHABLE();
13484   }
13485 };
13486 
13487 
13488 }  // namespace aarch32
13489 }  // namespace vixl
13490 
13491 #endif  // VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_
13492