macro-assembler-aarch32.h revision 80b4a1f554a92b2c4d4504265d0bac545c74c69b
1// Copyright 2015, VIXL authors
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are met:
6//
7//   * Redistributions of source code must retain the above copyright notice,
8//     this list of conditions and the following disclaimer.
9//   * Redistributions in binary form must reproduce the above copyright
10//     notice, this list of conditions and the following disclaimer in the
11//     documentation and/or other materials provided with the distribution.
12//   * Neither the name of ARM Limited nor the names of its contributors may
13//     be used to endorse or promote products derived from this software
14//     without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
17// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26// POSSIBILITY OF SUCH DAMAGE.
27
28#ifndef VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_
29#define VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_
30
31#include "code-generation-scopes-vixl.h"
32#include "macro-assembler-interface.h"
33#include "utils-vixl.h"
34
35#include "aarch32/instructions-aarch32.h"
36#include "aarch32/assembler-aarch32.h"
37#include "aarch32/operands-aarch32.h"
38
39namespace vixl {
40namespace aarch32 {
41
42class JumpTableBase;
43class UseScratchRegisterScope;
44
45enum FlagsUpdate { LeaveFlags = 0, SetFlags = 1, DontCare = 2 };
46
47// LiteralPool class, defined as a container for literals
48class LiteralPool {
49 public:
50  typedef std::list<RawLiteral*>::iterator RawLiteralListIterator;
51
52 public:
53  LiteralPool() : size_(0) {}
54  ~LiteralPool() {
55    VIXL_ASSERT(literals_.empty() && (size_ == 0));
56    for (RawLiteralListIterator literal_it = keep_until_delete_.begin();
57         literal_it != keep_until_delete_.end();
58         literal_it++) {
59      delete *literal_it;
60    }
61    keep_until_delete_.clear();
62  }
63
64  unsigned GetSize() const { return size_; }
65
66  // Add a literal to the literal container.
67  void AddLiteral(RawLiteral* literal) {
68    // Manually placed literals can't be added to a literal pool.
69    VIXL_ASSERT(!literal->IsManuallyPlaced());
70    VIXL_ASSERT(!literal->IsBound());
71    if (literal->GetPositionInPool() == Label::kMaxOffset) {
72      uint32_t position = GetSize();
73      literal->SetPositionInPool(position);
74      literals_.push_back(literal);
75      size_ += literal->GetAlignedSize();
76    }
77  }
78
79  // First literal to be emitted.
80  RawLiteralListIterator GetFirst() { return literals_.begin(); }
81
82  // Mark the end of the literal container.
83  RawLiteralListIterator GetEnd() { return literals_.end(); }
84
85  // Remove all the literals from the container.
86  // If the literal's memory management has been delegated to the container
87  // it will be delete'd.
88  void Clear() {
89    for (RawLiteralListIterator literal_it = GetFirst(); literal_it != GetEnd();
90         literal_it++) {
91      RawLiteral* literal = *literal_it;
92      switch (literal->GetDeletionPolicy()) {
93        case RawLiteral::kDeletedOnPlacementByPool:
94          delete literal;
95          break;
96        case RawLiteral::kDeletedOnPoolDestruction:
97          keep_until_delete_.push_back(literal);
98          break;
99        case RawLiteral::kManuallyDeleted:
100          break;
101      }
102    }
103    literals_.clear();
104    size_ = 0;
105  }
106
107 private:
108  // Size (in bytes and including alignments) of the literal pool.
109  unsigned size_;
110
111  // Literal container.
112  std::list<RawLiteral*> literals_;
113  // Already bound Literal container the app requested this pool to keep.
114  std::list<RawLiteral*> keep_until_delete_;
115};
116
117
118// Macro assembler for aarch32 instruction set.
119class MacroAssembler : public Assembler, public MacroAssemblerInterface {
120 public:
121  enum EmitOption { kBranchRequired, kNoBranchRequired };
122
123  virtual internal::AssemblerBase* AsAssemblerBase() VIXL_OVERRIDE {
124    return this;
125  }
126
127  virtual void BlockPools() VIXL_OVERRIDE {
128    literal_pool_manager_.Block();
129    veneer_pool_manager_.Block();
130  }
131  virtual void ReleasePools() VIXL_OVERRIDE {
132    literal_pool_manager_.Release();
133    veneer_pool_manager_.Release();
134  }
135  virtual void EnsureEmitPoolsFor(size_t size) VIXL_OVERRIDE {
136    // TODO: Optimise this. It also checks that there is space in the buffer,
137    // which we do not need to do here.
138    VIXL_ASSERT(IsUint32(size));
139    EnsureEmitFor(static_cast<uint32_t>(size));
140  }
141
142 private:
143  class MacroEmissionCheckScope : public EmissionCheckScope {
144   public:
145    explicit MacroEmissionCheckScope(MacroAssemblerInterface* masm)
146        : EmissionCheckScope(masm, kTypicalMacroInstructionMaxSize) {}
147
148   private:
149    static const size_t kTypicalMacroInstructionMaxSize =
150        8 * kMaxInstructionSizeInBytes;
151  };
152
153  class MacroAssemblerContext {
154   public:
155    MacroAssemblerContext() : count_(0) {}
156    ~MacroAssemblerContext() {}
157    unsigned GetRecursiveCount() const { return count_; }
158    void Up(const char* loc) {
159      location_stack_[count_] = loc;
160      count_++;
161      if (count_ >= kMaxRecursion) {
162        printf(
163            "Recursion limit reached; unable to resolve macro assembler "
164            "call.\n");
165        printf("Macro assembler context stack:\n");
166        for (unsigned i = 0; i < kMaxRecursion; i++) {
167          printf("%10s %s\n", (i == 0) ? "oldest -> " : "", location_stack_[i]);
168        }
169        VIXL_ABORT();
170      }
171    }
172    void Down() {
173      VIXL_ASSERT((count_ > 0) && (count_ < kMaxRecursion));
174      count_--;
175    }
176
177   private:
178    unsigned count_;
179    static const uint32_t kMaxRecursion = 6;
180    const char* location_stack_[kMaxRecursion];
181  };
182
183  // This scope is used at each Delegate entry to avoid infinite recursion of
184  // Delegate calls. The limit is defined by
185  // MacroAssemblerContext::kMaxRecursion.
186  class ContextScope {
187   public:
188    explicit ContextScope(MacroAssembler* const masm, const char* loc)
189        : masm_(masm) {
190      VIXL_ASSERT(masm_->AllowMacroInstructions());
191      masm_->GetContext()->Up(loc);
192    }
193    ~ContextScope() { masm_->GetContext()->Down(); }
194
195   private:
196    MacroAssembler* const masm_;
197  };
198
199  MacroAssemblerContext* GetContext() { return &context_; }
200
201  class ITScope {
202   public:
203    ITScope(MacroAssembler* masm, Condition* cond, bool can_use_it = false)
204        : masm_(masm), cond_(*cond), can_use_it_(can_use_it) {
205      if (!cond_.Is(al) && masm->IsUsingT32()) {
206        if (can_use_it_) {
207          // IT is not deprecated (that implies a 16 bit T32 instruction).
208          // We generate an IT instruction and a conditional instruction.
209          masm->it(cond_);
210        } else {
211          // The usage of IT is deprecated for the instruction.
212          // We generate a conditional branch and an unconditional instruction.
213          // TODO: Use a scope utility with a size check. To do that, we'd need
214          // one with Open() and Close() implemented.
215          masm_->EnsureEmitFor(kMaxT32MacroInstructionSizeInBytes);
216          // Generate the branch.
217          masm_->b(cond_.Negate(), Narrow, &label_);
218          // Tell the macro-assembler to generate unconditional instructions.
219          *cond = al;
220        }
221      }
222#ifdef VIXL_DEBUG
223      initial_cursor_offset_ = masm->GetCursorOffset();
224#else
225      USE(initial_cursor_offset_);
226#endif
227    }
228    ~ITScope() {
229      if (label_.IsReferenced()) {
230        // We only use the label for conditional T32 instructions for which we
231        // cannot use IT.
232        VIXL_ASSERT(!cond_.Is(al));
233        VIXL_ASSERT(masm_->IsUsingT32());
234        VIXL_ASSERT(!can_use_it_);
235        VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <=
236                    kMaxT32MacroInstructionSizeInBytes);
237        masm_->BindHelper(&label_);
238      } else if (masm_->IsUsingT32() && !cond_.Is(al)) {
239        // If we've generated a conditional T32 instruction but haven't used the
240        // label, we must have used IT. Check that we did not generate a
241        // deprecated sequence.
242        VIXL_ASSERT(can_use_it_);
243        VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <=
244                    k16BitT32InstructionSizeInBytes);
245      }
246    }
247
248   private:
249    MacroAssembler* masm_;
250    Condition cond_;
251    Label label_;
252    bool can_use_it_;
253    uint32_t initial_cursor_offset_;
254  };
255
256  template <Assembler::InstructionCondDtDL asmfn>
257  class EmitLiteralCondDtDL {
258   public:
259    EmitLiteralCondDtDL(DataType dt, DRegister rt) : dt_(dt), rt_(rt) {}
260    void emit(MacroAssembler* const masm,
261              Condition cond,
262              RawLiteral* const literal) {
263      (masm->*asmfn)(cond, dt_, rt_, literal);
264    }
265
266   private:
267    DataType dt_;
268    DRegister rt_;
269  };
270
271  template <Assembler::InstructionCondDtSL asmfn>
272  class EmitLiteralCondDtSL {
273   public:
274    EmitLiteralCondDtSL(DataType dt, SRegister rt) : dt_(dt), rt_(rt) {}
275    void emit(MacroAssembler* const masm,
276              Condition cond,
277              RawLiteral* const literal) {
278      (masm->*asmfn)(cond, dt_, rt_, literal);
279    }
280
281   private:
282    DataType dt_;
283    SRegister rt_;
284  };
285
286  template <Assembler::InstructionCondRL asmfn>
287  class EmitLiteralCondRL {
288   public:
289    explicit EmitLiteralCondRL(Register rt) : rt_(rt) {}
290    void emit(MacroAssembler* const masm,
291              Condition cond,
292              RawLiteral* const literal) {
293      (masm->*asmfn)(cond, rt_, literal);
294    }
295
296   private:
297    Register rt_;
298  };
299
300  template <Assembler::InstructionCondRRL asmfn>
301  class EmitLiteralCondRRL {
302   public:
303    EmitLiteralCondRRL(Register rt, Register rt2) : rt_(rt), rt2_(rt2) {}
304    void emit(MacroAssembler* const masm,
305              Condition cond,
306              RawLiteral* const literal) {
307      (masm->*asmfn)(cond, rt_, rt2_, literal);
308    }
309
310   private:
311    Register rt_, rt2_;
312  };
313
314  class LiteralPoolManager {
315   public:
316    explicit LiteralPoolManager(MacroAssembler* const masm)
317        : masm_(masm), monitor_(0) {
318      ResetCheckpoint();
319    }
320
321    void ResetCheckpoint() { checkpoint_ = Label::kMaxOffset; }
322
323    LiteralPool* GetLiteralPool() { return &literal_pool_; }
324    Label::Offset GetCheckpoint() const {
325      // Make room for a branch over the pools.
326      return checkpoint_ - kMaxInstructionSizeInBytes;
327    }
328    size_t GetLiteralPoolSize() const { return literal_pool_.GetSize(); }
329
330    // Checks if the insertion of the literal will put the forward reference
331    // too far in the literal pool.
332    // This function is called after generating an instruction with a literal.
333    // We want to know if the literal can be reached by the instruction.
334    // If not, we will unwind the instruction, generate the pool (without the
335    // last literal) and generate the instruction again.
336    // "literal" is the literal we want to insert into the pool.
337    // "from" is the location where the instruction which uses the literal has
338    // been generated.
339    bool WasInsertedTooFar(RawLiteral* literal) const {
340      // Last accessible location for the instruction we just generated, which
341      // uses the literal.
342      Label::ForwardReference& reference = literal->GetBackForwardRef();
343      Label::Offset new_checkpoint = AlignDown(reference.GetCheckpoint(), 4);
344
345      // TODO: We should not need to get the min of new_checkpoint and the
346      // existing checkpoint. The existing checkpoint should already have
347      // been checked when reserving space for this load literal instruction.
348      // The assertion below asserts that we don't need the min operation here.
349      Label::Offset checkpoint =
350          std::min(new_checkpoint, literal->GetAlignedCheckpoint(4));
351      bool literal_in_pool =
352          (literal->GetPositionInPool() != Label::kMaxOffset);
353      Label::Offset position_in_pool = literal_in_pool
354                                           ? literal->GetPositionInPool()
355                                           : literal_pool_.GetSize();
356      // Compare the checkpoint to the location where the literal should be
357      // added.
358      // We add space for two instructions: one branch and one potential veneer
359      // which may be added after the check. In this particular use case, no
360      // veneer can be added but, this way, we are consistent with all the
361      // literal pool checks.
362      int32_t from =
363          reference.GetLocation() + masm_->GetArchitectureStatePCOffset();
364      bool too_far =
365          checkpoint < from + position_in_pool +
366                           2 * static_cast<int32_t>(kMaxInstructionSizeInBytes);
367      // Assert if the literal is already in the pool and the existing
368      // checkpoint triggers a rewind here, as this means the pool should
369      // already have been emitted (perhaps we have not reserved enough space
370      // for the instruction we are about to rewind).
371      VIXL_ASSERT(!(too_far && (literal->GetCheckpoint() < new_checkpoint)));
372      return too_far;
373    }
374
375    // Set the different checkpoints where the literal pool has to be emited.
376    void UpdateCheckpoint(RawLiteral* literal) {
377      // The literal should have been placed somewhere in the literal pool
378      VIXL_ASSERT(literal->GetPositionInPool() != Label::kMaxOffset);
379      // TODO(all): Consider AddForwardRef as a  virtual so the checkpoint is
380      //   updated when inserted. Or move checkpoint_ into Label,
381      literal->UpdateCheckpoint();
382      Label::Offset tmp =
383          literal->GetAlignedCheckpoint(4) - literal->GetPositionInPool();
384      if (checkpoint_ > tmp) {
385        checkpoint_ = tmp;
386        masm_->ComputeCheckpoint();
387      }
388    }
389
390    bool IsEmpty() const { return GetLiteralPoolSize() == 0; }
391
392    void Block() { monitor_++; }
393    void Release() {
394      VIXL_ASSERT(IsBlocked());
395      if (--monitor_ == 0) {
396        // Ensure the pool has not been blocked for too long.
397        VIXL_ASSERT(masm_->GetCursorOffset() <= checkpoint_);
398      }
399    }
400    bool IsBlocked() const { return monitor_ != 0; }
401
402   private:
403    MacroAssembler* const masm_;
404    LiteralPool literal_pool_;
405
406    // Max offset in the code buffer where the literal needs to be
407    // emitted. A default value of Label::kMaxOffset means that the checkpoint
408    // is invalid.
409    Label::Offset checkpoint_;
410    // Indicates whether the emission of this pool is blocked.
411    int monitor_;
412  };
413
414  void PerformEnsureEmit(Label::Offset target, uint32_t extra_size);
415
416 protected:
417  void HandleOutOfBoundsImmediate(Condition cond, Register tmp, uint32_t imm);
418  void PadToMinimumBranchRange(Label* label);
419
420  // Generate the instruction and if it's not possible revert the whole thing.
421  // emit the literal pool and regenerate the instruction.
422  // Note: The instruction is generated via
423  // void T::emit(MacroAssembler* const, RawLiteral* const)
424  template <typename T>
425  void GenerateInstruction(Condition cond,
426                           T instr_callback,
427                           RawLiteral* const literal) {
428    int32_t cursor = GetCursorOffset();
429    // Emit the instruction, via the assembler
430    {
431      MacroEmissionCheckScope guard(this);
432      // The ITScope can change the condition and we want to be able to revert
433      // this.
434      Condition c(cond);
435      ITScope it_scope(this, &c);
436      instr_callback.emit(this, c, literal);
437    }
438    if (!literal->IsManuallyPlaced() && !literal->IsBound()) {
439      if (WasInsertedTooFar(literal)) {
440        // The instruction's data is too far: revert the emission
441        GetBuffer()->Rewind(cursor);
442        literal->InvalidateLastForwardReference(RawLiteral::kNoUpdateNecessary);
443        EmitLiteralPool(kBranchRequired);
444        MacroEmissionCheckScope guard(this);
445        ITScope it_scope(this, &cond);
446        instr_callback.emit(this, cond, literal);
447      }
448      // The literal pool above might have included the literal - in which
449      // case it will now be bound.
450      if (!literal->IsBound()) {
451        literal_pool_manager_.GetLiteralPool()->AddLiteral(literal);
452        literal_pool_manager_.UpdateCheckpoint(literal);
453      }
454    }
455  }
456
457 public:
458  explicit MacroAssembler(InstructionSet isa = A32)
459      : Assembler(isa),
460        available_(r12),
461        current_scratch_scope_(NULL),
462        checkpoint_(Label::kMaxOffset),
463        literal_pool_manager_(this),
464        veneer_pool_manager_(this),
465        generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
466        doing_veneer_pool_generation_(false) {
467#ifdef VIXL_DEBUG
468    SetAllowMacroInstructions(true);
469#else
470    USE(literal_pool_manager_);
471    USE(allow_macro_instructions_);
472#endif
473    ComputeCheckpoint();
474  }
475  explicit MacroAssembler(size_t size, InstructionSet isa = A32)
476      : Assembler(size, isa),
477        available_(r12),
478        current_scratch_scope_(NULL),
479        checkpoint_(Label::kMaxOffset),
480        literal_pool_manager_(this),
481        veneer_pool_manager_(this),
482        generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
483        doing_veneer_pool_generation_(false) {
484#ifdef VIXL_DEBUG
485    SetAllowMacroInstructions(true);
486#endif
487    ComputeCheckpoint();
488  }
489  MacroAssembler(byte* buffer, size_t size, InstructionSet isa = A32)
490      : Assembler(buffer, size, isa),
491        available_(r12),
492        current_scratch_scope_(NULL),
493        checkpoint_(Label::kMaxOffset),
494        literal_pool_manager_(this),
495        veneer_pool_manager_(this),
496        generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE),
497        doing_veneer_pool_generation_(false) {
498#ifdef VIXL_DEBUG
499    SetAllowMacroInstructions(true);
500#endif
501    ComputeCheckpoint();
502  }
503
504  bool GenerateSimulatorCode() const { return generate_simulator_code_; }
505
506  // Tell whether any of the macro instruction can be used. When false the
507  // MacroAssembler will assert if a method which can emit a variable number
508  // of instructions is called.
509  virtual void SetAllowMacroInstructions(bool value) VIXL_OVERRIDE {
510    allow_macro_instructions_ = value;
511  }
512  virtual bool AllowMacroInstructions() const VIXL_OVERRIDE {
513    return allow_macro_instructions_;
514  }
515
516  void FinalizeCode() {
517    EmitLiteralPool(kNoBranchRequired);
518    Assembler::FinalizeCode();
519  }
520
521  RegisterList* GetScratchRegisterList() { return &available_; }
522  VRegisterList* GetScratchVRegisterList() { return &available_vfp_; }
523
524  // Get or set the current (most-deeply-nested) UseScratchRegisterScope.
525  void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) {
526    current_scratch_scope_ = scope;
527  }
528  UseScratchRegisterScope* GetCurrentScratchRegisterScope() {
529    return current_scratch_scope_;
530  }
531
532  // Given an address calculation (Register + immediate), generate code to
533  // partially compute the address. The returned MemOperand will perform any
534  // remaining computation in a subsequent load or store instruction.
535  //
536  // The offset provided should be the offset that would be used in a load or
537  // store instruction (if it had sufficient range). This only matters where
538  // base.Is(pc), since load and store instructions align the pc before
539  // dereferencing it.
540  //
541  // TODO: Improve the handling of negative offsets. They are not implemented
542  // precisely for now because they only have a marginal benefit for the
543  // existing uses (in delegates).
544  MemOperand MemOperandComputationHelper(Condition cond,
545                                         Register scratch,
546                                         Register base,
547                                         uint32_t offset,
548                                         uint32_t extra_offset_mask = 0);
549
550  MemOperand MemOperandComputationHelper(Register scratch,
551                                         Register base,
552                                         uint32_t offset,
553                                         uint32_t extra_offset_mask = 0) {
554    return MemOperandComputationHelper(al,
555                                       scratch,
556                                       base,
557                                       offset,
558                                       extra_offset_mask);
559  }
560  MemOperand MemOperandComputationHelper(Condition cond,
561                                         Register scratch,
562                                         Label* label,
563                                         uint32_t extra_offset_mask = 0) {
564    // Check for buffer space _before_ calculating the offset, in case we
565    // generate a pool that affects the offset calculation.
566    CodeBufferCheckScope scope(this, 4 * kMaxInstructionSizeInBytes);
567    Label::Offset offset =
568        label->GetLocation() -
569        AlignDown(GetCursorOffset() + GetArchitectureStatePCOffset(), 4);
570    return MemOperandComputationHelper(cond,
571                                       scratch,
572                                       pc,
573                                       offset,
574                                       extra_offset_mask);
575  }
576  MemOperand MemOperandComputationHelper(Register scratch,
577                                         Label* label,
578                                         uint32_t extra_offset_mask = 0) {
579    return MemOperandComputationHelper(al, scratch, label, extra_offset_mask);
580  }
581
582  // Determine the appropriate mask to pass into MemOperandComputationHelper.
583  uint32_t GetOffsetMask(InstructionType type, AddrMode addrmode);
584
585  // State and type helpers.
586  bool IsModifiedImmediate(uint32_t imm) {
587    return IsUsingT32() ? ImmediateT32::IsImmediateT32(imm)
588                        : ImmediateA32::IsImmediateA32(imm);
589  }
590
591  void Bind(Label* label) {
592    VIXL_ASSERT(allow_macro_instructions_);
593    PadToMinimumBranchRange(label);
594    BindHelper(label);
595  }
596
597  void AddBranchLabel(Label* label) {
598    if (label->IsBound()) return;
599    veneer_pool_manager_.AddLabel(label);
600  }
601
602  void Place(RawLiteral* literal) {
603    VIXL_ASSERT(allow_macro_instructions_);
604    VIXL_ASSERT(literal->IsManuallyPlaced());
605    // We have two calls to `GetBuffer()->Align()` below, that aligns on word
606    // (4 bytes) boundaries. Only one is taken into account in
607    // `GetAlignedSize()`.
608    static const size_t kMaxAlignSize = 3;
609    size_t size = literal->GetAlignedSize() + kMaxAlignSize;
610    VIXL_ASSERT(IsUint32(size));
611    // TODO: We should use a scope here to check the size of data emitted.  We
612    // currently cannot because `aarch32::CodeBufferCheckScope` currently checks
613    // for pools, so that could lead to an infinite loop.
614    EnsureEmitFor(static_cast<uint32_t>(size));
615    // Literals must be emitted aligned on word (4 bytes) boundaries.
616    GetBuffer()->Align();
617    PlaceHelper(literal);
618    GetBuffer()->Align();
619  }
620
621  void ComputeCheckpoint();
622
623  int32_t GetMarginBeforeVeneerEmission() const {
624    return veneer_pool_manager_.GetCheckpoint() - GetCursorOffset();
625  }
626
627  Label::Offset GetTargetForLiteralEmission() const {
628    if (literal_pool_manager_.IsEmpty()) return Label::kMaxOffset;
629    // We add an instruction to the size as the instruction which calls this
630    // function may add a veneer and, without this extra instruction, could put
631    // the literals out of range. For example, it's the case for a "B"
632    // instruction. At the beginning of the instruction we call EnsureEmitFor
633    // which calls this function. However, the target of the branch hasn't been
634    // inserted yet in the veneer pool.
635    size_t veneer_max_size =
636        veneer_pool_manager_.GetMaxSize() + kMaxInstructionSizeInBytes;
637    VIXL_ASSERT(IsInt32(veneer_max_size));
638    // We must be able to generate the veneer pool first.
639    Label::Offset tmp = literal_pool_manager_.GetCheckpoint() -
640                        static_cast<Label::Offset>(veneer_max_size);
641    VIXL_ASSERT(tmp >= 0);
642    return tmp;
643  }
644
645  int32_t GetMarginBeforeLiteralEmission() const {
646    Label::Offset tmp = GetTargetForLiteralEmission();
647    VIXL_ASSERT(tmp >= GetCursorOffset());
648    return tmp - GetCursorOffset();
649  }
650
651  bool VeneerPoolIsEmpty() const { return veneer_pool_manager_.IsEmpty(); }
652  bool LiteralPoolIsEmpty() const { return literal_pool_manager_.IsEmpty(); }
653
654  void EnsureEmitFor(uint32_t size) {
655    Label::Offset target = GetCursorOffset() + size;
656    if (target <= checkpoint_) return;
657    PerformEnsureEmit(target, size);
658  }
659
660  bool WasInsertedTooFar(RawLiteral* literal) {
661    return literal_pool_manager_.WasInsertedTooFar(literal);
662  }
663
664  bool AliasesAvailableScratchRegister(Register reg) {
665    return GetScratchRegisterList()->Includes(reg);
666  }
667
668  bool AliasesAvailableScratchRegister(RegisterOrAPSR_nzcv reg) {
669    if (reg.IsAPSR_nzcv()) return false;
670    return GetScratchRegisterList()->Includes(reg.AsRegister());
671  }
672
673  bool AliasesAvailableScratchRegister(VRegister reg) {
674    return GetScratchVRegisterList()->IncludesAliasOf(reg);
675  }
676
677  bool AliasesAvailableScratchRegister(const Operand& operand) {
678    if (operand.IsImmediate()) return false;
679    return AliasesAvailableScratchRegister(operand.GetBaseRegister()) ||
680           (operand.IsRegisterShiftedRegister() &&
681            AliasesAvailableScratchRegister(operand.GetShiftRegister()));
682  }
683
684  bool AliasesAvailableScratchRegister(const NeonOperand& operand) {
685    if (operand.IsImmediate()) return false;
686    return AliasesAvailableScratchRegister(operand.GetRegister());
687  }
688
689  bool AliasesAvailableScratchRegister(SRegisterList list) {
690    for (int n = 0; n < list.GetLength(); n++) {
691      if (AliasesAvailableScratchRegister(list.GetSRegister(n))) return true;
692    }
693    return false;
694  }
695
696  bool AliasesAvailableScratchRegister(DRegisterList list) {
697    for (int n = 0; n < list.GetLength(); n++) {
698      if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true;
699    }
700    return false;
701  }
702
703  bool AliasesAvailableScratchRegister(NeonRegisterList list) {
704    for (int n = 0; n < list.GetLength(); n++) {
705      if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true;
706    }
707    return false;
708  }
709
710  bool AliasesAvailableScratchRegister(RegisterList list) {
711    return GetScratchRegisterList()->Overlaps(list);
712  }
713
714  bool AliasesAvailableScratchRegister(const MemOperand& operand) {
715    return AliasesAvailableScratchRegister(operand.GetBaseRegister()) ||
716           (operand.IsShiftedRegister() &&
717            AliasesAvailableScratchRegister(operand.GetOffsetRegister()));
718  }
719
720  // Emit the literal pool in the code buffer.
721  // Every literal is placed on a 32bit boundary
722  // All the literals in the pool will be removed from the pool and potentially
723  // delete'd.
724  void EmitLiteralPool(LiteralPool* const literal_pool, EmitOption option);
725  void EmitLiteralPool(EmitOption option = kBranchRequired) {
726    VIXL_ASSERT(!literal_pool_manager_.IsBlocked());
727    EmitLiteralPool(literal_pool_manager_.GetLiteralPool(), option);
728    literal_pool_manager_.ResetCheckpoint();
729    ComputeCheckpoint();
730  }
731
732  size_t GetLiteralPoolSize() const {
733    return literal_pool_manager_.GetLiteralPoolSize();
734  }
735
736  // Adr with a literal already constructed. Add the literal to the pool if it
737  // is not already done.
738  void Adr(Condition cond, Register rd, RawLiteral* literal) {
739    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
740    VIXL_ASSERT(allow_macro_instructions_);
741    VIXL_ASSERT(OutsideITBlock());
742    EmitLiteralCondRL<&Assembler::adr> emit_helper(rd);
743    GenerateInstruction(cond, emit_helper, literal);
744  }
745  void Adr(Register rd, RawLiteral* literal) { Adr(al, rd, literal); }
746
747  // Loads with literals already constructed. Add the literal to the pool
748  // if it is not already done.
749  void Ldr(Condition cond, Register rt, RawLiteral* literal) {
750    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
751    VIXL_ASSERT(allow_macro_instructions_);
752    VIXL_ASSERT(OutsideITBlock());
753    EmitLiteralCondRL<&Assembler::ldr> emit_helper(rt);
754    GenerateInstruction(cond, emit_helper, literal);
755  }
756  void Ldr(Register rt, RawLiteral* literal) { Ldr(al, rt, literal); }
757
758  void Ldrb(Condition cond, Register rt, RawLiteral* literal) {
759    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
760    VIXL_ASSERT(allow_macro_instructions_);
761    VIXL_ASSERT(OutsideITBlock());
762    EmitLiteralCondRL<&Assembler::ldrb> emit_helper(rt);
763    GenerateInstruction(cond, emit_helper, literal);
764  }
765  void Ldrb(Register rt, RawLiteral* literal) { Ldrb(al, rt, literal); }
766
767  void Ldrd(Condition cond, Register rt, Register rt2, RawLiteral* literal) {
768    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
769    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
770    VIXL_ASSERT(allow_macro_instructions_);
771    VIXL_ASSERT(OutsideITBlock());
772    EmitLiteralCondRRL<&Assembler::ldrd> emit_helper(rt, rt2);
773    GenerateInstruction(cond, emit_helper, literal);
774  }
775  void Ldrd(Register rt, Register rt2, RawLiteral* literal) {
776    Ldrd(al, rt, rt2, literal);
777  }
778
779  void Ldrh(Condition cond, Register rt, RawLiteral* literal) {
780    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
781    VIXL_ASSERT(allow_macro_instructions_);
782    VIXL_ASSERT(OutsideITBlock());
783    EmitLiteralCondRL<&Assembler::ldrh> emit_helper(rt);
784    GenerateInstruction(cond, emit_helper, literal);
785  }
786  void Ldrh(Register rt, RawLiteral* literal) { Ldrh(al, rt, literal); }
787
788  void Ldrsb(Condition cond, Register rt, RawLiteral* literal) {
789    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
790    VIXL_ASSERT(allow_macro_instructions_);
791    VIXL_ASSERT(OutsideITBlock());
792    EmitLiteralCondRL<&Assembler::ldrsb> emit_helper(rt);
793    GenerateInstruction(cond, emit_helper, literal);
794  }
795  void Ldrsb(Register rt, RawLiteral* literal) { Ldrsb(al, rt, literal); }
796
797  void Ldrsh(Condition cond, Register rt, RawLiteral* literal) {
798    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
799    VIXL_ASSERT(allow_macro_instructions_);
800    VIXL_ASSERT(OutsideITBlock());
801    EmitLiteralCondRL<&Assembler::ldrsh> emit_helper(rt);
802    GenerateInstruction(cond, emit_helper, literal);
803  }
804  void Ldrsh(Register rt, RawLiteral* literal) { Ldrsh(al, rt, literal); }
805
806  void Vldr(Condition cond, DataType dt, DRegister rd, RawLiteral* literal) {
807    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
808    VIXL_ASSERT(allow_macro_instructions_);
809    VIXL_ASSERT(OutsideITBlock());
810    EmitLiteralCondDtDL<&Assembler::vldr> emit_helper(dt, rd);
811    GenerateInstruction(cond, emit_helper, literal);
812  }
813  void Vldr(DataType dt, DRegister rd, RawLiteral* literal) {
814    Vldr(al, dt, rd, literal);
815  }
816  void Vldr(Condition cond, DRegister rd, RawLiteral* literal) {
817    Vldr(cond, Untyped64, rd, literal);
818  }
819  void Vldr(DRegister rd, RawLiteral* literal) {
820    Vldr(al, Untyped64, rd, literal);
821  }
822
823  void Vldr(Condition cond, DataType dt, SRegister rd, RawLiteral* literal) {
824    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
825    VIXL_ASSERT(allow_macro_instructions_);
826    VIXL_ASSERT(OutsideITBlock());
827    EmitLiteralCondDtSL<&Assembler::vldr> emit_helper(dt, rd);
828    GenerateInstruction(cond, emit_helper, literal);
829  }
830  void Vldr(DataType dt, SRegister rd, RawLiteral* literal) {
831    Vldr(al, dt, rd, literal);
832  }
833  void Vldr(Condition cond, SRegister rd, RawLiteral* literal) {
834    Vldr(cond, Untyped32, rd, literal);
835  }
836  void Vldr(SRegister rd, RawLiteral* literal) {
837    Vldr(al, Untyped32, rd, literal);
838  }
839
840  // Generic Ldr(register, data)
841  void Ldr(Condition cond, Register rt, uint32_t v) {
842    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
843    VIXL_ASSERT(allow_macro_instructions_);
844    VIXL_ASSERT(OutsideITBlock());
845    RawLiteral* literal =
846        new Literal<uint32_t>(v, RawLiteral::kDeletedOnPlacementByPool);
847    EmitLiteralCondRL<&Assembler::ldr> emit_helper(rt);
848    GenerateInstruction(cond, emit_helper, literal);
849  }
850  template <typename T>
851  void Ldr(Register rt, T v) {
852    Ldr(al, rt, v);
853  }
854
855  // Generic Ldrd(rt, rt2, data)
856  void Ldrd(Condition cond, Register rt, Register rt2, uint64_t v) {
857    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
858    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
859    VIXL_ASSERT(allow_macro_instructions_);
860    VIXL_ASSERT(OutsideITBlock());
861    RawLiteral* literal =
862        new Literal<uint64_t>(v, RawLiteral::kDeletedOnPlacementByPool);
863    EmitLiteralCondRRL<&Assembler::ldrd> emit_helper(rt, rt2);
864    GenerateInstruction(cond, emit_helper, literal);
865  }
866  template <typename T>
867  void Ldrd(Register rt, Register rt2, T v) {
868    Ldrd(al, rt, rt2, v);
869  }
870
871  void Vldr(Condition cond, SRegister rd, float v) {
872    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
873    VIXL_ASSERT(allow_macro_instructions_);
874    VIXL_ASSERT(OutsideITBlock());
875    RawLiteral* literal =
876        new Literal<float>(v, RawLiteral::kDeletedOnPlacementByPool);
877    EmitLiteralCondDtSL<&Assembler::vldr> emit_helper(Untyped32, rd);
878    GenerateInstruction(cond, emit_helper, literal);
879  }
880  void Vldr(SRegister rd, float v) { Vldr(al, rd, v); }
881
882  void Vldr(Condition cond, DRegister rd, double v) {
883    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
884    VIXL_ASSERT(allow_macro_instructions_);
885    VIXL_ASSERT(OutsideITBlock());
886    RawLiteral* literal =
887        new Literal<double>(v, RawLiteral::kDeletedOnPlacementByPool);
888    EmitLiteralCondDtDL<&Assembler::vldr> emit_helper(Untyped64, rd);
889    GenerateInstruction(cond, emit_helper, literal);
890  }
891  void Vldr(DRegister rd, double v) { Vldr(al, rd, v); }
892
893  void Vmov(Condition cond, DRegister rt, double v) { Vmov(cond, F64, rt, v); }
894  void Vmov(DRegister rt, double v) { Vmov(al, F64, rt, v); }
895  void Vmov(Condition cond, SRegister rt, float v) { Vmov(cond, F32, rt, v); }
896  void Vmov(SRegister rt, float v) { Vmov(al, F32, rt, v); }
897
898  void Switch(Register reg, JumpTableBase* table);
899  void GenerateSwitchTable(JumpTableBase* table, int table_size);
900  void Case(JumpTableBase* table, int case_index);
901  void Break(JumpTableBase* table);
902  void Default(JumpTableBase* table);
903  void EndSwitch(JumpTableBase* table);
904
905  // Claim memory on the stack.
906  // Note that the Claim, Drop, and Peek helpers below ensure that offsets used
907  // are multiples of 32 bits to help maintain 32-bit SP alignment.
908  // We could `Align{Up,Down}(size, 4)`, but that's potentially problematic:
909  //     Claim(3)
910  //     Claim(1)
911  //     Drop(4)
912  // would seem correct, when in fact:
913  //    Claim(3) -> sp = sp - 4
914  //    Claim(1) -> sp = sp - 4
915  //    Drop(4)  -> sp = sp + 4
916  //
917  void Claim(int32_t size) {
918    if (size == 0) return;
919    // The stack must be kept 32bit aligned.
920    VIXL_ASSERT((size > 0) && ((size % 4) == 0));
921    Sub(sp, sp, size);
922  }
923  // Release memory on the stack
924  void Drop(int32_t size) {
925    if (size == 0) return;
926    // The stack must be kept 32bit aligned.
927    VIXL_ASSERT((size > 0) && ((size % 4) == 0));
928    Add(sp, sp, size);
929  }
930  void Peek(Register dst, int32_t offset) {
931    VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
932    Ldr(dst, MemOperand(sp, offset));
933  }
934  void Poke(Register src, int32_t offset) {
935    VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
936    Str(src, MemOperand(sp, offset));
937  }
938  void Printf(const char* format,
939              CPURegister reg1 = NoReg,
940              CPURegister reg2 = NoReg,
941              CPURegister reg3 = NoReg,
942              CPURegister reg4 = NoReg);
943  // Functions used by Printf for generation.
944  void PushRegister(CPURegister reg);
945  void PreparePrintfArgument(CPURegister reg,
946                             int* core_count,
947                             int* vfp_count,
948                             uint32_t* printf_type);
949  // Handlers for cases not handled by the assembler.
950  // ADD, MOVT, MOVW, SUB, SXTB16, TEQ, UXTB16
951  virtual void Delegate(InstructionType type,
952                        InstructionCondROp instruction,
953                        Condition cond,
954                        Register rn,
955                        const Operand& operand) VIXL_OVERRIDE;
956  // CMN, CMP, MOV, MOVS, MVN, MVNS, SXTB, SXTH, TST, UXTB, UXTH
957  virtual void Delegate(InstructionType type,
958                        InstructionCondSizeROp instruction,
959                        Condition cond,
960                        EncodingSize size,
961                        Register rn,
962                        const Operand& operand) VIXL_OVERRIDE;
963  // ADDW, ORN, ORNS, PKHBT, PKHTB, RSC, RSCS, SUBW, SXTAB, SXTAB16, SXTAH,
964  // UXTAB, UXTAB16, UXTAH
965  virtual void Delegate(InstructionType type,
966                        InstructionCondRROp instruction,
967                        Condition cond,
968                        Register rd,
969                        Register rn,
970                        const Operand& operand) VIXL_OVERRIDE;
971  // ADC, ADCS, ADD, ADDS, AND, ANDS, ASR, ASRS, BIC, BICS, EOR, EORS, LSL,
972  // LSLS, LSR, LSRS, ORR, ORRS, ROR, RORS, RSB, RSBS, SBC, SBCS, SUB, SUBS
973  virtual void Delegate(InstructionType type,
974                        InstructionCondSizeRL instruction,
975                        Condition cond,
976                        EncodingSize size,
977                        Register rd,
978                        Label* label) VIXL_OVERRIDE;
979  bool GenerateSplitInstruction(InstructionCondSizeRROp instruction,
980                                Condition cond,
981                                Register rd,
982                                Register rn,
983                                uint32_t imm,
984                                uint32_t mask);
985  virtual void Delegate(InstructionType type,
986                        InstructionCondSizeRROp instruction,
987                        Condition cond,
988                        EncodingSize size,
989                        Register rd,
990                        Register rn,
991                        const Operand& operand) VIXL_OVERRIDE;
992  // CBNZ, CBZ
993  virtual void Delegate(InstructionType type,
994                        InstructionRL instruction,
995                        Register rn,
996                        Label* label) VIXL_OVERRIDE;
997  // VMOV
998  virtual void Delegate(InstructionType type,
999                        InstructionCondDtSSop instruction,
1000                        Condition cond,
1001                        DataType dt,
1002                        SRegister rd,
1003                        const SOperand& operand) VIXL_OVERRIDE;
1004  // VMOV, VMVN
1005  virtual void Delegate(InstructionType type,
1006                        InstructionCondDtDDop instruction,
1007                        Condition cond,
1008                        DataType dt,
1009                        DRegister rd,
1010                        const DOperand& operand) VIXL_OVERRIDE;
1011  // VMOV, VMVN
1012  virtual void Delegate(InstructionType type,
1013                        InstructionCondDtQQop instruction,
1014                        Condition cond,
1015                        DataType dt,
1016                        QRegister rd,
1017                        const QOperand& operand) VIXL_OVERRIDE;
1018  // LDR, LDRB, LDRH, LDRSB, LDRSH, STR, STRB, STRH
1019  virtual void Delegate(InstructionType type,
1020                        InstructionCondSizeRMop instruction,
1021                        Condition cond,
1022                        EncodingSize size,
1023                        Register rd,
1024                        const MemOperand& operand) VIXL_OVERRIDE;
1025  // LDAEXD, LDRD, LDREXD, STLEX, STLEXB, STLEXH, STRD, STREX, STREXB, STREXH
1026  virtual void Delegate(InstructionType type,
1027                        InstructionCondRL instruction,
1028                        Condition cond,
1029                        Register rt,
1030                        Label* label) VIXL_OVERRIDE;
1031  virtual void Delegate(InstructionType type,
1032                        InstructionCondRRL instruction,
1033                        Condition cond,
1034                        Register rt,
1035                        Register rt2,
1036                        Label* label) VIXL_OVERRIDE;
1037  virtual void Delegate(InstructionType type,
1038                        InstructionCondRRMop instruction,
1039                        Condition cond,
1040                        Register rt,
1041                        Register rt2,
1042                        const MemOperand& operand) VIXL_OVERRIDE;
1043  // VLDR, VSTR
1044  virtual void Delegate(InstructionType type,
1045                        InstructionCondDtSMop instruction,
1046                        Condition cond,
1047                        DataType dt,
1048                        SRegister rd,
1049                        const MemOperand& operand) VIXL_OVERRIDE;
1050  // VLDR, VSTR
1051  virtual void Delegate(InstructionType type,
1052                        InstructionCondDtDMop instruction,
1053                        Condition cond,
1054                        DataType dt,
1055                        DRegister rd,
1056                        const MemOperand& operand) VIXL_OVERRIDE;
1057  // MSR
1058  virtual void Delegate(InstructionType type,
1059                        InstructionCondMsrOp instruction,
1060                        Condition cond,
1061                        MaskedSpecialRegister spec_reg,
1062                        const Operand& operand) VIXL_OVERRIDE;
1063  virtual void Delegate(InstructionType type,
1064                        InstructionCondDtDL instruction,
1065                        Condition cond,
1066                        DataType dt,
1067                        DRegister rd,
1068                        Label* label) VIXL_OVERRIDE;
1069  virtual void Delegate(InstructionType type,
1070                        InstructionCondDtSL instruction,
1071                        Condition cond,
1072                        DataType dt,
1073                        SRegister rd,
1074                        Label* label) VIXL_OVERRIDE;
1075
1076  // Start of generated code.
1077
1078  void Adc(Condition cond, Register rd, Register rn, const Operand& operand) {
1079    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1080    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1081    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1082    VIXL_ASSERT(allow_macro_instructions_);
1083    VIXL_ASSERT(OutsideITBlock());
1084    MacroEmissionCheckScope guard(this);
1085    bool can_use_it =
1086        // ADC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1087        operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
1088        operand.GetBaseRegister().IsLow();
1089    ITScope it_scope(this, &cond, can_use_it);
1090    adc(cond, rd, rn, operand);
1091  }
1092  void Adc(Register rd, Register rn, const Operand& operand) {
1093    Adc(al, rd, rn, operand);
1094  }
1095  void Adc(FlagsUpdate flags,
1096           Condition cond,
1097           Register rd,
1098           Register rn,
1099           const Operand& operand) {
1100    switch (flags) {
1101      case LeaveFlags:
1102        Adc(cond, rd, rn, operand);
1103        break;
1104      case SetFlags:
1105        Adcs(cond, rd, rn, operand);
1106        break;
1107      case DontCare:
1108        bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1109                                   rn.Is(rd) && operand.IsPlainRegister() &&
1110                                   operand.GetBaseRegister().IsLow();
1111        if (setflags_is_smaller) {
1112          Adcs(cond, rd, rn, operand);
1113        } else {
1114          Adc(cond, rd, rn, operand);
1115        }
1116        break;
1117    }
1118  }
1119  void Adc(FlagsUpdate flags,
1120           Register rd,
1121           Register rn,
1122           const Operand& operand) {
1123    Adc(flags, al, rd, rn, operand);
1124  }
1125
1126  void Adcs(Condition cond, Register rd, Register rn, const Operand& operand) {
1127    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1128    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1129    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1130    VIXL_ASSERT(allow_macro_instructions_);
1131    VIXL_ASSERT(OutsideITBlock());
1132    MacroEmissionCheckScope guard(this);
1133    ITScope it_scope(this, &cond);
1134    adcs(cond, rd, rn, operand);
1135  }
1136  void Adcs(Register rd, Register rn, const Operand& operand) {
1137    Adcs(al, rd, rn, operand);
1138  }
1139
1140  void Add(Condition cond, Register rd, Register rn, const Operand& operand) {
1141    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1142    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1143    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1144    VIXL_ASSERT(allow_macro_instructions_);
1145    VIXL_ASSERT(OutsideITBlock());
1146    MacroEmissionCheckScope guard(this);
1147    if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
1148      uint32_t immediate = operand.GetImmediate();
1149      if (immediate == 0) {
1150        return;
1151      }
1152    }
1153    bool can_use_it =
1154        // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
1155        (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
1156         rd.IsLow()) ||
1157        // ADD<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
1158        (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
1159         rd.IsLow() && rn.Is(rd)) ||
1160        // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
1161        (operand.IsImmediate() && (operand.GetImmediate() <= 1020) &&
1162         ((operand.GetImmediate() & 0x3) == 0) && rd.IsLow() && rn.IsSP()) ||
1163        // ADD<c>{<q>} <Rd>, <Rn>, <Rm>
1164        (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
1165         operand.GetBaseRegister().IsLow()) ||
1166        // ADD<c>{<q>} <Rdn>, <Rm> ; T2
1167        (operand.IsPlainRegister() && !rd.IsPC() && rn.Is(rd) &&
1168         !operand.GetBaseRegister().IsSP() &&
1169         !operand.GetBaseRegister().IsPC()) ||
1170        // ADD{<c>}{<q>} {<Rdm>,} SP, <Rdm> ; T1
1171        (operand.IsPlainRegister() && !rd.IsPC() && rn.IsSP() &&
1172         operand.GetBaseRegister().Is(rd));
1173    ITScope it_scope(this, &cond, can_use_it);
1174    add(cond, rd, rn, operand);
1175  }
1176  void Add(Register rd, Register rn, const Operand& operand) {
1177    Add(al, rd, rn, operand);
1178  }
1179  void Add(FlagsUpdate flags,
1180           Condition cond,
1181           Register rd,
1182           Register rn,
1183           const Operand& operand) {
1184    switch (flags) {
1185      case LeaveFlags:
1186        Add(cond, rd, rn, operand);
1187        break;
1188      case SetFlags:
1189        Adds(cond, rd, rn, operand);
1190        break;
1191      case DontCare:
1192        bool setflags_is_smaller =
1193            IsUsingT32() && cond.Is(al) &&
1194            ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
1195              !rd.Is(rn) && operand.GetBaseRegister().IsLow()) ||
1196             (operand.IsImmediate() &&
1197              ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
1198               (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
1199        if (setflags_is_smaller) {
1200          Adds(cond, rd, rn, operand);
1201        } else {
1202          bool changed_op_is_smaller =
1203              operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
1204              ((rd.IsLow() && rn.IsLow() &&
1205                (operand.GetSignedImmediate() >= -7)) ||
1206               (rd.IsLow() && rn.Is(rd) &&
1207                (operand.GetSignedImmediate() >= -255)));
1208          if (changed_op_is_smaller) {
1209            Subs(cond, rd, rn, -operand.GetSignedImmediate());
1210          } else {
1211            Add(cond, rd, rn, operand);
1212          }
1213        }
1214        break;
1215    }
1216  }
1217  void Add(FlagsUpdate flags,
1218           Register rd,
1219           Register rn,
1220           const Operand& operand) {
1221    Add(flags, al, rd, rn, operand);
1222  }
1223
1224  void Adds(Condition cond, Register rd, Register rn, const Operand& operand) {
1225    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1226    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1227    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1228    VIXL_ASSERT(allow_macro_instructions_);
1229    VIXL_ASSERT(OutsideITBlock());
1230    MacroEmissionCheckScope guard(this);
1231    ITScope it_scope(this, &cond);
1232    adds(cond, rd, rn, operand);
1233  }
1234  void Adds(Register rd, Register rn, const Operand& operand) {
1235    Adds(al, rd, rn, operand);
1236  }
1237
1238  void Adr(Condition cond, Register rd, Label* label) {
1239    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1240    VIXL_ASSERT(allow_macro_instructions_);
1241    VIXL_ASSERT(OutsideITBlock());
1242    MacroEmissionCheckScope guard(this);
1243    ITScope it_scope(this, &cond);
1244    adr(cond, rd, label);
1245  }
1246  void Adr(Register rd, Label* label) { Adr(al, rd, label); }
1247
1248  void And(Condition cond, Register rd, Register rn, const Operand& operand) {
1249    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1250    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1251    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1252    VIXL_ASSERT(allow_macro_instructions_);
1253    VIXL_ASSERT(OutsideITBlock());
1254    MacroEmissionCheckScope guard(this);
1255    if (rd.Is(rn) && operand.IsPlainRegister() &&
1256        rd.Is(operand.GetBaseRegister())) {
1257      return;
1258    }
1259    if (cond.Is(al) && operand.IsImmediate()) {
1260      uint32_t immediate = operand.GetImmediate();
1261      if (immediate == 0) {
1262        mov(rd, 0);
1263        return;
1264      }
1265      if ((immediate == 0xffffffff) && rd.Is(rn)) {
1266        return;
1267      }
1268    }
1269    bool can_use_it =
1270        // AND<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1271        operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1272        operand.GetBaseRegister().IsLow();
1273    ITScope it_scope(this, &cond, can_use_it);
1274    and_(cond, rd, rn, operand);
1275  }
1276  void And(Register rd, Register rn, const Operand& operand) {
1277    And(al, rd, rn, operand);
1278  }
1279  void And(FlagsUpdate flags,
1280           Condition cond,
1281           Register rd,
1282           Register rn,
1283           const Operand& operand) {
1284    switch (flags) {
1285      case LeaveFlags:
1286        And(cond, rd, rn, operand);
1287        break;
1288      case SetFlags:
1289        Ands(cond, rd, rn, operand);
1290        break;
1291      case DontCare:
1292        if (operand.IsPlainRegister() && rd.Is(rn) &&
1293            rd.Is(operand.GetBaseRegister())) {
1294          return;
1295        }
1296        bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1297                                   rn.Is(rd) && operand.IsPlainRegister() &&
1298                                   operand.GetBaseRegister().IsLow();
1299        if (setflags_is_smaller) {
1300          Ands(cond, rd, rn, operand);
1301        } else {
1302          And(cond, rd, rn, operand);
1303        }
1304        break;
1305    }
1306  }
1307  void And(FlagsUpdate flags,
1308           Register rd,
1309           Register rn,
1310           const Operand& operand) {
1311    And(flags, al, rd, rn, operand);
1312  }
1313
1314  void Ands(Condition cond, Register rd, Register rn, const Operand& operand) {
1315    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1316    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1317    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1318    VIXL_ASSERT(allow_macro_instructions_);
1319    VIXL_ASSERT(OutsideITBlock());
1320    MacroEmissionCheckScope guard(this);
1321    ITScope it_scope(this, &cond);
1322    ands(cond, rd, rn, operand);
1323  }
1324  void Ands(Register rd, Register rn, const Operand& operand) {
1325    Ands(al, rd, rn, operand);
1326  }
1327
1328  void Asr(Condition cond, Register rd, Register rm, const Operand& operand) {
1329    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1330    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1331    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1332    VIXL_ASSERT(allow_macro_instructions_);
1333    VIXL_ASSERT(OutsideITBlock());
1334    MacroEmissionCheckScope guard(this);
1335    bool can_use_it =
1336        // ASR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
1337        (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
1338         (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
1339        // ASR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
1340        (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
1341         operand.GetBaseRegister().IsLow());
1342    ITScope it_scope(this, &cond, can_use_it);
1343    asr(cond, rd, rm, operand);
1344  }
1345  void Asr(Register rd, Register rm, const Operand& operand) {
1346    Asr(al, rd, rm, operand);
1347  }
1348  void Asr(FlagsUpdate flags,
1349           Condition cond,
1350           Register rd,
1351           Register rm,
1352           const Operand& operand) {
1353    switch (flags) {
1354      case LeaveFlags:
1355        Asr(cond, rd, rm, operand);
1356        break;
1357      case SetFlags:
1358        Asrs(cond, rd, rm, operand);
1359        break;
1360      case DontCare:
1361        bool setflags_is_smaller =
1362            IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
1363            ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
1364              (operand.GetImmediate() <= 32)) ||
1365             (operand.IsPlainRegister() && rd.Is(rm)));
1366        if (setflags_is_smaller) {
1367          Asrs(cond, rd, rm, operand);
1368        } else {
1369          Asr(cond, rd, rm, operand);
1370        }
1371        break;
1372    }
1373  }
1374  void Asr(FlagsUpdate flags,
1375           Register rd,
1376           Register rm,
1377           const Operand& operand) {
1378    Asr(flags, al, rd, rm, operand);
1379  }
1380
1381  void Asrs(Condition cond, Register rd, Register rm, const Operand& operand) {
1382    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1383    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1384    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1385    VIXL_ASSERT(allow_macro_instructions_);
1386    VIXL_ASSERT(OutsideITBlock());
1387    MacroEmissionCheckScope guard(this);
1388    ITScope it_scope(this, &cond);
1389    asrs(cond, rd, rm, operand);
1390  }
1391  void Asrs(Register rd, Register rm, const Operand& operand) {
1392    Asrs(al, rd, rm, operand);
1393  }
1394
1395  void B(Condition cond, Label* label, BranchHint hint = kBranchWithoutHint) {
1396    VIXL_ASSERT(allow_macro_instructions_);
1397    VIXL_ASSERT(OutsideITBlock());
1398    MacroEmissionCheckScope guard(this);
1399    if (hint == kNear) {
1400      if (label->IsBound()) {
1401        b(cond, label);
1402      } else {
1403        b(cond, Narrow, label);
1404      }
1405    } else {
1406      b(cond, label);
1407    }
1408    AddBranchLabel(label);
1409  }
1410  void B(Label* label, BranchHint hint = kBranchWithoutHint) {
1411    B(al, label, hint);
1412  }
1413  void BPreferNear(Condition cond, Label* label) { B(cond, label, kNear); }
1414  void BPreferNear(Label* label) { B(al, label, kNear); }
1415
1416  void Bfc(Condition cond, Register rd, uint32_t lsb, const Operand& operand) {
1417    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1418    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1419    VIXL_ASSERT(allow_macro_instructions_);
1420    VIXL_ASSERT(OutsideITBlock());
1421    MacroEmissionCheckScope guard(this);
1422    ITScope it_scope(this, &cond);
1423    bfc(cond, rd, lsb, operand);
1424  }
1425  void Bfc(Register rd, uint32_t lsb, const Operand& operand) {
1426    Bfc(al, rd, lsb, operand);
1427  }
1428
1429  void Bfi(Condition cond,
1430           Register rd,
1431           Register rn,
1432           uint32_t lsb,
1433           const Operand& operand) {
1434    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1435    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1436    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1437    VIXL_ASSERT(allow_macro_instructions_);
1438    VIXL_ASSERT(OutsideITBlock());
1439    MacroEmissionCheckScope guard(this);
1440    ITScope it_scope(this, &cond);
1441    bfi(cond, rd, rn, lsb, operand);
1442  }
1443  void Bfi(Register rd, Register rn, uint32_t lsb, const Operand& operand) {
1444    Bfi(al, rd, rn, lsb, operand);
1445  }
1446
1447  void Bic(Condition cond, Register rd, Register rn, const Operand& operand) {
1448    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1449    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1450    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1451    VIXL_ASSERT(allow_macro_instructions_);
1452    VIXL_ASSERT(OutsideITBlock());
1453    MacroEmissionCheckScope guard(this);
1454    if (cond.Is(al) && operand.IsImmediate()) {
1455      uint32_t immediate = operand.GetImmediate();
1456      if ((immediate == 0) && rd.Is(rn)) {
1457        return;
1458      }
1459      if (immediate == 0xffffffff) {
1460        mov(rd, 0);
1461        return;
1462      }
1463    }
1464    bool can_use_it =
1465        // BIC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1466        operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1467        operand.GetBaseRegister().IsLow();
1468    ITScope it_scope(this, &cond, can_use_it);
1469    bic(cond, rd, rn, operand);
1470  }
1471  void Bic(Register rd, Register rn, const Operand& operand) {
1472    Bic(al, rd, rn, operand);
1473  }
1474  void Bic(FlagsUpdate flags,
1475           Condition cond,
1476           Register rd,
1477           Register rn,
1478           const Operand& operand) {
1479    switch (flags) {
1480      case LeaveFlags:
1481        Bic(cond, rd, rn, operand);
1482        break;
1483      case SetFlags:
1484        Bics(cond, rd, rn, operand);
1485        break;
1486      case DontCare:
1487        bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1488                                   rn.Is(rd) && operand.IsPlainRegister() &&
1489                                   operand.GetBaseRegister().IsLow();
1490        if (setflags_is_smaller) {
1491          Bics(cond, rd, rn, operand);
1492        } else {
1493          Bic(cond, rd, rn, operand);
1494        }
1495        break;
1496    }
1497  }
1498  void Bic(FlagsUpdate flags,
1499           Register rd,
1500           Register rn,
1501           const Operand& operand) {
1502    Bic(flags, al, rd, rn, operand);
1503  }
1504
1505  void Bics(Condition cond, Register rd, Register rn, const Operand& operand) {
1506    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1507    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1508    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1509    VIXL_ASSERT(allow_macro_instructions_);
1510    VIXL_ASSERT(OutsideITBlock());
1511    MacroEmissionCheckScope guard(this);
1512    ITScope it_scope(this, &cond);
1513    bics(cond, rd, rn, operand);
1514  }
1515  void Bics(Register rd, Register rn, const Operand& operand) {
1516    Bics(al, rd, rn, operand);
1517  }
1518
1519  void Bkpt(Condition cond, uint32_t imm) {
1520    VIXL_ASSERT(allow_macro_instructions_);
1521    VIXL_ASSERT(OutsideITBlock());
1522    MacroEmissionCheckScope guard(this);
1523    ITScope it_scope(this, &cond);
1524    bkpt(cond, imm);
1525  }
1526  void Bkpt(uint32_t imm) { Bkpt(al, imm); }
1527
1528  void Bl(Condition cond, Label* label) {
1529    VIXL_ASSERT(allow_macro_instructions_);
1530    VIXL_ASSERT(OutsideITBlock());
1531    MacroEmissionCheckScope guard(this);
1532    ITScope it_scope(this, &cond);
1533    bl(cond, label);
1534    AddBranchLabel(label);
1535  }
1536  void Bl(Label* label) { Bl(al, label); }
1537
1538  void Blx(Condition cond, Label* label) {
1539    VIXL_ASSERT(allow_macro_instructions_);
1540    VIXL_ASSERT(OutsideITBlock());
1541    MacroEmissionCheckScope guard(this);
1542    ITScope it_scope(this, &cond);
1543    blx(cond, label);
1544    AddBranchLabel(label);
1545  }
1546  void Blx(Label* label) { Blx(al, label); }
1547
1548  void Blx(Condition cond, Register rm) {
1549    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1550    VIXL_ASSERT(allow_macro_instructions_);
1551    VIXL_ASSERT(OutsideITBlock());
1552    MacroEmissionCheckScope guard(this);
1553    bool can_use_it =
1554        // BLX{<c>}{<q>} <Rm> ; T1
1555        !rm.IsPC();
1556    ITScope it_scope(this, &cond, can_use_it);
1557    blx(cond, rm);
1558  }
1559  void Blx(Register rm) { Blx(al, rm); }
1560
1561  void Bx(Condition cond, Register rm) {
1562    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1563    VIXL_ASSERT(allow_macro_instructions_);
1564    VIXL_ASSERT(OutsideITBlock());
1565    MacroEmissionCheckScope guard(this);
1566    bool can_use_it =
1567        // BX{<c>}{<q>} <Rm> ; T1
1568        !rm.IsPC();
1569    ITScope it_scope(this, &cond, can_use_it);
1570    bx(cond, rm);
1571  }
1572  void Bx(Register rm) { Bx(al, rm); }
1573
1574  void Bxj(Condition cond, Register rm) {
1575    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1576    VIXL_ASSERT(allow_macro_instructions_);
1577    VIXL_ASSERT(OutsideITBlock());
1578    MacroEmissionCheckScope guard(this);
1579    ITScope it_scope(this, &cond);
1580    bxj(cond, rm);
1581  }
1582  void Bxj(Register rm) { Bxj(al, rm); }
1583
1584  void Cbnz(Register rn, Label* label) {
1585    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1586    VIXL_ASSERT(allow_macro_instructions_);
1587    VIXL_ASSERT(OutsideITBlock());
1588    MacroEmissionCheckScope guard(this);
1589    cbnz(rn, label);
1590    AddBranchLabel(label);
1591  }
1592
1593  void Cbz(Register rn, Label* label) {
1594    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1595    VIXL_ASSERT(allow_macro_instructions_);
1596    VIXL_ASSERT(OutsideITBlock());
1597    MacroEmissionCheckScope guard(this);
1598    cbz(rn, label);
1599    AddBranchLabel(label);
1600  }
1601
1602  void Clrex(Condition cond) {
1603    VIXL_ASSERT(allow_macro_instructions_);
1604    VIXL_ASSERT(OutsideITBlock());
1605    MacroEmissionCheckScope guard(this);
1606    ITScope it_scope(this, &cond);
1607    clrex(cond);
1608  }
1609  void Clrex() { Clrex(al); }
1610
1611  void Clz(Condition cond, Register rd, Register rm) {
1612    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1613    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1614    VIXL_ASSERT(allow_macro_instructions_);
1615    VIXL_ASSERT(OutsideITBlock());
1616    MacroEmissionCheckScope guard(this);
1617    ITScope it_scope(this, &cond);
1618    clz(cond, rd, rm);
1619  }
1620  void Clz(Register rd, Register rm) { Clz(al, rd, rm); }
1621
1622  void Cmn(Condition cond, Register rn, const Operand& operand) {
1623    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1624    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1625    VIXL_ASSERT(allow_macro_instructions_);
1626    VIXL_ASSERT(OutsideITBlock());
1627    MacroEmissionCheckScope guard(this);
1628    bool can_use_it =
1629        // CMN{<c>}{<q>} <Rn>, <Rm> ; T1
1630        operand.IsPlainRegister() && rn.IsLow() &&
1631        operand.GetBaseRegister().IsLow();
1632    ITScope it_scope(this, &cond, can_use_it);
1633    cmn(cond, rn, operand);
1634  }
1635  void Cmn(Register rn, const Operand& operand) { Cmn(al, rn, operand); }
1636
1637  void Cmp(Condition cond, Register rn, const Operand& operand) {
1638    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1639    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1640    VIXL_ASSERT(allow_macro_instructions_);
1641    VIXL_ASSERT(OutsideITBlock());
1642    MacroEmissionCheckScope guard(this);
1643    bool can_use_it =
1644        // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
1645        (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
1646         rn.IsLow()) ||
1647        // CMP{<c>}{<q>} <Rn>, <Rm> ; T1 T2
1648        (operand.IsPlainRegister() && !rn.IsPC() &&
1649         !operand.GetBaseRegister().IsPC());
1650    ITScope it_scope(this, &cond, can_use_it);
1651    cmp(cond, rn, operand);
1652  }
1653  void Cmp(Register rn, const Operand& operand) { Cmp(al, rn, operand); }
1654
1655  void Crc32b(Condition cond, Register rd, Register rn, Register rm) {
1656    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1657    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1658    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1659    VIXL_ASSERT(allow_macro_instructions_);
1660    VIXL_ASSERT(OutsideITBlock());
1661    MacroEmissionCheckScope guard(this);
1662    ITScope it_scope(this, &cond);
1663    crc32b(cond, rd, rn, rm);
1664  }
1665  void Crc32b(Register rd, Register rn, Register rm) { Crc32b(al, rd, rn, rm); }
1666
1667  void Crc32cb(Condition cond, Register rd, Register rn, Register rm) {
1668    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1669    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1670    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1671    VIXL_ASSERT(allow_macro_instructions_);
1672    VIXL_ASSERT(OutsideITBlock());
1673    MacroEmissionCheckScope guard(this);
1674    ITScope it_scope(this, &cond);
1675    crc32cb(cond, rd, rn, rm);
1676  }
1677  void Crc32cb(Register rd, Register rn, Register rm) {
1678    Crc32cb(al, rd, rn, rm);
1679  }
1680
1681  void Crc32ch(Condition cond, Register rd, Register rn, Register rm) {
1682    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1683    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1684    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1685    VIXL_ASSERT(allow_macro_instructions_);
1686    VIXL_ASSERT(OutsideITBlock());
1687    MacroEmissionCheckScope guard(this);
1688    ITScope it_scope(this, &cond);
1689    crc32ch(cond, rd, rn, rm);
1690  }
1691  void Crc32ch(Register rd, Register rn, Register rm) {
1692    Crc32ch(al, rd, rn, rm);
1693  }
1694
1695  void Crc32cw(Condition cond, Register rd, Register rn, Register rm) {
1696    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1697    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1698    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1699    VIXL_ASSERT(allow_macro_instructions_);
1700    VIXL_ASSERT(OutsideITBlock());
1701    MacroEmissionCheckScope guard(this);
1702    ITScope it_scope(this, &cond);
1703    crc32cw(cond, rd, rn, rm);
1704  }
1705  void Crc32cw(Register rd, Register rn, Register rm) {
1706    Crc32cw(al, rd, rn, rm);
1707  }
1708
1709  void Crc32h(Condition cond, Register rd, Register rn, Register rm) {
1710    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1711    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1712    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1713    VIXL_ASSERT(allow_macro_instructions_);
1714    VIXL_ASSERT(OutsideITBlock());
1715    MacroEmissionCheckScope guard(this);
1716    ITScope it_scope(this, &cond);
1717    crc32h(cond, rd, rn, rm);
1718  }
1719  void Crc32h(Register rd, Register rn, Register rm) { Crc32h(al, rd, rn, rm); }
1720
1721  void Crc32w(Condition cond, Register rd, Register rn, Register rm) {
1722    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1723    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1724    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
1725    VIXL_ASSERT(allow_macro_instructions_);
1726    VIXL_ASSERT(OutsideITBlock());
1727    MacroEmissionCheckScope guard(this);
1728    ITScope it_scope(this, &cond);
1729    crc32w(cond, rd, rn, rm);
1730  }
1731  void Crc32w(Register rd, Register rn, Register rm) { Crc32w(al, rd, rn, rm); }
1732
1733  void Dmb(Condition cond, MemoryBarrier option) {
1734    VIXL_ASSERT(allow_macro_instructions_);
1735    VIXL_ASSERT(OutsideITBlock());
1736    MacroEmissionCheckScope guard(this);
1737    ITScope it_scope(this, &cond);
1738    dmb(cond, option);
1739  }
1740  void Dmb(MemoryBarrier option) { Dmb(al, option); }
1741
1742  void Dsb(Condition cond, MemoryBarrier option) {
1743    VIXL_ASSERT(allow_macro_instructions_);
1744    VIXL_ASSERT(OutsideITBlock());
1745    MacroEmissionCheckScope guard(this);
1746    ITScope it_scope(this, &cond);
1747    dsb(cond, option);
1748  }
1749  void Dsb(MemoryBarrier option) { Dsb(al, option); }
1750
1751  void Eor(Condition cond, Register rd, Register rn, const Operand& operand) {
1752    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1753    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1754    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1755    VIXL_ASSERT(allow_macro_instructions_);
1756    VIXL_ASSERT(OutsideITBlock());
1757    MacroEmissionCheckScope guard(this);
1758    if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
1759      uint32_t immediate = operand.GetImmediate();
1760      if (immediate == 0) {
1761        return;
1762      }
1763      if (immediate == 0xffffffff) {
1764        mvn(rd, rn);
1765        return;
1766      }
1767    }
1768    bool can_use_it =
1769        // EOR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
1770        operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
1771        operand.GetBaseRegister().IsLow();
1772    ITScope it_scope(this, &cond, can_use_it);
1773    eor(cond, rd, rn, operand);
1774  }
1775  void Eor(Register rd, Register rn, const Operand& operand) {
1776    Eor(al, rd, rn, operand);
1777  }
1778  void Eor(FlagsUpdate flags,
1779           Condition cond,
1780           Register rd,
1781           Register rn,
1782           const Operand& operand) {
1783    switch (flags) {
1784      case LeaveFlags:
1785        Eor(cond, rd, rn, operand);
1786        break;
1787      case SetFlags:
1788        Eors(cond, rd, rn, operand);
1789        break;
1790      case DontCare:
1791        bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
1792                                   rn.Is(rd) && operand.IsPlainRegister() &&
1793                                   operand.GetBaseRegister().IsLow();
1794        if (setflags_is_smaller) {
1795          Eors(cond, rd, rn, operand);
1796        } else {
1797          Eor(cond, rd, rn, operand);
1798        }
1799        break;
1800    }
1801  }
1802  void Eor(FlagsUpdate flags,
1803           Register rd,
1804           Register rn,
1805           const Operand& operand) {
1806    Eor(flags, al, rd, rn, operand);
1807  }
1808
1809  void Eors(Condition cond, Register rd, Register rn, const Operand& operand) {
1810    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
1811    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1812    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1813    VIXL_ASSERT(allow_macro_instructions_);
1814    VIXL_ASSERT(OutsideITBlock());
1815    MacroEmissionCheckScope guard(this);
1816    ITScope it_scope(this, &cond);
1817    eors(cond, rd, rn, operand);
1818  }
1819  void Eors(Register rd, Register rn, const Operand& operand) {
1820    Eors(al, rd, rn, operand);
1821  }
1822
1823  void Fldmdbx(Condition cond,
1824               Register rn,
1825               WriteBack write_back,
1826               DRegisterList dreglist) {
1827    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1828    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1829    VIXL_ASSERT(allow_macro_instructions_);
1830    VIXL_ASSERT(OutsideITBlock());
1831    MacroEmissionCheckScope guard(this);
1832    ITScope it_scope(this, &cond);
1833    fldmdbx(cond, rn, write_back, dreglist);
1834  }
1835  void Fldmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
1836    Fldmdbx(al, rn, write_back, dreglist);
1837  }
1838
1839  void Fldmiax(Condition cond,
1840               Register rn,
1841               WriteBack write_back,
1842               DRegisterList dreglist) {
1843    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1844    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1845    VIXL_ASSERT(allow_macro_instructions_);
1846    VIXL_ASSERT(OutsideITBlock());
1847    MacroEmissionCheckScope guard(this);
1848    ITScope it_scope(this, &cond);
1849    fldmiax(cond, rn, write_back, dreglist);
1850  }
1851  void Fldmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
1852    Fldmiax(al, rn, write_back, dreglist);
1853  }
1854
1855  void Fstmdbx(Condition cond,
1856               Register rn,
1857               WriteBack write_back,
1858               DRegisterList dreglist) {
1859    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1860    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1861    VIXL_ASSERT(allow_macro_instructions_);
1862    VIXL_ASSERT(OutsideITBlock());
1863    MacroEmissionCheckScope guard(this);
1864    ITScope it_scope(this, &cond);
1865    fstmdbx(cond, rn, write_back, dreglist);
1866  }
1867  void Fstmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
1868    Fstmdbx(al, rn, write_back, dreglist);
1869  }
1870
1871  void Fstmiax(Condition cond,
1872               Register rn,
1873               WriteBack write_back,
1874               DRegisterList dreglist) {
1875    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
1876    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
1877    VIXL_ASSERT(allow_macro_instructions_);
1878    VIXL_ASSERT(OutsideITBlock());
1879    MacroEmissionCheckScope guard(this);
1880    ITScope it_scope(this, &cond);
1881    fstmiax(cond, rn, write_back, dreglist);
1882  }
1883  void Fstmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
1884    Fstmiax(al, rn, write_back, dreglist);
1885  }
1886
1887  void Hlt(Condition cond, uint32_t imm) {
1888    VIXL_ASSERT(allow_macro_instructions_);
1889    VIXL_ASSERT(OutsideITBlock());
1890    MacroEmissionCheckScope guard(this);
1891    ITScope it_scope(this, &cond);
1892    hlt(cond, imm);
1893  }
1894  void Hlt(uint32_t imm) { Hlt(al, imm); }
1895
1896  void Hvc(Condition cond, uint32_t imm) {
1897    VIXL_ASSERT(allow_macro_instructions_);
1898    VIXL_ASSERT(OutsideITBlock());
1899    MacroEmissionCheckScope guard(this);
1900    ITScope it_scope(this, &cond);
1901    hvc(cond, imm);
1902  }
1903  void Hvc(uint32_t imm) { Hvc(al, imm); }
1904
1905  void Isb(Condition cond, MemoryBarrier option) {
1906    VIXL_ASSERT(allow_macro_instructions_);
1907    VIXL_ASSERT(OutsideITBlock());
1908    MacroEmissionCheckScope guard(this);
1909    ITScope it_scope(this, &cond);
1910    isb(cond, option);
1911  }
1912  void Isb(MemoryBarrier option) { Isb(al, option); }
1913
1914  void Lda(Condition cond, Register rt, const MemOperand& operand) {
1915    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1916    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1917    VIXL_ASSERT(allow_macro_instructions_);
1918    VIXL_ASSERT(OutsideITBlock());
1919    MacroEmissionCheckScope guard(this);
1920    ITScope it_scope(this, &cond);
1921    lda(cond, rt, operand);
1922  }
1923  void Lda(Register rt, const MemOperand& operand) { Lda(al, rt, operand); }
1924
1925  void Ldab(Condition cond, Register rt, const MemOperand& operand) {
1926    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1927    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1928    VIXL_ASSERT(allow_macro_instructions_);
1929    VIXL_ASSERT(OutsideITBlock());
1930    MacroEmissionCheckScope guard(this);
1931    ITScope it_scope(this, &cond);
1932    ldab(cond, rt, operand);
1933  }
1934  void Ldab(Register rt, const MemOperand& operand) { Ldab(al, rt, operand); }
1935
1936  void Ldaex(Condition cond, Register rt, const MemOperand& operand) {
1937    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1938    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1939    VIXL_ASSERT(allow_macro_instructions_);
1940    VIXL_ASSERT(OutsideITBlock());
1941    MacroEmissionCheckScope guard(this);
1942    ITScope it_scope(this, &cond);
1943    ldaex(cond, rt, operand);
1944  }
1945  void Ldaex(Register rt, const MemOperand& operand) { Ldaex(al, rt, operand); }
1946
1947  void Ldaexb(Condition cond, Register rt, const MemOperand& operand) {
1948    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1949    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1950    VIXL_ASSERT(allow_macro_instructions_);
1951    VIXL_ASSERT(OutsideITBlock());
1952    MacroEmissionCheckScope guard(this);
1953    ITScope it_scope(this, &cond);
1954    ldaexb(cond, rt, operand);
1955  }
1956  void Ldaexb(Register rt, const MemOperand& operand) {
1957    Ldaexb(al, rt, operand);
1958  }
1959
1960  void Ldaexd(Condition cond,
1961              Register rt,
1962              Register rt2,
1963              const MemOperand& operand) {
1964    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1965    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
1966    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1967    VIXL_ASSERT(allow_macro_instructions_);
1968    VIXL_ASSERT(OutsideITBlock());
1969    MacroEmissionCheckScope guard(this);
1970    ITScope it_scope(this, &cond);
1971    ldaexd(cond, rt, rt2, operand);
1972  }
1973  void Ldaexd(Register rt, Register rt2, const MemOperand& operand) {
1974    Ldaexd(al, rt, rt2, operand);
1975  }
1976
1977  void Ldaexh(Condition cond, Register rt, const MemOperand& operand) {
1978    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1979    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1980    VIXL_ASSERT(allow_macro_instructions_);
1981    VIXL_ASSERT(OutsideITBlock());
1982    MacroEmissionCheckScope guard(this);
1983    ITScope it_scope(this, &cond);
1984    ldaexh(cond, rt, operand);
1985  }
1986  void Ldaexh(Register rt, const MemOperand& operand) {
1987    Ldaexh(al, rt, operand);
1988  }
1989
1990  void Ldah(Condition cond, Register rt, const MemOperand& operand) {
1991    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
1992    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
1993    VIXL_ASSERT(allow_macro_instructions_);
1994    VIXL_ASSERT(OutsideITBlock());
1995    MacroEmissionCheckScope guard(this);
1996    ITScope it_scope(this, &cond);
1997    ldah(cond, rt, operand);
1998  }
1999  void Ldah(Register rt, const MemOperand& operand) { Ldah(al, rt, operand); }
2000
2001  void Ldm(Condition cond,
2002           Register rn,
2003           WriteBack write_back,
2004           RegisterList registers) {
2005    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2006    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2007    VIXL_ASSERT(allow_macro_instructions_);
2008    VIXL_ASSERT(OutsideITBlock());
2009    MacroEmissionCheckScope guard(this);
2010    ITScope it_scope(this, &cond);
2011    ldm(cond, rn, write_back, registers);
2012  }
2013  void Ldm(Register rn, WriteBack write_back, RegisterList registers) {
2014    Ldm(al, rn, write_back, registers);
2015  }
2016
2017  void Ldmda(Condition cond,
2018             Register rn,
2019             WriteBack write_back,
2020             RegisterList registers) {
2021    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2022    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2023    VIXL_ASSERT(allow_macro_instructions_);
2024    VIXL_ASSERT(OutsideITBlock());
2025    MacroEmissionCheckScope guard(this);
2026    ITScope it_scope(this, &cond);
2027    ldmda(cond, rn, write_back, registers);
2028  }
2029  void Ldmda(Register rn, WriteBack write_back, RegisterList registers) {
2030    Ldmda(al, rn, write_back, registers);
2031  }
2032
2033  void Ldmdb(Condition cond,
2034             Register rn,
2035             WriteBack write_back,
2036             RegisterList registers) {
2037    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2038    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2039    VIXL_ASSERT(allow_macro_instructions_);
2040    VIXL_ASSERT(OutsideITBlock());
2041    MacroEmissionCheckScope guard(this);
2042    ITScope it_scope(this, &cond);
2043    ldmdb(cond, rn, write_back, registers);
2044  }
2045  void Ldmdb(Register rn, WriteBack write_back, RegisterList registers) {
2046    Ldmdb(al, rn, write_back, registers);
2047  }
2048
2049  void Ldmea(Condition cond,
2050             Register rn,
2051             WriteBack write_back,
2052             RegisterList registers) {
2053    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2054    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2055    VIXL_ASSERT(allow_macro_instructions_);
2056    VIXL_ASSERT(OutsideITBlock());
2057    MacroEmissionCheckScope guard(this);
2058    ITScope it_scope(this, &cond);
2059    ldmea(cond, rn, write_back, registers);
2060  }
2061  void Ldmea(Register rn, WriteBack write_back, RegisterList registers) {
2062    Ldmea(al, rn, write_back, registers);
2063  }
2064
2065  void Ldmed(Condition cond,
2066             Register rn,
2067             WriteBack write_back,
2068             RegisterList registers) {
2069    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2070    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2071    VIXL_ASSERT(allow_macro_instructions_);
2072    VIXL_ASSERT(OutsideITBlock());
2073    MacroEmissionCheckScope guard(this);
2074    ITScope it_scope(this, &cond);
2075    ldmed(cond, rn, write_back, registers);
2076  }
2077  void Ldmed(Register rn, WriteBack write_back, RegisterList registers) {
2078    Ldmed(al, rn, write_back, registers);
2079  }
2080
2081  void Ldmfa(Condition cond,
2082             Register rn,
2083             WriteBack write_back,
2084             RegisterList registers) {
2085    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2086    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2087    VIXL_ASSERT(allow_macro_instructions_);
2088    VIXL_ASSERT(OutsideITBlock());
2089    MacroEmissionCheckScope guard(this);
2090    ITScope it_scope(this, &cond);
2091    ldmfa(cond, rn, write_back, registers);
2092  }
2093  void Ldmfa(Register rn, WriteBack write_back, RegisterList registers) {
2094    Ldmfa(al, rn, write_back, registers);
2095  }
2096
2097  void Ldmfd(Condition cond,
2098             Register rn,
2099             WriteBack write_back,
2100             RegisterList registers) {
2101    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2102    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2103    VIXL_ASSERT(allow_macro_instructions_);
2104    VIXL_ASSERT(OutsideITBlock());
2105    MacroEmissionCheckScope guard(this);
2106    ITScope it_scope(this, &cond);
2107    ldmfd(cond, rn, write_back, registers);
2108  }
2109  void Ldmfd(Register rn, WriteBack write_back, RegisterList registers) {
2110    Ldmfd(al, rn, write_back, registers);
2111  }
2112
2113  void Ldmib(Condition cond,
2114             Register rn,
2115             WriteBack write_back,
2116             RegisterList registers) {
2117    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2118    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
2119    VIXL_ASSERT(allow_macro_instructions_);
2120    VIXL_ASSERT(OutsideITBlock());
2121    MacroEmissionCheckScope guard(this);
2122    ITScope it_scope(this, &cond);
2123    ldmib(cond, rn, write_back, registers);
2124  }
2125  void Ldmib(Register rn, WriteBack write_back, RegisterList registers) {
2126    Ldmib(al, rn, write_back, registers);
2127  }
2128
2129  void Ldr(Condition cond, Register rt, const MemOperand& operand) {
2130    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2131    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2132    VIXL_ASSERT(allow_macro_instructions_);
2133    VIXL_ASSERT(OutsideITBlock());
2134    MacroEmissionCheckScope guard(this);
2135    bool can_use_it =
2136        // LDR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2137        (operand.IsImmediate() && rt.IsLow() &&
2138         operand.GetBaseRegister().IsLow() &&
2139         operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
2140         (operand.GetAddrMode() == Offset)) ||
2141        // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
2142        (operand.IsImmediate() && rt.IsLow() &&
2143         operand.GetBaseRegister().IsSP() &&
2144         operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
2145         (operand.GetAddrMode() == Offset)) ||
2146        // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2147        (operand.IsPlainRegister() && rt.IsLow() &&
2148         operand.GetBaseRegister().IsLow() &&
2149         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2150         (operand.GetAddrMode() == Offset));
2151    ITScope it_scope(this, &cond, can_use_it);
2152    ldr(cond, rt, operand);
2153  }
2154  void Ldr(Register rt, const MemOperand& operand) { Ldr(al, rt, operand); }
2155
2156  void Ldr(Condition cond, Register rt, Label* label) {
2157    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2158    VIXL_ASSERT(allow_macro_instructions_);
2159    VIXL_ASSERT(OutsideITBlock());
2160    MacroEmissionCheckScope guard(this);
2161    ITScope it_scope(this, &cond);
2162    ldr(cond, rt, label);
2163  }
2164  void Ldr(Register rt, Label* label) { Ldr(al, rt, label); }
2165
2166  void Ldrb(Condition cond, Register rt, const MemOperand& operand) {
2167    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2168    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2169    VIXL_ASSERT(allow_macro_instructions_);
2170    VIXL_ASSERT(OutsideITBlock());
2171    MacroEmissionCheckScope guard(this);
2172    bool can_use_it =
2173        // LDRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2174        (operand.IsImmediate() && rt.IsLow() &&
2175         operand.GetBaseRegister().IsLow() &&
2176         operand.IsOffsetImmediateWithinRange(0, 31) &&
2177         (operand.GetAddrMode() == Offset)) ||
2178        // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2179        (operand.IsPlainRegister() && rt.IsLow() &&
2180         operand.GetBaseRegister().IsLow() &&
2181         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2182         (operand.GetAddrMode() == Offset));
2183    ITScope it_scope(this, &cond, can_use_it);
2184    ldrb(cond, rt, operand);
2185  }
2186  void Ldrb(Register rt, const MemOperand& operand) { Ldrb(al, rt, operand); }
2187
2188  void Ldrb(Condition cond, Register rt, Label* label) {
2189    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2190    VIXL_ASSERT(allow_macro_instructions_);
2191    VIXL_ASSERT(OutsideITBlock());
2192    MacroEmissionCheckScope guard(this);
2193    ITScope it_scope(this, &cond);
2194    ldrb(cond, rt, label);
2195  }
2196  void Ldrb(Register rt, Label* label) { Ldrb(al, rt, label); }
2197
2198  void Ldrd(Condition cond,
2199            Register rt,
2200            Register rt2,
2201            const MemOperand& operand) {
2202    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2203    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2204    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2205    VIXL_ASSERT(allow_macro_instructions_);
2206    VIXL_ASSERT(OutsideITBlock());
2207    MacroEmissionCheckScope guard(this);
2208    ITScope it_scope(this, &cond);
2209    ldrd(cond, rt, rt2, operand);
2210  }
2211  void Ldrd(Register rt, Register rt2, const MemOperand& operand) {
2212    Ldrd(al, rt, rt2, operand);
2213  }
2214
2215  void Ldrd(Condition cond, Register rt, Register rt2, Label* label) {
2216    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2217    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2218    VIXL_ASSERT(allow_macro_instructions_);
2219    VIXL_ASSERT(OutsideITBlock());
2220    MacroEmissionCheckScope guard(this);
2221    ITScope it_scope(this, &cond);
2222    ldrd(cond, rt, rt2, label);
2223  }
2224  void Ldrd(Register rt, Register rt2, Label* label) {
2225    Ldrd(al, rt, rt2, label);
2226  }
2227
2228  void Ldrex(Condition cond, Register rt, const MemOperand& operand) {
2229    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2230    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2231    VIXL_ASSERT(allow_macro_instructions_);
2232    VIXL_ASSERT(OutsideITBlock());
2233    MacroEmissionCheckScope guard(this);
2234    ITScope it_scope(this, &cond);
2235    ldrex(cond, rt, operand);
2236  }
2237  void Ldrex(Register rt, const MemOperand& operand) { Ldrex(al, rt, operand); }
2238
2239  void Ldrexb(Condition cond, Register rt, const MemOperand& operand) {
2240    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2241    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2242    VIXL_ASSERT(allow_macro_instructions_);
2243    VIXL_ASSERT(OutsideITBlock());
2244    MacroEmissionCheckScope guard(this);
2245    ITScope it_scope(this, &cond);
2246    ldrexb(cond, rt, operand);
2247  }
2248  void Ldrexb(Register rt, const MemOperand& operand) {
2249    Ldrexb(al, rt, operand);
2250  }
2251
2252  void Ldrexd(Condition cond,
2253              Register rt,
2254              Register rt2,
2255              const MemOperand& operand) {
2256    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2257    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
2258    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2259    VIXL_ASSERT(allow_macro_instructions_);
2260    VIXL_ASSERT(OutsideITBlock());
2261    MacroEmissionCheckScope guard(this);
2262    ITScope it_scope(this, &cond);
2263    ldrexd(cond, rt, rt2, operand);
2264  }
2265  void Ldrexd(Register rt, Register rt2, const MemOperand& operand) {
2266    Ldrexd(al, rt, rt2, operand);
2267  }
2268
2269  void Ldrexh(Condition cond, Register rt, const MemOperand& operand) {
2270    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2271    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2272    VIXL_ASSERT(allow_macro_instructions_);
2273    VIXL_ASSERT(OutsideITBlock());
2274    MacroEmissionCheckScope guard(this);
2275    ITScope it_scope(this, &cond);
2276    ldrexh(cond, rt, operand);
2277  }
2278  void Ldrexh(Register rt, const MemOperand& operand) {
2279    Ldrexh(al, rt, operand);
2280  }
2281
2282  void Ldrh(Condition cond, Register rt, const MemOperand& operand) {
2283    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2284    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2285    VIXL_ASSERT(allow_macro_instructions_);
2286    VIXL_ASSERT(OutsideITBlock());
2287    MacroEmissionCheckScope guard(this);
2288    bool can_use_it =
2289        // LDRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
2290        (operand.IsImmediate() && rt.IsLow() &&
2291         operand.GetBaseRegister().IsLow() &&
2292         operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
2293         (operand.GetAddrMode() == Offset)) ||
2294        // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2295        (operand.IsPlainRegister() && rt.IsLow() &&
2296         operand.GetBaseRegister().IsLow() &&
2297         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2298         (operand.GetAddrMode() == Offset));
2299    ITScope it_scope(this, &cond, can_use_it);
2300    ldrh(cond, rt, operand);
2301  }
2302  void Ldrh(Register rt, const MemOperand& operand) { Ldrh(al, rt, operand); }
2303
2304  void Ldrh(Condition cond, Register rt, Label* label) {
2305    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2306    VIXL_ASSERT(allow_macro_instructions_);
2307    VIXL_ASSERT(OutsideITBlock());
2308    MacroEmissionCheckScope guard(this);
2309    ITScope it_scope(this, &cond);
2310    ldrh(cond, rt, label);
2311  }
2312  void Ldrh(Register rt, Label* label) { Ldrh(al, rt, label); }
2313
2314  void Ldrsb(Condition cond, Register rt, const MemOperand& operand) {
2315    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2316    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2317    VIXL_ASSERT(allow_macro_instructions_);
2318    VIXL_ASSERT(OutsideITBlock());
2319    MacroEmissionCheckScope guard(this);
2320    bool can_use_it =
2321        // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2322        operand.IsPlainRegister() && rt.IsLow() &&
2323        operand.GetBaseRegister().IsLow() &&
2324        operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2325        (operand.GetAddrMode() == Offset);
2326    ITScope it_scope(this, &cond, can_use_it);
2327    ldrsb(cond, rt, operand);
2328  }
2329  void Ldrsb(Register rt, const MemOperand& operand) { Ldrsb(al, rt, operand); }
2330
2331  void Ldrsb(Condition cond, Register rt, Label* label) {
2332    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2333    VIXL_ASSERT(allow_macro_instructions_);
2334    VIXL_ASSERT(OutsideITBlock());
2335    MacroEmissionCheckScope guard(this);
2336    ITScope it_scope(this, &cond);
2337    ldrsb(cond, rt, label);
2338  }
2339  void Ldrsb(Register rt, Label* label) { Ldrsb(al, rt, label); }
2340
2341  void Ldrsh(Condition cond, Register rt, const MemOperand& operand) {
2342    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2343    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2344    VIXL_ASSERT(allow_macro_instructions_);
2345    VIXL_ASSERT(OutsideITBlock());
2346    MacroEmissionCheckScope guard(this);
2347    bool can_use_it =
2348        // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
2349        operand.IsPlainRegister() && rt.IsLow() &&
2350        operand.GetBaseRegister().IsLow() &&
2351        operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
2352        (operand.GetAddrMode() == Offset);
2353    ITScope it_scope(this, &cond, can_use_it);
2354    ldrsh(cond, rt, operand);
2355  }
2356  void Ldrsh(Register rt, const MemOperand& operand) { Ldrsh(al, rt, operand); }
2357
2358  void Ldrsh(Condition cond, Register rt, Label* label) {
2359    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
2360    VIXL_ASSERT(allow_macro_instructions_);
2361    VIXL_ASSERT(OutsideITBlock());
2362    MacroEmissionCheckScope guard(this);
2363    ITScope it_scope(this, &cond);
2364    ldrsh(cond, rt, label);
2365  }
2366  void Ldrsh(Register rt, Label* label) { Ldrsh(al, rt, label); }
2367
2368  void Lsl(Condition cond, Register rd, Register rm, const Operand& operand) {
2369    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2370    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2371    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2372    VIXL_ASSERT(allow_macro_instructions_);
2373    VIXL_ASSERT(OutsideITBlock());
2374    MacroEmissionCheckScope guard(this);
2375    bool can_use_it =
2376        // LSL<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
2377        (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2378         (operand.GetImmediate() <= 31) && rd.IsLow() && rm.IsLow()) ||
2379        // LSL<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
2380        (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
2381         operand.GetBaseRegister().IsLow());
2382    ITScope it_scope(this, &cond, can_use_it);
2383    lsl(cond, rd, rm, operand);
2384  }
2385  void Lsl(Register rd, Register rm, const Operand& operand) {
2386    Lsl(al, rd, rm, operand);
2387  }
2388  void Lsl(FlagsUpdate flags,
2389           Condition cond,
2390           Register rd,
2391           Register rm,
2392           const Operand& operand) {
2393    switch (flags) {
2394      case LeaveFlags:
2395        Lsl(cond, rd, rm, operand);
2396        break;
2397      case SetFlags:
2398        Lsls(cond, rd, rm, operand);
2399        break;
2400      case DontCare:
2401        bool setflags_is_smaller =
2402            IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
2403            ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2404              (operand.GetImmediate() < 32)) ||
2405             (operand.IsPlainRegister() && rd.Is(rm)));
2406        if (setflags_is_smaller) {
2407          Lsls(cond, rd, rm, operand);
2408        } else {
2409          Lsl(cond, rd, rm, operand);
2410        }
2411        break;
2412    }
2413  }
2414  void Lsl(FlagsUpdate flags,
2415           Register rd,
2416           Register rm,
2417           const Operand& operand) {
2418    Lsl(flags, al, rd, rm, operand);
2419  }
2420
2421  void Lsls(Condition cond, Register rd, Register rm, const Operand& operand) {
2422    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2423    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2424    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2425    VIXL_ASSERT(allow_macro_instructions_);
2426    VIXL_ASSERT(OutsideITBlock());
2427    MacroEmissionCheckScope guard(this);
2428    ITScope it_scope(this, &cond);
2429    lsls(cond, rd, rm, operand);
2430  }
2431  void Lsls(Register rd, Register rm, const Operand& operand) {
2432    Lsls(al, rd, rm, operand);
2433  }
2434
2435  void Lsr(Condition cond, Register rd, Register rm, const Operand& operand) {
2436    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2437    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2438    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2439    VIXL_ASSERT(allow_macro_instructions_);
2440    VIXL_ASSERT(OutsideITBlock());
2441    MacroEmissionCheckScope guard(this);
2442    bool can_use_it =
2443        // LSR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
2444        (operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2445         (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
2446        // LSR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
2447        (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
2448         operand.GetBaseRegister().IsLow());
2449    ITScope it_scope(this, &cond, can_use_it);
2450    lsr(cond, rd, rm, operand);
2451  }
2452  void Lsr(Register rd, Register rm, const Operand& operand) {
2453    Lsr(al, rd, rm, operand);
2454  }
2455  void Lsr(FlagsUpdate flags,
2456           Condition cond,
2457           Register rd,
2458           Register rm,
2459           const Operand& operand) {
2460    switch (flags) {
2461      case LeaveFlags:
2462        Lsr(cond, rd, rm, operand);
2463        break;
2464      case SetFlags:
2465        Lsrs(cond, rd, rm, operand);
2466        break;
2467      case DontCare:
2468        bool setflags_is_smaller =
2469            IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() &&
2470            ((operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
2471              (operand.GetImmediate() <= 32)) ||
2472             (operand.IsPlainRegister() && rd.Is(rm)));
2473        if (setflags_is_smaller) {
2474          Lsrs(cond, rd, rm, operand);
2475        } else {
2476          Lsr(cond, rd, rm, operand);
2477        }
2478        break;
2479    }
2480  }
2481  void Lsr(FlagsUpdate flags,
2482           Register rd,
2483           Register rm,
2484           const Operand& operand) {
2485    Lsr(flags, al, rd, rm, operand);
2486  }
2487
2488  void Lsrs(Condition cond, Register rd, Register rm, const Operand& operand) {
2489    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2490    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2491    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2492    VIXL_ASSERT(allow_macro_instructions_);
2493    VIXL_ASSERT(OutsideITBlock());
2494    MacroEmissionCheckScope guard(this);
2495    ITScope it_scope(this, &cond);
2496    lsrs(cond, rd, rm, operand);
2497  }
2498  void Lsrs(Register rd, Register rm, const Operand& operand) {
2499    Lsrs(al, rd, rm, operand);
2500  }
2501
2502  void Mla(Condition cond, Register rd, Register rn, Register rm, Register ra) {
2503    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2504    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2505    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2506    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2507    VIXL_ASSERT(allow_macro_instructions_);
2508    VIXL_ASSERT(OutsideITBlock());
2509    MacroEmissionCheckScope guard(this);
2510    ITScope it_scope(this, &cond);
2511    mla(cond, rd, rn, rm, ra);
2512  }
2513  void Mla(Register rd, Register rn, Register rm, Register ra) {
2514    Mla(al, rd, rn, rm, ra);
2515  }
2516  void Mla(FlagsUpdate flags,
2517           Condition cond,
2518           Register rd,
2519           Register rn,
2520           Register rm,
2521           Register ra) {
2522    switch (flags) {
2523      case LeaveFlags:
2524        Mla(cond, rd, rn, rm, ra);
2525        break;
2526      case SetFlags:
2527        Mlas(cond, rd, rn, rm, ra);
2528        break;
2529      case DontCare:
2530        Mla(cond, rd, rn, rm, ra);
2531        break;
2532    }
2533  }
2534  void Mla(
2535      FlagsUpdate flags, Register rd, Register rn, Register rm, Register ra) {
2536    Mla(flags, al, rd, rn, rm, ra);
2537  }
2538
2539  void Mlas(
2540      Condition cond, Register rd, Register rn, Register rm, Register ra) {
2541    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2542    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2543    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2544    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2545    VIXL_ASSERT(allow_macro_instructions_);
2546    VIXL_ASSERT(OutsideITBlock());
2547    MacroEmissionCheckScope guard(this);
2548    ITScope it_scope(this, &cond);
2549    mlas(cond, rd, rn, rm, ra);
2550  }
2551  void Mlas(Register rd, Register rn, Register rm, Register ra) {
2552    Mlas(al, rd, rn, rm, ra);
2553  }
2554
2555  void Mls(Condition cond, Register rd, Register rn, Register rm, Register ra) {
2556    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2557    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2558    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2559    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
2560    VIXL_ASSERT(allow_macro_instructions_);
2561    VIXL_ASSERT(OutsideITBlock());
2562    MacroEmissionCheckScope guard(this);
2563    ITScope it_scope(this, &cond);
2564    mls(cond, rd, rn, rm, ra);
2565  }
2566  void Mls(Register rd, Register rn, Register rm, Register ra) {
2567    Mls(al, rd, rn, rm, ra);
2568  }
2569
2570  void Mov(Condition cond, Register rd, const Operand& operand) {
2571    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2572    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2573    VIXL_ASSERT(allow_macro_instructions_);
2574    VIXL_ASSERT(OutsideITBlock());
2575    MacroEmissionCheckScope guard(this);
2576    if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) {
2577      return;
2578    }
2579    bool can_use_it =
2580        // MOV<c>{<q>} <Rd>, #<imm8> ; T1
2581        (operand.IsImmediate() && rd.IsLow() &&
2582         (operand.GetImmediate() <= 255)) ||
2583        // MOV{<c>}{<q>} <Rd>, <Rm> ; T1
2584        (operand.IsPlainRegister() && !rd.IsPC() &&
2585         !operand.GetBaseRegister().IsPC()) ||
2586        // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount>} ; T2
2587        (operand.IsImmediateShiftedRegister() && rd.IsLow() &&
2588         operand.GetBaseRegister().IsLow() &&
2589         (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
2590          operand.GetShift().Is(ASR))) ||
2591        // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
2592        // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
2593        // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
2594        // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
2595        (operand.IsRegisterShiftedRegister() &&
2596         rd.Is(operand.GetBaseRegister()) && rd.IsLow() &&
2597         (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
2598          operand.GetShift().Is(ASR) || operand.GetShift().Is(ROR)) &&
2599         operand.GetShiftRegister().IsLow());
2600    ITScope it_scope(this, &cond, can_use_it);
2601    mov(cond, rd, operand);
2602  }
2603  void Mov(Register rd, const Operand& operand) { Mov(al, rd, operand); }
2604  void Mov(FlagsUpdate flags,
2605           Condition cond,
2606           Register rd,
2607           const Operand& operand) {
2608    switch (flags) {
2609      case LeaveFlags:
2610        Mov(cond, rd, operand);
2611        break;
2612      case SetFlags:
2613        Movs(cond, rd, operand);
2614        break;
2615      case DontCare:
2616        if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) {
2617          return;
2618        }
2619        bool setflags_is_smaller =
2620            IsUsingT32() && cond.Is(al) &&
2621            ((operand.IsImmediateShiftedRegister() && rd.IsLow() &&
2622              operand.GetBaseRegister().IsLow() &&
2623              (operand.GetShiftAmount() >= 1) &&
2624              (((operand.GetShiftAmount() <= 32) &&
2625                ((operand.GetShift().IsLSR() || operand.GetShift().IsASR()))) ||
2626               ((operand.GetShiftAmount() < 32) &&
2627                operand.GetShift().IsLSL()))) ||
2628             (operand.IsRegisterShiftedRegister() && rd.IsLow() &&
2629              operand.GetBaseRegister().Is(rd) &&
2630              operand.GetShiftRegister().IsLow() &&
2631              (operand.GetShift().IsLSL() || operand.GetShift().IsLSR() ||
2632               operand.GetShift().IsASR() || operand.GetShift().IsROR())) ||
2633             (operand.IsImmediate() && rd.IsLow() &&
2634              (operand.GetImmediate() < 256)));
2635        if (setflags_is_smaller) {
2636          Movs(cond, rd, operand);
2637        } else {
2638          Mov(cond, rd, operand);
2639        }
2640        break;
2641    }
2642  }
2643  void Mov(FlagsUpdate flags, Register rd, const Operand& operand) {
2644    Mov(flags, al, rd, operand);
2645  }
2646
2647  void Movs(Condition cond, Register rd, const Operand& operand) {
2648    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2649    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2650    VIXL_ASSERT(allow_macro_instructions_);
2651    VIXL_ASSERT(OutsideITBlock());
2652    MacroEmissionCheckScope guard(this);
2653    ITScope it_scope(this, &cond);
2654    movs(cond, rd, operand);
2655  }
2656  void Movs(Register rd, const Operand& operand) { Movs(al, rd, operand); }
2657
2658  void Movt(Condition cond, Register rd, const Operand& operand) {
2659    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2660    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2661    VIXL_ASSERT(allow_macro_instructions_);
2662    VIXL_ASSERT(OutsideITBlock());
2663    MacroEmissionCheckScope guard(this);
2664    ITScope it_scope(this, &cond);
2665    movt(cond, rd, operand);
2666  }
2667  void Movt(Register rd, const Operand& operand) { Movt(al, rd, operand); }
2668
2669  void Mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
2670    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2671    VIXL_ASSERT(allow_macro_instructions_);
2672    VIXL_ASSERT(OutsideITBlock());
2673    MacroEmissionCheckScope guard(this);
2674    ITScope it_scope(this, &cond);
2675    mrs(cond, rd, spec_reg);
2676  }
2677  void Mrs(Register rd, SpecialRegister spec_reg) { Mrs(al, rd, spec_reg); }
2678
2679  void Msr(Condition cond,
2680           MaskedSpecialRegister spec_reg,
2681           const Operand& operand) {
2682    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2683    VIXL_ASSERT(allow_macro_instructions_);
2684    VIXL_ASSERT(OutsideITBlock());
2685    MacroEmissionCheckScope guard(this);
2686    ITScope it_scope(this, &cond);
2687    msr(cond, spec_reg, operand);
2688  }
2689  void Msr(MaskedSpecialRegister spec_reg, const Operand& operand) {
2690    Msr(al, spec_reg, operand);
2691  }
2692
2693  void Mul(Condition cond, Register rd, Register rn, Register rm) {
2694    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2695    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2696    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2697    VIXL_ASSERT(allow_macro_instructions_);
2698    VIXL_ASSERT(OutsideITBlock());
2699    MacroEmissionCheckScope guard(this);
2700    bool can_use_it =
2701        // MUL<c>{<q>} <Rdm>, <Rn>{, <Rdm>} ; T1
2702        rd.Is(rm) && rn.IsLow() && rm.IsLow();
2703    ITScope it_scope(this, &cond, can_use_it);
2704    mul(cond, rd, rn, rm);
2705  }
2706  void Mul(Register rd, Register rn, Register rm) { Mul(al, rd, rn, rm); }
2707  void Mul(FlagsUpdate flags,
2708           Condition cond,
2709           Register rd,
2710           Register rn,
2711           Register rm) {
2712    switch (flags) {
2713      case LeaveFlags:
2714        Mul(cond, rd, rn, rm);
2715        break;
2716      case SetFlags:
2717        Muls(cond, rd, rn, rm);
2718        break;
2719      case DontCare:
2720        bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2721                                   rn.IsLow() && rm.Is(rd);
2722        if (setflags_is_smaller) {
2723          Muls(cond, rd, rn, rm);
2724        } else {
2725          Mul(cond, rd, rn, rm);
2726        }
2727        break;
2728    }
2729  }
2730  void Mul(FlagsUpdate flags, Register rd, Register rn, Register rm) {
2731    Mul(flags, al, rd, rn, rm);
2732  }
2733
2734  void Muls(Condition cond, Register rd, Register rn, Register rm) {
2735    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2736    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2737    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
2738    VIXL_ASSERT(allow_macro_instructions_);
2739    VIXL_ASSERT(OutsideITBlock());
2740    MacroEmissionCheckScope guard(this);
2741    ITScope it_scope(this, &cond);
2742    muls(cond, rd, rn, rm);
2743  }
2744  void Muls(Register rd, Register rn, Register rm) { Muls(al, rd, rn, rm); }
2745
2746  void Mvn(Condition cond, Register rd, const Operand& operand) {
2747    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2748    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2749    VIXL_ASSERT(allow_macro_instructions_);
2750    VIXL_ASSERT(OutsideITBlock());
2751    MacroEmissionCheckScope guard(this);
2752    bool can_use_it =
2753        // MVN<c>{<q>} <Rd>, <Rm> ; T1
2754        operand.IsPlainRegister() && rd.IsLow() &&
2755        operand.GetBaseRegister().IsLow();
2756    ITScope it_scope(this, &cond, can_use_it);
2757    mvn(cond, rd, operand);
2758  }
2759  void Mvn(Register rd, const Operand& operand) { Mvn(al, rd, operand); }
2760  void Mvn(FlagsUpdate flags,
2761           Condition cond,
2762           Register rd,
2763           const Operand& operand) {
2764    switch (flags) {
2765      case LeaveFlags:
2766        Mvn(cond, rd, operand);
2767        break;
2768      case SetFlags:
2769        Mvns(cond, rd, operand);
2770        break;
2771      case DontCare:
2772        bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2773                                   operand.IsPlainRegister() &&
2774                                   operand.GetBaseRegister().IsLow();
2775        if (setflags_is_smaller) {
2776          Mvns(cond, rd, operand);
2777        } else {
2778          Mvn(cond, rd, operand);
2779        }
2780        break;
2781    }
2782  }
2783  void Mvn(FlagsUpdate flags, Register rd, const Operand& operand) {
2784    Mvn(flags, al, rd, operand);
2785  }
2786
2787  void Mvns(Condition cond, Register rd, const Operand& operand) {
2788    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2789    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2790    VIXL_ASSERT(allow_macro_instructions_);
2791    VIXL_ASSERT(OutsideITBlock());
2792    MacroEmissionCheckScope guard(this);
2793    ITScope it_scope(this, &cond);
2794    mvns(cond, rd, operand);
2795  }
2796  void Mvns(Register rd, const Operand& operand) { Mvns(al, rd, operand); }
2797
2798  void Nop(Condition cond) {
2799    VIXL_ASSERT(allow_macro_instructions_);
2800    VIXL_ASSERT(OutsideITBlock());
2801    MacroEmissionCheckScope guard(this);
2802    ITScope it_scope(this, &cond);
2803    nop(cond);
2804  }
2805  void Nop() { Nop(al); }
2806
2807  void Orn(Condition cond, Register rd, Register rn, const Operand& operand) {
2808    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2809    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2810    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2811    VIXL_ASSERT(allow_macro_instructions_);
2812    VIXL_ASSERT(OutsideITBlock());
2813    MacroEmissionCheckScope guard(this);
2814    if (cond.Is(al) && operand.IsImmediate()) {
2815      uint32_t immediate = operand.GetImmediate();
2816      if (immediate == 0) {
2817        mvn(rd, 0);
2818        return;
2819      }
2820      if ((immediate == 0xffffffff) && rd.Is(rn)) {
2821        return;
2822      }
2823    }
2824    ITScope it_scope(this, &cond);
2825    orn(cond, rd, rn, operand);
2826  }
2827  void Orn(Register rd, Register rn, const Operand& operand) {
2828    Orn(al, rd, rn, operand);
2829  }
2830  void Orn(FlagsUpdate flags,
2831           Condition cond,
2832           Register rd,
2833           Register rn,
2834           const Operand& operand) {
2835    switch (flags) {
2836      case LeaveFlags:
2837        Orn(cond, rd, rn, operand);
2838        break;
2839      case SetFlags:
2840        Orns(cond, rd, rn, operand);
2841        break;
2842      case DontCare:
2843        Orn(cond, rd, rn, operand);
2844        break;
2845    }
2846  }
2847  void Orn(FlagsUpdate flags,
2848           Register rd,
2849           Register rn,
2850           const Operand& operand) {
2851    Orn(flags, al, rd, rn, operand);
2852  }
2853
2854  void Orns(Condition cond, Register rd, Register rn, const Operand& operand) {
2855    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2856    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2857    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2858    VIXL_ASSERT(allow_macro_instructions_);
2859    VIXL_ASSERT(OutsideITBlock());
2860    MacroEmissionCheckScope guard(this);
2861    ITScope it_scope(this, &cond);
2862    orns(cond, rd, rn, operand);
2863  }
2864  void Orns(Register rd, Register rn, const Operand& operand) {
2865    Orns(al, rd, rn, operand);
2866  }
2867
2868  void Orr(Condition cond, Register rd, Register rn, const Operand& operand) {
2869    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2870    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2871    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2872    VIXL_ASSERT(allow_macro_instructions_);
2873    VIXL_ASSERT(OutsideITBlock());
2874    MacroEmissionCheckScope guard(this);
2875    if (rd.Is(rn) && operand.IsPlainRegister() &&
2876        rd.Is(operand.GetBaseRegister())) {
2877      return;
2878    }
2879    if (cond.Is(al) && operand.IsImmediate()) {
2880      uint32_t immediate = operand.GetImmediate();
2881      if ((immediate == 0) && rd.Is(rn)) {
2882        return;
2883      }
2884      if (immediate == 0xffffffff) {
2885        mvn(rd, 0);
2886        return;
2887      }
2888    }
2889    bool can_use_it =
2890        // ORR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
2891        operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
2892        operand.GetBaseRegister().IsLow();
2893    ITScope it_scope(this, &cond, can_use_it);
2894    orr(cond, rd, rn, operand);
2895  }
2896  void Orr(Register rd, Register rn, const Operand& operand) {
2897    Orr(al, rd, rn, operand);
2898  }
2899  void Orr(FlagsUpdate flags,
2900           Condition cond,
2901           Register rd,
2902           Register rn,
2903           const Operand& operand) {
2904    switch (flags) {
2905      case LeaveFlags:
2906        Orr(cond, rd, rn, operand);
2907        break;
2908      case SetFlags:
2909        Orrs(cond, rd, rn, operand);
2910        break;
2911      case DontCare:
2912        if (operand.IsPlainRegister() && rd.Is(rn) &&
2913            rd.Is(operand.GetBaseRegister())) {
2914          return;
2915        }
2916        bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
2917                                   rn.Is(rd) && operand.IsPlainRegister() &&
2918                                   operand.GetBaseRegister().IsLow();
2919        if (setflags_is_smaller) {
2920          Orrs(cond, rd, rn, operand);
2921        } else {
2922          Orr(cond, rd, rn, operand);
2923        }
2924        break;
2925    }
2926  }
2927  void Orr(FlagsUpdate flags,
2928           Register rd,
2929           Register rn,
2930           const Operand& operand) {
2931    Orr(flags, al, rd, rn, operand);
2932  }
2933
2934  void Orrs(Condition cond, Register rd, Register rn, const Operand& operand) {
2935    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2936    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2937    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2938    VIXL_ASSERT(allow_macro_instructions_);
2939    VIXL_ASSERT(OutsideITBlock());
2940    MacroEmissionCheckScope guard(this);
2941    ITScope it_scope(this, &cond);
2942    orrs(cond, rd, rn, operand);
2943  }
2944  void Orrs(Register rd, Register rn, const Operand& operand) {
2945    Orrs(al, rd, rn, operand);
2946  }
2947
2948  void Pkhbt(Condition cond, Register rd, Register rn, const Operand& operand) {
2949    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2950    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2951    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2952    VIXL_ASSERT(allow_macro_instructions_);
2953    VIXL_ASSERT(OutsideITBlock());
2954    MacroEmissionCheckScope guard(this);
2955    ITScope it_scope(this, &cond);
2956    pkhbt(cond, rd, rn, operand);
2957  }
2958  void Pkhbt(Register rd, Register rn, const Operand& operand) {
2959    Pkhbt(al, rd, rn, operand);
2960  }
2961
2962  void Pkhtb(Condition cond, Register rd, Register rn, const Operand& operand) {
2963    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
2964    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
2965    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2966    VIXL_ASSERT(allow_macro_instructions_);
2967    VIXL_ASSERT(OutsideITBlock());
2968    MacroEmissionCheckScope guard(this);
2969    ITScope it_scope(this, &cond);
2970    pkhtb(cond, rd, rn, operand);
2971  }
2972  void Pkhtb(Register rd, Register rn, const Operand& operand) {
2973    Pkhtb(al, rd, rn, operand);
2974  }
2975
2976  void Pld(Condition cond, Label* label) {
2977    VIXL_ASSERT(allow_macro_instructions_);
2978    VIXL_ASSERT(OutsideITBlock());
2979    MacroEmissionCheckScope guard(this);
2980    ITScope it_scope(this, &cond);
2981    pld(cond, label);
2982  }
2983  void Pld(Label* label) { Pld(al, label); }
2984
2985  void Pld(Condition cond, const MemOperand& operand) {
2986    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2987    VIXL_ASSERT(allow_macro_instructions_);
2988    VIXL_ASSERT(OutsideITBlock());
2989    MacroEmissionCheckScope guard(this);
2990    ITScope it_scope(this, &cond);
2991    pld(cond, operand);
2992  }
2993  void Pld(const MemOperand& operand) { Pld(al, operand); }
2994
2995  void Pldw(Condition cond, const MemOperand& operand) {
2996    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
2997    VIXL_ASSERT(allow_macro_instructions_);
2998    VIXL_ASSERT(OutsideITBlock());
2999    MacroEmissionCheckScope guard(this);
3000    ITScope it_scope(this, &cond);
3001    pldw(cond, operand);
3002  }
3003  void Pldw(const MemOperand& operand) { Pldw(al, operand); }
3004
3005  void Pli(Condition cond, const MemOperand& operand) {
3006    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3007    VIXL_ASSERT(allow_macro_instructions_);
3008    VIXL_ASSERT(OutsideITBlock());
3009    MacroEmissionCheckScope guard(this);
3010    ITScope it_scope(this, &cond);
3011    pli(cond, operand);
3012  }
3013  void Pli(const MemOperand& operand) { Pli(al, operand); }
3014
3015  void Pli(Condition cond, Label* label) {
3016    VIXL_ASSERT(allow_macro_instructions_);
3017    VIXL_ASSERT(OutsideITBlock());
3018    MacroEmissionCheckScope guard(this);
3019    ITScope it_scope(this, &cond);
3020    pli(cond, label);
3021  }
3022  void Pli(Label* label) { Pli(al, label); }
3023
3024  void Pop(Condition cond, RegisterList registers) {
3025    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
3026    VIXL_ASSERT(allow_macro_instructions_);
3027    VIXL_ASSERT(OutsideITBlock());
3028    MacroEmissionCheckScope guard(this);
3029    ITScope it_scope(this, &cond);
3030    pop(cond, registers);
3031  }
3032  void Pop(RegisterList registers) { Pop(al, registers); }
3033
3034  void Pop(Condition cond, Register rt) {
3035    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
3036    VIXL_ASSERT(allow_macro_instructions_);
3037    VIXL_ASSERT(OutsideITBlock());
3038    MacroEmissionCheckScope guard(this);
3039    ITScope it_scope(this, &cond);
3040    pop(cond, rt);
3041  }
3042  void Pop(Register rt) { Pop(al, rt); }
3043
3044  void Push(Condition cond, RegisterList registers) {
3045    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
3046    VIXL_ASSERT(allow_macro_instructions_);
3047    VIXL_ASSERT(OutsideITBlock());
3048    MacroEmissionCheckScope guard(this);
3049    ITScope it_scope(this, &cond);
3050    push(cond, registers);
3051  }
3052  void Push(RegisterList registers) { Push(al, registers); }
3053
3054  void Push(Condition cond, Register rt) {
3055    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
3056    VIXL_ASSERT(allow_macro_instructions_);
3057    VIXL_ASSERT(OutsideITBlock());
3058    MacroEmissionCheckScope guard(this);
3059    ITScope it_scope(this, &cond);
3060    push(cond, rt);
3061  }
3062  void Push(Register rt) { Push(al, rt); }
3063
3064  void Qadd(Condition cond, Register rd, Register rm, Register rn) {
3065    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3066    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3067    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3068    VIXL_ASSERT(allow_macro_instructions_);
3069    VIXL_ASSERT(OutsideITBlock());
3070    MacroEmissionCheckScope guard(this);
3071    ITScope it_scope(this, &cond);
3072    qadd(cond, rd, rm, rn);
3073  }
3074  void Qadd(Register rd, Register rm, Register rn) { Qadd(al, rd, rm, rn); }
3075
3076  void Qadd16(Condition cond, Register rd, Register rn, Register rm) {
3077    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3078    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3079    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3080    VIXL_ASSERT(allow_macro_instructions_);
3081    VIXL_ASSERT(OutsideITBlock());
3082    MacroEmissionCheckScope guard(this);
3083    ITScope it_scope(this, &cond);
3084    qadd16(cond, rd, rn, rm);
3085  }
3086  void Qadd16(Register rd, Register rn, Register rm) { Qadd16(al, rd, rn, rm); }
3087
3088  void Qadd8(Condition cond, Register rd, Register rn, Register rm) {
3089    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3090    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3091    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3092    VIXL_ASSERT(allow_macro_instructions_);
3093    VIXL_ASSERT(OutsideITBlock());
3094    MacroEmissionCheckScope guard(this);
3095    ITScope it_scope(this, &cond);
3096    qadd8(cond, rd, rn, rm);
3097  }
3098  void Qadd8(Register rd, Register rn, Register rm) { Qadd8(al, rd, rn, rm); }
3099
3100  void Qasx(Condition cond, Register rd, Register rn, Register rm) {
3101    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3102    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3103    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3104    VIXL_ASSERT(allow_macro_instructions_);
3105    VIXL_ASSERT(OutsideITBlock());
3106    MacroEmissionCheckScope guard(this);
3107    ITScope it_scope(this, &cond);
3108    qasx(cond, rd, rn, rm);
3109  }
3110  void Qasx(Register rd, Register rn, Register rm) { Qasx(al, rd, rn, rm); }
3111
3112  void Qdadd(Condition cond, Register rd, Register rm, Register rn) {
3113    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3114    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3115    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3116    VIXL_ASSERT(allow_macro_instructions_);
3117    VIXL_ASSERT(OutsideITBlock());
3118    MacroEmissionCheckScope guard(this);
3119    ITScope it_scope(this, &cond);
3120    qdadd(cond, rd, rm, rn);
3121  }
3122  void Qdadd(Register rd, Register rm, Register rn) { Qdadd(al, rd, rm, rn); }
3123
3124  void Qdsub(Condition cond, Register rd, Register rm, Register rn) {
3125    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3126    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3127    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3128    VIXL_ASSERT(allow_macro_instructions_);
3129    VIXL_ASSERT(OutsideITBlock());
3130    MacroEmissionCheckScope guard(this);
3131    ITScope it_scope(this, &cond);
3132    qdsub(cond, rd, rm, rn);
3133  }
3134  void Qdsub(Register rd, Register rm, Register rn) { Qdsub(al, rd, rm, rn); }
3135
3136  void Qsax(Condition cond, Register rd, Register rn, Register rm) {
3137    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3138    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3139    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3140    VIXL_ASSERT(allow_macro_instructions_);
3141    VIXL_ASSERT(OutsideITBlock());
3142    MacroEmissionCheckScope guard(this);
3143    ITScope it_scope(this, &cond);
3144    qsax(cond, rd, rn, rm);
3145  }
3146  void Qsax(Register rd, Register rn, Register rm) { Qsax(al, rd, rn, rm); }
3147
3148  void Qsub(Condition cond, Register rd, Register rm, Register rn) {
3149    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3150    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3151    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3152    VIXL_ASSERT(allow_macro_instructions_);
3153    VIXL_ASSERT(OutsideITBlock());
3154    MacroEmissionCheckScope guard(this);
3155    ITScope it_scope(this, &cond);
3156    qsub(cond, rd, rm, rn);
3157  }
3158  void Qsub(Register rd, Register rm, Register rn) { Qsub(al, rd, rm, rn); }
3159
3160  void Qsub16(Condition cond, Register rd, Register rn, Register rm) {
3161    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3162    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3163    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3164    VIXL_ASSERT(allow_macro_instructions_);
3165    VIXL_ASSERT(OutsideITBlock());
3166    MacroEmissionCheckScope guard(this);
3167    ITScope it_scope(this, &cond);
3168    qsub16(cond, rd, rn, rm);
3169  }
3170  void Qsub16(Register rd, Register rn, Register rm) { Qsub16(al, rd, rn, rm); }
3171
3172  void Qsub8(Condition cond, Register rd, Register rn, Register rm) {
3173    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3174    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3175    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3176    VIXL_ASSERT(allow_macro_instructions_);
3177    VIXL_ASSERT(OutsideITBlock());
3178    MacroEmissionCheckScope guard(this);
3179    ITScope it_scope(this, &cond);
3180    qsub8(cond, rd, rn, rm);
3181  }
3182  void Qsub8(Register rd, Register rn, Register rm) { Qsub8(al, rd, rn, rm); }
3183
3184  void Rbit(Condition cond, Register rd, Register rm) {
3185    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3186    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3187    VIXL_ASSERT(allow_macro_instructions_);
3188    VIXL_ASSERT(OutsideITBlock());
3189    MacroEmissionCheckScope guard(this);
3190    ITScope it_scope(this, &cond);
3191    rbit(cond, rd, rm);
3192  }
3193  void Rbit(Register rd, Register rm) { Rbit(al, rd, rm); }
3194
3195  void Rev(Condition cond, Register rd, Register rm) {
3196    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3197    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3198    VIXL_ASSERT(allow_macro_instructions_);
3199    VIXL_ASSERT(OutsideITBlock());
3200    MacroEmissionCheckScope guard(this);
3201    ITScope it_scope(this, &cond);
3202    rev(cond, rd, rm);
3203  }
3204  void Rev(Register rd, Register rm) { Rev(al, rd, rm); }
3205
3206  void Rev16(Condition cond, Register rd, Register rm) {
3207    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3208    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3209    VIXL_ASSERT(allow_macro_instructions_);
3210    VIXL_ASSERT(OutsideITBlock());
3211    MacroEmissionCheckScope guard(this);
3212    ITScope it_scope(this, &cond);
3213    rev16(cond, rd, rm);
3214  }
3215  void Rev16(Register rd, Register rm) { Rev16(al, rd, rm); }
3216
3217  void Revsh(Condition cond, Register rd, Register rm) {
3218    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3219    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3220    VIXL_ASSERT(allow_macro_instructions_);
3221    VIXL_ASSERT(OutsideITBlock());
3222    MacroEmissionCheckScope guard(this);
3223    ITScope it_scope(this, &cond);
3224    revsh(cond, rd, rm);
3225  }
3226  void Revsh(Register rd, Register rm) { Revsh(al, rd, rm); }
3227
3228  void Ror(Condition cond, Register rd, Register rm, const Operand& operand) {
3229    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3230    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3231    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3232    VIXL_ASSERT(allow_macro_instructions_);
3233    VIXL_ASSERT(OutsideITBlock());
3234    MacroEmissionCheckScope guard(this);
3235    bool can_use_it =
3236        // ROR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
3237        operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
3238        operand.GetBaseRegister().IsLow();
3239    ITScope it_scope(this, &cond, can_use_it);
3240    ror(cond, rd, rm, operand);
3241  }
3242  void Ror(Register rd, Register rm, const Operand& operand) {
3243    Ror(al, rd, rm, operand);
3244  }
3245  void Ror(FlagsUpdate flags,
3246           Condition cond,
3247           Register rd,
3248           Register rm,
3249           const Operand& operand) {
3250    switch (flags) {
3251      case LeaveFlags:
3252        Ror(cond, rd, rm, operand);
3253        break;
3254      case SetFlags:
3255        Rors(cond, rd, rm, operand);
3256        break;
3257      case DontCare:
3258        bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3259                                   rm.IsLow() && operand.IsPlainRegister() &&
3260                                   rd.Is(rm);
3261        if (setflags_is_smaller) {
3262          Rors(cond, rd, rm, operand);
3263        } else {
3264          Ror(cond, rd, rm, operand);
3265        }
3266        break;
3267    }
3268  }
3269  void Ror(FlagsUpdate flags,
3270           Register rd,
3271           Register rm,
3272           const Operand& operand) {
3273    Ror(flags, al, rd, rm, operand);
3274  }
3275
3276  void Rors(Condition cond, Register rd, Register rm, const Operand& operand) {
3277    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3278    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3279    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3280    VIXL_ASSERT(allow_macro_instructions_);
3281    VIXL_ASSERT(OutsideITBlock());
3282    MacroEmissionCheckScope guard(this);
3283    ITScope it_scope(this, &cond);
3284    rors(cond, rd, rm, operand);
3285  }
3286  void Rors(Register rd, Register rm, const Operand& operand) {
3287    Rors(al, rd, rm, operand);
3288  }
3289
3290  void Rrx(Condition cond, Register rd, Register rm) {
3291    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3292    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3293    VIXL_ASSERT(allow_macro_instructions_);
3294    VIXL_ASSERT(OutsideITBlock());
3295    MacroEmissionCheckScope guard(this);
3296    ITScope it_scope(this, &cond);
3297    rrx(cond, rd, rm);
3298  }
3299  void Rrx(Register rd, Register rm) { Rrx(al, rd, rm); }
3300  void Rrx(FlagsUpdate flags, Condition cond, Register rd, Register rm) {
3301    switch (flags) {
3302      case LeaveFlags:
3303        Rrx(cond, rd, rm);
3304        break;
3305      case SetFlags:
3306        Rrxs(cond, rd, rm);
3307        break;
3308      case DontCare:
3309        Rrx(cond, rd, rm);
3310        break;
3311    }
3312  }
3313  void Rrx(FlagsUpdate flags, Register rd, Register rm) {
3314    Rrx(flags, al, rd, rm);
3315  }
3316
3317  void Rrxs(Condition cond, Register rd, Register rm) {
3318    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3319    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3320    VIXL_ASSERT(allow_macro_instructions_);
3321    VIXL_ASSERT(OutsideITBlock());
3322    MacroEmissionCheckScope guard(this);
3323    ITScope it_scope(this, &cond);
3324    rrxs(cond, rd, rm);
3325  }
3326  void Rrxs(Register rd, Register rm) { Rrxs(al, rd, rm); }
3327
3328  void Rsb(Condition cond, Register rd, Register rn, const Operand& operand) {
3329    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3330    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3331    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3332    VIXL_ASSERT(allow_macro_instructions_);
3333    VIXL_ASSERT(OutsideITBlock());
3334    MacroEmissionCheckScope guard(this);
3335    bool can_use_it =
3336        // RSB<c>{<q>} {<Rd>, }<Rn>, #0 ; T1
3337        operand.IsImmediate() && rd.IsLow() && rn.IsLow() &&
3338        (operand.GetImmediate() == 0);
3339    ITScope it_scope(this, &cond, can_use_it);
3340    rsb(cond, rd, rn, operand);
3341  }
3342  void Rsb(Register rd, Register rn, const Operand& operand) {
3343    Rsb(al, rd, rn, operand);
3344  }
3345  void Rsb(FlagsUpdate flags,
3346           Condition cond,
3347           Register rd,
3348           Register rn,
3349           const Operand& operand) {
3350    switch (flags) {
3351      case LeaveFlags:
3352        Rsb(cond, rd, rn, operand);
3353        break;
3354      case SetFlags:
3355        Rsbs(cond, rd, rn, operand);
3356        break;
3357      case DontCare:
3358        bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3359                                   rn.IsLow() && operand.IsImmediate() &&
3360                                   (operand.GetImmediate() == 0);
3361        if (setflags_is_smaller) {
3362          Rsbs(cond, rd, rn, operand);
3363        } else {
3364          Rsb(cond, rd, rn, operand);
3365        }
3366        break;
3367    }
3368  }
3369  void Rsb(FlagsUpdate flags,
3370           Register rd,
3371           Register rn,
3372           const Operand& operand) {
3373    Rsb(flags, al, rd, rn, operand);
3374  }
3375
3376  void Rsbs(Condition cond, Register rd, Register rn, const Operand& operand) {
3377    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3378    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3379    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3380    VIXL_ASSERT(allow_macro_instructions_);
3381    VIXL_ASSERT(OutsideITBlock());
3382    MacroEmissionCheckScope guard(this);
3383    ITScope it_scope(this, &cond);
3384    rsbs(cond, rd, rn, operand);
3385  }
3386  void Rsbs(Register rd, Register rn, const Operand& operand) {
3387    Rsbs(al, rd, rn, operand);
3388  }
3389
3390  void Rsc(Condition cond, Register rd, Register rn, const Operand& operand) {
3391    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3392    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3393    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3394    VIXL_ASSERT(allow_macro_instructions_);
3395    VIXL_ASSERT(OutsideITBlock());
3396    MacroEmissionCheckScope guard(this);
3397    ITScope it_scope(this, &cond);
3398    rsc(cond, rd, rn, operand);
3399  }
3400  void Rsc(Register rd, Register rn, const Operand& operand) {
3401    Rsc(al, rd, rn, operand);
3402  }
3403  void Rsc(FlagsUpdate flags,
3404           Condition cond,
3405           Register rd,
3406           Register rn,
3407           const Operand& operand) {
3408    switch (flags) {
3409      case LeaveFlags:
3410        Rsc(cond, rd, rn, operand);
3411        break;
3412      case SetFlags:
3413        Rscs(cond, rd, rn, operand);
3414        break;
3415      case DontCare:
3416        Rsc(cond, rd, rn, operand);
3417        break;
3418    }
3419  }
3420  void Rsc(FlagsUpdate flags,
3421           Register rd,
3422           Register rn,
3423           const Operand& operand) {
3424    Rsc(flags, al, rd, rn, operand);
3425  }
3426
3427  void Rscs(Condition cond, Register rd, Register rn, const Operand& operand) {
3428    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3429    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3430    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3431    VIXL_ASSERT(allow_macro_instructions_);
3432    VIXL_ASSERT(OutsideITBlock());
3433    MacroEmissionCheckScope guard(this);
3434    ITScope it_scope(this, &cond);
3435    rscs(cond, rd, rn, operand);
3436  }
3437  void Rscs(Register rd, Register rn, const Operand& operand) {
3438    Rscs(al, rd, rn, operand);
3439  }
3440
3441  void Sadd16(Condition cond, Register rd, Register rn, Register rm) {
3442    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3443    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3444    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3445    VIXL_ASSERT(allow_macro_instructions_);
3446    VIXL_ASSERT(OutsideITBlock());
3447    MacroEmissionCheckScope guard(this);
3448    ITScope it_scope(this, &cond);
3449    sadd16(cond, rd, rn, rm);
3450  }
3451  void Sadd16(Register rd, Register rn, Register rm) { Sadd16(al, rd, rn, rm); }
3452
3453  void Sadd8(Condition cond, Register rd, Register rn, Register rm) {
3454    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3455    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3456    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3457    VIXL_ASSERT(allow_macro_instructions_);
3458    VIXL_ASSERT(OutsideITBlock());
3459    MacroEmissionCheckScope guard(this);
3460    ITScope it_scope(this, &cond);
3461    sadd8(cond, rd, rn, rm);
3462  }
3463  void Sadd8(Register rd, Register rn, Register rm) { Sadd8(al, rd, rn, rm); }
3464
3465  void Sasx(Condition cond, Register rd, Register rn, Register rm) {
3466    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3467    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3468    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3469    VIXL_ASSERT(allow_macro_instructions_);
3470    VIXL_ASSERT(OutsideITBlock());
3471    MacroEmissionCheckScope guard(this);
3472    ITScope it_scope(this, &cond);
3473    sasx(cond, rd, rn, rm);
3474  }
3475  void Sasx(Register rd, Register rn, Register rm) { Sasx(al, rd, rn, rm); }
3476
3477  void Sbc(Condition cond, Register rd, Register rn, const Operand& operand) {
3478    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3479    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3480    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3481    VIXL_ASSERT(allow_macro_instructions_);
3482    VIXL_ASSERT(OutsideITBlock());
3483    MacroEmissionCheckScope guard(this);
3484    bool can_use_it =
3485        // SBC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
3486        operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
3487        operand.GetBaseRegister().IsLow();
3488    ITScope it_scope(this, &cond, can_use_it);
3489    sbc(cond, rd, rn, operand);
3490  }
3491  void Sbc(Register rd, Register rn, const Operand& operand) {
3492    Sbc(al, rd, rn, operand);
3493  }
3494  void Sbc(FlagsUpdate flags,
3495           Condition cond,
3496           Register rd,
3497           Register rn,
3498           const Operand& operand) {
3499    switch (flags) {
3500      case LeaveFlags:
3501        Sbc(cond, rd, rn, operand);
3502        break;
3503      case SetFlags:
3504        Sbcs(cond, rd, rn, operand);
3505        break;
3506      case DontCare:
3507        bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() &&
3508                                   rn.Is(rd) && operand.IsPlainRegister() &&
3509                                   operand.GetBaseRegister().IsLow();
3510        if (setflags_is_smaller) {
3511          Sbcs(cond, rd, rn, operand);
3512        } else {
3513          Sbc(cond, rd, rn, operand);
3514        }
3515        break;
3516    }
3517  }
3518  void Sbc(FlagsUpdate flags,
3519           Register rd,
3520           Register rn,
3521           const Operand& operand) {
3522    Sbc(flags, al, rd, rn, operand);
3523  }
3524
3525  void Sbcs(Condition cond, Register rd, Register rn, const Operand& operand) {
3526    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3527    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3528    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3529    VIXL_ASSERT(allow_macro_instructions_);
3530    VIXL_ASSERT(OutsideITBlock());
3531    MacroEmissionCheckScope guard(this);
3532    ITScope it_scope(this, &cond);
3533    sbcs(cond, rd, rn, operand);
3534  }
3535  void Sbcs(Register rd, Register rn, const Operand& operand) {
3536    Sbcs(al, rd, rn, operand);
3537  }
3538
3539  void Sbfx(Condition cond,
3540            Register rd,
3541            Register rn,
3542            uint32_t lsb,
3543            const Operand& operand) {
3544    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3545    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3546    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
3547    VIXL_ASSERT(allow_macro_instructions_);
3548    VIXL_ASSERT(OutsideITBlock());
3549    MacroEmissionCheckScope guard(this);
3550    ITScope it_scope(this, &cond);
3551    sbfx(cond, rd, rn, lsb, operand);
3552  }
3553  void Sbfx(Register rd, Register rn, uint32_t lsb, const Operand& operand) {
3554    Sbfx(al, rd, rn, lsb, operand);
3555  }
3556
3557  void Sdiv(Condition cond, Register rd, Register rn, Register rm) {
3558    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3559    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3560    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3561    VIXL_ASSERT(allow_macro_instructions_);
3562    VIXL_ASSERT(OutsideITBlock());
3563    MacroEmissionCheckScope guard(this);
3564    ITScope it_scope(this, &cond);
3565    sdiv(cond, rd, rn, rm);
3566  }
3567  void Sdiv(Register rd, Register rn, Register rm) { Sdiv(al, rd, rn, rm); }
3568
3569  void Sel(Condition cond, Register rd, Register rn, Register rm) {
3570    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3571    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3572    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3573    VIXL_ASSERT(allow_macro_instructions_);
3574    VIXL_ASSERT(OutsideITBlock());
3575    MacroEmissionCheckScope guard(this);
3576    ITScope it_scope(this, &cond);
3577    sel(cond, rd, rn, rm);
3578  }
3579  void Sel(Register rd, Register rn, Register rm) { Sel(al, rd, rn, rm); }
3580
3581  void Shadd16(Condition cond, Register rd, Register rn, Register rm) {
3582    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3583    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3584    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3585    VIXL_ASSERT(allow_macro_instructions_);
3586    VIXL_ASSERT(OutsideITBlock());
3587    MacroEmissionCheckScope guard(this);
3588    ITScope it_scope(this, &cond);
3589    shadd16(cond, rd, rn, rm);
3590  }
3591  void Shadd16(Register rd, Register rn, Register rm) {
3592    Shadd16(al, rd, rn, rm);
3593  }
3594
3595  void Shadd8(Condition cond, Register rd, Register rn, Register rm) {
3596    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3597    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3598    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3599    VIXL_ASSERT(allow_macro_instructions_);
3600    VIXL_ASSERT(OutsideITBlock());
3601    MacroEmissionCheckScope guard(this);
3602    ITScope it_scope(this, &cond);
3603    shadd8(cond, rd, rn, rm);
3604  }
3605  void Shadd8(Register rd, Register rn, Register rm) { Shadd8(al, rd, rn, rm); }
3606
3607  void Shasx(Condition cond, Register rd, Register rn, Register rm) {
3608    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3609    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3610    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3611    VIXL_ASSERT(allow_macro_instructions_);
3612    VIXL_ASSERT(OutsideITBlock());
3613    MacroEmissionCheckScope guard(this);
3614    ITScope it_scope(this, &cond);
3615    shasx(cond, rd, rn, rm);
3616  }
3617  void Shasx(Register rd, Register rn, Register rm) { Shasx(al, rd, rn, rm); }
3618
3619  void Shsax(Condition cond, Register rd, Register rn, Register rm) {
3620    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3621    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3622    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3623    VIXL_ASSERT(allow_macro_instructions_);
3624    VIXL_ASSERT(OutsideITBlock());
3625    MacroEmissionCheckScope guard(this);
3626    ITScope it_scope(this, &cond);
3627    shsax(cond, rd, rn, rm);
3628  }
3629  void Shsax(Register rd, Register rn, Register rm) { Shsax(al, rd, rn, rm); }
3630
3631  void Shsub16(Condition cond, Register rd, Register rn, Register rm) {
3632    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3633    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3634    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3635    VIXL_ASSERT(allow_macro_instructions_);
3636    VIXL_ASSERT(OutsideITBlock());
3637    MacroEmissionCheckScope guard(this);
3638    ITScope it_scope(this, &cond);
3639    shsub16(cond, rd, rn, rm);
3640  }
3641  void Shsub16(Register rd, Register rn, Register rm) {
3642    Shsub16(al, rd, rn, rm);
3643  }
3644
3645  void Shsub8(Condition cond, Register rd, Register rn, Register rm) {
3646    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3647    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3648    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3649    VIXL_ASSERT(allow_macro_instructions_);
3650    VIXL_ASSERT(OutsideITBlock());
3651    MacroEmissionCheckScope guard(this);
3652    ITScope it_scope(this, &cond);
3653    shsub8(cond, rd, rn, rm);
3654  }
3655  void Shsub8(Register rd, Register rn, Register rm) { Shsub8(al, rd, rn, rm); }
3656
3657  void Smlabb(
3658      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3659    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3660    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3661    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3662    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3663    VIXL_ASSERT(allow_macro_instructions_);
3664    VIXL_ASSERT(OutsideITBlock());
3665    MacroEmissionCheckScope guard(this);
3666    ITScope it_scope(this, &cond);
3667    smlabb(cond, rd, rn, rm, ra);
3668  }
3669  void Smlabb(Register rd, Register rn, Register rm, Register ra) {
3670    Smlabb(al, rd, rn, rm, ra);
3671  }
3672
3673  void Smlabt(
3674      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3675    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3676    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3677    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3678    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3679    VIXL_ASSERT(allow_macro_instructions_);
3680    VIXL_ASSERT(OutsideITBlock());
3681    MacroEmissionCheckScope guard(this);
3682    ITScope it_scope(this, &cond);
3683    smlabt(cond, rd, rn, rm, ra);
3684  }
3685  void Smlabt(Register rd, Register rn, Register rm, Register ra) {
3686    Smlabt(al, rd, rn, rm, ra);
3687  }
3688
3689  void Smlad(
3690      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3691    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3692    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3693    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3694    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3695    VIXL_ASSERT(allow_macro_instructions_);
3696    VIXL_ASSERT(OutsideITBlock());
3697    MacroEmissionCheckScope guard(this);
3698    ITScope it_scope(this, &cond);
3699    smlad(cond, rd, rn, rm, ra);
3700  }
3701  void Smlad(Register rd, Register rn, Register rm, Register ra) {
3702    Smlad(al, rd, rn, rm, ra);
3703  }
3704
3705  void Smladx(
3706      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3707    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3708    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3709    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3710    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3711    VIXL_ASSERT(allow_macro_instructions_);
3712    VIXL_ASSERT(OutsideITBlock());
3713    MacroEmissionCheckScope guard(this);
3714    ITScope it_scope(this, &cond);
3715    smladx(cond, rd, rn, rm, ra);
3716  }
3717  void Smladx(Register rd, Register rn, Register rm, Register ra) {
3718    Smladx(al, rd, rn, rm, ra);
3719  }
3720
3721  void Smlal(
3722      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3723    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3724    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3725    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3726    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3727    VIXL_ASSERT(allow_macro_instructions_);
3728    VIXL_ASSERT(OutsideITBlock());
3729    MacroEmissionCheckScope guard(this);
3730    ITScope it_scope(this, &cond);
3731    smlal(cond, rdlo, rdhi, rn, rm);
3732  }
3733  void Smlal(Register rdlo, Register rdhi, Register rn, Register rm) {
3734    Smlal(al, rdlo, rdhi, rn, rm);
3735  }
3736
3737  void Smlalbb(
3738      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3739    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3740    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3741    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3742    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3743    VIXL_ASSERT(allow_macro_instructions_);
3744    VIXL_ASSERT(OutsideITBlock());
3745    MacroEmissionCheckScope guard(this);
3746    ITScope it_scope(this, &cond);
3747    smlalbb(cond, rdlo, rdhi, rn, rm);
3748  }
3749  void Smlalbb(Register rdlo, Register rdhi, Register rn, Register rm) {
3750    Smlalbb(al, rdlo, rdhi, rn, rm);
3751  }
3752
3753  void Smlalbt(
3754      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3755    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3756    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3757    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3758    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3759    VIXL_ASSERT(allow_macro_instructions_);
3760    VIXL_ASSERT(OutsideITBlock());
3761    MacroEmissionCheckScope guard(this);
3762    ITScope it_scope(this, &cond);
3763    smlalbt(cond, rdlo, rdhi, rn, rm);
3764  }
3765  void Smlalbt(Register rdlo, Register rdhi, Register rn, Register rm) {
3766    Smlalbt(al, rdlo, rdhi, rn, rm);
3767  }
3768
3769  void Smlald(
3770      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3771    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3772    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3773    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3774    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3775    VIXL_ASSERT(allow_macro_instructions_);
3776    VIXL_ASSERT(OutsideITBlock());
3777    MacroEmissionCheckScope guard(this);
3778    ITScope it_scope(this, &cond);
3779    smlald(cond, rdlo, rdhi, rn, rm);
3780  }
3781  void Smlald(Register rdlo, Register rdhi, Register rn, Register rm) {
3782    Smlald(al, rdlo, rdhi, rn, rm);
3783  }
3784
3785  void Smlaldx(
3786      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3787    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3788    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3789    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3790    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3791    VIXL_ASSERT(allow_macro_instructions_);
3792    VIXL_ASSERT(OutsideITBlock());
3793    MacroEmissionCheckScope guard(this);
3794    ITScope it_scope(this, &cond);
3795    smlaldx(cond, rdlo, rdhi, rn, rm);
3796  }
3797  void Smlaldx(Register rdlo, Register rdhi, Register rn, Register rm) {
3798    Smlaldx(al, rdlo, rdhi, rn, rm);
3799  }
3800
3801  void Smlals(
3802      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3803    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3804    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3805    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3806    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3807    VIXL_ASSERT(allow_macro_instructions_);
3808    VIXL_ASSERT(OutsideITBlock());
3809    MacroEmissionCheckScope guard(this);
3810    ITScope it_scope(this, &cond);
3811    smlals(cond, rdlo, rdhi, rn, rm);
3812  }
3813  void Smlals(Register rdlo, Register rdhi, Register rn, Register rm) {
3814    Smlals(al, rdlo, rdhi, rn, rm);
3815  }
3816
3817  void Smlaltb(
3818      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3819    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3820    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3821    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3822    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3823    VIXL_ASSERT(allow_macro_instructions_);
3824    VIXL_ASSERT(OutsideITBlock());
3825    MacroEmissionCheckScope guard(this);
3826    ITScope it_scope(this, &cond);
3827    smlaltb(cond, rdlo, rdhi, rn, rm);
3828  }
3829  void Smlaltb(Register rdlo, Register rdhi, Register rn, Register rm) {
3830    Smlaltb(al, rdlo, rdhi, rn, rm);
3831  }
3832
3833  void Smlaltt(
3834      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3835    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3836    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3837    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3838    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3839    VIXL_ASSERT(allow_macro_instructions_);
3840    VIXL_ASSERT(OutsideITBlock());
3841    MacroEmissionCheckScope guard(this);
3842    ITScope it_scope(this, &cond);
3843    smlaltt(cond, rdlo, rdhi, rn, rm);
3844  }
3845  void Smlaltt(Register rdlo, Register rdhi, Register rn, Register rm) {
3846    Smlaltt(al, rdlo, rdhi, rn, rm);
3847  }
3848
3849  void Smlatb(
3850      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3851    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3852    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3853    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3854    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3855    VIXL_ASSERT(allow_macro_instructions_);
3856    VIXL_ASSERT(OutsideITBlock());
3857    MacroEmissionCheckScope guard(this);
3858    ITScope it_scope(this, &cond);
3859    smlatb(cond, rd, rn, rm, ra);
3860  }
3861  void Smlatb(Register rd, Register rn, Register rm, Register ra) {
3862    Smlatb(al, rd, rn, rm, ra);
3863  }
3864
3865  void Smlatt(
3866      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3867    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3868    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3869    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3870    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3871    VIXL_ASSERT(allow_macro_instructions_);
3872    VIXL_ASSERT(OutsideITBlock());
3873    MacroEmissionCheckScope guard(this);
3874    ITScope it_scope(this, &cond);
3875    smlatt(cond, rd, rn, rm, ra);
3876  }
3877  void Smlatt(Register rd, Register rn, Register rm, Register ra) {
3878    Smlatt(al, rd, rn, rm, ra);
3879  }
3880
3881  void Smlawb(
3882      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3883    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3884    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3885    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3886    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3887    VIXL_ASSERT(allow_macro_instructions_);
3888    VIXL_ASSERT(OutsideITBlock());
3889    MacroEmissionCheckScope guard(this);
3890    ITScope it_scope(this, &cond);
3891    smlawb(cond, rd, rn, rm, ra);
3892  }
3893  void Smlawb(Register rd, Register rn, Register rm, Register ra) {
3894    Smlawb(al, rd, rn, rm, ra);
3895  }
3896
3897  void Smlawt(
3898      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3899    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3900    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3901    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3902    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3903    VIXL_ASSERT(allow_macro_instructions_);
3904    VIXL_ASSERT(OutsideITBlock());
3905    MacroEmissionCheckScope guard(this);
3906    ITScope it_scope(this, &cond);
3907    smlawt(cond, rd, rn, rm, ra);
3908  }
3909  void Smlawt(Register rd, Register rn, Register rm, Register ra) {
3910    Smlawt(al, rd, rn, rm, ra);
3911  }
3912
3913  void Smlsd(
3914      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3915    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3916    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3917    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3918    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3919    VIXL_ASSERT(allow_macro_instructions_);
3920    VIXL_ASSERT(OutsideITBlock());
3921    MacroEmissionCheckScope guard(this);
3922    ITScope it_scope(this, &cond);
3923    smlsd(cond, rd, rn, rm, ra);
3924  }
3925  void Smlsd(Register rd, Register rn, Register rm, Register ra) {
3926    Smlsd(al, rd, rn, rm, ra);
3927  }
3928
3929  void Smlsdx(
3930      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3931    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3932    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3933    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3934    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3935    VIXL_ASSERT(allow_macro_instructions_);
3936    VIXL_ASSERT(OutsideITBlock());
3937    MacroEmissionCheckScope guard(this);
3938    ITScope it_scope(this, &cond);
3939    smlsdx(cond, rd, rn, rm, ra);
3940  }
3941  void Smlsdx(Register rd, Register rn, Register rm, Register ra) {
3942    Smlsdx(al, rd, rn, rm, ra);
3943  }
3944
3945  void Smlsld(
3946      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3947    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3948    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3949    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3950    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3951    VIXL_ASSERT(allow_macro_instructions_);
3952    VIXL_ASSERT(OutsideITBlock());
3953    MacroEmissionCheckScope guard(this);
3954    ITScope it_scope(this, &cond);
3955    smlsld(cond, rdlo, rdhi, rn, rm);
3956  }
3957  void Smlsld(Register rdlo, Register rdhi, Register rn, Register rm) {
3958    Smlsld(al, rdlo, rdhi, rn, rm);
3959  }
3960
3961  void Smlsldx(
3962      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
3963    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
3964    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
3965    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3966    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3967    VIXL_ASSERT(allow_macro_instructions_);
3968    VIXL_ASSERT(OutsideITBlock());
3969    MacroEmissionCheckScope guard(this);
3970    ITScope it_scope(this, &cond);
3971    smlsldx(cond, rdlo, rdhi, rn, rm);
3972  }
3973  void Smlsldx(Register rdlo, Register rdhi, Register rn, Register rm) {
3974    Smlsldx(al, rdlo, rdhi, rn, rm);
3975  }
3976
3977  void Smmla(
3978      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3979    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3980    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3981    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3982    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3983    VIXL_ASSERT(allow_macro_instructions_);
3984    VIXL_ASSERT(OutsideITBlock());
3985    MacroEmissionCheckScope guard(this);
3986    ITScope it_scope(this, &cond);
3987    smmla(cond, rd, rn, rm, ra);
3988  }
3989  void Smmla(Register rd, Register rn, Register rm, Register ra) {
3990    Smmla(al, rd, rn, rm, ra);
3991  }
3992
3993  void Smmlar(
3994      Condition cond, Register rd, Register rn, Register rm, Register ra) {
3995    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
3996    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
3997    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
3998    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
3999    VIXL_ASSERT(allow_macro_instructions_);
4000    VIXL_ASSERT(OutsideITBlock());
4001    MacroEmissionCheckScope guard(this);
4002    ITScope it_scope(this, &cond);
4003    smmlar(cond, rd, rn, rm, ra);
4004  }
4005  void Smmlar(Register rd, Register rn, Register rm, Register ra) {
4006    Smmlar(al, rd, rn, rm, ra);
4007  }
4008
4009  void Smmls(
4010      Condition cond, Register rd, Register rn, Register rm, Register ra) {
4011    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4012    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4013    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4014    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4015    VIXL_ASSERT(allow_macro_instructions_);
4016    VIXL_ASSERT(OutsideITBlock());
4017    MacroEmissionCheckScope guard(this);
4018    ITScope it_scope(this, &cond);
4019    smmls(cond, rd, rn, rm, ra);
4020  }
4021  void Smmls(Register rd, Register rn, Register rm, Register ra) {
4022    Smmls(al, rd, rn, rm, ra);
4023  }
4024
4025  void Smmlsr(
4026      Condition cond, Register rd, Register rn, Register rm, Register ra) {
4027    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4028    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4029    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4030    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
4031    VIXL_ASSERT(allow_macro_instructions_);
4032    VIXL_ASSERT(OutsideITBlock());
4033    MacroEmissionCheckScope guard(this);
4034    ITScope it_scope(this, &cond);
4035    smmlsr(cond, rd, rn, rm, ra);
4036  }
4037  void Smmlsr(Register rd, Register rn, Register rm, Register ra) {
4038    Smmlsr(al, rd, rn, rm, ra);
4039  }
4040
4041  void Smmul(Condition cond, Register rd, Register rn, Register rm) {
4042    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4043    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4044    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4045    VIXL_ASSERT(allow_macro_instructions_);
4046    VIXL_ASSERT(OutsideITBlock());
4047    MacroEmissionCheckScope guard(this);
4048    ITScope it_scope(this, &cond);
4049    smmul(cond, rd, rn, rm);
4050  }
4051  void Smmul(Register rd, Register rn, Register rm) { Smmul(al, rd, rn, rm); }
4052
4053  void Smmulr(Condition cond, Register rd, Register rn, Register rm) {
4054    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4055    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4056    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4057    VIXL_ASSERT(allow_macro_instructions_);
4058    VIXL_ASSERT(OutsideITBlock());
4059    MacroEmissionCheckScope guard(this);
4060    ITScope it_scope(this, &cond);
4061    smmulr(cond, rd, rn, rm);
4062  }
4063  void Smmulr(Register rd, Register rn, Register rm) { Smmulr(al, rd, rn, rm); }
4064
4065  void Smuad(Condition cond, Register rd, Register rn, Register rm) {
4066    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4067    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4068    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4069    VIXL_ASSERT(allow_macro_instructions_);
4070    VIXL_ASSERT(OutsideITBlock());
4071    MacroEmissionCheckScope guard(this);
4072    ITScope it_scope(this, &cond);
4073    smuad(cond, rd, rn, rm);
4074  }
4075  void Smuad(Register rd, Register rn, Register rm) { Smuad(al, rd, rn, rm); }
4076
4077  void Smuadx(Condition cond, Register rd, Register rn, Register rm) {
4078    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4079    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4080    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4081    VIXL_ASSERT(allow_macro_instructions_);
4082    VIXL_ASSERT(OutsideITBlock());
4083    MacroEmissionCheckScope guard(this);
4084    ITScope it_scope(this, &cond);
4085    smuadx(cond, rd, rn, rm);
4086  }
4087  void Smuadx(Register rd, Register rn, Register rm) { Smuadx(al, rd, rn, rm); }
4088
4089  void Smulbb(Condition cond, Register rd, Register rn, Register rm) {
4090    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4091    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4092    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4093    VIXL_ASSERT(allow_macro_instructions_);
4094    VIXL_ASSERT(OutsideITBlock());
4095    MacroEmissionCheckScope guard(this);
4096    ITScope it_scope(this, &cond);
4097    smulbb(cond, rd, rn, rm);
4098  }
4099  void Smulbb(Register rd, Register rn, Register rm) { Smulbb(al, rd, rn, rm); }
4100
4101  void Smulbt(Condition cond, Register rd, Register rn, Register rm) {
4102    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4103    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4104    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4105    VIXL_ASSERT(allow_macro_instructions_);
4106    VIXL_ASSERT(OutsideITBlock());
4107    MacroEmissionCheckScope guard(this);
4108    ITScope it_scope(this, &cond);
4109    smulbt(cond, rd, rn, rm);
4110  }
4111  void Smulbt(Register rd, Register rn, Register rm) { Smulbt(al, rd, rn, rm); }
4112
4113  void Smull(
4114      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4115    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4116    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4117    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4118    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4119    VIXL_ASSERT(allow_macro_instructions_);
4120    VIXL_ASSERT(OutsideITBlock());
4121    MacroEmissionCheckScope guard(this);
4122    ITScope it_scope(this, &cond);
4123    smull(cond, rdlo, rdhi, rn, rm);
4124  }
4125  void Smull(Register rdlo, Register rdhi, Register rn, Register rm) {
4126    Smull(al, rdlo, rdhi, rn, rm);
4127  }
4128  void Smull(FlagsUpdate flags,
4129             Condition cond,
4130             Register rdlo,
4131             Register rdhi,
4132             Register rn,
4133             Register rm) {
4134    switch (flags) {
4135      case LeaveFlags:
4136        Smull(cond, rdlo, rdhi, rn, rm);
4137        break;
4138      case SetFlags:
4139        Smulls(cond, rdlo, rdhi, rn, rm);
4140        break;
4141      case DontCare:
4142        Smull(cond, rdlo, rdhi, rn, rm);
4143        break;
4144    }
4145  }
4146  void Smull(FlagsUpdate flags,
4147             Register rdlo,
4148             Register rdhi,
4149             Register rn,
4150             Register rm) {
4151    Smull(flags, al, rdlo, rdhi, rn, rm);
4152  }
4153
4154  void Smulls(
4155      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
4156    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
4157    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
4158    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4159    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4160    VIXL_ASSERT(allow_macro_instructions_);
4161    VIXL_ASSERT(OutsideITBlock());
4162    MacroEmissionCheckScope guard(this);
4163    ITScope it_scope(this, &cond);
4164    smulls(cond, rdlo, rdhi, rn, rm);
4165  }
4166  void Smulls(Register rdlo, Register rdhi, Register rn, Register rm) {
4167    Smulls(al, rdlo, rdhi, rn, rm);
4168  }
4169
4170  void Smultb(Condition cond, Register rd, Register rn, Register rm) {
4171    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4172    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4173    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4174    VIXL_ASSERT(allow_macro_instructions_);
4175    VIXL_ASSERT(OutsideITBlock());
4176    MacroEmissionCheckScope guard(this);
4177    ITScope it_scope(this, &cond);
4178    smultb(cond, rd, rn, rm);
4179  }
4180  void Smultb(Register rd, Register rn, Register rm) { Smultb(al, rd, rn, rm); }
4181
4182  void Smultt(Condition cond, Register rd, Register rn, Register rm) {
4183    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4184    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4185    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4186    VIXL_ASSERT(allow_macro_instructions_);
4187    VIXL_ASSERT(OutsideITBlock());
4188    MacroEmissionCheckScope guard(this);
4189    ITScope it_scope(this, &cond);
4190    smultt(cond, rd, rn, rm);
4191  }
4192  void Smultt(Register rd, Register rn, Register rm) { Smultt(al, rd, rn, rm); }
4193
4194  void Smulwb(Condition cond, Register rd, Register rn, Register rm) {
4195    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4196    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4197    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4198    VIXL_ASSERT(allow_macro_instructions_);
4199    VIXL_ASSERT(OutsideITBlock());
4200    MacroEmissionCheckScope guard(this);
4201    ITScope it_scope(this, &cond);
4202    smulwb(cond, rd, rn, rm);
4203  }
4204  void Smulwb(Register rd, Register rn, Register rm) { Smulwb(al, rd, rn, rm); }
4205
4206  void Smulwt(Condition cond, Register rd, Register rn, Register rm) {
4207    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4208    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4209    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4210    VIXL_ASSERT(allow_macro_instructions_);
4211    VIXL_ASSERT(OutsideITBlock());
4212    MacroEmissionCheckScope guard(this);
4213    ITScope it_scope(this, &cond);
4214    smulwt(cond, rd, rn, rm);
4215  }
4216  void Smulwt(Register rd, Register rn, Register rm) { Smulwt(al, rd, rn, rm); }
4217
4218  void Smusd(Condition cond, Register rd, Register rn, Register rm) {
4219    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4220    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4221    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4222    VIXL_ASSERT(allow_macro_instructions_);
4223    VIXL_ASSERT(OutsideITBlock());
4224    MacroEmissionCheckScope guard(this);
4225    ITScope it_scope(this, &cond);
4226    smusd(cond, rd, rn, rm);
4227  }
4228  void Smusd(Register rd, Register rn, Register rm) { Smusd(al, rd, rn, rm); }
4229
4230  void Smusdx(Condition cond, Register rd, Register rn, Register rm) {
4231    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4232    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4233    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4234    VIXL_ASSERT(allow_macro_instructions_);
4235    VIXL_ASSERT(OutsideITBlock());
4236    MacroEmissionCheckScope guard(this);
4237    ITScope it_scope(this, &cond);
4238    smusdx(cond, rd, rn, rm);
4239  }
4240  void Smusdx(Register rd, Register rn, Register rm) { Smusdx(al, rd, rn, rm); }
4241
4242  void Ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
4243    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4244    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4245    VIXL_ASSERT(allow_macro_instructions_);
4246    VIXL_ASSERT(OutsideITBlock());
4247    MacroEmissionCheckScope guard(this);
4248    ITScope it_scope(this, &cond);
4249    ssat(cond, rd, imm, operand);
4250  }
4251  void Ssat(Register rd, uint32_t imm, const Operand& operand) {
4252    Ssat(al, rd, imm, operand);
4253  }
4254
4255  void Ssat16(Condition cond, Register rd, uint32_t imm, Register rn) {
4256    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4257    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4258    VIXL_ASSERT(allow_macro_instructions_);
4259    VIXL_ASSERT(OutsideITBlock());
4260    MacroEmissionCheckScope guard(this);
4261    ITScope it_scope(this, &cond);
4262    ssat16(cond, rd, imm, rn);
4263  }
4264  void Ssat16(Register rd, uint32_t imm, Register rn) {
4265    Ssat16(al, rd, imm, rn);
4266  }
4267
4268  void Ssax(Condition cond, Register rd, Register rn, Register rm) {
4269    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4270    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4271    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4272    VIXL_ASSERT(allow_macro_instructions_);
4273    VIXL_ASSERT(OutsideITBlock());
4274    MacroEmissionCheckScope guard(this);
4275    ITScope it_scope(this, &cond);
4276    ssax(cond, rd, rn, rm);
4277  }
4278  void Ssax(Register rd, Register rn, Register rm) { Ssax(al, rd, rn, rm); }
4279
4280  void Ssub16(Condition cond, Register rd, Register rn, Register rm) {
4281    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4282    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4283    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4284    VIXL_ASSERT(allow_macro_instructions_);
4285    VIXL_ASSERT(OutsideITBlock());
4286    MacroEmissionCheckScope guard(this);
4287    ITScope it_scope(this, &cond);
4288    ssub16(cond, rd, rn, rm);
4289  }
4290  void Ssub16(Register rd, Register rn, Register rm) { Ssub16(al, rd, rn, rm); }
4291
4292  void Ssub8(Condition cond, Register rd, Register rn, Register rm) {
4293    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4294    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4295    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4296    VIXL_ASSERT(allow_macro_instructions_);
4297    VIXL_ASSERT(OutsideITBlock());
4298    MacroEmissionCheckScope guard(this);
4299    ITScope it_scope(this, &cond);
4300    ssub8(cond, rd, rn, rm);
4301  }
4302  void Ssub8(Register rd, Register rn, Register rm) { Ssub8(al, rd, rn, rm); }
4303
4304  void Stl(Condition cond, Register rt, const MemOperand& operand) {
4305    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4306    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4307    VIXL_ASSERT(allow_macro_instructions_);
4308    VIXL_ASSERT(OutsideITBlock());
4309    MacroEmissionCheckScope guard(this);
4310    ITScope it_scope(this, &cond);
4311    stl(cond, rt, operand);
4312  }
4313  void Stl(Register rt, const MemOperand& operand) { Stl(al, rt, operand); }
4314
4315  void Stlb(Condition cond, Register rt, const MemOperand& operand) {
4316    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4317    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4318    VIXL_ASSERT(allow_macro_instructions_);
4319    VIXL_ASSERT(OutsideITBlock());
4320    MacroEmissionCheckScope guard(this);
4321    ITScope it_scope(this, &cond);
4322    stlb(cond, rt, operand);
4323  }
4324  void Stlb(Register rt, const MemOperand& operand) { Stlb(al, rt, operand); }
4325
4326  void Stlex(Condition cond,
4327             Register rd,
4328             Register rt,
4329             const MemOperand& operand) {
4330    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4331    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4332    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4333    VIXL_ASSERT(allow_macro_instructions_);
4334    VIXL_ASSERT(OutsideITBlock());
4335    MacroEmissionCheckScope guard(this);
4336    ITScope it_scope(this, &cond);
4337    stlex(cond, rd, rt, operand);
4338  }
4339  void Stlex(Register rd, Register rt, const MemOperand& operand) {
4340    Stlex(al, rd, rt, operand);
4341  }
4342
4343  void Stlexb(Condition cond,
4344              Register rd,
4345              Register rt,
4346              const MemOperand& operand) {
4347    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4348    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4349    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4350    VIXL_ASSERT(allow_macro_instructions_);
4351    VIXL_ASSERT(OutsideITBlock());
4352    MacroEmissionCheckScope guard(this);
4353    ITScope it_scope(this, &cond);
4354    stlexb(cond, rd, rt, operand);
4355  }
4356  void Stlexb(Register rd, Register rt, const MemOperand& operand) {
4357    Stlexb(al, rd, rt, operand);
4358  }
4359
4360  void Stlexd(Condition cond,
4361              Register rd,
4362              Register rt,
4363              Register rt2,
4364              const MemOperand& operand) {
4365    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4366    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4367    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4368    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4369    VIXL_ASSERT(allow_macro_instructions_);
4370    VIXL_ASSERT(OutsideITBlock());
4371    MacroEmissionCheckScope guard(this);
4372    ITScope it_scope(this, &cond);
4373    stlexd(cond, rd, rt, rt2, operand);
4374  }
4375  void Stlexd(Register rd,
4376              Register rt,
4377              Register rt2,
4378              const MemOperand& operand) {
4379    Stlexd(al, rd, rt, rt2, operand);
4380  }
4381
4382  void Stlexh(Condition cond,
4383              Register rd,
4384              Register rt,
4385              const MemOperand& operand) {
4386    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4387    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4388    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4389    VIXL_ASSERT(allow_macro_instructions_);
4390    VIXL_ASSERT(OutsideITBlock());
4391    MacroEmissionCheckScope guard(this);
4392    ITScope it_scope(this, &cond);
4393    stlexh(cond, rd, rt, operand);
4394  }
4395  void Stlexh(Register rd, Register rt, const MemOperand& operand) {
4396    Stlexh(al, rd, rt, operand);
4397  }
4398
4399  void Stlh(Condition cond, Register rt, const MemOperand& operand) {
4400    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4401    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4402    VIXL_ASSERT(allow_macro_instructions_);
4403    VIXL_ASSERT(OutsideITBlock());
4404    MacroEmissionCheckScope guard(this);
4405    ITScope it_scope(this, &cond);
4406    stlh(cond, rt, operand);
4407  }
4408  void Stlh(Register rt, const MemOperand& operand) { Stlh(al, rt, operand); }
4409
4410  void Stm(Condition cond,
4411           Register rn,
4412           WriteBack write_back,
4413           RegisterList registers) {
4414    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4415    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4416    VIXL_ASSERT(allow_macro_instructions_);
4417    VIXL_ASSERT(OutsideITBlock());
4418    MacroEmissionCheckScope guard(this);
4419    ITScope it_scope(this, &cond);
4420    stm(cond, rn, write_back, registers);
4421  }
4422  void Stm(Register rn, WriteBack write_back, RegisterList registers) {
4423    Stm(al, rn, write_back, registers);
4424  }
4425
4426  void Stmda(Condition cond,
4427             Register rn,
4428             WriteBack write_back,
4429             RegisterList registers) {
4430    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4431    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4432    VIXL_ASSERT(allow_macro_instructions_);
4433    VIXL_ASSERT(OutsideITBlock());
4434    MacroEmissionCheckScope guard(this);
4435    ITScope it_scope(this, &cond);
4436    stmda(cond, rn, write_back, registers);
4437  }
4438  void Stmda(Register rn, WriteBack write_back, RegisterList registers) {
4439    Stmda(al, rn, write_back, registers);
4440  }
4441
4442  void Stmdb(Condition cond,
4443             Register rn,
4444             WriteBack write_back,
4445             RegisterList registers) {
4446    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4447    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4448    VIXL_ASSERT(allow_macro_instructions_);
4449    VIXL_ASSERT(OutsideITBlock());
4450    MacroEmissionCheckScope guard(this);
4451    ITScope it_scope(this, &cond);
4452    stmdb(cond, rn, write_back, registers);
4453  }
4454  void Stmdb(Register rn, WriteBack write_back, RegisterList registers) {
4455    Stmdb(al, rn, write_back, registers);
4456  }
4457
4458  void Stmea(Condition cond,
4459             Register rn,
4460             WriteBack write_back,
4461             RegisterList registers) {
4462    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4463    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4464    VIXL_ASSERT(allow_macro_instructions_);
4465    VIXL_ASSERT(OutsideITBlock());
4466    MacroEmissionCheckScope guard(this);
4467    ITScope it_scope(this, &cond);
4468    stmea(cond, rn, write_back, registers);
4469  }
4470  void Stmea(Register rn, WriteBack write_back, RegisterList registers) {
4471    Stmea(al, rn, write_back, registers);
4472  }
4473
4474  void Stmed(Condition cond,
4475             Register rn,
4476             WriteBack write_back,
4477             RegisterList registers) {
4478    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4479    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4480    VIXL_ASSERT(allow_macro_instructions_);
4481    VIXL_ASSERT(OutsideITBlock());
4482    MacroEmissionCheckScope guard(this);
4483    ITScope it_scope(this, &cond);
4484    stmed(cond, rn, write_back, registers);
4485  }
4486  void Stmed(Register rn, WriteBack write_back, RegisterList registers) {
4487    Stmed(al, rn, write_back, registers);
4488  }
4489
4490  void Stmfa(Condition cond,
4491             Register rn,
4492             WriteBack write_back,
4493             RegisterList registers) {
4494    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4495    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4496    VIXL_ASSERT(allow_macro_instructions_);
4497    VIXL_ASSERT(OutsideITBlock());
4498    MacroEmissionCheckScope guard(this);
4499    ITScope it_scope(this, &cond);
4500    stmfa(cond, rn, write_back, registers);
4501  }
4502  void Stmfa(Register rn, WriteBack write_back, RegisterList registers) {
4503    Stmfa(al, rn, write_back, registers);
4504  }
4505
4506  void Stmfd(Condition cond,
4507             Register rn,
4508             WriteBack write_back,
4509             RegisterList registers) {
4510    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4511    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4512    VIXL_ASSERT(allow_macro_instructions_);
4513    VIXL_ASSERT(OutsideITBlock());
4514    MacroEmissionCheckScope guard(this);
4515    ITScope it_scope(this, &cond);
4516    stmfd(cond, rn, write_back, registers);
4517  }
4518  void Stmfd(Register rn, WriteBack write_back, RegisterList registers) {
4519    Stmfd(al, rn, write_back, registers);
4520  }
4521
4522  void Stmib(Condition cond,
4523             Register rn,
4524             WriteBack write_back,
4525             RegisterList registers) {
4526    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4527    VIXL_ASSERT(!AliasesAvailableScratchRegister(registers));
4528    VIXL_ASSERT(allow_macro_instructions_);
4529    VIXL_ASSERT(OutsideITBlock());
4530    MacroEmissionCheckScope guard(this);
4531    ITScope it_scope(this, &cond);
4532    stmib(cond, rn, write_back, registers);
4533  }
4534  void Stmib(Register rn, WriteBack write_back, RegisterList registers) {
4535    Stmib(al, rn, write_back, registers);
4536  }
4537
4538  void Str(Condition cond, Register rt, const MemOperand& operand) {
4539    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4540    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4541    VIXL_ASSERT(allow_macro_instructions_);
4542    VIXL_ASSERT(OutsideITBlock());
4543    MacroEmissionCheckScope guard(this);
4544    bool can_use_it =
4545        // STR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4546        (operand.IsImmediate() && rt.IsLow() &&
4547         operand.GetBaseRegister().IsLow() &&
4548         operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
4549         (operand.GetAddrMode() == Offset)) ||
4550        // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
4551        (operand.IsImmediate() && rt.IsLow() &&
4552         operand.GetBaseRegister().IsSP() &&
4553         operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
4554         (operand.GetAddrMode() == Offset)) ||
4555        // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4556        (operand.IsPlainRegister() && rt.IsLow() &&
4557         operand.GetBaseRegister().IsLow() &&
4558         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4559         (operand.GetAddrMode() == Offset));
4560    ITScope it_scope(this, &cond, can_use_it);
4561    str(cond, rt, operand);
4562  }
4563  void Str(Register rt, const MemOperand& operand) { Str(al, rt, operand); }
4564
4565  void Strb(Condition cond, Register rt, const MemOperand& operand) {
4566    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4567    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4568    VIXL_ASSERT(allow_macro_instructions_);
4569    VIXL_ASSERT(OutsideITBlock());
4570    MacroEmissionCheckScope guard(this);
4571    bool can_use_it =
4572        // STRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4573        (operand.IsImmediate() && rt.IsLow() &&
4574         operand.GetBaseRegister().IsLow() &&
4575         operand.IsOffsetImmediateWithinRange(0, 31) &&
4576         (operand.GetAddrMode() == Offset)) ||
4577        // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4578        (operand.IsPlainRegister() && rt.IsLow() &&
4579         operand.GetBaseRegister().IsLow() &&
4580         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4581         (operand.GetAddrMode() == Offset));
4582    ITScope it_scope(this, &cond, can_use_it);
4583    strb(cond, rt, operand);
4584  }
4585  void Strb(Register rt, const MemOperand& operand) { Strb(al, rt, operand); }
4586
4587  void Strd(Condition cond,
4588            Register rt,
4589            Register rt2,
4590            const MemOperand& operand) {
4591    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4592    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4593    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4594    VIXL_ASSERT(allow_macro_instructions_);
4595    VIXL_ASSERT(OutsideITBlock());
4596    MacroEmissionCheckScope guard(this);
4597    ITScope it_scope(this, &cond);
4598    strd(cond, rt, rt2, operand);
4599  }
4600  void Strd(Register rt, Register rt2, const MemOperand& operand) {
4601    Strd(al, rt, rt2, operand);
4602  }
4603
4604  void Strex(Condition cond,
4605             Register rd,
4606             Register rt,
4607             const MemOperand& operand) {
4608    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4609    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4610    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4611    VIXL_ASSERT(allow_macro_instructions_);
4612    VIXL_ASSERT(OutsideITBlock());
4613    MacroEmissionCheckScope guard(this);
4614    ITScope it_scope(this, &cond);
4615    strex(cond, rd, rt, operand);
4616  }
4617  void Strex(Register rd, Register rt, const MemOperand& operand) {
4618    Strex(al, rd, rt, operand);
4619  }
4620
4621  void Strexb(Condition cond,
4622              Register rd,
4623              Register rt,
4624              const MemOperand& operand) {
4625    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4626    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4627    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4628    VIXL_ASSERT(allow_macro_instructions_);
4629    VIXL_ASSERT(OutsideITBlock());
4630    MacroEmissionCheckScope guard(this);
4631    ITScope it_scope(this, &cond);
4632    strexb(cond, rd, rt, operand);
4633  }
4634  void Strexb(Register rd, Register rt, const MemOperand& operand) {
4635    Strexb(al, rd, rt, operand);
4636  }
4637
4638  void Strexd(Condition cond,
4639              Register rd,
4640              Register rt,
4641              Register rt2,
4642              const MemOperand& operand) {
4643    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4644    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4645    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
4646    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4647    VIXL_ASSERT(allow_macro_instructions_);
4648    VIXL_ASSERT(OutsideITBlock());
4649    MacroEmissionCheckScope guard(this);
4650    ITScope it_scope(this, &cond);
4651    strexd(cond, rd, rt, rt2, operand);
4652  }
4653  void Strexd(Register rd,
4654              Register rt,
4655              Register rt2,
4656              const MemOperand& operand) {
4657    Strexd(al, rd, rt, rt2, operand);
4658  }
4659
4660  void Strexh(Condition cond,
4661              Register rd,
4662              Register rt,
4663              const MemOperand& operand) {
4664    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4665    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4666    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4667    VIXL_ASSERT(allow_macro_instructions_);
4668    VIXL_ASSERT(OutsideITBlock());
4669    MacroEmissionCheckScope guard(this);
4670    ITScope it_scope(this, &cond);
4671    strexh(cond, rd, rt, operand);
4672  }
4673  void Strexh(Register rd, Register rt, const MemOperand& operand) {
4674    Strexh(al, rd, rt, operand);
4675  }
4676
4677  void Strh(Condition cond, Register rt, const MemOperand& operand) {
4678    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
4679    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4680    VIXL_ASSERT(allow_macro_instructions_);
4681    VIXL_ASSERT(OutsideITBlock());
4682    MacroEmissionCheckScope guard(this);
4683    bool can_use_it =
4684        // STRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
4685        (operand.IsImmediate() && rt.IsLow() &&
4686         operand.GetBaseRegister().IsLow() &&
4687         operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
4688         (operand.GetAddrMode() == Offset)) ||
4689        // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
4690        (operand.IsPlainRegister() && rt.IsLow() &&
4691         operand.GetBaseRegister().IsLow() &&
4692         operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
4693         (operand.GetAddrMode() == Offset));
4694    ITScope it_scope(this, &cond, can_use_it);
4695    strh(cond, rt, operand);
4696  }
4697  void Strh(Register rt, const MemOperand& operand) { Strh(al, rt, operand); }
4698
4699  void Sub(Condition cond, Register rd, Register rn, const Operand& operand) {
4700    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4701    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4702    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4703    VIXL_ASSERT(allow_macro_instructions_);
4704    VIXL_ASSERT(OutsideITBlock());
4705    MacroEmissionCheckScope guard(this);
4706    if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) {
4707      uint32_t immediate = operand.GetImmediate();
4708      if (immediate == 0) {
4709        return;
4710      }
4711    }
4712    bool can_use_it =
4713        // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
4714        (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
4715         rd.IsLow()) ||
4716        // SUB<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
4717        (operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
4718         rd.IsLow() && rn.Is(rd)) ||
4719        // SUB<c>{<q>} <Rd>, <Rn>, <Rm>
4720        (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
4721         operand.GetBaseRegister().IsLow());
4722    ITScope it_scope(this, &cond, can_use_it);
4723    sub(cond, rd, rn, operand);
4724  }
4725  void Sub(Register rd, Register rn, const Operand& operand) {
4726    Sub(al, rd, rn, operand);
4727  }
4728  void Sub(FlagsUpdate flags,
4729           Condition cond,
4730           Register rd,
4731           Register rn,
4732           const Operand& operand) {
4733    switch (flags) {
4734      case LeaveFlags:
4735        Sub(cond, rd, rn, operand);
4736        break;
4737      case SetFlags:
4738        Subs(cond, rd, rn, operand);
4739        break;
4740      case DontCare:
4741        bool setflags_is_smaller =
4742            IsUsingT32() && cond.Is(al) &&
4743            ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
4744              operand.GetBaseRegister().IsLow()) ||
4745             (operand.IsImmediate() &&
4746              ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) ||
4747               (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256)))));
4748        if (setflags_is_smaller) {
4749          Subs(cond, rd, rn, operand);
4750        } else {
4751          bool changed_op_is_smaller =
4752              operand.IsImmediate() && (operand.GetSignedImmediate() < 0) &&
4753              ((rd.IsLow() && rn.IsLow() &&
4754                (operand.GetSignedImmediate() >= -7)) ||
4755               (rd.IsLow() && rn.Is(rd) &&
4756                (operand.GetSignedImmediate() >= -255)));
4757          if (changed_op_is_smaller) {
4758            Adds(cond, rd, rn, -operand.GetSignedImmediate());
4759          } else {
4760            Sub(cond, rd, rn, operand);
4761          }
4762        }
4763        break;
4764    }
4765  }
4766  void Sub(FlagsUpdate flags,
4767           Register rd,
4768           Register rn,
4769           const Operand& operand) {
4770    Sub(flags, al, rd, rn, operand);
4771  }
4772
4773  void Subs(Condition cond, Register rd, Register rn, const Operand& operand) {
4774    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4775    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4776    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4777    VIXL_ASSERT(allow_macro_instructions_);
4778    VIXL_ASSERT(OutsideITBlock());
4779    MacroEmissionCheckScope guard(this);
4780    ITScope it_scope(this, &cond);
4781    subs(cond, rd, rn, operand);
4782  }
4783  void Subs(Register rd, Register rn, const Operand& operand) {
4784    Subs(al, rd, rn, operand);
4785  }
4786
4787  void Svc(Condition cond, uint32_t imm) {
4788    VIXL_ASSERT(allow_macro_instructions_);
4789    VIXL_ASSERT(OutsideITBlock());
4790    MacroEmissionCheckScope guard(this);
4791    ITScope it_scope(this, &cond);
4792    svc(cond, imm);
4793  }
4794  void Svc(uint32_t imm) { Svc(al, imm); }
4795
4796  void Sxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
4797    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4798    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4799    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4800    VIXL_ASSERT(allow_macro_instructions_);
4801    VIXL_ASSERT(OutsideITBlock());
4802    MacroEmissionCheckScope guard(this);
4803    ITScope it_scope(this, &cond);
4804    sxtab(cond, rd, rn, operand);
4805  }
4806  void Sxtab(Register rd, Register rn, const Operand& operand) {
4807    Sxtab(al, rd, rn, operand);
4808  }
4809
4810  void Sxtab16(Condition cond,
4811               Register rd,
4812               Register rn,
4813               const Operand& operand) {
4814    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4815    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4816    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4817    VIXL_ASSERT(allow_macro_instructions_);
4818    VIXL_ASSERT(OutsideITBlock());
4819    MacroEmissionCheckScope guard(this);
4820    ITScope it_scope(this, &cond);
4821    sxtab16(cond, rd, rn, operand);
4822  }
4823  void Sxtab16(Register rd, Register rn, const Operand& operand) {
4824    Sxtab16(al, rd, rn, operand);
4825  }
4826
4827  void Sxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
4828    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4829    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4830    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4831    VIXL_ASSERT(allow_macro_instructions_);
4832    VIXL_ASSERT(OutsideITBlock());
4833    MacroEmissionCheckScope guard(this);
4834    ITScope it_scope(this, &cond);
4835    sxtah(cond, rd, rn, operand);
4836  }
4837  void Sxtah(Register rd, Register rn, const Operand& operand) {
4838    Sxtah(al, rd, rn, operand);
4839  }
4840
4841  void Sxtb(Condition cond, Register rd, const Operand& operand) {
4842    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4843    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4844    VIXL_ASSERT(allow_macro_instructions_);
4845    VIXL_ASSERT(OutsideITBlock());
4846    MacroEmissionCheckScope guard(this);
4847    ITScope it_scope(this, &cond);
4848    sxtb(cond, rd, operand);
4849  }
4850  void Sxtb(Register rd, const Operand& operand) { Sxtb(al, rd, operand); }
4851
4852  void Sxtb16(Condition cond, Register rd, const Operand& operand) {
4853    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4854    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4855    VIXL_ASSERT(allow_macro_instructions_);
4856    VIXL_ASSERT(OutsideITBlock());
4857    MacroEmissionCheckScope guard(this);
4858    ITScope it_scope(this, &cond);
4859    sxtb16(cond, rd, operand);
4860  }
4861  void Sxtb16(Register rd, const Operand& operand) { Sxtb16(al, rd, operand); }
4862
4863  void Sxth(Condition cond, Register rd, const Operand& operand) {
4864    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4865    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4866    VIXL_ASSERT(allow_macro_instructions_);
4867    VIXL_ASSERT(OutsideITBlock());
4868    MacroEmissionCheckScope guard(this);
4869    ITScope it_scope(this, &cond);
4870    sxth(cond, rd, operand);
4871  }
4872  void Sxth(Register rd, const Operand& operand) { Sxth(al, rd, operand); }
4873
4874  void Teq(Condition cond, Register rn, const Operand& operand) {
4875    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4876    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4877    VIXL_ASSERT(allow_macro_instructions_);
4878    VIXL_ASSERT(OutsideITBlock());
4879    MacroEmissionCheckScope guard(this);
4880    ITScope it_scope(this, &cond);
4881    teq(cond, rn, operand);
4882  }
4883  void Teq(Register rn, const Operand& operand) { Teq(al, rn, operand); }
4884
4885  void Tst(Condition cond, Register rn, const Operand& operand) {
4886    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4887    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4888    VIXL_ASSERT(allow_macro_instructions_);
4889    VIXL_ASSERT(OutsideITBlock());
4890    MacroEmissionCheckScope guard(this);
4891    bool can_use_it =
4892        // TST{<c>}{<q>} <Rn>, <Rm> ; T1
4893        operand.IsPlainRegister() && rn.IsLow() &&
4894        operand.GetBaseRegister().IsLow();
4895    ITScope it_scope(this, &cond, can_use_it);
4896    tst(cond, rn, operand);
4897  }
4898  void Tst(Register rn, const Operand& operand) { Tst(al, rn, operand); }
4899
4900  void Uadd16(Condition cond, Register rd, Register rn, Register rm) {
4901    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4902    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4903    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4904    VIXL_ASSERT(allow_macro_instructions_);
4905    VIXL_ASSERT(OutsideITBlock());
4906    MacroEmissionCheckScope guard(this);
4907    ITScope it_scope(this, &cond);
4908    uadd16(cond, rd, rn, rm);
4909  }
4910  void Uadd16(Register rd, Register rn, Register rm) { Uadd16(al, rd, rn, rm); }
4911
4912  void Uadd8(Condition cond, Register rd, Register rn, Register rm) {
4913    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4914    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4915    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4916    VIXL_ASSERT(allow_macro_instructions_);
4917    VIXL_ASSERT(OutsideITBlock());
4918    MacroEmissionCheckScope guard(this);
4919    ITScope it_scope(this, &cond);
4920    uadd8(cond, rd, rn, rm);
4921  }
4922  void Uadd8(Register rd, Register rn, Register rm) { Uadd8(al, rd, rn, rm); }
4923
4924  void Uasx(Condition cond, Register rd, Register rn, Register rm) {
4925    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4926    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4927    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4928    VIXL_ASSERT(allow_macro_instructions_);
4929    VIXL_ASSERT(OutsideITBlock());
4930    MacroEmissionCheckScope guard(this);
4931    ITScope it_scope(this, &cond);
4932    uasx(cond, rd, rn, rm);
4933  }
4934  void Uasx(Register rd, Register rn, Register rm) { Uasx(al, rd, rn, rm); }
4935
4936  void Ubfx(Condition cond,
4937            Register rd,
4938            Register rn,
4939            uint32_t lsb,
4940            const Operand& operand) {
4941    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4942    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4943    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
4944    VIXL_ASSERT(allow_macro_instructions_);
4945    VIXL_ASSERT(OutsideITBlock());
4946    MacroEmissionCheckScope guard(this);
4947    ITScope it_scope(this, &cond);
4948    ubfx(cond, rd, rn, lsb, operand);
4949  }
4950  void Ubfx(Register rd, Register rn, uint32_t lsb, const Operand& operand) {
4951    Ubfx(al, rd, rn, lsb, operand);
4952  }
4953
4954  void Udf(Condition cond, uint32_t imm) {
4955    VIXL_ASSERT(allow_macro_instructions_);
4956    VIXL_ASSERT(OutsideITBlock());
4957    MacroEmissionCheckScope guard(this);
4958    ITScope it_scope(this, &cond);
4959    udf(cond, imm);
4960  }
4961  void Udf(uint32_t imm) { Udf(al, imm); }
4962
4963  void Udiv(Condition cond, Register rd, Register rn, Register rm) {
4964    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4965    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4966    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4967    VIXL_ASSERT(allow_macro_instructions_);
4968    VIXL_ASSERT(OutsideITBlock());
4969    MacroEmissionCheckScope guard(this);
4970    ITScope it_scope(this, &cond);
4971    udiv(cond, rd, rn, rm);
4972  }
4973  void Udiv(Register rd, Register rn, Register rm) { Udiv(al, rd, rn, rm); }
4974
4975  void Uhadd16(Condition cond, Register rd, Register rn, Register rm) {
4976    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4977    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4978    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4979    VIXL_ASSERT(allow_macro_instructions_);
4980    VIXL_ASSERT(OutsideITBlock());
4981    MacroEmissionCheckScope guard(this);
4982    ITScope it_scope(this, &cond);
4983    uhadd16(cond, rd, rn, rm);
4984  }
4985  void Uhadd16(Register rd, Register rn, Register rm) {
4986    Uhadd16(al, rd, rn, rm);
4987  }
4988
4989  void Uhadd8(Condition cond, Register rd, Register rn, Register rm) {
4990    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
4991    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
4992    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
4993    VIXL_ASSERT(allow_macro_instructions_);
4994    VIXL_ASSERT(OutsideITBlock());
4995    MacroEmissionCheckScope guard(this);
4996    ITScope it_scope(this, &cond);
4997    uhadd8(cond, rd, rn, rm);
4998  }
4999  void Uhadd8(Register rd, Register rn, Register rm) { Uhadd8(al, rd, rn, rm); }
5000
5001  void Uhasx(Condition cond, Register rd, Register rn, Register rm) {
5002    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5003    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5004    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5005    VIXL_ASSERT(allow_macro_instructions_);
5006    VIXL_ASSERT(OutsideITBlock());
5007    MacroEmissionCheckScope guard(this);
5008    ITScope it_scope(this, &cond);
5009    uhasx(cond, rd, rn, rm);
5010  }
5011  void Uhasx(Register rd, Register rn, Register rm) { Uhasx(al, rd, rn, rm); }
5012
5013  void Uhsax(Condition cond, Register rd, Register rn, Register rm) {
5014    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5015    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5016    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5017    VIXL_ASSERT(allow_macro_instructions_);
5018    VIXL_ASSERT(OutsideITBlock());
5019    MacroEmissionCheckScope guard(this);
5020    ITScope it_scope(this, &cond);
5021    uhsax(cond, rd, rn, rm);
5022  }
5023  void Uhsax(Register rd, Register rn, Register rm) { Uhsax(al, rd, rn, rm); }
5024
5025  void Uhsub16(Condition cond, Register rd, Register rn, Register rm) {
5026    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5027    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5028    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5029    VIXL_ASSERT(allow_macro_instructions_);
5030    VIXL_ASSERT(OutsideITBlock());
5031    MacroEmissionCheckScope guard(this);
5032    ITScope it_scope(this, &cond);
5033    uhsub16(cond, rd, rn, rm);
5034  }
5035  void Uhsub16(Register rd, Register rn, Register rm) {
5036    Uhsub16(al, rd, rn, rm);
5037  }
5038
5039  void Uhsub8(Condition cond, Register rd, Register rn, Register rm) {
5040    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5041    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5042    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5043    VIXL_ASSERT(allow_macro_instructions_);
5044    VIXL_ASSERT(OutsideITBlock());
5045    MacroEmissionCheckScope guard(this);
5046    ITScope it_scope(this, &cond);
5047    uhsub8(cond, rd, rn, rm);
5048  }
5049  void Uhsub8(Register rd, Register rn, Register rm) { Uhsub8(al, rd, rn, rm); }
5050
5051  void Umaal(
5052      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5053    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5054    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5055    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5056    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5057    VIXL_ASSERT(allow_macro_instructions_);
5058    VIXL_ASSERT(OutsideITBlock());
5059    MacroEmissionCheckScope guard(this);
5060    ITScope it_scope(this, &cond);
5061    umaal(cond, rdlo, rdhi, rn, rm);
5062  }
5063  void Umaal(Register rdlo, Register rdhi, Register rn, Register rm) {
5064    Umaal(al, rdlo, rdhi, rn, rm);
5065  }
5066
5067  void Umlal(
5068      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5069    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5070    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5071    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5072    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5073    VIXL_ASSERT(allow_macro_instructions_);
5074    VIXL_ASSERT(OutsideITBlock());
5075    MacroEmissionCheckScope guard(this);
5076    ITScope it_scope(this, &cond);
5077    umlal(cond, rdlo, rdhi, rn, rm);
5078  }
5079  void Umlal(Register rdlo, Register rdhi, Register rn, Register rm) {
5080    Umlal(al, rdlo, rdhi, rn, rm);
5081  }
5082  void Umlal(FlagsUpdate flags,
5083             Condition cond,
5084             Register rdlo,
5085             Register rdhi,
5086             Register rn,
5087             Register rm) {
5088    switch (flags) {
5089      case LeaveFlags:
5090        Umlal(cond, rdlo, rdhi, rn, rm);
5091        break;
5092      case SetFlags:
5093        Umlals(cond, rdlo, rdhi, rn, rm);
5094        break;
5095      case DontCare:
5096        Umlal(cond, rdlo, rdhi, rn, rm);
5097        break;
5098    }
5099  }
5100  void Umlal(FlagsUpdate flags,
5101             Register rdlo,
5102             Register rdhi,
5103             Register rn,
5104             Register rm) {
5105    Umlal(flags, al, rdlo, rdhi, rn, rm);
5106  }
5107
5108  void Umlals(
5109      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5110    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5111    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5112    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5113    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5114    VIXL_ASSERT(allow_macro_instructions_);
5115    VIXL_ASSERT(OutsideITBlock());
5116    MacroEmissionCheckScope guard(this);
5117    ITScope it_scope(this, &cond);
5118    umlals(cond, rdlo, rdhi, rn, rm);
5119  }
5120  void Umlals(Register rdlo, Register rdhi, Register rn, Register rm) {
5121    Umlals(al, rdlo, rdhi, rn, rm);
5122  }
5123
5124  void Umull(
5125      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5126    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5127    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5128    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5129    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5130    VIXL_ASSERT(allow_macro_instructions_);
5131    VIXL_ASSERT(OutsideITBlock());
5132    MacroEmissionCheckScope guard(this);
5133    ITScope it_scope(this, &cond);
5134    umull(cond, rdlo, rdhi, rn, rm);
5135  }
5136  void Umull(Register rdlo, Register rdhi, Register rn, Register rm) {
5137    Umull(al, rdlo, rdhi, rn, rm);
5138  }
5139  void Umull(FlagsUpdate flags,
5140             Condition cond,
5141             Register rdlo,
5142             Register rdhi,
5143             Register rn,
5144             Register rm) {
5145    switch (flags) {
5146      case LeaveFlags:
5147        Umull(cond, rdlo, rdhi, rn, rm);
5148        break;
5149      case SetFlags:
5150        Umulls(cond, rdlo, rdhi, rn, rm);
5151        break;
5152      case DontCare:
5153        Umull(cond, rdlo, rdhi, rn, rm);
5154        break;
5155    }
5156  }
5157  void Umull(FlagsUpdate flags,
5158             Register rdlo,
5159             Register rdhi,
5160             Register rn,
5161             Register rm) {
5162    Umull(flags, al, rdlo, rdhi, rn, rm);
5163  }
5164
5165  void Umulls(
5166      Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
5167    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo));
5168    VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi));
5169    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5170    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5171    VIXL_ASSERT(allow_macro_instructions_);
5172    VIXL_ASSERT(OutsideITBlock());
5173    MacroEmissionCheckScope guard(this);
5174    ITScope it_scope(this, &cond);
5175    umulls(cond, rdlo, rdhi, rn, rm);
5176  }
5177  void Umulls(Register rdlo, Register rdhi, Register rn, Register rm) {
5178    Umulls(al, rdlo, rdhi, rn, rm);
5179  }
5180
5181  void Uqadd16(Condition cond, Register rd, Register rn, Register rm) {
5182    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5183    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5184    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5185    VIXL_ASSERT(allow_macro_instructions_);
5186    VIXL_ASSERT(OutsideITBlock());
5187    MacroEmissionCheckScope guard(this);
5188    ITScope it_scope(this, &cond);
5189    uqadd16(cond, rd, rn, rm);
5190  }
5191  void Uqadd16(Register rd, Register rn, Register rm) {
5192    Uqadd16(al, rd, rn, rm);
5193  }
5194
5195  void Uqadd8(Condition cond, Register rd, Register rn, Register rm) {
5196    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5197    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5198    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5199    VIXL_ASSERT(allow_macro_instructions_);
5200    VIXL_ASSERT(OutsideITBlock());
5201    MacroEmissionCheckScope guard(this);
5202    ITScope it_scope(this, &cond);
5203    uqadd8(cond, rd, rn, rm);
5204  }
5205  void Uqadd8(Register rd, Register rn, Register rm) { Uqadd8(al, rd, rn, rm); }
5206
5207  void Uqasx(Condition cond, Register rd, Register rn, Register rm) {
5208    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5209    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5210    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5211    VIXL_ASSERT(allow_macro_instructions_);
5212    VIXL_ASSERT(OutsideITBlock());
5213    MacroEmissionCheckScope guard(this);
5214    ITScope it_scope(this, &cond);
5215    uqasx(cond, rd, rn, rm);
5216  }
5217  void Uqasx(Register rd, Register rn, Register rm) { Uqasx(al, rd, rn, rm); }
5218
5219  void Uqsax(Condition cond, Register rd, Register rn, Register rm) {
5220    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5221    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5222    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5223    VIXL_ASSERT(allow_macro_instructions_);
5224    VIXL_ASSERT(OutsideITBlock());
5225    MacroEmissionCheckScope guard(this);
5226    ITScope it_scope(this, &cond);
5227    uqsax(cond, rd, rn, rm);
5228  }
5229  void Uqsax(Register rd, Register rn, Register rm) { Uqsax(al, rd, rn, rm); }
5230
5231  void Uqsub16(Condition cond, Register rd, Register rn, Register rm) {
5232    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5233    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5234    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5235    VIXL_ASSERT(allow_macro_instructions_);
5236    VIXL_ASSERT(OutsideITBlock());
5237    MacroEmissionCheckScope guard(this);
5238    ITScope it_scope(this, &cond);
5239    uqsub16(cond, rd, rn, rm);
5240  }
5241  void Uqsub16(Register rd, Register rn, Register rm) {
5242    Uqsub16(al, rd, rn, rm);
5243  }
5244
5245  void Uqsub8(Condition cond, Register rd, Register rn, Register rm) {
5246    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5247    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5248    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5249    VIXL_ASSERT(allow_macro_instructions_);
5250    VIXL_ASSERT(OutsideITBlock());
5251    MacroEmissionCheckScope guard(this);
5252    ITScope it_scope(this, &cond);
5253    uqsub8(cond, rd, rn, rm);
5254  }
5255  void Uqsub8(Register rd, Register rn, Register rm) { Uqsub8(al, rd, rn, rm); }
5256
5257  void Usad8(Condition cond, Register rd, Register rn, Register rm) {
5258    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5259    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5260    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5261    VIXL_ASSERT(allow_macro_instructions_);
5262    VIXL_ASSERT(OutsideITBlock());
5263    MacroEmissionCheckScope guard(this);
5264    ITScope it_scope(this, &cond);
5265    usad8(cond, rd, rn, rm);
5266  }
5267  void Usad8(Register rd, Register rn, Register rm) { Usad8(al, rd, rn, rm); }
5268
5269  void Usada8(
5270      Condition cond, Register rd, Register rn, Register rm, Register ra) {
5271    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5272    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5273    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5274    VIXL_ASSERT(!AliasesAvailableScratchRegister(ra));
5275    VIXL_ASSERT(allow_macro_instructions_);
5276    VIXL_ASSERT(OutsideITBlock());
5277    MacroEmissionCheckScope guard(this);
5278    ITScope it_scope(this, &cond);
5279    usada8(cond, rd, rn, rm, ra);
5280  }
5281  void Usada8(Register rd, Register rn, Register rm, Register ra) {
5282    Usada8(al, rd, rn, rm, ra);
5283  }
5284
5285  void Usat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
5286    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5287    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5288    VIXL_ASSERT(allow_macro_instructions_);
5289    VIXL_ASSERT(OutsideITBlock());
5290    MacroEmissionCheckScope guard(this);
5291    ITScope it_scope(this, &cond);
5292    usat(cond, rd, imm, operand);
5293  }
5294  void Usat(Register rd, uint32_t imm, const Operand& operand) {
5295    Usat(al, rd, imm, operand);
5296  }
5297
5298  void Usat16(Condition cond, Register rd, uint32_t imm, Register rn) {
5299    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5300    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5301    VIXL_ASSERT(allow_macro_instructions_);
5302    VIXL_ASSERT(OutsideITBlock());
5303    MacroEmissionCheckScope guard(this);
5304    ITScope it_scope(this, &cond);
5305    usat16(cond, rd, imm, rn);
5306  }
5307  void Usat16(Register rd, uint32_t imm, Register rn) {
5308    Usat16(al, rd, imm, rn);
5309  }
5310
5311  void Usax(Condition cond, Register rd, Register rn, Register rm) {
5312    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5313    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5314    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5315    VIXL_ASSERT(allow_macro_instructions_);
5316    VIXL_ASSERT(OutsideITBlock());
5317    MacroEmissionCheckScope guard(this);
5318    ITScope it_scope(this, &cond);
5319    usax(cond, rd, rn, rm);
5320  }
5321  void Usax(Register rd, Register rn, Register rm) { Usax(al, rd, rn, rm); }
5322
5323  void Usub16(Condition cond, Register rd, Register rn, Register rm) {
5324    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5325    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5326    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5327    VIXL_ASSERT(allow_macro_instructions_);
5328    VIXL_ASSERT(OutsideITBlock());
5329    MacroEmissionCheckScope guard(this);
5330    ITScope it_scope(this, &cond);
5331    usub16(cond, rd, rn, rm);
5332  }
5333  void Usub16(Register rd, Register rn, Register rm) { Usub16(al, rd, rn, rm); }
5334
5335  void Usub8(Condition cond, Register rd, Register rn, Register rm) {
5336    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5337    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5338    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5339    VIXL_ASSERT(allow_macro_instructions_);
5340    VIXL_ASSERT(OutsideITBlock());
5341    MacroEmissionCheckScope guard(this);
5342    ITScope it_scope(this, &cond);
5343    usub8(cond, rd, rn, rm);
5344  }
5345  void Usub8(Register rd, Register rn, Register rm) { Usub8(al, rd, rn, rm); }
5346
5347  void Uxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
5348    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5349    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5350    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5351    VIXL_ASSERT(allow_macro_instructions_);
5352    VIXL_ASSERT(OutsideITBlock());
5353    MacroEmissionCheckScope guard(this);
5354    ITScope it_scope(this, &cond);
5355    uxtab(cond, rd, rn, operand);
5356  }
5357  void Uxtab(Register rd, Register rn, const Operand& operand) {
5358    Uxtab(al, rd, rn, operand);
5359  }
5360
5361  void Uxtab16(Condition cond,
5362               Register rd,
5363               Register rn,
5364               const Operand& operand) {
5365    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5366    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5367    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5368    VIXL_ASSERT(allow_macro_instructions_);
5369    VIXL_ASSERT(OutsideITBlock());
5370    MacroEmissionCheckScope guard(this);
5371    ITScope it_scope(this, &cond);
5372    uxtab16(cond, rd, rn, operand);
5373  }
5374  void Uxtab16(Register rd, Register rn, const Operand& operand) {
5375    Uxtab16(al, rd, rn, operand);
5376  }
5377
5378  void Uxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
5379    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5380    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5381    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5382    VIXL_ASSERT(allow_macro_instructions_);
5383    VIXL_ASSERT(OutsideITBlock());
5384    MacroEmissionCheckScope guard(this);
5385    ITScope it_scope(this, &cond);
5386    uxtah(cond, rd, rn, operand);
5387  }
5388  void Uxtah(Register rd, Register rn, const Operand& operand) {
5389    Uxtah(al, rd, rn, operand);
5390  }
5391
5392  void Uxtb(Condition cond, Register rd, const Operand& operand) {
5393    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5394    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5395    VIXL_ASSERT(allow_macro_instructions_);
5396    VIXL_ASSERT(OutsideITBlock());
5397    MacroEmissionCheckScope guard(this);
5398    ITScope it_scope(this, &cond);
5399    uxtb(cond, rd, operand);
5400  }
5401  void Uxtb(Register rd, const Operand& operand) { Uxtb(al, rd, operand); }
5402
5403  void Uxtb16(Condition cond, Register rd, const Operand& operand) {
5404    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5405    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5406    VIXL_ASSERT(allow_macro_instructions_);
5407    VIXL_ASSERT(OutsideITBlock());
5408    MacroEmissionCheckScope guard(this);
5409    ITScope it_scope(this, &cond);
5410    uxtb16(cond, rd, operand);
5411  }
5412  void Uxtb16(Register rd, const Operand& operand) { Uxtb16(al, rd, operand); }
5413
5414  void Uxth(Condition cond, Register rd, const Operand& operand) {
5415    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5416    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5417    VIXL_ASSERT(allow_macro_instructions_);
5418    VIXL_ASSERT(OutsideITBlock());
5419    MacroEmissionCheckScope guard(this);
5420    ITScope it_scope(this, &cond);
5421    uxth(cond, rd, operand);
5422  }
5423  void Uxth(Register rd, const Operand& operand) { Uxth(al, rd, operand); }
5424
5425  void Vaba(
5426      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5427    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5428    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5429    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5430    VIXL_ASSERT(allow_macro_instructions_);
5431    VIXL_ASSERT(OutsideITBlock());
5432    MacroEmissionCheckScope guard(this);
5433    ITScope it_scope(this, &cond);
5434    vaba(cond, dt, rd, rn, rm);
5435  }
5436  void Vaba(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5437    Vaba(al, dt, rd, rn, rm);
5438  }
5439
5440  void Vaba(
5441      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5442    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5443    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5444    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5445    VIXL_ASSERT(allow_macro_instructions_);
5446    VIXL_ASSERT(OutsideITBlock());
5447    MacroEmissionCheckScope guard(this);
5448    ITScope it_scope(this, &cond);
5449    vaba(cond, dt, rd, rn, rm);
5450  }
5451  void Vaba(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5452    Vaba(al, dt, rd, rn, rm);
5453  }
5454
5455  void Vabal(
5456      Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5457    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5458    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5459    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5460    VIXL_ASSERT(allow_macro_instructions_);
5461    VIXL_ASSERT(OutsideITBlock());
5462    MacroEmissionCheckScope guard(this);
5463    ITScope it_scope(this, &cond);
5464    vabal(cond, dt, rd, rn, rm);
5465  }
5466  void Vabal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5467    Vabal(al, dt, rd, rn, rm);
5468  }
5469
5470  void Vabd(
5471      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5472    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5473    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5474    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5475    VIXL_ASSERT(allow_macro_instructions_);
5476    VIXL_ASSERT(OutsideITBlock());
5477    MacroEmissionCheckScope guard(this);
5478    ITScope it_scope(this, &cond);
5479    vabd(cond, dt, rd, rn, rm);
5480  }
5481  void Vabd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5482    Vabd(al, dt, rd, rn, rm);
5483  }
5484
5485  void Vabd(
5486      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5487    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5488    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5489    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5490    VIXL_ASSERT(allow_macro_instructions_);
5491    VIXL_ASSERT(OutsideITBlock());
5492    MacroEmissionCheckScope guard(this);
5493    ITScope it_scope(this, &cond);
5494    vabd(cond, dt, rd, rn, rm);
5495  }
5496  void Vabd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5497    Vabd(al, dt, rd, rn, rm);
5498  }
5499
5500  void Vabdl(
5501      Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5502    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5503    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5504    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5505    VIXL_ASSERT(allow_macro_instructions_);
5506    VIXL_ASSERT(OutsideITBlock());
5507    MacroEmissionCheckScope guard(this);
5508    ITScope it_scope(this, &cond);
5509    vabdl(cond, dt, rd, rn, rm);
5510  }
5511  void Vabdl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5512    Vabdl(al, dt, rd, rn, rm);
5513  }
5514
5515  void Vabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
5516    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5517    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5518    VIXL_ASSERT(allow_macro_instructions_);
5519    VIXL_ASSERT(OutsideITBlock());
5520    MacroEmissionCheckScope guard(this);
5521    ITScope it_scope(this, &cond);
5522    vabs(cond, dt, rd, rm);
5523  }
5524  void Vabs(DataType dt, DRegister rd, DRegister rm) { Vabs(al, dt, rd, rm); }
5525
5526  void Vabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
5527    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5528    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5529    VIXL_ASSERT(allow_macro_instructions_);
5530    VIXL_ASSERT(OutsideITBlock());
5531    MacroEmissionCheckScope guard(this);
5532    ITScope it_scope(this, &cond);
5533    vabs(cond, dt, rd, rm);
5534  }
5535  void Vabs(DataType dt, QRegister rd, QRegister rm) { Vabs(al, dt, rd, rm); }
5536
5537  void Vabs(Condition cond, DataType dt, SRegister rd, SRegister rm) {
5538    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5539    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5540    VIXL_ASSERT(allow_macro_instructions_);
5541    VIXL_ASSERT(OutsideITBlock());
5542    MacroEmissionCheckScope guard(this);
5543    ITScope it_scope(this, &cond);
5544    vabs(cond, dt, rd, rm);
5545  }
5546  void Vabs(DataType dt, SRegister rd, SRegister rm) { Vabs(al, dt, rd, rm); }
5547
5548  void Vacge(
5549      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5550    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5551    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5552    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5553    VIXL_ASSERT(allow_macro_instructions_);
5554    VIXL_ASSERT(OutsideITBlock());
5555    MacroEmissionCheckScope guard(this);
5556    ITScope it_scope(this, &cond);
5557    vacge(cond, dt, rd, rn, rm);
5558  }
5559  void Vacge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5560    Vacge(al, dt, rd, rn, rm);
5561  }
5562
5563  void Vacge(
5564      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5565    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5566    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5567    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5568    VIXL_ASSERT(allow_macro_instructions_);
5569    VIXL_ASSERT(OutsideITBlock());
5570    MacroEmissionCheckScope guard(this);
5571    ITScope it_scope(this, &cond);
5572    vacge(cond, dt, rd, rn, rm);
5573  }
5574  void Vacge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5575    Vacge(al, dt, rd, rn, rm);
5576  }
5577
5578  void Vacgt(
5579      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5580    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5581    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5582    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5583    VIXL_ASSERT(allow_macro_instructions_);
5584    VIXL_ASSERT(OutsideITBlock());
5585    MacroEmissionCheckScope guard(this);
5586    ITScope it_scope(this, &cond);
5587    vacgt(cond, dt, rd, rn, rm);
5588  }
5589  void Vacgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5590    Vacgt(al, dt, rd, rn, rm);
5591  }
5592
5593  void Vacgt(
5594      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5595    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5596    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5597    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5598    VIXL_ASSERT(allow_macro_instructions_);
5599    VIXL_ASSERT(OutsideITBlock());
5600    MacroEmissionCheckScope guard(this);
5601    ITScope it_scope(this, &cond);
5602    vacgt(cond, dt, rd, rn, rm);
5603  }
5604  void Vacgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5605    Vacgt(al, dt, rd, rn, rm);
5606  }
5607
5608  void Vacle(
5609      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5610    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5611    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5612    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5613    VIXL_ASSERT(allow_macro_instructions_);
5614    VIXL_ASSERT(OutsideITBlock());
5615    MacroEmissionCheckScope guard(this);
5616    ITScope it_scope(this, &cond);
5617    vacle(cond, dt, rd, rn, rm);
5618  }
5619  void Vacle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5620    Vacle(al, dt, rd, rn, rm);
5621  }
5622
5623  void Vacle(
5624      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5625    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5626    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5627    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5628    VIXL_ASSERT(allow_macro_instructions_);
5629    VIXL_ASSERT(OutsideITBlock());
5630    MacroEmissionCheckScope guard(this);
5631    ITScope it_scope(this, &cond);
5632    vacle(cond, dt, rd, rn, rm);
5633  }
5634  void Vacle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5635    Vacle(al, dt, rd, rn, rm);
5636  }
5637
5638  void Vaclt(
5639      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5640    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5641    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5642    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5643    VIXL_ASSERT(allow_macro_instructions_);
5644    VIXL_ASSERT(OutsideITBlock());
5645    MacroEmissionCheckScope guard(this);
5646    ITScope it_scope(this, &cond);
5647    vaclt(cond, dt, rd, rn, rm);
5648  }
5649  void Vaclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5650    Vaclt(al, dt, rd, rn, rm);
5651  }
5652
5653  void Vaclt(
5654      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5655    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5656    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5657    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5658    VIXL_ASSERT(allow_macro_instructions_);
5659    VIXL_ASSERT(OutsideITBlock());
5660    MacroEmissionCheckScope guard(this);
5661    ITScope it_scope(this, &cond);
5662    vaclt(cond, dt, rd, rn, rm);
5663  }
5664  void Vaclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5665    Vaclt(al, dt, rd, rn, rm);
5666  }
5667
5668  void Vadd(
5669      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5670    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5671    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5672    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5673    VIXL_ASSERT(allow_macro_instructions_);
5674    VIXL_ASSERT(OutsideITBlock());
5675    MacroEmissionCheckScope guard(this);
5676    ITScope it_scope(this, &cond);
5677    vadd(cond, dt, rd, rn, rm);
5678  }
5679  void Vadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5680    Vadd(al, dt, rd, rn, rm);
5681  }
5682
5683  void Vadd(
5684      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5685    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5686    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5687    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5688    VIXL_ASSERT(allow_macro_instructions_);
5689    VIXL_ASSERT(OutsideITBlock());
5690    MacroEmissionCheckScope guard(this);
5691    ITScope it_scope(this, &cond);
5692    vadd(cond, dt, rd, rn, rm);
5693  }
5694  void Vadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5695    Vadd(al, dt, rd, rn, rm);
5696  }
5697
5698  void Vadd(
5699      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5700    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5701    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5702    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5703    VIXL_ASSERT(allow_macro_instructions_);
5704    VIXL_ASSERT(OutsideITBlock());
5705    MacroEmissionCheckScope guard(this);
5706    ITScope it_scope(this, &cond);
5707    vadd(cond, dt, rd, rn, rm);
5708  }
5709  void Vadd(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
5710    Vadd(al, dt, rd, rn, rm);
5711  }
5712
5713  void Vaddhn(
5714      Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
5715    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5716    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5717    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5718    VIXL_ASSERT(allow_macro_instructions_);
5719    VIXL_ASSERT(OutsideITBlock());
5720    MacroEmissionCheckScope guard(this);
5721    ITScope it_scope(this, &cond);
5722    vaddhn(cond, dt, rd, rn, rm);
5723  }
5724  void Vaddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
5725    Vaddhn(al, dt, rd, rn, rm);
5726  }
5727
5728  void Vaddl(
5729      Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5730    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5731    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5732    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5733    VIXL_ASSERT(allow_macro_instructions_);
5734    VIXL_ASSERT(OutsideITBlock());
5735    MacroEmissionCheckScope guard(this);
5736    ITScope it_scope(this, &cond);
5737    vaddl(cond, dt, rd, rn, rm);
5738  }
5739  void Vaddl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
5740    Vaddl(al, dt, rd, rn, rm);
5741  }
5742
5743  void Vaddw(
5744      Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
5745    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5746    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5747    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5748    VIXL_ASSERT(allow_macro_instructions_);
5749    VIXL_ASSERT(OutsideITBlock());
5750    MacroEmissionCheckScope guard(this);
5751    ITScope it_scope(this, &cond);
5752    vaddw(cond, dt, rd, rn, rm);
5753  }
5754  void Vaddw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
5755    Vaddw(al, dt, rd, rn, rm);
5756  }
5757
5758  void Vand(Condition cond,
5759            DataType dt,
5760            DRegister rd,
5761            DRegister rn,
5762            const DOperand& operand) {
5763    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5764    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5765    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5766    VIXL_ASSERT(allow_macro_instructions_);
5767    VIXL_ASSERT(OutsideITBlock());
5768    MacroEmissionCheckScope guard(this);
5769    ITScope it_scope(this, &cond);
5770    vand(cond, dt, rd, rn, operand);
5771  }
5772  void Vand(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
5773    Vand(al, dt, rd, rn, operand);
5774  }
5775
5776  void Vand(Condition cond,
5777            DataType dt,
5778            QRegister rd,
5779            QRegister rn,
5780            const QOperand& operand) {
5781    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5782    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5783    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5784    VIXL_ASSERT(allow_macro_instructions_);
5785    VIXL_ASSERT(OutsideITBlock());
5786    MacroEmissionCheckScope guard(this);
5787    ITScope it_scope(this, &cond);
5788    vand(cond, dt, rd, rn, operand);
5789  }
5790  void Vand(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
5791    Vand(al, dt, rd, rn, operand);
5792  }
5793
5794  void Vbic(Condition cond,
5795            DataType dt,
5796            DRegister rd,
5797            DRegister rn,
5798            const DOperand& operand) {
5799    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5800    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5801    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5802    VIXL_ASSERT(allow_macro_instructions_);
5803    VIXL_ASSERT(OutsideITBlock());
5804    MacroEmissionCheckScope guard(this);
5805    ITScope it_scope(this, &cond);
5806    vbic(cond, dt, rd, rn, operand);
5807  }
5808  void Vbic(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
5809    Vbic(al, dt, rd, rn, operand);
5810  }
5811
5812  void Vbic(Condition cond,
5813            DataType dt,
5814            QRegister rd,
5815            QRegister rn,
5816            const QOperand& operand) {
5817    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5818    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5819    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5820    VIXL_ASSERT(allow_macro_instructions_);
5821    VIXL_ASSERT(OutsideITBlock());
5822    MacroEmissionCheckScope guard(this);
5823    ITScope it_scope(this, &cond);
5824    vbic(cond, dt, rd, rn, operand);
5825  }
5826  void Vbic(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
5827    Vbic(al, dt, rd, rn, operand);
5828  }
5829
5830  void Vbif(
5831      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5832    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5833    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5834    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5835    VIXL_ASSERT(allow_macro_instructions_);
5836    VIXL_ASSERT(OutsideITBlock());
5837    MacroEmissionCheckScope guard(this);
5838    ITScope it_scope(this, &cond);
5839    vbif(cond, dt, rd, rn, rm);
5840  }
5841  void Vbif(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5842    Vbif(al, dt, rd, rn, rm);
5843  }
5844  void Vbif(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5845    Vbif(cond, kDataTypeValueNone, rd, rn, rm);
5846  }
5847  void Vbif(DRegister rd, DRegister rn, DRegister rm) {
5848    Vbif(al, kDataTypeValueNone, rd, rn, rm);
5849  }
5850
5851  void Vbif(
5852      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5853    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5854    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5855    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5856    VIXL_ASSERT(allow_macro_instructions_);
5857    VIXL_ASSERT(OutsideITBlock());
5858    MacroEmissionCheckScope guard(this);
5859    ITScope it_scope(this, &cond);
5860    vbif(cond, dt, rd, rn, rm);
5861  }
5862  void Vbif(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5863    Vbif(al, dt, rd, rn, rm);
5864  }
5865  void Vbif(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5866    Vbif(cond, kDataTypeValueNone, rd, rn, rm);
5867  }
5868  void Vbif(QRegister rd, QRegister rn, QRegister rm) {
5869    Vbif(al, kDataTypeValueNone, rd, rn, rm);
5870  }
5871
5872  void Vbit(
5873      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5874    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5875    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5876    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5877    VIXL_ASSERT(allow_macro_instructions_);
5878    VIXL_ASSERT(OutsideITBlock());
5879    MacroEmissionCheckScope guard(this);
5880    ITScope it_scope(this, &cond);
5881    vbit(cond, dt, rd, rn, rm);
5882  }
5883  void Vbit(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5884    Vbit(al, dt, rd, rn, rm);
5885  }
5886  void Vbit(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5887    Vbit(cond, kDataTypeValueNone, rd, rn, rm);
5888  }
5889  void Vbit(DRegister rd, DRegister rn, DRegister rm) {
5890    Vbit(al, kDataTypeValueNone, rd, rn, rm);
5891  }
5892
5893  void Vbit(
5894      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5895    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5896    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5897    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5898    VIXL_ASSERT(allow_macro_instructions_);
5899    VIXL_ASSERT(OutsideITBlock());
5900    MacroEmissionCheckScope guard(this);
5901    ITScope it_scope(this, &cond);
5902    vbit(cond, dt, rd, rn, rm);
5903  }
5904  void Vbit(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5905    Vbit(al, dt, rd, rn, rm);
5906  }
5907  void Vbit(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5908    Vbit(cond, kDataTypeValueNone, rd, rn, rm);
5909  }
5910  void Vbit(QRegister rd, QRegister rn, QRegister rm) {
5911    Vbit(al, kDataTypeValueNone, rd, rn, rm);
5912  }
5913
5914  void Vbsl(
5915      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5916    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5917    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5918    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5919    VIXL_ASSERT(allow_macro_instructions_);
5920    VIXL_ASSERT(OutsideITBlock());
5921    MacroEmissionCheckScope guard(this);
5922    ITScope it_scope(this, &cond);
5923    vbsl(cond, dt, rd, rn, rm);
5924  }
5925  void Vbsl(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5926    Vbsl(al, dt, rd, rn, rm);
5927  }
5928  void Vbsl(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
5929    Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
5930  }
5931  void Vbsl(DRegister rd, DRegister rn, DRegister rm) {
5932    Vbsl(al, kDataTypeValueNone, rd, rn, rm);
5933  }
5934
5935  void Vbsl(
5936      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5937    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5938    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5939    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5940    VIXL_ASSERT(allow_macro_instructions_);
5941    VIXL_ASSERT(OutsideITBlock());
5942    MacroEmissionCheckScope guard(this);
5943    ITScope it_scope(this, &cond);
5944    vbsl(cond, dt, rd, rn, rm);
5945  }
5946  void Vbsl(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
5947    Vbsl(al, dt, rd, rn, rm);
5948  }
5949  void Vbsl(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
5950    Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
5951  }
5952  void Vbsl(QRegister rd, QRegister rn, QRegister rm) {
5953    Vbsl(al, kDataTypeValueNone, rd, rn, rm);
5954  }
5955
5956  void Vceq(Condition cond,
5957            DataType dt,
5958            DRegister rd,
5959            DRegister rm,
5960            const DOperand& operand) {
5961    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5962    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5963    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5964    VIXL_ASSERT(allow_macro_instructions_);
5965    VIXL_ASSERT(OutsideITBlock());
5966    MacroEmissionCheckScope guard(this);
5967    ITScope it_scope(this, &cond);
5968    vceq(cond, dt, rd, rm, operand);
5969  }
5970  void Vceq(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
5971    Vceq(al, dt, rd, rm, operand);
5972  }
5973
5974  void Vceq(Condition cond,
5975            DataType dt,
5976            QRegister rd,
5977            QRegister rm,
5978            const QOperand& operand) {
5979    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5980    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5981    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
5982    VIXL_ASSERT(allow_macro_instructions_);
5983    VIXL_ASSERT(OutsideITBlock());
5984    MacroEmissionCheckScope guard(this);
5985    ITScope it_scope(this, &cond);
5986    vceq(cond, dt, rd, rm, operand);
5987  }
5988  void Vceq(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
5989    Vceq(al, dt, rd, rm, operand);
5990  }
5991
5992  void Vceq(
5993      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
5994    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
5995    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
5996    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
5997    VIXL_ASSERT(allow_macro_instructions_);
5998    VIXL_ASSERT(OutsideITBlock());
5999    MacroEmissionCheckScope guard(this);
6000    ITScope it_scope(this, &cond);
6001    vceq(cond, dt, rd, rn, rm);
6002  }
6003  void Vceq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6004    Vceq(al, dt, rd, rn, rm);
6005  }
6006
6007  void Vceq(
6008      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6009    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6010    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6011    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6012    VIXL_ASSERT(allow_macro_instructions_);
6013    VIXL_ASSERT(OutsideITBlock());
6014    MacroEmissionCheckScope guard(this);
6015    ITScope it_scope(this, &cond);
6016    vceq(cond, dt, rd, rn, rm);
6017  }
6018  void Vceq(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6019    Vceq(al, dt, rd, rn, rm);
6020  }
6021
6022  void Vcge(Condition cond,
6023            DataType dt,
6024            DRegister rd,
6025            DRegister rm,
6026            const DOperand& operand) {
6027    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6028    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6029    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6030    VIXL_ASSERT(allow_macro_instructions_);
6031    VIXL_ASSERT(OutsideITBlock());
6032    MacroEmissionCheckScope guard(this);
6033    ITScope it_scope(this, &cond);
6034    vcge(cond, dt, rd, rm, operand);
6035  }
6036  void Vcge(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6037    Vcge(al, dt, rd, rm, operand);
6038  }
6039
6040  void Vcge(Condition cond,
6041            DataType dt,
6042            QRegister rd,
6043            QRegister rm,
6044            const QOperand& operand) {
6045    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6046    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6047    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6048    VIXL_ASSERT(allow_macro_instructions_);
6049    VIXL_ASSERT(OutsideITBlock());
6050    MacroEmissionCheckScope guard(this);
6051    ITScope it_scope(this, &cond);
6052    vcge(cond, dt, rd, rm, operand);
6053  }
6054  void Vcge(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6055    Vcge(al, dt, rd, rm, operand);
6056  }
6057
6058  void Vcge(
6059      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6060    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6061    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6062    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6063    VIXL_ASSERT(allow_macro_instructions_);
6064    VIXL_ASSERT(OutsideITBlock());
6065    MacroEmissionCheckScope guard(this);
6066    ITScope it_scope(this, &cond);
6067    vcge(cond, dt, rd, rn, rm);
6068  }
6069  void Vcge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6070    Vcge(al, dt, rd, rn, rm);
6071  }
6072
6073  void Vcge(
6074      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6075    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6076    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6077    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6078    VIXL_ASSERT(allow_macro_instructions_);
6079    VIXL_ASSERT(OutsideITBlock());
6080    MacroEmissionCheckScope guard(this);
6081    ITScope it_scope(this, &cond);
6082    vcge(cond, dt, rd, rn, rm);
6083  }
6084  void Vcge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6085    Vcge(al, dt, rd, rn, rm);
6086  }
6087
6088  void Vcgt(Condition cond,
6089            DataType dt,
6090            DRegister rd,
6091            DRegister rm,
6092            const DOperand& operand) {
6093    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6094    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6095    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6096    VIXL_ASSERT(allow_macro_instructions_);
6097    VIXL_ASSERT(OutsideITBlock());
6098    MacroEmissionCheckScope guard(this);
6099    ITScope it_scope(this, &cond);
6100    vcgt(cond, dt, rd, rm, operand);
6101  }
6102  void Vcgt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6103    Vcgt(al, dt, rd, rm, operand);
6104  }
6105
6106  void Vcgt(Condition cond,
6107            DataType dt,
6108            QRegister rd,
6109            QRegister rm,
6110            const QOperand& operand) {
6111    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6112    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6113    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6114    VIXL_ASSERT(allow_macro_instructions_);
6115    VIXL_ASSERT(OutsideITBlock());
6116    MacroEmissionCheckScope guard(this);
6117    ITScope it_scope(this, &cond);
6118    vcgt(cond, dt, rd, rm, operand);
6119  }
6120  void Vcgt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6121    Vcgt(al, dt, rd, rm, operand);
6122  }
6123
6124  void Vcgt(
6125      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6126    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6127    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6128    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6129    VIXL_ASSERT(allow_macro_instructions_);
6130    VIXL_ASSERT(OutsideITBlock());
6131    MacroEmissionCheckScope guard(this);
6132    ITScope it_scope(this, &cond);
6133    vcgt(cond, dt, rd, rn, rm);
6134  }
6135  void Vcgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6136    Vcgt(al, dt, rd, rn, rm);
6137  }
6138
6139  void Vcgt(
6140      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6141    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6142    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6143    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6144    VIXL_ASSERT(allow_macro_instructions_);
6145    VIXL_ASSERT(OutsideITBlock());
6146    MacroEmissionCheckScope guard(this);
6147    ITScope it_scope(this, &cond);
6148    vcgt(cond, dt, rd, rn, rm);
6149  }
6150  void Vcgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6151    Vcgt(al, dt, rd, rn, rm);
6152  }
6153
6154  void Vcle(Condition cond,
6155            DataType dt,
6156            DRegister rd,
6157            DRegister rm,
6158            const DOperand& operand) {
6159    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6160    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6161    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6162    VIXL_ASSERT(allow_macro_instructions_);
6163    VIXL_ASSERT(OutsideITBlock());
6164    MacroEmissionCheckScope guard(this);
6165    ITScope it_scope(this, &cond);
6166    vcle(cond, dt, rd, rm, operand);
6167  }
6168  void Vcle(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6169    Vcle(al, dt, rd, rm, operand);
6170  }
6171
6172  void Vcle(Condition cond,
6173            DataType dt,
6174            QRegister rd,
6175            QRegister rm,
6176            const QOperand& operand) {
6177    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6178    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6179    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6180    VIXL_ASSERT(allow_macro_instructions_);
6181    VIXL_ASSERT(OutsideITBlock());
6182    MacroEmissionCheckScope guard(this);
6183    ITScope it_scope(this, &cond);
6184    vcle(cond, dt, rd, rm, operand);
6185  }
6186  void Vcle(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6187    Vcle(al, dt, rd, rm, operand);
6188  }
6189
6190  void Vcle(
6191      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6192    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6193    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6194    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6195    VIXL_ASSERT(allow_macro_instructions_);
6196    VIXL_ASSERT(OutsideITBlock());
6197    MacroEmissionCheckScope guard(this);
6198    ITScope it_scope(this, &cond);
6199    vcle(cond, dt, rd, rn, rm);
6200  }
6201  void Vcle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6202    Vcle(al, dt, rd, rn, rm);
6203  }
6204
6205  void Vcle(
6206      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6207    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6208    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6209    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6210    VIXL_ASSERT(allow_macro_instructions_);
6211    VIXL_ASSERT(OutsideITBlock());
6212    MacroEmissionCheckScope guard(this);
6213    ITScope it_scope(this, &cond);
6214    vcle(cond, dt, rd, rn, rm);
6215  }
6216  void Vcle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6217    Vcle(al, dt, rd, rn, rm);
6218  }
6219
6220  void Vcls(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6221    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6222    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6223    VIXL_ASSERT(allow_macro_instructions_);
6224    VIXL_ASSERT(OutsideITBlock());
6225    MacroEmissionCheckScope guard(this);
6226    ITScope it_scope(this, &cond);
6227    vcls(cond, dt, rd, rm);
6228  }
6229  void Vcls(DataType dt, DRegister rd, DRegister rm) { Vcls(al, dt, rd, rm); }
6230
6231  void Vcls(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6232    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6233    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6234    VIXL_ASSERT(allow_macro_instructions_);
6235    VIXL_ASSERT(OutsideITBlock());
6236    MacroEmissionCheckScope guard(this);
6237    ITScope it_scope(this, &cond);
6238    vcls(cond, dt, rd, rm);
6239  }
6240  void Vcls(DataType dt, QRegister rd, QRegister rm) { Vcls(al, dt, rd, rm); }
6241
6242  void Vclt(Condition cond,
6243            DataType dt,
6244            DRegister rd,
6245            DRegister rm,
6246            const DOperand& operand) {
6247    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6248    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6249    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6250    VIXL_ASSERT(allow_macro_instructions_);
6251    VIXL_ASSERT(OutsideITBlock());
6252    MacroEmissionCheckScope guard(this);
6253    ITScope it_scope(this, &cond);
6254    vclt(cond, dt, rd, rm, operand);
6255  }
6256  void Vclt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
6257    Vclt(al, dt, rd, rm, operand);
6258  }
6259
6260  void Vclt(Condition cond,
6261            DataType dt,
6262            QRegister rd,
6263            QRegister rm,
6264            const QOperand& operand) {
6265    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6266    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6267    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6268    VIXL_ASSERT(allow_macro_instructions_);
6269    VIXL_ASSERT(OutsideITBlock());
6270    MacroEmissionCheckScope guard(this);
6271    ITScope it_scope(this, &cond);
6272    vclt(cond, dt, rd, rm, operand);
6273  }
6274  void Vclt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
6275    Vclt(al, dt, rd, rm, operand);
6276  }
6277
6278  void Vclt(
6279      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6280    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6281    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6282    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6283    VIXL_ASSERT(allow_macro_instructions_);
6284    VIXL_ASSERT(OutsideITBlock());
6285    MacroEmissionCheckScope guard(this);
6286    ITScope it_scope(this, &cond);
6287    vclt(cond, dt, rd, rn, rm);
6288  }
6289  void Vclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6290    Vclt(al, dt, rd, rn, rm);
6291  }
6292
6293  void Vclt(
6294      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6295    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6296    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6297    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6298    VIXL_ASSERT(allow_macro_instructions_);
6299    VIXL_ASSERT(OutsideITBlock());
6300    MacroEmissionCheckScope guard(this);
6301    ITScope it_scope(this, &cond);
6302    vclt(cond, dt, rd, rn, rm);
6303  }
6304  void Vclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6305    Vclt(al, dt, rd, rn, rm);
6306  }
6307
6308  void Vclz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6309    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6310    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6311    VIXL_ASSERT(allow_macro_instructions_);
6312    VIXL_ASSERT(OutsideITBlock());
6313    MacroEmissionCheckScope guard(this);
6314    ITScope it_scope(this, &cond);
6315    vclz(cond, dt, rd, rm);
6316  }
6317  void Vclz(DataType dt, DRegister rd, DRegister rm) { Vclz(al, dt, rd, rm); }
6318
6319  void Vclz(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6320    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6321    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6322    VIXL_ASSERT(allow_macro_instructions_);
6323    VIXL_ASSERT(OutsideITBlock());
6324    MacroEmissionCheckScope guard(this);
6325    ITScope it_scope(this, &cond);
6326    vclz(cond, dt, rd, rm);
6327  }
6328  void Vclz(DataType dt, QRegister rd, QRegister rm) { Vclz(al, dt, rd, rm); }
6329
6330  void Vcmp(Condition cond, DataType dt, SRegister rd, SRegister rm) {
6331    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6332    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6333    VIXL_ASSERT(allow_macro_instructions_);
6334    VIXL_ASSERT(OutsideITBlock());
6335    MacroEmissionCheckScope guard(this);
6336    ITScope it_scope(this, &cond);
6337    vcmp(cond, dt, rd, rm);
6338  }
6339  void Vcmp(DataType dt, SRegister rd, SRegister rm) { Vcmp(al, dt, rd, rm); }
6340
6341  void Vcmp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6342    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6343    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6344    VIXL_ASSERT(allow_macro_instructions_);
6345    VIXL_ASSERT(OutsideITBlock());
6346    MacroEmissionCheckScope guard(this);
6347    ITScope it_scope(this, &cond);
6348    vcmp(cond, dt, rd, rm);
6349  }
6350  void Vcmp(DataType dt, DRegister rd, DRegister rm) { Vcmp(al, dt, rd, rm); }
6351
6352  void Vcmp(Condition cond, DataType dt, SRegister rd, double imm) {
6353    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6354    VIXL_ASSERT(allow_macro_instructions_);
6355    VIXL_ASSERT(OutsideITBlock());
6356    MacroEmissionCheckScope guard(this);
6357    ITScope it_scope(this, &cond);
6358    vcmp(cond, dt, rd, imm);
6359  }
6360  void Vcmp(DataType dt, SRegister rd, double imm) { Vcmp(al, dt, rd, imm); }
6361
6362  void Vcmp(Condition cond, DataType dt, DRegister rd, double imm) {
6363    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6364    VIXL_ASSERT(allow_macro_instructions_);
6365    VIXL_ASSERT(OutsideITBlock());
6366    MacroEmissionCheckScope guard(this);
6367    ITScope it_scope(this, &cond);
6368    vcmp(cond, dt, rd, imm);
6369  }
6370  void Vcmp(DataType dt, DRegister rd, double imm) { Vcmp(al, dt, rd, imm); }
6371
6372  void Vcmpe(Condition cond, DataType dt, SRegister rd, SRegister rm) {
6373    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6374    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6375    VIXL_ASSERT(allow_macro_instructions_);
6376    VIXL_ASSERT(OutsideITBlock());
6377    MacroEmissionCheckScope guard(this);
6378    ITScope it_scope(this, &cond);
6379    vcmpe(cond, dt, rd, rm);
6380  }
6381  void Vcmpe(DataType dt, SRegister rd, SRegister rm) { Vcmpe(al, dt, rd, rm); }
6382
6383  void Vcmpe(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6384    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6385    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6386    VIXL_ASSERT(allow_macro_instructions_);
6387    VIXL_ASSERT(OutsideITBlock());
6388    MacroEmissionCheckScope guard(this);
6389    ITScope it_scope(this, &cond);
6390    vcmpe(cond, dt, rd, rm);
6391  }
6392  void Vcmpe(DataType dt, DRegister rd, DRegister rm) { Vcmpe(al, dt, rd, rm); }
6393
6394  void Vcmpe(Condition cond, DataType dt, SRegister rd, double imm) {
6395    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6396    VIXL_ASSERT(allow_macro_instructions_);
6397    VIXL_ASSERT(OutsideITBlock());
6398    MacroEmissionCheckScope guard(this);
6399    ITScope it_scope(this, &cond);
6400    vcmpe(cond, dt, rd, imm);
6401  }
6402  void Vcmpe(DataType dt, SRegister rd, double imm) { Vcmpe(al, dt, rd, imm); }
6403
6404  void Vcmpe(Condition cond, DataType dt, DRegister rd, double imm) {
6405    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6406    VIXL_ASSERT(allow_macro_instructions_);
6407    VIXL_ASSERT(OutsideITBlock());
6408    MacroEmissionCheckScope guard(this);
6409    ITScope it_scope(this, &cond);
6410    vcmpe(cond, dt, rd, imm);
6411  }
6412  void Vcmpe(DataType dt, DRegister rd, double imm) { Vcmpe(al, dt, rd, imm); }
6413
6414  void Vcnt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
6415    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6416    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6417    VIXL_ASSERT(allow_macro_instructions_);
6418    VIXL_ASSERT(OutsideITBlock());
6419    MacroEmissionCheckScope guard(this);
6420    ITScope it_scope(this, &cond);
6421    vcnt(cond, dt, rd, rm);
6422  }
6423  void Vcnt(DataType dt, DRegister rd, DRegister rm) { Vcnt(al, dt, rd, rm); }
6424
6425  void Vcnt(Condition cond, DataType dt, QRegister rd, QRegister rm) {
6426    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6427    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6428    VIXL_ASSERT(allow_macro_instructions_);
6429    VIXL_ASSERT(OutsideITBlock());
6430    MacroEmissionCheckScope guard(this);
6431    ITScope it_scope(this, &cond);
6432    vcnt(cond, dt, rd, rm);
6433  }
6434  void Vcnt(DataType dt, QRegister rd, QRegister rm) { Vcnt(al, dt, rd, rm); }
6435
6436  void Vcvt(
6437      Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6438    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6439    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6440    VIXL_ASSERT(allow_macro_instructions_);
6441    VIXL_ASSERT(OutsideITBlock());
6442    MacroEmissionCheckScope guard(this);
6443    ITScope it_scope(this, &cond);
6444    vcvt(cond, dt1, dt2, rd, rm);
6445  }
6446  void Vcvt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6447    Vcvt(al, dt1, dt2, rd, rm);
6448  }
6449
6450  void Vcvt(
6451      Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6452    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6453    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6454    VIXL_ASSERT(allow_macro_instructions_);
6455    VIXL_ASSERT(OutsideITBlock());
6456    MacroEmissionCheckScope guard(this);
6457    ITScope it_scope(this, &cond);
6458    vcvt(cond, dt1, dt2, rd, rm);
6459  }
6460  void Vcvt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6461    Vcvt(al, dt1, dt2, rd, rm);
6462  }
6463
6464  void Vcvt(Condition cond,
6465            DataType dt1,
6466            DataType dt2,
6467            DRegister rd,
6468            DRegister rm,
6469            int32_t fbits) {
6470    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6471    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6472    VIXL_ASSERT(allow_macro_instructions_);
6473    VIXL_ASSERT(OutsideITBlock());
6474    MacroEmissionCheckScope guard(this);
6475    ITScope it_scope(this, &cond);
6476    vcvt(cond, dt1, dt2, rd, rm, fbits);
6477  }
6478  void Vcvt(
6479      DataType dt1, DataType dt2, DRegister rd, DRegister rm, int32_t fbits) {
6480    Vcvt(al, dt1, dt2, rd, rm, fbits);
6481  }
6482
6483  void Vcvt(Condition cond,
6484            DataType dt1,
6485            DataType dt2,
6486            QRegister rd,
6487            QRegister rm,
6488            int32_t fbits) {
6489    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6490    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6491    VIXL_ASSERT(allow_macro_instructions_);
6492    VIXL_ASSERT(OutsideITBlock());
6493    MacroEmissionCheckScope guard(this);
6494    ITScope it_scope(this, &cond);
6495    vcvt(cond, dt1, dt2, rd, rm, fbits);
6496  }
6497  void Vcvt(
6498      DataType dt1, DataType dt2, QRegister rd, QRegister rm, int32_t fbits) {
6499    Vcvt(al, dt1, dt2, rd, rm, fbits);
6500  }
6501
6502  void Vcvt(Condition cond,
6503            DataType dt1,
6504            DataType dt2,
6505            SRegister rd,
6506            SRegister rm,
6507            int32_t fbits) {
6508    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6509    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6510    VIXL_ASSERT(allow_macro_instructions_);
6511    VIXL_ASSERT(OutsideITBlock());
6512    MacroEmissionCheckScope guard(this);
6513    ITScope it_scope(this, &cond);
6514    vcvt(cond, dt1, dt2, rd, rm, fbits);
6515  }
6516  void Vcvt(
6517      DataType dt1, DataType dt2, SRegister rd, SRegister rm, int32_t fbits) {
6518    Vcvt(al, dt1, dt2, rd, rm, fbits);
6519  }
6520
6521  void Vcvt(
6522      Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6523    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6524    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6525    VIXL_ASSERT(allow_macro_instructions_);
6526    VIXL_ASSERT(OutsideITBlock());
6527    MacroEmissionCheckScope guard(this);
6528    ITScope it_scope(this, &cond);
6529    vcvt(cond, dt1, dt2, rd, rm);
6530  }
6531  void Vcvt(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6532    Vcvt(al, dt1, dt2, rd, rm);
6533  }
6534
6535  void Vcvt(
6536      Condition cond, DataType dt1, DataType dt2, 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    ITScope it_scope(this, &cond);
6543    vcvt(cond, dt1, dt2, rd, rm);
6544  }
6545  void Vcvt(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6546    Vcvt(al, dt1, dt2, rd, rm);
6547  }
6548
6549  void Vcvt(
6550      Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
6551    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6552    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6553    VIXL_ASSERT(allow_macro_instructions_);
6554    VIXL_ASSERT(OutsideITBlock());
6555    MacroEmissionCheckScope guard(this);
6556    ITScope it_scope(this, &cond);
6557    vcvt(cond, dt1, dt2, rd, rm);
6558  }
6559  void Vcvt(DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
6560    Vcvt(al, dt1, dt2, rd, rm);
6561  }
6562
6563  void Vcvt(
6564      Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
6565    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6566    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6567    VIXL_ASSERT(allow_macro_instructions_);
6568    VIXL_ASSERT(OutsideITBlock());
6569    MacroEmissionCheckScope guard(this);
6570    ITScope it_scope(this, &cond);
6571    vcvt(cond, dt1, dt2, rd, rm);
6572  }
6573  void Vcvt(DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
6574    Vcvt(al, dt1, dt2, rd, rm);
6575  }
6576
6577  void Vcvt(
6578      Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6579    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6580    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6581    VIXL_ASSERT(allow_macro_instructions_);
6582    VIXL_ASSERT(OutsideITBlock());
6583    MacroEmissionCheckScope guard(this);
6584    ITScope it_scope(this, &cond);
6585    vcvt(cond, dt1, dt2, rd, rm);
6586  }
6587  void Vcvt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6588    Vcvt(al, dt1, dt2, rd, rm);
6589  }
6590
6591  void Vcvta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6592    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6593    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6594    VIXL_ASSERT(allow_macro_instructions_);
6595    VIXL_ASSERT(OutsideITBlock());
6596    MacroEmissionCheckScope guard(this);
6597    vcvta(dt1, dt2, rd, rm);
6598  }
6599
6600  void Vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6601    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6602    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6603    VIXL_ASSERT(allow_macro_instructions_);
6604    VIXL_ASSERT(OutsideITBlock());
6605    MacroEmissionCheckScope guard(this);
6606    vcvta(dt1, dt2, rd, rm);
6607  }
6608
6609  void Vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6610    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6611    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6612    VIXL_ASSERT(allow_macro_instructions_);
6613    VIXL_ASSERT(OutsideITBlock());
6614    MacroEmissionCheckScope guard(this);
6615    vcvta(dt1, dt2, rd, rm);
6616  }
6617
6618  void Vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6619    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6620    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6621    VIXL_ASSERT(allow_macro_instructions_);
6622    VIXL_ASSERT(OutsideITBlock());
6623    MacroEmissionCheckScope guard(this);
6624    vcvta(dt1, dt2, rd, rm);
6625  }
6626
6627  void Vcvtb(
6628      Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6629    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6630    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6631    VIXL_ASSERT(allow_macro_instructions_);
6632    VIXL_ASSERT(OutsideITBlock());
6633    MacroEmissionCheckScope guard(this);
6634    ITScope it_scope(this, &cond);
6635    vcvtb(cond, dt1, dt2, rd, rm);
6636  }
6637  void Vcvtb(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6638    Vcvtb(al, dt1, dt2, rd, rm);
6639  }
6640
6641  void Vcvtb(
6642      Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6643    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6644    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6645    VIXL_ASSERT(allow_macro_instructions_);
6646    VIXL_ASSERT(OutsideITBlock());
6647    MacroEmissionCheckScope guard(this);
6648    ITScope it_scope(this, &cond);
6649    vcvtb(cond, dt1, dt2, rd, rm);
6650  }
6651  void Vcvtb(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6652    Vcvtb(al, dt1, dt2, rd, rm);
6653  }
6654
6655  void Vcvtb(
6656      Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6657    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6658    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6659    VIXL_ASSERT(allow_macro_instructions_);
6660    VIXL_ASSERT(OutsideITBlock());
6661    MacroEmissionCheckScope guard(this);
6662    ITScope it_scope(this, &cond);
6663    vcvtb(cond, dt1, dt2, rd, rm);
6664  }
6665  void Vcvtb(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6666    Vcvtb(al, dt1, dt2, rd, rm);
6667  }
6668
6669  void Vcvtm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6670    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6671    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6672    VIXL_ASSERT(allow_macro_instructions_);
6673    VIXL_ASSERT(OutsideITBlock());
6674    MacroEmissionCheckScope guard(this);
6675    vcvtm(dt1, dt2, rd, rm);
6676  }
6677
6678  void Vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6679    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6680    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6681    VIXL_ASSERT(allow_macro_instructions_);
6682    VIXL_ASSERT(OutsideITBlock());
6683    MacroEmissionCheckScope guard(this);
6684    vcvtm(dt1, dt2, rd, rm);
6685  }
6686
6687  void Vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6688    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6689    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6690    VIXL_ASSERT(allow_macro_instructions_);
6691    VIXL_ASSERT(OutsideITBlock());
6692    MacroEmissionCheckScope guard(this);
6693    vcvtm(dt1, dt2, rd, rm);
6694  }
6695
6696  void Vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6697    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6698    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6699    VIXL_ASSERT(allow_macro_instructions_);
6700    VIXL_ASSERT(OutsideITBlock());
6701    MacroEmissionCheckScope guard(this);
6702    vcvtm(dt1, dt2, rd, rm);
6703  }
6704
6705  void Vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6706    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6707    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6708    VIXL_ASSERT(allow_macro_instructions_);
6709    VIXL_ASSERT(OutsideITBlock());
6710    MacroEmissionCheckScope guard(this);
6711    vcvtn(dt1, dt2, rd, rm);
6712  }
6713
6714  void Vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6715    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6716    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6717    VIXL_ASSERT(allow_macro_instructions_);
6718    VIXL_ASSERT(OutsideITBlock());
6719    MacroEmissionCheckScope guard(this);
6720    vcvtn(dt1, dt2, rd, rm);
6721  }
6722
6723  void Vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6724    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6725    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6726    VIXL_ASSERT(allow_macro_instructions_);
6727    VIXL_ASSERT(OutsideITBlock());
6728    MacroEmissionCheckScope guard(this);
6729    vcvtn(dt1, dt2, rd, rm);
6730  }
6731
6732  void Vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6733    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6734    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6735    VIXL_ASSERT(allow_macro_instructions_);
6736    VIXL_ASSERT(OutsideITBlock());
6737    MacroEmissionCheckScope guard(this);
6738    vcvtn(dt1, dt2, rd, rm);
6739  }
6740
6741  void Vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
6742    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6743    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6744    VIXL_ASSERT(allow_macro_instructions_);
6745    VIXL_ASSERT(OutsideITBlock());
6746    MacroEmissionCheckScope guard(this);
6747    vcvtp(dt1, dt2, rd, rm);
6748  }
6749
6750  void Vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
6751    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6752    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6753    VIXL_ASSERT(allow_macro_instructions_);
6754    VIXL_ASSERT(OutsideITBlock());
6755    MacroEmissionCheckScope guard(this);
6756    vcvtp(dt1, dt2, rd, rm);
6757  }
6758
6759  void Vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6760    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6761    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6762    VIXL_ASSERT(allow_macro_instructions_);
6763    VIXL_ASSERT(OutsideITBlock());
6764    MacroEmissionCheckScope guard(this);
6765    vcvtp(dt1, dt2, rd, rm);
6766  }
6767
6768  void Vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6769    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6770    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6771    VIXL_ASSERT(allow_macro_instructions_);
6772    VIXL_ASSERT(OutsideITBlock());
6773    MacroEmissionCheckScope guard(this);
6774    vcvtp(dt1, dt2, rd, rm);
6775  }
6776
6777  void Vcvtr(
6778      Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6779    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6780    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6781    VIXL_ASSERT(allow_macro_instructions_);
6782    VIXL_ASSERT(OutsideITBlock());
6783    MacroEmissionCheckScope guard(this);
6784    ITScope it_scope(this, &cond);
6785    vcvtr(cond, dt1, dt2, rd, rm);
6786  }
6787  void Vcvtr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6788    Vcvtr(al, dt1, dt2, rd, rm);
6789  }
6790
6791  void Vcvtr(
6792      Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6793    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6794    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6795    VIXL_ASSERT(allow_macro_instructions_);
6796    VIXL_ASSERT(OutsideITBlock());
6797    MacroEmissionCheckScope guard(this);
6798    ITScope it_scope(this, &cond);
6799    vcvtr(cond, dt1, dt2, rd, rm);
6800  }
6801  void Vcvtr(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6802    Vcvtr(al, dt1, dt2, rd, rm);
6803  }
6804
6805  void Vcvtt(
6806      Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6807    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6808    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6809    VIXL_ASSERT(allow_macro_instructions_);
6810    VIXL_ASSERT(OutsideITBlock());
6811    MacroEmissionCheckScope guard(this);
6812    ITScope it_scope(this, &cond);
6813    vcvtt(cond, dt1, dt2, rd, rm);
6814  }
6815  void Vcvtt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
6816    Vcvtt(al, dt1, dt2, rd, rm);
6817  }
6818
6819  void Vcvtt(
6820      Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6821    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6822    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6823    VIXL_ASSERT(allow_macro_instructions_);
6824    VIXL_ASSERT(OutsideITBlock());
6825    MacroEmissionCheckScope guard(this);
6826    ITScope it_scope(this, &cond);
6827    vcvtt(cond, dt1, dt2, rd, rm);
6828  }
6829  void Vcvtt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
6830    Vcvtt(al, dt1, dt2, rd, rm);
6831  }
6832
6833  void Vcvtt(
6834      Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6835    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6836    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6837    VIXL_ASSERT(allow_macro_instructions_);
6838    VIXL_ASSERT(OutsideITBlock());
6839    MacroEmissionCheckScope guard(this);
6840    ITScope it_scope(this, &cond);
6841    vcvtt(cond, dt1, dt2, rd, rm);
6842  }
6843  void Vcvtt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
6844    Vcvtt(al, dt1, dt2, rd, rm);
6845  }
6846
6847  void Vdiv(
6848      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6849    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6850    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6851    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6852    VIXL_ASSERT(allow_macro_instructions_);
6853    VIXL_ASSERT(OutsideITBlock());
6854    MacroEmissionCheckScope guard(this);
6855    ITScope it_scope(this, &cond);
6856    vdiv(cond, dt, rd, rn, rm);
6857  }
6858  void Vdiv(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
6859    Vdiv(al, dt, rd, rn, rm);
6860  }
6861
6862  void Vdiv(
6863      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6864    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6865    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6866    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6867    VIXL_ASSERT(allow_macro_instructions_);
6868    VIXL_ASSERT(OutsideITBlock());
6869    MacroEmissionCheckScope guard(this);
6870    ITScope it_scope(this, &cond);
6871    vdiv(cond, dt, rd, rn, rm);
6872  }
6873  void Vdiv(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6874    Vdiv(al, dt, rd, rn, rm);
6875  }
6876
6877  void Vdup(Condition cond, DataType dt, QRegister rd, Register rt) {
6878    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6879    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
6880    VIXL_ASSERT(allow_macro_instructions_);
6881    VIXL_ASSERT(OutsideITBlock());
6882    MacroEmissionCheckScope guard(this);
6883    ITScope it_scope(this, &cond);
6884    vdup(cond, dt, rd, rt);
6885  }
6886  void Vdup(DataType dt, QRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
6887
6888  void Vdup(Condition cond, DataType dt, DRegister rd, Register rt) {
6889    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6890    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
6891    VIXL_ASSERT(allow_macro_instructions_);
6892    VIXL_ASSERT(OutsideITBlock());
6893    MacroEmissionCheckScope guard(this);
6894    ITScope it_scope(this, &cond);
6895    vdup(cond, dt, rd, rt);
6896  }
6897  void Vdup(DataType dt, DRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
6898
6899  void Vdup(Condition cond, DataType dt, DRegister rd, DRegisterLane rm) {
6900    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6901    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6902    VIXL_ASSERT(allow_macro_instructions_);
6903    VIXL_ASSERT(OutsideITBlock());
6904    MacroEmissionCheckScope guard(this);
6905    ITScope it_scope(this, &cond);
6906    vdup(cond, dt, rd, rm);
6907  }
6908  void Vdup(DataType dt, DRegister rd, DRegisterLane rm) {
6909    Vdup(al, dt, rd, rm);
6910  }
6911
6912  void Vdup(Condition cond, DataType dt, QRegister rd, DRegisterLane rm) {
6913    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6914    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6915    VIXL_ASSERT(allow_macro_instructions_);
6916    VIXL_ASSERT(OutsideITBlock());
6917    MacroEmissionCheckScope guard(this);
6918    ITScope it_scope(this, &cond);
6919    vdup(cond, dt, rd, rm);
6920  }
6921  void Vdup(DataType dt, QRegister rd, DRegisterLane rm) {
6922    Vdup(al, dt, rd, rm);
6923  }
6924
6925  void Veor(
6926      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6927    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6928    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6929    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6930    VIXL_ASSERT(allow_macro_instructions_);
6931    VIXL_ASSERT(OutsideITBlock());
6932    MacroEmissionCheckScope guard(this);
6933    ITScope it_scope(this, &cond);
6934    veor(cond, dt, rd, rn, rm);
6935  }
6936  void Veor(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
6937    Veor(al, dt, rd, rn, rm);
6938  }
6939  void Veor(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
6940    Veor(cond, kDataTypeValueNone, rd, rn, rm);
6941  }
6942  void Veor(DRegister rd, DRegister rn, DRegister rm) {
6943    Veor(al, kDataTypeValueNone, rd, rn, rm);
6944  }
6945
6946  void Veor(
6947      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6948    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6949    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6950    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6951    VIXL_ASSERT(allow_macro_instructions_);
6952    VIXL_ASSERT(OutsideITBlock());
6953    MacroEmissionCheckScope guard(this);
6954    ITScope it_scope(this, &cond);
6955    veor(cond, dt, rd, rn, rm);
6956  }
6957  void Veor(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
6958    Veor(al, dt, rd, rn, rm);
6959  }
6960  void Veor(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
6961    Veor(cond, kDataTypeValueNone, rd, rn, rm);
6962  }
6963  void Veor(QRegister rd, QRegister rn, QRegister rm) {
6964    Veor(al, kDataTypeValueNone, rd, rn, rm);
6965  }
6966
6967  void Vext(Condition cond,
6968            DataType dt,
6969            DRegister rd,
6970            DRegister rn,
6971            DRegister rm,
6972            const DOperand& operand) {
6973    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6974    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6975    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
6976    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
6977    VIXL_ASSERT(allow_macro_instructions_);
6978    VIXL_ASSERT(OutsideITBlock());
6979    MacroEmissionCheckScope guard(this);
6980    ITScope it_scope(this, &cond);
6981    vext(cond, dt, rd, rn, rm, operand);
6982  }
6983  void Vext(DataType dt,
6984            DRegister rd,
6985            DRegister rn,
6986            DRegister rm,
6987            const DOperand& operand) {
6988    Vext(al, dt, rd, rn, rm, operand);
6989  }
6990
6991  void Vext(Condition cond,
6992            DataType dt,
6993            QRegister rd,
6994            QRegister rn,
6995            QRegister rm,
6996            const QOperand& operand) {
6997    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
6998    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
6999    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7000    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7001    VIXL_ASSERT(allow_macro_instructions_);
7002    VIXL_ASSERT(OutsideITBlock());
7003    MacroEmissionCheckScope guard(this);
7004    ITScope it_scope(this, &cond);
7005    vext(cond, dt, rd, rn, rm, operand);
7006  }
7007  void Vext(DataType dt,
7008            QRegister rd,
7009            QRegister rn,
7010            QRegister rm,
7011            const QOperand& operand) {
7012    Vext(al, dt, rd, rn, rm, operand);
7013  }
7014
7015  void Vfma(
7016      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7017    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7018    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7019    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7020    VIXL_ASSERT(allow_macro_instructions_);
7021    VIXL_ASSERT(OutsideITBlock());
7022    MacroEmissionCheckScope guard(this);
7023    ITScope it_scope(this, &cond);
7024    vfma(cond, dt, rd, rn, rm);
7025  }
7026  void Vfma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7027    Vfma(al, dt, rd, rn, rm);
7028  }
7029
7030  void Vfma(
7031      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7032    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7033    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7034    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7035    VIXL_ASSERT(allow_macro_instructions_);
7036    VIXL_ASSERT(OutsideITBlock());
7037    MacroEmissionCheckScope guard(this);
7038    ITScope it_scope(this, &cond);
7039    vfma(cond, dt, rd, rn, rm);
7040  }
7041  void Vfma(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7042    Vfma(al, dt, rd, rn, rm);
7043  }
7044
7045  void Vfma(
7046      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister 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    ITScope it_scope(this, &cond);
7054    vfma(cond, dt, rd, rn, rm);
7055  }
7056  void Vfma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7057    Vfma(al, dt, rd, rn, rm);
7058  }
7059
7060  void Vfms(
7061      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7062    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7063    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7064    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7065    VIXL_ASSERT(allow_macro_instructions_);
7066    VIXL_ASSERT(OutsideITBlock());
7067    MacroEmissionCheckScope guard(this);
7068    ITScope it_scope(this, &cond);
7069    vfms(cond, dt, rd, rn, rm);
7070  }
7071  void Vfms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7072    Vfms(al, dt, rd, rn, rm);
7073  }
7074
7075  void Vfms(
7076      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7077    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7078    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7079    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7080    VIXL_ASSERT(allow_macro_instructions_);
7081    VIXL_ASSERT(OutsideITBlock());
7082    MacroEmissionCheckScope guard(this);
7083    ITScope it_scope(this, &cond);
7084    vfms(cond, dt, rd, rn, rm);
7085  }
7086  void Vfms(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7087    Vfms(al, dt, rd, rn, rm);
7088  }
7089
7090  void Vfms(
7091      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7092    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7093    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7094    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7095    VIXL_ASSERT(allow_macro_instructions_);
7096    VIXL_ASSERT(OutsideITBlock());
7097    MacroEmissionCheckScope guard(this);
7098    ITScope it_scope(this, &cond);
7099    vfms(cond, dt, rd, rn, rm);
7100  }
7101  void Vfms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7102    Vfms(al, dt, rd, rn, rm);
7103  }
7104
7105  void Vfnma(
7106      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7107    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7108    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7109    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7110    VIXL_ASSERT(allow_macro_instructions_);
7111    VIXL_ASSERT(OutsideITBlock());
7112    MacroEmissionCheckScope guard(this);
7113    ITScope it_scope(this, &cond);
7114    vfnma(cond, dt, rd, rn, rm);
7115  }
7116  void Vfnma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7117    Vfnma(al, dt, rd, rn, rm);
7118  }
7119
7120  void Vfnma(
7121      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7122    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7123    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7124    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7125    VIXL_ASSERT(allow_macro_instructions_);
7126    VIXL_ASSERT(OutsideITBlock());
7127    MacroEmissionCheckScope guard(this);
7128    ITScope it_scope(this, &cond);
7129    vfnma(cond, dt, rd, rn, rm);
7130  }
7131  void Vfnma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7132    Vfnma(al, dt, rd, rn, rm);
7133  }
7134
7135  void Vfnms(
7136      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7137    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7138    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7139    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7140    VIXL_ASSERT(allow_macro_instructions_);
7141    VIXL_ASSERT(OutsideITBlock());
7142    MacroEmissionCheckScope guard(this);
7143    ITScope it_scope(this, &cond);
7144    vfnms(cond, dt, rd, rn, rm);
7145  }
7146  void Vfnms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7147    Vfnms(al, dt, rd, rn, rm);
7148  }
7149
7150  void Vfnms(
7151      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7152    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7153    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7154    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7155    VIXL_ASSERT(allow_macro_instructions_);
7156    VIXL_ASSERT(OutsideITBlock());
7157    MacroEmissionCheckScope guard(this);
7158    ITScope it_scope(this, &cond);
7159    vfnms(cond, dt, rd, rn, rm);
7160  }
7161  void Vfnms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7162    Vfnms(al, dt, rd, rn, rm);
7163  }
7164
7165  void Vhadd(
7166      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7167    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7168    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7169    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7170    VIXL_ASSERT(allow_macro_instructions_);
7171    VIXL_ASSERT(OutsideITBlock());
7172    MacroEmissionCheckScope guard(this);
7173    ITScope it_scope(this, &cond);
7174    vhadd(cond, dt, rd, rn, rm);
7175  }
7176  void Vhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7177    Vhadd(al, dt, rd, rn, rm);
7178  }
7179
7180  void Vhadd(
7181      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7182    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7183    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7184    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7185    VIXL_ASSERT(allow_macro_instructions_);
7186    VIXL_ASSERT(OutsideITBlock());
7187    MacroEmissionCheckScope guard(this);
7188    ITScope it_scope(this, &cond);
7189    vhadd(cond, dt, rd, rn, rm);
7190  }
7191  void Vhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7192    Vhadd(al, dt, rd, rn, rm);
7193  }
7194
7195  void Vhsub(
7196      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7197    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7198    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7199    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7200    VIXL_ASSERT(allow_macro_instructions_);
7201    VIXL_ASSERT(OutsideITBlock());
7202    MacroEmissionCheckScope guard(this);
7203    ITScope it_scope(this, &cond);
7204    vhsub(cond, dt, rd, rn, rm);
7205  }
7206  void Vhsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7207    Vhsub(al, dt, rd, rn, rm);
7208  }
7209
7210  void Vhsub(
7211      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7212    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7213    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7214    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7215    VIXL_ASSERT(allow_macro_instructions_);
7216    VIXL_ASSERT(OutsideITBlock());
7217    MacroEmissionCheckScope guard(this);
7218    ITScope it_scope(this, &cond);
7219    vhsub(cond, dt, rd, rn, rm);
7220  }
7221  void Vhsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7222    Vhsub(al, dt, rd, rn, rm);
7223  }
7224
7225  void Vld1(Condition cond,
7226            DataType dt,
7227            const NeonRegisterList& nreglist,
7228            const AlignedMemOperand& operand) {
7229    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7230    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7231    VIXL_ASSERT(allow_macro_instructions_);
7232    VIXL_ASSERT(OutsideITBlock());
7233    MacroEmissionCheckScope guard(this);
7234    ITScope it_scope(this, &cond);
7235    vld1(cond, dt, nreglist, operand);
7236  }
7237  void Vld1(DataType dt,
7238            const NeonRegisterList& nreglist,
7239            const AlignedMemOperand& operand) {
7240    Vld1(al, dt, nreglist, operand);
7241  }
7242
7243  void Vld2(Condition cond,
7244            DataType dt,
7245            const NeonRegisterList& nreglist,
7246            const AlignedMemOperand& operand) {
7247    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7248    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7249    VIXL_ASSERT(allow_macro_instructions_);
7250    VIXL_ASSERT(OutsideITBlock());
7251    MacroEmissionCheckScope guard(this);
7252    ITScope it_scope(this, &cond);
7253    vld2(cond, dt, nreglist, operand);
7254  }
7255  void Vld2(DataType dt,
7256            const NeonRegisterList& nreglist,
7257            const AlignedMemOperand& operand) {
7258    Vld2(al, dt, nreglist, operand);
7259  }
7260
7261  void Vld3(Condition cond,
7262            DataType dt,
7263            const NeonRegisterList& nreglist,
7264            const AlignedMemOperand& operand) {
7265    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7266    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7267    VIXL_ASSERT(allow_macro_instructions_);
7268    VIXL_ASSERT(OutsideITBlock());
7269    MacroEmissionCheckScope guard(this);
7270    ITScope it_scope(this, &cond);
7271    vld3(cond, dt, nreglist, operand);
7272  }
7273  void Vld3(DataType dt,
7274            const NeonRegisterList& nreglist,
7275            const AlignedMemOperand& operand) {
7276    Vld3(al, dt, nreglist, operand);
7277  }
7278
7279  void Vld3(Condition cond,
7280            DataType dt,
7281            const NeonRegisterList& nreglist,
7282            const MemOperand& operand) {
7283    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7284    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7285    VIXL_ASSERT(allow_macro_instructions_);
7286    VIXL_ASSERT(OutsideITBlock());
7287    MacroEmissionCheckScope guard(this);
7288    ITScope it_scope(this, &cond);
7289    vld3(cond, dt, nreglist, operand);
7290  }
7291  void Vld3(DataType dt,
7292            const NeonRegisterList& nreglist,
7293            const MemOperand& operand) {
7294    Vld3(al, dt, nreglist, operand);
7295  }
7296
7297  void Vld4(Condition cond,
7298            DataType dt,
7299            const NeonRegisterList& nreglist,
7300            const AlignedMemOperand& operand) {
7301    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
7302    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7303    VIXL_ASSERT(allow_macro_instructions_);
7304    VIXL_ASSERT(OutsideITBlock());
7305    MacroEmissionCheckScope guard(this);
7306    ITScope it_scope(this, &cond);
7307    vld4(cond, dt, nreglist, operand);
7308  }
7309  void Vld4(DataType dt,
7310            const NeonRegisterList& nreglist,
7311            const AlignedMemOperand& operand) {
7312    Vld4(al, dt, nreglist, operand);
7313  }
7314
7315  void Vldm(Condition cond,
7316            DataType dt,
7317            Register rn,
7318            WriteBack write_back,
7319            DRegisterList dreglist) {
7320    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7321    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7322    VIXL_ASSERT(allow_macro_instructions_);
7323    VIXL_ASSERT(OutsideITBlock());
7324    MacroEmissionCheckScope guard(this);
7325    ITScope it_scope(this, &cond);
7326    vldm(cond, dt, rn, write_back, dreglist);
7327  }
7328  void Vldm(DataType dt,
7329            Register rn,
7330            WriteBack write_back,
7331            DRegisterList dreglist) {
7332    Vldm(al, dt, rn, write_back, dreglist);
7333  }
7334  void Vldm(Condition cond,
7335            Register rn,
7336            WriteBack write_back,
7337            DRegisterList dreglist) {
7338    Vldm(cond, kDataTypeValueNone, rn, write_back, dreglist);
7339  }
7340  void Vldm(Register rn, WriteBack write_back, DRegisterList dreglist) {
7341    Vldm(al, kDataTypeValueNone, rn, write_back, dreglist);
7342  }
7343
7344  void Vldm(Condition cond,
7345            DataType dt,
7346            Register rn,
7347            WriteBack write_back,
7348            SRegisterList sreglist) {
7349    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7350    VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7351    VIXL_ASSERT(allow_macro_instructions_);
7352    VIXL_ASSERT(OutsideITBlock());
7353    MacroEmissionCheckScope guard(this);
7354    ITScope it_scope(this, &cond);
7355    vldm(cond, dt, rn, write_back, sreglist);
7356  }
7357  void Vldm(DataType dt,
7358            Register rn,
7359            WriteBack write_back,
7360            SRegisterList sreglist) {
7361    Vldm(al, dt, rn, write_back, sreglist);
7362  }
7363  void Vldm(Condition cond,
7364            Register rn,
7365            WriteBack write_back,
7366            SRegisterList sreglist) {
7367    Vldm(cond, kDataTypeValueNone, rn, write_back, sreglist);
7368  }
7369  void Vldm(Register rn, WriteBack write_back, SRegisterList sreglist) {
7370    Vldm(al, kDataTypeValueNone, rn, write_back, sreglist);
7371  }
7372
7373  void Vldmdb(Condition cond,
7374              DataType dt,
7375              Register rn,
7376              WriteBack write_back,
7377              DRegisterList dreglist) {
7378    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7379    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7380    VIXL_ASSERT(allow_macro_instructions_);
7381    VIXL_ASSERT(OutsideITBlock());
7382    MacroEmissionCheckScope guard(this);
7383    ITScope it_scope(this, &cond);
7384    vldmdb(cond, dt, rn, write_back, dreglist);
7385  }
7386  void Vldmdb(DataType dt,
7387              Register rn,
7388              WriteBack write_back,
7389              DRegisterList dreglist) {
7390    Vldmdb(al, dt, rn, write_back, dreglist);
7391  }
7392  void Vldmdb(Condition cond,
7393              Register rn,
7394              WriteBack write_back,
7395              DRegisterList dreglist) {
7396    Vldmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
7397  }
7398  void Vldmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
7399    Vldmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
7400  }
7401
7402  void Vldmdb(Condition cond,
7403              DataType dt,
7404              Register rn,
7405              WriteBack write_back,
7406              SRegisterList sreglist) {
7407    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7408    VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7409    VIXL_ASSERT(allow_macro_instructions_);
7410    VIXL_ASSERT(OutsideITBlock());
7411    MacroEmissionCheckScope guard(this);
7412    ITScope it_scope(this, &cond);
7413    vldmdb(cond, dt, rn, write_back, sreglist);
7414  }
7415  void Vldmdb(DataType dt,
7416              Register rn,
7417              WriteBack write_back,
7418              SRegisterList sreglist) {
7419    Vldmdb(al, dt, rn, write_back, sreglist);
7420  }
7421  void Vldmdb(Condition cond,
7422              Register rn,
7423              WriteBack write_back,
7424              SRegisterList sreglist) {
7425    Vldmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
7426  }
7427  void Vldmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
7428    Vldmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
7429  }
7430
7431  void Vldmia(Condition cond,
7432              DataType dt,
7433              Register rn,
7434              WriteBack write_back,
7435              DRegisterList dreglist) {
7436    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7437    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
7438    VIXL_ASSERT(allow_macro_instructions_);
7439    VIXL_ASSERT(OutsideITBlock());
7440    MacroEmissionCheckScope guard(this);
7441    ITScope it_scope(this, &cond);
7442    vldmia(cond, dt, rn, write_back, dreglist);
7443  }
7444  void Vldmia(DataType dt,
7445              Register rn,
7446              WriteBack write_back,
7447              DRegisterList dreglist) {
7448    Vldmia(al, dt, rn, write_back, dreglist);
7449  }
7450  void Vldmia(Condition cond,
7451              Register rn,
7452              WriteBack write_back,
7453              DRegisterList dreglist) {
7454    Vldmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
7455  }
7456  void Vldmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
7457    Vldmia(al, kDataTypeValueNone, rn, write_back, dreglist);
7458  }
7459
7460  void Vldmia(Condition cond,
7461              DataType dt,
7462              Register rn,
7463              WriteBack write_back,
7464              SRegisterList sreglist) {
7465    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7466    VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
7467    VIXL_ASSERT(allow_macro_instructions_);
7468    VIXL_ASSERT(OutsideITBlock());
7469    MacroEmissionCheckScope guard(this);
7470    ITScope it_scope(this, &cond);
7471    vldmia(cond, dt, rn, write_back, sreglist);
7472  }
7473  void Vldmia(DataType dt,
7474              Register rn,
7475              WriteBack write_back,
7476              SRegisterList sreglist) {
7477    Vldmia(al, dt, rn, write_back, sreglist);
7478  }
7479  void Vldmia(Condition cond,
7480              Register rn,
7481              WriteBack write_back,
7482              SRegisterList sreglist) {
7483    Vldmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
7484  }
7485  void Vldmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
7486    Vldmia(al, kDataTypeValueNone, rn, write_back, sreglist);
7487  }
7488
7489  void Vldr(Condition cond, DataType dt, DRegister rd, Label* label) {
7490    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7491    VIXL_ASSERT(allow_macro_instructions_);
7492    VIXL_ASSERT(OutsideITBlock());
7493    MacroEmissionCheckScope guard(this);
7494    ITScope it_scope(this, &cond);
7495    vldr(cond, dt, rd, label);
7496  }
7497  void Vldr(DataType dt, DRegister rd, Label* label) {
7498    Vldr(al, dt, rd, label);
7499  }
7500  void Vldr(Condition cond, DRegister rd, Label* label) {
7501    Vldr(cond, Untyped64, rd, label);
7502  }
7503  void Vldr(DRegister rd, Label* label) { Vldr(al, Untyped64, rd, label); }
7504
7505  void Vldr(Condition cond,
7506            DataType dt,
7507            DRegister rd,
7508            const MemOperand& operand) {
7509    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7510    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7511    VIXL_ASSERT(allow_macro_instructions_);
7512    VIXL_ASSERT(OutsideITBlock());
7513    MacroEmissionCheckScope guard(this);
7514    ITScope it_scope(this, &cond);
7515    vldr(cond, dt, rd, operand);
7516  }
7517  void Vldr(DataType dt, DRegister rd, const MemOperand& operand) {
7518    Vldr(al, dt, rd, operand);
7519  }
7520  void Vldr(Condition cond, DRegister rd, const MemOperand& operand) {
7521    Vldr(cond, Untyped64, rd, operand);
7522  }
7523  void Vldr(DRegister rd, const MemOperand& operand) {
7524    Vldr(al, Untyped64, rd, operand);
7525  }
7526
7527  void Vldr(Condition cond, DataType dt, SRegister rd, Label* label) {
7528    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7529    VIXL_ASSERT(allow_macro_instructions_);
7530    VIXL_ASSERT(OutsideITBlock());
7531    MacroEmissionCheckScope guard(this);
7532    ITScope it_scope(this, &cond);
7533    vldr(cond, dt, rd, label);
7534  }
7535  void Vldr(DataType dt, SRegister rd, Label* label) {
7536    Vldr(al, dt, rd, label);
7537  }
7538  void Vldr(Condition cond, SRegister rd, Label* label) {
7539    Vldr(cond, Untyped32, rd, label);
7540  }
7541  void Vldr(SRegister rd, Label* label) { Vldr(al, Untyped32, rd, label); }
7542
7543  void Vldr(Condition cond,
7544            DataType dt,
7545            SRegister rd,
7546            const MemOperand& operand) {
7547    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7548    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
7549    VIXL_ASSERT(allow_macro_instructions_);
7550    VIXL_ASSERT(OutsideITBlock());
7551    MacroEmissionCheckScope guard(this);
7552    ITScope it_scope(this, &cond);
7553    vldr(cond, dt, rd, operand);
7554  }
7555  void Vldr(DataType dt, SRegister rd, const MemOperand& operand) {
7556    Vldr(al, dt, rd, operand);
7557  }
7558  void Vldr(Condition cond, SRegister rd, const MemOperand& operand) {
7559    Vldr(cond, Untyped32, rd, operand);
7560  }
7561  void Vldr(SRegister rd, const MemOperand& operand) {
7562    Vldr(al, Untyped32, rd, operand);
7563  }
7564
7565  void Vmax(
7566      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7567    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7568    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7569    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7570    VIXL_ASSERT(allow_macro_instructions_);
7571    VIXL_ASSERT(OutsideITBlock());
7572    MacroEmissionCheckScope guard(this);
7573    ITScope it_scope(this, &cond);
7574    vmax(cond, dt, rd, rn, rm);
7575  }
7576  void Vmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7577    Vmax(al, dt, rd, rn, rm);
7578  }
7579
7580  void Vmax(
7581      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7582    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7583    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7584    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7585    VIXL_ASSERT(allow_macro_instructions_);
7586    VIXL_ASSERT(OutsideITBlock());
7587    MacroEmissionCheckScope guard(this);
7588    ITScope it_scope(this, &cond);
7589    vmax(cond, dt, rd, rn, rm);
7590  }
7591  void Vmax(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7592    Vmax(al, dt, rd, rn, rm);
7593  }
7594
7595  void Vmaxnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7596    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7597    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7598    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7599    VIXL_ASSERT(allow_macro_instructions_);
7600    VIXL_ASSERT(OutsideITBlock());
7601    MacroEmissionCheckScope guard(this);
7602    vmaxnm(dt, rd, rn, rm);
7603  }
7604
7605  void Vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7606    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7607    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7608    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7609    VIXL_ASSERT(allow_macro_instructions_);
7610    VIXL_ASSERT(OutsideITBlock());
7611    MacroEmissionCheckScope guard(this);
7612    vmaxnm(dt, rd, rn, rm);
7613  }
7614
7615  void Vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7616    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7617    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7618    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7619    VIXL_ASSERT(allow_macro_instructions_);
7620    VIXL_ASSERT(OutsideITBlock());
7621    MacroEmissionCheckScope guard(this);
7622    vmaxnm(dt, rd, rn, rm);
7623  }
7624
7625  void Vmin(
7626      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7627    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7628    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7629    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7630    VIXL_ASSERT(allow_macro_instructions_);
7631    VIXL_ASSERT(OutsideITBlock());
7632    MacroEmissionCheckScope guard(this);
7633    ITScope it_scope(this, &cond);
7634    vmin(cond, dt, rd, rn, rm);
7635  }
7636  void Vmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7637    Vmin(al, dt, rd, rn, rm);
7638  }
7639
7640  void Vmin(
7641      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7642    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7643    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7644    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7645    VIXL_ASSERT(allow_macro_instructions_);
7646    VIXL_ASSERT(OutsideITBlock());
7647    MacroEmissionCheckScope guard(this);
7648    ITScope it_scope(this, &cond);
7649    vmin(cond, dt, rd, rn, rm);
7650  }
7651  void Vmin(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7652    Vmin(al, dt, rd, rn, rm);
7653  }
7654
7655  void Vminnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7656    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7657    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7658    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7659    VIXL_ASSERT(allow_macro_instructions_);
7660    VIXL_ASSERT(OutsideITBlock());
7661    MacroEmissionCheckScope guard(this);
7662    vminnm(dt, rd, rn, rm);
7663  }
7664
7665  void Vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7666    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7667    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7668    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7669    VIXL_ASSERT(allow_macro_instructions_);
7670    VIXL_ASSERT(OutsideITBlock());
7671    MacroEmissionCheckScope guard(this);
7672    vminnm(dt, rd, rn, rm);
7673  }
7674
7675  void Vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7676    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7677    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7678    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7679    VIXL_ASSERT(allow_macro_instructions_);
7680    VIXL_ASSERT(OutsideITBlock());
7681    MacroEmissionCheckScope guard(this);
7682    vminnm(dt, rd, rn, rm);
7683  }
7684
7685  void Vmla(Condition cond,
7686            DataType dt,
7687            DRegister rd,
7688            DRegister rn,
7689            DRegisterLane rm) {
7690    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7691    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7692    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7693    VIXL_ASSERT(allow_macro_instructions_);
7694    VIXL_ASSERT(OutsideITBlock());
7695    MacroEmissionCheckScope guard(this);
7696    ITScope it_scope(this, &cond);
7697    vmla(cond, dt, rd, rn, rm);
7698  }
7699  void Vmla(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
7700    Vmla(al, dt, rd, rn, rm);
7701  }
7702
7703  void Vmla(Condition cond,
7704            DataType dt,
7705            QRegister rd,
7706            QRegister rn,
7707            DRegisterLane rm) {
7708    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7709    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7710    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7711    VIXL_ASSERT(allow_macro_instructions_);
7712    VIXL_ASSERT(OutsideITBlock());
7713    MacroEmissionCheckScope guard(this);
7714    ITScope it_scope(this, &cond);
7715    vmla(cond, dt, rd, rn, rm);
7716  }
7717  void Vmla(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
7718    Vmla(al, dt, rd, rn, rm);
7719  }
7720
7721  void Vmla(
7722      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7723    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7724    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7725    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7726    VIXL_ASSERT(allow_macro_instructions_);
7727    VIXL_ASSERT(OutsideITBlock());
7728    MacroEmissionCheckScope guard(this);
7729    ITScope it_scope(this, &cond);
7730    vmla(cond, dt, rd, rn, rm);
7731  }
7732  void Vmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7733    Vmla(al, dt, rd, rn, rm);
7734  }
7735
7736  void Vmla(
7737      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7738    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7739    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7740    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7741    VIXL_ASSERT(allow_macro_instructions_);
7742    VIXL_ASSERT(OutsideITBlock());
7743    MacroEmissionCheckScope guard(this);
7744    ITScope it_scope(this, &cond);
7745    vmla(cond, dt, rd, rn, rm);
7746  }
7747  void Vmla(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7748    Vmla(al, dt, rd, rn, rm);
7749  }
7750
7751  void Vmla(
7752      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7753    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7754    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7755    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7756    VIXL_ASSERT(allow_macro_instructions_);
7757    VIXL_ASSERT(OutsideITBlock());
7758    MacroEmissionCheckScope guard(this);
7759    ITScope it_scope(this, &cond);
7760    vmla(cond, dt, rd, rn, rm);
7761  }
7762  void Vmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7763    Vmla(al, dt, rd, rn, rm);
7764  }
7765
7766  void Vmlal(Condition cond,
7767             DataType dt,
7768             QRegister rd,
7769             DRegister rn,
7770             DRegisterLane rm) {
7771    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7772    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7773    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7774    VIXL_ASSERT(allow_macro_instructions_);
7775    VIXL_ASSERT(OutsideITBlock());
7776    MacroEmissionCheckScope guard(this);
7777    ITScope it_scope(this, &cond);
7778    vmlal(cond, dt, rd, rn, rm);
7779  }
7780  void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
7781    Vmlal(al, dt, rd, rn, rm);
7782  }
7783
7784  void Vmlal(
7785      Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7786    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7787    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7788    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7789    VIXL_ASSERT(allow_macro_instructions_);
7790    VIXL_ASSERT(OutsideITBlock());
7791    MacroEmissionCheckScope guard(this);
7792    ITScope it_scope(this, &cond);
7793    vmlal(cond, dt, rd, rn, rm);
7794  }
7795  void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7796    Vmlal(al, dt, rd, rn, rm);
7797  }
7798
7799  void Vmls(Condition cond,
7800            DataType dt,
7801            DRegister rd,
7802            DRegister rn,
7803            DRegisterLane rm) {
7804    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7805    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7806    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7807    VIXL_ASSERT(allow_macro_instructions_);
7808    VIXL_ASSERT(OutsideITBlock());
7809    MacroEmissionCheckScope guard(this);
7810    ITScope it_scope(this, &cond);
7811    vmls(cond, dt, rd, rn, rm);
7812  }
7813  void Vmls(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
7814    Vmls(al, dt, rd, rn, rm);
7815  }
7816
7817  void Vmls(Condition cond,
7818            DataType dt,
7819            QRegister rd,
7820            QRegister rn,
7821            DRegisterLane rm) {
7822    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7823    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7824    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7825    VIXL_ASSERT(allow_macro_instructions_);
7826    VIXL_ASSERT(OutsideITBlock());
7827    MacroEmissionCheckScope guard(this);
7828    ITScope it_scope(this, &cond);
7829    vmls(cond, dt, rd, rn, rm);
7830  }
7831  void Vmls(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
7832    Vmls(al, dt, rd, rn, rm);
7833  }
7834
7835  void Vmls(
7836      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7837    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7838    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7839    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7840    VIXL_ASSERT(allow_macro_instructions_);
7841    VIXL_ASSERT(OutsideITBlock());
7842    MacroEmissionCheckScope guard(this);
7843    ITScope it_scope(this, &cond);
7844    vmls(cond, dt, rd, rn, rm);
7845  }
7846  void Vmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
7847    Vmls(al, dt, rd, rn, rm);
7848  }
7849
7850  void Vmls(
7851      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7852    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7853    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7854    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7855    VIXL_ASSERT(allow_macro_instructions_);
7856    VIXL_ASSERT(OutsideITBlock());
7857    MacroEmissionCheckScope guard(this);
7858    ITScope it_scope(this, &cond);
7859    vmls(cond, dt, rd, rn, rm);
7860  }
7861  void Vmls(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
7862    Vmls(al, dt, rd, rn, rm);
7863  }
7864
7865  void Vmls(
7866      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7867    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7868    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7869    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7870    VIXL_ASSERT(allow_macro_instructions_);
7871    VIXL_ASSERT(OutsideITBlock());
7872    MacroEmissionCheckScope guard(this);
7873    ITScope it_scope(this, &cond);
7874    vmls(cond, dt, rd, rn, rm);
7875  }
7876  void Vmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
7877    Vmls(al, dt, rd, rn, rm);
7878  }
7879
7880  void Vmlsl(Condition cond,
7881             DataType dt,
7882             QRegister rd,
7883             DRegister rn,
7884             DRegisterLane rm) {
7885    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7886    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7887    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7888    VIXL_ASSERT(allow_macro_instructions_);
7889    VIXL_ASSERT(OutsideITBlock());
7890    MacroEmissionCheckScope guard(this);
7891    ITScope it_scope(this, &cond);
7892    vmlsl(cond, dt, rd, rn, rm);
7893  }
7894  void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
7895    Vmlsl(al, dt, rd, rn, rm);
7896  }
7897
7898  void Vmlsl(
7899      Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7900    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7901    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7902    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7903    VIXL_ASSERT(allow_macro_instructions_);
7904    VIXL_ASSERT(OutsideITBlock());
7905    MacroEmissionCheckScope guard(this);
7906    ITScope it_scope(this, &cond);
7907    vmlsl(cond, dt, rd, rn, rm);
7908  }
7909  void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
7910    Vmlsl(al, dt, rd, rn, rm);
7911  }
7912
7913  void Vmov(Condition cond, Register rt, SRegister rn) {
7914    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7915    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7916    VIXL_ASSERT(allow_macro_instructions_);
7917    VIXL_ASSERT(OutsideITBlock());
7918    MacroEmissionCheckScope guard(this);
7919    ITScope it_scope(this, &cond);
7920    vmov(cond, rt, rn);
7921  }
7922  void Vmov(Register rt, SRegister rn) { Vmov(al, rt, rn); }
7923
7924  void Vmov(Condition cond, SRegister rn, Register rt) {
7925    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
7926    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7927    VIXL_ASSERT(allow_macro_instructions_);
7928    VIXL_ASSERT(OutsideITBlock());
7929    MacroEmissionCheckScope guard(this);
7930    ITScope it_scope(this, &cond);
7931    vmov(cond, rn, rt);
7932  }
7933  void Vmov(SRegister rn, Register rt) { Vmov(al, rn, rt); }
7934
7935  void Vmov(Condition cond, Register rt, Register rt2, DRegister rm) {
7936    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7937    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7938    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7939    VIXL_ASSERT(allow_macro_instructions_);
7940    VIXL_ASSERT(OutsideITBlock());
7941    MacroEmissionCheckScope guard(this);
7942    ITScope it_scope(this, &cond);
7943    vmov(cond, rt, rt2, rm);
7944  }
7945  void Vmov(Register rt, Register rt2, DRegister rm) { Vmov(al, rt, rt2, rm); }
7946
7947  void Vmov(Condition cond, DRegister rm, Register rt, Register rt2) {
7948    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7949    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7950    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7951    VIXL_ASSERT(allow_macro_instructions_);
7952    VIXL_ASSERT(OutsideITBlock());
7953    MacroEmissionCheckScope guard(this);
7954    ITScope it_scope(this, &cond);
7955    vmov(cond, rm, rt, rt2);
7956  }
7957  void Vmov(DRegister rm, Register rt, Register rt2) { Vmov(al, rm, rt, rt2); }
7958
7959  void Vmov(
7960      Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
7961    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7962    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7963    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7964    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
7965    VIXL_ASSERT(allow_macro_instructions_);
7966    VIXL_ASSERT(OutsideITBlock());
7967    MacroEmissionCheckScope guard(this);
7968    ITScope it_scope(this, &cond);
7969    vmov(cond, rt, rt2, rm, rm1);
7970  }
7971  void Vmov(Register rt, Register rt2, SRegister rm, SRegister rm1) {
7972    Vmov(al, rt, rt2, rm, rm1);
7973  }
7974
7975  void Vmov(
7976      Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
7977    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
7978    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1));
7979    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7980    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2));
7981    VIXL_ASSERT(allow_macro_instructions_);
7982    VIXL_ASSERT(OutsideITBlock());
7983    MacroEmissionCheckScope guard(this);
7984    ITScope it_scope(this, &cond);
7985    vmov(cond, rm, rm1, rt, rt2);
7986  }
7987  void Vmov(SRegister rm, SRegister rm1, Register rt, Register rt2) {
7988    Vmov(al, rm, rm1, rt, rt2);
7989  }
7990
7991  void Vmov(Condition cond, DataType dt, DRegisterLane rd, Register rt) {
7992    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
7993    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
7994    VIXL_ASSERT(allow_macro_instructions_);
7995    VIXL_ASSERT(OutsideITBlock());
7996    MacroEmissionCheckScope guard(this);
7997    ITScope it_scope(this, &cond);
7998    vmov(cond, dt, rd, rt);
7999  }
8000  void Vmov(DataType dt, DRegisterLane rd, Register rt) {
8001    Vmov(al, dt, rd, rt);
8002  }
8003  void Vmov(Condition cond, DRegisterLane rd, Register rt) {
8004    Vmov(cond, kDataTypeValueNone, rd, rt);
8005  }
8006  void Vmov(DRegisterLane rd, Register rt) {
8007    Vmov(al, kDataTypeValueNone, rd, rt);
8008  }
8009
8010  void Vmov(Condition cond,
8011            DataType dt,
8012            DRegister rd,
8013            const DOperand& operand) {
8014    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8015    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8016    VIXL_ASSERT(allow_macro_instructions_);
8017    VIXL_ASSERT(OutsideITBlock());
8018    MacroEmissionCheckScope guard(this);
8019    ITScope it_scope(this, &cond);
8020    vmov(cond, dt, rd, operand);
8021  }
8022  void Vmov(DataType dt, DRegister rd, const DOperand& operand) {
8023    Vmov(al, dt, rd, operand);
8024  }
8025
8026  void Vmov(Condition cond,
8027            DataType dt,
8028            QRegister rd,
8029            const QOperand& operand) {
8030    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8031    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8032    VIXL_ASSERT(allow_macro_instructions_);
8033    VIXL_ASSERT(OutsideITBlock());
8034    MacroEmissionCheckScope guard(this);
8035    ITScope it_scope(this, &cond);
8036    vmov(cond, dt, rd, operand);
8037  }
8038  void Vmov(DataType dt, QRegister rd, const QOperand& operand) {
8039    Vmov(al, dt, rd, operand);
8040  }
8041
8042  void Vmov(Condition cond,
8043            DataType dt,
8044            SRegister rd,
8045            const SOperand& operand) {
8046    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8047    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8048    VIXL_ASSERT(allow_macro_instructions_);
8049    VIXL_ASSERT(OutsideITBlock());
8050    MacroEmissionCheckScope guard(this);
8051    ITScope it_scope(this, &cond);
8052    vmov(cond, dt, rd, operand);
8053  }
8054  void Vmov(DataType dt, SRegister rd, const SOperand& operand) {
8055    Vmov(al, dt, rd, operand);
8056  }
8057
8058  void Vmov(Condition cond, DataType dt, Register rt, DRegisterLane rn) {
8059    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
8060    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8061    VIXL_ASSERT(allow_macro_instructions_);
8062    VIXL_ASSERT(OutsideITBlock());
8063    MacroEmissionCheckScope guard(this);
8064    ITScope it_scope(this, &cond);
8065    vmov(cond, dt, rt, rn);
8066  }
8067  void Vmov(DataType dt, Register rt, DRegisterLane rn) {
8068    Vmov(al, dt, rt, rn);
8069  }
8070  void Vmov(Condition cond, Register rt, DRegisterLane rn) {
8071    Vmov(cond, kDataTypeValueNone, rt, rn);
8072  }
8073  void Vmov(Register rt, DRegisterLane rn) {
8074    Vmov(al, kDataTypeValueNone, rt, rn);
8075  }
8076
8077  void Vmovl(Condition cond, DataType dt, QRegister rd, DRegister rm) {
8078    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8079    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8080    VIXL_ASSERT(allow_macro_instructions_);
8081    VIXL_ASSERT(OutsideITBlock());
8082    MacroEmissionCheckScope guard(this);
8083    ITScope it_scope(this, &cond);
8084    vmovl(cond, dt, rd, rm);
8085  }
8086  void Vmovl(DataType dt, QRegister rd, DRegister rm) { Vmovl(al, dt, rd, rm); }
8087
8088  void Vmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8089    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8090    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8091    VIXL_ASSERT(allow_macro_instructions_);
8092    VIXL_ASSERT(OutsideITBlock());
8093    MacroEmissionCheckScope guard(this);
8094    ITScope it_scope(this, &cond);
8095    vmovn(cond, dt, rd, rm);
8096  }
8097  void Vmovn(DataType dt, DRegister rd, QRegister rm) { Vmovn(al, dt, rd, rm); }
8098
8099  void Vmrs(Condition cond,
8100            RegisterOrAPSR_nzcv rt,
8101            SpecialFPRegister spec_reg) {
8102    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
8103    VIXL_ASSERT(allow_macro_instructions_);
8104    VIXL_ASSERT(OutsideITBlock());
8105    MacroEmissionCheckScope guard(this);
8106    ITScope it_scope(this, &cond);
8107    vmrs(cond, rt, spec_reg);
8108  }
8109  void Vmrs(RegisterOrAPSR_nzcv rt, SpecialFPRegister spec_reg) {
8110    Vmrs(al, rt, spec_reg);
8111  }
8112
8113  void Vmsr(Condition cond, SpecialFPRegister spec_reg, Register rt) {
8114    VIXL_ASSERT(!AliasesAvailableScratchRegister(rt));
8115    VIXL_ASSERT(allow_macro_instructions_);
8116    VIXL_ASSERT(OutsideITBlock());
8117    MacroEmissionCheckScope guard(this);
8118    ITScope it_scope(this, &cond);
8119    vmsr(cond, spec_reg, rt);
8120  }
8121  void Vmsr(SpecialFPRegister spec_reg, Register rt) { Vmsr(al, spec_reg, rt); }
8122
8123  void Vmul(Condition cond,
8124            DataType dt,
8125            DRegister rd,
8126            DRegister rn,
8127            DRegister dm,
8128            unsigned index) {
8129    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8130    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8131    VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8132    VIXL_ASSERT(allow_macro_instructions_);
8133    VIXL_ASSERT(OutsideITBlock());
8134    MacroEmissionCheckScope guard(this);
8135    ITScope it_scope(this, &cond);
8136    vmul(cond, dt, rd, rn, dm, index);
8137  }
8138  void Vmul(
8139      DataType dt, DRegister rd, DRegister rn, DRegister dm, unsigned index) {
8140    Vmul(al, dt, rd, rn, dm, index);
8141  }
8142
8143  void Vmul(Condition cond,
8144            DataType dt,
8145            QRegister rd,
8146            QRegister rn,
8147            DRegister dm,
8148            unsigned index) {
8149    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8150    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8151    VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8152    VIXL_ASSERT(allow_macro_instructions_);
8153    VIXL_ASSERT(OutsideITBlock());
8154    MacroEmissionCheckScope guard(this);
8155    ITScope it_scope(this, &cond);
8156    vmul(cond, dt, rd, rn, dm, index);
8157  }
8158  void Vmul(
8159      DataType dt, QRegister rd, QRegister rn, DRegister dm, unsigned index) {
8160    Vmul(al, dt, rd, rn, dm, index);
8161  }
8162
8163  void Vmul(
8164      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8165    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8166    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8167    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8168    VIXL_ASSERT(allow_macro_instructions_);
8169    VIXL_ASSERT(OutsideITBlock());
8170    MacroEmissionCheckScope guard(this);
8171    ITScope it_scope(this, &cond);
8172    vmul(cond, dt, rd, rn, rm);
8173  }
8174  void Vmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8175    Vmul(al, dt, rd, rn, rm);
8176  }
8177
8178  void Vmul(
8179      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8180    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8181    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8182    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8183    VIXL_ASSERT(allow_macro_instructions_);
8184    VIXL_ASSERT(OutsideITBlock());
8185    MacroEmissionCheckScope guard(this);
8186    ITScope it_scope(this, &cond);
8187    vmul(cond, dt, rd, rn, rm);
8188  }
8189  void Vmul(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8190    Vmul(al, dt, rd, rn, rm);
8191  }
8192
8193  void Vmul(
8194      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8195    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8196    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8197    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8198    VIXL_ASSERT(allow_macro_instructions_);
8199    VIXL_ASSERT(OutsideITBlock());
8200    MacroEmissionCheckScope guard(this);
8201    ITScope it_scope(this, &cond);
8202    vmul(cond, dt, rd, rn, rm);
8203  }
8204  void Vmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8205    Vmul(al, dt, rd, rn, rm);
8206  }
8207
8208  void Vmull(Condition cond,
8209             DataType dt,
8210             QRegister rd,
8211             DRegister rn,
8212             DRegister dm,
8213             unsigned index) {
8214    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8215    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8216    VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8217    VIXL_ASSERT(allow_macro_instructions_);
8218    VIXL_ASSERT(OutsideITBlock());
8219    MacroEmissionCheckScope guard(this);
8220    ITScope it_scope(this, &cond);
8221    vmull(cond, dt, rd, rn, dm, index);
8222  }
8223  void Vmull(
8224      DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8225    Vmull(al, dt, rd, rn, dm, index);
8226  }
8227
8228  void Vmull(
8229      Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8230    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8231    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8232    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8233    VIXL_ASSERT(allow_macro_instructions_);
8234    VIXL_ASSERT(OutsideITBlock());
8235    MacroEmissionCheckScope guard(this);
8236    ITScope it_scope(this, &cond);
8237    vmull(cond, dt, rd, rn, rm);
8238  }
8239  void Vmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8240    Vmull(al, dt, rd, rn, rm);
8241  }
8242
8243  void Vmvn(Condition cond,
8244            DataType dt,
8245            DRegister rd,
8246            const DOperand& operand) {
8247    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8248    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8249    VIXL_ASSERT(allow_macro_instructions_);
8250    VIXL_ASSERT(OutsideITBlock());
8251    MacroEmissionCheckScope guard(this);
8252    ITScope it_scope(this, &cond);
8253    vmvn(cond, dt, rd, operand);
8254  }
8255  void Vmvn(DataType dt, DRegister rd, const DOperand& operand) {
8256    Vmvn(al, dt, rd, operand);
8257  }
8258
8259  void Vmvn(Condition cond,
8260            DataType dt,
8261            QRegister rd,
8262            const QOperand& operand) {
8263    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8264    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8265    VIXL_ASSERT(allow_macro_instructions_);
8266    VIXL_ASSERT(OutsideITBlock());
8267    MacroEmissionCheckScope guard(this);
8268    ITScope it_scope(this, &cond);
8269    vmvn(cond, dt, rd, operand);
8270  }
8271  void Vmvn(DataType dt, QRegister rd, const QOperand& operand) {
8272    Vmvn(al, dt, rd, operand);
8273  }
8274
8275  void Vneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8276    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8277    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8278    VIXL_ASSERT(allow_macro_instructions_);
8279    VIXL_ASSERT(OutsideITBlock());
8280    MacroEmissionCheckScope guard(this);
8281    ITScope it_scope(this, &cond);
8282    vneg(cond, dt, rd, rm);
8283  }
8284  void Vneg(DataType dt, DRegister rd, DRegister rm) { Vneg(al, dt, rd, rm); }
8285
8286  void Vneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8287    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8288    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8289    VIXL_ASSERT(allow_macro_instructions_);
8290    VIXL_ASSERT(OutsideITBlock());
8291    MacroEmissionCheckScope guard(this);
8292    ITScope it_scope(this, &cond);
8293    vneg(cond, dt, rd, rm);
8294  }
8295  void Vneg(DataType dt, QRegister rd, QRegister rm) { Vneg(al, dt, rd, rm); }
8296
8297  void Vneg(Condition cond, DataType dt, SRegister rd, SRegister rm) {
8298    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8299    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8300    VIXL_ASSERT(allow_macro_instructions_);
8301    VIXL_ASSERT(OutsideITBlock());
8302    MacroEmissionCheckScope guard(this);
8303    ITScope it_scope(this, &cond);
8304    vneg(cond, dt, rd, rm);
8305  }
8306  void Vneg(DataType dt, SRegister rd, SRegister rm) { Vneg(al, dt, rd, rm); }
8307
8308  void Vnmla(
8309      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8310    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8311    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8312    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8313    VIXL_ASSERT(allow_macro_instructions_);
8314    VIXL_ASSERT(OutsideITBlock());
8315    MacroEmissionCheckScope guard(this);
8316    ITScope it_scope(this, &cond);
8317    vnmla(cond, dt, rd, rn, rm);
8318  }
8319  void Vnmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8320    Vnmla(al, dt, rd, rn, rm);
8321  }
8322
8323  void Vnmla(
8324      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8325    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8326    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8327    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8328    VIXL_ASSERT(allow_macro_instructions_);
8329    VIXL_ASSERT(OutsideITBlock());
8330    MacroEmissionCheckScope guard(this);
8331    ITScope it_scope(this, &cond);
8332    vnmla(cond, dt, rd, rn, rm);
8333  }
8334  void Vnmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8335    Vnmla(al, dt, rd, rn, rm);
8336  }
8337
8338  void Vnmls(
8339      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8340    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8341    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8342    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8343    VIXL_ASSERT(allow_macro_instructions_);
8344    VIXL_ASSERT(OutsideITBlock());
8345    MacroEmissionCheckScope guard(this);
8346    ITScope it_scope(this, &cond);
8347    vnmls(cond, dt, rd, rn, rm);
8348  }
8349  void Vnmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8350    Vnmls(al, dt, rd, rn, rm);
8351  }
8352
8353  void Vnmls(
8354      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8355    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8356    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8357    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8358    VIXL_ASSERT(allow_macro_instructions_);
8359    VIXL_ASSERT(OutsideITBlock());
8360    MacroEmissionCheckScope guard(this);
8361    ITScope it_scope(this, &cond);
8362    vnmls(cond, dt, rd, rn, rm);
8363  }
8364  void Vnmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8365    Vnmls(al, dt, rd, rn, rm);
8366  }
8367
8368  void Vnmul(
8369      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8370    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8371    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8372    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8373    VIXL_ASSERT(allow_macro_instructions_);
8374    VIXL_ASSERT(OutsideITBlock());
8375    MacroEmissionCheckScope guard(this);
8376    ITScope it_scope(this, &cond);
8377    vnmul(cond, dt, rd, rn, rm);
8378  }
8379  void Vnmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
8380    Vnmul(al, dt, rd, rn, rm);
8381  }
8382
8383  void Vnmul(
8384      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8385    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8386    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8387    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8388    VIXL_ASSERT(allow_macro_instructions_);
8389    VIXL_ASSERT(OutsideITBlock());
8390    MacroEmissionCheckScope guard(this);
8391    ITScope it_scope(this, &cond);
8392    vnmul(cond, dt, rd, rn, rm);
8393  }
8394  void Vnmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8395    Vnmul(al, dt, rd, rn, rm);
8396  }
8397
8398  void Vorn(Condition cond,
8399            DataType dt,
8400            DRegister rd,
8401            DRegister rn,
8402            const DOperand& operand) {
8403    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8404    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8405    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8406    VIXL_ASSERT(allow_macro_instructions_);
8407    VIXL_ASSERT(OutsideITBlock());
8408    MacroEmissionCheckScope guard(this);
8409    ITScope it_scope(this, &cond);
8410    vorn(cond, dt, rd, rn, operand);
8411  }
8412  void Vorn(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
8413    Vorn(al, dt, rd, rn, operand);
8414  }
8415
8416  void Vorn(Condition cond,
8417            DataType dt,
8418            QRegister rd,
8419            QRegister rn,
8420            const QOperand& operand) {
8421    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8422    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8423    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8424    VIXL_ASSERT(allow_macro_instructions_);
8425    VIXL_ASSERT(OutsideITBlock());
8426    MacroEmissionCheckScope guard(this);
8427    ITScope it_scope(this, &cond);
8428    vorn(cond, dt, rd, rn, operand);
8429  }
8430  void Vorn(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
8431    Vorn(al, dt, rd, rn, operand);
8432  }
8433
8434  void Vorr(Condition cond,
8435            DataType dt,
8436            DRegister rd,
8437            DRegister rn,
8438            const DOperand& operand) {
8439    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8440    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8441    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8442    VIXL_ASSERT(allow_macro_instructions_);
8443    VIXL_ASSERT(OutsideITBlock());
8444    MacroEmissionCheckScope guard(this);
8445    ITScope it_scope(this, &cond);
8446    vorr(cond, dt, rd, rn, operand);
8447  }
8448  void Vorr(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
8449    Vorr(al, dt, rd, rn, operand);
8450  }
8451  void Vorr(Condition cond,
8452            DRegister rd,
8453            DRegister rn,
8454            const DOperand& operand) {
8455    Vorr(cond, kDataTypeValueNone, rd, rn, operand);
8456  }
8457  void Vorr(DRegister rd, DRegister rn, const DOperand& operand) {
8458    Vorr(al, kDataTypeValueNone, rd, rn, operand);
8459  }
8460
8461  void Vorr(Condition cond,
8462            DataType dt,
8463            QRegister rd,
8464            QRegister rn,
8465            const QOperand& operand) {
8466    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8467    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8468    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
8469    VIXL_ASSERT(allow_macro_instructions_);
8470    VIXL_ASSERT(OutsideITBlock());
8471    MacroEmissionCheckScope guard(this);
8472    ITScope it_scope(this, &cond);
8473    vorr(cond, dt, rd, rn, operand);
8474  }
8475  void Vorr(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
8476    Vorr(al, dt, rd, rn, operand);
8477  }
8478  void Vorr(Condition cond,
8479            QRegister rd,
8480            QRegister rn,
8481            const QOperand& operand) {
8482    Vorr(cond, kDataTypeValueNone, rd, rn, operand);
8483  }
8484  void Vorr(QRegister rd, QRegister rn, const QOperand& operand) {
8485    Vorr(al, kDataTypeValueNone, rd, rn, operand);
8486  }
8487
8488  void Vpadal(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8489    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8490    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8491    VIXL_ASSERT(allow_macro_instructions_);
8492    VIXL_ASSERT(OutsideITBlock());
8493    MacroEmissionCheckScope guard(this);
8494    ITScope it_scope(this, &cond);
8495    vpadal(cond, dt, rd, rm);
8496  }
8497  void Vpadal(DataType dt, DRegister rd, DRegister rm) {
8498    Vpadal(al, dt, rd, rm);
8499  }
8500
8501  void Vpadal(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8502    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8503    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8504    VIXL_ASSERT(allow_macro_instructions_);
8505    VIXL_ASSERT(OutsideITBlock());
8506    MacroEmissionCheckScope guard(this);
8507    ITScope it_scope(this, &cond);
8508    vpadal(cond, dt, rd, rm);
8509  }
8510  void Vpadal(DataType dt, QRegister rd, QRegister rm) {
8511    Vpadal(al, dt, rd, rm);
8512  }
8513
8514  void Vpadd(
8515      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8516    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8517    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8518    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8519    VIXL_ASSERT(allow_macro_instructions_);
8520    VIXL_ASSERT(OutsideITBlock());
8521    MacroEmissionCheckScope guard(this);
8522    ITScope it_scope(this, &cond);
8523    vpadd(cond, dt, rd, rn, rm);
8524  }
8525  void Vpadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8526    Vpadd(al, dt, rd, rn, rm);
8527  }
8528
8529  void Vpaddl(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8530    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8531    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8532    VIXL_ASSERT(allow_macro_instructions_);
8533    VIXL_ASSERT(OutsideITBlock());
8534    MacroEmissionCheckScope guard(this);
8535    ITScope it_scope(this, &cond);
8536    vpaddl(cond, dt, rd, rm);
8537  }
8538  void Vpaddl(DataType dt, DRegister rd, DRegister rm) {
8539    Vpaddl(al, dt, rd, rm);
8540  }
8541
8542  void Vpaddl(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8543    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8544    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8545    VIXL_ASSERT(allow_macro_instructions_);
8546    VIXL_ASSERT(OutsideITBlock());
8547    MacroEmissionCheckScope guard(this);
8548    ITScope it_scope(this, &cond);
8549    vpaddl(cond, dt, rd, rm);
8550  }
8551  void Vpaddl(DataType dt, QRegister rd, QRegister rm) {
8552    Vpaddl(al, dt, rd, rm);
8553  }
8554
8555  void Vpmax(
8556      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8557    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8558    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8559    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8560    VIXL_ASSERT(allow_macro_instructions_);
8561    VIXL_ASSERT(OutsideITBlock());
8562    MacroEmissionCheckScope guard(this);
8563    ITScope it_scope(this, &cond);
8564    vpmax(cond, dt, rd, rn, rm);
8565  }
8566  void Vpmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8567    Vpmax(al, dt, rd, rn, rm);
8568  }
8569
8570  void Vpmin(
8571      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8572    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8573    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8574    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8575    VIXL_ASSERT(allow_macro_instructions_);
8576    VIXL_ASSERT(OutsideITBlock());
8577    MacroEmissionCheckScope guard(this);
8578    ITScope it_scope(this, &cond);
8579    vpmin(cond, dt, rd, rn, rm);
8580  }
8581  void Vpmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8582    Vpmin(al, dt, rd, rn, rm);
8583  }
8584
8585  void Vpop(Condition cond, DataType dt, DRegisterList dreglist) {
8586    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8587    VIXL_ASSERT(allow_macro_instructions_);
8588    VIXL_ASSERT(OutsideITBlock());
8589    MacroEmissionCheckScope guard(this);
8590    ITScope it_scope(this, &cond);
8591    vpop(cond, dt, dreglist);
8592  }
8593  void Vpop(DataType dt, DRegisterList dreglist) { Vpop(al, dt, dreglist); }
8594  void Vpop(Condition cond, DRegisterList dreglist) {
8595    Vpop(cond, kDataTypeValueNone, dreglist);
8596  }
8597  void Vpop(DRegisterList dreglist) { Vpop(al, kDataTypeValueNone, dreglist); }
8598
8599  void Vpop(Condition cond, DataType dt, SRegisterList sreglist) {
8600    VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8601    VIXL_ASSERT(allow_macro_instructions_);
8602    VIXL_ASSERT(OutsideITBlock());
8603    MacroEmissionCheckScope guard(this);
8604    ITScope it_scope(this, &cond);
8605    vpop(cond, dt, sreglist);
8606  }
8607  void Vpop(DataType dt, SRegisterList sreglist) { Vpop(al, dt, sreglist); }
8608  void Vpop(Condition cond, SRegisterList sreglist) {
8609    Vpop(cond, kDataTypeValueNone, sreglist);
8610  }
8611  void Vpop(SRegisterList sreglist) { Vpop(al, kDataTypeValueNone, sreglist); }
8612
8613  void Vpush(Condition cond, DataType dt, DRegisterList dreglist) {
8614    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
8615    VIXL_ASSERT(allow_macro_instructions_);
8616    VIXL_ASSERT(OutsideITBlock());
8617    MacroEmissionCheckScope guard(this);
8618    ITScope it_scope(this, &cond);
8619    vpush(cond, dt, dreglist);
8620  }
8621  void Vpush(DataType dt, DRegisterList dreglist) { Vpush(al, dt, dreglist); }
8622  void Vpush(Condition cond, DRegisterList dreglist) {
8623    Vpush(cond, kDataTypeValueNone, dreglist);
8624  }
8625  void Vpush(DRegisterList dreglist) {
8626    Vpush(al, kDataTypeValueNone, dreglist);
8627  }
8628
8629  void Vpush(Condition cond, DataType dt, SRegisterList sreglist) {
8630    VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
8631    VIXL_ASSERT(allow_macro_instructions_);
8632    VIXL_ASSERT(OutsideITBlock());
8633    MacroEmissionCheckScope guard(this);
8634    ITScope it_scope(this, &cond);
8635    vpush(cond, dt, sreglist);
8636  }
8637  void Vpush(DataType dt, SRegisterList sreglist) { Vpush(al, dt, sreglist); }
8638  void Vpush(Condition cond, SRegisterList sreglist) {
8639    Vpush(cond, kDataTypeValueNone, sreglist);
8640  }
8641  void Vpush(SRegisterList sreglist) {
8642    Vpush(al, kDataTypeValueNone, sreglist);
8643  }
8644
8645  void Vqabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8646    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8647    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8648    VIXL_ASSERT(allow_macro_instructions_);
8649    VIXL_ASSERT(OutsideITBlock());
8650    MacroEmissionCheckScope guard(this);
8651    ITScope it_scope(this, &cond);
8652    vqabs(cond, dt, rd, rm);
8653  }
8654  void Vqabs(DataType dt, DRegister rd, DRegister rm) { Vqabs(al, dt, rd, rm); }
8655
8656  void Vqabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8657    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8658    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8659    VIXL_ASSERT(allow_macro_instructions_);
8660    VIXL_ASSERT(OutsideITBlock());
8661    MacroEmissionCheckScope guard(this);
8662    ITScope it_scope(this, &cond);
8663    vqabs(cond, dt, rd, rm);
8664  }
8665  void Vqabs(DataType dt, QRegister rd, QRegister rm) { Vqabs(al, dt, rd, rm); }
8666
8667  void Vqadd(
8668      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8669    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8670    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8671    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8672    VIXL_ASSERT(allow_macro_instructions_);
8673    VIXL_ASSERT(OutsideITBlock());
8674    MacroEmissionCheckScope guard(this);
8675    ITScope it_scope(this, &cond);
8676    vqadd(cond, dt, rd, rn, rm);
8677  }
8678  void Vqadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8679    Vqadd(al, dt, rd, rn, rm);
8680  }
8681
8682  void Vqadd(
8683      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8684    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8685    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8686    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8687    VIXL_ASSERT(allow_macro_instructions_);
8688    VIXL_ASSERT(OutsideITBlock());
8689    MacroEmissionCheckScope guard(this);
8690    ITScope it_scope(this, &cond);
8691    vqadd(cond, dt, rd, rn, rm);
8692  }
8693  void Vqadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8694    Vqadd(al, dt, rd, rn, rm);
8695  }
8696
8697  void Vqdmlal(
8698      Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8699    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8700    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8701    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8702    VIXL_ASSERT(allow_macro_instructions_);
8703    VIXL_ASSERT(OutsideITBlock());
8704    MacroEmissionCheckScope guard(this);
8705    ITScope it_scope(this, &cond);
8706    vqdmlal(cond, dt, rd, rn, rm);
8707  }
8708  void Vqdmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8709    Vqdmlal(al, dt, rd, rn, rm);
8710  }
8711
8712  void Vqdmlal(Condition cond,
8713               DataType dt,
8714               QRegister rd,
8715               DRegister rn,
8716               DRegister dm,
8717               unsigned index) {
8718    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8719    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8720    VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8721    VIXL_ASSERT(allow_macro_instructions_);
8722    VIXL_ASSERT(OutsideITBlock());
8723    MacroEmissionCheckScope guard(this);
8724    ITScope it_scope(this, &cond);
8725    vqdmlal(cond, dt, rd, rn, dm, index);
8726  }
8727  void Vqdmlal(
8728      DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8729    Vqdmlal(al, dt, rd, rn, dm, index);
8730  }
8731
8732  void Vqdmlsl(
8733      Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8734    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8735    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8736    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8737    VIXL_ASSERT(allow_macro_instructions_);
8738    VIXL_ASSERT(OutsideITBlock());
8739    MacroEmissionCheckScope guard(this);
8740    ITScope it_scope(this, &cond);
8741    vqdmlsl(cond, dt, rd, rn, rm);
8742  }
8743  void Vqdmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8744    Vqdmlsl(al, dt, rd, rn, rm);
8745  }
8746
8747  void Vqdmlsl(Condition cond,
8748               DataType dt,
8749               QRegister rd,
8750               DRegister rn,
8751               DRegister dm,
8752               unsigned index) {
8753    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8754    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8755    VIXL_ASSERT(!AliasesAvailableScratchRegister(dm));
8756    VIXL_ASSERT(allow_macro_instructions_);
8757    VIXL_ASSERT(OutsideITBlock());
8758    MacroEmissionCheckScope guard(this);
8759    ITScope it_scope(this, &cond);
8760    vqdmlsl(cond, dt, rd, rn, dm, index);
8761  }
8762  void Vqdmlsl(
8763      DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
8764    Vqdmlsl(al, dt, rd, rn, dm, index);
8765  }
8766
8767  void Vqdmulh(
8768      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8769    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8770    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8771    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8772    VIXL_ASSERT(allow_macro_instructions_);
8773    VIXL_ASSERT(OutsideITBlock());
8774    MacroEmissionCheckScope guard(this);
8775    ITScope it_scope(this, &cond);
8776    vqdmulh(cond, dt, rd, rn, rm);
8777  }
8778  void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8779    Vqdmulh(al, dt, rd, rn, rm);
8780  }
8781
8782  void Vqdmulh(
8783      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8784    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8785    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8786    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8787    VIXL_ASSERT(allow_macro_instructions_);
8788    VIXL_ASSERT(OutsideITBlock());
8789    MacroEmissionCheckScope guard(this);
8790    ITScope it_scope(this, &cond);
8791    vqdmulh(cond, dt, rd, rn, rm);
8792  }
8793  void Vqdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8794    Vqdmulh(al, dt, rd, rn, rm);
8795  }
8796
8797  void Vqdmulh(Condition cond,
8798               DataType dt,
8799               DRegister rd,
8800               DRegister rn,
8801               DRegisterLane rm) {
8802    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8803    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8804    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8805    VIXL_ASSERT(allow_macro_instructions_);
8806    VIXL_ASSERT(OutsideITBlock());
8807    MacroEmissionCheckScope guard(this);
8808    ITScope it_scope(this, &cond);
8809    vqdmulh(cond, dt, rd, rn, rm);
8810  }
8811  void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
8812    Vqdmulh(al, dt, rd, rn, rm);
8813  }
8814
8815  void Vqdmulh(Condition cond,
8816               DataType dt,
8817               QRegister rd,
8818               QRegister rn,
8819               DRegisterLane rm) {
8820    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8821    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8822    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8823    VIXL_ASSERT(allow_macro_instructions_);
8824    VIXL_ASSERT(OutsideITBlock());
8825    MacroEmissionCheckScope guard(this);
8826    ITScope it_scope(this, &cond);
8827    vqdmulh(cond, dt, rd, rn, rm);
8828  }
8829  void Vqdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
8830    Vqdmulh(al, dt, rd, rn, rm);
8831  }
8832
8833  void Vqdmull(
8834      Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8835    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8836    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8837    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8838    VIXL_ASSERT(allow_macro_instructions_);
8839    VIXL_ASSERT(OutsideITBlock());
8840    MacroEmissionCheckScope guard(this);
8841    ITScope it_scope(this, &cond);
8842    vqdmull(cond, dt, rd, rn, rm);
8843  }
8844  void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
8845    Vqdmull(al, dt, rd, rn, rm);
8846  }
8847
8848  void Vqdmull(Condition cond,
8849               DataType dt,
8850               QRegister rd,
8851               DRegister rn,
8852               DRegisterLane rm) {
8853    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8854    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8855    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8856    VIXL_ASSERT(allow_macro_instructions_);
8857    VIXL_ASSERT(OutsideITBlock());
8858    MacroEmissionCheckScope guard(this);
8859    ITScope it_scope(this, &cond);
8860    vqdmull(cond, dt, rd, rn, rm);
8861  }
8862  void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
8863    Vqdmull(al, dt, rd, rn, rm);
8864  }
8865
8866  void Vqmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8867    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8868    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8869    VIXL_ASSERT(allow_macro_instructions_);
8870    VIXL_ASSERT(OutsideITBlock());
8871    MacroEmissionCheckScope guard(this);
8872    ITScope it_scope(this, &cond);
8873    vqmovn(cond, dt, rd, rm);
8874  }
8875  void Vqmovn(DataType dt, DRegister rd, QRegister rm) {
8876    Vqmovn(al, dt, rd, rm);
8877  }
8878
8879  void Vqmovun(Condition cond, DataType dt, DRegister rd, QRegister rm) {
8880    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8881    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8882    VIXL_ASSERT(allow_macro_instructions_);
8883    VIXL_ASSERT(OutsideITBlock());
8884    MacroEmissionCheckScope guard(this);
8885    ITScope it_scope(this, &cond);
8886    vqmovun(cond, dt, rd, rm);
8887  }
8888  void Vqmovun(DataType dt, DRegister rd, QRegister rm) {
8889    Vqmovun(al, dt, rd, rm);
8890  }
8891
8892  void Vqneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
8893    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8894    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8895    VIXL_ASSERT(allow_macro_instructions_);
8896    VIXL_ASSERT(OutsideITBlock());
8897    MacroEmissionCheckScope guard(this);
8898    ITScope it_scope(this, &cond);
8899    vqneg(cond, dt, rd, rm);
8900  }
8901  void Vqneg(DataType dt, DRegister rd, DRegister rm) { Vqneg(al, dt, rd, rm); }
8902
8903  void Vqneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
8904    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8905    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8906    VIXL_ASSERT(allow_macro_instructions_);
8907    VIXL_ASSERT(OutsideITBlock());
8908    MacroEmissionCheckScope guard(this);
8909    ITScope it_scope(this, &cond);
8910    vqneg(cond, dt, rd, rm);
8911  }
8912  void Vqneg(DataType dt, QRegister rd, QRegister rm) { Vqneg(al, dt, rd, rm); }
8913
8914  void Vqrdmulh(
8915      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8916    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8917    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8918    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8919    VIXL_ASSERT(allow_macro_instructions_);
8920    VIXL_ASSERT(OutsideITBlock());
8921    MacroEmissionCheckScope guard(this);
8922    ITScope it_scope(this, &cond);
8923    vqrdmulh(cond, dt, rd, rn, rm);
8924  }
8925  void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
8926    Vqrdmulh(al, dt, rd, rn, rm);
8927  }
8928
8929  void Vqrdmulh(
8930      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8931    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8932    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8933    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8934    VIXL_ASSERT(allow_macro_instructions_);
8935    VIXL_ASSERT(OutsideITBlock());
8936    MacroEmissionCheckScope guard(this);
8937    ITScope it_scope(this, &cond);
8938    vqrdmulh(cond, dt, rd, rn, rm);
8939  }
8940  void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
8941    Vqrdmulh(al, dt, rd, rn, rm);
8942  }
8943
8944  void Vqrdmulh(Condition cond,
8945                DataType dt,
8946                DRegister rd,
8947                DRegister rn,
8948                DRegisterLane rm) {
8949    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8950    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8951    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8952    VIXL_ASSERT(allow_macro_instructions_);
8953    VIXL_ASSERT(OutsideITBlock());
8954    MacroEmissionCheckScope guard(this);
8955    ITScope it_scope(this, &cond);
8956    vqrdmulh(cond, dt, rd, rn, rm);
8957  }
8958  void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
8959    Vqrdmulh(al, dt, rd, rn, rm);
8960  }
8961
8962  void Vqrdmulh(Condition cond,
8963                DataType dt,
8964                QRegister rd,
8965                QRegister rn,
8966                DRegisterLane rm) {
8967    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8968    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8969    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8970    VIXL_ASSERT(allow_macro_instructions_);
8971    VIXL_ASSERT(OutsideITBlock());
8972    MacroEmissionCheckScope guard(this);
8973    ITScope it_scope(this, &cond);
8974    vqrdmulh(cond, dt, rd, rn, rm);
8975  }
8976  void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
8977    Vqrdmulh(al, dt, rd, rn, rm);
8978  }
8979
8980  void Vqrshl(
8981      Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
8982    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8983    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8984    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
8985    VIXL_ASSERT(allow_macro_instructions_);
8986    VIXL_ASSERT(OutsideITBlock());
8987    MacroEmissionCheckScope guard(this);
8988    ITScope it_scope(this, &cond);
8989    vqrshl(cond, dt, rd, rm, rn);
8990  }
8991  void Vqrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
8992    Vqrshl(al, dt, rd, rm, rn);
8993  }
8994
8995  void Vqrshl(
8996      Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
8997    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
8998    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
8999    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9000    VIXL_ASSERT(allow_macro_instructions_);
9001    VIXL_ASSERT(OutsideITBlock());
9002    MacroEmissionCheckScope guard(this);
9003    ITScope it_scope(this, &cond);
9004    vqrshl(cond, dt, rd, rm, rn);
9005  }
9006  void Vqrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9007    Vqrshl(al, dt, rd, rm, rn);
9008  }
9009
9010  void Vqrshrn(Condition cond,
9011               DataType dt,
9012               DRegister rd,
9013               QRegister rm,
9014               const QOperand& operand) {
9015    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9016    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9017    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9018    VIXL_ASSERT(allow_macro_instructions_);
9019    VIXL_ASSERT(OutsideITBlock());
9020    MacroEmissionCheckScope guard(this);
9021    ITScope it_scope(this, &cond);
9022    vqrshrn(cond, dt, rd, rm, operand);
9023  }
9024  void Vqrshrn(DataType dt,
9025               DRegister rd,
9026               QRegister rm,
9027               const QOperand& operand) {
9028    Vqrshrn(al, dt, rd, rm, operand);
9029  }
9030
9031  void Vqrshrun(Condition cond,
9032                DataType dt,
9033                DRegister rd,
9034                QRegister rm,
9035                const QOperand& operand) {
9036    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9037    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9038    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9039    VIXL_ASSERT(allow_macro_instructions_);
9040    VIXL_ASSERT(OutsideITBlock());
9041    MacroEmissionCheckScope guard(this);
9042    ITScope it_scope(this, &cond);
9043    vqrshrun(cond, dt, rd, rm, operand);
9044  }
9045  void Vqrshrun(DataType dt,
9046                DRegister rd,
9047                QRegister rm,
9048                const QOperand& operand) {
9049    Vqrshrun(al, dt, rd, rm, operand);
9050  }
9051
9052  void Vqshl(Condition cond,
9053             DataType dt,
9054             DRegister rd,
9055             DRegister rm,
9056             const DOperand& operand) {
9057    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9058    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9059    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9060    VIXL_ASSERT(allow_macro_instructions_);
9061    VIXL_ASSERT(OutsideITBlock());
9062    MacroEmissionCheckScope guard(this);
9063    ITScope it_scope(this, &cond);
9064    vqshl(cond, dt, rd, rm, operand);
9065  }
9066  void Vqshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9067    Vqshl(al, dt, rd, rm, operand);
9068  }
9069
9070  void Vqshl(Condition cond,
9071             DataType dt,
9072             QRegister rd,
9073             QRegister rm,
9074             const QOperand& operand) {
9075    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9076    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9077    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9078    VIXL_ASSERT(allow_macro_instructions_);
9079    VIXL_ASSERT(OutsideITBlock());
9080    MacroEmissionCheckScope guard(this);
9081    ITScope it_scope(this, &cond);
9082    vqshl(cond, dt, rd, rm, operand);
9083  }
9084  void Vqshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9085    Vqshl(al, dt, rd, rm, operand);
9086  }
9087
9088  void Vqshlu(Condition cond,
9089              DataType dt,
9090              DRegister rd,
9091              DRegister rm,
9092              const DOperand& operand) {
9093    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9094    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9095    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9096    VIXL_ASSERT(allow_macro_instructions_);
9097    VIXL_ASSERT(OutsideITBlock());
9098    MacroEmissionCheckScope guard(this);
9099    ITScope it_scope(this, &cond);
9100    vqshlu(cond, dt, rd, rm, operand);
9101  }
9102  void Vqshlu(DataType dt,
9103              DRegister rd,
9104              DRegister rm,
9105              const DOperand& operand) {
9106    Vqshlu(al, dt, rd, rm, operand);
9107  }
9108
9109  void Vqshlu(Condition cond,
9110              DataType dt,
9111              QRegister rd,
9112              QRegister rm,
9113              const QOperand& operand) {
9114    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9115    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9116    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9117    VIXL_ASSERT(allow_macro_instructions_);
9118    VIXL_ASSERT(OutsideITBlock());
9119    MacroEmissionCheckScope guard(this);
9120    ITScope it_scope(this, &cond);
9121    vqshlu(cond, dt, rd, rm, operand);
9122  }
9123  void Vqshlu(DataType dt,
9124              QRegister rd,
9125              QRegister rm,
9126              const QOperand& operand) {
9127    Vqshlu(al, dt, rd, rm, operand);
9128  }
9129
9130  void Vqshrn(Condition cond,
9131              DataType dt,
9132              DRegister rd,
9133              QRegister rm,
9134              const QOperand& operand) {
9135    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9136    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9137    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9138    VIXL_ASSERT(allow_macro_instructions_);
9139    VIXL_ASSERT(OutsideITBlock());
9140    MacroEmissionCheckScope guard(this);
9141    ITScope it_scope(this, &cond);
9142    vqshrn(cond, dt, rd, rm, operand);
9143  }
9144  void Vqshrn(DataType dt,
9145              DRegister rd,
9146              QRegister rm,
9147              const QOperand& operand) {
9148    Vqshrn(al, dt, rd, rm, operand);
9149  }
9150
9151  void Vqshrun(Condition cond,
9152               DataType dt,
9153               DRegister rd,
9154               QRegister rm,
9155               const QOperand& operand) {
9156    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9157    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9158    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9159    VIXL_ASSERT(allow_macro_instructions_);
9160    VIXL_ASSERT(OutsideITBlock());
9161    MacroEmissionCheckScope guard(this);
9162    ITScope it_scope(this, &cond);
9163    vqshrun(cond, dt, rd, rm, operand);
9164  }
9165  void Vqshrun(DataType dt,
9166               DRegister rd,
9167               QRegister rm,
9168               const QOperand& operand) {
9169    Vqshrun(al, dt, rd, rm, operand);
9170  }
9171
9172  void Vqsub(
9173      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9174    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9175    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9176    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9177    VIXL_ASSERT(allow_macro_instructions_);
9178    VIXL_ASSERT(OutsideITBlock());
9179    MacroEmissionCheckScope guard(this);
9180    ITScope it_scope(this, &cond);
9181    vqsub(cond, dt, rd, rn, rm);
9182  }
9183  void Vqsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9184    Vqsub(al, dt, rd, rn, rm);
9185  }
9186
9187  void Vqsub(
9188      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister 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    ITScope it_scope(this, &cond);
9196    vqsub(cond, dt, rd, rn, rm);
9197  }
9198  void Vqsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9199    Vqsub(al, dt, rd, rn, rm);
9200  }
9201
9202  void Vraddhn(
9203      Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9204    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9205    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9206    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9207    VIXL_ASSERT(allow_macro_instructions_);
9208    VIXL_ASSERT(OutsideITBlock());
9209    MacroEmissionCheckScope guard(this);
9210    ITScope it_scope(this, &cond);
9211    vraddhn(cond, dt, rd, rn, rm);
9212  }
9213  void Vraddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9214    Vraddhn(al, dt, rd, rn, rm);
9215  }
9216
9217  void Vrecpe(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9218    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9219    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9220    VIXL_ASSERT(allow_macro_instructions_);
9221    VIXL_ASSERT(OutsideITBlock());
9222    MacroEmissionCheckScope guard(this);
9223    ITScope it_scope(this, &cond);
9224    vrecpe(cond, dt, rd, rm);
9225  }
9226  void Vrecpe(DataType dt, DRegister rd, DRegister rm) {
9227    Vrecpe(al, dt, rd, rm);
9228  }
9229
9230  void Vrecpe(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9231    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9232    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9233    VIXL_ASSERT(allow_macro_instructions_);
9234    VIXL_ASSERT(OutsideITBlock());
9235    MacroEmissionCheckScope guard(this);
9236    ITScope it_scope(this, &cond);
9237    vrecpe(cond, dt, rd, rm);
9238  }
9239  void Vrecpe(DataType dt, QRegister rd, QRegister rm) {
9240    Vrecpe(al, dt, rd, rm);
9241  }
9242
9243  void Vrecps(
9244      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9245    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9246    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9247    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9248    VIXL_ASSERT(allow_macro_instructions_);
9249    VIXL_ASSERT(OutsideITBlock());
9250    MacroEmissionCheckScope guard(this);
9251    ITScope it_scope(this, &cond);
9252    vrecps(cond, dt, rd, rn, rm);
9253  }
9254  void Vrecps(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9255    Vrecps(al, dt, rd, rn, rm);
9256  }
9257
9258  void Vrecps(
9259      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9260    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9261    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9262    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9263    VIXL_ASSERT(allow_macro_instructions_);
9264    VIXL_ASSERT(OutsideITBlock());
9265    MacroEmissionCheckScope guard(this);
9266    ITScope it_scope(this, &cond);
9267    vrecps(cond, dt, rd, rn, rm);
9268  }
9269  void Vrecps(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9270    Vrecps(al, dt, rd, rn, rm);
9271  }
9272
9273  void Vrev16(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9274    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9275    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9276    VIXL_ASSERT(allow_macro_instructions_);
9277    VIXL_ASSERT(OutsideITBlock());
9278    MacroEmissionCheckScope guard(this);
9279    ITScope it_scope(this, &cond);
9280    vrev16(cond, dt, rd, rm);
9281  }
9282  void Vrev16(DataType dt, DRegister rd, DRegister rm) {
9283    Vrev16(al, dt, rd, rm);
9284  }
9285
9286  void Vrev16(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9287    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9288    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9289    VIXL_ASSERT(allow_macro_instructions_);
9290    VIXL_ASSERT(OutsideITBlock());
9291    MacroEmissionCheckScope guard(this);
9292    ITScope it_scope(this, &cond);
9293    vrev16(cond, dt, rd, rm);
9294  }
9295  void Vrev16(DataType dt, QRegister rd, QRegister rm) {
9296    Vrev16(al, dt, rd, rm);
9297  }
9298
9299  void Vrev32(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9300    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9301    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9302    VIXL_ASSERT(allow_macro_instructions_);
9303    VIXL_ASSERT(OutsideITBlock());
9304    MacroEmissionCheckScope guard(this);
9305    ITScope it_scope(this, &cond);
9306    vrev32(cond, dt, rd, rm);
9307  }
9308  void Vrev32(DataType dt, DRegister rd, DRegister rm) {
9309    Vrev32(al, dt, rd, rm);
9310  }
9311
9312  void Vrev32(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9313    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9314    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9315    VIXL_ASSERT(allow_macro_instructions_);
9316    VIXL_ASSERT(OutsideITBlock());
9317    MacroEmissionCheckScope guard(this);
9318    ITScope it_scope(this, &cond);
9319    vrev32(cond, dt, rd, rm);
9320  }
9321  void Vrev32(DataType dt, QRegister rd, QRegister rm) {
9322    Vrev32(al, dt, rd, rm);
9323  }
9324
9325  void Vrev64(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9326    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9327    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9328    VIXL_ASSERT(allow_macro_instructions_);
9329    VIXL_ASSERT(OutsideITBlock());
9330    MacroEmissionCheckScope guard(this);
9331    ITScope it_scope(this, &cond);
9332    vrev64(cond, dt, rd, rm);
9333  }
9334  void Vrev64(DataType dt, DRegister rd, DRegister rm) {
9335    Vrev64(al, dt, rd, rm);
9336  }
9337
9338  void Vrev64(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9339    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9340    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9341    VIXL_ASSERT(allow_macro_instructions_);
9342    VIXL_ASSERT(OutsideITBlock());
9343    MacroEmissionCheckScope guard(this);
9344    ITScope it_scope(this, &cond);
9345    vrev64(cond, dt, rd, rm);
9346  }
9347  void Vrev64(DataType dt, QRegister rd, QRegister rm) {
9348    Vrev64(al, dt, rd, rm);
9349  }
9350
9351  void Vrhadd(
9352      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister 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    ITScope it_scope(this, &cond);
9360    vrhadd(cond, dt, rd, rn, rm);
9361  }
9362  void Vrhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9363    Vrhadd(al, dt, rd, rn, rm);
9364  }
9365
9366  void Vrhadd(
9367      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9368    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9369    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9370    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9371    VIXL_ASSERT(allow_macro_instructions_);
9372    VIXL_ASSERT(OutsideITBlock());
9373    MacroEmissionCheckScope guard(this);
9374    ITScope it_scope(this, &cond);
9375    vrhadd(cond, dt, rd, rn, rm);
9376  }
9377  void Vrhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9378    Vrhadd(al, dt, rd, rn, rm);
9379  }
9380
9381  void Vrinta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9382    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9383    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9384    VIXL_ASSERT(allow_macro_instructions_);
9385    VIXL_ASSERT(OutsideITBlock());
9386    MacroEmissionCheckScope guard(this);
9387    vrinta(dt1, dt2, rd, rm);
9388  }
9389
9390  void Vrinta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9391    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9392    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9393    VIXL_ASSERT(allow_macro_instructions_);
9394    VIXL_ASSERT(OutsideITBlock());
9395    MacroEmissionCheckScope guard(this);
9396    vrinta(dt1, dt2, rd, rm);
9397  }
9398
9399  void Vrinta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9400    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9401    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9402    VIXL_ASSERT(allow_macro_instructions_);
9403    VIXL_ASSERT(OutsideITBlock());
9404    MacroEmissionCheckScope guard(this);
9405    vrinta(dt1, dt2, rd, rm);
9406  }
9407
9408  void Vrintm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9409    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9410    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9411    VIXL_ASSERT(allow_macro_instructions_);
9412    VIXL_ASSERT(OutsideITBlock());
9413    MacroEmissionCheckScope guard(this);
9414    vrintm(dt1, dt2, rd, rm);
9415  }
9416
9417  void Vrintm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9418    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9419    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9420    VIXL_ASSERT(allow_macro_instructions_);
9421    VIXL_ASSERT(OutsideITBlock());
9422    MacroEmissionCheckScope guard(this);
9423    vrintm(dt1, dt2, rd, rm);
9424  }
9425
9426  void Vrintm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9427    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9428    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9429    VIXL_ASSERT(allow_macro_instructions_);
9430    VIXL_ASSERT(OutsideITBlock());
9431    MacroEmissionCheckScope guard(this);
9432    vrintm(dt1, dt2, rd, rm);
9433  }
9434
9435  void Vrintn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9436    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9437    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9438    VIXL_ASSERT(allow_macro_instructions_);
9439    VIXL_ASSERT(OutsideITBlock());
9440    MacroEmissionCheckScope guard(this);
9441    vrintn(dt1, dt2, rd, rm);
9442  }
9443
9444  void Vrintn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9445    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9446    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9447    VIXL_ASSERT(allow_macro_instructions_);
9448    VIXL_ASSERT(OutsideITBlock());
9449    MacroEmissionCheckScope guard(this);
9450    vrintn(dt1, dt2, rd, rm);
9451  }
9452
9453  void Vrintn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9454    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9455    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9456    VIXL_ASSERT(allow_macro_instructions_);
9457    VIXL_ASSERT(OutsideITBlock());
9458    MacroEmissionCheckScope guard(this);
9459    vrintn(dt1, dt2, rd, rm);
9460  }
9461
9462  void Vrintp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9463    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9464    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9465    VIXL_ASSERT(allow_macro_instructions_);
9466    VIXL_ASSERT(OutsideITBlock());
9467    MacroEmissionCheckScope guard(this);
9468    vrintp(dt1, dt2, rd, rm);
9469  }
9470
9471  void Vrintp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9472    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9473    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9474    VIXL_ASSERT(allow_macro_instructions_);
9475    VIXL_ASSERT(OutsideITBlock());
9476    MacroEmissionCheckScope guard(this);
9477    vrintp(dt1, dt2, rd, rm);
9478  }
9479
9480  void Vrintp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9481    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9482    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9483    VIXL_ASSERT(allow_macro_instructions_);
9484    VIXL_ASSERT(OutsideITBlock());
9485    MacroEmissionCheckScope guard(this);
9486    vrintp(dt1, dt2, rd, rm);
9487  }
9488
9489  void Vrintr(
9490      Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9491    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9492    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9493    VIXL_ASSERT(allow_macro_instructions_);
9494    VIXL_ASSERT(OutsideITBlock());
9495    MacroEmissionCheckScope guard(this);
9496    ITScope it_scope(this, &cond);
9497    vrintr(cond, dt1, dt2, rd, rm);
9498  }
9499  void Vrintr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9500    Vrintr(al, dt1, dt2, rd, rm);
9501  }
9502
9503  void Vrintr(
9504      Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9505    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9506    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9507    VIXL_ASSERT(allow_macro_instructions_);
9508    VIXL_ASSERT(OutsideITBlock());
9509    MacroEmissionCheckScope guard(this);
9510    ITScope it_scope(this, &cond);
9511    vrintr(cond, dt1, dt2, rd, rm);
9512  }
9513  void Vrintr(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9514    Vrintr(al, dt1, dt2, rd, rm);
9515  }
9516
9517  void Vrintx(
9518      Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9519    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9520    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9521    VIXL_ASSERT(allow_macro_instructions_);
9522    VIXL_ASSERT(OutsideITBlock());
9523    MacroEmissionCheckScope guard(this);
9524    ITScope it_scope(this, &cond);
9525    vrintx(cond, dt1, dt2, rd, rm);
9526  }
9527  void Vrintx(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9528    Vrintx(al, dt1, dt2, rd, rm);
9529  }
9530
9531  void Vrintx(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9532    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9533    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9534    VIXL_ASSERT(allow_macro_instructions_);
9535    VIXL_ASSERT(OutsideITBlock());
9536    MacroEmissionCheckScope guard(this);
9537    vrintx(dt1, dt2, rd, rm);
9538  }
9539
9540  void Vrintx(
9541      Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9542    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9543    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9544    VIXL_ASSERT(allow_macro_instructions_);
9545    VIXL_ASSERT(OutsideITBlock());
9546    MacroEmissionCheckScope guard(this);
9547    ITScope it_scope(this, &cond);
9548    vrintx(cond, dt1, dt2, rd, rm);
9549  }
9550  void Vrintx(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9551    Vrintx(al, dt1, dt2, rd, rm);
9552  }
9553
9554  void Vrintz(
9555      Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9556    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9557    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9558    VIXL_ASSERT(allow_macro_instructions_);
9559    VIXL_ASSERT(OutsideITBlock());
9560    MacroEmissionCheckScope guard(this);
9561    ITScope it_scope(this, &cond);
9562    vrintz(cond, dt1, dt2, rd, rm);
9563  }
9564  void Vrintz(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
9565    Vrintz(al, dt1, dt2, rd, rm);
9566  }
9567
9568  void Vrintz(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
9569    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9570    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9571    VIXL_ASSERT(allow_macro_instructions_);
9572    VIXL_ASSERT(OutsideITBlock());
9573    MacroEmissionCheckScope guard(this);
9574    vrintz(dt1, dt2, rd, rm);
9575  }
9576
9577  void Vrintz(
9578      Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9579    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9580    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9581    VIXL_ASSERT(allow_macro_instructions_);
9582    VIXL_ASSERT(OutsideITBlock());
9583    MacroEmissionCheckScope guard(this);
9584    ITScope it_scope(this, &cond);
9585    vrintz(cond, dt1, dt2, rd, rm);
9586  }
9587  void Vrintz(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
9588    Vrintz(al, dt1, dt2, rd, rm);
9589  }
9590
9591  void Vrshl(
9592      Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
9593    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9594    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9595    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9596    VIXL_ASSERT(allow_macro_instructions_);
9597    VIXL_ASSERT(OutsideITBlock());
9598    MacroEmissionCheckScope guard(this);
9599    ITScope it_scope(this, &cond);
9600    vrshl(cond, dt, rd, rm, rn);
9601  }
9602  void Vrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
9603    Vrshl(al, dt, rd, rm, rn);
9604  }
9605
9606  void Vrshl(
9607      Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9608    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9609    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9610    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9611    VIXL_ASSERT(allow_macro_instructions_);
9612    VIXL_ASSERT(OutsideITBlock());
9613    MacroEmissionCheckScope guard(this);
9614    ITScope it_scope(this, &cond);
9615    vrshl(cond, dt, rd, rm, rn);
9616  }
9617  void Vrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
9618    Vrshl(al, dt, rd, rm, rn);
9619  }
9620
9621  void Vrshr(Condition cond,
9622             DataType dt,
9623             DRegister rd,
9624             DRegister rm,
9625             const DOperand& operand) {
9626    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9627    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9628    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9629    VIXL_ASSERT(allow_macro_instructions_);
9630    VIXL_ASSERT(OutsideITBlock());
9631    MacroEmissionCheckScope guard(this);
9632    ITScope it_scope(this, &cond);
9633    vrshr(cond, dt, rd, rm, operand);
9634  }
9635  void Vrshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9636    Vrshr(al, dt, rd, rm, operand);
9637  }
9638
9639  void Vrshr(Condition cond,
9640             DataType dt,
9641             QRegister rd,
9642             QRegister rm,
9643             const QOperand& operand) {
9644    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9645    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9646    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9647    VIXL_ASSERT(allow_macro_instructions_);
9648    VIXL_ASSERT(OutsideITBlock());
9649    MacroEmissionCheckScope guard(this);
9650    ITScope it_scope(this, &cond);
9651    vrshr(cond, dt, rd, rm, operand);
9652  }
9653  void Vrshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9654    Vrshr(al, dt, rd, rm, operand);
9655  }
9656
9657  void Vrshrn(Condition cond,
9658              DataType dt,
9659              DRegister rd,
9660              QRegister rm,
9661              const QOperand& operand) {
9662    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9663    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9664    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9665    VIXL_ASSERT(allow_macro_instructions_);
9666    VIXL_ASSERT(OutsideITBlock());
9667    MacroEmissionCheckScope guard(this);
9668    ITScope it_scope(this, &cond);
9669    vrshrn(cond, dt, rd, rm, operand);
9670  }
9671  void Vrshrn(DataType dt,
9672              DRegister rd,
9673              QRegister rm,
9674              const QOperand& operand) {
9675    Vrshrn(al, dt, rd, rm, operand);
9676  }
9677
9678  void Vrsqrte(Condition cond, DataType dt, DRegister rd, DRegister rm) {
9679    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9680    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9681    VIXL_ASSERT(allow_macro_instructions_);
9682    VIXL_ASSERT(OutsideITBlock());
9683    MacroEmissionCheckScope guard(this);
9684    ITScope it_scope(this, &cond);
9685    vrsqrte(cond, dt, rd, rm);
9686  }
9687  void Vrsqrte(DataType dt, DRegister rd, DRegister rm) {
9688    Vrsqrte(al, dt, rd, rm);
9689  }
9690
9691  void Vrsqrte(Condition cond, DataType dt, QRegister rd, QRegister rm) {
9692    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9693    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9694    VIXL_ASSERT(allow_macro_instructions_);
9695    VIXL_ASSERT(OutsideITBlock());
9696    MacroEmissionCheckScope guard(this);
9697    ITScope it_scope(this, &cond);
9698    vrsqrte(cond, dt, rd, rm);
9699  }
9700  void Vrsqrte(DataType dt, QRegister rd, QRegister rm) {
9701    Vrsqrte(al, dt, rd, rm);
9702  }
9703
9704  void Vrsqrts(
9705      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9706    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9707    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9708    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9709    VIXL_ASSERT(allow_macro_instructions_);
9710    VIXL_ASSERT(OutsideITBlock());
9711    MacroEmissionCheckScope guard(this);
9712    ITScope it_scope(this, &cond);
9713    vrsqrts(cond, dt, rd, rn, rm);
9714  }
9715  void Vrsqrts(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9716    Vrsqrts(al, dt, rd, rn, rm);
9717  }
9718
9719  void Vrsqrts(
9720      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9721    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9722    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9723    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9724    VIXL_ASSERT(allow_macro_instructions_);
9725    VIXL_ASSERT(OutsideITBlock());
9726    MacroEmissionCheckScope guard(this);
9727    ITScope it_scope(this, &cond);
9728    vrsqrts(cond, dt, rd, rn, rm);
9729  }
9730  void Vrsqrts(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
9731    Vrsqrts(al, dt, rd, rn, rm);
9732  }
9733
9734  void Vrsra(Condition cond,
9735             DataType dt,
9736             DRegister rd,
9737             DRegister rm,
9738             const DOperand& operand) {
9739    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9740    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9741    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9742    VIXL_ASSERT(allow_macro_instructions_);
9743    VIXL_ASSERT(OutsideITBlock());
9744    MacroEmissionCheckScope guard(this);
9745    ITScope it_scope(this, &cond);
9746    vrsra(cond, dt, rd, rm, operand);
9747  }
9748  void Vrsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9749    Vrsra(al, dt, rd, rm, operand);
9750  }
9751
9752  void Vrsra(Condition cond,
9753             DataType dt,
9754             QRegister rd,
9755             QRegister rm,
9756             const QOperand& operand) {
9757    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9758    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9759    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9760    VIXL_ASSERT(allow_macro_instructions_);
9761    VIXL_ASSERT(OutsideITBlock());
9762    MacroEmissionCheckScope guard(this);
9763    ITScope it_scope(this, &cond);
9764    vrsra(cond, dt, rd, rm, operand);
9765  }
9766  void Vrsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9767    Vrsra(al, dt, rd, rm, operand);
9768  }
9769
9770  void Vrsubhn(
9771      Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9772    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9773    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9774    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9775    VIXL_ASSERT(allow_macro_instructions_);
9776    VIXL_ASSERT(OutsideITBlock());
9777    MacroEmissionCheckScope guard(this);
9778    ITScope it_scope(this, &cond);
9779    vrsubhn(cond, dt, rd, rn, rm);
9780  }
9781  void Vrsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
9782    Vrsubhn(al, dt, rd, rn, rm);
9783  }
9784
9785  void Vseleq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9786    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9787    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9788    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9789    VIXL_ASSERT(allow_macro_instructions_);
9790    VIXL_ASSERT(OutsideITBlock());
9791    MacroEmissionCheckScope guard(this);
9792    vseleq(dt, rd, rn, rm);
9793  }
9794
9795  void Vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9796    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9797    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9798    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9799    VIXL_ASSERT(allow_macro_instructions_);
9800    VIXL_ASSERT(OutsideITBlock());
9801    MacroEmissionCheckScope guard(this);
9802    vseleq(dt, rd, rn, rm);
9803  }
9804
9805  void Vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9806    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9807    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9808    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9809    VIXL_ASSERT(allow_macro_instructions_);
9810    VIXL_ASSERT(OutsideITBlock());
9811    MacroEmissionCheckScope guard(this);
9812    vselge(dt, rd, rn, rm);
9813  }
9814
9815  void Vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9816    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9817    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9818    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9819    VIXL_ASSERT(allow_macro_instructions_);
9820    VIXL_ASSERT(OutsideITBlock());
9821    MacroEmissionCheckScope guard(this);
9822    vselge(dt, rd, rn, rm);
9823  }
9824
9825  void Vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9826    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9827    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9828    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9829    VIXL_ASSERT(allow_macro_instructions_);
9830    VIXL_ASSERT(OutsideITBlock());
9831    MacroEmissionCheckScope guard(this);
9832    vselgt(dt, rd, rn, rm);
9833  }
9834
9835  void Vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9836    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9837    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9838    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9839    VIXL_ASSERT(allow_macro_instructions_);
9840    VIXL_ASSERT(OutsideITBlock());
9841    MacroEmissionCheckScope guard(this);
9842    vselgt(dt, rd, rn, rm);
9843  }
9844
9845  void Vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
9846    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9847    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9848    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9849    VIXL_ASSERT(allow_macro_instructions_);
9850    VIXL_ASSERT(OutsideITBlock());
9851    MacroEmissionCheckScope guard(this);
9852    vselvs(dt, rd, rn, rm);
9853  }
9854
9855  void Vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
9856    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9857    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
9858    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9859    VIXL_ASSERT(allow_macro_instructions_);
9860    VIXL_ASSERT(OutsideITBlock());
9861    MacroEmissionCheckScope guard(this);
9862    vselvs(dt, rd, rn, rm);
9863  }
9864
9865  void Vshl(Condition cond,
9866            DataType dt,
9867            DRegister rd,
9868            DRegister rm,
9869            const DOperand& operand) {
9870    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9871    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9872    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9873    VIXL_ASSERT(allow_macro_instructions_);
9874    VIXL_ASSERT(OutsideITBlock());
9875    MacroEmissionCheckScope guard(this);
9876    ITScope it_scope(this, &cond);
9877    vshl(cond, dt, rd, rm, operand);
9878  }
9879  void Vshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9880    Vshl(al, dt, rd, rm, operand);
9881  }
9882
9883  void Vshl(Condition cond,
9884            DataType dt,
9885            QRegister rd,
9886            QRegister rm,
9887            const QOperand& operand) {
9888    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9889    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9890    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9891    VIXL_ASSERT(allow_macro_instructions_);
9892    VIXL_ASSERT(OutsideITBlock());
9893    MacroEmissionCheckScope guard(this);
9894    ITScope it_scope(this, &cond);
9895    vshl(cond, dt, rd, rm, operand);
9896  }
9897  void Vshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9898    Vshl(al, dt, rd, rm, operand);
9899  }
9900
9901  void Vshll(Condition cond,
9902             DataType dt,
9903             QRegister rd,
9904             DRegister rm,
9905             const DOperand& operand) {
9906    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9907    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9908    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9909    VIXL_ASSERT(allow_macro_instructions_);
9910    VIXL_ASSERT(OutsideITBlock());
9911    MacroEmissionCheckScope guard(this);
9912    ITScope it_scope(this, &cond);
9913    vshll(cond, dt, rd, rm, operand);
9914  }
9915  void Vshll(DataType dt, QRegister rd, DRegister rm, const DOperand& operand) {
9916    Vshll(al, dt, rd, rm, operand);
9917  }
9918
9919  void Vshr(Condition cond,
9920            DataType dt,
9921            DRegister rd,
9922            DRegister rm,
9923            const DOperand& operand) {
9924    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9925    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9926    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9927    VIXL_ASSERT(allow_macro_instructions_);
9928    VIXL_ASSERT(OutsideITBlock());
9929    MacroEmissionCheckScope guard(this);
9930    ITScope it_scope(this, &cond);
9931    vshr(cond, dt, rd, rm, operand);
9932  }
9933  void Vshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9934    Vshr(al, dt, rd, rm, operand);
9935  }
9936
9937  void Vshr(Condition cond,
9938            DataType dt,
9939            QRegister rd,
9940            QRegister rm,
9941            const QOperand& operand) {
9942    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9943    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9944    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9945    VIXL_ASSERT(allow_macro_instructions_);
9946    VIXL_ASSERT(OutsideITBlock());
9947    MacroEmissionCheckScope guard(this);
9948    ITScope it_scope(this, &cond);
9949    vshr(cond, dt, rd, rm, operand);
9950  }
9951  void Vshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
9952    Vshr(al, dt, rd, rm, operand);
9953  }
9954
9955  void Vshrn(Condition cond,
9956             DataType dt,
9957             DRegister rd,
9958             QRegister rm,
9959             const QOperand& operand) {
9960    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9961    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9962    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9963    VIXL_ASSERT(allow_macro_instructions_);
9964    VIXL_ASSERT(OutsideITBlock());
9965    MacroEmissionCheckScope guard(this);
9966    ITScope it_scope(this, &cond);
9967    vshrn(cond, dt, rd, rm, operand);
9968  }
9969  void Vshrn(DataType dt, DRegister rd, QRegister rm, const QOperand& operand) {
9970    Vshrn(al, dt, rd, rm, operand);
9971  }
9972
9973  void Vsli(Condition cond,
9974            DataType dt,
9975            DRegister rd,
9976            DRegister rm,
9977            const DOperand& operand) {
9978    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9979    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9980    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9981    VIXL_ASSERT(allow_macro_instructions_);
9982    VIXL_ASSERT(OutsideITBlock());
9983    MacroEmissionCheckScope guard(this);
9984    ITScope it_scope(this, &cond);
9985    vsli(cond, dt, rd, rm, operand);
9986  }
9987  void Vsli(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
9988    Vsli(al, dt, rd, rm, operand);
9989  }
9990
9991  void Vsli(Condition cond,
9992            DataType dt,
9993            QRegister rd,
9994            QRegister rm,
9995            const QOperand& operand) {
9996    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
9997    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
9998    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
9999    VIXL_ASSERT(allow_macro_instructions_);
10000    VIXL_ASSERT(OutsideITBlock());
10001    MacroEmissionCheckScope guard(this);
10002    ITScope it_scope(this, &cond);
10003    vsli(cond, dt, rd, rm, operand);
10004  }
10005  void Vsli(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
10006    Vsli(al, dt, rd, rm, operand);
10007  }
10008
10009  void Vsqrt(Condition cond, DataType dt, SRegister rd, SRegister rm) {
10010    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10011    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10012    VIXL_ASSERT(allow_macro_instructions_);
10013    VIXL_ASSERT(OutsideITBlock());
10014    MacroEmissionCheckScope guard(this);
10015    ITScope it_scope(this, &cond);
10016    vsqrt(cond, dt, rd, rm);
10017  }
10018  void Vsqrt(DataType dt, SRegister rd, SRegister rm) { Vsqrt(al, dt, rd, rm); }
10019
10020  void Vsqrt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10021    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10022    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10023    VIXL_ASSERT(allow_macro_instructions_);
10024    VIXL_ASSERT(OutsideITBlock());
10025    MacroEmissionCheckScope guard(this);
10026    ITScope it_scope(this, &cond);
10027    vsqrt(cond, dt, rd, rm);
10028  }
10029  void Vsqrt(DataType dt, DRegister rd, DRegister rm) { Vsqrt(al, dt, rd, rm); }
10030
10031  void Vsra(Condition cond,
10032            DataType dt,
10033            DRegister rd,
10034            DRegister rm,
10035            const DOperand& operand) {
10036    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10037    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10038    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10039    VIXL_ASSERT(allow_macro_instructions_);
10040    VIXL_ASSERT(OutsideITBlock());
10041    MacroEmissionCheckScope guard(this);
10042    ITScope it_scope(this, &cond);
10043    vsra(cond, dt, rd, rm, operand);
10044  }
10045  void Vsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
10046    Vsra(al, dt, rd, rm, operand);
10047  }
10048
10049  void Vsra(Condition cond,
10050            DataType dt,
10051            QRegister rd,
10052            QRegister rm,
10053            const QOperand& operand) {
10054    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10055    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10056    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10057    VIXL_ASSERT(allow_macro_instructions_);
10058    VIXL_ASSERT(OutsideITBlock());
10059    MacroEmissionCheckScope guard(this);
10060    ITScope it_scope(this, &cond);
10061    vsra(cond, dt, rd, rm, operand);
10062  }
10063  void Vsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
10064    Vsra(al, dt, rd, rm, operand);
10065  }
10066
10067  void Vsri(Condition cond,
10068            DataType dt,
10069            DRegister rd,
10070            DRegister rm,
10071            const DOperand& operand) {
10072    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10073    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10074    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10075    VIXL_ASSERT(allow_macro_instructions_);
10076    VIXL_ASSERT(OutsideITBlock());
10077    MacroEmissionCheckScope guard(this);
10078    ITScope it_scope(this, &cond);
10079    vsri(cond, dt, rd, rm, operand);
10080  }
10081  void Vsri(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
10082    Vsri(al, dt, rd, rm, operand);
10083  }
10084
10085  void Vsri(Condition cond,
10086            DataType dt,
10087            QRegister rd,
10088            QRegister rm,
10089            const QOperand& operand) {
10090    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10091    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10092    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10093    VIXL_ASSERT(allow_macro_instructions_);
10094    VIXL_ASSERT(OutsideITBlock());
10095    MacroEmissionCheckScope guard(this);
10096    ITScope it_scope(this, &cond);
10097    vsri(cond, dt, rd, rm, operand);
10098  }
10099  void Vsri(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
10100    Vsri(al, dt, rd, rm, operand);
10101  }
10102
10103  void Vst1(Condition cond,
10104            DataType dt,
10105            const NeonRegisterList& nreglist,
10106            const AlignedMemOperand& operand) {
10107    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10108    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10109    VIXL_ASSERT(allow_macro_instructions_);
10110    VIXL_ASSERT(OutsideITBlock());
10111    MacroEmissionCheckScope guard(this);
10112    ITScope it_scope(this, &cond);
10113    vst1(cond, dt, nreglist, operand);
10114  }
10115  void Vst1(DataType dt,
10116            const NeonRegisterList& nreglist,
10117            const AlignedMemOperand& operand) {
10118    Vst1(al, dt, nreglist, operand);
10119  }
10120
10121  void Vst2(Condition cond,
10122            DataType dt,
10123            const NeonRegisterList& nreglist,
10124            const AlignedMemOperand& operand) {
10125    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10126    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10127    VIXL_ASSERT(allow_macro_instructions_);
10128    VIXL_ASSERT(OutsideITBlock());
10129    MacroEmissionCheckScope guard(this);
10130    ITScope it_scope(this, &cond);
10131    vst2(cond, dt, nreglist, operand);
10132  }
10133  void Vst2(DataType dt,
10134            const NeonRegisterList& nreglist,
10135            const AlignedMemOperand& operand) {
10136    Vst2(al, dt, nreglist, operand);
10137  }
10138
10139  void Vst3(Condition cond,
10140            DataType dt,
10141            const NeonRegisterList& nreglist,
10142            const AlignedMemOperand& operand) {
10143    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10144    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10145    VIXL_ASSERT(allow_macro_instructions_);
10146    VIXL_ASSERT(OutsideITBlock());
10147    MacroEmissionCheckScope guard(this);
10148    ITScope it_scope(this, &cond);
10149    vst3(cond, dt, nreglist, operand);
10150  }
10151  void Vst3(DataType dt,
10152            const NeonRegisterList& nreglist,
10153            const AlignedMemOperand& operand) {
10154    Vst3(al, dt, nreglist, operand);
10155  }
10156
10157  void Vst3(Condition cond,
10158            DataType dt,
10159            const NeonRegisterList& nreglist,
10160            const MemOperand& operand) {
10161    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10162    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10163    VIXL_ASSERT(allow_macro_instructions_);
10164    VIXL_ASSERT(OutsideITBlock());
10165    MacroEmissionCheckScope guard(this);
10166    ITScope it_scope(this, &cond);
10167    vst3(cond, dt, nreglist, operand);
10168  }
10169  void Vst3(DataType dt,
10170            const NeonRegisterList& nreglist,
10171            const MemOperand& operand) {
10172    Vst3(al, dt, nreglist, operand);
10173  }
10174
10175  void Vst4(Condition cond,
10176            DataType dt,
10177            const NeonRegisterList& nreglist,
10178            const AlignedMemOperand& operand) {
10179    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10180    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10181    VIXL_ASSERT(allow_macro_instructions_);
10182    VIXL_ASSERT(OutsideITBlock());
10183    MacroEmissionCheckScope guard(this);
10184    ITScope it_scope(this, &cond);
10185    vst4(cond, dt, nreglist, operand);
10186  }
10187  void Vst4(DataType dt,
10188            const NeonRegisterList& nreglist,
10189            const AlignedMemOperand& operand) {
10190    Vst4(al, dt, nreglist, operand);
10191  }
10192
10193  void Vstm(Condition cond,
10194            DataType dt,
10195            Register rn,
10196            WriteBack write_back,
10197            DRegisterList dreglist) {
10198    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10199    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10200    VIXL_ASSERT(allow_macro_instructions_);
10201    VIXL_ASSERT(OutsideITBlock());
10202    MacroEmissionCheckScope guard(this);
10203    ITScope it_scope(this, &cond);
10204    vstm(cond, dt, rn, write_back, dreglist);
10205  }
10206  void Vstm(DataType dt,
10207            Register rn,
10208            WriteBack write_back,
10209            DRegisterList dreglist) {
10210    Vstm(al, dt, rn, write_back, dreglist);
10211  }
10212  void Vstm(Condition cond,
10213            Register rn,
10214            WriteBack write_back,
10215            DRegisterList dreglist) {
10216    Vstm(cond, kDataTypeValueNone, rn, write_back, dreglist);
10217  }
10218  void Vstm(Register rn, WriteBack write_back, DRegisterList dreglist) {
10219    Vstm(al, kDataTypeValueNone, rn, write_back, dreglist);
10220  }
10221
10222  void Vstm(Condition cond,
10223            DataType dt,
10224            Register rn,
10225            WriteBack write_back,
10226            SRegisterList sreglist) {
10227    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10228    VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10229    VIXL_ASSERT(allow_macro_instructions_);
10230    VIXL_ASSERT(OutsideITBlock());
10231    MacroEmissionCheckScope guard(this);
10232    ITScope it_scope(this, &cond);
10233    vstm(cond, dt, rn, write_back, sreglist);
10234  }
10235  void Vstm(DataType dt,
10236            Register rn,
10237            WriteBack write_back,
10238            SRegisterList sreglist) {
10239    Vstm(al, dt, rn, write_back, sreglist);
10240  }
10241  void Vstm(Condition cond,
10242            Register rn,
10243            WriteBack write_back,
10244            SRegisterList sreglist) {
10245    Vstm(cond, kDataTypeValueNone, rn, write_back, sreglist);
10246  }
10247  void Vstm(Register rn, WriteBack write_back, SRegisterList sreglist) {
10248    Vstm(al, kDataTypeValueNone, rn, write_back, sreglist);
10249  }
10250
10251  void Vstmdb(Condition cond,
10252              DataType dt,
10253              Register rn,
10254              WriteBack write_back,
10255              DRegisterList dreglist) {
10256    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10257    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10258    VIXL_ASSERT(allow_macro_instructions_);
10259    VIXL_ASSERT(OutsideITBlock());
10260    MacroEmissionCheckScope guard(this);
10261    ITScope it_scope(this, &cond);
10262    vstmdb(cond, dt, rn, write_back, dreglist);
10263  }
10264  void Vstmdb(DataType dt,
10265              Register rn,
10266              WriteBack write_back,
10267              DRegisterList dreglist) {
10268    Vstmdb(al, dt, rn, write_back, dreglist);
10269  }
10270  void Vstmdb(Condition cond,
10271              Register rn,
10272              WriteBack write_back,
10273              DRegisterList dreglist) {
10274    Vstmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
10275  }
10276  void Vstmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
10277    Vstmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
10278  }
10279
10280  void Vstmdb(Condition cond,
10281              DataType dt,
10282              Register rn,
10283              WriteBack write_back,
10284              SRegisterList sreglist) {
10285    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10286    VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10287    VIXL_ASSERT(allow_macro_instructions_);
10288    VIXL_ASSERT(OutsideITBlock());
10289    MacroEmissionCheckScope guard(this);
10290    ITScope it_scope(this, &cond);
10291    vstmdb(cond, dt, rn, write_back, sreglist);
10292  }
10293  void Vstmdb(DataType dt,
10294              Register rn,
10295              WriteBack write_back,
10296              SRegisterList sreglist) {
10297    Vstmdb(al, dt, rn, write_back, sreglist);
10298  }
10299  void Vstmdb(Condition cond,
10300              Register rn,
10301              WriteBack write_back,
10302              SRegisterList sreglist) {
10303    Vstmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
10304  }
10305  void Vstmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
10306    Vstmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
10307  }
10308
10309  void Vstmia(Condition cond,
10310              DataType dt,
10311              Register rn,
10312              WriteBack write_back,
10313              DRegisterList dreglist) {
10314    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10315    VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist));
10316    VIXL_ASSERT(allow_macro_instructions_);
10317    VIXL_ASSERT(OutsideITBlock());
10318    MacroEmissionCheckScope guard(this);
10319    ITScope it_scope(this, &cond);
10320    vstmia(cond, dt, rn, write_back, dreglist);
10321  }
10322  void Vstmia(DataType dt,
10323              Register rn,
10324              WriteBack write_back,
10325              DRegisterList dreglist) {
10326    Vstmia(al, dt, rn, write_back, dreglist);
10327  }
10328  void Vstmia(Condition cond,
10329              Register rn,
10330              WriteBack write_back,
10331              DRegisterList dreglist) {
10332    Vstmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
10333  }
10334  void Vstmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
10335    Vstmia(al, kDataTypeValueNone, rn, write_back, dreglist);
10336  }
10337
10338  void Vstmia(Condition cond,
10339              DataType dt,
10340              Register rn,
10341              WriteBack write_back,
10342              SRegisterList sreglist) {
10343    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10344    VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist));
10345    VIXL_ASSERT(allow_macro_instructions_);
10346    VIXL_ASSERT(OutsideITBlock());
10347    MacroEmissionCheckScope guard(this);
10348    ITScope it_scope(this, &cond);
10349    vstmia(cond, dt, rn, write_back, sreglist);
10350  }
10351  void Vstmia(DataType dt,
10352              Register rn,
10353              WriteBack write_back,
10354              SRegisterList sreglist) {
10355    Vstmia(al, dt, rn, write_back, sreglist);
10356  }
10357  void Vstmia(Condition cond,
10358              Register rn,
10359              WriteBack write_back,
10360              SRegisterList sreglist) {
10361    Vstmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
10362  }
10363  void Vstmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
10364    Vstmia(al, kDataTypeValueNone, rn, write_back, sreglist);
10365  }
10366
10367  void Vstr(Condition cond,
10368            DataType dt,
10369            DRegister rd,
10370            const MemOperand& operand) {
10371    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10372    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10373    VIXL_ASSERT(allow_macro_instructions_);
10374    VIXL_ASSERT(OutsideITBlock());
10375    MacroEmissionCheckScope guard(this);
10376    ITScope it_scope(this, &cond);
10377    vstr(cond, dt, rd, operand);
10378  }
10379  void Vstr(DataType dt, DRegister rd, const MemOperand& operand) {
10380    Vstr(al, dt, rd, operand);
10381  }
10382  void Vstr(Condition cond, DRegister rd, const MemOperand& operand) {
10383    Vstr(cond, Untyped64, rd, operand);
10384  }
10385  void Vstr(DRegister rd, const MemOperand& operand) {
10386    Vstr(al, Untyped64, rd, operand);
10387  }
10388
10389  void Vstr(Condition cond,
10390            DataType dt,
10391            SRegister rd,
10392            const MemOperand& operand) {
10393    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10394    VIXL_ASSERT(!AliasesAvailableScratchRegister(operand));
10395    VIXL_ASSERT(allow_macro_instructions_);
10396    VIXL_ASSERT(OutsideITBlock());
10397    MacroEmissionCheckScope guard(this);
10398    ITScope it_scope(this, &cond);
10399    vstr(cond, dt, rd, operand);
10400  }
10401  void Vstr(DataType dt, SRegister rd, const MemOperand& operand) {
10402    Vstr(al, dt, rd, operand);
10403  }
10404  void Vstr(Condition cond, SRegister rd, const MemOperand& operand) {
10405    Vstr(cond, Untyped32, rd, operand);
10406  }
10407  void Vstr(SRegister rd, const MemOperand& operand) {
10408    Vstr(al, Untyped32, rd, operand);
10409  }
10410
10411  void Vsub(
10412      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10413    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10414    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10415    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10416    VIXL_ASSERT(allow_macro_instructions_);
10417    VIXL_ASSERT(OutsideITBlock());
10418    MacroEmissionCheckScope guard(this);
10419    ITScope it_scope(this, &cond);
10420    vsub(cond, dt, rd, rn, rm);
10421  }
10422  void Vsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10423    Vsub(al, dt, rd, rn, rm);
10424  }
10425
10426  void Vsub(
10427      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10428    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10429    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10430    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10431    VIXL_ASSERT(allow_macro_instructions_);
10432    VIXL_ASSERT(OutsideITBlock());
10433    MacroEmissionCheckScope guard(this);
10434    ITScope it_scope(this, &cond);
10435    vsub(cond, dt, rd, rn, rm);
10436  }
10437  void Vsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10438    Vsub(al, dt, rd, rn, rm);
10439  }
10440
10441  void Vsub(
10442      Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
10443    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10444    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10445    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10446    VIXL_ASSERT(allow_macro_instructions_);
10447    VIXL_ASSERT(OutsideITBlock());
10448    MacroEmissionCheckScope guard(this);
10449    ITScope it_scope(this, &cond);
10450    vsub(cond, dt, rd, rn, rm);
10451  }
10452  void Vsub(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
10453    Vsub(al, dt, rd, rn, rm);
10454  }
10455
10456  void Vsubhn(
10457      Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
10458    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10459    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10460    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10461    VIXL_ASSERT(allow_macro_instructions_);
10462    VIXL_ASSERT(OutsideITBlock());
10463    MacroEmissionCheckScope guard(this);
10464    ITScope it_scope(this, &cond);
10465    vsubhn(cond, dt, rd, rn, rm);
10466  }
10467  void Vsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
10468    Vsubhn(al, dt, rd, rn, rm);
10469  }
10470
10471  void Vsubl(
10472      Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10473    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10474    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10475    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10476    VIXL_ASSERT(allow_macro_instructions_);
10477    VIXL_ASSERT(OutsideITBlock());
10478    MacroEmissionCheckScope guard(this);
10479    ITScope it_scope(this, &cond);
10480    vsubl(cond, dt, rd, rn, rm);
10481  }
10482  void Vsubl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
10483    Vsubl(al, dt, rd, rn, rm);
10484  }
10485
10486  void Vsubw(
10487      Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister 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    ITScope it_scope(this, &cond);
10495    vsubw(cond, dt, rd, rn, rm);
10496  }
10497  void Vsubw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
10498    Vsubw(al, dt, rd, rn, rm);
10499  }
10500
10501  void Vswp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10502    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10503    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10504    VIXL_ASSERT(allow_macro_instructions_);
10505    VIXL_ASSERT(OutsideITBlock());
10506    MacroEmissionCheckScope guard(this);
10507    ITScope it_scope(this, &cond);
10508    vswp(cond, dt, rd, rm);
10509  }
10510  void Vswp(DataType dt, DRegister rd, DRegister rm) { Vswp(al, dt, rd, rm); }
10511  void Vswp(Condition cond, DRegister rd, DRegister rm) {
10512    Vswp(cond, kDataTypeValueNone, rd, rm);
10513  }
10514  void Vswp(DRegister rd, DRegister rm) {
10515    Vswp(al, kDataTypeValueNone, rd, rm);
10516  }
10517
10518  void Vswp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10519    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10520    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10521    VIXL_ASSERT(allow_macro_instructions_);
10522    VIXL_ASSERT(OutsideITBlock());
10523    MacroEmissionCheckScope guard(this);
10524    ITScope it_scope(this, &cond);
10525    vswp(cond, dt, rd, rm);
10526  }
10527  void Vswp(DataType dt, QRegister rd, QRegister rm) { Vswp(al, dt, rd, rm); }
10528  void Vswp(Condition cond, QRegister rd, QRegister rm) {
10529    Vswp(cond, kDataTypeValueNone, rd, rm);
10530  }
10531  void Vswp(QRegister rd, QRegister rm) {
10532    Vswp(al, kDataTypeValueNone, rd, rm);
10533  }
10534
10535  void Vtbl(Condition cond,
10536            DataType dt,
10537            DRegister rd,
10538            const NeonRegisterList& nreglist,
10539            DRegister rm) {
10540    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10541    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10542    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10543    VIXL_ASSERT(allow_macro_instructions_);
10544    VIXL_ASSERT(OutsideITBlock());
10545    MacroEmissionCheckScope guard(this);
10546    ITScope it_scope(this, &cond);
10547    vtbl(cond, dt, rd, nreglist, rm);
10548  }
10549  void Vtbl(DataType dt,
10550            DRegister rd,
10551            const NeonRegisterList& nreglist,
10552            DRegister rm) {
10553    Vtbl(al, dt, rd, nreglist, rm);
10554  }
10555
10556  void Vtbx(Condition cond,
10557            DataType dt,
10558            DRegister rd,
10559            const NeonRegisterList& nreglist,
10560            DRegister rm) {
10561    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10562    VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist));
10563    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10564    VIXL_ASSERT(allow_macro_instructions_);
10565    VIXL_ASSERT(OutsideITBlock());
10566    MacroEmissionCheckScope guard(this);
10567    ITScope it_scope(this, &cond);
10568    vtbx(cond, dt, rd, nreglist, rm);
10569  }
10570  void Vtbx(DataType dt,
10571            DRegister rd,
10572            const NeonRegisterList& nreglist,
10573            DRegister rm) {
10574    Vtbx(al, dt, rd, nreglist, rm);
10575  }
10576
10577  void Vtrn(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10578    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10579    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10580    VIXL_ASSERT(allow_macro_instructions_);
10581    VIXL_ASSERT(OutsideITBlock());
10582    MacroEmissionCheckScope guard(this);
10583    ITScope it_scope(this, &cond);
10584    vtrn(cond, dt, rd, rm);
10585  }
10586  void Vtrn(DataType dt, DRegister rd, DRegister rm) { Vtrn(al, dt, rd, rm); }
10587
10588  void Vtrn(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10589    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10590    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10591    VIXL_ASSERT(allow_macro_instructions_);
10592    VIXL_ASSERT(OutsideITBlock());
10593    MacroEmissionCheckScope guard(this);
10594    ITScope it_scope(this, &cond);
10595    vtrn(cond, dt, rd, rm);
10596  }
10597  void Vtrn(DataType dt, QRegister rd, QRegister rm) { Vtrn(al, dt, rd, rm); }
10598
10599  void Vtst(
10600      Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10601    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10602    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10603    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10604    VIXL_ASSERT(allow_macro_instructions_);
10605    VIXL_ASSERT(OutsideITBlock());
10606    MacroEmissionCheckScope guard(this);
10607    ITScope it_scope(this, &cond);
10608    vtst(cond, dt, rd, rn, rm);
10609  }
10610  void Vtst(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
10611    Vtst(al, dt, rd, rn, rm);
10612  }
10613
10614  void Vtst(
10615      Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10616    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10617    VIXL_ASSERT(!AliasesAvailableScratchRegister(rn));
10618    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10619    VIXL_ASSERT(allow_macro_instructions_);
10620    VIXL_ASSERT(OutsideITBlock());
10621    MacroEmissionCheckScope guard(this);
10622    ITScope it_scope(this, &cond);
10623    vtst(cond, dt, rd, rn, rm);
10624  }
10625  void Vtst(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
10626    Vtst(al, dt, rd, rn, rm);
10627  }
10628
10629  void Vuzp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10630    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10631    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10632    VIXL_ASSERT(allow_macro_instructions_);
10633    VIXL_ASSERT(OutsideITBlock());
10634    MacroEmissionCheckScope guard(this);
10635    ITScope it_scope(this, &cond);
10636    vuzp(cond, dt, rd, rm);
10637  }
10638  void Vuzp(DataType dt, DRegister rd, DRegister rm) { Vuzp(al, dt, rd, rm); }
10639
10640  void Vuzp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10641    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10642    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10643    VIXL_ASSERT(allow_macro_instructions_);
10644    VIXL_ASSERT(OutsideITBlock());
10645    MacroEmissionCheckScope guard(this);
10646    ITScope it_scope(this, &cond);
10647    vuzp(cond, dt, rd, rm);
10648  }
10649  void Vuzp(DataType dt, QRegister rd, QRegister rm) { Vuzp(al, dt, rd, rm); }
10650
10651  void Vzip(Condition cond, DataType dt, DRegister rd, DRegister rm) {
10652    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10653    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10654    VIXL_ASSERT(allow_macro_instructions_);
10655    VIXL_ASSERT(OutsideITBlock());
10656    MacroEmissionCheckScope guard(this);
10657    ITScope it_scope(this, &cond);
10658    vzip(cond, dt, rd, rm);
10659  }
10660  void Vzip(DataType dt, DRegister rd, DRegister rm) { Vzip(al, dt, rd, rm); }
10661
10662  void Vzip(Condition cond, DataType dt, QRegister rd, QRegister rm) {
10663    VIXL_ASSERT(!AliasesAvailableScratchRegister(rd));
10664    VIXL_ASSERT(!AliasesAvailableScratchRegister(rm));
10665    VIXL_ASSERT(allow_macro_instructions_);
10666    VIXL_ASSERT(OutsideITBlock());
10667    MacroEmissionCheckScope guard(this);
10668    ITScope it_scope(this, &cond);
10669    vzip(cond, dt, rd, rm);
10670  }
10671  void Vzip(DataType dt, QRegister rd, QRegister rm) { Vzip(al, dt, rd, rm); }
10672
10673  void Yield(Condition cond) {
10674    VIXL_ASSERT(allow_macro_instructions_);
10675    VIXL_ASSERT(OutsideITBlock());
10676    MacroEmissionCheckScope guard(this);
10677    ITScope it_scope(this, &cond);
10678    yield(cond);
10679  }
10680  void Yield() { Yield(al); }
10681  void Vabs(Condition cond, VRegister rd, VRegister rm) {
10682    VIXL_ASSERT(rd.IsS() || rd.IsD());
10683    VIXL_ASSERT(rd.GetType() == rm.GetType());
10684    if (rd.IsS()) {
10685      Vabs(cond, F32, rd.S(), rm.S());
10686    } else {
10687      Vabs(cond, F64, rd.D(), rm.D());
10688    }
10689  }
10690  void Vabs(VRegister rd, VRegister rm) { Vabs(al, rd, rm); }
10691  void Vadd(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10692    VIXL_ASSERT(rd.IsS() || rd.IsD());
10693    VIXL_ASSERT(rd.GetType() == rn.GetType());
10694    VIXL_ASSERT(rd.GetType() == rm.GetType());
10695    if (rd.IsS()) {
10696      Vadd(cond, F32, rd.S(), rn.S(), rm.S());
10697    } else {
10698      Vadd(cond, F64, rd.D(), rn.D(), rm.D());
10699    }
10700  }
10701  void Vadd(VRegister rd, VRegister rn, VRegister rm) { Vadd(al, rd, rn, rm); }
10702  void Vcmp(Condition cond, VRegister rd, VRegister rm) {
10703    VIXL_ASSERT(rd.IsS() || rd.IsD());
10704    VIXL_ASSERT(rd.GetType() == rm.GetType());
10705    if (rd.IsS()) {
10706      Vcmp(cond, F32, rd.S(), rm.S());
10707    } else {
10708      Vcmp(cond, F64, rd.D(), rm.D());
10709    }
10710  }
10711  void Vcmp(VRegister rd, VRegister rm) { Vcmp(al, rd, rm); }
10712  void Vcmpe(Condition cond, VRegister rd, VRegister rm) {
10713    VIXL_ASSERT(rd.IsS() || rd.IsD());
10714    VIXL_ASSERT(rd.GetType() == rm.GetType());
10715    if (rd.IsS()) {
10716      Vcmpe(cond, F32, rd.S(), rm.S());
10717    } else {
10718      Vcmpe(cond, F64, rd.D(), rm.D());
10719    }
10720  }
10721  void Vcmpe(VRegister rd, VRegister rm) { Vcmpe(al, rd, rm); }
10722  void Vdiv(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10723    VIXL_ASSERT(rd.IsS() || rd.IsD());
10724    VIXL_ASSERT(rd.GetType() == rn.GetType());
10725    VIXL_ASSERT(rd.GetType() == rm.GetType());
10726    if (rd.IsS()) {
10727      Vdiv(cond, F32, rd.S(), rn.S(), rm.S());
10728    } else {
10729      Vdiv(cond, F64, rd.D(), rn.D(), rm.D());
10730    }
10731  }
10732  void Vdiv(VRegister rd, VRegister rn, VRegister rm) { Vdiv(al, rd, rn, rm); }
10733  void Vfma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10734    VIXL_ASSERT(rd.IsS() || rd.IsD());
10735    VIXL_ASSERT(rd.GetType() == rn.GetType());
10736    VIXL_ASSERT(rd.GetType() == rm.GetType());
10737    if (rd.IsS()) {
10738      Vfma(cond, F32, rd.S(), rn.S(), rm.S());
10739    } else {
10740      Vfma(cond, F64, rd.D(), rn.D(), rm.D());
10741    }
10742  }
10743  void Vfma(VRegister rd, VRegister rn, VRegister rm) { Vfma(al, rd, rn, rm); }
10744  void Vfms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10745    VIXL_ASSERT(rd.IsS() || rd.IsD());
10746    VIXL_ASSERT(rd.GetType() == rn.GetType());
10747    VIXL_ASSERT(rd.GetType() == rm.GetType());
10748    if (rd.IsS()) {
10749      Vfms(cond, F32, rd.S(), rn.S(), rm.S());
10750    } else {
10751      Vfms(cond, F64, rd.D(), rn.D(), rm.D());
10752    }
10753  }
10754  void Vfms(VRegister rd, VRegister rn, VRegister rm) { Vfms(al, rd, rn, rm); }
10755  void Vfnma(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10756    VIXL_ASSERT(rd.IsS() || rd.IsD());
10757    VIXL_ASSERT(rd.GetType() == rn.GetType());
10758    VIXL_ASSERT(rd.GetType() == rm.GetType());
10759    if (rd.IsS()) {
10760      Vfnma(cond, F32, rd.S(), rn.S(), rm.S());
10761    } else {
10762      Vfnma(cond, F64, rd.D(), rn.D(), rm.D());
10763    }
10764  }
10765  void Vfnma(VRegister rd, VRegister rn, VRegister rm) {
10766    Vfnma(al, rd, rn, rm);
10767  }
10768  void Vfnms(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10769    VIXL_ASSERT(rd.IsS() || rd.IsD());
10770    VIXL_ASSERT(rd.GetType() == rn.GetType());
10771    VIXL_ASSERT(rd.GetType() == rm.GetType());
10772    if (rd.IsS()) {
10773      Vfnms(cond, F32, rd.S(), rn.S(), rm.S());
10774    } else {
10775      Vfnms(cond, F64, rd.D(), rn.D(), rm.D());
10776    }
10777  }
10778  void Vfnms(VRegister rd, VRegister rn, VRegister rm) {
10779    Vfnms(al, rd, rn, rm);
10780  }
10781  void Vmaxnm(VRegister rd, VRegister rn, VRegister rm) {
10782    VIXL_ASSERT(rd.IsS() || rd.IsD());
10783    VIXL_ASSERT(rd.GetType() == rn.GetType());
10784    VIXL_ASSERT(rd.GetType() == rm.GetType());
10785    if (rd.IsS()) {
10786      Vmaxnm(F32, rd.S(), rn.S(), rm.S());
10787    } else {
10788      Vmaxnm(F64, rd.D(), rn.D(), rm.D());
10789    }
10790  }
10791  void Vminnm(VRegister rd, VRegister rn, VRegister rm) {
10792    VIXL_ASSERT(rd.IsS() || rd.IsD());
10793    VIXL_ASSERT(rd.GetType() == rn.GetType());
10794    VIXL_ASSERT(rd.GetType() == rm.GetType());
10795    if (rd.IsS()) {
10796      Vminnm(F32, rd.S(), rn.S(), rm.S());
10797    } else {
10798      Vminnm(F64, rd.D(), rn.D(), rm.D());
10799    }
10800  }
10801  void Vmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10802    VIXL_ASSERT(rd.IsS() || rd.IsD());
10803    VIXL_ASSERT(rd.GetType() == rn.GetType());
10804    VIXL_ASSERT(rd.GetType() == rm.GetType());
10805    if (rd.IsS()) {
10806      Vmla(cond, F32, rd.S(), rn.S(), rm.S());
10807    } else {
10808      Vmla(cond, F64, rd.D(), rn.D(), rm.D());
10809    }
10810  }
10811  void Vmla(VRegister rd, VRegister rn, VRegister rm) { Vmla(al, rd, rn, rm); }
10812  void Vmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10813    VIXL_ASSERT(rd.IsS() || rd.IsD());
10814    VIXL_ASSERT(rd.GetType() == rn.GetType());
10815    VIXL_ASSERT(rd.GetType() == rm.GetType());
10816    if (rd.IsS()) {
10817      Vmls(cond, F32, rd.S(), rn.S(), rm.S());
10818    } else {
10819      Vmls(cond, F64, rd.D(), rn.D(), rm.D());
10820    }
10821  }
10822  void Vmls(VRegister rd, VRegister rn, VRegister rm) { Vmls(al, rd, rn, rm); }
10823  void Vmov(Condition cond, VRegister rd, VRegister rm) {
10824    VIXL_ASSERT(rd.IsS() || rd.IsD());
10825    VIXL_ASSERT(rd.GetType() == rm.GetType());
10826    if (rd.IsS()) {
10827      Vmov(cond, F32, rd.S(), rm.S());
10828    } else {
10829      Vmov(cond, F64, rd.D(), rm.D());
10830    }
10831  }
10832  void Vmov(VRegister rd, VRegister rm) { Vmov(al, rd, rm); }
10833  void Vmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10834    VIXL_ASSERT(rd.IsS() || rd.IsD());
10835    VIXL_ASSERT(rd.GetType() == rn.GetType());
10836    VIXL_ASSERT(rd.GetType() == rm.GetType());
10837    if (rd.IsS()) {
10838      Vmul(cond, F32, rd.S(), rn.S(), rm.S());
10839    } else {
10840      Vmul(cond, F64, rd.D(), rn.D(), rm.D());
10841    }
10842  }
10843  void Vmul(VRegister rd, VRegister rn, VRegister rm) { Vmul(al, rd, rn, rm); }
10844  void Vneg(Condition cond, VRegister rd, VRegister rm) {
10845    VIXL_ASSERT(rd.IsS() || rd.IsD());
10846    VIXL_ASSERT(rd.GetType() == rm.GetType());
10847    if (rd.IsS()) {
10848      Vneg(cond, F32, rd.S(), rm.S());
10849    } else {
10850      Vneg(cond, F64, rd.D(), rm.D());
10851    }
10852  }
10853  void Vneg(VRegister rd, VRegister rm) { Vneg(al, rd, rm); }
10854  void Vnmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10855    VIXL_ASSERT(rd.IsS() || rd.IsD());
10856    VIXL_ASSERT(rd.GetType() == rn.GetType());
10857    VIXL_ASSERT(rd.GetType() == rm.GetType());
10858    if (rd.IsS()) {
10859      Vnmla(cond, F32, rd.S(), rn.S(), rm.S());
10860    } else {
10861      Vnmla(cond, F64, rd.D(), rn.D(), rm.D());
10862    }
10863  }
10864  void Vnmla(VRegister rd, VRegister rn, VRegister rm) {
10865    Vnmla(al, rd, rn, rm);
10866  }
10867  void Vnmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10868    VIXL_ASSERT(rd.IsS() || rd.IsD());
10869    VIXL_ASSERT(rd.GetType() == rn.GetType());
10870    VIXL_ASSERT(rd.GetType() == rm.GetType());
10871    if (rd.IsS()) {
10872      Vnmls(cond, F32, rd.S(), rn.S(), rm.S());
10873    } else {
10874      Vnmls(cond, F64, rd.D(), rn.D(), rm.D());
10875    }
10876  }
10877  void Vnmls(VRegister rd, VRegister rn, VRegister rm) {
10878    Vnmls(al, rd, rn, rm);
10879  }
10880  void Vnmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10881    VIXL_ASSERT(rd.IsS() || rd.IsD());
10882    VIXL_ASSERT(rd.GetType() == rn.GetType());
10883    VIXL_ASSERT(rd.GetType() == rm.GetType());
10884    if (rd.IsS()) {
10885      Vnmul(cond, F32, rd.S(), rn.S(), rm.S());
10886    } else {
10887      Vnmul(cond, F64, rd.D(), rn.D(), rm.D());
10888    }
10889  }
10890  void Vnmul(VRegister rd, VRegister rn, VRegister rm) {
10891    Vnmul(al, rd, rn, rm);
10892  }
10893  void Vseleq(VRegister rd, VRegister rn, VRegister rm) {
10894    VIXL_ASSERT(rd.IsS() || rd.IsD());
10895    VIXL_ASSERT(rd.GetType() == rn.GetType());
10896    VIXL_ASSERT(rd.GetType() == rm.GetType());
10897    if (rd.IsS()) {
10898      Vseleq(F32, rd.S(), rn.S(), rm.S());
10899    } else {
10900      Vseleq(F64, rd.D(), rn.D(), rm.D());
10901    }
10902  }
10903  void Vselge(VRegister rd, VRegister rn, VRegister rm) {
10904    VIXL_ASSERT(rd.IsS() || rd.IsD());
10905    VIXL_ASSERT(rd.GetType() == rn.GetType());
10906    VIXL_ASSERT(rd.GetType() == rm.GetType());
10907    if (rd.IsS()) {
10908      Vselge(F32, rd.S(), rn.S(), rm.S());
10909    } else {
10910      Vselge(F64, rd.D(), rn.D(), rm.D());
10911    }
10912  }
10913  void Vselgt(VRegister rd, VRegister rn, VRegister rm) {
10914    VIXL_ASSERT(rd.IsS() || rd.IsD());
10915    VIXL_ASSERT(rd.GetType() == rn.GetType());
10916    VIXL_ASSERT(rd.GetType() == rm.GetType());
10917    if (rd.IsS()) {
10918      Vselgt(F32, rd.S(), rn.S(), rm.S());
10919    } else {
10920      Vselgt(F64, rd.D(), rn.D(), rm.D());
10921    }
10922  }
10923  void Vselvs(VRegister rd, VRegister rn, VRegister rm) {
10924    VIXL_ASSERT(rd.IsS() || rd.IsD());
10925    VIXL_ASSERT(rd.GetType() == rn.GetType());
10926    VIXL_ASSERT(rd.GetType() == rm.GetType());
10927    if (rd.IsS()) {
10928      Vselvs(F32, rd.S(), rn.S(), rm.S());
10929    } else {
10930      Vselvs(F64, rd.D(), rn.D(), rm.D());
10931    }
10932  }
10933  void Vsqrt(Condition cond, VRegister rd, VRegister rm) {
10934    VIXL_ASSERT(rd.IsS() || rd.IsD());
10935    VIXL_ASSERT(rd.GetType() == rm.GetType());
10936    if (rd.IsS()) {
10937      Vsqrt(cond, F32, rd.S(), rm.S());
10938    } else {
10939      Vsqrt(cond, F64, rd.D(), rm.D());
10940    }
10941  }
10942  void Vsqrt(VRegister rd, VRegister rm) { Vsqrt(al, rd, rm); }
10943  void Vsub(Condition cond, VRegister rd, VRegister rn, VRegister rm) {
10944    VIXL_ASSERT(rd.IsS() || rd.IsD());
10945    VIXL_ASSERT(rd.GetType() == rn.GetType());
10946    VIXL_ASSERT(rd.GetType() == rm.GetType());
10947    if (rd.IsS()) {
10948      Vsub(cond, F32, rd.S(), rn.S(), rm.S());
10949    } else {
10950      Vsub(cond, F64, rd.D(), rn.D(), rm.D());
10951    }
10952  }
10953  void Vsub(VRegister rd, VRegister rn, VRegister rm) { Vsub(al, rd, rn, rm); }
10954  // End of generated code.
10955
10956  virtual bool AllowUnpredictable() VIXL_OVERRIDE {
10957    VIXL_ABORT_WITH_MSG("Unpredictable instruction.\n");
10958    return false;
10959  }
10960  virtual bool AllowStronglyDiscouraged() VIXL_OVERRIDE {
10961    VIXL_ABORT_WITH_MSG(
10962        "ARM strongly recommends to not use this instruction.\n");
10963    return false;
10964  }
10965
10966 private:
10967  RegisterList available_;
10968  VRegisterList available_vfp_;
10969  UseScratchRegisterScope* current_scratch_scope_;
10970  MacroAssemblerContext context_;
10971  Label::Offset checkpoint_;
10972  LiteralPoolManager literal_pool_manager_;
10973  VeneerPoolManager veneer_pool_manager_;
10974  bool generate_simulator_code_;
10975  bool allow_macro_instructions_;
10976  bool doing_veneer_pool_generation_;
10977};
10978
10979// This scope utility allows scratch registers to be managed safely. The
10980// MacroAssembler's GetScratchRegisterList() is used as a pool of scratch
10981// registers. These registers can be allocated on demand, and will be returned
10982// at the end of the scope.
10983//
10984// When the scope ends, the MacroAssembler's lists will be restored to their
10985// original state, even if the lists were modified by some other means.
10986//
10987// Scopes must nest perfectly. That is, they must be destructed in reverse
10988// construction order. Otherwise, it is not clear how to handle cases where one
10989// scope acquires a register that was included in a now-closing scope. With
10990// perfect nesting, this cannot occur.
10991class UseScratchRegisterScope {
10992 public:
10993  // This constructor implicitly calls the `Open` function to initialise the
10994  // scope, so it is ready to use immediately after it has been constructed.
10995  explicit UseScratchRegisterScope(MacroAssembler* masm)
10996      : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {
10997    Open(masm);
10998  }
10999  // This constructor allows deferred and optional initialisation of the scope.
11000  // The user is required to explicitly call the `Open` function before using
11001  // the scope.
11002  UseScratchRegisterScope()
11003      : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {}
11004
11005  // This function performs the actual initialisation work.
11006  void Open(MacroAssembler* masm);
11007
11008  // The destructor always implicitly calls the `Close` function.
11009  ~UseScratchRegisterScope() { Close(); }
11010
11011  // This function performs the cleaning-up work. It must succeed even if the
11012  // scope has not been opened. It is safe to call multiple times.
11013  void Close();
11014
11015  bool IsAvailable(const Register& reg) const;
11016  bool IsAvailable(const VRegister& reg) const;
11017
11018  // Take a register from the temp list. It will be returned automatically when
11019  // the scope ends.
11020  Register Acquire();
11021  VRegister AcquireV(unsigned size_in_bits);
11022  QRegister AcquireQ();
11023  DRegister AcquireD();
11024  SRegister AcquireS();
11025
11026  // Explicitly release an acquired (or excluded) register, putting it back in
11027  // the temp list.
11028  void Release(const Register& reg);
11029  void Release(const VRegister& reg);
11030
11031  // Make the specified registers available as scratch registers for the
11032  // duration of this scope.
11033  void Include(const RegisterList& list);
11034  void Include(const Register& reg1,
11035               const Register& reg2 = NoReg,
11036               const Register& reg3 = NoReg,
11037               const Register& reg4 = NoReg) {
11038    Include(RegisterList(reg1, reg2, reg3, reg4));
11039  }
11040  void Include(const VRegisterList& list);
11041  void Include(const VRegister& reg1,
11042               const VRegister& reg2 = NoVReg,
11043               const VRegister& reg3 = NoVReg,
11044               const VRegister& reg4 = NoVReg) {
11045    Include(VRegisterList(reg1, reg2, reg3, reg4));
11046  }
11047
11048  // Make sure that the specified registers are not available in this scope.
11049  // This can be used to prevent helper functions from using sensitive
11050  // registers, for example.
11051  void Exclude(const RegisterList& list);
11052  void Exclude(const Register& reg1,
11053               const Register& reg2 = NoReg,
11054               const Register& reg3 = NoReg,
11055               const Register& reg4 = NoReg) {
11056    Exclude(RegisterList(reg1, reg2, reg3, reg4));
11057  }
11058  void Exclude(const VRegisterList& list);
11059  void Exclude(const VRegister& reg1,
11060               const VRegister& reg2 = NoVReg,
11061               const VRegister& reg3 = NoVReg,
11062               const VRegister& reg4 = NoVReg) {
11063    Exclude(VRegisterList(reg1, reg2, reg3, reg4));
11064  }
11065
11066  // A convenience helper to exclude any registers used by the operand.
11067  void Exclude(const Operand& operand);
11068
11069  // Prevent any scratch registers from being used in this scope.
11070  void ExcludeAll();
11071
11072 private:
11073  // The MacroAssembler maintains a list of available scratch registers, and
11074  // also keeps track of the most recently-opened scope so that on destruction
11075  // we can check that scopes do not outlive their parents.
11076  MacroAssembler* masm_;
11077  UseScratchRegisterScope* parent_;
11078
11079  // The state of the available lists at the start of this scope.
11080  uint32_t old_available_;      // kRRegister
11081  uint64_t old_available_vfp_;  // kVRegister
11082
11083  VIXL_DEBUG_NO_RETURN UseScratchRegisterScope(const UseScratchRegisterScope&) {
11084    VIXL_UNREACHABLE();
11085  }
11086  VIXL_DEBUG_NO_RETURN void operator=(const UseScratchRegisterScope&) {
11087    VIXL_UNREACHABLE();
11088  }
11089};
11090
11091class JumpTableBase {
11092 protected:
11093  JumpTableBase(int len, int offset_size)
11094      : table_location_(Label::kMaxOffset),
11095        branch_location_(Label::kMaxOffset),
11096        length_(len),
11097        offset_shift_(WhichPowerOf2(offset_size)),
11098        presence_(length_) {
11099    VIXL_ASSERT((length_ >= 0) && (offset_size <= 4));
11100  }
11101  virtual ~JumpTableBase() {}
11102
11103 public:
11104  int GetTableSizeInBytes() const { return length_ * (1 << offset_shift_); }
11105  int GetOffsetShift() const { return offset_shift_; }
11106  int GetLength() const { return length_; }
11107  Label* GetDefaultLabel() { return &default_; }
11108  Label* GetEndLabel() { return &end_; }
11109  void SetBranchLocation(uint32_t branch_location) {
11110    branch_location_ = branch_location;
11111  }
11112  uint32_t GetBranchLocation() const { return branch_location_; }
11113  void BindTable(uint32_t location) { table_location_ = location; }
11114  virtual void Link(MacroAssembler* masm,
11115                    int case_index,
11116                    uint32_t location) = 0;
11117
11118  uint32_t GetLocationForCase(int i) {
11119    VIXL_ASSERT((i >= 0) && (i < length_));
11120    return table_location_ + (i * (1 << offset_shift_));
11121  }
11122  void SetPresenceBitForCase(int i) {
11123    VIXL_ASSERT((i >= 0) && (i < length_));
11124    presence_.Set(i);
11125  }
11126
11127  void Finalize(MacroAssembler* masm) {
11128    if (!default_.IsBound()) {
11129      masm->Bind(&default_);
11130    }
11131    masm->Bind(&end_);
11132
11133    presence_.ForEachBitNotSet(LinkIt(this, masm, default_.GetLocation()));
11134  }
11135
11136 private:
11137  uint32_t table_location_;
11138  uint32_t branch_location_;
11139  const int length_;
11140  const int offset_shift_;
11141  BitField presence_;
11142  Label default_;
11143  Label end_;
11144  struct LinkIt {
11145    JumpTableBase* table_;
11146    MacroAssembler* const masm_;
11147    const uint32_t location_;
11148    LinkIt(JumpTableBase* table, MacroAssembler* const masm, uint32_t location)
11149        : table_(table), masm_(masm), location_(location) {}
11150    bool execute(int id) const {
11151      VIXL_ASSERT(id < table_->GetLength());
11152      table_->Link(masm_, static_cast<int>(id), location_);
11153      return true;
11154    }
11155  };
11156};
11157
11158// JumpTable<T>(len): Helper to describe a jump table
11159// len here describes the number of possible case. Values in [0, n[ can have a
11160// jump offset. Any other value will assert.
11161template <typename T>
11162class JumpTable : public JumpTableBase {
11163 protected:
11164  explicit JumpTable(int length) : JumpTableBase(length, sizeof(T)) {}
11165
11166 public:
11167  virtual void Link(MacroAssembler* masm,
11168                    int case_index,
11169                    uint32_t location) VIXL_OVERRIDE {
11170    uint32_t position_in_table = GetLocationForCase(case_index);
11171    uint32_t from = GetBranchLocation();
11172    int offset = location - from;
11173    T* case_offset = masm->GetBuffer()->GetOffsetAddress<T*>(position_in_table);
11174    if (masm->IsUsingT32()) {
11175      *case_offset = offset >> 1;
11176    } else {
11177      *case_offset = offset >> 2;
11178    }
11179  }
11180};
11181
11182class JumpTable8bitOffset : public JumpTable<uint8_t> {
11183 public:
11184  explicit JumpTable8bitOffset(int length) : JumpTable<uint8_t>(length) {}
11185};
11186
11187class JumpTable16bitOffset : public JumpTable<uint16_t> {
11188 public:
11189  explicit JumpTable16bitOffset(int length) : JumpTable<uint16_t>(length) {}
11190};
11191
11192class JumpTable32bitOffset : public JumpTable<uint32_t> {
11193 public:
11194  explicit JumpTable32bitOffset(int length) : JumpTable<uint32_t>(length) {}
11195};
11196
11197}  // namespace aarch32
11198}  // namespace vixl
11199
11200#endif  // VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_
11201