blob: 6f721ecbc571f607d2c5a989a9168c290705d398 [file] [log] [blame]
// Copyright 2015, ARM Limited
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of ARM Limited nor the names of its contributors may
// be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
#ifndef VIXL_A32_MACRO_ASSEMBLER_A32_H_
#define VIXL_A32_MACRO_ASSEMBLER_A32_H_
#include "utils-vixl.h"
#include "a32/instructions-a32.h"
#include "a32/assembler-a32.h"
#include "a32/operand-a32.h"
namespace vixl {
namespace aarch32 {
class JumpTableBase;
// LiteralPool class, defined as a container for literals
class LiteralPool {
public:
typedef std::list<RawLiteral*>::iterator RawLiteralListIterator;
public:
LiteralPool() : size_(0) {}
~LiteralPool() {
VIXL_ASSERT(literals_.empty() && (size_ == 0));
for (RawLiteralListIterator literal_it = keep_until_delete_.begin();
literal_it != keep_until_delete_.end();
literal_it++) {
delete *literal_it;
}
keep_until_delete_.clear();
}
unsigned GetSize() const { return size_; }
// Add a literal to the literal container.
uint32_t AddLiteral(RawLiteral* literal) {
uint32_t position = GetSize();
literal->SetPositionInPool(position);
literals_.push_back(literal);
size_ += literal->GetAlignedSize();
return position;
}
// First literal to be emitted.
RawLiteralListIterator GetFirst() { return literals_.begin(); }
// Mark the end of the literal container.
RawLiteralListIterator GetEnd() { return literals_.end(); }
// Remove all the literals from the container.
// If the literal's memory management has been delegated to the container
// it will be delete'd.
void Clear() {
for (RawLiteralListIterator literal_it = GetFirst(); literal_it != GetEnd();
literal_it++) {
RawLiteral* literal = *literal_it;
switch (literal->GetDeletionPolicy()) {
case RawLiteral::kDeletedOnPlacementByPool:
delete literal;
break;
case RawLiteral::kDeletedOnPoolDestruction:
keep_until_delete_.push_back(literal);
break;
case RawLiteral::kManuallyDeleted:
break;
}
}
literals_.clear();
size_ = 0;
}
private:
// Size (in bytes and including alignments) of the literal pool.
unsigned size_;
// Literal container.
std::list<RawLiteral*> literals_;
// Already bound Literal container the app requested this pool to keep.
std::list<RawLiteral*> keep_until_delete_;
};
// TODO(all): Add MightSetFlags to determine best sequence to emit.
enum FlagsUpdate { SetFlags = 1, LeaveFlags = 0 };
// Macro assembler for aarch32 instruction set.
class MacroAssembler : public Assembler {
public:
enum EmitOption { kBranchRequired, kNoBranchRequired };
private:
class MacroAssemblerContext {
public:
MacroAssemblerContext() : count_(0) {}
~MacroAssemblerContext() {}
unsigned GetRecursiveCount() const { return count_; }
void Up() {
count_++;
VIXL_CHECK(count_ < kMaxRecursion);
}
void Down() {
VIXL_ASSERT((count_ > 0) && (count_ < kMaxRecursion));
count_--;
}
private:
unsigned count_;
static const uint32_t kMaxRecursion = 5;
};
class ContextScope {
public:
explicit ContextScope(MacroAssembler* const masm) : masm_(masm) {
VIXL_ASSERT(masm_->AllowMacroInstructions());
masm_->GetContext()->Up();
}
~ContextScope() { masm_->GetContext()->Down(); }
private:
MacroAssembler* const masm_;
};
MacroAssemblerContext* GetContext() { return &context_; }
class ITScope {
public:
ITScope(MacroAssembler* masm, Condition* cond, bool can_use_it = false)
: masm_(masm), cond_(*cond), can_use_it_(can_use_it) {
if (!cond_.Is(al) && masm->IsT32()) {
if (can_use_it_) {
// IT is not deprecated (that implies a 16 bit T32 instruction).
// We generate an IT instruction and a conditional instruction.
masm->it(cond_);
} else {
// The usage of IT is deprecated for the instruction.
// We generate a conditional branch and an unconditional instruction.
masm_->EnsureEmitFor(k16BitT32InstructionSizeInBytes +
kMaxT32MacroInstructionSizeInBytes);
// Generate the branch.
masm_->b(cond_.Negate(), Narrow, &label_);
// Tell the macro-assembler to generate unconditional instructions.
*cond = al;
}
}
#ifdef VIXL_DEBUG
initial_cursor_offset_ = masm->GetCursorOffset();
#endif
}
~ITScope() {
if (!cond_.Is(al) && masm_->IsT32() && !can_use_it_) {
VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <=
kMaxT32MacroInstructionSizeInBytes);
masm_->bind(&label_);
}
}
private:
MacroAssembler* masm_;
Condition cond_;
Label label_;
bool can_use_it_;
#ifdef VIXL_DEBUG
uint32_t initial_cursor_offset_;
#endif
};
template <Assembler::InstructionCondDtDL asmfn>
class EmitLiteralCondDtDL {
public:
EmitLiteralCondDtDL(Condition cond, DataType dt, DRegister rt)
: cond_(cond), dt_(dt), rt_(rt) {}
void emit(MacroAssembler* const masm, RawLiteral* const literal) {
(masm->*asmfn)(cond_, dt_, rt_, literal);
}
private:
Condition cond_;
DataType dt_;
DRegister rt_;
};
template <Assembler::InstructionCondDtSL asmfn>
class EmitLiteralCondDtSL {
public:
EmitLiteralCondDtSL(Condition cond, DataType dt, SRegister rt)
: cond_(cond), dt_(dt), rt_(rt) {}
void emit(MacroAssembler* const masm, RawLiteral* const literal) {
(masm->*asmfn)(cond_, dt_, rt_, literal);
}
private:
Condition cond_;
DataType dt_;
SRegister rt_;
};
template <Assembler::InstructionCondRL asmfn>
class EmitLiteralCondRL {
public:
EmitLiteralCondRL(Condition cond, Register rt) : cond_(cond), rt_(rt) {}
void emit(MacroAssembler* const masm, RawLiteral* const literal) {
(masm->*asmfn)(cond_, rt_, literal);
}
private:
Condition cond_;
Register rt_;
};
template <Assembler::InstructionCondRRL asmfn>
class EmitLiteralCondRRL {
public:
EmitLiteralCondRRL(Condition cond, Register rt, Register rt2)
: cond_(cond), rt_(rt), rt2_(rt2) {}
void emit(MacroAssembler* const masm, RawLiteral* const literal) {
(masm->*asmfn)(cond_, rt_, rt2_, literal);
}
private:
Condition cond_;
Register rt_, rt2_;
};
class LiteralPoolManager {
public:
explicit LiteralPoolManager(MacroAssembler* const masm) : masm_(masm) {
ResetCheckpoint();
}
void ResetCheckpoint() { checkpoint_ = Label::kMaxOffset; }
LiteralPool* GetLiteralPool() { return &literal_pool_; }
Label::Offset GetCheckpoint() const {
// Make room for a branch over the pools.
return checkpoint_ - kMaxInstructionSizeInBytes;
}
size_t GetLiteralPoolSize() const { return literal_pool_.GetSize(); }
// Checks if the insertion of the literal will put the forward reference
// too far in the literal pool.
bool IsInsertTooFar(RawLiteral* literal, uint32_t from) const {
uint32_t checkpoint = from + literal->GetLastInsertForwardDistance();
checkpoint =
std::min(checkpoint, static_cast<uint32_t>(literal->GetCheckpoint()));
bool too_far = AlignDown(checkpoint, 4) < from + literal_pool_.GetSize() +
kMaxInstructionSizeInBytes;
return too_far;
}
// Set the different checkpoints where the literal pool has to be emited.
void UpdateCheckpoint(RawLiteral* literal) {
// The literal should have been placed somewhere in the literal pool
VIXL_ASSERT(literal->GetPositionInPool() != Label::kMaxOffset);
// TODO(all): Consider AddForwardRef as a virtual so the checkpoint is
// updated when inserted. Or move checkpoint_ into Label,
literal->UpdateCheckpoint();
Label::Offset tmp =
literal->GetAlignedCheckpoint(4) - literal->GetPositionInPool();
if (checkpoint_ > tmp) {
checkpoint_ = tmp;
masm_->ComputeCheckpoint();
}
}
// Inserts the literal in the pool, and update the different checkpoints.
void AddLiteral(RawLiteral* literal) { literal_pool_.AddLiteral(literal); }
private:
MacroAssembler* const masm_;
LiteralPool literal_pool_;
// Max offset in the code buffer where the literal needs to be
// emitted. A default value of Label::kMaxOffset means that the checkpoint
// is invalid.
Label::Offset checkpoint_;
};
class VeneerPoolManager {
public:
explicit VeneerPoolManager(MacroAssembler* masm)
: masm_(masm), checkpoint_(Label::kMaxOffset) {}
Label::Offset GetCheckpoint() const {
// Make room for a branch over the pools.
return checkpoint_ - kMaxInstructionSizeInBytes;
}
size_t GetMaxSize() const {
return labels_.size() * kMaxInstructionSizeInBytes;
}
void AddLabel(Label* label) {
if (!label->IsInVeneerPool()) {
label->SetInVeneerPool();
labels_.push_back(label);
}
Label::ForwardReference& back = label->GetBackForwardRef();
back.SetIsBranch();
label->UpdateCheckpoint();
Label::Offset tmp = label->GetCheckpoint();
if (checkpoint_ > tmp) {
checkpoint_ = tmp;
masm_->ComputeCheckpoint();
}
}
void RemoveLabel(Label* label);
void Emit(Label::Offset target);
private:
MacroAssembler* masm_;
// List of all unbound labels which are used by a branch instruction.
std::list<Label*> labels_;
// Max offset in the code buffer where the veneer needs to be emitted.
// A default value of Label::kMaxOffset means that the checkpoint is
// invalid.
Label::Offset checkpoint_;
};
void PerformEnsureEmit(Label::Offset target, uint32_t extra_size);
protected:
void HandleOutOfBoundsImmediate(Condition cond, Register tmp, uint32_t imm);
// Generate the instruction and if it's not possible revert the whole thing.
// emit the literal pool and regenerate the instruction.
// Note: The instruction is generated via
// void T::emit(MacroAssembler* const, RawLiteral* const)
template <typename T>
void GenerateInstruction(T instr_callback, RawLiteral* const literal) {
ptrdiff_t cursor = GetBuffer().GetCursorOffset();
uint32_t where = cursor + GetArchitectureStatePCOffset();
// Emit the instruction, via the assembler
instr_callback.emit(this, literal);
if (IsInsertTooFar(literal, where)) {
// The instruction's data is too far: revert the emission
GetBuffer().Rewind(cursor);
literal->InvalidateLastForwardReference(RawLiteral::kNoUpdateNecessary);
EmitLiteralPool(kBranchRequired);
instr_callback.emit(this, literal);
}
if (literal->GetPositionInPool() == Label::kMaxOffset) {
literal_pool_manager_.AddLiteral(literal);
}
literal_pool_manager_.UpdateCheckpoint(literal);
}
public:
MacroAssembler()
: available_(r12),
checkpoint_(Label::kMaxOffset),
literal_pool_manager_(this),
veneer_pool_manager_(this) {
#ifdef VIXL_DEBUG
SetAllowMacroInstructions(true);
#endif
ComputeCheckpoint();
}
explicit MacroAssembler(size_t size)
: Assembler(size),
available_(r12),
checkpoint_(Label::kMaxOffset),
literal_pool_manager_(this),
veneer_pool_manager_(this) {
#ifdef VIXL_DEBUG
SetAllowMacroInstructions(true);
#endif
ComputeCheckpoint();
}
MacroAssembler(void* buffer, size_t size)
: Assembler(buffer, size),
available_(r12),
checkpoint_(Label::kMaxOffset),
literal_pool_manager_(this),
veneer_pool_manager_(this) {
#ifdef VIXL_DEBUG
SetAllowMacroInstructions(true);
#endif
ComputeCheckpoint();
}
#ifdef VIXL_DEBUG
// Tell whether any of the macro instruction can be used. When false the
// MacroAssembler will assert if a method which can emit a variable number
// of instructions is called.
void SetAllowMacroInstructions(bool value) {
allow_macro_instructions_ = value;
}
bool AllowMacroInstructions() const { return allow_macro_instructions_; }
#endif
void FinalizeCode() {
EmitLiteralPool(kNoBranchRequired);
Assembler::FinalizeCode();
}
RegisterList* GetScratchRegisterList() { return &available_; }
VRegisterList* GetScratchVRegisterList() { return &available_vfp_; }
// State and type helpers.
bool IsModifiedImmediate(uint32_t imm) {
return (IsT32() && ImmediateT32(imm).IsValid()) ||
ImmediateA32(imm).IsValid();
}
void Bind(Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
bind(label);
if (label->IsInVeneerPool()) veneer_pool_manager_.RemoveLabel(label);
}
void AddBranchLabel(Label* label) {
if (label->IsBound()) return;
veneer_pool_manager_.AddLabel(label);
}
void Place(RawLiteral* literal) {
VIXL_ASSERT(allow_macro_instructions_);
EnsureEmitFor(literal->GetSize());
place(literal);
}
void ComputeCheckpoint();
void EnsureEmitFor(uint32_t size = 0) {
Label::Offset target = AlignUp(GetCursorOffset() + size, 4);
if (target < checkpoint_) return;
PerformEnsureEmit(target, size);
}
bool IsInsertTooFar(RawLiteral* literal, uint32_t where) {
return literal_pool_manager_.IsInsertTooFar(literal, where);
}
// Emit the literal pool in the code buffer.
// Every literal is placed on a 32bit boundary
// All the literals in the pool will be removed from the pool and potentially
// delete'd.
void EmitLiteralPool(LiteralPool* const literal_pool, EmitOption option) {
if (literal_pool->GetSize() > 0) {
#ifdef VIXL_DEBUG
for (LiteralPool::RawLiteralListIterator literal_it =
literal_pool->GetFirst();
literal_it != literal_pool->GetEnd();
literal_it++) {
RawLiteral* literal = *literal_it;
VIXL_ASSERT(GetCursorOffset() <
static_cast<uint32_t>(literal->GetCheckpoint()));
}
#endif
Label after_literal;
if (option == kBranchRequired) {
GetBuffer().EnsureSpaceFor(kMaxInstructionSizeInBytes);
b(&after_literal);
}
GetBuffer().Align();
GetBuffer().EnsureSpaceFor(literal_pool->GetSize());
for (LiteralPool::RawLiteralListIterator it = literal_pool->GetFirst();
it != literal_pool->GetEnd();
it++) {
place(*it);
}
if (option == kBranchRequired) bind(&after_literal);
literal_pool->Clear();
}
}
void EmitLiteralPool(EmitOption option = kBranchRequired) {
EmitLiteralPool(literal_pool_manager_.GetLiteralPool(), option);
literal_pool_manager_.ResetCheckpoint();
ComputeCheckpoint();
}
unsigned GetLiteralPoolSize() const {
return literal_pool_manager_.GetLiteralPoolSize();
}
// Add a Literal to the internal literal pool
void AddLiteral(RawLiteral* literal) {
return literal_pool_manager_.AddLiteral(literal);
}
// Generic Ldr(register, data)
void Ldr(Condition cond, Register rt, uint32_t v) {
RawLiteral* literal =
new Literal<uint32_t>(v, RawLiteral::kDeletedOnPlacementByPool);
EnsureEmitFor(kMaxInstructionSizeInBytes);
EmitLiteralCondRL<&Assembler::ldr> emit_helper(cond, rt);
GenerateInstruction(emit_helper, literal);
}
// Ldr string pointer. The string is added to the literal pool and the
// string's address in the literal pool is loaded in rt (adr instruction).
void Ldr(Condition cond, Register rt, const char* str) {
RawLiteral* literal =
new Literal<const char*>(str, RawLiteral::kDeletedOnPlacementByPool);
EnsureEmitFor(kMaxInstructionSizeInBytes);
EmitLiteralCondRL<&Assembler::adr> emit_helper(cond, rt);
GenerateInstruction(emit_helper, literal);
}
template <typename T>
void Ldr(Register rt, T v) {
Ldr(al, rt, v);
}
// Generic Ldrd(rt, rt2, data)
void Ldrd(Condition cond, Register rt, Register rt2, uint64_t v) {
RawLiteral* literal =
new Literal<uint64_t>(v, RawLiteral::kDeletedOnPlacementByPool);
EnsureEmitFor(kMaxInstructionSizeInBytes);
EmitLiteralCondRRL<&Assembler::ldrd> emit_helper(cond, rt, rt2);
GenerateInstruction(emit_helper, literal);
}
template <typename T>
void Ldrd(Register rt, Register rt2, T v) {
Ldrd(al, rt, rt2, v);
}
void Vldr(Condition cond, SRegister rt, float v) {
RawLiteral* literal =
new Literal<float>(v, RawLiteral::kDeletedOnPlacementByPool);
EnsureEmitFor(kMaxInstructionSizeInBytes);
EmitLiteralCondDtSL<&Assembler::vldr> emit_helper(cond, Untyped32, rt);
GenerateInstruction(emit_helper, literal);
}
void Vldr(SRegister rt, float v) { Vldr(al, rt, v); }
void Vldr(Condition cond, DRegister rt, double v) {
RawLiteral* literal =
new Literal<double>(v, RawLiteral::kDeletedOnPlacementByPool);
EnsureEmitFor(kMaxInstructionSizeInBytes);
EmitLiteralCondDtDL<&Assembler::vldr> emit_helper(cond, Untyped64, rt);
GenerateInstruction(emit_helper, literal);
}
void Vldr(DRegister rt, double v) { Vldr(al, rt, v); }
void Vmov(Condition cond, DRegister rt, double v) { Vmov(cond, F64, rt, v); }
void Vmov(DRegister rt, double v) { Vmov(al, F64, rt, v); }
void Vmov(Condition cond, SRegister rt, float v) { Vmov(cond, F32, rt, v); }
void Vmov(SRegister rt, float v) { Vmov(al, F32, rt, v); }
void Switch(Register reg, JumpTableBase* table);
void Case(JumpTableBase* table, int case_index);
void Break(JumpTableBase* table);
void Default(JumpTableBase* table);
void EndSwitch(JumpTableBase* table);
// Claim memory on the stack
// Note: Operations on SP are atomic, and thus require to be aligned
// We must always keep the stack 32-bit aligned, and every acess must be
// 32-bit aligned.
// We could Align{Up.Down}(size, 4), but that's potentially problematic:
// Claim(3)
// Claim(1)
// Drop(4)
// would seem correct, when in fact:
// Claim(3) -> sp = sp - 4
// Claim(1) -> sp = sp - 4
// Drop(4) -> sp = sp + 4
//
void Claim(int32_t size) {
if (size == 0) return;
// The stack must be kept 32bit aligned.
VIXL_ASSERT((size > 0) && ((size % 4) == 0));
Sub(sp, sp, size);
}
// Release memory on the stack
void Drop(int32_t size) {
if (size == 0) return;
// The stack must be kept 32bit aligned.
VIXL_ASSERT((size > 0) && ((size % 4) == 0));
Add(sp, sp, size);
}
void Peek(Register dst, int32_t offset) {
VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
Ldr(dst, MemOperand(sp, offset));
}
void Poke(Register src, int32_t offset) {
VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0));
Str(src, MemOperand(sp, offset));
}
void Printf(const char* format,
CPURegister reg1 = NoReg,
CPURegister reg2 = NoReg,
CPURegister reg3 = NoReg,
CPURegister reg4 = NoReg);
// Functions used by Printf for generation.
void PushRegister(CPURegister reg);
#if !VIXL_GENERATE_SIMULATOR_INSTRUCTIONS_VALUE
void PreparePrintfArgument(CPURegister reg,
int* core_count,
int* vfp_count,
uint32_t* printf_type);
#endif
// Handlers for cases not handled by the assembler.
virtual void Delegate(InstructionType type,
InstructionCondROp instruction,
Condition cond,
Register rn,
const Operand& operand);
virtual void Delegate(InstructionType type,
InstructionCondSizeROp instruction,
Condition cond,
EncodingSize size,
Register rn,
const Operand& operand);
virtual void Delegate(InstructionType type,
InstructionCondRROp instruction,
Condition cond,
Register rd,
Register rn,
const Operand& operand);
virtual void Delegate(InstructionType type,
InstructionCondSizeRROp instruction,
Condition cond,
EncodingSize size,
Register rd,
Register rn,
const Operand& operand);
virtual void Delegate(InstructionType type,
InstructionRL instruction,
Register rn,
Label* label);
virtual void Delegate(InstructionType type,
InstructionCondDtSSop instruction,
Condition cond,
DataType dt,
SRegister rd,
const SOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondDtDDop instruction,
Condition cond,
DataType dt,
DRegister rd,
const DOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondDtQQop instruction,
Condition cond,
DataType dt,
QRegister rd,
const QOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondMop instruction,
Condition cond,
const MemOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondRMop instruction,
Condition cond,
Register rd,
const MemOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondSizeRMop instruction,
Condition cond,
EncodingSize size,
Register rd,
const MemOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondRRMop instruction,
Condition cond,
Register rt,
Register rt2,
const MemOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondRRRMop instruction,
Condition cond,
Register rd,
Register rt,
Register rt2,
const MemOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondDtSMop instruction,
Condition cond,
DataType dt,
SRegister rd,
const MemOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondDtDMop instruction,
Condition cond,
DataType dt,
DRegister rd,
const MemOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondDtNrlMop instruction,
Condition cond,
DataType dt,
const NeonRegisterList& reglist,
const MemOperand& operand);
virtual void Delegate(InstructionType type,
InstructionCondMsrOp instruction,
Condition cond,
MaskedSpecialRegister spec_reg,
const Operand& operand);
// Start of generated code.
void Adc(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// ADC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
operand.GetBaseRegister().IsLow();
ITScope it_scope(this, &cond, can_use_it);
adc(cond, rd, rn, operand);
}
void Adc(Register rd, Register rn, const Operand& operand) {
Adc(al, rd, rn, operand);
}
void Adcs(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
adcs(cond, rd, rn, operand);
}
void Adcs(Register rd, Register rn, const Operand& operand) {
Adcs(al, rd, rn, operand);
}
void Add(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
(operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
rd.IsLow()) ||
// ADD<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
(operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
rd.IsLow() && rn.Is(rd)) ||
// ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1
(operand.IsImmediate() && (operand.GetImmediate() <= 508) &&
((operand.GetImmediate() & 0x3) == 0) && rd.IsLow() && rn.IsSP()) ||
// ADD<c>{<q>} <Rd>, <Rn>, <Rm>
(operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
operand.GetBaseRegister().IsLow()) ||
// ADD<c>{<q>} <Rdn>, <Rm> ; T2
(operand.IsPlainRegister() && !rd.IsPC() && rn.Is(rd) &&
!operand.GetBaseRegister().IsSP() &&
!operand.GetBaseRegister().IsPC()) ||
// ADD{<c>}{<q>} {<Rdm>,} SP, <Rdm> ; T1
(operand.IsPlainRegister() && !rd.IsPC() && rn.IsSP() &&
operand.GetBaseRegister().Is(rd));
ITScope it_scope(this, &cond, can_use_it);
add(cond, rd, rn, operand);
}
void Add(Register rd, Register rn, const Operand& operand) {
Add(al, rd, rn, operand);
}
void Adds(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
adds(cond, rd, rn, operand);
}
void Adds(Register rd, Register rn, const Operand& operand) {
Adds(al, rd, rn, operand);
}
void Addw(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
addw(cond, rd, rn, operand);
}
void Addw(Register rd, Register rn, const Operand& operand) {
Addw(al, rd, rn, operand);
}
void Adr(Condition cond, Register rd, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
adr(cond, rd, label);
}
void Adr(Register rd, Label* label) { Adr(al, rd, label); }
void And(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// AND<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
operand.GetBaseRegister().IsLow();
ITScope it_scope(this, &cond, can_use_it);
and_(cond, rd, rn, operand);
}
void And(Register rd, Register rn, const Operand& operand) {
And(al, rd, rn, operand);
}
void Ands(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ands(cond, rd, rn, operand);
}
void Ands(Register rd, Register rn, const Operand& operand) {
Ands(al, rd, rn, operand);
}
void Asr(Condition cond, Register rd, Register rm, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// ASR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
(operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
(operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
// ASR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
(operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
operand.GetBaseRegister().IsLow());
ITScope it_scope(this, &cond, can_use_it);
asr(cond, rd, rm, operand);
}
void Asr(Register rd, Register rm, const Operand& operand) {
Asr(al, rd, rm, operand);
}
void Asrs(Condition cond, Register rd, Register rm, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
asrs(cond, rd, rm, operand);
}
void Asrs(Register rd, Register rm, const Operand& operand) {
Asrs(al, rd, rm, operand);
}
void B(Condition cond, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
b(cond, label);
AddBranchLabel(label);
}
void B(Label* label) { B(al, label); }
void Bfc(Condition cond, Register rd, uint32_t lsb, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
bfc(cond, rd, lsb, operand);
}
void Bfc(Register rd, uint32_t lsb, const Operand& operand) {
Bfc(al, rd, lsb, operand);
}
void Bfi(Condition cond,
Register rd,
Register rn,
uint32_t lsb,
const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
bfi(cond, rd, rn, lsb, operand);
}
void Bfi(Register rd, Register rn, uint32_t lsb, const Operand& operand) {
Bfi(al, rd, rn, lsb, operand);
}
void Bic(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// BIC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
operand.GetBaseRegister().IsLow();
ITScope it_scope(this, &cond, can_use_it);
bic(cond, rd, rn, operand);
}
void Bic(Register rd, Register rn, const Operand& operand) {
Bic(al, rd, rn, operand);
}
void Bics(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
bics(cond, rd, rn, operand);
}
void Bics(Register rd, Register rn, const Operand& operand) {
Bics(al, rd, rn, operand);
}
void Bkpt(Condition cond, uint32_t imm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
bkpt(cond, imm);
}
void Bkpt(uint32_t imm) { Bkpt(al, imm); }
void Bl(Condition cond, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
bl(cond, label);
AddBranchLabel(label);
}
void Bl(Label* label) { Bl(al, label); }
void Blx(Condition cond, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
blx(cond, label);
AddBranchLabel(label);
}
void Blx(Label* label) { Blx(al, label); }
void Blx(Condition cond, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// BLX{<c>}{<q>} <Rm> ; T1
!rm.IsPC();
ITScope it_scope(this, &cond, can_use_it);
blx(cond, rm);
}
void Blx(Register rm) { Blx(al, rm); }
void Bx(Condition cond, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// BX{<c>}{<q>} <Rm> ; T1
!rm.IsPC();
ITScope it_scope(this, &cond, can_use_it);
bx(cond, rm);
}
void Bx(Register rm) { Bx(al, rm); }
void Bxj(Condition cond, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
bxj(cond, rm);
}
void Bxj(Register rm) { Bxj(al, rm); }
void Cbnz(Register rn, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
cbnz(rn, label);
AddBranchLabel(label);
}
void Cbz(Register rn, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
cbz(rn, label);
AddBranchLabel(label);
}
void Clrex(Condition cond) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
clrex(cond);
}
void Clrex() { Clrex(al); }
void Clz(Condition cond, Register rd, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
clz(cond, rd, rm);
}
void Clz(Register rd, Register rm) { Clz(al, rd, rm); }
void Cmn(Condition cond, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// CMN{<c>}{<q>} <Rn>, <Rm> ; T1
operand.IsPlainRegister() && rn.IsLow() &&
operand.GetBaseRegister().IsLow();
ITScope it_scope(this, &cond, can_use_it);
cmn(cond, rn, operand);
}
void Cmn(Register rn, const Operand& operand) { Cmn(al, rn, operand); }
void Cmp(Condition cond, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// CMP{<c>}{<q>} <Rn>, #<imm8> ; T1
(operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
rn.IsLow()) ||
// CMP{<c>}{<q>} <Rn>, <Rm> ; T1 T2
(operand.IsPlainRegister() && !rn.IsPC() &&
!operand.GetBaseRegister().IsPC());
ITScope it_scope(this, &cond, can_use_it);
cmp(cond, rn, operand);
}
void Cmp(Register rn, const Operand& operand) { Cmp(al, rn, operand); }
void Crc32b(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
crc32b(cond, rd, rn, rm);
}
void Crc32b(Register rd, Register rn, Register rm) { Crc32b(al, rd, rn, rm); }
void Crc32cb(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
crc32cb(cond, rd, rn, rm);
}
void Crc32cb(Register rd, Register rn, Register rm) {
Crc32cb(al, rd, rn, rm);
}
void Crc32ch(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
crc32ch(cond, rd, rn, rm);
}
void Crc32ch(Register rd, Register rn, Register rm) {
Crc32ch(al, rd, rn, rm);
}
void Crc32cw(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
crc32cw(cond, rd, rn, rm);
}
void Crc32cw(Register rd, Register rn, Register rm) {
Crc32cw(al, rd, rn, rm);
}
void Crc32h(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
crc32h(cond, rd, rn, rm);
}
void Crc32h(Register rd, Register rn, Register rm) { Crc32h(al, rd, rn, rm); }
void Crc32w(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
crc32w(cond, rd, rn, rm);
}
void Crc32w(Register rd, Register rn, Register rm) { Crc32w(al, rd, rn, rm); }
void Dmb(Condition cond, MemoryBarrier option) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
dmb(cond, option);
}
void Dmb(MemoryBarrier option) { Dmb(al, option); }
void Dsb(Condition cond, MemoryBarrier option) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
dsb(cond, option);
}
void Dsb(MemoryBarrier option) { Dsb(al, option); }
void Eor(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// EOR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
operand.GetBaseRegister().IsLow();
ITScope it_scope(this, &cond, can_use_it);
eor(cond, rd, rn, operand);
}
void Eor(Register rd, Register rn, const Operand& operand) {
Eor(al, rd, rn, operand);
}
void Eors(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
eors(cond, rd, rn, operand);
}
void Eors(Register rd, Register rn, const Operand& operand) {
Eors(al, rd, rn, operand);
}
void Fldmdbx(Condition cond,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
fldmdbx(cond, rn, write_back, dreglist);
}
void Fldmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
Fldmdbx(al, rn, write_back, dreglist);
}
void Fldmiax(Condition cond,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
fldmiax(cond, rn, write_back, dreglist);
}
void Fldmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
Fldmiax(al, rn, write_back, dreglist);
}
void Fstmdbx(Condition cond,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
fstmdbx(cond, rn, write_back, dreglist);
}
void Fstmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) {
Fstmdbx(al, rn, write_back, dreglist);
}
void Fstmiax(Condition cond,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
fstmiax(cond, rn, write_back, dreglist);
}
void Fstmiax(Register rn, WriteBack write_back, DRegisterList dreglist) {
Fstmiax(al, rn, write_back, dreglist);
}
void Hlt(Condition cond, uint32_t imm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
hlt(cond, imm);
}
void Hlt(uint32_t imm) { Hlt(al, imm); }
void Hvc(Condition cond, uint32_t imm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
hvc(cond, imm);
}
void Hvc(uint32_t imm) { Hvc(al, imm); }
void Isb(Condition cond, MemoryBarrier option) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
isb(cond, option);
}
void Isb(MemoryBarrier option) { Isb(al, option); }
void It(Condition cond, uint16_t mask) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
it(cond, mask);
}
void Lda(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
lda(cond, rt, operand);
}
void Lda(Register rt, const MemOperand& operand) { Lda(al, rt, operand); }
void Ldab(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldab(cond, rt, operand);
}
void Ldab(Register rt, const MemOperand& operand) { Ldab(al, rt, operand); }
void Ldaex(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldaex(cond, rt, operand);
}
void Ldaex(Register rt, const MemOperand& operand) { Ldaex(al, rt, operand); }
void Ldaexb(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldaexb(cond, rt, operand);
}
void Ldaexb(Register rt, const MemOperand& operand) {
Ldaexb(al, rt, operand);
}
void Ldaexd(Condition cond,
Register rt,
Register rt2,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldaexd(cond, rt, rt2, operand);
}
void Ldaexd(Register rt, Register rt2, const MemOperand& operand) {
Ldaexd(al, rt, rt2, operand);
}
void Ldaexh(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldaexh(cond, rt, operand);
}
void Ldaexh(Register rt, const MemOperand& operand) {
Ldaexh(al, rt, operand);
}
void Ldah(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldah(cond, rt, operand);
}
void Ldah(Register rt, const MemOperand& operand) { Ldah(al, rt, operand); }
void Ldm(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldm(cond, rn, write_back, registers);
}
void Ldm(Register rn, WriteBack write_back, RegisterList registers) {
Ldm(al, rn, write_back, registers);
}
void Ldmda(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldmda(cond, rn, write_back, registers);
}
void Ldmda(Register rn, WriteBack write_back, RegisterList registers) {
Ldmda(al, rn, write_back, registers);
}
void Ldmdb(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldmdb(cond, rn, write_back, registers);
}
void Ldmdb(Register rn, WriteBack write_back, RegisterList registers) {
Ldmdb(al, rn, write_back, registers);
}
void Ldmea(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldmea(cond, rn, write_back, registers);
}
void Ldmea(Register rn, WriteBack write_back, RegisterList registers) {
Ldmea(al, rn, write_back, registers);
}
void Ldmed(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldmed(cond, rn, write_back, registers);
}
void Ldmed(Register rn, WriteBack write_back, RegisterList registers) {
Ldmed(al, rn, write_back, registers);
}
void Ldmfa(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldmfa(cond, rn, write_back, registers);
}
void Ldmfa(Register rn, WriteBack write_back, RegisterList registers) {
Ldmfa(al, rn, write_back, registers);
}
void Ldmfd(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldmfd(cond, rn, write_back, registers);
}
void Ldmfd(Register rn, WriteBack write_back, RegisterList registers) {
Ldmfd(al, rn, write_back, registers);
}
void Ldmib(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldmib(cond, rn, write_back, registers);
}
void Ldmib(Register rn, WriteBack write_back, RegisterList registers) {
Ldmib(al, rn, write_back, registers);
}
void Ldr(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// LDR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
(operand.IsImmediate() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
(operand.GetAddrMode() == Offset)) ||
// LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
(operand.IsImmediate() && rt.IsLow() &&
operand.GetBaseRegister().IsSP() &&
operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
(operand.GetAddrMode() == Offset)) ||
// LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
(operand.IsPlainRegister() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
(operand.GetAddrMode() == Offset));
ITScope it_scope(this, &cond, can_use_it);
ldr(cond, rt, operand);
}
void Ldr(Register rt, const MemOperand& operand) { Ldr(al, rt, operand); }
void Ldr(Condition cond, Register rt, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldr(cond, rt, label);
}
void Ldr(Register rt, Label* label) { Ldr(al, rt, label); }
void Ldrb(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// LDRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
(operand.IsImmediate() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.IsOffsetImmediateWithinRange(0, 31) &&
(operand.GetAddrMode() == Offset)) ||
// LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
(operand.IsPlainRegister() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
(operand.GetAddrMode() == Offset));
ITScope it_scope(this, &cond, can_use_it);
ldrb(cond, rt, operand);
}
void Ldrb(Register rt, const MemOperand& operand) { Ldrb(al, rt, operand); }
void Ldrb(Condition cond, Register rt, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldrb(cond, rt, label);
}
void Ldrb(Register rt, Label* label) { Ldrb(al, rt, label); }
void Ldrd(Condition cond,
Register rt,
Register rt2,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldrd(cond, rt, rt2, operand);
}
void Ldrd(Register rt, Register rt2, const MemOperand& operand) {
Ldrd(al, rt, rt2, operand);
}
void Ldrd(Condition cond, Register rt, Register rt2, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldrd(cond, rt, rt2, label);
}
void Ldrd(Register rt, Register rt2, Label* label) {
Ldrd(al, rt, rt2, label);
}
void Ldrex(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldrex(cond, rt, operand);
}
void Ldrex(Register rt, const MemOperand& operand) { Ldrex(al, rt, operand); }
void Ldrexb(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldrexb(cond, rt, operand);
}
void Ldrexb(Register rt, const MemOperand& operand) {
Ldrexb(al, rt, operand);
}
void Ldrexd(Condition cond,
Register rt,
Register rt2,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldrexd(cond, rt, rt2, operand);
}
void Ldrexd(Register rt, Register rt2, const MemOperand& operand) {
Ldrexd(al, rt, rt2, operand);
}
void Ldrexh(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldrexh(cond, rt, operand);
}
void Ldrexh(Register rt, const MemOperand& operand) {
Ldrexh(al, rt, operand);
}
void Ldrh(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// LDRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
(operand.IsImmediate() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
(operand.GetAddrMode() == Offset)) ||
// LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
(operand.IsPlainRegister() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
(operand.GetAddrMode() == Offset));
ITScope it_scope(this, &cond, can_use_it);
ldrh(cond, rt, operand);
}
void Ldrh(Register rt, const MemOperand& operand) { Ldrh(al, rt, operand); }
void Ldrh(Condition cond, Register rt, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldrh(cond, rt, label);
}
void Ldrh(Register rt, Label* label) { Ldrh(al, rt, label); }
void Ldrsb(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
operand.IsPlainRegister() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
(operand.GetAddrMode() == Offset);
ITScope it_scope(this, &cond, can_use_it);
ldrsb(cond, rt, operand);
}
void Ldrsb(Register rt, const MemOperand& operand) { Ldrsb(al, rt, operand); }
void Ldrsb(Condition cond, Register rt, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldrsb(cond, rt, label);
}
void Ldrsb(Register rt, Label* label) { Ldrsb(al, rt, label); }
void Ldrsh(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
operand.IsPlainRegister() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
(operand.GetAddrMode() == Offset);
ITScope it_scope(this, &cond, can_use_it);
ldrsh(cond, rt, operand);
}
void Ldrsh(Register rt, const MemOperand& operand) { Ldrsh(al, rt, operand); }
void Ldrsh(Condition cond, Register rt, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ldrsh(cond, rt, label);
}
void Ldrsh(Register rt, Label* label) { Ldrsh(al, rt, label); }
void Lsl(Condition cond, Register rd, Register rm, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// LSL<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
(operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
(operand.GetImmediate() <= 31) && rd.IsLow() && rm.IsLow()) ||
// LSL<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
(operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
operand.GetBaseRegister().IsLow());
ITScope it_scope(this, &cond, can_use_it);
lsl(cond, rd, rm, operand);
}
void Lsl(Register rd, Register rm, const Operand& operand) {
Lsl(al, rd, rm, operand);
}
void Lsls(Condition cond, Register rd, Register rm, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
lsls(cond, rd, rm, operand);
}
void Lsls(Register rd, Register rm, const Operand& operand) {
Lsls(al, rd, rm, operand);
}
void Lsr(Condition cond, Register rd, Register rm, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// LSR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
(operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
(operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) ||
// LSR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
(operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
operand.GetBaseRegister().IsLow());
ITScope it_scope(this, &cond, can_use_it);
lsr(cond, rd, rm, operand);
}
void Lsr(Register rd, Register rm, const Operand& operand) {
Lsr(al, rd, rm, operand);
}
void Lsrs(Condition cond, Register rd, Register rm, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
lsrs(cond, rd, rm, operand);
}
void Lsrs(Register rd, Register rm, const Operand& operand) {
Lsrs(al, rd, rm, operand);
}
void Mla(Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
mla(cond, rd, rn, rm, ra);
}
void Mla(Register rd, Register rn, Register rm, Register ra) {
Mla(al, rd, rn, rm, ra);
}
void Mlas(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
mlas(cond, rd, rn, rm, ra);
}
void Mlas(Register rd, Register rn, Register rm, Register ra) {
Mlas(al, rd, rn, rm, ra);
}
void Mls(Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
mls(cond, rd, rn, rm, ra);
}
void Mls(Register rd, Register rn, Register rm, Register ra) {
Mls(al, rd, rn, rm, ra);
}
void Mov(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// MOV<c>{<q>} <Rd>, #<imm8> ; T1
(operand.IsImmediate() && rd.IsLow() &&
(operand.GetImmediate() <= 255)) ||
// MOV{<c>}{<q>} <Rd>, <Rm> ; T1
(operand.IsPlainRegister() && !rd.IsPC() &&
!operand.GetBaseRegister().IsPC()) ||
// MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount>} ; T2
(operand.IsImmediateShiftedRegister() && rd.IsLow() &&
operand.GetBaseRegister().IsLow() &&
(operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
operand.GetShift().Is(ASR))) ||
// MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1
// MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1
// MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1
// MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1
(operand.IsRegisterShiftedRegister() &&
rd.Is(operand.GetBaseRegister()) && rd.IsLow() &&
(operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) ||
operand.GetShift().Is(ASR) || operand.GetShift().Is(ROR)) &&
operand.GetShiftRegister().IsLow());
ITScope it_scope(this, &cond, can_use_it);
mov(cond, rd, operand);
}
void Mov(Register rd, const Operand& operand) { Mov(al, rd, operand); }
void Movs(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
movs(cond, rd, operand);
}
void Movs(Register rd, const Operand& operand) { Movs(al, rd, operand); }
void Movt(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
movt(cond, rd, operand);
}
void Movt(Register rd, const Operand& operand) { Movt(al, rd, operand); }
void Movw(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
movw(cond, rd, operand);
}
void Movw(Register rd, const Operand& operand) { Movw(al, rd, operand); }
void Mrs(Condition cond, Register rd, SpecialRegister spec_reg) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
mrs(cond, rd, spec_reg);
}
void Mrs(Register rd, SpecialRegister spec_reg) { Mrs(al, rd, spec_reg); }
void Msr(Condition cond,
MaskedSpecialRegister spec_reg,
const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
msr(cond, spec_reg, operand);
}
void Msr(MaskedSpecialRegister spec_reg, const Operand& operand) {
Msr(al, spec_reg, operand);
}
void Mul(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// MUL<c>{<q>} <Rdm>, <Rn>{, <Rdm>} ; T1
rd.Is(rm) && rn.IsLow() && rm.IsLow();
ITScope it_scope(this, &cond, can_use_it);
mul(cond, rd, rn, rm);
}
void Mul(Register rd, Register rn, Register rm) { Mul(al, rd, rn, rm); }
void Muls(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
muls(cond, rd, rn, rm);
}
void Muls(Register rd, Register rn, Register rm) { Muls(al, rd, rn, rm); }
void Mvn(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// MVN<c>{<q>} <Rd>, <Rm> ; T1
operand.IsPlainRegister() && rd.IsLow() &&
operand.GetBaseRegister().IsLow();
ITScope it_scope(this, &cond, can_use_it);
mvn(cond, rd, operand);
}
void Mvn(Register rd, const Operand& operand) { Mvn(al, rd, operand); }
void Mvns(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
mvns(cond, rd, operand);
}
void Mvns(Register rd, const Operand& operand) { Mvns(al, rd, operand); }
void Nop(Condition cond) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
nop(cond);
}
void Nop() { Nop(al); }
void Orn(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
orn(cond, rd, rn, operand);
}
void Orn(Register rd, Register rn, const Operand& operand) {
Orn(al, rd, rn, operand);
}
void Orns(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
orns(cond, rd, rn, operand);
}
void Orns(Register rd, Register rn, const Operand& operand) {
Orns(al, rd, rn, operand);
}
void Orr(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// ORR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() &&
operand.GetBaseRegister().IsLow();
ITScope it_scope(this, &cond, can_use_it);
orr(cond, rd, rn, operand);
}
void Orr(Register rd, Register rn, const Operand& operand) {
Orr(al, rd, rn, operand);
}
void Orrs(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
orrs(cond, rd, rn, operand);
}
void Orrs(Register rd, Register rn, const Operand& operand) {
Orrs(al, rd, rn, operand);
}
void Pkhbt(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
pkhbt(cond, rd, rn, operand);
}
void Pkhbt(Register rd, Register rn, const Operand& operand) {
Pkhbt(al, rd, rn, operand);
}
void Pkhtb(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
pkhtb(cond, rd, rn, operand);
}
void Pkhtb(Register rd, Register rn, const Operand& operand) {
Pkhtb(al, rd, rn, operand);
}
void Pld(Condition cond, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
pld(cond, label);
}
void Pld(Label* label) { Pld(al, label); }
void Pld(Condition cond, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
pld(cond, operand);
}
void Pld(const MemOperand& operand) { Pld(al, operand); }
void Pldw(Condition cond, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
pldw(cond, operand);
}
void Pldw(const MemOperand& operand) { Pldw(al, operand); }
void Pli(Condition cond, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
pli(cond, operand);
}
void Pli(const MemOperand& operand) { Pli(al, operand); }
void Pli(Condition cond, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
pli(cond, label);
}
void Pli(Label* label) { Pli(al, label); }
void Pop(Condition cond, RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
pop(cond, registers);
}
void Pop(RegisterList registers) { Pop(al, registers); }
void Pop(Condition cond, Register rt) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
pop(cond, rt);
}
void Pop(Register rt) { Pop(al, rt); }
void Push(Condition cond, RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
push(cond, registers);
}
void Push(RegisterList registers) { Push(al, registers); }
void Push(Condition cond, Register rt) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
push(cond, rt);
}
void Push(Register rt) { Push(al, rt); }
void Qadd(Condition cond, Register rd, Register rm, Register rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
qadd(cond, rd, rm, rn);
}
void Qadd(Register rd, Register rm, Register rn) { Qadd(al, rd, rm, rn); }
void Qadd16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
qadd16(cond, rd, rn, rm);
}
void Qadd16(Register rd, Register rn, Register rm) { Qadd16(al, rd, rn, rm); }
void Qadd8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
qadd8(cond, rd, rn, rm);
}
void Qadd8(Register rd, Register rn, Register rm) { Qadd8(al, rd, rn, rm); }
void Qasx(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
qasx(cond, rd, rn, rm);
}
void Qasx(Register rd, Register rn, Register rm) { Qasx(al, rd, rn, rm); }
void Qdadd(Condition cond, Register rd, Register rm, Register rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
qdadd(cond, rd, rm, rn);
}
void Qdadd(Register rd, Register rm, Register rn) { Qdadd(al, rd, rm, rn); }
void Qdsub(Condition cond, Register rd, Register rm, Register rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
qdsub(cond, rd, rm, rn);
}
void Qdsub(Register rd, Register rm, Register rn) { Qdsub(al, rd, rm, rn); }
void Qsax(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
qsax(cond, rd, rn, rm);
}
void Qsax(Register rd, Register rn, Register rm) { Qsax(al, rd, rn, rm); }
void Qsub(Condition cond, Register rd, Register rm, Register rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
qsub(cond, rd, rm, rn);
}
void Qsub(Register rd, Register rm, Register rn) { Qsub(al, rd, rm, rn); }
void Qsub16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
qsub16(cond, rd, rn, rm);
}
void Qsub16(Register rd, Register rn, Register rm) { Qsub16(al, rd, rn, rm); }
void Qsub8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
qsub8(cond, rd, rn, rm);
}
void Qsub8(Register rd, Register rn, Register rm) { Qsub8(al, rd, rn, rm); }
void Rbit(Condition cond, Register rd, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
rbit(cond, rd, rm);
}
void Rbit(Register rd, Register rm) { Rbit(al, rd, rm); }
void Rev(Condition cond, Register rd, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
rev(cond, rd, rm);
}
void Rev(Register rd, Register rm) { Rev(al, rd, rm); }
void Rev16(Condition cond, Register rd, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
rev16(cond, rd, rm);
}
void Rev16(Register rd, Register rm) { Rev16(al, rd, rm); }
void Revsh(Condition cond, Register rd, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
revsh(cond, rd, rm);
}
void Revsh(Register rd, Register rm) { Revsh(al, rd, rm); }
void Ror(Condition cond, Register rd, Register rm, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// ROR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2
(operand.IsImmediate() && (operand.GetImmediate() >= 1) &&
(operand.GetImmediate() <= 31) && rd.IsLow() && rm.IsLow()) ||
// ROR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1
(operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() &&
operand.GetBaseRegister().IsLow());
ITScope it_scope(this, &cond, can_use_it);
ror(cond, rd, rm, operand);
}
void Ror(Register rd, Register rm, const Operand& operand) {
Ror(al, rd, rm, operand);
}
void Rors(Condition cond, Register rd, Register rm, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
rors(cond, rd, rm, operand);
}
void Rors(Register rd, Register rm, const Operand& operand) {
Rors(al, rd, rm, operand);
}
void Rrx(Condition cond, Register rd, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
rrx(cond, rd, rm);
}
void Rrx(Register rd, Register rm) { Rrx(al, rd, rm); }
void Rrxs(Condition cond, Register rd, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
rrxs(cond, rd, rm);
}
void Rrxs(Register rd, Register rm) { Rrxs(al, rd, rm); }
void Rsb(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// RSB<c>{<q>} {<Rd>, }<Rn>, #0 ; T1
operand.IsImmediate() && rd.IsLow() && rn.IsLow() &&
(operand.GetImmediate() == 0);
ITScope it_scope(this, &cond, can_use_it);
rsb(cond, rd, rn, operand);
}
void Rsb(Register rd, Register rn, const Operand& operand) {
Rsb(al, rd, rn, operand);
}
void Rsbs(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
rsbs(cond, rd, rn, operand);
}
void Rsbs(Register rd, Register rn, const Operand& operand) {
Rsbs(al, rd, rn, operand);
}
void Rsc(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
rsc(cond, rd, rn, operand);
}
void Rsc(Register rd, Register rn, const Operand& operand) {
Rsc(al, rd, rn, operand);
}
void Rscs(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
rscs(cond, rd, rn, operand);
}
void Rscs(Register rd, Register rn, const Operand& operand) {
Rscs(al, rd, rn, operand);
}
void Sadd16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sadd16(cond, rd, rn, rm);
}
void Sadd16(Register rd, Register rn, Register rm) { Sadd16(al, rd, rn, rm); }
void Sadd8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sadd8(cond, rd, rn, rm);
}
void Sadd8(Register rd, Register rn, Register rm) { Sadd8(al, rd, rn, rm); }
void Sasx(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sasx(cond, rd, rn, rm);
}
void Sasx(Register rd, Register rn, Register rm) { Sasx(al, rd, rn, rm); }
void Sbc(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// SBC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1
operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) &&
operand.GetBaseRegister().IsLow();
ITScope it_scope(this, &cond, can_use_it);
sbc(cond, rd, rn, operand);
}
void Sbc(Register rd, Register rn, const Operand& operand) {
Sbc(al, rd, rn, operand);
}
void Sbcs(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sbcs(cond, rd, rn, operand);
}
void Sbcs(Register rd, Register rn, const Operand& operand) {
Sbcs(al, rd, rn, operand);
}
void Sbfx(Condition cond,
Register rd,
Register rn,
uint32_t lsb,
const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sbfx(cond, rd, rn, lsb, operand);
}
void Sbfx(Register rd, Register rn, uint32_t lsb, const Operand& operand) {
Sbfx(al, rd, rn, lsb, operand);
}
void Sdiv(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sdiv(cond, rd, rn, rm);
}
void Sdiv(Register rd, Register rn, Register rm) { Sdiv(al, rd, rn, rm); }
void Sel(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sel(cond, rd, rn, rm);
}
void Sel(Register rd, Register rn, Register rm) { Sel(al, rd, rn, rm); }
void Shadd16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
shadd16(cond, rd, rn, rm);
}
void Shadd16(Register rd, Register rn, Register rm) {
Shadd16(al, rd, rn, rm);
}
void Shadd8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
shadd8(cond, rd, rn, rm);
}
void Shadd8(Register rd, Register rn, Register rm) { Shadd8(al, rd, rn, rm); }
void Shasx(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
shasx(cond, rd, rn, rm);
}
void Shasx(Register rd, Register rn, Register rm) { Shasx(al, rd, rn, rm); }
void Shsax(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
shsax(cond, rd, rn, rm);
}
void Shsax(Register rd, Register rn, Register rm) { Shsax(al, rd, rn, rm); }
void Shsub16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
shsub16(cond, rd, rn, rm);
}
void Shsub16(Register rd, Register rn, Register rm) {
Shsub16(al, rd, rn, rm);
}
void Shsub8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
shsub8(cond, rd, rn, rm);
}
void Shsub8(Register rd, Register rn, Register rm) { Shsub8(al, rd, rn, rm); }
void Smlabb(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlabb(cond, rd, rn, rm, ra);
}
void Smlabb(Register rd, Register rn, Register rm, Register ra) {
Smlabb(al, rd, rn, rm, ra);
}
void Smlabt(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlabt(cond, rd, rn, rm, ra);
}
void Smlabt(Register rd, Register rn, Register rm, Register ra) {
Smlabt(al, rd, rn, rm, ra);
}
void Smlad(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlad(cond, rd, rn, rm, ra);
}
void Smlad(Register rd, Register rn, Register rm, Register ra) {
Smlad(al, rd, rn, rm, ra);
}
void Smladx(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smladx(cond, rd, rn, rm, ra);
}
void Smladx(Register rd, Register rn, Register rm, Register ra) {
Smladx(al, rd, rn, rm, ra);
}
void Smlal(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlal(cond, rdlo, rdhi, rn, rm);
}
void Smlal(Register rdlo, Register rdhi, Register rn, Register rm) {
Smlal(al, rdlo, rdhi, rn, rm);
}
void Smlalbb(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlalbb(cond, rdlo, rdhi, rn, rm);
}
void Smlalbb(Register rdlo, Register rdhi, Register rn, Register rm) {
Smlalbb(al, rdlo, rdhi, rn, rm);
}
void Smlalbt(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlalbt(cond, rdlo, rdhi, rn, rm);
}
void Smlalbt(Register rdlo, Register rdhi, Register rn, Register rm) {
Smlalbt(al, rdlo, rdhi, rn, rm);
}
void Smlald(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlald(cond, rdlo, rdhi, rn, rm);
}
void Smlald(Register rdlo, Register rdhi, Register rn, Register rm) {
Smlald(al, rdlo, rdhi, rn, rm);
}
void Smlaldx(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlaldx(cond, rdlo, rdhi, rn, rm);
}
void Smlaldx(Register rdlo, Register rdhi, Register rn, Register rm) {
Smlaldx(al, rdlo, rdhi, rn, rm);
}
void Smlals(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlals(cond, rdlo, rdhi, rn, rm);
}
void Smlals(Register rdlo, Register rdhi, Register rn, Register rm) {
Smlals(al, rdlo, rdhi, rn, rm);
}
void Smlaltb(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlaltb(cond, rdlo, rdhi, rn, rm);
}
void Smlaltb(Register rdlo, Register rdhi, Register rn, Register rm) {
Smlaltb(al, rdlo, rdhi, rn, rm);
}
void Smlaltt(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlaltt(cond, rdlo, rdhi, rn, rm);
}
void Smlaltt(Register rdlo, Register rdhi, Register rn, Register rm) {
Smlaltt(al, rdlo, rdhi, rn, rm);
}
void Smlatb(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlatb(cond, rd, rn, rm, ra);
}
void Smlatb(Register rd, Register rn, Register rm, Register ra) {
Smlatb(al, rd, rn, rm, ra);
}
void Smlatt(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlatt(cond, rd, rn, rm, ra);
}
void Smlatt(Register rd, Register rn, Register rm, Register ra) {
Smlatt(al, rd, rn, rm, ra);
}
void Smlawb(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlawb(cond, rd, rn, rm, ra);
}
void Smlawb(Register rd, Register rn, Register rm, Register ra) {
Smlawb(al, rd, rn, rm, ra);
}
void Smlawt(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlawt(cond, rd, rn, rm, ra);
}
void Smlawt(Register rd, Register rn, Register rm, Register ra) {
Smlawt(al, rd, rn, rm, ra);
}
void Smlsd(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlsd(cond, rd, rn, rm, ra);
}
void Smlsd(Register rd, Register rn, Register rm, Register ra) {
Smlsd(al, rd, rn, rm, ra);
}
void Smlsdx(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlsdx(cond, rd, rn, rm, ra);
}
void Smlsdx(Register rd, Register rn, Register rm, Register ra) {
Smlsdx(al, rd, rn, rm, ra);
}
void Smlsld(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlsld(cond, rdlo, rdhi, rn, rm);
}
void Smlsld(Register rdlo, Register rdhi, Register rn, Register rm) {
Smlsld(al, rdlo, rdhi, rn, rm);
}
void Smlsldx(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smlsldx(cond, rdlo, rdhi, rn, rm);
}
void Smlsldx(Register rdlo, Register rdhi, Register rn, Register rm) {
Smlsldx(al, rdlo, rdhi, rn, rm);
}
void Smmla(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smmla(cond, rd, rn, rm, ra);
}
void Smmla(Register rd, Register rn, Register rm, Register ra) {
Smmla(al, rd, rn, rm, ra);
}
void Smmlar(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smmlar(cond, rd, rn, rm, ra);
}
void Smmlar(Register rd, Register rn, Register rm, Register ra) {
Smmlar(al, rd, rn, rm, ra);
}
void Smmls(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smmls(cond, rd, rn, rm, ra);
}
void Smmls(Register rd, Register rn, Register rm, Register ra) {
Smmls(al, rd, rn, rm, ra);
}
void Smmlsr(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smmlsr(cond, rd, rn, rm, ra);
}
void Smmlsr(Register rd, Register rn, Register rm, Register ra) {
Smmlsr(al, rd, rn, rm, ra);
}
void Smmul(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smmul(cond, rd, rn, rm);
}
void Smmul(Register rd, Register rn, Register rm) { Smmul(al, rd, rn, rm); }
void Smmulr(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smmulr(cond, rd, rn, rm);
}
void Smmulr(Register rd, Register rn, Register rm) { Smmulr(al, rd, rn, rm); }
void Smuad(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smuad(cond, rd, rn, rm);
}
void Smuad(Register rd, Register rn, Register rm) { Smuad(al, rd, rn, rm); }
void Smuadx(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smuadx(cond, rd, rn, rm);
}
void Smuadx(Register rd, Register rn, Register rm) { Smuadx(al, rd, rn, rm); }
void Smulbb(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smulbb(cond, rd, rn, rm);
}
void Smulbb(Register rd, Register rn, Register rm) { Smulbb(al, rd, rn, rm); }
void Smulbt(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smulbt(cond, rd, rn, rm);
}
void Smulbt(Register rd, Register rn, Register rm) { Smulbt(al, rd, rn, rm); }
void Smull(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smull(cond, rdlo, rdhi, rn, rm);
}
void Smull(Register rdlo, Register rdhi, Register rn, Register rm) {
Smull(al, rdlo, rdhi, rn, rm);
}
void Smulls(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smulls(cond, rdlo, rdhi, rn, rm);
}
void Smulls(Register rdlo, Register rdhi, Register rn, Register rm) {
Smulls(al, rdlo, rdhi, rn, rm);
}
void Smultb(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smultb(cond, rd, rn, rm);
}
void Smultb(Register rd, Register rn, Register rm) { Smultb(al, rd, rn, rm); }
void Smultt(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smultt(cond, rd, rn, rm);
}
void Smultt(Register rd, Register rn, Register rm) { Smultt(al, rd, rn, rm); }
void Smulwb(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smulwb(cond, rd, rn, rm);
}
void Smulwb(Register rd, Register rn, Register rm) { Smulwb(al, rd, rn, rm); }
void Smulwt(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smulwt(cond, rd, rn, rm);
}
void Smulwt(Register rd, Register rn, Register rm) { Smulwt(al, rd, rn, rm); }
void Smusd(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smusd(cond, rd, rn, rm);
}
void Smusd(Register rd, Register rn, Register rm) { Smusd(al, rd, rn, rm); }
void Smusdx(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
smusdx(cond, rd, rn, rm);
}
void Smusdx(Register rd, Register rn, Register rm) { Smusdx(al, rd, rn, rm); }
void Ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ssat(cond, rd, imm, operand);
}
void Ssat(Register rd, uint32_t imm, const Operand& operand) {
Ssat(al, rd, imm, operand);
}
void Ssat16(Condition cond, Register rd, uint32_t imm, Register rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ssat16(cond, rd, imm, rn);
}
void Ssat16(Register rd, uint32_t imm, Register rn) {
Ssat16(al, rd, imm, rn);
}
void Ssax(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ssax(cond, rd, rn, rm);
}
void Ssax(Register rd, Register rn, Register rm) { Ssax(al, rd, rn, rm); }
void Ssub16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ssub16(cond, rd, rn, rm);
}
void Ssub16(Register rd, Register rn, Register rm) { Ssub16(al, rd, rn, rm); }
void Ssub8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ssub8(cond, rd, rn, rm);
}
void Ssub8(Register rd, Register rn, Register rm) { Ssub8(al, rd, rn, rm); }
void Stl(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stl(cond, rt, operand);
}
void Stl(Register rt, const MemOperand& operand) { Stl(al, rt, operand); }
void Stlb(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stlb(cond, rt, operand);
}
void Stlb(Register rt, const MemOperand& operand) { Stlb(al, rt, operand); }
void Stlex(Condition cond,
Register rd,
Register rt,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stlex(cond, rd, rt, operand);
}
void Stlex(Register rd, Register rt, const MemOperand& operand) {
Stlex(al, rd, rt, operand);
}
void Stlexb(Condition cond,
Register rd,
Register rt,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stlexb(cond, rd, rt, operand);
}
void Stlexb(Register rd, Register rt, const MemOperand& operand) {
Stlexb(al, rd, rt, operand);
}
void Stlexd(Condition cond,
Register rd,
Register rt,
Register rt2,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stlexd(cond, rd, rt, rt2, operand);
}
void Stlexd(Register rd,
Register rt,
Register rt2,
const MemOperand& operand) {
Stlexd(al, rd, rt, rt2, operand);
}
void Stlexh(Condition cond,
Register rd,
Register rt,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stlexh(cond, rd, rt, operand);
}
void Stlexh(Register rd, Register rt, const MemOperand& operand) {
Stlexh(al, rd, rt, operand);
}
void Stlh(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stlh(cond, rt, operand);
}
void Stlh(Register rt, const MemOperand& operand) { Stlh(al, rt, operand); }
void Stm(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stm(cond, rn, write_back, registers);
}
void Stm(Register rn, WriteBack write_back, RegisterList registers) {
Stm(al, rn, write_back, registers);
}
void Stmda(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stmda(cond, rn, write_back, registers);
}
void Stmda(Register rn, WriteBack write_back, RegisterList registers) {
Stmda(al, rn, write_back, registers);
}
void Stmdb(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stmdb(cond, rn, write_back, registers);
}
void Stmdb(Register rn, WriteBack write_back, RegisterList registers) {
Stmdb(al, rn, write_back, registers);
}
void Stmea(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stmea(cond, rn, write_back, registers);
}
void Stmea(Register rn, WriteBack write_back, RegisterList registers) {
Stmea(al, rn, write_back, registers);
}
void Stmed(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stmed(cond, rn, write_back, registers);
}
void Stmed(Register rn, WriteBack write_back, RegisterList registers) {
Stmed(al, rn, write_back, registers);
}
void Stmfa(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stmfa(cond, rn, write_back, registers);
}
void Stmfa(Register rn, WriteBack write_back, RegisterList registers) {
Stmfa(al, rn, write_back, registers);
}
void Stmfd(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stmfd(cond, rn, write_back, registers);
}
void Stmfd(Register rn, WriteBack write_back, RegisterList registers) {
Stmfd(al, rn, write_back, registers);
}
void Stmib(Condition cond,
Register rn,
WriteBack write_back,
RegisterList registers) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
stmib(cond, rn, write_back, registers);
}
void Stmib(Register rn, WriteBack write_back, RegisterList registers) {
Stmib(al, rn, write_back, registers);
}
void Str(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// STR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
(operand.IsImmediate() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.IsOffsetImmediateWithinRange(0, 124, 4) &&
(operand.GetAddrMode() == Offset)) ||
// STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2
(operand.IsImmediate() && rt.IsLow() &&
operand.GetBaseRegister().IsSP() &&
operand.IsOffsetImmediateWithinRange(0, 1020, 4) &&
(operand.GetAddrMode() == Offset)) ||
// STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
(operand.IsPlainRegister() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
(operand.GetAddrMode() == Offset));
ITScope it_scope(this, &cond, can_use_it);
str(cond, rt, operand);
}
void Str(Register rt, const MemOperand& operand) { Str(al, rt, operand); }
void Strb(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// STRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
(operand.IsImmediate() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.IsOffsetImmediateWithinRange(0, 31) &&
(operand.GetAddrMode() == Offset)) ||
// STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
(operand.IsPlainRegister() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
(operand.GetAddrMode() == Offset));
ITScope it_scope(this, &cond, can_use_it);
strb(cond, rt, operand);
}
void Strb(Register rt, const MemOperand& operand) { Strb(al, rt, operand); }
void Strd(Condition cond,
Register rt,
Register rt2,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
strd(cond, rt, rt2, operand);
}
void Strd(Register rt, Register rt2, const MemOperand& operand) {
Strd(al, rt, rt2, operand);
}
void Strex(Condition cond,
Register rd,
Register rt,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
strex(cond, rd, rt, operand);
}
void Strex(Register rd, Register rt, const MemOperand& operand) {
Strex(al, rd, rt, operand);
}
void Strexb(Condition cond,
Register rd,
Register rt,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
strexb(cond, rd, rt, operand);
}
void Strexb(Register rd, Register rt, const MemOperand& operand) {
Strexb(al, rd, rt, operand);
}
void Strexd(Condition cond,
Register rd,
Register rt,
Register rt2,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
strexd(cond, rd, rt, rt2, operand);
}
void Strexd(Register rd,
Register rt,
Register rt2,
const MemOperand& operand) {
Strexd(al, rd, rt, rt2, operand);
}
void Strexh(Condition cond,
Register rd,
Register rt,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
strexh(cond, rd, rt, operand);
}
void Strexh(Register rd, Register rt, const MemOperand& operand) {
Strexh(al, rd, rt, operand);
}
void Strh(Condition cond, Register rt, const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// STRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1
(operand.IsImmediate() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.IsOffsetImmediateWithinRange(0, 62, 2) &&
(operand.GetAddrMode() == Offset)) ||
// STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1
(operand.IsPlainRegister() && rt.IsLow() &&
operand.GetBaseRegister().IsLow() &&
operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() &&
(operand.GetAddrMode() == Offset));
ITScope it_scope(this, &cond, can_use_it);
strh(cond, rt, operand);
}
void Strh(Register rt, const MemOperand& operand) { Strh(al, rt, operand); }
void Sub(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1
(operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() &&
rd.IsLow()) ||
// SUB<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2
(operand.IsImmediate() && (operand.GetImmediate() <= 255) &&
rd.IsLow() && rn.Is(rd)) ||
// SUB<c>{<q>} <Rd>, <Rn>, <Rm>
(operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() &&
operand.GetBaseRegister().IsLow());
ITScope it_scope(this, &cond, can_use_it);
sub(cond, rd, rn, operand);
}
void Sub(Register rd, Register rn, const Operand& operand) {
Sub(al, rd, rn, operand);
}
void Subs(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
subs(cond, rd, rn, operand);
}
void Subs(Register rd, Register rn, const Operand& operand) {
Subs(al, rd, rn, operand);
}
void Subw(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
subw(cond, rd, rn, operand);
}
void Subw(Register rd, Register rn, const Operand& operand) {
Subw(al, rd, rn, operand);
}
void Svc(Condition cond, uint32_t imm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
svc(cond, imm);
}
void Svc(uint32_t imm) { Svc(al, imm); }
void Sxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sxtab(cond, rd, rn, operand);
}
void Sxtab(Register rd, Register rn, const Operand& operand) {
Sxtab(al, rd, rn, operand);
}
void Sxtab16(Condition cond,
Register rd,
Register rn,
const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sxtab16(cond, rd, rn, operand);
}
void Sxtab16(Register rd, Register rn, const Operand& operand) {
Sxtab16(al, rd, rn, operand);
}
void Sxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sxtah(cond, rd, rn, operand);
}
void Sxtah(Register rd, Register rn, const Operand& operand) {
Sxtah(al, rd, rn, operand);
}
void Sxtb(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sxtb(cond, rd, operand);
}
void Sxtb(Register rd, const Operand& operand) { Sxtb(al, rd, operand); }
void Sxtb16(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sxtb16(cond, rd, operand);
}
void Sxtb16(Register rd, const Operand& operand) { Sxtb16(al, rd, operand); }
void Sxth(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
sxth(cond, rd, operand);
}
void Sxth(Register rd, const Operand& operand) { Sxth(al, rd, operand); }
void Tbb(Condition cond, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
tbb(cond, rn, rm);
}
void Tbb(Register rn, Register rm) { Tbb(al, rn, rm); }
void Tbh(Condition cond, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
tbh(cond, rn, rm);
}
void Tbh(Register rn, Register rm) { Tbh(al, rn, rm); }
void Teq(Condition cond, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
teq(cond, rn, operand);
}
void Teq(Register rn, const Operand& operand) { Teq(al, rn, operand); }
void Tst(Condition cond, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
bool can_use_it =
// TST{<c>}{<q>} <Rn>, <Rm> ; T1
operand.IsPlainRegister() && rn.IsLow() &&
operand.GetBaseRegister().IsLow();
ITScope it_scope(this, &cond, can_use_it);
tst(cond, rn, operand);
}
void Tst(Register rn, const Operand& operand) { Tst(al, rn, operand); }
void Uadd16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uadd16(cond, rd, rn, rm);
}
void Uadd16(Register rd, Register rn, Register rm) { Uadd16(al, rd, rn, rm); }
void Uadd8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uadd8(cond, rd, rn, rm);
}
void Uadd8(Register rd, Register rn, Register rm) { Uadd8(al, rd, rn, rm); }
void Uasx(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uasx(cond, rd, rn, rm);
}
void Uasx(Register rd, Register rn, Register rm) { Uasx(al, rd, rn, rm); }
void Ubfx(Condition cond,
Register rd,
Register rn,
uint32_t lsb,
const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
ubfx(cond, rd, rn, lsb, operand);
}
void Ubfx(Register rd, Register rn, uint32_t lsb, const Operand& operand) {
Ubfx(al, rd, rn, lsb, operand);
}
void Udf(Condition cond, uint32_t imm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
udf(cond, imm);
}
void Udf(uint32_t imm) { Udf(al, imm); }
void Udiv(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
udiv(cond, rd, rn, rm);
}
void Udiv(Register rd, Register rn, Register rm) { Udiv(al, rd, rn, rm); }
void Uhadd16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uhadd16(cond, rd, rn, rm);
}
void Uhadd16(Register rd, Register rn, Register rm) {
Uhadd16(al, rd, rn, rm);
}
void Uhadd8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uhadd8(cond, rd, rn, rm);
}
void Uhadd8(Register rd, Register rn, Register rm) { Uhadd8(al, rd, rn, rm); }
void Uhasx(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uhasx(cond, rd, rn, rm);
}
void Uhasx(Register rd, Register rn, Register rm) { Uhasx(al, rd, rn, rm); }
void Uhsax(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uhsax(cond, rd, rn, rm);
}
void Uhsax(Register rd, Register rn, Register rm) { Uhsax(al, rd, rn, rm); }
void Uhsub16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uhsub16(cond, rd, rn, rm);
}
void Uhsub16(Register rd, Register rn, Register rm) {
Uhsub16(al, rd, rn, rm);
}
void Uhsub8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uhsub8(cond, rd, rn, rm);
}
void Uhsub8(Register rd, Register rn, Register rm) { Uhsub8(al, rd, rn, rm); }
void Umaal(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
umaal(cond, rdlo, rdhi, rn, rm);
}
void Umaal(Register rdlo, Register rdhi, Register rn, Register rm) {
Umaal(al, rdlo, rdhi, rn, rm);
}
void Umlal(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
umlal(cond, rdlo, rdhi, rn, rm);
}
void Umlal(Register rdlo, Register rdhi, Register rn, Register rm) {
Umlal(al, rdlo, rdhi, rn, rm);
}
void Umlals(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
umlals(cond, rdlo, rdhi, rn, rm);
}
void Umlals(Register rdlo, Register rdhi, Register rn, Register rm) {
Umlals(al, rdlo, rdhi, rn, rm);
}
void Umull(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
umull(cond, rdlo, rdhi, rn, rm);
}
void Umull(Register rdlo, Register rdhi, Register rn, Register rm) {
Umull(al, rdlo, rdhi, rn, rm);
}
void Umulls(
Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
umulls(cond, rdlo, rdhi, rn, rm);
}
void Umulls(Register rdlo, Register rdhi, Register rn, Register rm) {
Umulls(al, rdlo, rdhi, rn, rm);
}
void Uqadd16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uqadd16(cond, rd, rn, rm);
}
void Uqadd16(Register rd, Register rn, Register rm) {
Uqadd16(al, rd, rn, rm);
}
void Uqadd8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uqadd8(cond, rd, rn, rm);
}
void Uqadd8(Register rd, Register rn, Register rm) { Uqadd8(al, rd, rn, rm); }
void Uqasx(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uqasx(cond, rd, rn, rm);
}
void Uqasx(Register rd, Register rn, Register rm) { Uqasx(al, rd, rn, rm); }
void Uqsax(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uqsax(cond, rd, rn, rm);
}
void Uqsax(Register rd, Register rn, Register rm) { Uqsax(al, rd, rn, rm); }
void Uqsub16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uqsub16(cond, rd, rn, rm);
}
void Uqsub16(Register rd, Register rn, Register rm) {
Uqsub16(al, rd, rn, rm);
}
void Uqsub8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uqsub8(cond, rd, rn, rm);
}
void Uqsub8(Register rd, Register rn, Register rm) { Uqsub8(al, rd, rn, rm); }
void Usad8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
usad8(cond, rd, rn, rm);
}
void Usad8(Register rd, Register rn, Register rm) { Usad8(al, rd, rn, rm); }
void Usada8(
Condition cond, Register rd, Register rn, Register rm, Register ra) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
usada8(cond, rd, rn, rm, ra);
}
void Usada8(Register rd, Register rn, Register rm, Register ra) {
Usada8(al, rd, rn, rm, ra);
}
void Usat(Condition cond, Register rd, uint32_t imm, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
usat(cond, rd, imm, operand);
}
void Usat(Register rd, uint32_t imm, const Operand& operand) {
Usat(al, rd, imm, operand);
}
void Usat16(Condition cond, Register rd, uint32_t imm, Register rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
usat16(cond, rd, imm, rn);
}
void Usat16(Register rd, uint32_t imm, Register rn) {
Usat16(al, rd, imm, rn);
}
void Usax(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
usax(cond, rd, rn, rm);
}
void Usax(Register rd, Register rn, Register rm) { Usax(al, rd, rn, rm); }
void Usub16(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
usub16(cond, rd, rn, rm);
}
void Usub16(Register rd, Register rn, Register rm) { Usub16(al, rd, rn, rm); }
void Usub8(Condition cond, Register rd, Register rn, Register rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
usub8(cond, rd, rn, rm);
}
void Usub8(Register rd, Register rn, Register rm) { Usub8(al, rd, rn, rm); }
void Uxtab(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uxtab(cond, rd, rn, operand);
}
void Uxtab(Register rd, Register rn, const Operand& operand) {
Uxtab(al, rd, rn, operand);
}
void Uxtab16(Condition cond,
Register rd,
Register rn,
const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uxtab16(cond, rd, rn, operand);
}
void Uxtab16(Register rd, Register rn, const Operand& operand) {
Uxtab16(al, rd, rn, operand);
}
void Uxtah(Condition cond, Register rd, Register rn, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uxtah(cond, rd, rn, operand);
}
void Uxtah(Register rd, Register rn, const Operand& operand) {
Uxtah(al, rd, rn, operand);
}
void Uxtb(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uxtb(cond, rd, operand);
}
void Uxtb(Register rd, const Operand& operand) { Uxtb(al, rd, operand); }
void Uxtb16(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uxtb16(cond, rd, operand);
}
void Uxtb16(Register rd, const Operand& operand) { Uxtb16(al, rd, operand); }
void Uxth(Condition cond, Register rd, const Operand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
uxth(cond, rd, operand);
}
void Uxth(Register rd, const Operand& operand) { Uxth(al, rd, operand); }
void Vaba(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vaba(cond, dt, rd, rn, rm);
}
void Vaba(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vaba(al, dt, rd, rn, rm);
}
void Vaba(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vaba(cond, dt, rd, rn, rm);
}
void Vaba(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vaba(al, dt, rd, rn, rm);
}
void Vabal(
Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vabal(cond, dt, rd, rn, rm);
}
void Vabal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
Vabal(al, dt, rd, rn, rm);
}
void Vabd(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vabd(cond, dt, rd, rn, rm);
}
void Vabd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vabd(al, dt, rd, rn, rm);
}
void Vabd(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vabd(cond, dt, rd, rn, rm);
}
void Vabd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vabd(al, dt, rd, rn, rm);
}
void Vabdl(
Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vabdl(cond, dt, rd, rn, rm);
}
void Vabdl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
Vabdl(al, dt, rd, rn, rm);
}
void Vabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vabs(cond, dt, rd, rm);
}
void Vabs(DataType dt, DRegister rd, DRegister rm) { Vabs(al, dt, rd, rm); }
void Vabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vabs(cond, dt, rd, rm);
}
void Vabs(DataType dt, QRegister rd, QRegister rm) { Vabs(al, dt, rd, rm); }
void Vabs(Condition cond, DataType dt, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vabs(cond, dt, rd, rm);
}
void Vabs(DataType dt, SRegister rd, SRegister rm) { Vabs(al, dt, rd, rm); }
void Vacge(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vacge(cond, dt, rd, rn, rm);
}
void Vacge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vacge(al, dt, rd, rn, rm);
}
void Vacge(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vacge(cond, dt, rd, rn, rm);
}
void Vacge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vacge(al, dt, rd, rn, rm);
}
void Vacgt(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vacgt(cond, dt, rd, rn, rm);
}
void Vacgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vacgt(al, dt, rd, rn, rm);
}
void Vacgt(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vacgt(cond, dt, rd, rn, rm);
}
void Vacgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vacgt(al, dt, rd, rn, rm);
}
void Vacle(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vacle(cond, dt, rd, rn, rm);
}
void Vacle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vacle(al, dt, rd, rn, rm);
}
void Vacle(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vacle(cond, dt, rd, rn, rm);
}
void Vacle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vacle(al, dt, rd, rn, rm);
}
void Vaclt(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vaclt(cond, dt, rd, rn, rm);
}
void Vaclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vaclt(al, dt, rd, rn, rm);
}
void Vaclt(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vaclt(cond, dt, rd, rn, rm);
}
void Vaclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vaclt(al, dt, rd, rn, rm);
}
void Vadd(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vadd(cond, dt, rd, rn, rm);
}
void Vadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vadd(al, dt, rd, rn, rm);
}
void Vadd(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vadd(cond, dt, rd, rn, rm);
}
void Vadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vadd(al, dt, rd, rn, rm);
}
void Vadd(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vadd(cond, dt, rd, rn, rm);
}
void Vadd(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vadd(al, dt, rd, rn, rm);
}
void Vaddhn(
Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vaddhn(cond, dt, rd, rn, rm);
}
void Vaddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
Vaddhn(al, dt, rd, rn, rm);
}
void Vaddl(
Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vaddl(cond, dt, rd, rn, rm);
}
void Vaddl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
Vaddl(al, dt, rd, rn, rm);
}
void Vaddw(
Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vaddw(cond, dt, rd, rn, rm);
}
void Vaddw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
Vaddw(al, dt, rd, rn, rm);
}
void Vand(Condition cond,
DataType dt,
DRegister rd,
DRegister rn,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vand(cond, dt, rd, rn, operand);
}
void Vand(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
Vand(al, dt, rd, rn, operand);
}
void Vand(Condition cond,
DataType dt,
QRegister rd,
QRegister rn,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vand(cond, dt, rd, rn, operand);
}
void Vand(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
Vand(al, dt, rd, rn, operand);
}
void Vbic(Condition cond,
DataType dt,
DRegister rd,
DRegister rn,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vbic(cond, dt, rd, rn, operand);
}
void Vbic(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
Vbic(al, dt, rd, rn, operand);
}
void Vbic(Condition cond,
DataType dt,
QRegister rd,
QRegister rn,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vbic(cond, dt, rd, rn, operand);
}
void Vbic(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
Vbic(al, dt, rd, rn, operand);
}
void Vbif(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vbif(cond, dt, rd, rn, rm);
}
void Vbif(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vbif(al, dt, rd, rn, rm);
}
void Vbif(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
Vbif(cond, kDataTypeValueNone, rd, rn, rm);
}
void Vbif(DRegister rd, DRegister rn, DRegister rm) {
Vbif(al, kDataTypeValueNone, rd, rn, rm);
}
void Vbif(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vbif(cond, dt, rd, rn, rm);
}
void Vbif(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vbif(al, dt, rd, rn, rm);
}
void Vbif(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
Vbif(cond, kDataTypeValueNone, rd, rn, rm);
}
void Vbif(QRegister rd, QRegister rn, QRegister rm) {
Vbif(al, kDataTypeValueNone, rd, rn, rm);
}
void Vbit(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vbit(cond, dt, rd, rn, rm);
}
void Vbit(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vbit(al, dt, rd, rn, rm);
}
void Vbit(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
Vbit(cond, kDataTypeValueNone, rd, rn, rm);
}
void Vbit(DRegister rd, DRegister rn, DRegister rm) {
Vbit(al, kDataTypeValueNone, rd, rn, rm);
}
void Vbit(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vbit(cond, dt, rd, rn, rm);
}
void Vbit(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vbit(al, dt, rd, rn, rm);
}
void Vbit(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
Vbit(cond, kDataTypeValueNone, rd, rn, rm);
}
void Vbit(QRegister rd, QRegister rn, QRegister rm) {
Vbit(al, kDataTypeValueNone, rd, rn, rm);
}
void Vbsl(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vbsl(cond, dt, rd, rn, rm);
}
void Vbsl(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vbsl(al, dt, rd, rn, rm);
}
void Vbsl(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
}
void Vbsl(DRegister rd, DRegister rn, DRegister rm) {
Vbsl(al, kDataTypeValueNone, rd, rn, rm);
}
void Vbsl(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vbsl(cond, dt, rd, rn, rm);
}
void Vbsl(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vbsl(al, dt, rd, rn, rm);
}
void Vbsl(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
Vbsl(cond, kDataTypeValueNone, rd, rn, rm);
}
void Vbsl(QRegister rd, QRegister rn, QRegister rm) {
Vbsl(al, kDataTypeValueNone, rd, rn, rm);
}
void Vceq(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vceq(cond, dt, rd, rm, operand);
}
void Vceq(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vceq(al, dt, rd, rm, operand);
}
void Vceq(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vceq(cond, dt, rd, rm, operand);
}
void Vceq(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vceq(al, dt, rd, rm, operand);
}
void Vceq(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vceq(cond, dt, rd, rn, rm);
}
void Vceq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vceq(al, dt, rd, rn, rm);
}
void Vceq(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vceq(cond, dt, rd, rn, rm);
}
void Vceq(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vceq(al, dt, rd, rn, rm);
}
void Vcge(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcge(cond, dt, rd, rm, operand);
}
void Vcge(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vcge(al, dt, rd, rm, operand);
}
void Vcge(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcge(cond, dt, rd, rm, operand);
}
void Vcge(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vcge(al, dt, rd, rm, operand);
}
void Vcge(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcge(cond, dt, rd, rn, rm);
}
void Vcge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vcge(al, dt, rd, rn, rm);
}
void Vcge(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcge(cond, dt, rd, rn, rm);
}
void Vcge(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vcge(al, dt, rd, rn, rm);
}
void Vcgt(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcgt(cond, dt, rd, rm, operand);
}
void Vcgt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vcgt(al, dt, rd, rm, operand);
}
void Vcgt(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcgt(cond, dt, rd, rm, operand);
}
void Vcgt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vcgt(al, dt, rd, rm, operand);
}
void Vcgt(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcgt(cond, dt, rd, rn, rm);
}
void Vcgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vcgt(al, dt, rd, rn, rm);
}
void Vcgt(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcgt(cond, dt, rd, rn, rm);
}
void Vcgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vcgt(al, dt, rd, rn, rm);
}
void Vcle(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcle(cond, dt, rd, rm, operand);
}
void Vcle(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vcle(al, dt, rd, rm, operand);
}
void Vcle(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcle(cond, dt, rd, rm, operand);
}
void Vcle(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vcle(al, dt, rd, rm, operand);
}
void Vcle(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcle(cond, dt, rd, rn, rm);
}
void Vcle(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vcle(al, dt, rd, rn, rm);
}
void Vcle(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcle(cond, dt, rd, rn, rm);
}
void Vcle(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vcle(al, dt, rd, rn, rm);
}
void Vcls(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcls(cond, dt, rd, rm);
}
void Vcls(DataType dt, DRegister rd, DRegister rm) { Vcls(al, dt, rd, rm); }
void Vcls(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcls(cond, dt, rd, rm);
}
void Vcls(DataType dt, QRegister rd, QRegister rm) { Vcls(al, dt, rd, rm); }
void Vclt(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vclt(cond, dt, rd, rm, operand);
}
void Vclt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vclt(al, dt, rd, rm, operand);
}
void Vclt(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vclt(cond, dt, rd, rm, operand);
}
void Vclt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vclt(al, dt, rd, rm, operand);
}
void Vclt(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vclt(cond, dt, rd, rn, rm);
}
void Vclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vclt(al, dt, rd, rn, rm);
}
void Vclt(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vclt(cond, dt, rd, rn, rm);
}
void Vclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vclt(al, dt, rd, rn, rm);
}
void Vclz(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vclz(cond, dt, rd, rm);
}
void Vclz(DataType dt, DRegister rd, DRegister rm) { Vclz(al, dt, rd, rm); }
void Vclz(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vclz(cond, dt, rd, rm);
}
void Vclz(DataType dt, QRegister rd, QRegister rm) { Vclz(al, dt, rd, rm); }
void Vcmp(Condition cond, DataType dt, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcmp(cond, dt, rd, rm);
}
void Vcmp(DataType dt, SRegister rd, SRegister rm) { Vcmp(al, dt, rd, rm); }
void Vcmp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcmp(cond, dt, rd, rm);
}
void Vcmp(DataType dt, DRegister rd, DRegister rm) { Vcmp(al, dt, rd, rm); }
void Vcmp(Condition cond, DataType dt, SRegister rd, double imm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcmp(cond, dt, rd, imm);
}
void Vcmp(DataType dt, SRegister rd, double imm) { Vcmp(al, dt, rd, imm); }
void Vcmp(Condition cond, DataType dt, DRegister rd, double imm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcmp(cond, dt, rd, imm);
}
void Vcmp(DataType dt, DRegister rd, double imm) { Vcmp(al, dt, rd, imm); }
void Vcmpe(Condition cond, DataType dt, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcmpe(cond, dt, rd, rm);
}
void Vcmpe(DataType dt, SRegister rd, SRegister rm) { Vcmpe(al, dt, rd, rm); }
void Vcmpe(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcmpe(cond, dt, rd, rm);
}
void Vcmpe(DataType dt, DRegister rd, DRegister rm) { Vcmpe(al, dt, rd, rm); }
void Vcmpe(Condition cond, DataType dt, SRegister rd, double imm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcmpe(cond, dt, rd, imm);
}
void Vcmpe(DataType dt, SRegister rd, double imm) { Vcmpe(al, dt, rd, imm); }
void Vcmpe(Condition cond, DataType dt, DRegister rd, double imm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcmpe(cond, dt, rd, imm);
}
void Vcmpe(DataType dt, DRegister rd, double imm) { Vcmpe(al, dt, rd, imm); }
void Vcnt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcnt(cond, dt, rd, rm);
}
void Vcnt(DataType dt, DRegister rd, DRegister rm) { Vcnt(al, dt, rd, rm); }
void Vcnt(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcnt(cond, dt, rd, rm);
}
void Vcnt(DataType dt, QRegister rd, QRegister rm) { Vcnt(al, dt, rd, rm); }
void Vcvt(
Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvt(cond, dt1, dt2, rd, rm);
}
void Vcvt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
Vcvt(al, dt1, dt2, rd, rm);
}
void Vcvt(
Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvt(cond, dt1, dt2, rd, rm);
}
void Vcvt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
Vcvt(al, dt1, dt2, rd, rm);
}
void Vcvt(Condition cond,
DataType dt1,
DataType dt2,
DRegister rd,
DRegister rm,
int32_t fbits) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvt(cond, dt1, dt2, rd, rm, fbits);
}
void Vcvt(
DataType dt1, DataType dt2, DRegister rd, DRegister rm, int32_t fbits) {
Vcvt(al, dt1, dt2, rd, rm, fbits);
}
void Vcvt(Condition cond,
DataType dt1,
DataType dt2,
QRegister rd,
QRegister rm,
int32_t fbits) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvt(cond, dt1, dt2, rd, rm, fbits);
}
void Vcvt(
DataType dt1, DataType dt2, QRegister rd, QRegister rm, int32_t fbits) {
Vcvt(al, dt1, dt2, rd, rm, fbits);
}
void Vcvt(Condition cond,
DataType dt1,
DataType dt2,
SRegister rd,
SRegister rm,
int32_t fbits) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvt(cond, dt1, dt2, rd, rm, fbits);
}
void Vcvt(
DataType dt1, DataType dt2, SRegister rd, SRegister rm, int32_t fbits) {
Vcvt(al, dt1, dt2, rd, rm, fbits);
}
void Vcvt(
Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvt(cond, dt1, dt2, rd, rm);
}
void Vcvt(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
Vcvt(al, dt1, dt2, rd, rm);
}
void Vcvt(
Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvt(cond, dt1, dt2, rd, rm);
}
void Vcvt(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
Vcvt(al, dt1, dt2, rd, rm);
}
void Vcvt(
Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvt(cond, dt1, dt2, rd, rm);
}
void Vcvt(DataType dt1, DataType dt2, DRegister rd, QRegister rm) {
Vcvt(al, dt1, dt2, rd, rm);
}
void Vcvt(
Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvt(cond, dt1, dt2, rd, rm);
}
void Vcvt(DataType dt1, DataType dt2, QRegister rd, DRegister rm) {
Vcvt(al, dt1, dt2, rd, rm);
}
void Vcvt(
Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvt(cond, dt1, dt2, rd, rm);
}
void Vcvt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
Vcvt(al, dt1, dt2, rd, rm);
}
void Vcvta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvta(dt1, dt2, rd, rm);
}
void Vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvta(dt1, dt2, rd, rm);
}
void Vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvta(dt1, dt2, rd, rm);
}
void Vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvta(dt1, dt2, rd, rm);
}
void Vcvtb(
Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvtb(cond, dt1, dt2, rd, rm);
}
void Vcvtb(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
Vcvtb(al, dt1, dt2, rd, rm);
}
void Vcvtb(
Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvtb(cond, dt1, dt2, rd, rm);
}
void Vcvtb(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
Vcvtb(al, dt1, dt2, rd, rm);
}
void Vcvtb(
Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvtb(cond, dt1, dt2, rd, rm);
}
void Vcvtb(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
Vcvtb(al, dt1, dt2, rd, rm);
}
void Vcvtm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtm(dt1, dt2, rd, rm);
}
void Vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtm(dt1, dt2, rd, rm);
}
void Vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtm(dt1, dt2, rd, rm);
}
void Vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtm(dt1, dt2, rd, rm);
}
void Vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtn(dt1, dt2, rd, rm);
}
void Vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtn(dt1, dt2, rd, rm);
}
void Vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtn(dt1, dt2, rd, rm);
}
void Vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtn(dt1, dt2, rd, rm);
}
void Vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtp(dt1, dt2, rd, rm);
}
void Vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtp(dt1, dt2, rd, rm);
}
void Vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtp(dt1, dt2, rd, rm);
}
void Vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vcvtp(dt1, dt2, rd, rm);
}
void Vcvtr(
Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvtr(cond, dt1, dt2, rd, rm);
}
void Vcvtr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
Vcvtr(al, dt1, dt2, rd, rm);
}
void Vcvtr(
Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvtr(cond, dt1, dt2, rd, rm);
}
void Vcvtr(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
Vcvtr(al, dt1, dt2, rd, rm);
}
void Vcvtt(
Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvtt(cond, dt1, dt2, rd, rm);
}
void Vcvtt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
Vcvtt(al, dt1, dt2, rd, rm);
}
void Vcvtt(
Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvtt(cond, dt1, dt2, rd, rm);
}
void Vcvtt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) {
Vcvtt(al, dt1, dt2, rd, rm);
}
void Vcvtt(
Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vcvtt(cond, dt1, dt2, rd, rm);
}
void Vcvtt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) {
Vcvtt(al, dt1, dt2, rd, rm);
}
void Vdiv(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vdiv(cond, dt, rd, rn, rm);
}
void Vdiv(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vdiv(al, dt, rd, rn, rm);
}
void Vdiv(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vdiv(cond, dt, rd, rn, rm);
}
void Vdiv(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vdiv(al, dt, rd, rn, rm);
}
void Vdup(Condition cond, DataType dt, QRegister rd, Register rt) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vdup(cond, dt, rd, rt);
}
void Vdup(DataType dt, QRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
void Vdup(Condition cond, DataType dt, DRegister rd, Register rt) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vdup(cond, dt, rd, rt);
}
void Vdup(DataType dt, DRegister rd, Register rt) { Vdup(al, dt, rd, rt); }
void Vdup(Condition cond, DataType dt, DRegister rd, DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vdup(cond, dt, rd, rm);
}
void Vdup(DataType dt, DRegister rd, DRegisterLane rm) {
Vdup(al, dt, rd, rm);
}
void Vdup(Condition cond, DataType dt, QRegister rd, DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vdup(cond, dt, rd, rm);
}
void Vdup(DataType dt, QRegister rd, DRegisterLane rm) {
Vdup(al, dt, rd, rm);
}
void Veor(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
veor(cond, dt, rd, rn, rm);
}
void Veor(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Veor(al, dt, rd, rn, rm);
}
void Veor(Condition cond, DRegister rd, DRegister rn, DRegister rm) {
Veor(cond, kDataTypeValueNone, rd, rn, rm);
}
void Veor(DRegister rd, DRegister rn, DRegister rm) {
Veor(al, kDataTypeValueNone, rd, rn, rm);
}
void Veor(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
veor(cond, dt, rd, rn, rm);
}
void Veor(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Veor(al, dt, rd, rn, rm);
}
void Veor(Condition cond, QRegister rd, QRegister rn, QRegister rm) {
Veor(cond, kDataTypeValueNone, rd, rn, rm);
}
void Veor(QRegister rd, QRegister rn, QRegister rm) {
Veor(al, kDataTypeValueNone, rd, rn, rm);
}
void Vext(Condition cond,
DataType dt,
DRegister rd,
DRegister rn,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vext(cond, dt, rd, rn, rm, operand);
}
void Vext(DataType dt,
DRegister rd,
DRegister rn,
DRegister rm,
const DOperand& operand) {
Vext(al, dt, rd, rn, rm, operand);
}
void Vext(Condition cond,
DataType dt,
QRegister rd,
QRegister rn,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vext(cond, dt, rd, rn, rm, operand);
}
void Vext(DataType dt,
QRegister rd,
QRegister rn,
QRegister rm,
const QOperand& operand) {
Vext(al, dt, rd, rn, rm, operand);
}
void Vfma(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vfma(cond, dt, rd, rn, rm);
}
void Vfma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vfma(al, dt, rd, rn, rm);
}
void Vfma(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vfma(cond, dt, rd, rn, rm);
}
void Vfma(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vfma(al, dt, rd, rn, rm);
}
void Vfma(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vfma(cond, dt, rd, rn, rm);
}
void Vfma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vfma(al, dt, rd, rn, rm);
}
void Vfms(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vfms(cond, dt, rd, rn, rm);
}
void Vfms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vfms(al, dt, rd, rn, rm);
}
void Vfms(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vfms(cond, dt, rd, rn, rm);
}
void Vfms(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vfms(al, dt, rd, rn, rm);
}
void Vfms(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vfms(cond, dt, rd, rn, rm);
}
void Vfms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vfms(al, dt, rd, rn, rm);
}
void Vfnma(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vfnma(cond, dt, rd, rn, rm);
}
void Vfnma(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vfnma(al, dt, rd, rn, rm);
}
void Vfnma(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vfnma(cond, dt, rd, rn, rm);
}
void Vfnma(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vfnma(al, dt, rd, rn, rm);
}
void Vfnms(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vfnms(cond, dt, rd, rn, rm);
}
void Vfnms(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vfnms(al, dt, rd, rn, rm);
}
void Vfnms(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vfnms(cond, dt, rd, rn, rm);
}
void Vfnms(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vfnms(al, dt, rd, rn, rm);
}
void Vhadd(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vhadd(cond, dt, rd, rn, rm);
}
void Vhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vhadd(al, dt, rd, rn, rm);
}
void Vhadd(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vhadd(cond, dt, rd, rn, rm);
}
void Vhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vhadd(al, dt, rd, rn, rm);
}
void Vhsub(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vhsub(cond, dt, rd, rn, rm);
}
void Vhsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vhsub(al, dt, rd, rn, rm);
}
void Vhsub(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vhsub(cond, dt, rd, rn, rm);
}
void Vhsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vhsub(al, dt, rd, rn, rm);
}
void Vld1(Condition cond,
DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vld1(cond, dt, nreglist, operand);
}
void Vld1(DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
Vld1(al, dt, nreglist, operand);
}
void Vld2(Condition cond,
DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vld2(cond, dt, nreglist, operand);
}
void Vld2(DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
Vld2(al, dt, nreglist, operand);
}
void Vld3(Condition cond,
DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vld3(cond, dt, nreglist, operand);
}
void Vld3(DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
Vld3(al, dt, nreglist, operand);
}
void Vld3(Condition cond,
DataType dt,
const NeonRegisterList& nreglist,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vld3(cond, dt, nreglist, operand);
}
void Vld3(DataType dt,
const NeonRegisterList& nreglist,
const MemOperand& operand) {
Vld3(al, dt, nreglist, operand);
}
void Vld4(Condition cond,
DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vld4(cond, dt, nreglist, operand);
}
void Vld4(DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
Vld4(al, dt, nreglist, operand);
}
void Vldm(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vldm(cond, dt, rn, write_back, dreglist);
}
void Vldm(DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vldm(al, dt, rn, write_back, dreglist);
}
void Vldm(Condition cond,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vldm(cond, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vldm(Register rn, WriteBack write_back, DRegisterList dreglist) {
Vldm(al, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vldm(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vldm(cond, dt, rn, write_back, sreglist);
}
void Vldm(DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vldm(al, dt, rn, write_back, sreglist);
}
void Vldm(Condition cond,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vldm(cond, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vldm(Register rn, WriteBack write_back, SRegisterList sreglist) {
Vldm(al, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vldmdb(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vldmdb(cond, dt, rn, write_back, dreglist);
}
void Vldmdb(DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vldmdb(al, dt, rn, write_back, dreglist);
}
void Vldmdb(Condition cond,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vldmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vldmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
Vldmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vldmdb(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vldmdb(cond, dt, rn, write_back, sreglist);
}
void Vldmdb(DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vldmdb(al, dt, rn, write_back, sreglist);
}
void Vldmdb(Condition cond,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vldmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vldmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
Vldmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vldmia(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vldmia(cond, dt, rn, write_back, dreglist);
}
void Vldmia(DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vldmia(al, dt, rn, write_back, dreglist);
}
void Vldmia(Condition cond,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vldmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vldmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
Vldmia(al, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vldmia(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vldmia(cond, dt, rn, write_back, sreglist);
}
void Vldmia(DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vldmia(al, dt, rn, write_back, sreglist);
}
void Vldmia(Condition cond,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vldmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vldmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
Vldmia(al, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vldr(Condition cond, DataType dt, DRegister rd, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vldr(cond, dt, rd, label);
}
void Vldr(DataType dt, DRegister rd, Label* label) {
Vldr(al, dt, rd, label);
}
void Vldr(Condition cond, DRegister rd, Label* label) {
Vldr(cond, Untyped64, rd, label);
}
void Vldr(DRegister rd, Label* label) { Vldr(al, Untyped64, rd, label); }
void Vldr(Condition cond,
DataType dt,
DRegister rd,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vldr(cond, dt, rd, operand);
}
void Vldr(DataType dt, DRegister rd, const MemOperand& operand) {
Vldr(al, dt, rd, operand);
}
void Vldr(Condition cond, DRegister rd, const MemOperand& operand) {
Vldr(cond, Untyped64, rd, operand);
}
void Vldr(DRegister rd, const MemOperand& operand) {
Vldr(al, Untyped64, rd, operand);
}
void Vldr(Condition cond, DataType dt, SRegister rd, Label* label) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vldr(cond, dt, rd, label);
}
void Vldr(DataType dt, SRegister rd, Label* label) {
Vldr(al, dt, rd, label);
}
void Vldr(Condition cond, SRegister rd, Label* label) {
Vldr(cond, Untyped32, rd, label);
}
void Vldr(SRegister rd, Label* label) { Vldr(al, Untyped32, rd, label); }
void Vldr(Condition cond,
DataType dt,
SRegister rd,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vldr(cond, dt, rd, operand);
}
void Vldr(DataType dt, SRegister rd, const MemOperand& operand) {
Vldr(al, dt, rd, operand);
}
void Vldr(Condition cond, SRegister rd, const MemOperand& operand) {
Vldr(cond, Untyped32, rd, operand);
}
void Vldr(SRegister rd, const MemOperand& operand) {
Vldr(al, Untyped32, rd, operand);
}
void Vmax(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmax(cond, dt, rd, rn, rm);
}
void Vmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vmax(al, dt, rd, rn, rm);
}
void Vmax(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmax(cond, dt, rd, rn, rm);
}
void Vmax(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vmax(al, dt, rd, rn, rm);
}
void Vmaxnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vmaxnm(dt, rd, rn, rm);
}
void Vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vmaxnm(dt, rd, rn, rm);
}
void Vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vmaxnm(dt, rd, rn, rm);
}
void Vmin(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmin(cond, dt, rd, rn, rm);
}
void Vmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vmin(al, dt, rd, rn, rm);
}
void Vmin(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmin(cond, dt, rd, rn, rm);
}
void Vmin(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vmin(al, dt, rd, rn, rm);
}
void Vminnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vminnm(dt, rd, rn, rm);
}
void Vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vminnm(dt, rd, rn, rm);
}
void Vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vminnm(dt, rd, rn, rm);
}
void Vmla(Condition cond,
DataType dt,
DRegister rd,
DRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmla(cond, dt, rd, rn, rm);
}
void Vmla(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
Vmla(al, dt, rd, rn, rm);
}
void Vmla(Condition cond,
DataType dt,
QRegister rd,
QRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmla(cond, dt, rd, rn, rm);
}
void Vmla(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
Vmla(al, dt, rd, rn, rm);
}
void Vmla(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmla(cond, dt, rd, rn, rm);
}
void Vmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vmla(al, dt, rd, rn, rm);
}
void Vmla(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmla(cond, dt, rd, rn, rm);
}
void Vmla(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vmla(al, dt, rd, rn, rm);
}
void Vmla(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmla(cond, dt, rd, rn, rm);
}
void Vmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vmla(al, dt, rd, rn, rm);
}
void Vmlal(Condition cond,
DataType dt,
QRegister rd,
DRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmlal(cond, dt, rd, rn, rm);
}
void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
Vmlal(al, dt, rd, rn, rm);
}
void Vmlal(
Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmlal(cond, dt, rd, rn, rm);
}
void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
Vmlal(al, dt, rd, rn, rm);
}
void Vmls(Condition cond,
DataType dt,
DRegister rd,
DRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmls(cond, dt, rd, rn, rm);
}
void Vmls(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
Vmls(al, dt, rd, rn, rm);
}
void Vmls(Condition cond,
DataType dt,
QRegister rd,
QRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmls(cond, dt, rd, rn, rm);
}
void Vmls(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
Vmls(al, dt, rd, rn, rm);
}
void Vmls(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmls(cond, dt, rd, rn, rm);
}
void Vmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vmls(al, dt, rd, rn, rm);
}
void Vmls(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmls(cond, dt, rd, rn, rm);
}
void Vmls(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vmls(al, dt, rd, rn, rm);
}
void Vmls(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmls(cond, dt, rd, rn, rm);
}
void Vmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vmls(al, dt, rd, rn, rm);
}
void Vmlsl(Condition cond,
DataType dt,
QRegister rd,
DRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmlsl(cond, dt, rd, rn, rm);
}
void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
Vmlsl(al, dt, rd, rn, rm);
}
void Vmlsl(
Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmlsl(cond, dt, rd, rn, rm);
}
void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
Vmlsl(al, dt, rd, rn, rm);
}
void Vmov(Condition cond, Register rt, SRegister rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, rt, rn);
}
void Vmov(Register rt, SRegister rn) { Vmov(al, rt, rn); }
void Vmov(Condition cond, SRegister rn, Register rt) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, rn, rt);
}
void Vmov(SRegister rn, Register rt) { Vmov(al, rn, rt); }
void Vmov(Condition cond, Register rt, Register rt2, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, rt, rt2, rm);
}
void Vmov(Register rt, Register rt2, DRegister rm) { Vmov(al, rt, rt2, rm); }
void Vmov(Condition cond, DRegister rm, Register rt, Register rt2) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, rm, rt, rt2);
}
void Vmov(DRegister rm, Register rt, Register rt2) { Vmov(al, rm, rt, rt2); }
void Vmov(
Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, rt, rt2, rm, rm1);
}
void Vmov(Register rt, Register rt2, SRegister rm, SRegister rm1) {
Vmov(al, rt, rt2, rm, rm1);
}
void Vmov(
Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, rm, rm1, rt, rt2);
}
void Vmov(SRegister rm, SRegister rm1, Register rt, Register rt2) {
Vmov(al, rm, rm1, rt, rt2);
}
void Vmov(Condition cond, DataType dt, DRegisterLane rd, Register rt) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, dt, rd, rt);
}
void Vmov(DataType dt, DRegisterLane rd, Register rt) {
Vmov(al, dt, rd, rt);
}
void Vmov(Condition cond, DRegisterLane rd, Register rt) {
Vmov(cond, kDataTypeValueNone, rd, rt);
}
void Vmov(DRegisterLane rd, Register rt) {
Vmov(al, kDataTypeValueNone, rd, rt);
}
void Vmov(Condition cond,
DataType dt,
DRegister rd,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, dt, rd, operand);
}
void Vmov(DataType dt, DRegister rd, const DOperand& operand) {
Vmov(al, dt, rd, operand);
}
void Vmov(Condition cond,
DataType dt,
QRegister rd,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, dt, rd, operand);
}
void Vmov(DataType dt, QRegister rd, const QOperand& operand) {
Vmov(al, dt, rd, operand);
}
void Vmov(Condition cond,
DataType dt,
SRegister rd,
const SOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, dt, rd, operand);
}
void Vmov(DataType dt, SRegister rd, const SOperand& operand) {
Vmov(al, dt, rd, operand);
}
void Vmov(Condition cond, DataType dt, Register rt, DRegisterLane rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmov(cond, dt, rt, rn);
}
void Vmov(DataType dt, Register rt, DRegisterLane rn) {
Vmov(al, dt, rt, rn);
}
void Vmov(Condition cond, Register rt, DRegisterLane rn) {
Vmov(cond, kDataTypeValueNone, rt, rn);
}
void Vmov(Register rt, DRegisterLane rn) {
Vmov(al, kDataTypeValueNone, rt, rn);
}
void Vmovl(Condition cond, DataType dt, QRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmovl(cond, dt, rd, rm);
}
void Vmovl(DataType dt, QRegister rd, DRegister rm) { Vmovl(al, dt, rd, rm); }
void Vmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmovn(cond, dt, rd, rm);
}
void Vmovn(DataType dt, DRegister rd, QRegister rm) { Vmovn(al, dt, rd, rm); }
void Vmrs(Condition cond,
RegisterOrAPSR_nzcv rt,
SpecialFPRegister spec_reg) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmrs(cond, rt, spec_reg);
}
void Vmrs(RegisterOrAPSR_nzcv rt, SpecialFPRegister spec_reg) {
Vmrs(al, rt, spec_reg);
}
void Vmsr(Condition cond, SpecialFPRegister spec_reg, Register rt) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmsr(cond, spec_reg, rt);
}
void Vmsr(SpecialFPRegister spec_reg, Register rt) { Vmsr(al, spec_reg, rt); }
void Vmul(Condition cond,
DataType dt,
DRegister rd,
DRegister rn,
DRegister dm,
unsigned index) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmul(cond, dt, rd, rn, dm, index);
}
void Vmul(
DataType dt, DRegister rd, DRegister rn, DRegister dm, unsigned index) {
Vmul(al, dt, rd, rn, dm, index);
}
void Vmul(Condition cond,
DataType dt,
QRegister rd,
QRegister rn,
DRegister dm,
unsigned index) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmul(cond, dt, rd, rn, dm, index);
}
void Vmul(
DataType dt, QRegister rd, QRegister rn, DRegister dm, unsigned index) {
Vmul(al, dt, rd, rn, dm, index);
}
void Vmul(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmul(cond, dt, rd, rn, rm);
}
void Vmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vmul(al, dt, rd, rn, rm);
}
void Vmul(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmul(cond, dt, rd, rn, rm);
}
void Vmul(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vmul(al, dt, rd, rn, rm);
}
void Vmul(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmul(cond, dt, rd, rn, rm);
}
void Vmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vmul(al, dt, rd, rn, rm);
}
void Vmull(Condition cond,
DataType dt,
QRegister rd,
DRegister rn,
DRegister dm,
unsigned index) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmull(cond, dt, rd, rn, dm, index);
}
void Vmull(
DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
Vmull(al, dt, rd, rn, dm, index);
}
void Vmull(
Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmull(cond, dt, rd, rn, rm);
}
void Vmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
Vmull(al, dt, rd, rn, rm);
}
void Vmvn(Condition cond,
DataType dt,
DRegister rd,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmvn(cond, dt, rd, operand);
}
void Vmvn(DataType dt, DRegister rd, const DOperand& operand) {
Vmvn(al, dt, rd, operand);
}
void Vmvn(Condition cond,
DataType dt,
QRegister rd,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vmvn(cond, dt, rd, operand);
}
void Vmvn(DataType dt, QRegister rd, const QOperand& operand) {
Vmvn(al, dt, rd, operand);
}
void Vneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vneg(cond, dt, rd, rm);
}
void Vneg(DataType dt, DRegister rd, DRegister rm) { Vneg(al, dt, rd, rm); }
void Vneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vneg(cond, dt, rd, rm);
}
void Vneg(DataType dt, QRegister rd, QRegister rm) { Vneg(al, dt, rd, rm); }
void Vneg(Condition cond, DataType dt, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vneg(cond, dt, rd, rm);
}
void Vneg(DataType dt, SRegister rd, SRegister rm) { Vneg(al, dt, rd, rm); }
void Vnmla(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vnmla(cond, dt, rd, rn, rm);
}
void Vnmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vnmla(al, dt, rd, rn, rm);
}
void Vnmla(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vnmla(cond, dt, rd, rn, rm);
}
void Vnmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vnmla(al, dt, rd, rn, rm);
}
void Vnmls(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vnmls(cond, dt, rd, rn, rm);
}
void Vnmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vnmls(al, dt, rd, rn, rm);
}
void Vnmls(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vnmls(cond, dt, rd, rn, rm);
}
void Vnmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vnmls(al, dt, rd, rn, rm);
}
void Vnmul(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vnmul(cond, dt, rd, rn, rm);
}
void Vnmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vnmul(al, dt, rd, rn, rm);
}
void Vnmul(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vnmul(cond, dt, rd, rn, rm);
}
void Vnmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vnmul(al, dt, rd, rn, rm);
}
void Vorn(Condition cond,
DataType dt,
DRegister rd,
DRegister rn,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vorn(cond, dt, rd, rn, operand);
}
void Vorn(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
Vorn(al, dt, rd, rn, operand);
}
void Vorn(Condition cond,
DataType dt,
QRegister rd,
QRegister rn,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vorn(cond, dt, rd, rn, operand);
}
void Vorn(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
Vorn(al, dt, rd, rn, operand);
}
void Vorr(Condition cond,
DataType dt,
DRegister rd,
DRegister rn,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vorr(cond, dt, rd, rn, operand);
}
void Vorr(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) {
Vorr(al, dt, rd, rn, operand);
}
void Vorr(Condition cond,
DRegister rd,
DRegister rn,
const DOperand& operand) {
Vorr(cond, kDataTypeValueNone, rd, rn, operand);
}
void Vorr(DRegister rd, DRegister rn, const DOperand& operand) {
Vorr(al, kDataTypeValueNone, rd, rn, operand);
}
void Vorr(Condition cond,
DataType dt,
QRegister rd,
QRegister rn,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vorr(cond, dt, rd, rn, operand);
}
void Vorr(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) {
Vorr(al, dt, rd, rn, operand);
}
void Vorr(Condition cond,
QRegister rd,
QRegister rn,
const QOperand& operand) {
Vorr(cond, kDataTypeValueNone, rd, rn, operand);
}
void Vorr(QRegister rd, QRegister rn, const QOperand& operand) {
Vorr(al, kDataTypeValueNone, rd, rn, operand);
}
void Vpadal(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpadal(cond, dt, rd, rm);
}
void Vpadal(DataType dt, DRegister rd, DRegister rm) {
Vpadal(al, dt, rd, rm);
}
void Vpadal(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpadal(cond, dt, rd, rm);
}
void Vpadal(DataType dt, QRegister rd, QRegister rm) {
Vpadal(al, dt, rd, rm);
}
void Vpadd(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpadd(cond, dt, rd, rn, rm);
}
void Vpadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vpadd(al, dt, rd, rn, rm);
}
void Vpaddl(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpaddl(cond, dt, rd, rm);
}
void Vpaddl(DataType dt, DRegister rd, DRegister rm) {
Vpaddl(al, dt, rd, rm);
}
void Vpaddl(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpaddl(cond, dt, rd, rm);
}
void Vpaddl(DataType dt, QRegister rd, QRegister rm) {
Vpaddl(al, dt, rd, rm);
}
void Vpmax(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpmax(cond, dt, rd, rn, rm);
}
void Vpmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vpmax(al, dt, rd, rn, rm);
}
void Vpmin(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpmin(cond, dt, rd, rn, rm);
}
void Vpmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vpmin(al, dt, rd, rn, rm);
}
void Vpop(Condition cond, DataType dt, DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpop(cond, dt, dreglist);
}
void Vpop(DataType dt, DRegisterList dreglist) { Vpop(al, dt, dreglist); }
void Vpop(Condition cond, DRegisterList dreglist) {
Vpop(cond, kDataTypeValueNone, dreglist);
}
void Vpop(DRegisterList dreglist) { Vpop(al, kDataTypeValueNone, dreglist); }
void Vpop(Condition cond, DataType dt, SRegisterList sreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpop(cond, dt, sreglist);
}
void Vpop(DataType dt, SRegisterList sreglist) { Vpop(al, dt, sreglist); }
void Vpop(Condition cond, SRegisterList sreglist) {
Vpop(cond, kDataTypeValueNone, sreglist);
}
void Vpop(SRegisterList sreglist) { Vpop(al, kDataTypeValueNone, sreglist); }
void Vpush(Condition cond, DataType dt, DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpush(cond, dt, dreglist);
}
void Vpush(DataType dt, DRegisterList dreglist) { Vpush(al, dt, dreglist); }
void Vpush(Condition cond, DRegisterList dreglist) {
Vpush(cond, kDataTypeValueNone, dreglist);
}
void Vpush(DRegisterList dreglist) {
Vpush(al, kDataTypeValueNone, dreglist);
}
void Vpush(Condition cond, DataType dt, SRegisterList sreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vpush(cond, dt, sreglist);
}
void Vpush(DataType dt, SRegisterList sreglist) { Vpush(al, dt, sreglist); }
void Vpush(Condition cond, SRegisterList sreglist) {
Vpush(cond, kDataTypeValueNone, sreglist);
}
void Vpush(SRegisterList sreglist) {
Vpush(al, kDataTypeValueNone, sreglist);
}
void Vqabs(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqabs(cond, dt, rd, rm);
}
void Vqabs(DataType dt, DRegister rd, DRegister rm) { Vqabs(al, dt, rd, rm); }
void Vqabs(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqabs(cond, dt, rd, rm);
}
void Vqabs(DataType dt, QRegister rd, QRegister rm) { Vqabs(al, dt, rd, rm); }
void Vqadd(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqadd(cond, dt, rd, rn, rm);
}
void Vqadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vqadd(al, dt, rd, rn, rm);
}
void Vqadd(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqadd(cond, dt, rd, rn, rm);
}
void Vqadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vqadd(al, dt, rd, rn, rm);
}
void Vqdmlal(
Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqdmlal(cond, dt, rd, rn, rm);
}
void Vqdmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
Vqdmlal(al, dt, rd, rn, rm);
}
void Vqdmlal(Condition cond,
DataType dt,
QRegister rd,
DRegister rn,
DRegister dm,
unsigned index) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqdmlal(cond, dt, rd, rn, dm, index);
}
void Vqdmlal(
DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
Vqdmlal(al, dt, rd, rn, dm, index);
}
void Vqdmlsl(
Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqdmlsl(cond, dt, rd, rn, rm);
}
void Vqdmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
Vqdmlsl(al, dt, rd, rn, rm);
}
void Vqdmlsl(Condition cond,
DataType dt,
QRegister rd,
DRegister rn,
DRegister dm,
unsigned index) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqdmlsl(cond, dt, rd, rn, dm, index);
}
void Vqdmlsl(
DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) {
Vqdmlsl(al, dt, rd, rn, dm, index);
}
void Vqdmulh(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqdmulh(cond, dt, rd, rn, rm);
}
void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vqdmulh(al, dt, rd, rn, rm);
}
void Vqdmulh(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqdmulh(cond, dt, rd, rn, rm);
}
void Vqdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vqdmulh(al, dt, rd, rn, rm);
}
void Vqdmulh(Condition cond,
DataType dt,
DRegister rd,
DRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqdmulh(cond, dt, rd, rn, rm);
}
void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
Vqdmulh(al, dt, rd, rn, rm);
}
void Vqdmulh(Condition cond,
DataType dt,
QRegister rd,
QRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqdmulh(cond, dt, rd, rn, rm);
}
void Vqdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
Vqdmulh(al, dt, rd, rn, rm);
}
void Vqdmull(
Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqdmull(cond, dt, rd, rn, rm);
}
void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
Vqdmull(al, dt, rd, rn, rm);
}
void Vqdmull(Condition cond,
DataType dt,
QRegister rd,
DRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqdmull(cond, dt, rd, rn, rm);
}
void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) {
Vqdmull(al, dt, rd, rn, rm);
}
void Vqmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqmovn(cond, dt, rd, rm);
}
void Vqmovn(DataType dt, DRegister rd, QRegister rm) {
Vqmovn(al, dt, rd, rm);
}
void Vqmovun(Condition cond, DataType dt, DRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqmovun(cond, dt, rd, rm);
}
void Vqmovun(DataType dt, DRegister rd, QRegister rm) {
Vqmovun(al, dt, rd, rm);
}
void Vqneg(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqneg(cond, dt, rd, rm);
}
void Vqneg(DataType dt, DRegister rd, DRegister rm) { Vqneg(al, dt, rd, rm); }
void Vqneg(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqneg(cond, dt, rd, rm);
}
void Vqneg(DataType dt, QRegister rd, QRegister rm) { Vqneg(al, dt, rd, rm); }
void Vqrdmulh(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqrdmulh(cond, dt, rd, rn, rm);
}
void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vqrdmulh(al, dt, rd, rn, rm);
}
void Vqrdmulh(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqrdmulh(cond, dt, rd, rn, rm);
}
void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vqrdmulh(al, dt, rd, rn, rm);
}
void Vqrdmulh(Condition cond,
DataType dt,
DRegister rd,
DRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqrdmulh(cond, dt, rd, rn, rm);
}
void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) {
Vqrdmulh(al, dt, rd, rn, rm);
}
void Vqrdmulh(Condition cond,
DataType dt,
QRegister rd,
QRegister rn,
DRegisterLane rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqrdmulh(cond, dt, rd, rn, rm);
}
void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) {
Vqrdmulh(al, dt, rd, rn, rm);
}
void Vqrshl(
Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqrshl(cond, dt, rd, rm, rn);
}
void Vqrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
Vqrshl(al, dt, rd, rm, rn);
}
void Vqrshl(
Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqrshl(cond, dt, rd, rm, rn);
}
void Vqrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
Vqrshl(al, dt, rd, rm, rn);
}
void Vqrshrn(Condition cond,
DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqrshrn(cond, dt, rd, rm, operand);
}
void Vqrshrn(DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
Vqrshrn(al, dt, rd, rm, operand);
}
void Vqrshrun(Condition cond,
DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqrshrun(cond, dt, rd, rm, operand);
}
void Vqrshrun(DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
Vqrshrun(al, dt, rd, rm, operand);
}
void Vqshl(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqshl(cond, dt, rd, rm, operand);
}
void Vqshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vqshl(al, dt, rd, rm, operand);
}
void Vqshl(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqshl(cond, dt, rd, rm, operand);
}
void Vqshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vqshl(al, dt, rd, rm, operand);
}
void Vqshlu(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqshlu(cond, dt, rd, rm, operand);
}
void Vqshlu(DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
Vqshlu(al, dt, rd, rm, operand);
}
void Vqshlu(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqshlu(cond, dt, rd, rm, operand);
}
void Vqshlu(DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
Vqshlu(al, dt, rd, rm, operand);
}
void Vqshrn(Condition cond,
DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqshrn(cond, dt, rd, rm, operand);
}
void Vqshrn(DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
Vqshrn(al, dt, rd, rm, operand);
}
void Vqshrun(Condition cond,
DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqshrun(cond, dt, rd, rm, operand);
}
void Vqshrun(DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
Vqshrun(al, dt, rd, rm, operand);
}
void Vqsub(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqsub(cond, dt, rd, rn, rm);
}
void Vqsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vqsub(al, dt, rd, rn, rm);
}
void Vqsub(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vqsub(cond, dt, rd, rn, rm);
}
void Vqsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vqsub(al, dt, rd, rn, rm);
}
void Vraddhn(
Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vraddhn(cond, dt, rd, rn, rm);
}
void Vraddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
Vraddhn(al, dt, rd, rn, rm);
}
void Vrecpe(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrecpe(cond, dt, rd, rm);
}
void Vrecpe(DataType dt, DRegister rd, DRegister rm) {
Vrecpe(al, dt, rd, rm);
}
void Vrecpe(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrecpe(cond, dt, rd, rm);
}
void Vrecpe(DataType dt, QRegister rd, QRegister rm) {
Vrecpe(al, dt, rd, rm);
}
void Vrecps(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrecps(cond, dt, rd, rn, rm);
}
void Vrecps(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vrecps(al, dt, rd, rn, rm);
}
void Vrecps(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrecps(cond, dt, rd, rn, rm);
}
void Vrecps(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vrecps(al, dt, rd, rn, rm);
}
void Vrev16(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrev16(cond, dt, rd, rm);
}
void Vrev16(DataType dt, DRegister rd, DRegister rm) {
Vrev16(al, dt, rd, rm);
}
void Vrev16(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrev16(cond, dt, rd, rm);
}
void Vrev16(DataType dt, QRegister rd, QRegister rm) {
Vrev16(al, dt, rd, rm);
}
void Vrev32(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrev32(cond, dt, rd, rm);
}
void Vrev32(DataType dt, DRegister rd, DRegister rm) {
Vrev32(al, dt, rd, rm);
}
void Vrev32(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrev32(cond, dt, rd, rm);
}
void Vrev32(DataType dt, QRegister rd, QRegister rm) {
Vrev32(al, dt, rd, rm);
}
void Vrev64(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrev64(cond, dt, rd, rm);
}
void Vrev64(DataType dt, DRegister rd, DRegister rm) {
Vrev64(al, dt, rd, rm);
}
void Vrev64(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrev64(cond, dt, rd, rm);
}
void Vrev64(DataType dt, QRegister rd, QRegister rm) {
Vrev64(al, dt, rd, rm);
}
void Vrhadd(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrhadd(cond, dt, rd, rn, rm);
}
void Vrhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vrhadd(al, dt, rd, rn, rm);
}
void Vrhadd(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrhadd(cond, dt, rd, rn, rm);
}
void Vrhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vrhadd(al, dt, rd, rn, rm);
}
void Vrinta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrinta(dt1, dt2, rd, rm);
}
void Vrinta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrinta(dt1, dt2, rd, rm);
}
void Vrinta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrinta(dt1, dt2, rd, rm);
}
void Vrintm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintm(dt1, dt2, rd, rm);
}
void Vrintm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintm(dt1, dt2, rd, rm);
}
void Vrintm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintm(dt1, dt2, rd, rm);
}
void Vrintn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintn(dt1, dt2, rd, rm);
}
void Vrintn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintn(dt1, dt2, rd, rm);
}
void Vrintn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintn(dt1, dt2, rd, rm);
}
void Vrintp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintp(dt1, dt2, rd, rm);
}
void Vrintp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintp(dt1, dt2, rd, rm);
}
void Vrintp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintp(dt1, dt2, rd, rm);
}
void Vrintr(
Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrintr(cond, dt1, dt2, rd, rm);
}
void Vrintr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
Vrintr(al, dt1, dt2, rd, rm);
}
void Vrintr(
Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrintr(cond, dt1, dt2, rd, rm);
}
void Vrintr(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
Vrintr(al, dt1, dt2, rd, rm);
}
void Vrintx(
Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrintx(cond, dt1, dt2, rd, rm);
}
void Vrintx(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
Vrintx(al, dt1, dt2, rd, rm);
}
void Vrintx(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintx(dt1, dt2, rd, rm);
}
void Vrintx(
Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrintx(cond, dt1, dt2, rd, rm);
}
void Vrintx(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
Vrintx(al, dt1, dt2, rd, rm);
}
void Vrintz(
Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrintz(cond, dt1, dt2, rd, rm);
}
void Vrintz(DataType dt1, DataType dt2, DRegister rd, DRegister rm) {
Vrintz(al, dt1, dt2, rd, rm);
}
void Vrintz(DataType dt1, DataType dt2, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vrintz(dt1, dt2, rd, rm);
}
void Vrintz(
Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrintz(cond, dt1, dt2, rd, rm);
}
void Vrintz(DataType dt1, DataType dt2, SRegister rd, SRegister rm) {
Vrintz(al, dt1, dt2, rd, rm);
}
void Vrshl(
Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrshl(cond, dt, rd, rm, rn);
}
void Vrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) {
Vrshl(al, dt, rd, rm, rn);
}
void Vrshl(
Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrshl(cond, dt, rd, rm, rn);
}
void Vrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) {
Vrshl(al, dt, rd, rm, rn);
}
void Vrshr(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrshr(cond, dt, rd, rm, operand);
}
void Vrshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vrshr(al, dt, rd, rm, operand);
}
void Vrshr(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrshr(cond, dt, rd, rm, operand);
}
void Vrshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vrshr(al, dt, rd, rm, operand);
}
void Vrshrn(Condition cond,
DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrshrn(cond, dt, rd, rm, operand);
}
void Vrshrn(DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
Vrshrn(al, dt, rd, rm, operand);
}
void Vrsqrte(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrsqrte(cond, dt, rd, rm);
}
void Vrsqrte(DataType dt, DRegister rd, DRegister rm) {
Vrsqrte(al, dt, rd, rm);
}
void Vrsqrte(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrsqrte(cond, dt, rd, rm);
}
void Vrsqrte(DataType dt, QRegister rd, QRegister rm) {
Vrsqrte(al, dt, rd, rm);
}
void Vrsqrts(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrsqrts(cond, dt, rd, rn, rm);
}
void Vrsqrts(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vrsqrts(al, dt, rd, rn, rm);
}
void Vrsqrts(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrsqrts(cond, dt, rd, rn, rm);
}
void Vrsqrts(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vrsqrts(al, dt, rd, rn, rm);
}
void Vrsra(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrsra(cond, dt, rd, rm, operand);
}
void Vrsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vrsra(al, dt, rd, rm, operand);
}
void Vrsra(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrsra(cond, dt, rd, rm, operand);
}
void Vrsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vrsra(al, dt, rd, rm, operand);
}
void Vrsubhn(
Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vrsubhn(cond, dt, rd, rn, rm);
}
void Vrsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
Vrsubhn(al, dt, rd, rn, rm);
}
void Vseleq(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vseleq(dt, rd, rn, rm);
}
void Vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vseleq(dt, rd, rn, rm);
}
void Vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vselge(dt, rd, rn, rm);
}
void Vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vselge(dt, rd, rn, rm);
}
void Vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vselgt(dt, rd, rn, rm);
}
void Vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vselgt(dt, rd, rn, rm);
}
void Vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vselvs(dt, rd, rn, rm);
}
void Vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
vselvs(dt, rd, rn, rm);
}
void Vshl(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vshl(cond, dt, rd, rm, operand);
}
void Vshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vshl(al, dt, rd, rm, operand);
}
void Vshl(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vshl(cond, dt, rd, rm, operand);
}
void Vshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vshl(al, dt, rd, rm, operand);
}
void Vshll(Condition cond,
DataType dt,
QRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vshll(cond, dt, rd, rm, operand);
}
void Vshll(DataType dt, QRegister rd, DRegister rm, const DOperand& operand) {
Vshll(al, dt, rd, rm, operand);
}
void Vshr(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vshr(cond, dt, rd, rm, operand);
}
void Vshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vshr(al, dt, rd, rm, operand);
}
void Vshr(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vshr(cond, dt, rd, rm, operand);
}
void Vshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vshr(al, dt, rd, rm, operand);
}
void Vshrn(Condition cond,
DataType dt,
DRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vshrn(cond, dt, rd, rm, operand);
}
void Vshrn(DataType dt, DRegister rd, QRegister rm, const QOperand& operand) {
Vshrn(al, dt, rd, rm, operand);
}
void Vsli(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsli(cond, dt, rd, rm, operand);
}
void Vsli(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vsli(al, dt, rd, rm, operand);
}
void Vsli(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsli(cond, dt, rd, rm, operand);
}
void Vsli(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vsli(al, dt, rd, rm, operand);
}
void Vsqrt(Condition cond, DataType dt, SRegister rd, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsqrt(cond, dt, rd, rm);
}
void Vsqrt(DataType dt, SRegister rd, SRegister rm) { Vsqrt(al, dt, rd, rm); }
void Vsqrt(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsqrt(cond, dt, rd, rm);
}
void Vsqrt(DataType dt, DRegister rd, DRegister rm) { Vsqrt(al, dt, rd, rm); }
void Vsra(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsra(cond, dt, rd, rm, operand);
}
void Vsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vsra(al, dt, rd, rm, operand);
}
void Vsra(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsra(cond, dt, rd, rm, operand);
}
void Vsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vsra(al, dt, rd, rm, operand);
}
void Vsri(Condition cond,
DataType dt,
DRegister rd,
DRegister rm,
const DOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsri(cond, dt, rd, rm, operand);
}
void Vsri(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) {
Vsri(al, dt, rd, rm, operand);
}
void Vsri(Condition cond,
DataType dt,
QRegister rd,
QRegister rm,
const QOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsri(cond, dt, rd, rm, operand);
}
void Vsri(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) {
Vsri(al, dt, rd, rm, operand);
}
void Vst1(Condition cond,
DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vst1(cond, dt, nreglist, operand);
}
void Vst1(DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
Vst1(al, dt, nreglist, operand);
}
void Vst2(Condition cond,
DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vst2(cond, dt, nreglist, operand);
}
void Vst2(DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
Vst2(al, dt, nreglist, operand);
}
void Vst3(Condition cond,
DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vst3(cond, dt, nreglist, operand);
}
void Vst3(DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
Vst3(al, dt, nreglist, operand);
}
void Vst3(Condition cond,
DataType dt,
const NeonRegisterList& nreglist,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vst3(cond, dt, nreglist, operand);
}
void Vst3(DataType dt,
const NeonRegisterList& nreglist,
const MemOperand& operand) {
Vst3(al, dt, nreglist, operand);
}
void Vst4(Condition cond,
DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vst4(cond, dt, nreglist, operand);
}
void Vst4(DataType dt,
const NeonRegisterList& nreglist,
const AlignedMemOperand& operand) {
Vst4(al, dt, nreglist, operand);
}
void Vstm(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vstm(cond, dt, rn, write_back, dreglist);
}
void Vstm(DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vstm(al, dt, rn, write_back, dreglist);
}
void Vstm(Condition cond,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vstm(cond, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vstm(Register rn, WriteBack write_back, DRegisterList dreglist) {
Vstm(al, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vstm(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vstm(cond, dt, rn, write_back, sreglist);
}
void Vstm(DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vstm(al, dt, rn, write_back, sreglist);
}
void Vstm(Condition cond,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vstm(cond, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vstm(Register rn, WriteBack write_back, SRegisterList sreglist) {
Vstm(al, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vstmdb(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vstmdb(cond, dt, rn, write_back, dreglist);
}
void Vstmdb(DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vstmdb(al, dt, rn, write_back, dreglist);
}
void Vstmdb(Condition cond,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vstmdb(cond, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vstmdb(Register rn, WriteBack write_back, DRegisterList dreglist) {
Vstmdb(al, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vstmdb(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vstmdb(cond, dt, rn, write_back, sreglist);
}
void Vstmdb(DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vstmdb(al, dt, rn, write_back, sreglist);
}
void Vstmdb(Condition cond,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vstmdb(cond, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vstmdb(Register rn, WriteBack write_back, SRegisterList sreglist) {
Vstmdb(al, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vstmia(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vstmia(cond, dt, rn, write_back, dreglist);
}
void Vstmia(DataType dt,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vstmia(al, dt, rn, write_back, dreglist);
}
void Vstmia(Condition cond,
Register rn,
WriteBack write_back,
DRegisterList dreglist) {
Vstmia(cond, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vstmia(Register rn, WriteBack write_back, DRegisterList dreglist) {
Vstmia(al, kDataTypeValueNone, rn, write_back, dreglist);
}
void Vstmia(Condition cond,
DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vstmia(cond, dt, rn, write_back, sreglist);
}
void Vstmia(DataType dt,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vstmia(al, dt, rn, write_back, sreglist);
}
void Vstmia(Condition cond,
Register rn,
WriteBack write_back,
SRegisterList sreglist) {
Vstmia(cond, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vstmia(Register rn, WriteBack write_back, SRegisterList sreglist) {
Vstmia(al, kDataTypeValueNone, rn, write_back, sreglist);
}
void Vstr(Condition cond,
DataType dt,
DRegister rd,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vstr(cond, dt, rd, operand);
}
void Vstr(DataType dt, DRegister rd, const MemOperand& operand) {
Vstr(al, dt, rd, operand);
}
void Vstr(Condition cond, DRegister rd, const MemOperand& operand) {
Vstr(cond, Untyped64, rd, operand);
}
void Vstr(DRegister rd, const MemOperand& operand) {
Vstr(al, Untyped64, rd, operand);
}
void Vstr(Condition cond,
DataType dt,
SRegister rd,
const MemOperand& operand) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vstr(cond, dt, rd, operand);
}
void Vstr(DataType dt, SRegister rd, const MemOperand& operand) {
Vstr(al, dt, rd, operand);
}
void Vstr(Condition cond, SRegister rd, const MemOperand& operand) {
Vstr(cond, Untyped32, rd, operand);
}
void Vstr(SRegister rd, const MemOperand& operand) {
Vstr(al, Untyped32, rd, operand);
}
void Vsub(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsub(cond, dt, rd, rn, rm);
}
void Vsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vsub(al, dt, rd, rn, rm);
}
void Vsub(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsub(cond, dt, rd, rn, rm);
}
void Vsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vsub(al, dt, rd, rn, rm);
}
void Vsub(
Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsub(cond, dt, rd, rn, rm);
}
void Vsub(DataType dt, SRegister rd, SRegister rn, SRegister rm) {
Vsub(al, dt, rd, rn, rm);
}
void Vsubhn(
Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsubhn(cond, dt, rd, rn, rm);
}
void Vsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) {
Vsubhn(al, dt, rd, rn, rm);
}
void Vsubl(
Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsubl(cond, dt, rd, rn, rm);
}
void Vsubl(DataType dt, QRegister rd, DRegister rn, DRegister rm) {
Vsubl(al, dt, rd, rn, rm);
}
void Vsubw(
Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vsubw(cond, dt, rd, rn, rm);
}
void Vsubw(DataType dt, QRegister rd, QRegister rn, DRegister rm) {
Vsubw(al, dt, rd, rn, rm);
}
void Vswp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vswp(cond, dt, rd, rm);
}
void Vswp(DataType dt, DRegister rd, DRegister rm) { Vswp(al, dt, rd, rm); }
void Vswp(Condition cond, DRegister rd, DRegister rm) {
Vswp(cond, kDataTypeValueNone, rd, rm);
}
void Vswp(DRegister rd, DRegister rm) {
Vswp(al, kDataTypeValueNone, rd, rm);
}
void Vswp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vswp(cond, dt, rd, rm);
}
void Vswp(DataType dt, QRegister rd, QRegister rm) { Vswp(al, dt, rd, rm); }
void Vswp(Condition cond, QRegister rd, QRegister rm) {
Vswp(cond, kDataTypeValueNone, rd, rm);
}
void Vswp(QRegister rd, QRegister rm) {
Vswp(al, kDataTypeValueNone, rd, rm);
}
void Vtbl(Condition cond,
DataType dt,
DRegister rd,
const NeonRegisterList& nreglist,
DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vtbl(cond, dt, rd, nreglist, rm);
}
void Vtbl(DataType dt,
DRegister rd,
const NeonRegisterList& nreglist,
DRegister rm) {
Vtbl(al, dt, rd, nreglist, rm);
}
void Vtbx(Condition cond,
DataType dt,
DRegister rd,
const NeonRegisterList& nreglist,
DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vtbx(cond, dt, rd, nreglist, rm);
}
void Vtbx(DataType dt,
DRegister rd,
const NeonRegisterList& nreglist,
DRegister rm) {
Vtbx(al, dt, rd, nreglist, rm);
}
void Vtrn(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vtrn(cond, dt, rd, rm);
}
void Vtrn(DataType dt, DRegister rd, DRegister rm) { Vtrn(al, dt, rd, rm); }
void Vtrn(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vtrn(cond, dt, rd, rm);
}
void Vtrn(DataType dt, QRegister rd, QRegister rm) { Vtrn(al, dt, rd, rm); }
void Vtst(
Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vtst(cond, dt, rd, rn, rm);
}
void Vtst(DataType dt, DRegister rd, DRegister rn, DRegister rm) {
Vtst(al, dt, rd, rn, rm);
}
void Vtst(
Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vtst(cond, dt, rd, rn, rm);
}
void Vtst(DataType dt, QRegister rd, QRegister rn, QRegister rm) {
Vtst(al, dt, rd, rn, rm);
}
void Vuzp(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vuzp(cond, dt, rd, rm);
}
void Vuzp(DataType dt, DRegister rd, DRegister rm) { Vuzp(al, dt, rd, rm); }
void Vuzp(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vuzp(cond, dt, rd, rm);
}
void Vuzp(DataType dt, QRegister rd, QRegister rm) { Vuzp(al, dt, rd, rm); }
void Vzip(Condition cond, DataType dt, DRegister rd, DRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vzip(cond, dt, rd, rm);
}
void Vzip(DataType dt, DRegister rd, DRegister rm) { Vzip(al, dt, rd, rm); }
void Vzip(Condition cond, DataType dt, QRegister rd, QRegister rm) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
vzip(cond, dt, rd, rm);
}
void Vzip(DataType dt, QRegister rd, QRegister rm) { Vzip(al, dt, rd, rm); }
void Yield(Condition cond) {
VIXL_ASSERT(allow_macro_instructions_);
VIXL_ASSERT(OutsideITBlock());
EnsureEmitFor(kMaxInstructionSizeInBytes);
ITScope it_scope(this, &cond);
yield(cond);
}
void Yield() { Yield(al); }
// End of generated code.
private:
RegisterList available_;
VRegisterList available_vfp_;
MacroAssemblerContext context_;
Label::Offset checkpoint_;
LiteralPoolManager literal_pool_manager_;
VeneerPoolManager veneer_pool_manager_;
#ifdef VIXL_DEBUG
bool allow_macro_instructions_;
#endif
};
// This scope is used to ensure that the specified size of instructions will be
// emitted contiguously. The assert policy kExtactSize should only be used
// when you use directly the assembler as it's difficult to know exactly how
// many instructions will be emitted by the macro-assembler. Using the assembler
// means that you directly use the assembler instructions (in lower case) from a
// MacroAssembler object.
class CodeBufferCheckScope {
public:
// Tell whether or not the scope should assert the amount of code emitted
// within the scope is consistent with the requested amount.
enum AssertPolicy {
kNoAssert, // No assert required.
kExactSize, // The code emitted must be exactly size bytes.
kMaximumSize // The code emitted must be at most size bytes.
};
CodeBufferCheckScope(MacroAssembler* masm,
uint32_t size,
AssertPolicy assert_policy = kMaximumSize)
: masm_(masm) {
masm->EnsureEmitFor(size);
#ifdef VIXL_DEBUG
initial_cursor_offset_ = masm->GetCursorOffset();
size_ = size;
assert_policy_ = assert_policy;
#else
USE(assert_policy);
#endif
}
~CodeBufferCheckScope() {
#ifdef VIXL_DEBUG
switch (assert_policy_) {
case kNoAssert:
break;
case kExactSize:
VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ == size_);
break;
case kMaximumSize:
VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <= size_);
break;
default:
VIXL_UNREACHABLE();
}
#endif
}
protected:
MacroAssembler* masm_;
#ifdef VIXL_DEBUG
uint32_t initial_cursor_offset_;
uint32_t size_;
AssertPolicy assert_policy_;
#endif
};
// Use this scope when you need a one-to-one mapping between methods and
// instructions. This scope prevents the MacroAssembler functions from being
// called and the literal pools and veneers from being emitted (they can only be
// emitted when you create the scope). It also asserts the size of the emitted
// instructions is the specified size (or not greater than the specified size).
// This scope must be used when you want to directly use the assembler. It will
// ensure that the buffer is big enough and that you don't break the pool and
// veneer mechanisms.
class AssemblerAccurateScope : public CodeBufferCheckScope {
public:
AssemblerAccurateScope(MacroAssembler* masm,
uint32_t size,
AssertPolicy policy = kExactSize)
: CodeBufferCheckScope(masm, size, policy) {
VIXL_ASSERT(policy != kNoAssert);
#ifdef VIXL_DEBUG
old_allow_macro_instructions_ = masm->AllowMacroInstructions();
masm->SetAllowMacroInstructions(false);
#endif
}
~AssemblerAccurateScope() {
#ifdef VIXL_DEBUG
masm_->SetAllowMacroInstructions(old_allow_macro_instructions_);
#endif
}
private:
#ifdef VIXL_DEBUG
bool old_allow_macro_instructions_;
#endif
};
// This scope utility allows scratch registers to be managed safely. The
// MacroAssembler's GetScratchRegisterList() is used as a pool of scratch
// registers. These registers can be allocated on demand, and will be returned
// at the end of the scope.
//
// When the scope ends, the MacroAssembler's lists will be restored to their
// original state, even if the lists were modified by some other means.
class UseScratchRegisterScope {
public:
// This constructor implicitly calls the `Open` function to initialise the
// scope, so it is ready to use immediately after it has been constructed.
explicit UseScratchRegisterScope(MacroAssembler* masm)
: available_(NULL),
available_vfp_(NULL),
old_available_(0),
old_available_vfp_(0) {
Open(masm);
}
// This constructor allows deferred and optional initialisation of the scope.
// The user is required to explicitly call the `Open` function before using
// the scope.
UseScratchRegisterScope()
: available_(NULL),
available_vfp_(NULL),
old_available_(0),
old_available_vfp_(0) {}
// This function performs the actual initialisation work.
void Open(MacroAssembler* masm);
// The destructor always implicitly calls the `Close` function.
~UseScratchRegisterScope() { Close(); }
// This function performs the cleaning-up work. It must succeed even if the
// scope has not been opened. It is safe to call multiple times.
void Close();
bool IsAvailable(const Register& reg) const;
bool IsAvailable(const VRegister& reg) const;
// Take a register from the temp list. It will be returned automatically when
// the scope ends.
Register Acquire();
VRegister AcquireV(unsigned size_in_bits);
QRegister AcquireQ();
DRegister AcquireD();
SRegister AcquireS();
// Explicitly release an acquired (or excluded) register, putting it back in
// the temp list.
void Release(const Register& reg);
void Release(const VRegister& reg);
// Make the specified registers available as scratch registers for the
// duration of this scope.
void Include(const RegisterList& list);
void Include(const Register& reg1,
const Register& reg2 = NoReg,
const Register& reg3 = NoReg,
const Register& reg4 = NoReg) {
Include(RegisterList(reg1, reg2, reg3, reg4));
}
void Include(const VRegisterList& list);
void Include(const VRegister& reg1,
const VRegister& reg2 = NoVReg,
const VRegister& reg3 = NoVReg,
const VRegister& reg4 = NoVReg) {
Include(VRegisterList(reg1, reg2, reg3, reg4));
}
// Make sure that the specified registers are not available in this scope.
// This can be used to prevent helper functions from using sensitive
// registers, for example.
void Exclude(const RegisterList& list);
void Exclude(const Register& reg1,
const Register& reg2 = NoReg,
const Register& reg3 = NoReg,
const Register& reg4 = NoReg) {
Exclude(RegisterList(reg1, reg2, reg3, reg4));
}
void Exclude(const VRegisterList& list);
void Exclude(const VRegister& reg1,
const VRegister& reg2 = NoVReg,
const VRegister& reg3 = NoVReg,
const VRegister& reg4 = NoVReg) {
Exclude(VRegisterList(reg1, reg2, reg3, reg4));
}
// Prevent any scratch registers from being used in this scope.
void ExcludeAll();
private:
// Available scratch registers.
RegisterList* available_; // kRRegister
VRegisterList* available_vfp_; // kVRegister
// The state of the available lists at the start of this scope.
uint32_t old_available_; // kRRegister
uint64_t old_available_vfp_; // kVRegister
VIXL_DEBUG_NO_RETURN UseScratchRegisterScope(const UseScratchRegisterScope&) {
VIXL_UNREACHABLE();
}
VIXL_DEBUG_NO_RETURN void operator=(const UseScratchRegisterScope&) {
VIXL_UNREACHABLE();
}
};
class JumpTableBase {
protected:
JumpTableBase(int len, int offset_size)
: table_location_(Label::kMaxOffset),
branch_location_(Label::kMaxOffset),
length_(len),
offset_shift_(WhichPowerOf2(offset_size)),
presence_(length_) {
VIXL_ASSERT((length_ >= 0) && (offset_size <= 4));
}
virtual ~JumpTableBase() {}
public:
int GetTableSizeInBytes() const { return length_ * (1 << offset_shift_); }
int GetOffsetShift() const { return offset_shift_; }
int GetLength() const { return length_; }
Label* GetDefaultLabel() { return &default_; }
Label* GetEndLabel() { return &end_; }
void SetBranchLocation(uint32_t branch_location) {
branch_location_ = branch_location;
}
uint32_t GetBranchLocation() const { return branch_location_; }
void BindTable(uint32_t location) { table_location_ = location; }
virtual void Link(MacroAssembler* masm,
int case_index,
uint32_t location) = 0;
uint32_t GetLocationForCase(int i) {
VIXL_ASSERT((i >= 0) && (i < length_));
return table_location_ + (i * (1 << offset_shift_));
}
void SetPresenceBitForCase(int i) {
VIXL_ASSERT((i >= 0) && (i < length_));
presence_.Set(i);
}
void Finalize(MacroAssembler* masm) {
if (!default_.IsBound()) {
masm->Bind(&default_);
}
masm->Bind(&end_);
presence_.ForEachBitNotSet(LinkIt(this, masm, default_.GetLocation()));
}
private:
uint32_t table_location_;
uint32_t branch_location_;
const int length_;
const int offset_shift_;
BitField presence_;
Label default_;
Label end_;
struct LinkIt {
JumpTableBase* table_;
MacroAssembler* const masm_;
const uint32_t location_;
LinkIt(JumpTableBase* table, MacroAssembler* const masm, uint32_t location)
: table_(table), masm_(masm), location_(location) {}
bool execute(int id) const {
VIXL_ASSERT(id < table_->GetLength());
table_->Link(masm_, static_cast<int>(id), location_);
return true;
}
};
};
// JumpTable<T>(len): Helper to describe a jump table
// len here describes the number of possible case. Values in [0, n[ can have a
// jump offset. Any other value will assert.
template <typename T>
class JumpTable : public JumpTableBase {
protected:
explicit JumpTable(int length) : JumpTableBase(length, sizeof(T)) {}
public:
virtual void Link(MacroAssembler* masm, int case_index, uint32_t location) {
uint32_t position_in_table = GetLocationForCase(case_index);
uint32_t from = GetBranchLocation();
int offset = location - from;
T* case_offset = masm->GetBuffer().GetOffsetAddress<T*>(position_in_table);
if (masm->IsT32()) {
*case_offset = offset >> 1;
} else {
*case_offset = offset >> 2;
}
}
};
class JumpTable8bitOffset : public JumpTable<uint8_t> {
public:
explicit JumpTable8bitOffset(int length) : JumpTable<uint8_t>(length) {}
};
class JumpTable16bitOffset : public JumpTable<uint16_t> {
public:
explicit JumpTable16bitOffset(int length) : JumpTable<uint16_t>(length) {}
};
class JumpTable32bitOffset : public JumpTable<uint32_t> {
public:
explicit JumpTable32bitOffset(int length) : JumpTable<uint32_t>(length) {}
};
} // namespace aarch32
} // namespace vixl
#endif // VIXL_A32_MACRO_ASSEMBLER_A32_H_