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