// Copyright 2015, VIXL authors // 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_AARCH32_MACRO_ASSEMBLER_AARCH32_H_ #define VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_ #include "code-generation-scopes-vixl.h" #include "macro-assembler-interface.h" #include "utils-vixl.h" #include "aarch32/instructions-aarch32.h" #include "aarch32/assembler-aarch32.h" #include "aarch32/operands-aarch32.h" namespace vixl { namespace aarch32 { class UseScratchRegisterScope; enum FlagsUpdate { LeaveFlags = 0, SetFlags = 1, DontCare = 2 }; // LiteralPool class, defined as a container for literals class LiteralPool { public: typedef std::list::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. void AddLiteral(RawLiteral* literal) { // Manually placed literals can't be added to a literal pool. VIXL_ASSERT(!literal->IsManuallyPlaced()); VIXL_ASSERT(!literal->IsBound()); if (literal->GetPositionInPool() == Label::kMaxOffset) { uint32_t position = GetSize(); literal->SetPositionInPool(position); literals_.push_back(literal); size_ += literal->GetAlignedSize(); } } // 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 literals_; // Already bound Literal container the app requested this pool to keep. std::list keep_until_delete_; }; // Macro assembler for aarch32 instruction set. class MacroAssembler : public Assembler, public MacroAssemblerInterface { public: enum EmitOption { kBranchRequired, kNoBranchRequired }; virtual internal::AssemblerBase* AsAssemblerBase() VIXL_OVERRIDE { return this; } virtual bool ArePoolsBlocked() const VIXL_OVERRIDE { return IsLiteralPoolBlocked() && IsVeneerPoolBlocked(); } private: class MacroEmissionCheckScope : public EmissionCheckScope { public: explicit MacroEmissionCheckScope(MacroAssemblerInterface* masm) : EmissionCheckScope(masm, kTypicalMacroInstructionMaxSize) {} private: static const size_t kTypicalMacroInstructionMaxSize = 8 * kMaxInstructionSizeInBytes; }; class MacroAssemblerContext { public: MacroAssemblerContext() : count_(0) {} ~MacroAssemblerContext() {} unsigned GetRecursiveCount() const { return count_; } void Up(const char* loc) { location_stack_[count_] = loc; count_++; if (count_ >= kMaxRecursion) { printf( "Recursion limit reached; unable to resolve macro assembler " "call.\n"); printf("Macro assembler context stack:\n"); for (unsigned i = 0; i < kMaxRecursion; i++) { printf("%10s %s\n", (i == 0) ? "oldest -> " : "", location_stack_[i]); } VIXL_ABORT(); } } void Down() { VIXL_ASSERT((count_ > 0) && (count_ < kMaxRecursion)); count_--; } private: unsigned count_; static const uint32_t kMaxRecursion = 6; const char* location_stack_[kMaxRecursion]; }; // This scope is used at each Delegate entry to avoid infinite recursion of // Delegate calls. The limit is defined by // MacroAssemblerContext::kMaxRecursion. class ContextScope { public: explicit ContextScope(MacroAssembler* const masm, const char* loc) : masm_(masm) { VIXL_ASSERT(masm_->AllowMacroInstructions()); masm_->GetContext()->Up(loc); } ~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->IsUsingT32()) { 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. // TODO: Use a scope utility with a size check. To do that, we'd need // one with Open() and Close() implemented. masm_->EnsureEmitFor(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(); #else USE(initial_cursor_offset_); #endif } ~ITScope() { if (label_.IsReferenced()) { // We only use the label for conditional T32 instructions for which we // cannot use IT. VIXL_ASSERT(!cond_.Is(al)); VIXL_ASSERT(masm_->IsUsingT32()); VIXL_ASSERT(!can_use_it_); VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <= kMaxT32MacroInstructionSizeInBytes); masm_->BindHelper(&label_); } else if (masm_->IsUsingT32() && !cond_.Is(al)) { // If we've generated a conditional T32 instruction but haven't used the // label, we must have used IT. Check that we did not generate a // deprecated sequence. VIXL_ASSERT(can_use_it_); VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <= k16BitT32InstructionSizeInBytes); } } private: MacroAssembler* masm_; Condition cond_; Label label_; bool can_use_it_; uint32_t initial_cursor_offset_; }; template class EmitLiteralCondDtDL { public: EmitLiteralCondDtDL(DataType dt, DRegister rt) : dt_(dt), rt_(rt) {} void emit(MacroAssembler* const masm, Condition cond, RawLiteral* const literal) { (masm->*asmfn)(cond, dt_, rt_, literal); } private: DataType dt_; DRegister rt_; }; template class EmitLiteralCondDtSL { public: EmitLiteralCondDtSL(DataType dt, SRegister rt) : dt_(dt), rt_(rt) {} void emit(MacroAssembler* const masm, Condition cond, RawLiteral* const literal) { (masm->*asmfn)(cond, dt_, rt_, literal); } private: DataType dt_; SRegister rt_; }; template class EmitLiteralCondRL { public: explicit EmitLiteralCondRL(Register rt) : rt_(rt) {} void emit(MacroAssembler* const masm, Condition cond, RawLiteral* const literal) { (masm->*asmfn)(cond, rt_, literal); } private: Register rt_; }; template class EmitLiteralCondRRL { public: EmitLiteralCondRRL(Register rt, Register rt2) : rt_(rt), rt2_(rt2) {} void emit(MacroAssembler* const masm, Condition cond, RawLiteral* const literal) { (masm->*asmfn)(cond, rt_, rt2_, literal); } private: Register rt_, rt2_; }; class LiteralPoolManager { public: explicit LiteralPoolManager(MacroAssembler* const masm) : masm_(masm), monitor_(0) { 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. // This function is called after generating an instruction with a literal. // We want to know if the literal can be reached by the instruction. // If not, we will unwind the instruction, generate the pool (without the // last literal) and generate the instruction again. // "literal" is the literal we want to insert into the pool. // "from" is the location where the instruction which uses the literal has // been generated. bool WasInsertedTooFar(RawLiteral* literal) const { // Last accessible location for the instruction we just generated, which // uses the literal. Label::ForwardReference& reference = literal->GetBackForwardRef(); Label::Offset new_checkpoint = AlignDown(reference.GetCheckpoint(), 4); // TODO: We should not need to get the min of new_checkpoint and the // existing checkpoint. The existing checkpoint should already have // been checked when reserving space for this load literal instruction. // The assertion below asserts that we don't need the min operation here. Label::Offset checkpoint = std::min(new_checkpoint, literal->GetAlignedCheckpoint(4)); bool literal_in_pool = (literal->GetPositionInPool() != Label::kMaxOffset); Label::Offset position_in_pool = literal_in_pool ? literal->GetPositionInPool() : literal_pool_.GetSize(); // Compare the checkpoint to the location where the literal should be // added. // We add space for two instructions: one branch and one potential veneer // which may be added after the check. In this particular use case, no // veneer can be added but, this way, we are consistent with all the // literal pool checks. int32_t from = reference.GetLocation() + masm_->GetArchitectureStatePCOffset(); bool too_far = checkpoint < from + position_in_pool + 2 * static_cast(kMaxInstructionSizeInBytes); // Assert if the literal is already in the pool and the existing // checkpoint triggers a rewind here, as this means the pool should // already have been emitted (perhaps we have not reserved enough space // for the instruction we are about to rewind). VIXL_ASSERT(!(too_far && (literal->GetCheckpoint() < new_checkpoint))); 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(); } } bool IsEmpty() const { return GetLiteralPoolSize() == 0; } void Block() { monitor_++; } void Release() { VIXL_ASSERT(IsBlocked()); if (--monitor_ == 0) { // Ensure the pool has not been blocked for too long. VIXL_ASSERT(masm_->GetCursorOffset() <= checkpoint_); } } bool IsBlocked() const { return monitor_ != 0; } 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_; // Indicates whether the emission of this pool is blocked. int monitor_; }; void PerformEnsureEmit(Label::Offset target, uint32_t extra_size); protected: virtual void BlockPools() VIXL_OVERRIDE { BlockLiteralPool(); BlockVeneerPool(); } virtual void ReleasePools() VIXL_OVERRIDE { ReleaseLiteralPool(); ReleaseVeneerPool(); } virtual void EnsureEmitPoolsFor(size_t size) VIXL_OVERRIDE { // TODO: Optimise this. It also checks that there is space in the buffer, // which we do not need to do here. VIXL_ASSERT(IsUint32(size)); EnsureEmitFor(static_cast(size)); } // 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. virtual void SetAllowMacroInstructions(bool value) VIXL_OVERRIDE { allow_macro_instructions_ = value; } void BlockLiteralPool() { literal_pool_manager_.Block(); } void ReleaseLiteralPool() { literal_pool_manager_.Release(); } bool IsLiteralPoolBlocked() const { return literal_pool_manager_.IsBlocked(); } void BlockVeneerPool() { veneer_pool_manager_.Block(); } void ReleaseVeneerPool() { veneer_pool_manager_.Release(); } bool IsVeneerPoolBlocked() const { return veneer_pool_manager_.IsBlocked(); } void HandleOutOfBoundsImmediate(Condition cond, Register tmp, uint32_t imm); void PadToMinimumBranchRange(Label* label); // 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 void GenerateInstruction(Condition cond, T instr_callback, RawLiteral* const literal) { int32_t cursor = GetCursorOffset(); // Emit the instruction, via the assembler { MacroEmissionCheckScope guard(this); // The ITScope can change the condition and we want to be able to revert // this. Condition c(cond); ITScope it_scope(this, &c); instr_callback.emit(this, c, literal); } if (!literal->IsManuallyPlaced() && !literal->IsBound() && !IsLiteralPoolBlocked()) { if (WasInsertedTooFar(literal)) { // The instruction's data is too far: revert the emission GetBuffer()->Rewind(cursor); literal->InvalidateLastForwardReference(RawLiteral::kNoUpdateNecessary); EmitLiteralPool(kBranchRequired); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); instr_callback.emit(this, cond, literal); } // The literal pool above might have included the literal - in which // case it will now be bound. if (!literal->IsBound()) { literal_pool_manager_.GetLiteralPool()->AddLiteral(literal); literal_pool_manager_.UpdateCheckpoint(literal); } } } public: explicit MacroAssembler(InstructionSet isa = kDefaultISA) : Assembler(isa), available_(r12), current_scratch_scope_(NULL), checkpoint_(Label::kMaxOffset), literal_pool_manager_(this), veneer_pool_manager_(this), generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE) { #ifdef VIXL_DEBUG SetAllowMacroInstructions(true); #else USE(literal_pool_manager_); USE(allow_macro_instructions_); #endif ComputeCheckpoint(); } explicit MacroAssembler(size_t size, InstructionSet isa = kDefaultISA) : Assembler(size, isa), available_(r12), current_scratch_scope_(NULL), checkpoint_(Label::kMaxOffset), literal_pool_manager_(this), veneer_pool_manager_(this), generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE) { #ifdef VIXL_DEBUG SetAllowMacroInstructions(true); #endif ComputeCheckpoint(); } MacroAssembler(byte* buffer, size_t size, InstructionSet isa = kDefaultISA) : Assembler(buffer, size, isa), available_(r12), current_scratch_scope_(NULL), checkpoint_(Label::kMaxOffset), literal_pool_manager_(this), veneer_pool_manager_(this), generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE) { #ifdef VIXL_DEBUG SetAllowMacroInstructions(true); #endif ComputeCheckpoint(); } bool GenerateSimulatorCode() const { return generate_simulator_code_; } virtual bool AllowMacroInstructions() const VIXL_OVERRIDE { return allow_macro_instructions_; } void FinalizeCode() { EmitLiteralPool(kNoBranchRequired); Assembler::FinalizeCode(); } RegisterList* GetScratchRegisterList() { return &available_; } VRegisterList* GetScratchVRegisterList() { return &available_vfp_; } // Get or set the current (most-deeply-nested) UseScratchRegisterScope. void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) { current_scratch_scope_ = scope; } UseScratchRegisterScope* GetCurrentScratchRegisterScope() { return current_scratch_scope_; } // Given an address calculation (Register + immediate), generate code to // partially compute the address. The returned MemOperand will perform any // remaining computation in a subsequent load or store instruction. // // The offset provided should be the offset that would be used in a load or // store instruction (if it had sufficient range). This only matters where // base.Is(pc), since load and store instructions align the pc before // dereferencing it. // // TODO: Improve the handling of negative offsets. They are not implemented // precisely for now because they only have a marginal benefit for the // existing uses (in delegates). MemOperand MemOperandComputationHelper(Condition cond, Register scratch, Register base, uint32_t offset, uint32_t extra_offset_mask = 0); MemOperand MemOperandComputationHelper(Register scratch, Register base, uint32_t offset, uint32_t extra_offset_mask = 0) { return MemOperandComputationHelper(al, scratch, base, offset, extra_offset_mask); } MemOperand MemOperandComputationHelper(Condition cond, Register scratch, Label* label, uint32_t extra_offset_mask = 0) { // Check for buffer space _before_ calculating the offset, in case we // generate a pool that affects the offset calculation. CodeBufferCheckScope scope(this, 4 * kMaxInstructionSizeInBytes); Label::Offset offset = label->GetLocation() - AlignDown(GetCursorOffset() + GetArchitectureStatePCOffset(), 4); return MemOperandComputationHelper(cond, scratch, pc, offset, extra_offset_mask); } MemOperand MemOperandComputationHelper(Register scratch, Label* label, uint32_t extra_offset_mask = 0) { return MemOperandComputationHelper(al, scratch, label, extra_offset_mask); } // Determine the appropriate mask to pass into MemOperandComputationHelper. uint32_t GetOffsetMask(InstructionType type, AddrMode addrmode); // State and type helpers. bool IsModifiedImmediate(uint32_t imm) { return IsUsingT32() ? ImmediateT32::IsImmediateT32(imm) : ImmediateA32::IsImmediateA32(imm); } void Bind(Label* label) { VIXL_ASSERT(allow_macro_instructions_); PadToMinimumBranchRange(label); BindHelper(label); } void AddBranchLabel(Label* label) { if (label->IsBound()) return; veneer_pool_manager_.AddLabel(label); } void Place(RawLiteral* literal) { VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(literal->IsManuallyPlaced()); // We have two calls to `GetBuffer()->Align()` below, that aligns on word // (4 bytes) boundaries. Only one is taken into account in // `GetAlignedSize()`. static const size_t kMaxAlignSize = 3; size_t size = literal->GetAlignedSize() + kMaxAlignSize; VIXL_ASSERT(IsUint32(size)); // TODO: We should use a scope here to check the size of data emitted. We // currently cannot because `aarch32::CodeBufferCheckScope` currently checks // for pools, so that could lead to an infinite loop. EnsureEmitFor(static_cast(size)); // Literals must be emitted aligned on word (4 bytes) boundaries. GetBuffer()->Align(); PlaceHelper(literal); GetBuffer()->Align(); } void ComputeCheckpoint(); int32_t GetMarginBeforeVeneerEmission() const { return veneer_pool_manager_.GetCheckpoint() - GetCursorOffset(); } Label::Offset GetTargetForLiteralEmission() const { if (literal_pool_manager_.IsEmpty()) return Label::kMaxOffset; // We add an instruction to the size as the instruction which calls this // function may add a veneer and, without this extra instruction, could put // the literals out of range. For example, it's the case for a "B" // instruction. At the beginning of the instruction we call EnsureEmitFor // which calls this function. However, the target of the branch hasn't been // inserted yet in the veneer pool. size_t veneer_max_size = veneer_pool_manager_.GetMaxSize() + kMaxInstructionSizeInBytes; VIXL_ASSERT(IsInt32(veneer_max_size)); // We must be able to generate the veneer pool first. Label::Offset tmp = literal_pool_manager_.GetCheckpoint() - static_cast(veneer_max_size); VIXL_ASSERT(tmp >= 0); return tmp; } int32_t GetMarginBeforeLiteralEmission() const { Label::Offset tmp = GetTargetForLiteralEmission(); VIXL_ASSERT(tmp >= GetCursorOffset()); return tmp - GetCursorOffset(); } bool VeneerPoolIsEmpty() const { return veneer_pool_manager_.IsEmpty(); } bool LiteralPoolIsEmpty() const { return literal_pool_manager_.IsEmpty(); } void EnsureEmitFor(uint32_t size) { Label::Offset target = GetCursorOffset() + size; if (target <= checkpoint_) return; PerformEnsureEmit(target, size); } bool WasInsertedTooFar(RawLiteral* literal) { return literal_pool_manager_.WasInsertedTooFar(literal); } bool AliasesAvailableScratchRegister(Register reg) { return GetScratchRegisterList()->Includes(reg); } bool AliasesAvailableScratchRegister(RegisterOrAPSR_nzcv reg) { if (reg.IsAPSR_nzcv()) return false; return GetScratchRegisterList()->Includes(reg.AsRegister()); } bool AliasesAvailableScratchRegister(VRegister reg) { return GetScratchVRegisterList()->IncludesAliasOf(reg); } bool AliasesAvailableScratchRegister(const Operand& operand) { if (operand.IsImmediate()) return false; return AliasesAvailableScratchRegister(operand.GetBaseRegister()) || (operand.IsRegisterShiftedRegister() && AliasesAvailableScratchRegister(operand.GetShiftRegister())); } bool AliasesAvailableScratchRegister(const NeonOperand& operand) { if (operand.IsImmediate()) return false; return AliasesAvailableScratchRegister(operand.GetRegister()); } bool AliasesAvailableScratchRegister(SRegisterList list) { for (int n = 0; n < list.GetLength(); n++) { if (AliasesAvailableScratchRegister(list.GetSRegister(n))) return true; } return false; } bool AliasesAvailableScratchRegister(DRegisterList list) { for (int n = 0; n < list.GetLength(); n++) { if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true; } return false; } bool AliasesAvailableScratchRegister(NeonRegisterList list) { for (int n = 0; n < list.GetLength(); n++) { if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true; } return false; } bool AliasesAvailableScratchRegister(RegisterList list) { return GetScratchRegisterList()->Overlaps(list); } bool AliasesAvailableScratchRegister(const MemOperand& operand) { return AliasesAvailableScratchRegister(operand.GetBaseRegister()) || (operand.IsShiftedRegister() && AliasesAvailableScratchRegister(operand.GetOffsetRegister())); } // 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); void EmitLiteralPool(EmitOption option = kBranchRequired) { VIXL_ASSERT(!IsLiteralPoolBlocked()); EmitLiteralPool(literal_pool_manager_.GetLiteralPool(), option); literal_pool_manager_.ResetCheckpoint(); ComputeCheckpoint(); } size_t GetLiteralPoolSize() const { return literal_pool_manager_.GetLiteralPoolSize(); } // Adr with a literal already constructed. Add the literal to the pool if it // is not already done. void Adr(Condition cond, Register rd, RawLiteral* literal) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); EmitLiteralCondRL<&Assembler::adr> emit_helper(rd); GenerateInstruction(cond, emit_helper, literal); } void Adr(Register rd, RawLiteral* literal) { Adr(al, rd, literal); } // Loads with literals already constructed. Add the literal to the pool // if it is not already done. void Ldr(Condition cond, Register rt, RawLiteral* literal) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); EmitLiteralCondRL<&Assembler::ldr> emit_helper(rt); GenerateInstruction(cond, emit_helper, literal); } void Ldr(Register rt, RawLiteral* literal) { Ldr(al, rt, literal); } void Ldrb(Condition cond, Register rt, RawLiteral* literal) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); EmitLiteralCondRL<&Assembler::ldrb> emit_helper(rt); GenerateInstruction(cond, emit_helper, literal); } void Ldrb(Register rt, RawLiteral* literal) { Ldrb(al, rt, literal); } void Ldrd(Condition cond, Register rt, Register rt2, RawLiteral* literal) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); EmitLiteralCondRRL<&Assembler::ldrd> emit_helper(rt, rt2); GenerateInstruction(cond, emit_helper, literal); } void Ldrd(Register rt, Register rt2, RawLiteral* literal) { Ldrd(al, rt, rt2, literal); } void Ldrh(Condition cond, Register rt, RawLiteral* literal) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); EmitLiteralCondRL<&Assembler::ldrh> emit_helper(rt); GenerateInstruction(cond, emit_helper, literal); } void Ldrh(Register rt, RawLiteral* literal) { Ldrh(al, rt, literal); } void Ldrsb(Condition cond, Register rt, RawLiteral* literal) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); EmitLiteralCondRL<&Assembler::ldrsb> emit_helper(rt); GenerateInstruction(cond, emit_helper, literal); } void Ldrsb(Register rt, RawLiteral* literal) { Ldrsb(al, rt, literal); } void Ldrsh(Condition cond, Register rt, RawLiteral* literal) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); EmitLiteralCondRL<&Assembler::ldrsh> emit_helper(rt); GenerateInstruction(cond, emit_helper, literal); } void Ldrsh(Register rt, RawLiteral* literal) { Ldrsh(al, rt, literal); } void Vldr(Condition cond, DataType dt, DRegister rd, RawLiteral* literal) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); EmitLiteralCondDtDL<&Assembler::vldr> emit_helper(dt, rd); GenerateInstruction(cond, emit_helper, literal); } void Vldr(DataType dt, DRegister rd, RawLiteral* literal) { Vldr(al, dt, rd, literal); } void Vldr(Condition cond, DRegister rd, RawLiteral* literal) { Vldr(cond, Untyped64, rd, literal); } void Vldr(DRegister rd, RawLiteral* literal) { Vldr(al, Untyped64, rd, literal); } void Vldr(Condition cond, DataType dt, SRegister rd, RawLiteral* literal) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); EmitLiteralCondDtSL<&Assembler::vldr> emit_helper(dt, rd); GenerateInstruction(cond, emit_helper, literal); } void Vldr(DataType dt, SRegister rd, RawLiteral* literal) { Vldr(al, dt, rd, literal); } void Vldr(Condition cond, SRegister rd, RawLiteral* literal) { Vldr(cond, Untyped32, rd, literal); } void Vldr(SRegister rd, RawLiteral* literal) { Vldr(al, Untyped32, rd, literal); } // Generic Ldr(register, data) void Ldr(Condition cond, Register rt, uint32_t v) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); RawLiteral* literal = new Literal(v, RawLiteral::kDeletedOnPlacementByPool); EmitLiteralCondRL<&Assembler::ldr> emit_helper(rt); GenerateInstruction(cond, emit_helper, literal); } template 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) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); RawLiteral* literal = new Literal(v, RawLiteral::kDeletedOnPlacementByPool); EmitLiteralCondRRL<&Assembler::ldrd> emit_helper(rt, rt2); GenerateInstruction(cond, emit_helper, literal); } template void Ldrd(Register rt, Register rt2, T v) { Ldrd(al, rt, rt2, v); } void Vldr(Condition cond, SRegister rd, float v) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); RawLiteral* literal = new Literal(v, RawLiteral::kDeletedOnPlacementByPool); EmitLiteralCondDtSL<&Assembler::vldr> emit_helper(Untyped32, rd); GenerateInstruction(cond, emit_helper, literal); } void Vldr(SRegister rd, float v) { Vldr(al, rd, v); } void Vldr(Condition cond, DRegister rd, double v) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); RawLiteral* literal = new Literal(v, RawLiteral::kDeletedOnPlacementByPool); EmitLiteralCondDtDL<&Assembler::vldr> emit_helper(Untyped64, rd); GenerateInstruction(cond, emit_helper, literal); } void Vldr(DRegister rd, double v) { Vldr(al, rd, 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); } // Claim memory on the stack. // Note that the Claim, Drop, and Peek helpers below ensure that offsets used // are multiples of 32 bits to help maintain 32-bit SP alignment. // 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); void PreparePrintfArgument(CPURegister reg, int* core_count, int* vfp_count, uint32_t* printf_type); // Handlers for cases not handled by the assembler. // ADD, MOVT, MOVW, SUB, SXTB16, TEQ, UXTB16 virtual void Delegate(InstructionType type, InstructionCondROp instruction, Condition cond, Register rn, const Operand& operand) VIXL_OVERRIDE; // CMN, CMP, MOV, MOVS, MVN, MVNS, SXTB, SXTH, TST, UXTB, UXTH virtual void Delegate(InstructionType type, InstructionCondSizeROp instruction, Condition cond, EncodingSize size, Register rn, const Operand& operand) VIXL_OVERRIDE; // ADDW, ORN, ORNS, PKHBT, PKHTB, RSC, RSCS, SUBW, SXTAB, SXTAB16, SXTAH, // UXTAB, UXTAB16, UXTAH virtual void Delegate(InstructionType type, InstructionCondRROp instruction, Condition cond, Register rd, Register rn, const Operand& operand) VIXL_OVERRIDE; // ADC, ADCS, ADD, ADDS, AND, ANDS, ASR, ASRS, BIC, BICS, EOR, EORS, LSL, // LSLS, LSR, LSRS, ORR, ORRS, ROR, RORS, RSB, RSBS, SBC, SBCS, SUB, SUBS virtual void Delegate(InstructionType type, InstructionCondSizeRL instruction, Condition cond, EncodingSize size, Register rd, Label* label) VIXL_OVERRIDE; bool GenerateSplitInstruction(InstructionCondSizeRROp instruction, Condition cond, Register rd, Register rn, uint32_t imm, uint32_t mask); virtual void Delegate(InstructionType type, InstructionCondSizeRROp instruction, Condition cond, EncodingSize size, Register rd, Register rn, const Operand& operand) VIXL_OVERRIDE; // CBNZ, CBZ virtual void Delegate(InstructionType type, InstructionRL instruction, Register rn, Label* label) VIXL_OVERRIDE; // VMOV virtual void Delegate(InstructionType type, InstructionCondDtSSop instruction, Condition cond, DataType dt, SRegister rd, const SOperand& operand) VIXL_OVERRIDE; // VMOV, VMVN virtual void Delegate(InstructionType type, InstructionCondDtDDop instruction, Condition cond, DataType dt, DRegister rd, const DOperand& operand) VIXL_OVERRIDE; // VMOV, VMVN virtual void Delegate(InstructionType type, InstructionCondDtQQop instruction, Condition cond, DataType dt, QRegister rd, const QOperand& operand) VIXL_OVERRIDE; // LDR, LDRB, LDRH, LDRSB, LDRSH, STR, STRB, STRH virtual void Delegate(InstructionType type, InstructionCondSizeRMop instruction, Condition cond, EncodingSize size, Register rd, const MemOperand& operand) VIXL_OVERRIDE; // LDAEXD, LDRD, LDREXD, STLEX, STLEXB, STLEXH, STRD, STREX, STREXB, STREXH virtual void Delegate(InstructionType type, InstructionCondRL instruction, Condition cond, Register rt, Label* label) VIXL_OVERRIDE; virtual void Delegate(InstructionType type, InstructionCondRRL instruction, Condition cond, Register rt, Register rt2, Label* label) VIXL_OVERRIDE; virtual void Delegate(InstructionType type, InstructionCondRRMop instruction, Condition cond, Register rt, Register rt2, const MemOperand& operand) VIXL_OVERRIDE; // VLDR, VSTR virtual void Delegate(InstructionType type, InstructionCondDtSMop instruction, Condition cond, DataType dt, SRegister rd, const MemOperand& operand) VIXL_OVERRIDE; // VLDR, VSTR virtual void Delegate(InstructionType type, InstructionCondDtDMop instruction, Condition cond, DataType dt, DRegister rd, const MemOperand& operand) VIXL_OVERRIDE; // MSR virtual void Delegate(InstructionType type, InstructionCondMsrOp instruction, Condition cond, MaskedSpecialRegister spec_reg, const Operand& operand) VIXL_OVERRIDE; virtual void Delegate(InstructionType type, InstructionCondDtDL instruction, Condition cond, DataType dt, DRegister rd, Label* label) VIXL_OVERRIDE; virtual void Delegate(InstructionType type, InstructionCondDtSL instruction, Condition cond, DataType dt, SRegister rd, Label* label) VIXL_OVERRIDE; // Start of generated code. void Adc(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // ADC{} {,} , ; 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 Adc(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: Adc(cond, rd, rn, operand); break; case SetFlags: Adcs(cond, rd, rn, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rn.Is(rd) && operand.IsPlainRegister() && operand.GetBaseRegister().IsLow(); if (setflags_is_smaller) { Adcs(cond, rd, rn, operand); } else { Adc(cond, rd, rn, operand); } break; } } void Adc(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { Adc(flags, al, rd, rn, operand); } void Adcs(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) { uint32_t immediate = operand.GetImmediate(); if (immediate == 0) { return; } } bool can_use_it = // ADD{} , , # ; T1 (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() && rd.IsLow()) || // ADD{} {,} , # ; T2 (operand.IsImmediate() && (operand.GetImmediate() <= 255) && rd.IsLow() && rn.Is(rd)) || // ADD{}{} , SP, # ; T1 (operand.IsImmediate() && (operand.GetImmediate() <= 1020) && ((operand.GetImmediate() & 0x3) == 0) && rd.IsLow() && rn.IsSP()) || // ADD{} , , (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() && operand.GetBaseRegister().IsLow()) || // ADD{} , ; T2 (operand.IsPlainRegister() && !rd.IsPC() && rn.Is(rd) && !operand.GetBaseRegister().IsSP() && !operand.GetBaseRegister().IsPC()) || // ADD{}{} {,} SP, ; 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 Add(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: Add(cond, rd, rn, operand); break; case SetFlags: Adds(cond, rd, rn, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() && !rd.Is(rn) && operand.GetBaseRegister().IsLow()) || (operand.IsImmediate() && ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) || (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256))))); if (setflags_is_smaller) { Adds(cond, rd, rn, operand); } else { bool changed_op_is_smaller = operand.IsImmediate() && (operand.GetSignedImmediate() < 0) && ((rd.IsLow() && rn.IsLow() && (operand.GetSignedImmediate() >= -7)) || (rd.IsLow() && rn.Is(rd) && (operand.GetSignedImmediate() >= -255))); if (changed_op_is_smaller) { Subs(cond, rd, rn, -operand.GetSignedImmediate()); } else { Add(cond, rd, rn, operand); } } break; } } void Add(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { Add(flags, al, rd, rn, operand); } void Adds(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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 And(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); if (rd.Is(rn) && operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) { return; } if (cond.Is(al) && operand.IsImmediate()) { uint32_t immediate = operand.GetImmediate(); if (immediate == 0) { mov(rd, 0); return; } if ((immediate == 0xffffffff) && rd.Is(rn)) { return; } } bool can_use_it = // AND{} {,} , ; 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 And(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: And(cond, rd, rn, operand); break; case SetFlags: Ands(cond, rd, rn, operand); break; case DontCare: if (operand.IsPlainRegister() && rd.Is(rn) && rd.Is(operand.GetBaseRegister())) { return; } bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rn.Is(rd) && operand.IsPlainRegister() && operand.GetBaseRegister().IsLow(); if (setflags_is_smaller) { Ands(cond, rd, rn, operand); } else { And(cond, rd, rn, operand); } break; } } void And(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { And(flags, al, rd, rn, operand); } void Ands(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // ASR{} {,} , # ; T2 (operand.IsImmediate() && (operand.GetImmediate() >= 1) && (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) || // ASR{} {,} , ; 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 Asr(FlagsUpdate flags, Condition cond, Register rd, Register rm, const Operand& operand) { switch (flags) { case LeaveFlags: Asr(cond, rd, rm, operand); break; case SetFlags: Asrs(cond, rd, rm, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() && ((operand.IsImmediate() && (operand.GetImmediate() >= 1) && (operand.GetImmediate() <= 32)) || (operand.IsPlainRegister() && rd.Is(rm))); if (setflags_is_smaller) { Asrs(cond, rd, rm, operand); } else { Asr(cond, rd, rm, operand); } break; } } void Asr(FlagsUpdate flags, Register rd, Register rm, const Operand& operand) { Asr(flags, al, rd, rm, operand); } void Asrs(Condition cond, Register rd, Register rm, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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, BranchHint hint = kBranchWithoutHint) { VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); if (hint == kNear) { if (label->IsBound()) { b(cond, label); } else { b(cond, Narrow, label); } } else { b(cond, label); } AddBranchLabel(label); } void B(Label* label, BranchHint hint = kBranchWithoutHint) { B(al, label, hint); } void BPreferNear(Condition cond, Label* label) { B(cond, label, kNear); } void BPreferNear(Label* label) { B(al, label, kNear); } void Bfc(Condition cond, Register rd, uint32_t lsb, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); if (cond.Is(al) && operand.IsImmediate()) { uint32_t immediate = operand.GetImmediate(); if ((immediate == 0) && rd.Is(rn)) { return; } if (immediate == 0xffffffff) { mov(rd, 0); return; } } bool can_use_it = // BIC{} {,} , ; 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 Bic(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: Bic(cond, rd, rn, operand); break; case SetFlags: Bics(cond, rd, rn, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rn.Is(rd) && operand.IsPlainRegister() && operand.GetBaseRegister().IsLow(); if (setflags_is_smaller) { Bics(cond, rd, rn, operand); } else { Bic(cond, rd, rn, operand); } break; } } void Bic(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { Bic(flags, al, rd, rn, operand); } void Bics(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // BLX{}{} ; 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(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // BX{}{} ; 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(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); bxj(cond, rm); } void Bxj(Register rm) { Bxj(al, rm); } void Cbnz(Register rn, Label* label) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); cbnz(rn, label); AddBranchLabel(label); } void Cbz(Register rn, Label* label) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); cbz(rn, label); AddBranchLabel(label); } void Clrex(Condition cond) { VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); clrex(cond); } void Clrex() { Clrex(al); } void Clz(Condition cond, Register rd, Register rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // CMN{}{} , ; 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // CMP{}{} , # ; T1 (operand.IsImmediate() && (operand.GetImmediate() <= 255) && rn.IsLow()) || // CMP{}{} , ; 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) { uint32_t immediate = operand.GetImmediate(); if (immediate == 0) { return; } if (immediate == 0xffffffff) { mvn(rd, rn); return; } } bool can_use_it = // EOR{} {,} , ; 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 Eor(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: Eor(cond, rd, rn, operand); break; case SetFlags: Eors(cond, rd, rn, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rn.Is(rd) && operand.IsPlainRegister() && operand.GetBaseRegister().IsLow(); if (setflags_is_smaller) { Eors(cond, rd, rn, operand); } else { Eor(cond, rd, rn, operand); } break; } } void Eor(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { Eor(flags, al, rd, rn, operand); } void Eors(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); isb(cond, option); } void Isb(MemoryBarrier option) { Isb(al, option); } void Lda(Condition cond, Register rt, const MemOperand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // LDR{}{} , [ {, #{+}}] ; T1 (operand.IsImmediate() && rt.IsLow() && operand.GetBaseRegister().IsLow() && operand.IsOffsetImmediateWithinRange(0, 124, 4) && (operand.GetAddrMode() == Offset)) || // LDR{}{} , [SP{, #{+}}] ; T2 (operand.IsImmediate() && rt.IsLow() && operand.GetBaseRegister().IsSP() && operand.IsOffsetImmediateWithinRange(0, 1020, 4) && (operand.GetAddrMode() == Offset)) || // LDR{}{} , [, {+}] ; 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 Ldrb(Condition cond, Register rt, const MemOperand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // LDRB{}{} , [ {, #{+}}] ; T1 (operand.IsImmediate() && rt.IsLow() && operand.GetBaseRegister().IsLow() && operand.IsOffsetImmediateWithinRange(0, 31) && (operand.GetAddrMode() == Offset)) || // LDRB{}{} , [, {+}] ; 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 Ldrd(Condition cond, Register rt, Register rt2, const MemOperand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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 Ldrex(Condition cond, Register rt, const MemOperand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // LDRH{}{} , [ {, #{+}}] ; T1 (operand.IsImmediate() && rt.IsLow() && operand.GetBaseRegister().IsLow() && operand.IsOffsetImmediateWithinRange(0, 62, 2) && (operand.GetAddrMode() == Offset)) || // LDRH{}{} , [, {+}] ; 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 Ldrsb(Condition cond, Register rt, const MemOperand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // LDRSB{}{} , [, {+}] ; 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 Ldrsh(Condition cond, Register rt, const MemOperand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // LDRSH{}{} , [, {+}] ; 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 Lsl(Condition cond, Register rd, Register rm, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // LSL{} {,} , # ; T2 (operand.IsImmediate() && (operand.GetImmediate() >= 1) && (operand.GetImmediate() <= 31) && rd.IsLow() && rm.IsLow()) || // LSL{} {,} , ; 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 Lsl(FlagsUpdate flags, Condition cond, Register rd, Register rm, const Operand& operand) { switch (flags) { case LeaveFlags: Lsl(cond, rd, rm, operand); break; case SetFlags: Lsls(cond, rd, rm, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() && ((operand.IsImmediate() && (operand.GetImmediate() >= 1) && (operand.GetImmediate() < 32)) || (operand.IsPlainRegister() && rd.Is(rm))); if (setflags_is_smaller) { Lsls(cond, rd, rm, operand); } else { Lsl(cond, rd, rm, operand); } break; } } void Lsl(FlagsUpdate flags, Register rd, Register rm, const Operand& operand) { Lsl(flags, al, rd, rm, operand); } void Lsls(Condition cond, Register rd, Register rm, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // LSR{} {,} , # ; T2 (operand.IsImmediate() && (operand.GetImmediate() >= 1) && (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) || // LSR{} {,} , ; 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 Lsr(FlagsUpdate flags, Condition cond, Register rd, Register rm, const Operand& operand) { switch (flags) { case LeaveFlags: Lsr(cond, rd, rm, operand); break; case SetFlags: Lsrs(cond, rd, rm, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() && ((operand.IsImmediate() && (operand.GetImmediate() >= 1) && (operand.GetImmediate() <= 32)) || (operand.IsPlainRegister() && rd.Is(rm))); if (setflags_is_smaller) { Lsrs(cond, rd, rm, operand); } else { Lsr(cond, rd, rm, operand); } break; } } void Lsr(FlagsUpdate flags, Register rd, Register rm, const Operand& operand) { Lsr(flags, al, rd, rm, operand); } void Lsrs(Condition cond, Register rd, Register rm, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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 Mla(FlagsUpdate flags, Condition cond, Register rd, Register rn, Register rm, Register ra) { switch (flags) { case LeaveFlags: Mla(cond, rd, rn, rm, ra); break; case SetFlags: Mlas(cond, rd, rn, rm, ra); break; case DontCare: Mla(cond, rd, rn, rm, ra); break; } } void Mla( FlagsUpdate flags, Register rd, Register rn, Register rm, Register ra) { Mla(flags, al, rd, rn, rm, ra); } void Mlas( Condition cond, Register rd, Register rn, Register rm, Register ra) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) { return; } bool can_use_it = // MOV{} , # ; T1 (operand.IsImmediate() && rd.IsLow() && (operand.GetImmediate() <= 255)) || // MOV{}{} , ; T1 (operand.IsPlainRegister() && !rd.IsPC() && !operand.GetBaseRegister().IsPC()) || // MOV{} , {, #} ; T2 (operand.IsImmediateShiftedRegister() && rd.IsLow() && operand.GetBaseRegister().IsLow() && (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) || operand.GetShift().Is(ASR))) || // MOV{} , , LSL ; T1 // MOV{} , , LSR ; T1 // MOV{} , , ASR ; T1 // MOV{} , , ROR ; 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 Mov(FlagsUpdate flags, Condition cond, Register rd, const Operand& operand) { switch (flags) { case LeaveFlags: Mov(cond, rd, operand); break; case SetFlags: Movs(cond, rd, operand); break; case DontCare: if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) { return; } bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && ((operand.IsImmediateShiftedRegister() && rd.IsLow() && operand.GetBaseRegister().IsLow() && (operand.GetShiftAmount() >= 1) && (((operand.GetShiftAmount() <= 32) && ((operand.GetShift().IsLSR() || operand.GetShift().IsASR()))) || ((operand.GetShiftAmount() < 32) && operand.GetShift().IsLSL()))) || (operand.IsRegisterShiftedRegister() && rd.IsLow() && operand.GetBaseRegister().Is(rd) && operand.GetShiftRegister().IsLow() && (operand.GetShift().IsLSL() || operand.GetShift().IsLSR() || operand.GetShift().IsASR() || operand.GetShift().IsROR())) || (operand.IsImmediate() && rd.IsLow() && (operand.GetImmediate() < 256))); if (setflags_is_smaller) { Movs(cond, rd, operand); } else { Mov(cond, rd, operand); } break; } } void Mov(FlagsUpdate flags, Register rd, const Operand& operand) { Mov(flags, al, rd, operand); } void Movs(Condition cond, Register rd, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); movt(cond, rd, operand); } void Movt(Register rd, const Operand& operand) { Movt(al, rd, operand); } void Mrs(Condition cond, Register rd, SpecialRegister spec_reg) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // MUL{} , {, } ; 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 Mul(FlagsUpdate flags, Condition cond, Register rd, Register rn, Register rm) { switch (flags) { case LeaveFlags: Mul(cond, rd, rn, rm); break; case SetFlags: Muls(cond, rd, rn, rm); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rn.IsLow() && rm.Is(rd); if (setflags_is_smaller) { Muls(cond, rd, rn, rm); } else { Mul(cond, rd, rn, rm); } break; } } void Mul(FlagsUpdate flags, Register rd, Register rn, Register rm) { Mul(flags, al, rd, rn, rm); } void Muls(Condition cond, Register rd, Register rn, Register rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // MVN{} , ; 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 Mvn(FlagsUpdate flags, Condition cond, Register rd, const Operand& operand) { switch (flags) { case LeaveFlags: Mvn(cond, rd, operand); break; case SetFlags: Mvns(cond, rd, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && operand.IsPlainRegister() && operand.GetBaseRegister().IsLow(); if (setflags_is_smaller) { Mvns(cond, rd, operand); } else { Mvn(cond, rd, operand); } break; } } void Mvn(FlagsUpdate flags, Register rd, const Operand& operand) { Mvn(flags, al, rd, operand); } void Mvns(Condition cond, Register rd, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); nop(cond); } void Nop() { Nop(al); } void Orn(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); if (cond.Is(al) && operand.IsImmediate()) { uint32_t immediate = operand.GetImmediate(); if (immediate == 0) { mvn(rd, 0); return; } if ((immediate == 0xffffffff) && rd.Is(rn)) { return; } } 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 Orn(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: Orn(cond, rd, rn, operand); break; case SetFlags: Orns(cond, rd, rn, operand); break; case DontCare: Orn(cond, rd, rn, operand); break; } } void Orn(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { Orn(flags, al, rd, rn, operand); } void Orns(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); if (rd.Is(rn) && operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) { return; } if (cond.Is(al) && operand.IsImmediate()) { uint32_t immediate = operand.GetImmediate(); if ((immediate == 0) && rd.Is(rn)) { return; } if (immediate == 0xffffffff) { mvn(rd, 0); return; } } bool can_use_it = // ORR{} {,} , ; 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 Orr(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: Orr(cond, rd, rn, operand); break; case SetFlags: Orrs(cond, rd, rn, operand); break; case DontCare: if (operand.IsPlainRegister() && rd.Is(rn) && rd.Is(operand.GetBaseRegister())) { return; } bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rn.Is(rd) && operand.IsPlainRegister() && operand.GetBaseRegister().IsLow(); if (setflags_is_smaller) { Orrs(cond, rd, rn, operand); } else { Orr(cond, rd, rn, operand); } break; } } void Orr(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { Orr(flags, al, rd, rn, operand); } void Orrs(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); pld(cond, label); } void Pld(Label* label) { Pld(al, label); } void Pld(Condition cond, const MemOperand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); pli(cond, label); } void Pli(Label* label) { Pli(al, label); } void Pop(Condition cond, RegisterList registers) { VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); pop(cond, registers); } void Pop(RegisterList registers) { Pop(al, registers); } void Pop(Condition cond, Register rt) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); pop(cond, rt); } void Pop(Register rt) { Pop(al, rt); } void Push(Condition cond, RegisterList registers) { VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); push(cond, registers); } void Push(RegisterList registers) { Push(al, registers); } void Push(Condition cond, Register rt) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // ROR{} {,} , ; 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 Ror(FlagsUpdate flags, Condition cond, Register rd, Register rm, const Operand& operand) { switch (flags) { case LeaveFlags: Ror(cond, rd, rm, operand); break; case SetFlags: Rors(cond, rd, rm, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() && operand.IsPlainRegister() && rd.Is(rm); if (setflags_is_smaller) { Rors(cond, rd, rm, operand); } else { Ror(cond, rd, rm, operand); } break; } } void Ror(FlagsUpdate flags, Register rd, Register rm, const Operand& operand) { Ror(flags, al, rd, rm, operand); } void Rors(Condition cond, Register rd, Register rm, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); rrx(cond, rd, rm); } void Rrx(Register rd, Register rm) { Rrx(al, rd, rm); } void Rrx(FlagsUpdate flags, Condition cond, Register rd, Register rm) { switch (flags) { case LeaveFlags: Rrx(cond, rd, rm); break; case SetFlags: Rrxs(cond, rd, rm); break; case DontCare: Rrx(cond, rd, rm); break; } } void Rrx(FlagsUpdate flags, Register rd, Register rm) { Rrx(flags, al, rd, rm); } void Rrxs(Condition cond, Register rd, Register rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // RSB{} {, }, #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 Rsb(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: Rsb(cond, rd, rn, operand); break; case SetFlags: Rsbs(cond, rd, rn, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rn.IsLow() && operand.IsImmediate() && (operand.GetImmediate() == 0); if (setflags_is_smaller) { Rsbs(cond, rd, rn, operand); } else { Rsb(cond, rd, rn, operand); } break; } } void Rsb(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { Rsb(flags, al, rd, rn, operand); } void Rsbs(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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 Rsc(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: Rsc(cond, rd, rn, operand); break; case SetFlags: Rscs(cond, rd, rn, operand); break; case DontCare: Rsc(cond, rd, rn, operand); break; } } void Rsc(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { Rsc(flags, al, rd, rn, operand); } void Rscs(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // SBC{} {,} , ; 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 Sbc(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: Sbc(cond, rd, rn, operand); break; case SetFlags: Sbcs(cond, rd, rn, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && rn.Is(rd) && operand.IsPlainRegister() && operand.GetBaseRegister().IsLow(); if (setflags_is_smaller) { Sbcs(cond, rd, rn, operand); } else { Sbc(cond, rd, rn, operand); } break; } } void Sbc(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { Sbc(flags, al, rd, rn, operand); } void Sbcs(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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 Smull(FlagsUpdate flags, Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { switch (flags) { case LeaveFlags: Smull(cond, rdlo, rdhi, rn, rm); break; case SetFlags: Smulls(cond, rdlo, rdhi, rn, rm); break; case DontCare: Smull(cond, rdlo, rdhi, rn, rm); break; } } void Smull(FlagsUpdate flags, Register rdlo, Register rdhi, Register rn, Register rm) { Smull(flags, al, rdlo, rdhi, rn, rm); } void Smulls( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // STR{}{} , [ {, #{+}}] ; T1 (operand.IsImmediate() && rt.IsLow() && operand.GetBaseRegister().IsLow() && operand.IsOffsetImmediateWithinRange(0, 124, 4) && (operand.GetAddrMode() == Offset)) || // STR{}{} , [SP{, #{+}}] ; T2 (operand.IsImmediate() && rt.IsLow() && operand.GetBaseRegister().IsSP() && operand.IsOffsetImmediateWithinRange(0, 1020, 4) && (operand.GetAddrMode() == Offset)) || // STR{}{} , [, {+}] ; 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // STRB{}{} , [ {, #{+}}] ; T1 (operand.IsImmediate() && rt.IsLow() && operand.GetBaseRegister().IsLow() && operand.IsOffsetImmediateWithinRange(0, 31) && (operand.GetAddrMode() == Offset)) || // STRB{}{} , [, {+}] ; 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // STRH{}{} , [ {, #{+}}] ; T1 (operand.IsImmediate() && rt.IsLow() && operand.GetBaseRegister().IsLow() && operand.IsOffsetImmediateWithinRange(0, 62, 2) && (operand.GetAddrMode() == Offset)) || // STRH{}{} , [, {+}] ; 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) { uint32_t immediate = operand.GetImmediate(); if (immediate == 0) { return; } } bool can_use_it = // SUB{} , , # ; T1 (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() && rd.IsLow()) || // SUB{} {,} , # ; T2 (operand.IsImmediate() && (operand.GetImmediate() <= 255) && rd.IsLow() && rn.Is(rd)) || // SUB{} , , (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 Sub(FlagsUpdate flags, Condition cond, Register rd, Register rn, const Operand& operand) { switch (flags) { case LeaveFlags: Sub(cond, rd, rn, operand); break; case SetFlags: Subs(cond, rd, rn, operand); break; case DontCare: bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() && operand.GetBaseRegister().IsLow()) || (operand.IsImmediate() && ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) || (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256))))); if (setflags_is_smaller) { Subs(cond, rd, rn, operand); } else { bool changed_op_is_smaller = operand.IsImmediate() && (operand.GetSignedImmediate() < 0) && ((rd.IsLow() && rn.IsLow() && (operand.GetSignedImmediate() >= -7)) || (rd.IsLow() && rn.Is(rd) && (operand.GetSignedImmediate() >= -255))); if (changed_op_is_smaller) { Adds(cond, rd, rn, -operand.GetSignedImmediate()); } else { Sub(cond, rd, rn, operand); } } break; } } void Sub(FlagsUpdate flags, Register rd, Register rn, const Operand& operand) { Sub(flags, al, rd, rn, operand); } void Subs(Condition cond, Register rd, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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 Svc(Condition cond, uint32_t imm) { VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); sxth(cond, rd, operand); } void Sxth(Register rd, const Operand& operand) { Sxth(al, rd, operand); } void Teq(Condition cond, Register rn, const Operand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); bool can_use_it = // TST{}{} , ; 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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 Umlal(FlagsUpdate flags, Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { switch (flags) { case LeaveFlags: Umlal(cond, rdlo, rdhi, rn, rm); break; case SetFlags: Umlals(cond, rdlo, rdhi, rn, rm); break; case DontCare: Umlal(cond, rdlo, rdhi, rn, rm); break; } } void Umlal(FlagsUpdate flags, Register rdlo, Register rdhi, Register rn, Register rm) { Umlal(flags, al, rdlo, rdhi, rn, rm); } void Umlals( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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 Umull(FlagsUpdate flags, Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { switch (flags) { case LeaveFlags: Umull(cond, rdlo, rdhi, rn, rm); break; case SetFlags: Umulls(cond, rdlo, rdhi, rn, rm); break; case DontCare: Umull(cond, rdlo, rdhi, rn, rm); break; } } void Umull(FlagsUpdate flags, Register rdlo, Register rdhi, Register rn, Register rm) { Umull(flags, al, rdlo, rdhi, rn, rm); } void Umulls( Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvta(dt1, dt2, rd, rm); } void Vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvta(dt1, dt2, rd, rm); } void Vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvta(dt1, dt2, rd, rm); } void Vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvta(dt1, dt2, rd, rm); } void Vcvtb( Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtm(dt1, dt2, rd, rm); } void Vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtm(dt1, dt2, rd, rm); } void Vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtm(dt1, dt2, rd, rm); } void Vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtm(dt1, dt2, rd, rm); } void Vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtn(dt1, dt2, rd, rm); } void Vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtn(dt1, dt2, rd, rm); } void Vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtn(dt1, dt2, rd, rm); } void Vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtn(dt1, dt2, rd, rm); } void Vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtp(dt1, dt2, rd, rm); } void Vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtp(dt1, dt2, rd, rm); } void Vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtp(dt1, dt2, rd, rm); } void Vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vcvtp(dt1, dt2, rd, rm); } void Vcvtr( Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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, const MemOperand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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, const MemOperand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vmaxnm(dt, rd, rn, rm); } void Vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vmaxnm(dt, rd, rn, rm); } void Vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vmaxnm(dt, rd, rn, rm); } void Vmin( Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vminnm(dt, rd, rn, rm); } void Vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vminnm(dt, rd, rn, rm); } void Vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vminnm(dt, rd, rn, rm); } void Vmla(Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rt)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(sreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(sreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrinta(dt1, dt2, rd, rm); } void Vrinta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrinta(dt1, dt2, rd, rm); } void Vrinta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrinta(dt1, dt2, rd, rm); } void Vrintm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintm(dt1, dt2, rd, rm); } void Vrintm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintm(dt1, dt2, rd, rm); } void Vrintm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintm(dt1, dt2, rd, rm); } void Vrintn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintn(dt1, dt2, rd, rm); } void Vrintn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintn(dt1, dt2, rd, rm); } void Vrintn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintn(dt1, dt2, rd, rm); } void Vrintp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintp(dt1, dt2, rd, rm); } void Vrintp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintp(dt1, dt2, rd, rm); } void Vrintp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintp(dt1, dt2, rd, rm); } void Vrintr( Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintx(dt1, dt2, rd, rm); } void Vrintx( Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vrintz(dt1, dt2, rd, rm); } void Vrintz( Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vseleq(dt, rd, rn, rm); } void Vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vseleq(dt, rd, rn, rm); } void Vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vselge(dt, rd, rn, rm); } void Vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vselge(dt, rd, rn, rm); } void Vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vselgt(dt, rd, rn, rm); } void Vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vselgt(dt, rd, rn, rm); } void Vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vselvs(dt, rd, rn, rm); } void Vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); vselvs(dt, rd, rn, rm); } void Vshl(Condition cond, DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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(!AliasesAvailableScratchRegister(rd)); VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); VIXL_ASSERT(allow_macro_instructions_); VIXL_ASSERT(OutsideITBlock()); MacroEmissionCheckScope guard(this); 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()); MacroEmissionCheckScope guard(this); ITScope it_scope(this, &cond); yield(cond); } void Yield() { Yield(al); } void Vabs(Condition cond, VRegister rd, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vabs(cond, F32, rd.S(), rm.S()); } else { Vabs(cond, F64, rd.D(), rm.D()); } } void Vabs(VRegister rd, VRegister rm) { Vabs(al, rd, rm); } void Vadd(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vadd(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vadd(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vadd(VRegister rd, VRegister rn, VRegister rm) { Vadd(al, rd, rn, rm); } void Vcmp(Condition cond, VRegister rd, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vcmp(cond, F32, rd.S(), rm.S()); } else { Vcmp(cond, F64, rd.D(), rm.D()); } } void Vcmp(VRegister rd, VRegister rm) { Vcmp(al, rd, rm); } void Vcmpe(Condition cond, VRegister rd, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vcmpe(cond, F32, rd.S(), rm.S()); } else { Vcmpe(cond, F64, rd.D(), rm.D()); } } void Vcmpe(VRegister rd, VRegister rm) { Vcmpe(al, rd, rm); } void Vdiv(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vdiv(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vdiv(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vdiv(VRegister rd, VRegister rn, VRegister rm) { Vdiv(al, rd, rn, rm); } void Vfma(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vfma(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vfma(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vfma(VRegister rd, VRegister rn, VRegister rm) { Vfma(al, rd, rn, rm); } void Vfms(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vfms(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vfms(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vfms(VRegister rd, VRegister rn, VRegister rm) { Vfms(al, rd, rn, rm); } void Vfnma(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vfnma(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vfnma(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vfnma(VRegister rd, VRegister rn, VRegister rm) { Vfnma(al, rd, rn, rm); } void Vfnms(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vfnms(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vfnms(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vfnms(VRegister rd, VRegister rn, VRegister rm) { Vfnms(al, rd, rn, rm); } void Vmaxnm(VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vmaxnm(F32, rd.S(), rn.S(), rm.S()); } else { Vmaxnm(F64, rd.D(), rn.D(), rm.D()); } } void Vminnm(VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vminnm(F32, rd.S(), rn.S(), rm.S()); } else { Vminnm(F64, rd.D(), rn.D(), rm.D()); } } void Vmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vmla(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vmla(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vmla(VRegister rd, VRegister rn, VRegister rm) { Vmla(al, rd, rn, rm); } void Vmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vmls(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vmls(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vmls(VRegister rd, VRegister rn, VRegister rm) { Vmls(al, rd, rn, rm); } void Vmov(Condition cond, VRegister rd, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vmov(cond, F32, rd.S(), rm.S()); } else { Vmov(cond, F64, rd.D(), rm.D()); } } void Vmov(VRegister rd, VRegister rm) { Vmov(al, rd, rm); } void Vmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vmul(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vmul(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vmul(VRegister rd, VRegister rn, VRegister rm) { Vmul(al, rd, rn, rm); } void Vneg(Condition cond, VRegister rd, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vneg(cond, F32, rd.S(), rm.S()); } else { Vneg(cond, F64, rd.D(), rm.D()); } } void Vneg(VRegister rd, VRegister rm) { Vneg(al, rd, rm); } void Vnmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vnmla(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vnmla(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vnmla(VRegister rd, VRegister rn, VRegister rm) { Vnmla(al, rd, rn, rm); } void Vnmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vnmls(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vnmls(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vnmls(VRegister rd, VRegister rn, VRegister rm) { Vnmls(al, rd, rn, rm); } void Vnmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vnmul(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vnmul(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vnmul(VRegister rd, VRegister rn, VRegister rm) { Vnmul(al, rd, rn, rm); } void Vseleq(VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vseleq(F32, rd.S(), rn.S(), rm.S()); } else { Vseleq(F64, rd.D(), rn.D(), rm.D()); } } void Vselge(VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vselge(F32, rd.S(), rn.S(), rm.S()); } else { Vselge(F64, rd.D(), rn.D(), rm.D()); } } void Vselgt(VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vselgt(F32, rd.S(), rn.S(), rm.S()); } else { Vselgt(F64, rd.D(), rn.D(), rm.D()); } } void Vselvs(VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vselvs(F32, rd.S(), rn.S(), rm.S()); } else { Vselvs(F64, rd.D(), rn.D(), rm.D()); } } void Vsqrt(Condition cond, VRegister rd, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vsqrt(cond, F32, rd.S(), rm.S()); } else { Vsqrt(cond, F64, rd.D(), rm.D()); } } void Vsqrt(VRegister rd, VRegister rm) { Vsqrt(al, rd, rm); } void Vsub(Condition cond, VRegister rd, VRegister rn, VRegister rm) { VIXL_ASSERT(rd.IsS() || rd.IsD()); VIXL_ASSERT(rd.GetType() == rn.GetType()); VIXL_ASSERT(rd.GetType() == rm.GetType()); if (rd.IsS()) { Vsub(cond, F32, rd.S(), rn.S(), rm.S()); } else { Vsub(cond, F64, rd.D(), rn.D(), rm.D()); } } void Vsub(VRegister rd, VRegister rn, VRegister rm) { Vsub(al, rd, rn, rm); } // End of generated code. virtual bool AllowUnpredictable() VIXL_OVERRIDE { VIXL_ABORT_WITH_MSG("Unpredictable instruction.\n"); return false; } virtual bool AllowStronglyDiscouraged() VIXL_OVERRIDE { VIXL_ABORT_WITH_MSG( "ARM strongly recommends to not use this instruction.\n"); return false; } private: RegisterList available_; VRegisterList available_vfp_; UseScratchRegisterScope* current_scratch_scope_; MacroAssemblerContext context_; Label::Offset checkpoint_; LiteralPoolManager literal_pool_manager_; VeneerPoolManager veneer_pool_manager_; bool generate_simulator_code_; bool allow_macro_instructions_; }; // 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. // // Scopes must nest perfectly. That is, they must be destructed in reverse // construction order. Otherwise, it is not clear how to handle cases where one // scope acquires a register that was included in a now-closing scope. With // perfect nesting, this cannot occur. 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) : masm_(NULL), parent_(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() : masm_(NULL), parent_(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)); } // A convenience helper to exclude any registers used by the operand. void Exclude(const Operand& operand); // Prevent any scratch registers from being used in this scope. void ExcludeAll(); private: // The MacroAssembler maintains a list of available scratch registers, and // also keeps track of the most recently-opened scope so that on destruction // we can check that scopes do not outlive their parents. MacroAssembler* masm_; UseScratchRegisterScope* parent_; // 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(); } }; } // namespace aarch32 } // namespace vixl #endif // VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_