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