1*f5c631daSSadaf Ebrahimi // Copyright 2017, VIXL authors 2*f5c631daSSadaf Ebrahimi // All rights reserved. 3*f5c631daSSadaf Ebrahimi // 4*f5c631daSSadaf Ebrahimi // Redistribution and use in source and binary forms, with or without 5*f5c631daSSadaf Ebrahimi // modification, are permitted provided that the following conditions are met: 6*f5c631daSSadaf Ebrahimi // 7*f5c631daSSadaf Ebrahimi // * Redistributions of source code must retain the above copyright notice, 8*f5c631daSSadaf Ebrahimi // this list of conditions and the following disclaimer. 9*f5c631daSSadaf Ebrahimi // * Redistributions in binary form must reproduce the above copyright 10*f5c631daSSadaf Ebrahimi // notice, this list of conditions and the following disclaimer in the 11*f5c631daSSadaf Ebrahimi // documentation and/or other materials provided with the distribution. 12*f5c631daSSadaf Ebrahimi // * Neither the name of ARM Limited nor the names of its contributors may 13*f5c631daSSadaf Ebrahimi // be used to endorse or promote products derived from this software 14*f5c631daSSadaf Ebrahimi // without specific prior written permission. 15*f5c631daSSadaf Ebrahimi // 16*f5c631daSSadaf Ebrahimi // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 17*f5c631daSSadaf Ebrahimi // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*f5c631daSSadaf Ebrahimi // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*f5c631daSSadaf Ebrahimi // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20*f5c631daSSadaf Ebrahimi // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21*f5c631daSSadaf Ebrahimi // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22*f5c631daSSadaf Ebrahimi // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23*f5c631daSSadaf Ebrahimi // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24*f5c631daSSadaf Ebrahimi // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25*f5c631daSSadaf Ebrahimi // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26*f5c631daSSadaf Ebrahimi // POSSIBILITY OF SUCH DAMAGE. 27*f5c631daSSadaf Ebrahimi 28*f5c631daSSadaf Ebrahimi #ifndef VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_ 29*f5c631daSSadaf Ebrahimi #define VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_ 30*f5c631daSSadaf Ebrahimi 31*f5c631daSSadaf Ebrahimi #include "code-generation-scopes-vixl.h" 32*f5c631daSSadaf Ebrahimi #include "macro-assembler-interface.h" 33*f5c631daSSadaf Ebrahimi #include "pool-manager-impl.h" 34*f5c631daSSadaf Ebrahimi #include "pool-manager.h" 35*f5c631daSSadaf Ebrahimi #include "utils-vixl.h" 36*f5c631daSSadaf Ebrahimi 37*f5c631daSSadaf Ebrahimi #include "aarch32/assembler-aarch32.h" 38*f5c631daSSadaf Ebrahimi #include "aarch32/instructions-aarch32.h" 39*f5c631daSSadaf Ebrahimi #include "aarch32/operands-aarch32.h" 40*f5c631daSSadaf Ebrahimi 41*f5c631daSSadaf Ebrahimi namespace vixl { 42*f5c631daSSadaf Ebrahimi 43*f5c631daSSadaf Ebrahimi namespace aarch32 { 44*f5c631daSSadaf Ebrahimi 45*f5c631daSSadaf Ebrahimi class UseScratchRegisterScope; 46*f5c631daSSadaf Ebrahimi 47*f5c631daSSadaf Ebrahimi enum FlagsUpdate { LeaveFlags = 0, SetFlags = 1, DontCare = 2 }; 48*f5c631daSSadaf Ebrahimi 49*f5c631daSSadaf Ebrahimi // We use a subclass to access the protected `ExactAssemblyScope` constructor 50*f5c631daSSadaf Ebrahimi // giving us control over the pools, and make the constructor private to limit 51*f5c631daSSadaf Ebrahimi // usage to code paths emitting pools. 52*f5c631daSSadaf Ebrahimi class ExactAssemblyScopeWithoutPoolsCheck : public ExactAssemblyScope { 53*f5c631daSSadaf Ebrahimi private: 54*f5c631daSSadaf Ebrahimi ExactAssemblyScopeWithoutPoolsCheck(MacroAssembler* masm, 55*f5c631daSSadaf Ebrahimi size_t size, 56*f5c631daSSadaf Ebrahimi SizePolicy size_policy = kExactSize); 57*f5c631daSSadaf Ebrahimi 58*f5c631daSSadaf Ebrahimi friend class MacroAssembler; 59*f5c631daSSadaf Ebrahimi friend class Label; 60*f5c631daSSadaf Ebrahimi }; 61*f5c631daSSadaf Ebrahimi // Macro assembler for aarch32 instruction set. 62*f5c631daSSadaf Ebrahimi class MacroAssembler : public Assembler, public MacroAssemblerInterface { 63*f5c631daSSadaf Ebrahimi public: 64*f5c631daSSadaf Ebrahimi enum FinalizeOption { 65*f5c631daSSadaf Ebrahimi kFallThrough, // There may be more code to execute after calling Finalize. 66*f5c631daSSadaf Ebrahimi kUnreachable // Anything generated after calling Finalize is unreachable. 67*f5c631daSSadaf Ebrahimi }; 68*f5c631daSSadaf Ebrahimi AsAssemblerBase()69*f5c631daSSadaf Ebrahimi virtual internal::AssemblerBase* AsAssemblerBase() VIXL_OVERRIDE { 70*f5c631daSSadaf Ebrahimi return this; 71*f5c631daSSadaf Ebrahimi } 72*f5c631daSSadaf Ebrahimi ArePoolsBlocked()73*f5c631daSSadaf Ebrahimi virtual bool ArePoolsBlocked() const VIXL_OVERRIDE { 74*f5c631daSSadaf Ebrahimi return pool_manager_.IsBlocked(); 75*f5c631daSSadaf Ebrahimi } 76*f5c631daSSadaf Ebrahimi EmitPoolHeader()77*f5c631daSSadaf Ebrahimi virtual void EmitPoolHeader() VIXL_OVERRIDE { 78*f5c631daSSadaf Ebrahimi // Check that we have the correct alignment. 79*f5c631daSSadaf Ebrahimi if (IsUsingT32()) { 80*f5c631daSSadaf Ebrahimi VIXL_ASSERT(GetBuffer()->Is16bitAligned()); 81*f5c631daSSadaf Ebrahimi } else { 82*f5c631daSSadaf Ebrahimi VIXL_ASSERT(GetBuffer()->Is32bitAligned()); 83*f5c631daSSadaf Ebrahimi } 84*f5c631daSSadaf Ebrahimi VIXL_ASSERT(pool_end_ == NULL); 85*f5c631daSSadaf Ebrahimi pool_end_ = new Label(); 86*f5c631daSSadaf Ebrahimi ExactAssemblyScopeWithoutPoolsCheck guard(this, 87*f5c631daSSadaf Ebrahimi kMaxInstructionSizeInBytes, 88*f5c631daSSadaf Ebrahimi ExactAssemblyScope::kMaximumSize); 89*f5c631daSSadaf Ebrahimi b(pool_end_); 90*f5c631daSSadaf Ebrahimi } EmitPoolFooter()91*f5c631daSSadaf Ebrahimi virtual void EmitPoolFooter() VIXL_OVERRIDE { 92*f5c631daSSadaf Ebrahimi // Align buffer to 4 bytes. 93*f5c631daSSadaf Ebrahimi GetBuffer()->Align(); 94*f5c631daSSadaf Ebrahimi if (pool_end_ != NULL) { 95*f5c631daSSadaf Ebrahimi Bind(pool_end_); 96*f5c631daSSadaf Ebrahimi delete pool_end_; 97*f5c631daSSadaf Ebrahimi pool_end_ = NULL; 98*f5c631daSSadaf Ebrahimi } 99*f5c631daSSadaf Ebrahimi } EmitPaddingBytes(int n)100*f5c631daSSadaf Ebrahimi virtual void EmitPaddingBytes(int n) VIXL_OVERRIDE { 101*f5c631daSSadaf Ebrahimi GetBuffer()->EmitZeroedBytes(n); 102*f5c631daSSadaf Ebrahimi } EmitNopBytes(int n)103*f5c631daSSadaf Ebrahimi virtual void EmitNopBytes(int n) VIXL_OVERRIDE { 104*f5c631daSSadaf Ebrahimi int nops = 0; 105*f5c631daSSadaf Ebrahimi int nop_size = IsUsingT32() ? k16BitT32InstructionSizeInBytes 106*f5c631daSSadaf Ebrahimi : kA32InstructionSizeInBytes; 107*f5c631daSSadaf Ebrahimi VIXL_ASSERT(n % nop_size == 0); 108*f5c631daSSadaf Ebrahimi nops = n / nop_size; 109*f5c631daSSadaf Ebrahimi ExactAssemblyScopeWithoutPoolsCheck guard(this, 110*f5c631daSSadaf Ebrahimi n, 111*f5c631daSSadaf Ebrahimi ExactAssemblyScope::kExactSize); 112*f5c631daSSadaf Ebrahimi for (int i = 0; i < nops; ++i) { 113*f5c631daSSadaf Ebrahimi nop(); 114*f5c631daSSadaf Ebrahimi } 115*f5c631daSSadaf Ebrahimi } 116*f5c631daSSadaf Ebrahimi 117*f5c631daSSadaf Ebrahimi 118*f5c631daSSadaf Ebrahimi private: 119*f5c631daSSadaf Ebrahimi class MacroEmissionCheckScope : public EmissionCheckScope { 120*f5c631daSSadaf Ebrahimi public: 121*f5c631daSSadaf Ebrahimi explicit MacroEmissionCheckScope(MacroAssemblerInterface* masm, 122*f5c631daSSadaf Ebrahimi PoolPolicy pool_policy = kBlockPools) EmissionCheckScope(masm,kTypicalMacroInstructionMaxSize,kMaximumSize,pool_policy)123*f5c631daSSadaf Ebrahimi : EmissionCheckScope(masm, 124*f5c631daSSadaf Ebrahimi kTypicalMacroInstructionMaxSize, 125*f5c631daSSadaf Ebrahimi kMaximumSize, 126*f5c631daSSadaf Ebrahimi pool_policy) {} 127*f5c631daSSadaf Ebrahimi 128*f5c631daSSadaf Ebrahimi private: 129*f5c631daSSadaf Ebrahimi static const size_t kTypicalMacroInstructionMaxSize = 130*f5c631daSSadaf Ebrahimi 8 * kMaxInstructionSizeInBytes; 131*f5c631daSSadaf Ebrahimi }; 132*f5c631daSSadaf Ebrahimi 133*f5c631daSSadaf Ebrahimi class MacroAssemblerContext { 134*f5c631daSSadaf Ebrahimi public: MacroAssemblerContext()135*f5c631daSSadaf Ebrahimi MacroAssemblerContext() : count_(0) {} ~MacroAssemblerContext()136*f5c631daSSadaf Ebrahimi ~MacroAssemblerContext() {} GetRecursiveCount()137*f5c631daSSadaf Ebrahimi unsigned GetRecursiveCount() const { return count_; } Up(const char * loc)138*f5c631daSSadaf Ebrahimi void Up(const char* loc) { 139*f5c631daSSadaf Ebrahimi location_stack_[count_] = loc; 140*f5c631daSSadaf Ebrahimi count_++; 141*f5c631daSSadaf Ebrahimi if (count_ >= kMaxRecursion) { 142*f5c631daSSadaf Ebrahimi printf( 143*f5c631daSSadaf Ebrahimi "Recursion limit reached; unable to resolve macro assembler " 144*f5c631daSSadaf Ebrahimi "call.\n"); 145*f5c631daSSadaf Ebrahimi printf("Macro assembler context stack:\n"); 146*f5c631daSSadaf Ebrahimi for (unsigned i = 0; i < kMaxRecursion; i++) { 147*f5c631daSSadaf Ebrahimi printf("%10s %s\n", (i == 0) ? "oldest -> " : "", location_stack_[i]); 148*f5c631daSSadaf Ebrahimi } 149*f5c631daSSadaf Ebrahimi VIXL_ABORT(); 150*f5c631daSSadaf Ebrahimi } 151*f5c631daSSadaf Ebrahimi } Down()152*f5c631daSSadaf Ebrahimi void Down() { 153*f5c631daSSadaf Ebrahimi VIXL_ASSERT((count_ > 0) && (count_ < kMaxRecursion)); 154*f5c631daSSadaf Ebrahimi count_--; 155*f5c631daSSadaf Ebrahimi } 156*f5c631daSSadaf Ebrahimi 157*f5c631daSSadaf Ebrahimi private: 158*f5c631daSSadaf Ebrahimi unsigned count_; 159*f5c631daSSadaf Ebrahimi static const uint32_t kMaxRecursion = 6; 160*f5c631daSSadaf Ebrahimi const char* location_stack_[kMaxRecursion]; 161*f5c631daSSadaf Ebrahimi }; 162*f5c631daSSadaf Ebrahimi 163*f5c631daSSadaf Ebrahimi // This scope is used at each Delegate entry to avoid infinite recursion of 164*f5c631daSSadaf Ebrahimi // Delegate calls. The limit is defined by 165*f5c631daSSadaf Ebrahimi // MacroAssemblerContext::kMaxRecursion. 166*f5c631daSSadaf Ebrahimi class ContextScope { 167*f5c631daSSadaf Ebrahimi public: ContextScope(MacroAssembler * const masm,const char * loc)168*f5c631daSSadaf Ebrahimi explicit ContextScope(MacroAssembler* const masm, const char* loc) 169*f5c631daSSadaf Ebrahimi : masm_(masm) { 170*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm_->AllowMacroInstructions()); 171*f5c631daSSadaf Ebrahimi masm_->GetContext()->Up(loc); 172*f5c631daSSadaf Ebrahimi } ~ContextScope()173*f5c631daSSadaf Ebrahimi ~ContextScope() { masm_->GetContext()->Down(); } 174*f5c631daSSadaf Ebrahimi 175*f5c631daSSadaf Ebrahimi private: 176*f5c631daSSadaf Ebrahimi MacroAssembler* const masm_; 177*f5c631daSSadaf Ebrahimi }; 178*f5c631daSSadaf Ebrahimi GetContext()179*f5c631daSSadaf Ebrahimi MacroAssemblerContext* GetContext() { return &context_; } 180*f5c631daSSadaf Ebrahimi 181*f5c631daSSadaf Ebrahimi class ITScope { 182*f5c631daSSadaf Ebrahimi public: 183*f5c631daSSadaf Ebrahimi ITScope(MacroAssembler* masm, 184*f5c631daSSadaf Ebrahimi Condition* cond, 185*f5c631daSSadaf Ebrahimi const MacroEmissionCheckScope& scope, 186*f5c631daSSadaf Ebrahimi bool can_use_it = false) masm_(masm)187*f5c631daSSadaf Ebrahimi : masm_(masm), cond_(*cond), can_use_it_(can_use_it) { 188*f5c631daSSadaf Ebrahimi // The 'scope' argument is used to remind us to only use this scope inside 189*f5c631daSSadaf Ebrahimi // a MacroEmissionCheckScope. This way, we do not need to check whether 190*f5c631daSSadaf Ebrahimi // we need to emit the pools or grow the code buffer when emitting the 191*f5c631daSSadaf Ebrahimi // IT or B instructions. 192*f5c631daSSadaf Ebrahimi USE(scope); 193*f5c631daSSadaf Ebrahimi if (!cond_.Is(al) && masm->IsUsingT32()) { 194*f5c631daSSadaf Ebrahimi if (can_use_it_) { 195*f5c631daSSadaf Ebrahimi // IT is not deprecated (that implies a 16 bit T32 instruction). 196*f5c631daSSadaf Ebrahimi // We generate an IT instruction and a conditional instruction. 197*f5c631daSSadaf Ebrahimi masm->it(cond_); 198*f5c631daSSadaf Ebrahimi } else { 199*f5c631daSSadaf Ebrahimi // The usage of IT is deprecated for the instruction. 200*f5c631daSSadaf Ebrahimi // We generate a conditional branch and an unconditional instruction. 201*f5c631daSSadaf Ebrahimi // Generate the branch. 202*f5c631daSSadaf Ebrahimi masm_->b(cond_.Negate(), Narrow, &label_); 203*f5c631daSSadaf Ebrahimi // Tell the macro-assembler to generate unconditional instructions. 204*f5c631daSSadaf Ebrahimi *cond = al; 205*f5c631daSSadaf Ebrahimi } 206*f5c631daSSadaf Ebrahimi } 207*f5c631daSSadaf Ebrahimi #ifdef VIXL_DEBUG 208*f5c631daSSadaf Ebrahimi initial_cursor_offset_ = masm->GetCursorOffset(); 209*f5c631daSSadaf Ebrahimi #else 210*f5c631daSSadaf Ebrahimi USE(initial_cursor_offset_); 211*f5c631daSSadaf Ebrahimi #endif 212*f5c631daSSadaf Ebrahimi } ~ITScope()213*f5c631daSSadaf Ebrahimi ~ITScope() { 214*f5c631daSSadaf Ebrahimi if (label_.IsReferenced()) { 215*f5c631daSSadaf Ebrahimi // We only use the label for conditional T32 instructions for which we 216*f5c631daSSadaf Ebrahimi // cannot use IT. 217*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!cond_.Is(al)); 218*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm_->IsUsingT32()); 219*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!can_use_it_); 220*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <= 221*f5c631daSSadaf Ebrahimi kMaxT32MacroInstructionSizeInBytes); 222*f5c631daSSadaf Ebrahimi masm_->BindHelper(&label_); 223*f5c631daSSadaf Ebrahimi } else if (masm_->IsUsingT32() && !cond_.Is(al)) { 224*f5c631daSSadaf Ebrahimi // If we've generated a conditional T32 instruction but haven't used the 225*f5c631daSSadaf Ebrahimi // label, we must have used IT. Check that we did not generate a 226*f5c631daSSadaf Ebrahimi // deprecated sequence. 227*f5c631daSSadaf Ebrahimi VIXL_ASSERT(can_use_it_); 228*f5c631daSSadaf Ebrahimi VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <= 229*f5c631daSSadaf Ebrahimi k16BitT32InstructionSizeInBytes); 230*f5c631daSSadaf Ebrahimi } 231*f5c631daSSadaf Ebrahimi } 232*f5c631daSSadaf Ebrahimi 233*f5c631daSSadaf Ebrahimi private: 234*f5c631daSSadaf Ebrahimi MacroAssembler* masm_; 235*f5c631daSSadaf Ebrahimi Condition cond_; 236*f5c631daSSadaf Ebrahimi Label label_; 237*f5c631daSSadaf Ebrahimi bool can_use_it_; 238*f5c631daSSadaf Ebrahimi uint32_t initial_cursor_offset_; 239*f5c631daSSadaf Ebrahimi }; 240*f5c631daSSadaf Ebrahimi 241*f5c631daSSadaf Ebrahimi protected: BlockPools()242*f5c631daSSadaf Ebrahimi virtual void BlockPools() VIXL_OVERRIDE { pool_manager_.Block(); } ReleasePools()243*f5c631daSSadaf Ebrahimi virtual void ReleasePools() VIXL_OVERRIDE { 244*f5c631daSSadaf Ebrahimi pool_manager_.Release(GetCursorOffset()); 245*f5c631daSSadaf Ebrahimi } 246*f5c631daSSadaf Ebrahimi virtual void EnsureEmitPoolsFor(size_t size) VIXL_OVERRIDE; 247*f5c631daSSadaf Ebrahimi 248*f5c631daSSadaf Ebrahimi // Tell whether any of the macro instruction can be used. When false the 249*f5c631daSSadaf Ebrahimi // MacroAssembler will assert if a method which can emit a variable number 250*f5c631daSSadaf Ebrahimi // of instructions is called. SetAllowMacroInstructions(bool value)251*f5c631daSSadaf Ebrahimi virtual void SetAllowMacroInstructions(bool value) VIXL_OVERRIDE { 252*f5c631daSSadaf Ebrahimi allow_macro_instructions_ = value; 253*f5c631daSSadaf Ebrahimi } 254*f5c631daSSadaf Ebrahimi 255*f5c631daSSadaf Ebrahimi void HandleOutOfBoundsImmediate(Condition cond, Register tmp, uint32_t imm); 256*f5c631daSSadaf Ebrahimi 257*f5c631daSSadaf Ebrahimi public: 258*f5c631daSSadaf Ebrahimi // TODO: If we change the MacroAssembler to disallow setting a different ISA, 259*f5c631daSSadaf Ebrahimi // we can change the alignment of the pool in the pool manager constructor to 260*f5c631daSSadaf Ebrahimi // be 2 bytes for T32. 261*f5c631daSSadaf Ebrahimi explicit MacroAssembler(InstructionSet isa = kDefaultISA) Assembler(isa)262*f5c631daSSadaf Ebrahimi : Assembler(isa), 263*f5c631daSSadaf Ebrahimi available_(r12), 264*f5c631daSSadaf Ebrahimi current_scratch_scope_(NULL), 265*f5c631daSSadaf Ebrahimi pool_manager_(4 /*header_size*/, 266*f5c631daSSadaf Ebrahimi 4 /*alignment*/, 267*f5c631daSSadaf Ebrahimi 4 /*buffer_alignment*/), 268*f5c631daSSadaf Ebrahimi generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE), 269*f5c631daSSadaf Ebrahimi pool_end_(NULL) { 270*f5c631daSSadaf Ebrahimi #ifdef VIXL_DEBUG 271*f5c631daSSadaf Ebrahimi SetAllowMacroInstructions( // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall) 272*f5c631daSSadaf Ebrahimi true); 273*f5c631daSSadaf Ebrahimi #else 274*f5c631daSSadaf Ebrahimi USE(allow_macro_instructions_); 275*f5c631daSSadaf Ebrahimi #endif 276*f5c631daSSadaf Ebrahimi } 277*f5c631daSSadaf Ebrahimi explicit MacroAssembler(size_t size, InstructionSet isa = kDefaultISA) Assembler(size,isa)278*f5c631daSSadaf Ebrahimi : Assembler(size, isa), 279*f5c631daSSadaf Ebrahimi available_(r12), 280*f5c631daSSadaf Ebrahimi current_scratch_scope_(NULL), 281*f5c631daSSadaf Ebrahimi pool_manager_(4 /*header_size*/, 282*f5c631daSSadaf Ebrahimi 4 /*alignment*/, 283*f5c631daSSadaf Ebrahimi 4 /*buffer_alignment*/), 284*f5c631daSSadaf Ebrahimi generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE), 285*f5c631daSSadaf Ebrahimi pool_end_(NULL) { 286*f5c631daSSadaf Ebrahimi #ifdef VIXL_DEBUG 287*f5c631daSSadaf Ebrahimi SetAllowMacroInstructions( // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall) 288*f5c631daSSadaf Ebrahimi true); 289*f5c631daSSadaf Ebrahimi #endif 290*f5c631daSSadaf Ebrahimi } 291*f5c631daSSadaf Ebrahimi MacroAssembler(byte* buffer, size_t size, InstructionSet isa = kDefaultISA) Assembler(buffer,size,isa)292*f5c631daSSadaf Ebrahimi : Assembler(buffer, size, isa), 293*f5c631daSSadaf Ebrahimi available_(r12), 294*f5c631daSSadaf Ebrahimi current_scratch_scope_(NULL), 295*f5c631daSSadaf Ebrahimi pool_manager_(4 /*header_size*/, 296*f5c631daSSadaf Ebrahimi 4 /*alignment*/, 297*f5c631daSSadaf Ebrahimi 4 /*buffer_alignment*/), 298*f5c631daSSadaf Ebrahimi generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE), 299*f5c631daSSadaf Ebrahimi pool_end_(NULL) { 300*f5c631daSSadaf Ebrahimi #ifdef VIXL_DEBUG 301*f5c631daSSadaf Ebrahimi SetAllowMacroInstructions( // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall) 302*f5c631daSSadaf Ebrahimi true); 303*f5c631daSSadaf Ebrahimi #endif 304*f5c631daSSadaf Ebrahimi } 305*f5c631daSSadaf Ebrahimi GenerateSimulatorCode()306*f5c631daSSadaf Ebrahimi bool GenerateSimulatorCode() const { return generate_simulator_code_; } 307*f5c631daSSadaf Ebrahimi AllowMacroInstructions()308*f5c631daSSadaf Ebrahimi virtual bool AllowMacroInstructions() const VIXL_OVERRIDE { 309*f5c631daSSadaf Ebrahimi return allow_macro_instructions_; 310*f5c631daSSadaf Ebrahimi } 311*f5c631daSSadaf Ebrahimi 312*f5c631daSSadaf Ebrahimi void FinalizeCode(FinalizeOption option = kUnreachable) { 313*f5c631daSSadaf Ebrahimi EmitLiteralPool(option == kUnreachable 314*f5c631daSSadaf Ebrahimi ? PoolManager<int32_t>::kNoBranchRequired 315*f5c631daSSadaf Ebrahimi : PoolManager<int32_t>::kBranchRequired); 316*f5c631daSSadaf Ebrahimi Assembler::FinalizeCode(); 317*f5c631daSSadaf Ebrahimi } 318*f5c631daSSadaf Ebrahimi GetScratchRegisterList()319*f5c631daSSadaf Ebrahimi RegisterList* GetScratchRegisterList() { return &available_; } GetScratchVRegisterList()320*f5c631daSSadaf Ebrahimi VRegisterList* GetScratchVRegisterList() { return &available_vfp_; } 321*f5c631daSSadaf Ebrahimi 322*f5c631daSSadaf Ebrahimi // Get or set the current (most-deeply-nested) UseScratchRegisterScope. SetCurrentScratchRegisterScope(UseScratchRegisterScope * scope)323*f5c631daSSadaf Ebrahimi void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) { 324*f5c631daSSadaf Ebrahimi current_scratch_scope_ = scope; 325*f5c631daSSadaf Ebrahimi } GetCurrentScratchRegisterScope()326*f5c631daSSadaf Ebrahimi UseScratchRegisterScope* GetCurrentScratchRegisterScope() { 327*f5c631daSSadaf Ebrahimi return current_scratch_scope_; 328*f5c631daSSadaf Ebrahimi } 329*f5c631daSSadaf Ebrahimi 330*f5c631daSSadaf Ebrahimi // Given an address calculation (Register + immediate), generate code to 331*f5c631daSSadaf Ebrahimi // partially compute the address. The returned MemOperand will perform any 332*f5c631daSSadaf Ebrahimi // remaining computation in a subsequent load or store instruction. 333*f5c631daSSadaf Ebrahimi // 334*f5c631daSSadaf Ebrahimi // The offset provided should be the offset that would be used in a load or 335*f5c631daSSadaf Ebrahimi // store instruction (if it had sufficient range). This only matters where 336*f5c631daSSadaf Ebrahimi // base.Is(pc), since load and store instructions align the pc before 337*f5c631daSSadaf Ebrahimi // dereferencing it. 338*f5c631daSSadaf Ebrahimi // 339*f5c631daSSadaf Ebrahimi // TODO: Improve the handling of negative offsets. They are not implemented 340*f5c631daSSadaf Ebrahimi // precisely for now because they only have a marginal benefit for the 341*f5c631daSSadaf Ebrahimi // existing uses (in delegates). 342*f5c631daSSadaf Ebrahimi MemOperand MemOperandComputationHelper(Condition cond, 343*f5c631daSSadaf Ebrahimi Register scratch, 344*f5c631daSSadaf Ebrahimi Register base, 345*f5c631daSSadaf Ebrahimi uint32_t offset, 346*f5c631daSSadaf Ebrahimi uint32_t extra_offset_mask = 0); 347*f5c631daSSadaf Ebrahimi 348*f5c631daSSadaf Ebrahimi MemOperand MemOperandComputationHelper(Register scratch, 349*f5c631daSSadaf Ebrahimi Register base, 350*f5c631daSSadaf Ebrahimi uint32_t offset, 351*f5c631daSSadaf Ebrahimi uint32_t extra_offset_mask = 0) { 352*f5c631daSSadaf Ebrahimi return MemOperandComputationHelper(al, 353*f5c631daSSadaf Ebrahimi scratch, 354*f5c631daSSadaf Ebrahimi base, 355*f5c631daSSadaf Ebrahimi offset, 356*f5c631daSSadaf Ebrahimi extra_offset_mask); 357*f5c631daSSadaf Ebrahimi } 358*f5c631daSSadaf Ebrahimi MemOperand MemOperandComputationHelper(Condition cond, 359*f5c631daSSadaf Ebrahimi Register scratch, 360*f5c631daSSadaf Ebrahimi Location* location, 361*f5c631daSSadaf Ebrahimi uint32_t extra_offset_mask = 0) { 362*f5c631daSSadaf Ebrahimi // Check for buffer space _before_ calculating the offset, in case we 363*f5c631daSSadaf Ebrahimi // generate a pool that affects the offset calculation. 364*f5c631daSSadaf Ebrahimi CodeBufferCheckScope scope(this, 4 * kMaxInstructionSizeInBytes); 365*f5c631daSSadaf Ebrahimi Label::Offset offset = 366*f5c631daSSadaf Ebrahimi location->GetLocation() - 367*f5c631daSSadaf Ebrahimi AlignDown(GetCursorOffset() + GetArchitectureStatePCOffset(), 4); 368*f5c631daSSadaf Ebrahimi return MemOperandComputationHelper(cond, 369*f5c631daSSadaf Ebrahimi scratch, 370*f5c631daSSadaf Ebrahimi pc, 371*f5c631daSSadaf Ebrahimi offset, 372*f5c631daSSadaf Ebrahimi extra_offset_mask); 373*f5c631daSSadaf Ebrahimi } 374*f5c631daSSadaf Ebrahimi MemOperand MemOperandComputationHelper(Register scratch, 375*f5c631daSSadaf Ebrahimi Location* location, 376*f5c631daSSadaf Ebrahimi uint32_t extra_offset_mask = 0) { 377*f5c631daSSadaf Ebrahimi return MemOperandComputationHelper(al, 378*f5c631daSSadaf Ebrahimi scratch, 379*f5c631daSSadaf Ebrahimi location, 380*f5c631daSSadaf Ebrahimi extra_offset_mask); 381*f5c631daSSadaf Ebrahimi } 382*f5c631daSSadaf Ebrahimi 383*f5c631daSSadaf Ebrahimi // Determine the appropriate mask to pass into MemOperandComputationHelper. 384*f5c631daSSadaf Ebrahimi uint32_t GetOffsetMask(InstructionType type, AddrMode addrmode); 385*f5c631daSSadaf Ebrahimi 386*f5c631daSSadaf Ebrahimi // State and type helpers. IsModifiedImmediate(uint32_t imm)387*f5c631daSSadaf Ebrahimi bool IsModifiedImmediate(uint32_t imm) { 388*f5c631daSSadaf Ebrahimi return IsUsingT32() ? ImmediateT32::IsImmediateT32(imm) 389*f5c631daSSadaf Ebrahimi : ImmediateA32::IsImmediateA32(imm); 390*f5c631daSSadaf Ebrahimi } 391*f5c631daSSadaf Ebrahimi Bind(Label * label)392*f5c631daSSadaf Ebrahimi void Bind(Label* label) { 393*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 394*f5c631daSSadaf Ebrahimi BindHelper(label); 395*f5c631daSSadaf Ebrahimi } 396*f5c631daSSadaf Ebrahimi BindHelper(Label * label)397*f5c631daSSadaf Ebrahimi virtual void BindHelper(Label* label) VIXL_OVERRIDE { 398*f5c631daSSadaf Ebrahimi // Assert that we have the correct buffer alignment. 399*f5c631daSSadaf Ebrahimi if (IsUsingT32()) { 400*f5c631daSSadaf Ebrahimi VIXL_ASSERT(GetBuffer()->Is16bitAligned()); 401*f5c631daSSadaf Ebrahimi } else { 402*f5c631daSSadaf Ebrahimi VIXL_ASSERT(GetBuffer()->Is32bitAligned()); 403*f5c631daSSadaf Ebrahimi } 404*f5c631daSSadaf Ebrahimi // If we need to add padding, check if we have to emit the pool. 405*f5c631daSSadaf Ebrahimi const int32_t cursor = GetCursorOffset(); 406*f5c631daSSadaf Ebrahimi if (label->Needs16BitPadding(cursor)) { 407*f5c631daSSadaf Ebrahimi const int kPaddingBytes = 2; 408*f5c631daSSadaf Ebrahimi if (pool_manager_.MustEmit(cursor, kPaddingBytes)) { 409*f5c631daSSadaf Ebrahimi int32_t new_cursor = pool_manager_.Emit(this, cursor, kPaddingBytes); 410*f5c631daSSadaf Ebrahimi USE(new_cursor); 411*f5c631daSSadaf Ebrahimi VIXL_ASSERT(new_cursor == GetCursorOffset()); 412*f5c631daSSadaf Ebrahimi } 413*f5c631daSSadaf Ebrahimi } 414*f5c631daSSadaf Ebrahimi pool_manager_.Bind(this, label, GetCursorOffset()); 415*f5c631daSSadaf Ebrahimi } 416*f5c631daSSadaf Ebrahimi RegisterLiteralReference(RawLiteral * literal)417*f5c631daSSadaf Ebrahimi void RegisterLiteralReference(RawLiteral* literal) { 418*f5c631daSSadaf Ebrahimi if (literal->IsManuallyPlaced()) return; 419*f5c631daSSadaf Ebrahimi RegisterForwardReference(literal); 420*f5c631daSSadaf Ebrahimi } 421*f5c631daSSadaf Ebrahimi RegisterForwardReference(Location * location)422*f5c631daSSadaf Ebrahimi void RegisterForwardReference(Location* location) { 423*f5c631daSSadaf Ebrahimi if (location->IsBound()) return; 424*f5c631daSSadaf Ebrahimi VIXL_ASSERT(location->HasForwardReferences()); 425*f5c631daSSadaf Ebrahimi const Location::ForwardRef& reference = location->GetLastForwardReference(); 426*f5c631daSSadaf Ebrahimi pool_manager_.AddObjectReference(&reference, location); 427*f5c631daSSadaf Ebrahimi } 428*f5c631daSSadaf Ebrahimi 429*f5c631daSSadaf Ebrahimi void CheckEmitPoolForInstruction(const ReferenceInfo* info, 430*f5c631daSSadaf Ebrahimi Location* location, 431*f5c631daSSadaf Ebrahimi Condition* cond = NULL) { 432*f5c631daSSadaf Ebrahimi int size = info->size; 433*f5c631daSSadaf Ebrahimi int32_t cursor = GetCursorOffset(); 434*f5c631daSSadaf Ebrahimi // If we need to emit a branch over the instruction, take this into account. 435*f5c631daSSadaf Ebrahimi if ((cond != NULL) && NeedBranch(cond)) { 436*f5c631daSSadaf Ebrahimi size += kBranchSize; 437*f5c631daSSadaf Ebrahimi cursor += kBranchSize; 438*f5c631daSSadaf Ebrahimi } 439*f5c631daSSadaf Ebrahimi int32_t from = cursor; 440*f5c631daSSadaf Ebrahimi from += IsUsingT32() ? kT32PcDelta : kA32PcDelta; 441*f5c631daSSadaf Ebrahimi if (info->pc_needs_aligning) from = AlignDown(from, 4); 442*f5c631daSSadaf Ebrahimi int32_t min = from + info->min_offset; 443*f5c631daSSadaf Ebrahimi int32_t max = from + info->max_offset; 444*f5c631daSSadaf Ebrahimi ForwardReference<int32_t> temp_ref(cursor, 445*f5c631daSSadaf Ebrahimi info->size, 446*f5c631daSSadaf Ebrahimi min, 447*f5c631daSSadaf Ebrahimi max, 448*f5c631daSSadaf Ebrahimi info->alignment); 449*f5c631daSSadaf Ebrahimi if (pool_manager_.MustEmit(GetCursorOffset(), size, &temp_ref, location)) { 450*f5c631daSSadaf Ebrahimi int32_t new_cursor = pool_manager_.Emit(this, 451*f5c631daSSadaf Ebrahimi GetCursorOffset(), 452*f5c631daSSadaf Ebrahimi info->size, 453*f5c631daSSadaf Ebrahimi &temp_ref, 454*f5c631daSSadaf Ebrahimi location); 455*f5c631daSSadaf Ebrahimi USE(new_cursor); 456*f5c631daSSadaf Ebrahimi VIXL_ASSERT(new_cursor == GetCursorOffset()); 457*f5c631daSSadaf Ebrahimi } 458*f5c631daSSadaf Ebrahimi } 459*f5c631daSSadaf Ebrahimi Place(RawLiteral * literal)460*f5c631daSSadaf Ebrahimi void Place(RawLiteral* literal) { 461*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 462*f5c631daSSadaf Ebrahimi VIXL_ASSERT(literal->IsManuallyPlaced()); 463*f5c631daSSadaf Ebrahimi // Check if we need to emit the pools. Take the alignment of the literal 464*f5c631daSSadaf Ebrahimi // into account, as well as potential 16-bit padding needed to reach the 465*f5c631daSSadaf Ebrahimi // minimum accessible location. 466*f5c631daSSadaf Ebrahimi int alignment = literal->GetMaxAlignment(); 467*f5c631daSSadaf Ebrahimi int32_t cursor = GetCursorOffset(); 468*f5c631daSSadaf Ebrahimi int total_size = AlignUp(cursor, alignment) - cursor + literal->GetSize(); 469*f5c631daSSadaf Ebrahimi if (literal->Needs16BitPadding(cursor)) total_size += 2; 470*f5c631daSSadaf Ebrahimi if (pool_manager_.MustEmit(cursor, total_size)) { 471*f5c631daSSadaf Ebrahimi int32_t new_cursor = pool_manager_.Emit(this, cursor, total_size); 472*f5c631daSSadaf Ebrahimi USE(new_cursor); 473*f5c631daSSadaf Ebrahimi VIXL_ASSERT(new_cursor == GetCursorOffset()); 474*f5c631daSSadaf Ebrahimi } 475*f5c631daSSadaf Ebrahimi pool_manager_.Bind(this, literal, GetCursorOffset()); 476*f5c631daSSadaf Ebrahimi literal->EmitPoolObject(this); 477*f5c631daSSadaf Ebrahimi // Align the buffer, to be ready to generate instructions right after 478*f5c631daSSadaf Ebrahimi // this. 479*f5c631daSSadaf Ebrahimi GetBuffer()->Align(); 480*f5c631daSSadaf Ebrahimi } 481*f5c631daSSadaf Ebrahimi 482*f5c631daSSadaf Ebrahimi void EmitLiteralPool(PoolManager<int32_t>::EmitOption option = 483*f5c631daSSadaf Ebrahimi PoolManager<int32_t>::kBranchRequired) { 484*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!ArePoolsBlocked()); 485*f5c631daSSadaf Ebrahimi int32_t new_pc = 486*f5c631daSSadaf Ebrahimi pool_manager_.Emit(this, GetCursorOffset(), 0, NULL, NULL, option); 487*f5c631daSSadaf Ebrahimi VIXL_ASSERT(new_pc == GetCursorOffset()); 488*f5c631daSSadaf Ebrahimi USE(new_pc); 489*f5c631daSSadaf Ebrahimi } 490*f5c631daSSadaf Ebrahimi EnsureEmitFor(uint32_t size)491*f5c631daSSadaf Ebrahimi void EnsureEmitFor(uint32_t size) { 492*f5c631daSSadaf Ebrahimi EnsureEmitPoolsFor(size); 493*f5c631daSSadaf Ebrahimi VIXL_ASSERT(GetBuffer()->HasSpaceFor(size) || GetBuffer()->IsManaged()); 494*f5c631daSSadaf Ebrahimi GetBuffer()->EnsureSpaceFor(size); 495*f5c631daSSadaf Ebrahimi } 496*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(Register reg)497*f5c631daSSadaf Ebrahimi bool AliasesAvailableScratchRegister(Register reg) { 498*f5c631daSSadaf Ebrahimi return GetScratchRegisterList()->Includes(reg); 499*f5c631daSSadaf Ebrahimi } 500*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(RegisterOrAPSR_nzcv reg)501*f5c631daSSadaf Ebrahimi bool AliasesAvailableScratchRegister(RegisterOrAPSR_nzcv reg) { 502*f5c631daSSadaf Ebrahimi if (reg.IsAPSR_nzcv()) return false; 503*f5c631daSSadaf Ebrahimi return GetScratchRegisterList()->Includes(reg.AsRegister()); 504*f5c631daSSadaf Ebrahimi } 505*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(VRegister reg)506*f5c631daSSadaf Ebrahimi bool AliasesAvailableScratchRegister(VRegister reg) { 507*f5c631daSSadaf Ebrahimi return GetScratchVRegisterList()->IncludesAliasOf(reg); 508*f5c631daSSadaf Ebrahimi } 509*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(const Operand & operand)510*f5c631daSSadaf Ebrahimi bool AliasesAvailableScratchRegister(const Operand& operand) { 511*f5c631daSSadaf Ebrahimi if (operand.IsImmediate()) return false; 512*f5c631daSSadaf Ebrahimi return AliasesAvailableScratchRegister(operand.GetBaseRegister()) || 513*f5c631daSSadaf Ebrahimi (operand.IsRegisterShiftedRegister() && 514*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(operand.GetShiftRegister())); 515*f5c631daSSadaf Ebrahimi } 516*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(const NeonOperand & operand)517*f5c631daSSadaf Ebrahimi bool AliasesAvailableScratchRegister(const NeonOperand& operand) { 518*f5c631daSSadaf Ebrahimi if (operand.IsImmediate()) return false; 519*f5c631daSSadaf Ebrahimi return AliasesAvailableScratchRegister(operand.GetRegister()); 520*f5c631daSSadaf Ebrahimi } 521*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(SRegisterList list)522*f5c631daSSadaf Ebrahimi bool AliasesAvailableScratchRegister(SRegisterList list) { 523*f5c631daSSadaf Ebrahimi for (int n = 0; n < list.GetLength(); n++) { 524*f5c631daSSadaf Ebrahimi if (AliasesAvailableScratchRegister(list.GetSRegister(n))) return true; 525*f5c631daSSadaf Ebrahimi } 526*f5c631daSSadaf Ebrahimi return false; 527*f5c631daSSadaf Ebrahimi } 528*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(DRegisterList list)529*f5c631daSSadaf Ebrahimi bool AliasesAvailableScratchRegister(DRegisterList list) { 530*f5c631daSSadaf Ebrahimi for (int n = 0; n < list.GetLength(); n++) { 531*f5c631daSSadaf Ebrahimi if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true; 532*f5c631daSSadaf Ebrahimi } 533*f5c631daSSadaf Ebrahimi return false; 534*f5c631daSSadaf Ebrahimi } 535*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(NeonRegisterList list)536*f5c631daSSadaf Ebrahimi bool AliasesAvailableScratchRegister(NeonRegisterList list) { 537*f5c631daSSadaf Ebrahimi for (int n = 0; n < list.GetLength(); n++) { 538*f5c631daSSadaf Ebrahimi if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true; 539*f5c631daSSadaf Ebrahimi } 540*f5c631daSSadaf Ebrahimi return false; 541*f5c631daSSadaf Ebrahimi } 542*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(RegisterList list)543*f5c631daSSadaf Ebrahimi bool AliasesAvailableScratchRegister(RegisterList list) { 544*f5c631daSSadaf Ebrahimi return GetScratchRegisterList()->Overlaps(list); 545*f5c631daSSadaf Ebrahimi } 546*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(const MemOperand & operand)547*f5c631daSSadaf Ebrahimi bool AliasesAvailableScratchRegister(const MemOperand& operand) { 548*f5c631daSSadaf Ebrahimi return AliasesAvailableScratchRegister(operand.GetBaseRegister()) || 549*f5c631daSSadaf Ebrahimi (operand.IsShiftedRegister() && 550*f5c631daSSadaf Ebrahimi AliasesAvailableScratchRegister(operand.GetOffsetRegister())); 551*f5c631daSSadaf Ebrahimi } 552*f5c631daSSadaf Ebrahimi 553*f5c631daSSadaf Ebrahimi // Adr with a literal already constructed. Add the literal to the pool if it 554*f5c631daSSadaf Ebrahimi // is not already done. Adr(Condition cond,Register rd,RawLiteral * literal)555*f5c631daSSadaf Ebrahimi void Adr(Condition cond, Register rd, RawLiteral* literal) { 556*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 557*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 558*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 559*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 560*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 561*f5c631daSSadaf Ebrahimi if (!literal->IsBound()) { 562*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 563*f5c631daSSadaf Ebrahimi bool can_encode = adr_info(cond, Best, rd, literal, &info); 564*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 565*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, literal, &cond); 566*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 567*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 568*f5c631daSSadaf Ebrahimi } 569*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 570*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 571*f5c631daSSadaf Ebrahimi adr(cond, Best, rd, literal); 572*f5c631daSSadaf Ebrahimi RegisterLiteralReference(literal); 573*f5c631daSSadaf Ebrahimi } Adr(Register rd,RawLiteral * literal)574*f5c631daSSadaf Ebrahimi void Adr(Register rd, RawLiteral* literal) { Adr(al, rd, literal); } 575*f5c631daSSadaf Ebrahimi 576*f5c631daSSadaf Ebrahimi // Loads with literals already constructed. Add the literal to the pool 577*f5c631daSSadaf Ebrahimi // if it is not already done. Ldr(Condition cond,Register rt,RawLiteral * literal)578*f5c631daSSadaf Ebrahimi void Ldr(Condition cond, Register rt, RawLiteral* literal) { 579*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 580*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 581*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 582*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 583*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 584*f5c631daSSadaf Ebrahimi if (!literal->IsBound()) { 585*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 586*f5c631daSSadaf Ebrahimi bool can_encode = ldr_info(cond, Best, rt, literal, &info); 587*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 588*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, literal, &cond); 589*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 590*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 591*f5c631daSSadaf Ebrahimi } 592*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 593*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 594*f5c631daSSadaf Ebrahimi ldr(cond, rt, literal); 595*f5c631daSSadaf Ebrahimi RegisterLiteralReference(literal); 596*f5c631daSSadaf Ebrahimi } Ldr(Register rt,RawLiteral * literal)597*f5c631daSSadaf Ebrahimi void Ldr(Register rt, RawLiteral* literal) { Ldr(al, rt, literal); } 598*f5c631daSSadaf Ebrahimi Ldrb(Condition cond,Register rt,RawLiteral * literal)599*f5c631daSSadaf Ebrahimi void Ldrb(Condition cond, Register rt, RawLiteral* literal) { 600*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 601*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 602*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 603*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 604*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 605*f5c631daSSadaf Ebrahimi if (!literal->IsBound()) { 606*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 607*f5c631daSSadaf Ebrahimi bool can_encode = ldrb_info(cond, rt, literal, &info); 608*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 609*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, literal, &cond); 610*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 611*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 612*f5c631daSSadaf Ebrahimi } 613*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 614*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 615*f5c631daSSadaf Ebrahimi ldrb(cond, rt, literal); 616*f5c631daSSadaf Ebrahimi RegisterLiteralReference(literal); 617*f5c631daSSadaf Ebrahimi } Ldrb(Register rt,RawLiteral * literal)618*f5c631daSSadaf Ebrahimi void Ldrb(Register rt, RawLiteral* literal) { Ldrb(al, rt, literal); } 619*f5c631daSSadaf Ebrahimi Ldrd(Condition cond,Register rt,Register rt2,RawLiteral * literal)620*f5c631daSSadaf Ebrahimi void Ldrd(Condition cond, Register rt, Register rt2, RawLiteral* literal) { 621*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 622*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 623*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 624*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 625*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 626*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 627*f5c631daSSadaf Ebrahimi if (!literal->IsBound()) { 628*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 629*f5c631daSSadaf Ebrahimi bool can_encode = ldrd_info(cond, rt, rt2, literal, &info); 630*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 631*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, literal, &cond); 632*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 633*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 634*f5c631daSSadaf Ebrahimi } 635*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 636*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 637*f5c631daSSadaf Ebrahimi ldrd(cond, rt, rt2, literal); 638*f5c631daSSadaf Ebrahimi RegisterLiteralReference(literal); 639*f5c631daSSadaf Ebrahimi } Ldrd(Register rt,Register rt2,RawLiteral * literal)640*f5c631daSSadaf Ebrahimi void Ldrd(Register rt, Register rt2, RawLiteral* literal) { 641*f5c631daSSadaf Ebrahimi Ldrd(al, rt, rt2, literal); 642*f5c631daSSadaf Ebrahimi } 643*f5c631daSSadaf Ebrahimi Ldrh(Condition cond,Register rt,RawLiteral * literal)644*f5c631daSSadaf Ebrahimi void Ldrh(Condition cond, Register rt, RawLiteral* literal) { 645*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 646*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 647*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 648*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 649*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 650*f5c631daSSadaf Ebrahimi if (!literal->IsBound()) { 651*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 652*f5c631daSSadaf Ebrahimi bool can_encode = ldrh_info(cond, rt, literal, &info); 653*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 654*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, literal, &cond); 655*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 656*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 657*f5c631daSSadaf Ebrahimi } 658*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 659*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 660*f5c631daSSadaf Ebrahimi ldrh(cond, rt, literal); 661*f5c631daSSadaf Ebrahimi RegisterLiteralReference(literal); 662*f5c631daSSadaf Ebrahimi } Ldrh(Register rt,RawLiteral * literal)663*f5c631daSSadaf Ebrahimi void Ldrh(Register rt, RawLiteral* literal) { Ldrh(al, rt, literal); } 664*f5c631daSSadaf Ebrahimi Ldrsb(Condition cond,Register rt,RawLiteral * literal)665*f5c631daSSadaf Ebrahimi void Ldrsb(Condition cond, Register rt, RawLiteral* literal) { 666*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 667*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 668*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 669*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 670*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 671*f5c631daSSadaf Ebrahimi if (!literal->IsBound()) { 672*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 673*f5c631daSSadaf Ebrahimi bool can_encode = ldrsb_info(cond, rt, literal, &info); 674*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 675*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, literal, &cond); 676*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 677*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 678*f5c631daSSadaf Ebrahimi } 679*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 680*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 681*f5c631daSSadaf Ebrahimi ldrsb(cond, rt, literal); 682*f5c631daSSadaf Ebrahimi RegisterLiteralReference(literal); 683*f5c631daSSadaf Ebrahimi } Ldrsb(Register rt,RawLiteral * literal)684*f5c631daSSadaf Ebrahimi void Ldrsb(Register rt, RawLiteral* literal) { Ldrsb(al, rt, literal); } 685*f5c631daSSadaf Ebrahimi Ldrsh(Condition cond,Register rt,RawLiteral * literal)686*f5c631daSSadaf Ebrahimi void Ldrsh(Condition cond, Register rt, RawLiteral* literal) { 687*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 688*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 689*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 690*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 691*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 692*f5c631daSSadaf Ebrahimi if (!literal->IsBound()) { 693*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 694*f5c631daSSadaf Ebrahimi bool can_encode = ldrsh_info(cond, rt, literal, &info); 695*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 696*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, literal, &cond); 697*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 698*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 699*f5c631daSSadaf Ebrahimi } 700*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 701*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 702*f5c631daSSadaf Ebrahimi ldrsh(cond, rt, literal); 703*f5c631daSSadaf Ebrahimi RegisterLiteralReference(literal); 704*f5c631daSSadaf Ebrahimi } Ldrsh(Register rt,RawLiteral * literal)705*f5c631daSSadaf Ebrahimi void Ldrsh(Register rt, RawLiteral* literal) { Ldrsh(al, rt, literal); } 706*f5c631daSSadaf Ebrahimi Vldr(Condition cond,DataType dt,DRegister rd,RawLiteral * literal)707*f5c631daSSadaf Ebrahimi void Vldr(Condition cond, DataType dt, DRegister rd, RawLiteral* literal) { 708*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 709*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 710*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 711*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 712*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 713*f5c631daSSadaf Ebrahimi if (!literal->IsBound()) { 714*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 715*f5c631daSSadaf Ebrahimi bool can_encode = vldr_info(cond, dt, rd, literal, &info); 716*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 717*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, literal, &cond); 718*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 719*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 720*f5c631daSSadaf Ebrahimi } 721*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 722*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 723*f5c631daSSadaf Ebrahimi vldr(cond, dt, rd, literal); 724*f5c631daSSadaf Ebrahimi RegisterLiteralReference(literal); 725*f5c631daSSadaf Ebrahimi } Vldr(DataType dt,DRegister rd,RawLiteral * literal)726*f5c631daSSadaf Ebrahimi void Vldr(DataType dt, DRegister rd, RawLiteral* literal) { 727*f5c631daSSadaf Ebrahimi Vldr(al, dt, rd, literal); 728*f5c631daSSadaf Ebrahimi } Vldr(Condition cond,DRegister rd,RawLiteral * literal)729*f5c631daSSadaf Ebrahimi void Vldr(Condition cond, DRegister rd, RawLiteral* literal) { 730*f5c631daSSadaf Ebrahimi Vldr(cond, Untyped64, rd, literal); 731*f5c631daSSadaf Ebrahimi } Vldr(DRegister rd,RawLiteral * literal)732*f5c631daSSadaf Ebrahimi void Vldr(DRegister rd, RawLiteral* literal) { 733*f5c631daSSadaf Ebrahimi Vldr(al, Untyped64, rd, literal); 734*f5c631daSSadaf Ebrahimi } 735*f5c631daSSadaf Ebrahimi Vldr(Condition cond,DataType dt,SRegister rd,RawLiteral * literal)736*f5c631daSSadaf Ebrahimi void Vldr(Condition cond, DataType dt, SRegister rd, RawLiteral* literal) { 737*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 738*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 739*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 740*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 741*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 742*f5c631daSSadaf Ebrahimi if (!literal->IsBound()) { 743*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 744*f5c631daSSadaf Ebrahimi bool can_encode = vldr_info(cond, dt, rd, literal, &info); 745*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 746*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, literal, &cond); 747*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 748*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 749*f5c631daSSadaf Ebrahimi } 750*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 751*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 752*f5c631daSSadaf Ebrahimi vldr(cond, dt, rd, literal); 753*f5c631daSSadaf Ebrahimi RegisterLiteralReference(literal); 754*f5c631daSSadaf Ebrahimi } Vldr(DataType dt,SRegister rd,RawLiteral * literal)755*f5c631daSSadaf Ebrahimi void Vldr(DataType dt, SRegister rd, RawLiteral* literal) { 756*f5c631daSSadaf Ebrahimi Vldr(al, dt, rd, literal); 757*f5c631daSSadaf Ebrahimi } Vldr(Condition cond,SRegister rd,RawLiteral * literal)758*f5c631daSSadaf Ebrahimi void Vldr(Condition cond, SRegister rd, RawLiteral* literal) { 759*f5c631daSSadaf Ebrahimi Vldr(cond, Untyped32, rd, literal); 760*f5c631daSSadaf Ebrahimi } Vldr(SRegister rd,RawLiteral * literal)761*f5c631daSSadaf Ebrahimi void Vldr(SRegister rd, RawLiteral* literal) { 762*f5c631daSSadaf Ebrahimi Vldr(al, Untyped32, rd, literal); 763*f5c631daSSadaf Ebrahimi } 764*f5c631daSSadaf Ebrahimi 765*f5c631daSSadaf Ebrahimi // Generic Ldr(register, data) Ldr(Condition cond,Register rt,uint32_t v)766*f5c631daSSadaf Ebrahimi void Ldr(Condition cond, Register rt, uint32_t v) { 767*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 768*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 769*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 770*f5c631daSSadaf Ebrahimi RawLiteral* literal = 771*f5c631daSSadaf Ebrahimi new Literal<uint32_t>(v, RawLiteral::kDeletedOnPlacementByPool); 772*f5c631daSSadaf Ebrahimi Ldr(cond, rt, literal); 773*f5c631daSSadaf Ebrahimi } 774*f5c631daSSadaf Ebrahimi template <typename T> Ldr(Register rt,T v)775*f5c631daSSadaf Ebrahimi void Ldr(Register rt, T v) { 776*f5c631daSSadaf Ebrahimi Ldr(al, rt, v); 777*f5c631daSSadaf Ebrahimi } 778*f5c631daSSadaf Ebrahimi 779*f5c631daSSadaf Ebrahimi // Generic Ldrd(rt, rt2, data) Ldrd(Condition cond,Register rt,Register rt2,uint64_t v)780*f5c631daSSadaf Ebrahimi void Ldrd(Condition cond, Register rt, Register rt2, uint64_t v) { 781*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 782*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 783*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 784*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 785*f5c631daSSadaf Ebrahimi RawLiteral* literal = 786*f5c631daSSadaf Ebrahimi new Literal<uint64_t>(v, RawLiteral::kDeletedOnPlacementByPool); 787*f5c631daSSadaf Ebrahimi Ldrd(cond, rt, rt2, literal); 788*f5c631daSSadaf Ebrahimi } 789*f5c631daSSadaf Ebrahimi template <typename T> Ldrd(Register rt,Register rt2,T v)790*f5c631daSSadaf Ebrahimi void Ldrd(Register rt, Register rt2, T v) { 791*f5c631daSSadaf Ebrahimi Ldrd(al, rt, rt2, v); 792*f5c631daSSadaf Ebrahimi } 793*f5c631daSSadaf Ebrahimi Vldr(Condition cond,SRegister rd,float v)794*f5c631daSSadaf Ebrahimi void Vldr(Condition cond, SRegister rd, float v) { 795*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 796*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 797*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 798*f5c631daSSadaf Ebrahimi RawLiteral* literal = 799*f5c631daSSadaf Ebrahimi new Literal<float>(v, RawLiteral::kDeletedOnPlacementByPool); 800*f5c631daSSadaf Ebrahimi Vldr(cond, rd, literal); 801*f5c631daSSadaf Ebrahimi } Vldr(SRegister rd,float v)802*f5c631daSSadaf Ebrahimi void Vldr(SRegister rd, float v) { Vldr(al, rd, v); } 803*f5c631daSSadaf Ebrahimi Vldr(Condition cond,DRegister rd,double v)804*f5c631daSSadaf Ebrahimi void Vldr(Condition cond, DRegister rd, double v) { 805*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 806*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 807*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 808*f5c631daSSadaf Ebrahimi RawLiteral* literal = 809*f5c631daSSadaf Ebrahimi new Literal<double>(v, RawLiteral::kDeletedOnPlacementByPool); 810*f5c631daSSadaf Ebrahimi Vldr(cond, rd, literal); 811*f5c631daSSadaf Ebrahimi } Vldr(DRegister rd,double v)812*f5c631daSSadaf Ebrahimi void Vldr(DRegister rd, double v) { Vldr(al, rd, v); } 813*f5c631daSSadaf Ebrahimi Vmov(Condition cond,DRegister rt,double v)814*f5c631daSSadaf Ebrahimi void Vmov(Condition cond, DRegister rt, double v) { Vmov(cond, F64, rt, v); } Vmov(DRegister rt,double v)815*f5c631daSSadaf Ebrahimi void Vmov(DRegister rt, double v) { Vmov(al, F64, rt, v); } Vmov(Condition cond,SRegister rt,float v)816*f5c631daSSadaf Ebrahimi void Vmov(Condition cond, SRegister rt, float v) { Vmov(cond, F32, rt, v); } Vmov(SRegister rt,float v)817*f5c631daSSadaf Ebrahimi void Vmov(SRegister rt, float v) { Vmov(al, F32, rt, v); } 818*f5c631daSSadaf Ebrahimi 819*f5c631daSSadaf Ebrahimi // Claim memory on the stack. 820*f5c631daSSadaf Ebrahimi // Note that the Claim, Drop, and Peek helpers below ensure that offsets used 821*f5c631daSSadaf Ebrahimi // are multiples of 32 bits to help maintain 32-bit SP alignment. 822*f5c631daSSadaf Ebrahimi // We could `Align{Up,Down}(size, 4)`, but that's potentially problematic: 823*f5c631daSSadaf Ebrahimi // Claim(3) 824*f5c631daSSadaf Ebrahimi // Claim(1) 825*f5c631daSSadaf Ebrahimi // Drop(4) 826*f5c631daSSadaf Ebrahimi // would seem correct, when in fact: 827*f5c631daSSadaf Ebrahimi // Claim(3) -> sp = sp - 4 828*f5c631daSSadaf Ebrahimi // Claim(1) -> sp = sp - 4 829*f5c631daSSadaf Ebrahimi // Drop(4) -> sp = sp + 4 830*f5c631daSSadaf Ebrahimi // Claim(int32_t size)831*f5c631daSSadaf Ebrahimi void Claim(int32_t size) { 832*f5c631daSSadaf Ebrahimi if (size == 0) return; 833*f5c631daSSadaf Ebrahimi // The stack must be kept 32bit aligned. 834*f5c631daSSadaf Ebrahimi VIXL_ASSERT((size > 0) && ((size % 4) == 0)); 835*f5c631daSSadaf Ebrahimi Sub(sp, sp, size); 836*f5c631daSSadaf Ebrahimi } 837*f5c631daSSadaf Ebrahimi // Release memory on the stack Drop(int32_t size)838*f5c631daSSadaf Ebrahimi void Drop(int32_t size) { 839*f5c631daSSadaf Ebrahimi if (size == 0) return; 840*f5c631daSSadaf Ebrahimi // The stack must be kept 32bit aligned. 841*f5c631daSSadaf Ebrahimi VIXL_ASSERT((size > 0) && ((size % 4) == 0)); 842*f5c631daSSadaf Ebrahimi Add(sp, sp, size); 843*f5c631daSSadaf Ebrahimi } Peek(Register dst,int32_t offset)844*f5c631daSSadaf Ebrahimi void Peek(Register dst, int32_t offset) { 845*f5c631daSSadaf Ebrahimi VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0)); 846*f5c631daSSadaf Ebrahimi Ldr(dst, MemOperand(sp, offset)); 847*f5c631daSSadaf Ebrahimi } Poke(Register src,int32_t offset)848*f5c631daSSadaf Ebrahimi void Poke(Register src, int32_t offset) { 849*f5c631daSSadaf Ebrahimi VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0)); 850*f5c631daSSadaf Ebrahimi Str(src, MemOperand(sp, offset)); 851*f5c631daSSadaf Ebrahimi } 852*f5c631daSSadaf Ebrahimi void Printf(const char* format, 853*f5c631daSSadaf Ebrahimi CPURegister reg1 = NoReg, 854*f5c631daSSadaf Ebrahimi CPURegister reg2 = NoReg, 855*f5c631daSSadaf Ebrahimi CPURegister reg3 = NoReg, 856*f5c631daSSadaf Ebrahimi CPURegister reg4 = NoReg); 857*f5c631daSSadaf Ebrahimi // Functions used by Printf for generation. 858*f5c631daSSadaf Ebrahimi void PushRegister(CPURegister reg); 859*f5c631daSSadaf Ebrahimi void PreparePrintfArgument(CPURegister reg, 860*f5c631daSSadaf Ebrahimi int* core_count, 861*f5c631daSSadaf Ebrahimi int* vfp_count, 862*f5c631daSSadaf Ebrahimi uint32_t* printf_type); 863*f5c631daSSadaf Ebrahimi // Handlers for cases not handled by the assembler. 864*f5c631daSSadaf Ebrahimi // ADD, MOVT, MOVW, SUB, SXTB16, TEQ, UXTB16 865*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 866*f5c631daSSadaf Ebrahimi InstructionCondROp instruction, 867*f5c631daSSadaf Ebrahimi Condition cond, 868*f5c631daSSadaf Ebrahimi Register rn, 869*f5c631daSSadaf Ebrahimi const Operand& operand) VIXL_OVERRIDE; 870*f5c631daSSadaf Ebrahimi // CMN, CMP, MOV, MOVS, MVN, MVNS, SXTB, SXTH, TST, UXTB, UXTH 871*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 872*f5c631daSSadaf Ebrahimi InstructionCondSizeROp instruction, 873*f5c631daSSadaf Ebrahimi Condition cond, 874*f5c631daSSadaf Ebrahimi EncodingSize size, 875*f5c631daSSadaf Ebrahimi Register rn, 876*f5c631daSSadaf Ebrahimi const Operand& operand) VIXL_OVERRIDE; 877*f5c631daSSadaf Ebrahimi // ADDW, ORN, ORNS, PKHBT, PKHTB, RSC, RSCS, SUBW, SXTAB, SXTAB16, SXTAH, 878*f5c631daSSadaf Ebrahimi // UXTAB, UXTAB16, UXTAH 879*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 880*f5c631daSSadaf Ebrahimi InstructionCondRROp instruction, 881*f5c631daSSadaf Ebrahimi Condition cond, 882*f5c631daSSadaf Ebrahimi Register rd, 883*f5c631daSSadaf Ebrahimi Register rn, 884*f5c631daSSadaf Ebrahimi const Operand& operand) VIXL_OVERRIDE; 885*f5c631daSSadaf Ebrahimi // ADC, ADCS, ADD, ADDS, AND, ANDS, ASR, ASRS, BIC, BICS, EOR, EORS, LSL, 886*f5c631daSSadaf Ebrahimi // LSLS, LSR, LSRS, ORR, ORRS, ROR, RORS, RSB, RSBS, SBC, SBCS, SUB, SUBS 887*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 888*f5c631daSSadaf Ebrahimi InstructionCondSizeRL instruction, 889*f5c631daSSadaf Ebrahimi Condition cond, 890*f5c631daSSadaf Ebrahimi EncodingSize size, 891*f5c631daSSadaf Ebrahimi Register rd, 892*f5c631daSSadaf Ebrahimi Location* location) VIXL_OVERRIDE; 893*f5c631daSSadaf Ebrahimi bool GenerateSplitInstruction(InstructionCondSizeRROp instruction, 894*f5c631daSSadaf Ebrahimi Condition cond, 895*f5c631daSSadaf Ebrahimi Register rd, 896*f5c631daSSadaf Ebrahimi Register rn, 897*f5c631daSSadaf Ebrahimi uint32_t imm, 898*f5c631daSSadaf Ebrahimi uint32_t mask); 899*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 900*f5c631daSSadaf Ebrahimi InstructionCondSizeRROp instruction, 901*f5c631daSSadaf Ebrahimi Condition cond, 902*f5c631daSSadaf Ebrahimi EncodingSize size, 903*f5c631daSSadaf Ebrahimi Register rd, 904*f5c631daSSadaf Ebrahimi Register rn, 905*f5c631daSSadaf Ebrahimi const Operand& operand) VIXL_OVERRIDE; 906*f5c631daSSadaf Ebrahimi // CBNZ, CBZ 907*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 908*f5c631daSSadaf Ebrahimi InstructionRL instruction, 909*f5c631daSSadaf Ebrahimi Register rn, 910*f5c631daSSadaf Ebrahimi Location* location) VIXL_OVERRIDE; 911*f5c631daSSadaf Ebrahimi // VMOV 912*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 913*f5c631daSSadaf Ebrahimi InstructionCondDtSSop instruction, 914*f5c631daSSadaf Ebrahimi Condition cond, 915*f5c631daSSadaf Ebrahimi DataType dt, 916*f5c631daSSadaf Ebrahimi SRegister rd, 917*f5c631daSSadaf Ebrahimi const SOperand& operand) VIXL_OVERRIDE; 918*f5c631daSSadaf Ebrahimi // VMOV, VMVN 919*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 920*f5c631daSSadaf Ebrahimi InstructionCondDtDDop instruction, 921*f5c631daSSadaf Ebrahimi Condition cond, 922*f5c631daSSadaf Ebrahimi DataType dt, 923*f5c631daSSadaf Ebrahimi DRegister rd, 924*f5c631daSSadaf Ebrahimi const DOperand& operand) VIXL_OVERRIDE; 925*f5c631daSSadaf Ebrahimi // VMOV, VMVN 926*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 927*f5c631daSSadaf Ebrahimi InstructionCondDtQQop instruction, 928*f5c631daSSadaf Ebrahimi Condition cond, 929*f5c631daSSadaf Ebrahimi DataType dt, 930*f5c631daSSadaf Ebrahimi QRegister rd, 931*f5c631daSSadaf Ebrahimi const QOperand& operand) VIXL_OVERRIDE; 932*f5c631daSSadaf Ebrahimi // LDR, LDRB, LDRH, LDRSB, LDRSH, STR, STRB, STRH 933*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 934*f5c631daSSadaf Ebrahimi InstructionCondSizeRMop instruction, 935*f5c631daSSadaf Ebrahimi Condition cond, 936*f5c631daSSadaf Ebrahimi EncodingSize size, 937*f5c631daSSadaf Ebrahimi Register rd, 938*f5c631daSSadaf Ebrahimi const MemOperand& operand) VIXL_OVERRIDE; 939*f5c631daSSadaf Ebrahimi // LDAEXD, LDRD, LDREXD, STLEX, STLEXB, STLEXH, STRD, STREX, STREXB, STREXH 940*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 941*f5c631daSSadaf Ebrahimi InstructionCondRL instruction, 942*f5c631daSSadaf Ebrahimi Condition cond, 943*f5c631daSSadaf Ebrahimi Register rt, 944*f5c631daSSadaf Ebrahimi Location* location) VIXL_OVERRIDE; 945*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 946*f5c631daSSadaf Ebrahimi InstructionCondRRL instruction, 947*f5c631daSSadaf Ebrahimi Condition cond, 948*f5c631daSSadaf Ebrahimi Register rt, 949*f5c631daSSadaf Ebrahimi Register rt2, 950*f5c631daSSadaf Ebrahimi Location* location) VIXL_OVERRIDE; 951*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 952*f5c631daSSadaf Ebrahimi InstructionCondRRMop instruction, 953*f5c631daSSadaf Ebrahimi Condition cond, 954*f5c631daSSadaf Ebrahimi Register rt, 955*f5c631daSSadaf Ebrahimi Register rt2, 956*f5c631daSSadaf Ebrahimi const MemOperand& operand) VIXL_OVERRIDE; 957*f5c631daSSadaf Ebrahimi // VLDR, VSTR 958*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 959*f5c631daSSadaf Ebrahimi InstructionCondDtSMop instruction, 960*f5c631daSSadaf Ebrahimi Condition cond, 961*f5c631daSSadaf Ebrahimi DataType dt, 962*f5c631daSSadaf Ebrahimi SRegister rd, 963*f5c631daSSadaf Ebrahimi const MemOperand& operand) VIXL_OVERRIDE; 964*f5c631daSSadaf Ebrahimi // VLDR, VSTR 965*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 966*f5c631daSSadaf Ebrahimi InstructionCondDtDMop instruction, 967*f5c631daSSadaf Ebrahimi Condition cond, 968*f5c631daSSadaf Ebrahimi DataType dt, 969*f5c631daSSadaf Ebrahimi DRegister rd, 970*f5c631daSSadaf Ebrahimi const MemOperand& operand) VIXL_OVERRIDE; 971*f5c631daSSadaf Ebrahimi // MSR 972*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 973*f5c631daSSadaf Ebrahimi InstructionCondMsrOp instruction, 974*f5c631daSSadaf Ebrahimi Condition cond, 975*f5c631daSSadaf Ebrahimi MaskedSpecialRegister spec_reg, 976*f5c631daSSadaf Ebrahimi const Operand& operand) VIXL_OVERRIDE; 977*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 978*f5c631daSSadaf Ebrahimi InstructionCondDtDL instruction, 979*f5c631daSSadaf Ebrahimi Condition cond, 980*f5c631daSSadaf Ebrahimi DataType dt, 981*f5c631daSSadaf Ebrahimi DRegister rd, 982*f5c631daSSadaf Ebrahimi Location* location) VIXL_OVERRIDE; 983*f5c631daSSadaf Ebrahimi virtual void Delegate(InstructionType type, 984*f5c631daSSadaf Ebrahimi InstructionCondDtSL instruction, 985*f5c631daSSadaf Ebrahimi Condition cond, 986*f5c631daSSadaf Ebrahimi DataType dt, 987*f5c631daSSadaf Ebrahimi SRegister rd, 988*f5c631daSSadaf Ebrahimi Location* location) VIXL_OVERRIDE; 989*f5c631daSSadaf Ebrahimi 990*f5c631daSSadaf Ebrahimi // Start of generated code. 991*f5c631daSSadaf Ebrahimi Adc(Condition cond,Register rd,Register rn,const Operand & operand)992*f5c631daSSadaf Ebrahimi void Adc(Condition cond, Register rd, Register rn, const Operand& operand) { 993*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 994*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 995*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 996*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 997*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 998*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 999*f5c631daSSadaf Ebrahimi bool can_use_it = 1000*f5c631daSSadaf Ebrahimi // ADC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 1001*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) && 1002*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 1003*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 1004*f5c631daSSadaf Ebrahimi adc(cond, rd, rn, operand); 1005*f5c631daSSadaf Ebrahimi } Adc(Register rd,Register rn,const Operand & operand)1006*f5c631daSSadaf Ebrahimi void Adc(Register rd, Register rn, const Operand& operand) { 1007*f5c631daSSadaf Ebrahimi Adc(al, rd, rn, operand); 1008*f5c631daSSadaf Ebrahimi } Adc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1009*f5c631daSSadaf Ebrahimi void Adc(FlagsUpdate flags, 1010*f5c631daSSadaf Ebrahimi Condition cond, 1011*f5c631daSSadaf Ebrahimi Register rd, 1012*f5c631daSSadaf Ebrahimi Register rn, 1013*f5c631daSSadaf Ebrahimi const Operand& operand) { 1014*f5c631daSSadaf Ebrahimi switch (flags) { 1015*f5c631daSSadaf Ebrahimi case LeaveFlags: 1016*f5c631daSSadaf Ebrahimi Adc(cond, rd, rn, operand); 1017*f5c631daSSadaf Ebrahimi break; 1018*f5c631daSSadaf Ebrahimi case SetFlags: 1019*f5c631daSSadaf Ebrahimi Adcs(cond, rd, rn, operand); 1020*f5c631daSSadaf Ebrahimi break; 1021*f5c631daSSadaf Ebrahimi case DontCare: 1022*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 1023*f5c631daSSadaf Ebrahimi rn.Is(rd) && operand.IsPlainRegister() && 1024*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 1025*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 1026*f5c631daSSadaf Ebrahimi Adcs(cond, rd, rn, operand); 1027*f5c631daSSadaf Ebrahimi } else { 1028*f5c631daSSadaf Ebrahimi Adc(cond, rd, rn, operand); 1029*f5c631daSSadaf Ebrahimi } 1030*f5c631daSSadaf Ebrahimi break; 1031*f5c631daSSadaf Ebrahimi } 1032*f5c631daSSadaf Ebrahimi } Adc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1033*f5c631daSSadaf Ebrahimi void Adc(FlagsUpdate flags, 1034*f5c631daSSadaf Ebrahimi Register rd, 1035*f5c631daSSadaf Ebrahimi Register rn, 1036*f5c631daSSadaf Ebrahimi const Operand& operand) { 1037*f5c631daSSadaf Ebrahimi Adc(flags, al, rd, rn, operand); 1038*f5c631daSSadaf Ebrahimi } 1039*f5c631daSSadaf Ebrahimi Adcs(Condition cond,Register rd,Register rn,const Operand & operand)1040*f5c631daSSadaf Ebrahimi void Adcs(Condition cond, Register rd, Register rn, const Operand& operand) { 1041*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1042*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1043*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1044*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1045*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1046*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1047*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1048*f5c631daSSadaf Ebrahimi adcs(cond, rd, rn, operand); 1049*f5c631daSSadaf Ebrahimi } Adcs(Register rd,Register rn,const Operand & operand)1050*f5c631daSSadaf Ebrahimi void Adcs(Register rd, Register rn, const Operand& operand) { 1051*f5c631daSSadaf Ebrahimi Adcs(al, rd, rn, operand); 1052*f5c631daSSadaf Ebrahimi } 1053*f5c631daSSadaf Ebrahimi Add(Condition cond,Register rd,Register rn,const Operand & operand)1054*f5c631daSSadaf Ebrahimi void Add(Condition cond, Register rd, Register rn, const Operand& operand) { 1055*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1056*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1057*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1058*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1059*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1060*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1061*f5c631daSSadaf Ebrahimi if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) { 1062*f5c631daSSadaf Ebrahimi uint32_t immediate = operand.GetImmediate(); 1063*f5c631daSSadaf Ebrahimi if (immediate == 0) { 1064*f5c631daSSadaf Ebrahimi return; 1065*f5c631daSSadaf Ebrahimi } 1066*f5c631daSSadaf Ebrahimi } 1067*f5c631daSSadaf Ebrahimi bool can_use_it = 1068*f5c631daSSadaf Ebrahimi // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1 1069*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() && 1070*f5c631daSSadaf Ebrahimi rd.IsLow()) || 1071*f5c631daSSadaf Ebrahimi // ADD<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2 1072*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && (operand.GetImmediate() <= 255) && 1073*f5c631daSSadaf Ebrahimi rd.IsLow() && rn.Is(rd)) || 1074*f5c631daSSadaf Ebrahimi // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1 1075*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && (operand.GetImmediate() <= 1020) && 1076*f5c631daSSadaf Ebrahimi ((operand.GetImmediate() & 0x3) == 0) && rd.IsLow() && rn.IsSP()) || 1077*f5c631daSSadaf Ebrahimi // ADD<c>{<q>} <Rd>, <Rn>, <Rm> 1078*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() && 1079*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow()) || 1080*f5c631daSSadaf Ebrahimi // ADD<c>{<q>} <Rdn>, <Rm> ; T2 1081*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && !rd.IsPC() && rn.Is(rd) && 1082*f5c631daSSadaf Ebrahimi !operand.GetBaseRegister().IsSP() && 1083*f5c631daSSadaf Ebrahimi !operand.GetBaseRegister().IsPC()) || 1084*f5c631daSSadaf Ebrahimi // ADD{<c>}{<q>} {<Rdm>,} SP, <Rdm> ; T1 1085*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && !rd.IsPC() && rn.IsSP() && 1086*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().Is(rd)); 1087*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 1088*f5c631daSSadaf Ebrahimi add(cond, rd, rn, operand); 1089*f5c631daSSadaf Ebrahimi } Add(Register rd,Register rn,const Operand & operand)1090*f5c631daSSadaf Ebrahimi void Add(Register rd, Register rn, const Operand& operand) { 1091*f5c631daSSadaf Ebrahimi Add(al, rd, rn, operand); 1092*f5c631daSSadaf Ebrahimi } Add(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1093*f5c631daSSadaf Ebrahimi void Add(FlagsUpdate flags, 1094*f5c631daSSadaf Ebrahimi Condition cond, 1095*f5c631daSSadaf Ebrahimi Register rd, 1096*f5c631daSSadaf Ebrahimi Register rn, 1097*f5c631daSSadaf Ebrahimi const Operand& operand) { 1098*f5c631daSSadaf Ebrahimi switch (flags) { 1099*f5c631daSSadaf Ebrahimi case LeaveFlags: 1100*f5c631daSSadaf Ebrahimi Add(cond, rd, rn, operand); 1101*f5c631daSSadaf Ebrahimi break; 1102*f5c631daSSadaf Ebrahimi case SetFlags: 1103*f5c631daSSadaf Ebrahimi Adds(cond, rd, rn, operand); 1104*f5c631daSSadaf Ebrahimi break; 1105*f5c631daSSadaf Ebrahimi case DontCare: 1106*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = 1107*f5c631daSSadaf Ebrahimi IsUsingT32() && cond.Is(al) && 1108*f5c631daSSadaf Ebrahimi ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() && 1109*f5c631daSSadaf Ebrahimi !rd.Is(rn) && operand.GetBaseRegister().IsLow()) || 1110*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && 1111*f5c631daSSadaf Ebrahimi ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) || 1112*f5c631daSSadaf Ebrahimi (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256))))); 1113*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 1114*f5c631daSSadaf Ebrahimi Adds(cond, rd, rn, operand); 1115*f5c631daSSadaf Ebrahimi } else { 1116*f5c631daSSadaf Ebrahimi bool changed_op_is_smaller = 1117*f5c631daSSadaf Ebrahimi operand.IsImmediate() && (operand.GetSignedImmediate() < 0) && 1118*f5c631daSSadaf Ebrahimi ((rd.IsLow() && rn.IsLow() && 1119*f5c631daSSadaf Ebrahimi (operand.GetSignedImmediate() >= -7)) || 1120*f5c631daSSadaf Ebrahimi (rd.IsLow() && rn.Is(rd) && 1121*f5c631daSSadaf Ebrahimi (operand.GetSignedImmediate() >= -255))); 1122*f5c631daSSadaf Ebrahimi if (changed_op_is_smaller) { 1123*f5c631daSSadaf Ebrahimi Subs(cond, rd, rn, -operand.GetSignedImmediate()); 1124*f5c631daSSadaf Ebrahimi } else { 1125*f5c631daSSadaf Ebrahimi Add(cond, rd, rn, operand); 1126*f5c631daSSadaf Ebrahimi } 1127*f5c631daSSadaf Ebrahimi } 1128*f5c631daSSadaf Ebrahimi break; 1129*f5c631daSSadaf Ebrahimi } 1130*f5c631daSSadaf Ebrahimi } Add(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1131*f5c631daSSadaf Ebrahimi void Add(FlagsUpdate flags, 1132*f5c631daSSadaf Ebrahimi Register rd, 1133*f5c631daSSadaf Ebrahimi Register rn, 1134*f5c631daSSadaf Ebrahimi const Operand& operand) { 1135*f5c631daSSadaf Ebrahimi Add(flags, al, rd, rn, operand); 1136*f5c631daSSadaf Ebrahimi } 1137*f5c631daSSadaf Ebrahimi Adds(Condition cond,Register rd,Register rn,const Operand & operand)1138*f5c631daSSadaf Ebrahimi void Adds(Condition cond, Register rd, Register rn, const Operand& operand) { 1139*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1140*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1141*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1142*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1143*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1144*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1145*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1146*f5c631daSSadaf Ebrahimi adds(cond, rd, rn, operand); 1147*f5c631daSSadaf Ebrahimi } Adds(Register rd,Register rn,const Operand & operand)1148*f5c631daSSadaf Ebrahimi void Adds(Register rd, Register rn, const Operand& operand) { 1149*f5c631daSSadaf Ebrahimi Adds(al, rd, rn, operand); 1150*f5c631daSSadaf Ebrahimi } 1151*f5c631daSSadaf Ebrahimi And(Condition cond,Register rd,Register rn,const Operand & operand)1152*f5c631daSSadaf Ebrahimi void And(Condition cond, Register rd, Register rn, const Operand& operand) { 1153*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1154*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1155*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1156*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1157*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1158*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1159*f5c631daSSadaf Ebrahimi if (rd.Is(rn) && operand.IsPlainRegister() && 1160*f5c631daSSadaf Ebrahimi rd.Is(operand.GetBaseRegister())) { 1161*f5c631daSSadaf Ebrahimi return; 1162*f5c631daSSadaf Ebrahimi } 1163*f5c631daSSadaf Ebrahimi if (cond.Is(al) && operand.IsImmediate()) { 1164*f5c631daSSadaf Ebrahimi uint32_t immediate = operand.GetImmediate(); 1165*f5c631daSSadaf Ebrahimi if (immediate == 0) { 1166*f5c631daSSadaf Ebrahimi mov(rd, 0); 1167*f5c631daSSadaf Ebrahimi return; 1168*f5c631daSSadaf Ebrahimi } 1169*f5c631daSSadaf Ebrahimi if ((immediate == 0xffffffff) && rd.Is(rn)) { 1170*f5c631daSSadaf Ebrahimi return; 1171*f5c631daSSadaf Ebrahimi } 1172*f5c631daSSadaf Ebrahimi } 1173*f5c631daSSadaf Ebrahimi bool can_use_it = 1174*f5c631daSSadaf Ebrahimi // AND<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 1175*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() && 1176*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 1177*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 1178*f5c631daSSadaf Ebrahimi and_(cond, rd, rn, operand); 1179*f5c631daSSadaf Ebrahimi } And(Register rd,Register rn,const Operand & operand)1180*f5c631daSSadaf Ebrahimi void And(Register rd, Register rn, const Operand& operand) { 1181*f5c631daSSadaf Ebrahimi And(al, rd, rn, operand); 1182*f5c631daSSadaf Ebrahimi } And(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1183*f5c631daSSadaf Ebrahimi void And(FlagsUpdate flags, 1184*f5c631daSSadaf Ebrahimi Condition cond, 1185*f5c631daSSadaf Ebrahimi Register rd, 1186*f5c631daSSadaf Ebrahimi Register rn, 1187*f5c631daSSadaf Ebrahimi const Operand& operand) { 1188*f5c631daSSadaf Ebrahimi switch (flags) { 1189*f5c631daSSadaf Ebrahimi case LeaveFlags: 1190*f5c631daSSadaf Ebrahimi And(cond, rd, rn, operand); 1191*f5c631daSSadaf Ebrahimi break; 1192*f5c631daSSadaf Ebrahimi case SetFlags: 1193*f5c631daSSadaf Ebrahimi Ands(cond, rd, rn, operand); 1194*f5c631daSSadaf Ebrahimi break; 1195*f5c631daSSadaf Ebrahimi case DontCare: 1196*f5c631daSSadaf Ebrahimi if (operand.IsPlainRegister() && rd.Is(rn) && 1197*f5c631daSSadaf Ebrahimi rd.Is(operand.GetBaseRegister())) { 1198*f5c631daSSadaf Ebrahimi return; 1199*f5c631daSSadaf Ebrahimi } 1200*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 1201*f5c631daSSadaf Ebrahimi rn.Is(rd) && operand.IsPlainRegister() && 1202*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 1203*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 1204*f5c631daSSadaf Ebrahimi Ands(cond, rd, rn, operand); 1205*f5c631daSSadaf Ebrahimi } else { 1206*f5c631daSSadaf Ebrahimi And(cond, rd, rn, operand); 1207*f5c631daSSadaf Ebrahimi } 1208*f5c631daSSadaf Ebrahimi break; 1209*f5c631daSSadaf Ebrahimi } 1210*f5c631daSSadaf Ebrahimi } And(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1211*f5c631daSSadaf Ebrahimi void And(FlagsUpdate flags, 1212*f5c631daSSadaf Ebrahimi Register rd, 1213*f5c631daSSadaf Ebrahimi Register rn, 1214*f5c631daSSadaf Ebrahimi const Operand& operand) { 1215*f5c631daSSadaf Ebrahimi And(flags, al, rd, rn, operand); 1216*f5c631daSSadaf Ebrahimi } 1217*f5c631daSSadaf Ebrahimi Ands(Condition cond,Register rd,Register rn,const Operand & operand)1218*f5c631daSSadaf Ebrahimi void Ands(Condition cond, Register rd, Register rn, const Operand& operand) { 1219*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1220*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1221*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1222*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1223*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1224*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1225*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1226*f5c631daSSadaf Ebrahimi ands(cond, rd, rn, operand); 1227*f5c631daSSadaf Ebrahimi } Ands(Register rd,Register rn,const Operand & operand)1228*f5c631daSSadaf Ebrahimi void Ands(Register rd, Register rn, const Operand& operand) { 1229*f5c631daSSadaf Ebrahimi Ands(al, rd, rn, operand); 1230*f5c631daSSadaf Ebrahimi } 1231*f5c631daSSadaf Ebrahimi Asr(Condition cond,Register rd,Register rm,const Operand & operand)1232*f5c631daSSadaf Ebrahimi void Asr(Condition cond, Register rd, Register rm, const Operand& operand) { 1233*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1234*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1235*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1236*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1237*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1238*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1239*f5c631daSSadaf Ebrahimi bool can_use_it = 1240*f5c631daSSadaf Ebrahimi // ASR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2 1241*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && (operand.GetImmediate() >= 1) && 1242*f5c631daSSadaf Ebrahimi (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) || 1243*f5c631daSSadaf Ebrahimi // ASR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1 1244*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() && 1245*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow()); 1246*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 1247*f5c631daSSadaf Ebrahimi asr(cond, rd, rm, operand); 1248*f5c631daSSadaf Ebrahimi } Asr(Register rd,Register rm,const Operand & operand)1249*f5c631daSSadaf Ebrahimi void Asr(Register rd, Register rm, const Operand& operand) { 1250*f5c631daSSadaf Ebrahimi Asr(al, rd, rm, operand); 1251*f5c631daSSadaf Ebrahimi } Asr(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)1252*f5c631daSSadaf Ebrahimi void Asr(FlagsUpdate flags, 1253*f5c631daSSadaf Ebrahimi Condition cond, 1254*f5c631daSSadaf Ebrahimi Register rd, 1255*f5c631daSSadaf Ebrahimi Register rm, 1256*f5c631daSSadaf Ebrahimi const Operand& operand) { 1257*f5c631daSSadaf Ebrahimi switch (flags) { 1258*f5c631daSSadaf Ebrahimi case LeaveFlags: 1259*f5c631daSSadaf Ebrahimi Asr(cond, rd, rm, operand); 1260*f5c631daSSadaf Ebrahimi break; 1261*f5c631daSSadaf Ebrahimi case SetFlags: 1262*f5c631daSSadaf Ebrahimi Asrs(cond, rd, rm, operand); 1263*f5c631daSSadaf Ebrahimi break; 1264*f5c631daSSadaf Ebrahimi case DontCare: 1265*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = 1266*f5c631daSSadaf Ebrahimi IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() && 1267*f5c631daSSadaf Ebrahimi ((operand.IsImmediate() && (operand.GetImmediate() >= 1) && 1268*f5c631daSSadaf Ebrahimi (operand.GetImmediate() <= 32)) || 1269*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && rd.Is(rm))); 1270*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 1271*f5c631daSSadaf Ebrahimi Asrs(cond, rd, rm, operand); 1272*f5c631daSSadaf Ebrahimi } else { 1273*f5c631daSSadaf Ebrahimi Asr(cond, rd, rm, operand); 1274*f5c631daSSadaf Ebrahimi } 1275*f5c631daSSadaf Ebrahimi break; 1276*f5c631daSSadaf Ebrahimi } 1277*f5c631daSSadaf Ebrahimi } Asr(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)1278*f5c631daSSadaf Ebrahimi void Asr(FlagsUpdate flags, 1279*f5c631daSSadaf Ebrahimi Register rd, 1280*f5c631daSSadaf Ebrahimi Register rm, 1281*f5c631daSSadaf Ebrahimi const Operand& operand) { 1282*f5c631daSSadaf Ebrahimi Asr(flags, al, rd, rm, operand); 1283*f5c631daSSadaf Ebrahimi } 1284*f5c631daSSadaf Ebrahimi Asrs(Condition cond,Register rd,Register rm,const Operand & operand)1285*f5c631daSSadaf Ebrahimi void Asrs(Condition cond, Register rd, Register rm, const Operand& operand) { 1286*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1287*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1288*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1289*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1290*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1291*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1292*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1293*f5c631daSSadaf Ebrahimi asrs(cond, rd, rm, operand); 1294*f5c631daSSadaf Ebrahimi } Asrs(Register rd,Register rm,const Operand & operand)1295*f5c631daSSadaf Ebrahimi void Asrs(Register rd, Register rm, const Operand& operand) { 1296*f5c631daSSadaf Ebrahimi Asrs(al, rd, rm, operand); 1297*f5c631daSSadaf Ebrahimi } 1298*f5c631daSSadaf Ebrahimi 1299*f5c631daSSadaf Ebrahimi void B(Condition cond, Label* label, BranchHint hint = kBranchWithoutHint) { 1300*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1301*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1302*f5c631daSSadaf Ebrahimi EncodingSize size = Best; 1303*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 1304*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 1305*f5c631daSSadaf Ebrahimi if (!label->IsBound()) { 1306*f5c631daSSadaf Ebrahimi if (hint == kNear) size = Narrow; 1307*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 1308*f5c631daSSadaf Ebrahimi bool can_encode = b_info(cond, size, label, &info); 1309*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 1310*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, label, &cond); 1311*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 1312*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 1313*f5c631daSSadaf Ebrahimi } 1314*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 1315*f5c631daSSadaf Ebrahimi b(cond, size, label); 1316*f5c631daSSadaf Ebrahimi RegisterForwardReference(label); 1317*f5c631daSSadaf Ebrahimi } 1318*f5c631daSSadaf Ebrahimi void B(Label* label, BranchHint hint = kBranchWithoutHint) { 1319*f5c631daSSadaf Ebrahimi B(al, label, hint); 1320*f5c631daSSadaf Ebrahimi } BPreferNear(Condition cond,Label * label)1321*f5c631daSSadaf Ebrahimi void BPreferNear(Condition cond, Label* label) { B(cond, label, kNear); } BPreferNear(Label * label)1322*f5c631daSSadaf Ebrahimi void BPreferNear(Label* label) { B(al, label, kNear); } 1323*f5c631daSSadaf Ebrahimi Bfc(Condition cond,Register rd,uint32_t lsb,uint32_t width)1324*f5c631daSSadaf Ebrahimi void Bfc(Condition cond, Register rd, uint32_t lsb, uint32_t width) { 1325*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1326*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1327*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1328*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1329*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1330*f5c631daSSadaf Ebrahimi bfc(cond, rd, lsb, width); 1331*f5c631daSSadaf Ebrahimi } Bfc(Register rd,uint32_t lsb,uint32_t width)1332*f5c631daSSadaf Ebrahimi void Bfc(Register rd, uint32_t lsb, uint32_t width) { 1333*f5c631daSSadaf Ebrahimi Bfc(al, rd, lsb, width); 1334*f5c631daSSadaf Ebrahimi } 1335*f5c631daSSadaf Ebrahimi Bfi(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)1336*f5c631daSSadaf Ebrahimi void Bfi( 1337*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { 1338*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1339*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1340*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1341*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1342*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1343*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1344*f5c631daSSadaf Ebrahimi bfi(cond, rd, rn, lsb, width); 1345*f5c631daSSadaf Ebrahimi } Bfi(Register rd,Register rn,uint32_t lsb,uint32_t width)1346*f5c631daSSadaf Ebrahimi void Bfi(Register rd, Register rn, uint32_t lsb, uint32_t width) { 1347*f5c631daSSadaf Ebrahimi Bfi(al, rd, rn, lsb, width); 1348*f5c631daSSadaf Ebrahimi } 1349*f5c631daSSadaf Ebrahimi Bic(Condition cond,Register rd,Register rn,const Operand & operand)1350*f5c631daSSadaf Ebrahimi void Bic(Condition cond, Register rd, Register rn, const Operand& operand) { 1351*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1352*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1353*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1354*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1355*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1356*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1357*f5c631daSSadaf Ebrahimi if (cond.Is(al) && operand.IsImmediate()) { 1358*f5c631daSSadaf Ebrahimi uint32_t immediate = operand.GetImmediate(); 1359*f5c631daSSadaf Ebrahimi if ((immediate == 0) && rd.Is(rn)) { 1360*f5c631daSSadaf Ebrahimi return; 1361*f5c631daSSadaf Ebrahimi } 1362*f5c631daSSadaf Ebrahimi if (immediate == 0xffffffff) { 1363*f5c631daSSadaf Ebrahimi mov(rd, 0); 1364*f5c631daSSadaf Ebrahimi return; 1365*f5c631daSSadaf Ebrahimi } 1366*f5c631daSSadaf Ebrahimi } 1367*f5c631daSSadaf Ebrahimi bool can_use_it = 1368*f5c631daSSadaf Ebrahimi // BIC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 1369*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() && 1370*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 1371*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 1372*f5c631daSSadaf Ebrahimi bic(cond, rd, rn, operand); 1373*f5c631daSSadaf Ebrahimi } Bic(Register rd,Register rn,const Operand & operand)1374*f5c631daSSadaf Ebrahimi void Bic(Register rd, Register rn, const Operand& operand) { 1375*f5c631daSSadaf Ebrahimi Bic(al, rd, rn, operand); 1376*f5c631daSSadaf Ebrahimi } Bic(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1377*f5c631daSSadaf Ebrahimi void Bic(FlagsUpdate flags, 1378*f5c631daSSadaf Ebrahimi Condition cond, 1379*f5c631daSSadaf Ebrahimi Register rd, 1380*f5c631daSSadaf Ebrahimi Register rn, 1381*f5c631daSSadaf Ebrahimi const Operand& operand) { 1382*f5c631daSSadaf Ebrahimi switch (flags) { 1383*f5c631daSSadaf Ebrahimi case LeaveFlags: 1384*f5c631daSSadaf Ebrahimi Bic(cond, rd, rn, operand); 1385*f5c631daSSadaf Ebrahimi break; 1386*f5c631daSSadaf Ebrahimi case SetFlags: 1387*f5c631daSSadaf Ebrahimi Bics(cond, rd, rn, operand); 1388*f5c631daSSadaf Ebrahimi break; 1389*f5c631daSSadaf Ebrahimi case DontCare: 1390*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 1391*f5c631daSSadaf Ebrahimi rn.Is(rd) && operand.IsPlainRegister() && 1392*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 1393*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 1394*f5c631daSSadaf Ebrahimi Bics(cond, rd, rn, operand); 1395*f5c631daSSadaf Ebrahimi } else { 1396*f5c631daSSadaf Ebrahimi Bic(cond, rd, rn, operand); 1397*f5c631daSSadaf Ebrahimi } 1398*f5c631daSSadaf Ebrahimi break; 1399*f5c631daSSadaf Ebrahimi } 1400*f5c631daSSadaf Ebrahimi } Bic(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1401*f5c631daSSadaf Ebrahimi void Bic(FlagsUpdate flags, 1402*f5c631daSSadaf Ebrahimi Register rd, 1403*f5c631daSSadaf Ebrahimi Register rn, 1404*f5c631daSSadaf Ebrahimi const Operand& operand) { 1405*f5c631daSSadaf Ebrahimi Bic(flags, al, rd, rn, operand); 1406*f5c631daSSadaf Ebrahimi } 1407*f5c631daSSadaf Ebrahimi Bics(Condition cond,Register rd,Register rn,const Operand & operand)1408*f5c631daSSadaf Ebrahimi void Bics(Condition cond, Register rd, Register rn, const Operand& operand) { 1409*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1410*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1411*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1412*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1413*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1414*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1415*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1416*f5c631daSSadaf Ebrahimi bics(cond, rd, rn, operand); 1417*f5c631daSSadaf Ebrahimi } Bics(Register rd,Register rn,const Operand & operand)1418*f5c631daSSadaf Ebrahimi void Bics(Register rd, Register rn, const Operand& operand) { 1419*f5c631daSSadaf Ebrahimi Bics(al, rd, rn, operand); 1420*f5c631daSSadaf Ebrahimi } 1421*f5c631daSSadaf Ebrahimi Bkpt(Condition cond,uint32_t imm)1422*f5c631daSSadaf Ebrahimi void Bkpt(Condition cond, uint32_t imm) { 1423*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1424*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1425*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1426*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1427*f5c631daSSadaf Ebrahimi bkpt(cond, imm); 1428*f5c631daSSadaf Ebrahimi } Bkpt(uint32_t imm)1429*f5c631daSSadaf Ebrahimi void Bkpt(uint32_t imm) { Bkpt(al, imm); } 1430*f5c631daSSadaf Ebrahimi Bl(Condition cond,Label * label)1431*f5c631daSSadaf Ebrahimi void Bl(Condition cond, Label* label) { 1432*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1433*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1434*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 1435*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 1436*f5c631daSSadaf Ebrahimi if (!label->IsBound()) { 1437*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 1438*f5c631daSSadaf Ebrahimi bool can_encode = bl_info(cond, label, &info); 1439*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 1440*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, label, &cond); 1441*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 1442*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 1443*f5c631daSSadaf Ebrahimi } 1444*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 1445*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1446*f5c631daSSadaf Ebrahimi bl(cond, label); 1447*f5c631daSSadaf Ebrahimi RegisterForwardReference(label); 1448*f5c631daSSadaf Ebrahimi } Bl(Label * label)1449*f5c631daSSadaf Ebrahimi void Bl(Label* label) { Bl(al, label); } 1450*f5c631daSSadaf Ebrahimi Blx(Condition cond,Label * label)1451*f5c631daSSadaf Ebrahimi void Blx(Condition cond, Label* label) { 1452*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1453*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1454*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 1455*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 1456*f5c631daSSadaf Ebrahimi if (!label->IsBound()) { 1457*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 1458*f5c631daSSadaf Ebrahimi bool can_encode = blx_info(cond, label, &info); 1459*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 1460*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, label, &cond); 1461*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 1462*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 1463*f5c631daSSadaf Ebrahimi } 1464*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 1465*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1466*f5c631daSSadaf Ebrahimi blx(cond, label); 1467*f5c631daSSadaf Ebrahimi RegisterForwardReference(label); 1468*f5c631daSSadaf Ebrahimi } Blx(Label * label)1469*f5c631daSSadaf Ebrahimi void Blx(Label* label) { Blx(al, label); } 1470*f5c631daSSadaf Ebrahimi Blx(Condition cond,Register rm)1471*f5c631daSSadaf Ebrahimi void Blx(Condition cond, Register rm) { 1472*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1473*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1474*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1475*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1476*f5c631daSSadaf Ebrahimi bool can_use_it = 1477*f5c631daSSadaf Ebrahimi // BLX{<c>}{<q>} <Rm> ; T1 1478*f5c631daSSadaf Ebrahimi !rm.IsPC(); 1479*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 1480*f5c631daSSadaf Ebrahimi blx(cond, rm); 1481*f5c631daSSadaf Ebrahimi } Blx(Register rm)1482*f5c631daSSadaf Ebrahimi void Blx(Register rm) { Blx(al, rm); } 1483*f5c631daSSadaf Ebrahimi Bx(Condition cond,Register rm)1484*f5c631daSSadaf Ebrahimi void Bx(Condition cond, Register rm) { 1485*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1486*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1487*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1488*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1489*f5c631daSSadaf Ebrahimi bool can_use_it = 1490*f5c631daSSadaf Ebrahimi // BX{<c>}{<q>} <Rm> ; T1 1491*f5c631daSSadaf Ebrahimi !rm.IsPC(); 1492*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 1493*f5c631daSSadaf Ebrahimi bx(cond, rm); 1494*f5c631daSSadaf Ebrahimi } Bx(Register rm)1495*f5c631daSSadaf Ebrahimi void Bx(Register rm) { Bx(al, rm); } 1496*f5c631daSSadaf Ebrahimi Bxj(Condition cond,Register rm)1497*f5c631daSSadaf Ebrahimi void Bxj(Condition cond, Register rm) { 1498*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1499*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1500*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1501*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1502*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1503*f5c631daSSadaf Ebrahimi bxj(cond, rm); 1504*f5c631daSSadaf Ebrahimi } Bxj(Register rm)1505*f5c631daSSadaf Ebrahimi void Bxj(Register rm) { Bxj(al, rm); } 1506*f5c631daSSadaf Ebrahimi Cbnz(Register rn,Label * label)1507*f5c631daSSadaf Ebrahimi void Cbnz(Register rn, Label* label) { 1508*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1509*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1510*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1511*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 1512*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 1513*f5c631daSSadaf Ebrahimi if (!label->IsBound()) { 1514*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 1515*f5c631daSSadaf Ebrahimi bool can_encode = cbnz_info(rn, label, &info); 1516*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 1517*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, label); 1518*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 1519*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 1520*f5c631daSSadaf Ebrahimi } 1521*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 1522*f5c631daSSadaf Ebrahimi cbnz(rn, label); 1523*f5c631daSSadaf Ebrahimi RegisterForwardReference(label); 1524*f5c631daSSadaf Ebrahimi } 1525*f5c631daSSadaf Ebrahimi Cbz(Register rn,Label * label)1526*f5c631daSSadaf Ebrahimi void Cbz(Register rn, Label* label) { 1527*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1528*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1529*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1530*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::PoolPolicy pool_policy = 1531*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope::kBlockPools; 1532*f5c631daSSadaf Ebrahimi if (!label->IsBound()) { 1533*f5c631daSSadaf Ebrahimi const ReferenceInfo* info; 1534*f5c631daSSadaf Ebrahimi bool can_encode = cbz_info(rn, label, &info); 1535*f5c631daSSadaf Ebrahimi VIXL_CHECK(can_encode); 1536*f5c631daSSadaf Ebrahimi CheckEmitPoolForInstruction(info, label); 1537*f5c631daSSadaf Ebrahimi // We have already checked for pool emission. 1538*f5c631daSSadaf Ebrahimi pool_policy = MacroEmissionCheckScope::kIgnorePools; 1539*f5c631daSSadaf Ebrahimi } 1540*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this, pool_policy); 1541*f5c631daSSadaf Ebrahimi cbz(rn, label); 1542*f5c631daSSadaf Ebrahimi RegisterForwardReference(label); 1543*f5c631daSSadaf Ebrahimi } 1544*f5c631daSSadaf Ebrahimi Clrex(Condition cond)1545*f5c631daSSadaf Ebrahimi void Clrex(Condition cond) { 1546*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1547*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1548*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1549*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1550*f5c631daSSadaf Ebrahimi clrex(cond); 1551*f5c631daSSadaf Ebrahimi } Clrex()1552*f5c631daSSadaf Ebrahimi void Clrex() { Clrex(al); } 1553*f5c631daSSadaf Ebrahimi Clz(Condition cond,Register rd,Register rm)1554*f5c631daSSadaf Ebrahimi void Clz(Condition cond, Register rd, Register rm) { 1555*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1556*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1557*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1558*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1559*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1560*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1561*f5c631daSSadaf Ebrahimi clz(cond, rd, rm); 1562*f5c631daSSadaf Ebrahimi } Clz(Register rd,Register rm)1563*f5c631daSSadaf Ebrahimi void Clz(Register rd, Register rm) { Clz(al, rd, rm); } 1564*f5c631daSSadaf Ebrahimi Cmn(Condition cond,Register rn,const Operand & operand)1565*f5c631daSSadaf Ebrahimi void Cmn(Condition cond, Register rn, const Operand& operand) { 1566*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1567*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1568*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1569*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1570*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1571*f5c631daSSadaf Ebrahimi bool can_use_it = 1572*f5c631daSSadaf Ebrahimi // CMN{<c>}{<q>} <Rn>, <Rm> ; T1 1573*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rn.IsLow() && 1574*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 1575*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 1576*f5c631daSSadaf Ebrahimi cmn(cond, rn, operand); 1577*f5c631daSSadaf Ebrahimi } Cmn(Register rn,const Operand & operand)1578*f5c631daSSadaf Ebrahimi void Cmn(Register rn, const Operand& operand) { Cmn(al, rn, operand); } 1579*f5c631daSSadaf Ebrahimi Cmp(Condition cond,Register rn,const Operand & operand)1580*f5c631daSSadaf Ebrahimi void Cmp(Condition cond, Register rn, const Operand& operand) { 1581*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1582*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1583*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1584*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1585*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1586*f5c631daSSadaf Ebrahimi bool can_use_it = 1587*f5c631daSSadaf Ebrahimi // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1 1588*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && (operand.GetImmediate() <= 255) && 1589*f5c631daSSadaf Ebrahimi rn.IsLow()) || 1590*f5c631daSSadaf Ebrahimi // CMP{<c>}{<q>} <Rn>, <Rm> ; T1 T2 1591*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && !rn.IsPC() && 1592*f5c631daSSadaf Ebrahimi !operand.GetBaseRegister().IsPC()); 1593*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 1594*f5c631daSSadaf Ebrahimi cmp(cond, rn, operand); 1595*f5c631daSSadaf Ebrahimi } Cmp(Register rn,const Operand & operand)1596*f5c631daSSadaf Ebrahimi void Cmp(Register rn, const Operand& operand) { Cmp(al, rn, operand); } 1597*f5c631daSSadaf Ebrahimi Crc32b(Condition cond,Register rd,Register rn,Register rm)1598*f5c631daSSadaf Ebrahimi void Crc32b(Condition cond, Register rd, Register rn, Register rm) { 1599*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1600*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1601*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1602*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1603*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1604*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1605*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1606*f5c631daSSadaf Ebrahimi crc32b(cond, rd, rn, rm); 1607*f5c631daSSadaf Ebrahimi } Crc32b(Register rd,Register rn,Register rm)1608*f5c631daSSadaf Ebrahimi void Crc32b(Register rd, Register rn, Register rm) { Crc32b(al, rd, rn, rm); } 1609*f5c631daSSadaf Ebrahimi Crc32cb(Condition cond,Register rd,Register rn,Register rm)1610*f5c631daSSadaf Ebrahimi void Crc32cb(Condition cond, Register rd, Register rn, Register rm) { 1611*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1612*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1613*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1614*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1615*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1616*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1617*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1618*f5c631daSSadaf Ebrahimi crc32cb(cond, rd, rn, rm); 1619*f5c631daSSadaf Ebrahimi } Crc32cb(Register rd,Register rn,Register rm)1620*f5c631daSSadaf Ebrahimi void Crc32cb(Register rd, Register rn, Register rm) { 1621*f5c631daSSadaf Ebrahimi Crc32cb(al, rd, rn, rm); 1622*f5c631daSSadaf Ebrahimi } 1623*f5c631daSSadaf Ebrahimi Crc32ch(Condition cond,Register rd,Register rn,Register rm)1624*f5c631daSSadaf Ebrahimi void Crc32ch(Condition cond, Register rd, Register rn, Register rm) { 1625*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1626*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1627*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1628*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1629*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1630*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1631*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1632*f5c631daSSadaf Ebrahimi crc32ch(cond, rd, rn, rm); 1633*f5c631daSSadaf Ebrahimi } Crc32ch(Register rd,Register rn,Register rm)1634*f5c631daSSadaf Ebrahimi void Crc32ch(Register rd, Register rn, Register rm) { 1635*f5c631daSSadaf Ebrahimi Crc32ch(al, rd, rn, rm); 1636*f5c631daSSadaf Ebrahimi } 1637*f5c631daSSadaf Ebrahimi Crc32cw(Condition cond,Register rd,Register rn,Register rm)1638*f5c631daSSadaf Ebrahimi void Crc32cw(Condition cond, Register rd, Register rn, Register rm) { 1639*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1640*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1641*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1642*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1643*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1644*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1645*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1646*f5c631daSSadaf Ebrahimi crc32cw(cond, rd, rn, rm); 1647*f5c631daSSadaf Ebrahimi } Crc32cw(Register rd,Register rn,Register rm)1648*f5c631daSSadaf Ebrahimi void Crc32cw(Register rd, Register rn, Register rm) { 1649*f5c631daSSadaf Ebrahimi Crc32cw(al, rd, rn, rm); 1650*f5c631daSSadaf Ebrahimi } 1651*f5c631daSSadaf Ebrahimi Crc32h(Condition cond,Register rd,Register rn,Register rm)1652*f5c631daSSadaf Ebrahimi void Crc32h(Condition cond, Register rd, Register rn, Register rm) { 1653*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1654*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1655*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1656*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1657*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1658*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1659*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1660*f5c631daSSadaf Ebrahimi crc32h(cond, rd, rn, rm); 1661*f5c631daSSadaf Ebrahimi } Crc32h(Register rd,Register rn,Register rm)1662*f5c631daSSadaf Ebrahimi void Crc32h(Register rd, Register rn, Register rm) { Crc32h(al, rd, rn, rm); } 1663*f5c631daSSadaf Ebrahimi Crc32w(Condition cond,Register rd,Register rn,Register rm)1664*f5c631daSSadaf Ebrahimi void Crc32w(Condition cond, Register rd, Register rn, Register rm) { 1665*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1666*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1667*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1668*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1669*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1670*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1671*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1672*f5c631daSSadaf Ebrahimi crc32w(cond, rd, rn, rm); 1673*f5c631daSSadaf Ebrahimi } Crc32w(Register rd,Register rn,Register rm)1674*f5c631daSSadaf Ebrahimi void Crc32w(Register rd, Register rn, Register rm) { Crc32w(al, rd, rn, rm); } 1675*f5c631daSSadaf Ebrahimi Dmb(Condition cond,MemoryBarrier option)1676*f5c631daSSadaf Ebrahimi void Dmb(Condition cond, MemoryBarrier option) { 1677*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1678*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1679*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1680*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1681*f5c631daSSadaf Ebrahimi dmb(cond, option); 1682*f5c631daSSadaf Ebrahimi } Dmb(MemoryBarrier option)1683*f5c631daSSadaf Ebrahimi void Dmb(MemoryBarrier option) { Dmb(al, option); } 1684*f5c631daSSadaf Ebrahimi Dsb(Condition cond,MemoryBarrier option)1685*f5c631daSSadaf Ebrahimi void Dsb(Condition cond, MemoryBarrier option) { 1686*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1687*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1688*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1689*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1690*f5c631daSSadaf Ebrahimi dsb(cond, option); 1691*f5c631daSSadaf Ebrahimi } Dsb(MemoryBarrier option)1692*f5c631daSSadaf Ebrahimi void Dsb(MemoryBarrier option) { Dsb(al, option); } 1693*f5c631daSSadaf Ebrahimi Eor(Condition cond,Register rd,Register rn,const Operand & operand)1694*f5c631daSSadaf Ebrahimi void Eor(Condition cond, Register rd, Register rn, const Operand& operand) { 1695*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1696*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1697*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1698*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1699*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1700*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1701*f5c631daSSadaf Ebrahimi if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) { 1702*f5c631daSSadaf Ebrahimi uint32_t immediate = operand.GetImmediate(); 1703*f5c631daSSadaf Ebrahimi if (immediate == 0) { 1704*f5c631daSSadaf Ebrahimi return; 1705*f5c631daSSadaf Ebrahimi } 1706*f5c631daSSadaf Ebrahimi if (immediate == 0xffffffff) { 1707*f5c631daSSadaf Ebrahimi mvn(rd, rn); 1708*f5c631daSSadaf Ebrahimi return; 1709*f5c631daSSadaf Ebrahimi } 1710*f5c631daSSadaf Ebrahimi } 1711*f5c631daSSadaf Ebrahimi bool can_use_it = 1712*f5c631daSSadaf Ebrahimi // EOR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 1713*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() && 1714*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 1715*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 1716*f5c631daSSadaf Ebrahimi eor(cond, rd, rn, operand); 1717*f5c631daSSadaf Ebrahimi } Eor(Register rd,Register rn,const Operand & operand)1718*f5c631daSSadaf Ebrahimi void Eor(Register rd, Register rn, const Operand& operand) { 1719*f5c631daSSadaf Ebrahimi Eor(al, rd, rn, operand); 1720*f5c631daSSadaf Ebrahimi } Eor(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)1721*f5c631daSSadaf Ebrahimi void Eor(FlagsUpdate flags, 1722*f5c631daSSadaf Ebrahimi Condition cond, 1723*f5c631daSSadaf Ebrahimi Register rd, 1724*f5c631daSSadaf Ebrahimi Register rn, 1725*f5c631daSSadaf Ebrahimi const Operand& operand) { 1726*f5c631daSSadaf Ebrahimi switch (flags) { 1727*f5c631daSSadaf Ebrahimi case LeaveFlags: 1728*f5c631daSSadaf Ebrahimi Eor(cond, rd, rn, operand); 1729*f5c631daSSadaf Ebrahimi break; 1730*f5c631daSSadaf Ebrahimi case SetFlags: 1731*f5c631daSSadaf Ebrahimi Eors(cond, rd, rn, operand); 1732*f5c631daSSadaf Ebrahimi break; 1733*f5c631daSSadaf Ebrahimi case DontCare: 1734*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 1735*f5c631daSSadaf Ebrahimi rn.Is(rd) && operand.IsPlainRegister() && 1736*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 1737*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 1738*f5c631daSSadaf Ebrahimi Eors(cond, rd, rn, operand); 1739*f5c631daSSadaf Ebrahimi } else { 1740*f5c631daSSadaf Ebrahimi Eor(cond, rd, rn, operand); 1741*f5c631daSSadaf Ebrahimi } 1742*f5c631daSSadaf Ebrahimi break; 1743*f5c631daSSadaf Ebrahimi } 1744*f5c631daSSadaf Ebrahimi } Eor(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)1745*f5c631daSSadaf Ebrahimi void Eor(FlagsUpdate flags, 1746*f5c631daSSadaf Ebrahimi Register rd, 1747*f5c631daSSadaf Ebrahimi Register rn, 1748*f5c631daSSadaf Ebrahimi const Operand& operand) { 1749*f5c631daSSadaf Ebrahimi Eor(flags, al, rd, rn, operand); 1750*f5c631daSSadaf Ebrahimi } 1751*f5c631daSSadaf Ebrahimi Eors(Condition cond,Register rd,Register rn,const Operand & operand)1752*f5c631daSSadaf Ebrahimi void Eors(Condition cond, Register rd, Register rn, const Operand& operand) { 1753*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1754*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1755*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1756*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1757*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1758*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1759*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1760*f5c631daSSadaf Ebrahimi eors(cond, rd, rn, operand); 1761*f5c631daSSadaf Ebrahimi } Eors(Register rd,Register rn,const Operand & operand)1762*f5c631daSSadaf Ebrahimi void Eors(Register rd, Register rn, const Operand& operand) { 1763*f5c631daSSadaf Ebrahimi Eors(al, rd, rn, operand); 1764*f5c631daSSadaf Ebrahimi } 1765*f5c631daSSadaf Ebrahimi Fldmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1766*f5c631daSSadaf Ebrahimi void Fldmdbx(Condition cond, 1767*f5c631daSSadaf Ebrahimi Register rn, 1768*f5c631daSSadaf Ebrahimi WriteBack write_back, 1769*f5c631daSSadaf Ebrahimi DRegisterList dreglist) { 1770*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1771*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 1772*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1773*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1774*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1775*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1776*f5c631daSSadaf Ebrahimi fldmdbx(cond, rn, write_back, dreglist); 1777*f5c631daSSadaf Ebrahimi } Fldmdbx(Register rn,WriteBack write_back,DRegisterList dreglist)1778*f5c631daSSadaf Ebrahimi void Fldmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) { 1779*f5c631daSSadaf Ebrahimi Fldmdbx(al, rn, write_back, dreglist); 1780*f5c631daSSadaf Ebrahimi } 1781*f5c631daSSadaf Ebrahimi Fldmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1782*f5c631daSSadaf Ebrahimi void Fldmiax(Condition cond, 1783*f5c631daSSadaf Ebrahimi Register rn, 1784*f5c631daSSadaf Ebrahimi WriteBack write_back, 1785*f5c631daSSadaf Ebrahimi DRegisterList dreglist) { 1786*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1787*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 1788*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1789*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1790*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1791*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1792*f5c631daSSadaf Ebrahimi fldmiax(cond, rn, write_back, dreglist); 1793*f5c631daSSadaf Ebrahimi } Fldmiax(Register rn,WriteBack write_back,DRegisterList dreglist)1794*f5c631daSSadaf Ebrahimi void Fldmiax(Register rn, WriteBack write_back, DRegisterList dreglist) { 1795*f5c631daSSadaf Ebrahimi Fldmiax(al, rn, write_back, dreglist); 1796*f5c631daSSadaf Ebrahimi } 1797*f5c631daSSadaf Ebrahimi Fstmdbx(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1798*f5c631daSSadaf Ebrahimi void Fstmdbx(Condition cond, 1799*f5c631daSSadaf Ebrahimi Register rn, 1800*f5c631daSSadaf Ebrahimi WriteBack write_back, 1801*f5c631daSSadaf Ebrahimi DRegisterList dreglist) { 1802*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1803*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 1804*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1805*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1806*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1807*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1808*f5c631daSSadaf Ebrahimi fstmdbx(cond, rn, write_back, dreglist); 1809*f5c631daSSadaf Ebrahimi } Fstmdbx(Register rn,WriteBack write_back,DRegisterList dreglist)1810*f5c631daSSadaf Ebrahimi void Fstmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) { 1811*f5c631daSSadaf Ebrahimi Fstmdbx(al, rn, write_back, dreglist); 1812*f5c631daSSadaf Ebrahimi } 1813*f5c631daSSadaf Ebrahimi Fstmiax(Condition cond,Register rn,WriteBack write_back,DRegisterList dreglist)1814*f5c631daSSadaf Ebrahimi void Fstmiax(Condition cond, 1815*f5c631daSSadaf Ebrahimi Register rn, 1816*f5c631daSSadaf Ebrahimi WriteBack write_back, 1817*f5c631daSSadaf Ebrahimi DRegisterList dreglist) { 1818*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1819*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 1820*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1821*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1822*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1823*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1824*f5c631daSSadaf Ebrahimi fstmiax(cond, rn, write_back, dreglist); 1825*f5c631daSSadaf Ebrahimi } Fstmiax(Register rn,WriteBack write_back,DRegisterList dreglist)1826*f5c631daSSadaf Ebrahimi void Fstmiax(Register rn, WriteBack write_back, DRegisterList dreglist) { 1827*f5c631daSSadaf Ebrahimi Fstmiax(al, rn, write_back, dreglist); 1828*f5c631daSSadaf Ebrahimi } 1829*f5c631daSSadaf Ebrahimi Hlt(Condition cond,uint32_t imm)1830*f5c631daSSadaf Ebrahimi void Hlt(Condition cond, uint32_t imm) { 1831*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1832*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1833*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1834*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1835*f5c631daSSadaf Ebrahimi hlt(cond, imm); 1836*f5c631daSSadaf Ebrahimi } Hlt(uint32_t imm)1837*f5c631daSSadaf Ebrahimi void Hlt(uint32_t imm) { Hlt(al, imm); } 1838*f5c631daSSadaf Ebrahimi Hvc(Condition cond,uint32_t imm)1839*f5c631daSSadaf Ebrahimi void Hvc(Condition cond, uint32_t imm) { 1840*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1841*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1842*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1843*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1844*f5c631daSSadaf Ebrahimi hvc(cond, imm); 1845*f5c631daSSadaf Ebrahimi } Hvc(uint32_t imm)1846*f5c631daSSadaf Ebrahimi void Hvc(uint32_t imm) { Hvc(al, imm); } 1847*f5c631daSSadaf Ebrahimi Isb(Condition cond,MemoryBarrier option)1848*f5c631daSSadaf Ebrahimi void Isb(Condition cond, MemoryBarrier option) { 1849*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1850*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1851*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1852*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1853*f5c631daSSadaf Ebrahimi isb(cond, option); 1854*f5c631daSSadaf Ebrahimi } Isb(MemoryBarrier option)1855*f5c631daSSadaf Ebrahimi void Isb(MemoryBarrier option) { Isb(al, option); } 1856*f5c631daSSadaf Ebrahimi Lda(Condition cond,Register rt,const MemOperand & operand)1857*f5c631daSSadaf Ebrahimi void Lda(Condition cond, Register rt, const MemOperand& operand) { 1858*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 1859*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1860*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1861*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1862*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1863*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1864*f5c631daSSadaf Ebrahimi lda(cond, rt, operand); 1865*f5c631daSSadaf Ebrahimi } Lda(Register rt,const MemOperand & operand)1866*f5c631daSSadaf Ebrahimi void Lda(Register rt, const MemOperand& operand) { Lda(al, rt, operand); } 1867*f5c631daSSadaf Ebrahimi Ldab(Condition cond,Register rt,const MemOperand & operand)1868*f5c631daSSadaf Ebrahimi void Ldab(Condition cond, Register rt, const MemOperand& operand) { 1869*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 1870*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1871*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1872*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1873*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1874*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1875*f5c631daSSadaf Ebrahimi ldab(cond, rt, operand); 1876*f5c631daSSadaf Ebrahimi } Ldab(Register rt,const MemOperand & operand)1877*f5c631daSSadaf Ebrahimi void Ldab(Register rt, const MemOperand& operand) { Ldab(al, rt, operand); } 1878*f5c631daSSadaf Ebrahimi Ldaex(Condition cond,Register rt,const MemOperand & operand)1879*f5c631daSSadaf Ebrahimi void Ldaex(Condition cond, Register rt, const MemOperand& operand) { 1880*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 1881*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1882*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1883*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1884*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1885*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1886*f5c631daSSadaf Ebrahimi ldaex(cond, rt, operand); 1887*f5c631daSSadaf Ebrahimi } Ldaex(Register rt,const MemOperand & operand)1888*f5c631daSSadaf Ebrahimi void Ldaex(Register rt, const MemOperand& operand) { Ldaex(al, rt, operand); } 1889*f5c631daSSadaf Ebrahimi Ldaexb(Condition cond,Register rt,const MemOperand & operand)1890*f5c631daSSadaf Ebrahimi void Ldaexb(Condition cond, Register rt, const MemOperand& operand) { 1891*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 1892*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1893*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1894*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1895*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1896*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1897*f5c631daSSadaf Ebrahimi ldaexb(cond, rt, operand); 1898*f5c631daSSadaf Ebrahimi } Ldaexb(Register rt,const MemOperand & operand)1899*f5c631daSSadaf Ebrahimi void Ldaexb(Register rt, const MemOperand& operand) { 1900*f5c631daSSadaf Ebrahimi Ldaexb(al, rt, operand); 1901*f5c631daSSadaf Ebrahimi } 1902*f5c631daSSadaf Ebrahimi Ldaexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)1903*f5c631daSSadaf Ebrahimi void Ldaexd(Condition cond, 1904*f5c631daSSadaf Ebrahimi Register rt, 1905*f5c631daSSadaf Ebrahimi Register rt2, 1906*f5c631daSSadaf Ebrahimi const MemOperand& operand) { 1907*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 1908*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 1909*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1910*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1911*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1912*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1913*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1914*f5c631daSSadaf Ebrahimi ldaexd(cond, rt, rt2, operand); 1915*f5c631daSSadaf Ebrahimi } Ldaexd(Register rt,Register rt2,const MemOperand & operand)1916*f5c631daSSadaf Ebrahimi void Ldaexd(Register rt, Register rt2, const MemOperand& operand) { 1917*f5c631daSSadaf Ebrahimi Ldaexd(al, rt, rt2, operand); 1918*f5c631daSSadaf Ebrahimi } 1919*f5c631daSSadaf Ebrahimi Ldaexh(Condition cond,Register rt,const MemOperand & operand)1920*f5c631daSSadaf Ebrahimi void Ldaexh(Condition cond, Register rt, const MemOperand& operand) { 1921*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 1922*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1923*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1924*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1925*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1926*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1927*f5c631daSSadaf Ebrahimi ldaexh(cond, rt, operand); 1928*f5c631daSSadaf Ebrahimi } Ldaexh(Register rt,const MemOperand & operand)1929*f5c631daSSadaf Ebrahimi void Ldaexh(Register rt, const MemOperand& operand) { 1930*f5c631daSSadaf Ebrahimi Ldaexh(al, rt, operand); 1931*f5c631daSSadaf Ebrahimi } 1932*f5c631daSSadaf Ebrahimi Ldah(Condition cond,Register rt,const MemOperand & operand)1933*f5c631daSSadaf Ebrahimi void Ldah(Condition cond, Register rt, const MemOperand& operand) { 1934*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 1935*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1936*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1937*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1938*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1939*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1940*f5c631daSSadaf Ebrahimi ldah(cond, rt, operand); 1941*f5c631daSSadaf Ebrahimi } Ldah(Register rt,const MemOperand & operand)1942*f5c631daSSadaf Ebrahimi void Ldah(Register rt, const MemOperand& operand) { Ldah(al, rt, operand); } 1943*f5c631daSSadaf Ebrahimi Ldm(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1944*f5c631daSSadaf Ebrahimi void Ldm(Condition cond, 1945*f5c631daSSadaf Ebrahimi Register rn, 1946*f5c631daSSadaf Ebrahimi WriteBack write_back, 1947*f5c631daSSadaf Ebrahimi RegisterList registers) { 1948*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1949*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 1950*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1951*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1952*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1953*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1954*f5c631daSSadaf Ebrahimi ldm(cond, rn, write_back, registers); 1955*f5c631daSSadaf Ebrahimi } Ldm(Register rn,WriteBack write_back,RegisterList registers)1956*f5c631daSSadaf Ebrahimi void Ldm(Register rn, WriteBack write_back, RegisterList registers) { 1957*f5c631daSSadaf Ebrahimi Ldm(al, rn, write_back, registers); 1958*f5c631daSSadaf Ebrahimi } 1959*f5c631daSSadaf Ebrahimi Ldmda(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1960*f5c631daSSadaf Ebrahimi void Ldmda(Condition cond, 1961*f5c631daSSadaf Ebrahimi Register rn, 1962*f5c631daSSadaf Ebrahimi WriteBack write_back, 1963*f5c631daSSadaf Ebrahimi RegisterList registers) { 1964*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1965*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 1966*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1967*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1968*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1969*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1970*f5c631daSSadaf Ebrahimi ldmda(cond, rn, write_back, registers); 1971*f5c631daSSadaf Ebrahimi } Ldmda(Register rn,WriteBack write_back,RegisterList registers)1972*f5c631daSSadaf Ebrahimi void Ldmda(Register rn, WriteBack write_back, RegisterList registers) { 1973*f5c631daSSadaf Ebrahimi Ldmda(al, rn, write_back, registers); 1974*f5c631daSSadaf Ebrahimi } 1975*f5c631daSSadaf Ebrahimi Ldmdb(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1976*f5c631daSSadaf Ebrahimi void Ldmdb(Condition cond, 1977*f5c631daSSadaf Ebrahimi Register rn, 1978*f5c631daSSadaf Ebrahimi WriteBack write_back, 1979*f5c631daSSadaf Ebrahimi RegisterList registers) { 1980*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1981*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 1982*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1983*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 1984*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 1985*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 1986*f5c631daSSadaf Ebrahimi ldmdb(cond, rn, write_back, registers); 1987*f5c631daSSadaf Ebrahimi } Ldmdb(Register rn,WriteBack write_back,RegisterList registers)1988*f5c631daSSadaf Ebrahimi void Ldmdb(Register rn, WriteBack write_back, RegisterList registers) { 1989*f5c631daSSadaf Ebrahimi Ldmdb(al, rn, write_back, registers); 1990*f5c631daSSadaf Ebrahimi } 1991*f5c631daSSadaf Ebrahimi Ldmea(Condition cond,Register rn,WriteBack write_back,RegisterList registers)1992*f5c631daSSadaf Ebrahimi void Ldmea(Condition cond, 1993*f5c631daSSadaf Ebrahimi Register rn, 1994*f5c631daSSadaf Ebrahimi WriteBack write_back, 1995*f5c631daSSadaf Ebrahimi RegisterList registers) { 1996*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1997*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 1998*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 1999*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2000*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2001*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2002*f5c631daSSadaf Ebrahimi ldmea(cond, rn, write_back, registers); 2003*f5c631daSSadaf Ebrahimi } Ldmea(Register rn,WriteBack write_back,RegisterList registers)2004*f5c631daSSadaf Ebrahimi void Ldmea(Register rn, WriteBack write_back, RegisterList registers) { 2005*f5c631daSSadaf Ebrahimi Ldmea(al, rn, write_back, registers); 2006*f5c631daSSadaf Ebrahimi } 2007*f5c631daSSadaf Ebrahimi Ldmed(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2008*f5c631daSSadaf Ebrahimi void Ldmed(Condition cond, 2009*f5c631daSSadaf Ebrahimi Register rn, 2010*f5c631daSSadaf Ebrahimi WriteBack write_back, 2011*f5c631daSSadaf Ebrahimi RegisterList registers) { 2012*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2013*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2014*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2015*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2016*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2017*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2018*f5c631daSSadaf Ebrahimi ldmed(cond, rn, write_back, registers); 2019*f5c631daSSadaf Ebrahimi } Ldmed(Register rn,WriteBack write_back,RegisterList registers)2020*f5c631daSSadaf Ebrahimi void Ldmed(Register rn, WriteBack write_back, RegisterList registers) { 2021*f5c631daSSadaf Ebrahimi Ldmed(al, rn, write_back, registers); 2022*f5c631daSSadaf Ebrahimi } 2023*f5c631daSSadaf Ebrahimi Ldmfa(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2024*f5c631daSSadaf Ebrahimi void Ldmfa(Condition cond, 2025*f5c631daSSadaf Ebrahimi Register rn, 2026*f5c631daSSadaf Ebrahimi WriteBack write_back, 2027*f5c631daSSadaf Ebrahimi RegisterList registers) { 2028*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2029*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2030*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2031*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2032*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2033*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2034*f5c631daSSadaf Ebrahimi ldmfa(cond, rn, write_back, registers); 2035*f5c631daSSadaf Ebrahimi } Ldmfa(Register rn,WriteBack write_back,RegisterList registers)2036*f5c631daSSadaf Ebrahimi void Ldmfa(Register rn, WriteBack write_back, RegisterList registers) { 2037*f5c631daSSadaf Ebrahimi Ldmfa(al, rn, write_back, registers); 2038*f5c631daSSadaf Ebrahimi } 2039*f5c631daSSadaf Ebrahimi Ldmfd(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2040*f5c631daSSadaf Ebrahimi void Ldmfd(Condition cond, 2041*f5c631daSSadaf Ebrahimi Register rn, 2042*f5c631daSSadaf Ebrahimi WriteBack write_back, 2043*f5c631daSSadaf Ebrahimi RegisterList registers) { 2044*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2045*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2046*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2047*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2048*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2049*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2050*f5c631daSSadaf Ebrahimi ldmfd(cond, rn, write_back, registers); 2051*f5c631daSSadaf Ebrahimi } Ldmfd(Register rn,WriteBack write_back,RegisterList registers)2052*f5c631daSSadaf Ebrahimi void Ldmfd(Register rn, WriteBack write_back, RegisterList registers) { 2053*f5c631daSSadaf Ebrahimi Ldmfd(al, rn, write_back, registers); 2054*f5c631daSSadaf Ebrahimi } 2055*f5c631daSSadaf Ebrahimi Ldmib(Condition cond,Register rn,WriteBack write_back,RegisterList registers)2056*f5c631daSSadaf Ebrahimi void Ldmib(Condition cond, 2057*f5c631daSSadaf Ebrahimi Register rn, 2058*f5c631daSSadaf Ebrahimi WriteBack write_back, 2059*f5c631daSSadaf Ebrahimi RegisterList registers) { 2060*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2061*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2062*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2063*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2064*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2065*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2066*f5c631daSSadaf Ebrahimi ldmib(cond, rn, write_back, registers); 2067*f5c631daSSadaf Ebrahimi } Ldmib(Register rn,WriteBack write_back,RegisterList registers)2068*f5c631daSSadaf Ebrahimi void Ldmib(Register rn, WriteBack write_back, RegisterList registers) { 2069*f5c631daSSadaf Ebrahimi Ldmib(al, rn, write_back, registers); 2070*f5c631daSSadaf Ebrahimi } 2071*f5c631daSSadaf Ebrahimi Ldr(Condition cond,Register rt,const MemOperand & operand)2072*f5c631daSSadaf Ebrahimi void Ldr(Condition cond, Register rt, const MemOperand& operand) { 2073*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2074*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2075*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2076*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2077*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2078*f5c631daSSadaf Ebrahimi bool can_use_it = 2079*f5c631daSSadaf Ebrahimi // LDR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1 2080*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && rt.IsLow() && 2081*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow() && 2082*f5c631daSSadaf Ebrahimi operand.IsOffsetImmediateWithinRange(0, 124, 4) && 2083*f5c631daSSadaf Ebrahimi (operand.GetAddrMode() == Offset)) || 2084*f5c631daSSadaf Ebrahimi // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2 2085*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && rt.IsLow() && 2086*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsSP() && 2087*f5c631daSSadaf Ebrahimi operand.IsOffsetImmediateWithinRange(0, 1020, 4) && 2088*f5c631daSSadaf Ebrahimi (operand.GetAddrMode() == Offset)) || 2089*f5c631daSSadaf Ebrahimi // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 2090*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && rt.IsLow() && 2091*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow() && 2092*f5c631daSSadaf Ebrahimi operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 2093*f5c631daSSadaf Ebrahimi (operand.GetAddrMode() == Offset)); 2094*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2095*f5c631daSSadaf Ebrahimi ldr(cond, rt, operand); 2096*f5c631daSSadaf Ebrahimi } Ldr(Register rt,const MemOperand & operand)2097*f5c631daSSadaf Ebrahimi void Ldr(Register rt, const MemOperand& operand) { Ldr(al, rt, operand); } 2098*f5c631daSSadaf Ebrahimi 2099*f5c631daSSadaf Ebrahimi Ldrb(Condition cond,Register rt,const MemOperand & operand)2100*f5c631daSSadaf Ebrahimi void Ldrb(Condition cond, Register rt, const MemOperand& operand) { 2101*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2102*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2103*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2104*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2105*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2106*f5c631daSSadaf Ebrahimi bool can_use_it = 2107*f5c631daSSadaf Ebrahimi // LDRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1 2108*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && rt.IsLow() && 2109*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow() && 2110*f5c631daSSadaf Ebrahimi operand.IsOffsetImmediateWithinRange(0, 31) && 2111*f5c631daSSadaf Ebrahimi (operand.GetAddrMode() == Offset)) || 2112*f5c631daSSadaf Ebrahimi // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 2113*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && rt.IsLow() && 2114*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow() && 2115*f5c631daSSadaf Ebrahimi operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 2116*f5c631daSSadaf Ebrahimi (operand.GetAddrMode() == Offset)); 2117*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2118*f5c631daSSadaf Ebrahimi ldrb(cond, rt, operand); 2119*f5c631daSSadaf Ebrahimi } Ldrb(Register rt,const MemOperand & operand)2120*f5c631daSSadaf Ebrahimi void Ldrb(Register rt, const MemOperand& operand) { Ldrb(al, rt, operand); } 2121*f5c631daSSadaf Ebrahimi 2122*f5c631daSSadaf Ebrahimi Ldrd(Condition cond,Register rt,Register rt2,const MemOperand & operand)2123*f5c631daSSadaf Ebrahimi void Ldrd(Condition cond, 2124*f5c631daSSadaf Ebrahimi Register rt, 2125*f5c631daSSadaf Ebrahimi Register rt2, 2126*f5c631daSSadaf Ebrahimi const MemOperand& operand) { 2127*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2128*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 2129*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2130*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2131*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2132*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2133*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2134*f5c631daSSadaf Ebrahimi ldrd(cond, rt, rt2, operand); 2135*f5c631daSSadaf Ebrahimi } Ldrd(Register rt,Register rt2,const MemOperand & operand)2136*f5c631daSSadaf Ebrahimi void Ldrd(Register rt, Register rt2, const MemOperand& operand) { 2137*f5c631daSSadaf Ebrahimi Ldrd(al, rt, rt2, operand); 2138*f5c631daSSadaf Ebrahimi } 2139*f5c631daSSadaf Ebrahimi 2140*f5c631daSSadaf Ebrahimi Ldrex(Condition cond,Register rt,const MemOperand & operand)2141*f5c631daSSadaf Ebrahimi void Ldrex(Condition cond, Register rt, const MemOperand& operand) { 2142*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2143*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2144*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2145*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2146*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2147*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2148*f5c631daSSadaf Ebrahimi ldrex(cond, rt, operand); 2149*f5c631daSSadaf Ebrahimi } Ldrex(Register rt,const MemOperand & operand)2150*f5c631daSSadaf Ebrahimi void Ldrex(Register rt, const MemOperand& operand) { Ldrex(al, rt, operand); } 2151*f5c631daSSadaf Ebrahimi Ldrexb(Condition cond,Register rt,const MemOperand & operand)2152*f5c631daSSadaf Ebrahimi void Ldrexb(Condition cond, Register rt, const MemOperand& operand) { 2153*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2154*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2155*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2156*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2157*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2158*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2159*f5c631daSSadaf Ebrahimi ldrexb(cond, rt, operand); 2160*f5c631daSSadaf Ebrahimi } Ldrexb(Register rt,const MemOperand & operand)2161*f5c631daSSadaf Ebrahimi void Ldrexb(Register rt, const MemOperand& operand) { 2162*f5c631daSSadaf Ebrahimi Ldrexb(al, rt, operand); 2163*f5c631daSSadaf Ebrahimi } 2164*f5c631daSSadaf Ebrahimi Ldrexd(Condition cond,Register rt,Register rt2,const MemOperand & operand)2165*f5c631daSSadaf Ebrahimi void Ldrexd(Condition cond, 2166*f5c631daSSadaf Ebrahimi Register rt, 2167*f5c631daSSadaf Ebrahimi Register rt2, 2168*f5c631daSSadaf Ebrahimi const MemOperand& operand) { 2169*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2170*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 2171*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2172*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2173*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2174*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2175*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2176*f5c631daSSadaf Ebrahimi ldrexd(cond, rt, rt2, operand); 2177*f5c631daSSadaf Ebrahimi } Ldrexd(Register rt,Register rt2,const MemOperand & operand)2178*f5c631daSSadaf Ebrahimi void Ldrexd(Register rt, Register rt2, const MemOperand& operand) { 2179*f5c631daSSadaf Ebrahimi Ldrexd(al, rt, rt2, operand); 2180*f5c631daSSadaf Ebrahimi } 2181*f5c631daSSadaf Ebrahimi Ldrexh(Condition cond,Register rt,const MemOperand & operand)2182*f5c631daSSadaf Ebrahimi void Ldrexh(Condition cond, Register rt, const MemOperand& operand) { 2183*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2184*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2185*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2186*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2187*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2188*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2189*f5c631daSSadaf Ebrahimi ldrexh(cond, rt, operand); 2190*f5c631daSSadaf Ebrahimi } Ldrexh(Register rt,const MemOperand & operand)2191*f5c631daSSadaf Ebrahimi void Ldrexh(Register rt, const MemOperand& operand) { 2192*f5c631daSSadaf Ebrahimi Ldrexh(al, rt, operand); 2193*f5c631daSSadaf Ebrahimi } 2194*f5c631daSSadaf Ebrahimi Ldrh(Condition cond,Register rt,const MemOperand & operand)2195*f5c631daSSadaf Ebrahimi void Ldrh(Condition cond, Register rt, const MemOperand& operand) { 2196*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2197*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2198*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2199*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2200*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2201*f5c631daSSadaf Ebrahimi bool can_use_it = 2202*f5c631daSSadaf Ebrahimi // LDRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1 2203*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && rt.IsLow() && 2204*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow() && 2205*f5c631daSSadaf Ebrahimi operand.IsOffsetImmediateWithinRange(0, 62, 2) && 2206*f5c631daSSadaf Ebrahimi (operand.GetAddrMode() == Offset)) || 2207*f5c631daSSadaf Ebrahimi // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 2208*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && rt.IsLow() && 2209*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow() && 2210*f5c631daSSadaf Ebrahimi operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 2211*f5c631daSSadaf Ebrahimi (operand.GetAddrMode() == Offset)); 2212*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2213*f5c631daSSadaf Ebrahimi ldrh(cond, rt, operand); 2214*f5c631daSSadaf Ebrahimi } Ldrh(Register rt,const MemOperand & operand)2215*f5c631daSSadaf Ebrahimi void Ldrh(Register rt, const MemOperand& operand) { Ldrh(al, rt, operand); } 2216*f5c631daSSadaf Ebrahimi 2217*f5c631daSSadaf Ebrahimi Ldrsb(Condition cond,Register rt,const MemOperand & operand)2218*f5c631daSSadaf Ebrahimi void Ldrsb(Condition cond, Register rt, const MemOperand& operand) { 2219*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2220*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2221*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2222*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2223*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2224*f5c631daSSadaf Ebrahimi bool can_use_it = 2225*f5c631daSSadaf Ebrahimi // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 2226*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rt.IsLow() && 2227*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow() && 2228*f5c631daSSadaf Ebrahimi operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 2229*f5c631daSSadaf Ebrahimi (operand.GetAddrMode() == Offset); 2230*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2231*f5c631daSSadaf Ebrahimi ldrsb(cond, rt, operand); 2232*f5c631daSSadaf Ebrahimi } Ldrsb(Register rt,const MemOperand & operand)2233*f5c631daSSadaf Ebrahimi void Ldrsb(Register rt, const MemOperand& operand) { Ldrsb(al, rt, operand); } 2234*f5c631daSSadaf Ebrahimi 2235*f5c631daSSadaf Ebrahimi Ldrsh(Condition cond,Register rt,const MemOperand & operand)2236*f5c631daSSadaf Ebrahimi void Ldrsh(Condition cond, Register rt, const MemOperand& operand) { 2237*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2238*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2239*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2240*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2241*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2242*f5c631daSSadaf Ebrahimi bool can_use_it = 2243*f5c631daSSadaf Ebrahimi // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 2244*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rt.IsLow() && 2245*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow() && 2246*f5c631daSSadaf Ebrahimi operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 2247*f5c631daSSadaf Ebrahimi (operand.GetAddrMode() == Offset); 2248*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2249*f5c631daSSadaf Ebrahimi ldrsh(cond, rt, operand); 2250*f5c631daSSadaf Ebrahimi } Ldrsh(Register rt,const MemOperand & operand)2251*f5c631daSSadaf Ebrahimi void Ldrsh(Register rt, const MemOperand& operand) { Ldrsh(al, rt, operand); } 2252*f5c631daSSadaf Ebrahimi 2253*f5c631daSSadaf Ebrahimi Lsl(Condition cond,Register rd,Register rm,const Operand & operand)2254*f5c631daSSadaf Ebrahimi void Lsl(Condition cond, Register rd, Register rm, const Operand& operand) { 2255*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2256*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2257*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2258*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2259*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2260*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2261*f5c631daSSadaf Ebrahimi bool can_use_it = 2262*f5c631daSSadaf Ebrahimi // LSL<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2 2263*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && (operand.GetImmediate() >= 1) && 2264*f5c631daSSadaf Ebrahimi (operand.GetImmediate() <= 31) && rd.IsLow() && rm.IsLow()) || 2265*f5c631daSSadaf Ebrahimi // LSL<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1 2266*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() && 2267*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow()); 2268*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2269*f5c631daSSadaf Ebrahimi lsl(cond, rd, rm, operand); 2270*f5c631daSSadaf Ebrahimi } Lsl(Register rd,Register rm,const Operand & operand)2271*f5c631daSSadaf Ebrahimi void Lsl(Register rd, Register rm, const Operand& operand) { 2272*f5c631daSSadaf Ebrahimi Lsl(al, rd, rm, operand); 2273*f5c631daSSadaf Ebrahimi } Lsl(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)2274*f5c631daSSadaf Ebrahimi void Lsl(FlagsUpdate flags, 2275*f5c631daSSadaf Ebrahimi Condition cond, 2276*f5c631daSSadaf Ebrahimi Register rd, 2277*f5c631daSSadaf Ebrahimi Register rm, 2278*f5c631daSSadaf Ebrahimi const Operand& operand) { 2279*f5c631daSSadaf Ebrahimi switch (flags) { 2280*f5c631daSSadaf Ebrahimi case LeaveFlags: 2281*f5c631daSSadaf Ebrahimi Lsl(cond, rd, rm, operand); 2282*f5c631daSSadaf Ebrahimi break; 2283*f5c631daSSadaf Ebrahimi case SetFlags: 2284*f5c631daSSadaf Ebrahimi Lsls(cond, rd, rm, operand); 2285*f5c631daSSadaf Ebrahimi break; 2286*f5c631daSSadaf Ebrahimi case DontCare: 2287*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = 2288*f5c631daSSadaf Ebrahimi IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() && 2289*f5c631daSSadaf Ebrahimi ((operand.IsImmediate() && (operand.GetImmediate() >= 1) && 2290*f5c631daSSadaf Ebrahimi (operand.GetImmediate() < 32)) || 2291*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && rd.Is(rm))); 2292*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 2293*f5c631daSSadaf Ebrahimi Lsls(cond, rd, rm, operand); 2294*f5c631daSSadaf Ebrahimi } else { 2295*f5c631daSSadaf Ebrahimi Lsl(cond, rd, rm, operand); 2296*f5c631daSSadaf Ebrahimi } 2297*f5c631daSSadaf Ebrahimi break; 2298*f5c631daSSadaf Ebrahimi } 2299*f5c631daSSadaf Ebrahimi } Lsl(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)2300*f5c631daSSadaf Ebrahimi void Lsl(FlagsUpdate flags, 2301*f5c631daSSadaf Ebrahimi Register rd, 2302*f5c631daSSadaf Ebrahimi Register rm, 2303*f5c631daSSadaf Ebrahimi const Operand& operand) { 2304*f5c631daSSadaf Ebrahimi Lsl(flags, al, rd, rm, operand); 2305*f5c631daSSadaf Ebrahimi } 2306*f5c631daSSadaf Ebrahimi Lsls(Condition cond,Register rd,Register rm,const Operand & operand)2307*f5c631daSSadaf Ebrahimi void Lsls(Condition cond, Register rd, Register rm, const Operand& operand) { 2308*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2309*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2310*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2311*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2312*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2313*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2314*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2315*f5c631daSSadaf Ebrahimi lsls(cond, rd, rm, operand); 2316*f5c631daSSadaf Ebrahimi } Lsls(Register rd,Register rm,const Operand & operand)2317*f5c631daSSadaf Ebrahimi void Lsls(Register rd, Register rm, const Operand& operand) { 2318*f5c631daSSadaf Ebrahimi Lsls(al, rd, rm, operand); 2319*f5c631daSSadaf Ebrahimi } 2320*f5c631daSSadaf Ebrahimi Lsr(Condition cond,Register rd,Register rm,const Operand & operand)2321*f5c631daSSadaf Ebrahimi void Lsr(Condition cond, Register rd, Register rm, const Operand& operand) { 2322*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2323*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2324*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2325*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2326*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2327*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2328*f5c631daSSadaf Ebrahimi bool can_use_it = 2329*f5c631daSSadaf Ebrahimi // LSR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2 2330*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && (operand.GetImmediate() >= 1) && 2331*f5c631daSSadaf Ebrahimi (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) || 2332*f5c631daSSadaf Ebrahimi // LSR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1 2333*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() && 2334*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow()); 2335*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2336*f5c631daSSadaf Ebrahimi lsr(cond, rd, rm, operand); 2337*f5c631daSSadaf Ebrahimi } Lsr(Register rd,Register rm,const Operand & operand)2338*f5c631daSSadaf Ebrahimi void Lsr(Register rd, Register rm, const Operand& operand) { 2339*f5c631daSSadaf Ebrahimi Lsr(al, rd, rm, operand); 2340*f5c631daSSadaf Ebrahimi } Lsr(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)2341*f5c631daSSadaf Ebrahimi void Lsr(FlagsUpdate flags, 2342*f5c631daSSadaf Ebrahimi Condition cond, 2343*f5c631daSSadaf Ebrahimi Register rd, 2344*f5c631daSSadaf Ebrahimi Register rm, 2345*f5c631daSSadaf Ebrahimi const Operand& operand) { 2346*f5c631daSSadaf Ebrahimi switch (flags) { 2347*f5c631daSSadaf Ebrahimi case LeaveFlags: 2348*f5c631daSSadaf Ebrahimi Lsr(cond, rd, rm, operand); 2349*f5c631daSSadaf Ebrahimi break; 2350*f5c631daSSadaf Ebrahimi case SetFlags: 2351*f5c631daSSadaf Ebrahimi Lsrs(cond, rd, rm, operand); 2352*f5c631daSSadaf Ebrahimi break; 2353*f5c631daSSadaf Ebrahimi case DontCare: 2354*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = 2355*f5c631daSSadaf Ebrahimi IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() && 2356*f5c631daSSadaf Ebrahimi ((operand.IsImmediate() && (operand.GetImmediate() >= 1) && 2357*f5c631daSSadaf Ebrahimi (operand.GetImmediate() <= 32)) || 2358*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && rd.Is(rm))); 2359*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 2360*f5c631daSSadaf Ebrahimi Lsrs(cond, rd, rm, operand); 2361*f5c631daSSadaf Ebrahimi } else { 2362*f5c631daSSadaf Ebrahimi Lsr(cond, rd, rm, operand); 2363*f5c631daSSadaf Ebrahimi } 2364*f5c631daSSadaf Ebrahimi break; 2365*f5c631daSSadaf Ebrahimi } 2366*f5c631daSSadaf Ebrahimi } Lsr(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)2367*f5c631daSSadaf Ebrahimi void Lsr(FlagsUpdate flags, 2368*f5c631daSSadaf Ebrahimi Register rd, 2369*f5c631daSSadaf Ebrahimi Register rm, 2370*f5c631daSSadaf Ebrahimi const Operand& operand) { 2371*f5c631daSSadaf Ebrahimi Lsr(flags, al, rd, rm, operand); 2372*f5c631daSSadaf Ebrahimi } 2373*f5c631daSSadaf Ebrahimi Lsrs(Condition cond,Register rd,Register rm,const Operand & operand)2374*f5c631daSSadaf Ebrahimi void Lsrs(Condition cond, Register rd, Register rm, const Operand& operand) { 2375*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2376*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2377*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2378*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2379*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2380*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2381*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2382*f5c631daSSadaf Ebrahimi lsrs(cond, rd, rm, operand); 2383*f5c631daSSadaf Ebrahimi } Lsrs(Register rd,Register rm,const Operand & operand)2384*f5c631daSSadaf Ebrahimi void Lsrs(Register rd, Register rm, const Operand& operand) { 2385*f5c631daSSadaf Ebrahimi Lsrs(al, rd, rm, operand); 2386*f5c631daSSadaf Ebrahimi } 2387*f5c631daSSadaf Ebrahimi Mla(Condition cond,Register rd,Register rn,Register rm,Register ra)2388*f5c631daSSadaf Ebrahimi void Mla(Condition cond, Register rd, Register rn, Register rm, Register ra) { 2389*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2390*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2391*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2392*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 2393*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2394*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2395*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2396*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2397*f5c631daSSadaf Ebrahimi mla(cond, rd, rn, rm, ra); 2398*f5c631daSSadaf Ebrahimi } Mla(Register rd,Register rn,Register rm,Register ra)2399*f5c631daSSadaf Ebrahimi void Mla(Register rd, Register rn, Register rm, Register ra) { 2400*f5c631daSSadaf Ebrahimi Mla(al, rd, rn, rm, ra); 2401*f5c631daSSadaf Ebrahimi } Mla(FlagsUpdate flags,Condition cond,Register rd,Register rn,Register rm,Register ra)2402*f5c631daSSadaf Ebrahimi void Mla(FlagsUpdate flags, 2403*f5c631daSSadaf Ebrahimi Condition cond, 2404*f5c631daSSadaf Ebrahimi Register rd, 2405*f5c631daSSadaf Ebrahimi Register rn, 2406*f5c631daSSadaf Ebrahimi Register rm, 2407*f5c631daSSadaf Ebrahimi Register ra) { 2408*f5c631daSSadaf Ebrahimi switch (flags) { 2409*f5c631daSSadaf Ebrahimi case LeaveFlags: 2410*f5c631daSSadaf Ebrahimi Mla(cond, rd, rn, rm, ra); 2411*f5c631daSSadaf Ebrahimi break; 2412*f5c631daSSadaf Ebrahimi case SetFlags: 2413*f5c631daSSadaf Ebrahimi Mlas(cond, rd, rn, rm, ra); 2414*f5c631daSSadaf Ebrahimi break; 2415*f5c631daSSadaf Ebrahimi case DontCare: 2416*f5c631daSSadaf Ebrahimi Mla(cond, rd, rn, rm, ra); 2417*f5c631daSSadaf Ebrahimi break; 2418*f5c631daSSadaf Ebrahimi } 2419*f5c631daSSadaf Ebrahimi } Mla(FlagsUpdate flags,Register rd,Register rn,Register rm,Register ra)2420*f5c631daSSadaf Ebrahimi void Mla( 2421*f5c631daSSadaf Ebrahimi FlagsUpdate flags, Register rd, Register rn, Register rm, Register ra) { 2422*f5c631daSSadaf Ebrahimi Mla(flags, al, rd, rn, rm, ra); 2423*f5c631daSSadaf Ebrahimi } 2424*f5c631daSSadaf Ebrahimi Mlas(Condition cond,Register rd,Register rn,Register rm,Register ra)2425*f5c631daSSadaf Ebrahimi void Mlas( 2426*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 2427*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2428*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2429*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2430*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 2431*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2432*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2433*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2434*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2435*f5c631daSSadaf Ebrahimi mlas(cond, rd, rn, rm, ra); 2436*f5c631daSSadaf Ebrahimi } Mlas(Register rd,Register rn,Register rm,Register ra)2437*f5c631daSSadaf Ebrahimi void Mlas(Register rd, Register rn, Register rm, Register ra) { 2438*f5c631daSSadaf Ebrahimi Mlas(al, rd, rn, rm, ra); 2439*f5c631daSSadaf Ebrahimi } 2440*f5c631daSSadaf Ebrahimi Mls(Condition cond,Register rd,Register rn,Register rm,Register ra)2441*f5c631daSSadaf Ebrahimi void Mls(Condition cond, Register rd, Register rn, Register rm, Register ra) { 2442*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2443*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2444*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2445*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 2446*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2447*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2448*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2449*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2450*f5c631daSSadaf Ebrahimi mls(cond, rd, rn, rm, ra); 2451*f5c631daSSadaf Ebrahimi } Mls(Register rd,Register rn,Register rm,Register ra)2452*f5c631daSSadaf Ebrahimi void Mls(Register rd, Register rn, Register rm, Register ra) { 2453*f5c631daSSadaf Ebrahimi Mls(al, rd, rn, rm, ra); 2454*f5c631daSSadaf Ebrahimi } 2455*f5c631daSSadaf Ebrahimi Mov(Condition cond,Register rd,const Operand & operand)2456*f5c631daSSadaf Ebrahimi void Mov(Condition cond, Register rd, const Operand& operand) { 2457*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2458*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2459*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2460*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2461*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2462*f5c631daSSadaf Ebrahimi if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) { 2463*f5c631daSSadaf Ebrahimi return; 2464*f5c631daSSadaf Ebrahimi } 2465*f5c631daSSadaf Ebrahimi bool can_use_it = 2466*f5c631daSSadaf Ebrahimi // MOV<c>{<q>} <Rd>, #<imm8> ; T1 2467*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && rd.IsLow() && 2468*f5c631daSSadaf Ebrahimi (operand.GetImmediate() <= 255)) || 2469*f5c631daSSadaf Ebrahimi // MOV{<c>}{<q>} <Rd>, <Rm> ; T1 2470*f5c631daSSadaf Ebrahimi (operand.IsPlainRegister() && !rd.IsPC() && 2471*f5c631daSSadaf Ebrahimi !operand.GetBaseRegister().IsPC()) || 2472*f5c631daSSadaf Ebrahimi // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount>} ; T2 2473*f5c631daSSadaf Ebrahimi (operand.IsImmediateShiftedRegister() && rd.IsLow() && 2474*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow() && 2475*f5c631daSSadaf Ebrahimi (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) || 2476*f5c631daSSadaf Ebrahimi operand.GetShift().Is(ASR))) || 2477*f5c631daSSadaf Ebrahimi // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1 2478*f5c631daSSadaf Ebrahimi // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1 2479*f5c631daSSadaf Ebrahimi // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1 2480*f5c631daSSadaf Ebrahimi // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1 2481*f5c631daSSadaf Ebrahimi (operand.IsRegisterShiftedRegister() && 2482*f5c631daSSadaf Ebrahimi rd.Is(operand.GetBaseRegister()) && rd.IsLow() && 2483*f5c631daSSadaf Ebrahimi (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) || 2484*f5c631daSSadaf Ebrahimi operand.GetShift().Is(ASR) || operand.GetShift().Is(ROR)) && 2485*f5c631daSSadaf Ebrahimi operand.GetShiftRegister().IsLow()); 2486*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2487*f5c631daSSadaf Ebrahimi mov(cond, rd, operand); 2488*f5c631daSSadaf Ebrahimi } Mov(Register rd,const Operand & operand)2489*f5c631daSSadaf Ebrahimi void Mov(Register rd, const Operand& operand) { Mov(al, rd, operand); } Mov(FlagsUpdate flags,Condition cond,Register rd,const Operand & operand)2490*f5c631daSSadaf Ebrahimi void Mov(FlagsUpdate flags, 2491*f5c631daSSadaf Ebrahimi Condition cond, 2492*f5c631daSSadaf Ebrahimi Register rd, 2493*f5c631daSSadaf Ebrahimi const Operand& operand) { 2494*f5c631daSSadaf Ebrahimi switch (flags) { 2495*f5c631daSSadaf Ebrahimi case LeaveFlags: 2496*f5c631daSSadaf Ebrahimi Mov(cond, rd, operand); 2497*f5c631daSSadaf Ebrahimi break; 2498*f5c631daSSadaf Ebrahimi case SetFlags: 2499*f5c631daSSadaf Ebrahimi Movs(cond, rd, operand); 2500*f5c631daSSadaf Ebrahimi break; 2501*f5c631daSSadaf Ebrahimi case DontCare: 2502*f5c631daSSadaf Ebrahimi if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) { 2503*f5c631daSSadaf Ebrahimi return; 2504*f5c631daSSadaf Ebrahimi } 2505*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = 2506*f5c631daSSadaf Ebrahimi IsUsingT32() && cond.Is(al) && 2507*f5c631daSSadaf Ebrahimi ((operand.IsImmediateShiftedRegister() && rd.IsLow() && 2508*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow() && 2509*f5c631daSSadaf Ebrahimi (operand.GetShiftAmount() >= 1) && 2510*f5c631daSSadaf Ebrahimi (((operand.GetShiftAmount() <= 32) && 2511*f5c631daSSadaf Ebrahimi ((operand.GetShift().IsLSR() || operand.GetShift().IsASR()))) || 2512*f5c631daSSadaf Ebrahimi ((operand.GetShiftAmount() < 32) && 2513*f5c631daSSadaf Ebrahimi operand.GetShift().IsLSL()))) || 2514*f5c631daSSadaf Ebrahimi (operand.IsRegisterShiftedRegister() && rd.IsLow() && 2515*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().Is(rd) && 2516*f5c631daSSadaf Ebrahimi operand.GetShiftRegister().IsLow() && 2517*f5c631daSSadaf Ebrahimi (operand.GetShift().IsLSL() || operand.GetShift().IsLSR() || 2518*f5c631daSSadaf Ebrahimi operand.GetShift().IsASR() || operand.GetShift().IsROR())) || 2519*f5c631daSSadaf Ebrahimi (operand.IsImmediate() && rd.IsLow() && 2520*f5c631daSSadaf Ebrahimi (operand.GetImmediate() < 256))); 2521*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 2522*f5c631daSSadaf Ebrahimi Movs(cond, rd, operand); 2523*f5c631daSSadaf Ebrahimi } else { 2524*f5c631daSSadaf Ebrahimi Mov(cond, rd, operand); 2525*f5c631daSSadaf Ebrahimi } 2526*f5c631daSSadaf Ebrahimi break; 2527*f5c631daSSadaf Ebrahimi } 2528*f5c631daSSadaf Ebrahimi } Mov(FlagsUpdate flags,Register rd,const Operand & operand)2529*f5c631daSSadaf Ebrahimi void Mov(FlagsUpdate flags, Register rd, const Operand& operand) { 2530*f5c631daSSadaf Ebrahimi Mov(flags, al, rd, operand); 2531*f5c631daSSadaf Ebrahimi } 2532*f5c631daSSadaf Ebrahimi Movs(Condition cond,Register rd,const Operand & operand)2533*f5c631daSSadaf Ebrahimi void Movs(Condition cond, Register rd, const Operand& operand) { 2534*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2535*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2536*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2537*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2538*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2539*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2540*f5c631daSSadaf Ebrahimi movs(cond, rd, operand); 2541*f5c631daSSadaf Ebrahimi } Movs(Register rd,const Operand & operand)2542*f5c631daSSadaf Ebrahimi void Movs(Register rd, const Operand& operand) { Movs(al, rd, operand); } 2543*f5c631daSSadaf Ebrahimi Movt(Condition cond,Register rd,const Operand & operand)2544*f5c631daSSadaf Ebrahimi void Movt(Condition cond, Register rd, const Operand& operand) { 2545*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2546*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2547*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2548*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2549*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2550*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2551*f5c631daSSadaf Ebrahimi movt(cond, rd, operand); 2552*f5c631daSSadaf Ebrahimi } Movt(Register rd,const Operand & operand)2553*f5c631daSSadaf Ebrahimi void Movt(Register rd, const Operand& operand) { Movt(al, rd, operand); } 2554*f5c631daSSadaf Ebrahimi Mrs(Condition cond,Register rd,SpecialRegister spec_reg)2555*f5c631daSSadaf Ebrahimi void Mrs(Condition cond, Register rd, SpecialRegister spec_reg) { 2556*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2557*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2558*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2559*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2560*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2561*f5c631daSSadaf Ebrahimi mrs(cond, rd, spec_reg); 2562*f5c631daSSadaf Ebrahimi } Mrs(Register rd,SpecialRegister spec_reg)2563*f5c631daSSadaf Ebrahimi void Mrs(Register rd, SpecialRegister spec_reg) { Mrs(al, rd, spec_reg); } 2564*f5c631daSSadaf Ebrahimi Msr(Condition cond,MaskedSpecialRegister spec_reg,const Operand & operand)2565*f5c631daSSadaf Ebrahimi void Msr(Condition cond, 2566*f5c631daSSadaf Ebrahimi MaskedSpecialRegister spec_reg, 2567*f5c631daSSadaf Ebrahimi const Operand& operand) { 2568*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2569*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2570*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2571*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2572*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2573*f5c631daSSadaf Ebrahimi msr(cond, spec_reg, operand); 2574*f5c631daSSadaf Ebrahimi } Msr(MaskedSpecialRegister spec_reg,const Operand & operand)2575*f5c631daSSadaf Ebrahimi void Msr(MaskedSpecialRegister spec_reg, const Operand& operand) { 2576*f5c631daSSadaf Ebrahimi Msr(al, spec_reg, operand); 2577*f5c631daSSadaf Ebrahimi } 2578*f5c631daSSadaf Ebrahimi Mul(Condition cond,Register rd,Register rn,Register rm)2579*f5c631daSSadaf Ebrahimi void Mul(Condition cond, Register rd, Register rn, Register rm) { 2580*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2581*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2582*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2583*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2584*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2585*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2586*f5c631daSSadaf Ebrahimi bool can_use_it = 2587*f5c631daSSadaf Ebrahimi // MUL<c>{<q>} <Rdm>, <Rn>{, <Rdm>} ; T1 2588*f5c631daSSadaf Ebrahimi rd.Is(rm) && rn.IsLow() && rm.IsLow(); 2589*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2590*f5c631daSSadaf Ebrahimi mul(cond, rd, rn, rm); 2591*f5c631daSSadaf Ebrahimi } Mul(Register rd,Register rn,Register rm)2592*f5c631daSSadaf Ebrahimi void Mul(Register rd, Register rn, Register rm) { Mul(al, rd, rn, rm); } Mul(FlagsUpdate flags,Condition cond,Register rd,Register rn,Register rm)2593*f5c631daSSadaf Ebrahimi void Mul(FlagsUpdate flags, 2594*f5c631daSSadaf Ebrahimi Condition cond, 2595*f5c631daSSadaf Ebrahimi Register rd, 2596*f5c631daSSadaf Ebrahimi Register rn, 2597*f5c631daSSadaf Ebrahimi Register rm) { 2598*f5c631daSSadaf Ebrahimi switch (flags) { 2599*f5c631daSSadaf Ebrahimi case LeaveFlags: 2600*f5c631daSSadaf Ebrahimi Mul(cond, rd, rn, rm); 2601*f5c631daSSadaf Ebrahimi break; 2602*f5c631daSSadaf Ebrahimi case SetFlags: 2603*f5c631daSSadaf Ebrahimi Muls(cond, rd, rn, rm); 2604*f5c631daSSadaf Ebrahimi break; 2605*f5c631daSSadaf Ebrahimi case DontCare: 2606*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 2607*f5c631daSSadaf Ebrahimi rn.IsLow() && rm.Is(rd); 2608*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 2609*f5c631daSSadaf Ebrahimi Muls(cond, rd, rn, rm); 2610*f5c631daSSadaf Ebrahimi } else { 2611*f5c631daSSadaf Ebrahimi Mul(cond, rd, rn, rm); 2612*f5c631daSSadaf Ebrahimi } 2613*f5c631daSSadaf Ebrahimi break; 2614*f5c631daSSadaf Ebrahimi } 2615*f5c631daSSadaf Ebrahimi } Mul(FlagsUpdate flags,Register rd,Register rn,Register rm)2616*f5c631daSSadaf Ebrahimi void Mul(FlagsUpdate flags, Register rd, Register rn, Register rm) { 2617*f5c631daSSadaf Ebrahimi Mul(flags, al, rd, rn, rm); 2618*f5c631daSSadaf Ebrahimi } 2619*f5c631daSSadaf Ebrahimi Muls(Condition cond,Register rd,Register rn,Register rm)2620*f5c631daSSadaf Ebrahimi void Muls(Condition cond, Register rd, Register rn, Register rm) { 2621*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2622*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2623*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2624*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2625*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2626*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2627*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2628*f5c631daSSadaf Ebrahimi muls(cond, rd, rn, rm); 2629*f5c631daSSadaf Ebrahimi } Muls(Register rd,Register rn,Register rm)2630*f5c631daSSadaf Ebrahimi void Muls(Register rd, Register rn, Register rm) { Muls(al, rd, rn, rm); } 2631*f5c631daSSadaf Ebrahimi Mvn(Condition cond,Register rd,const Operand & operand)2632*f5c631daSSadaf Ebrahimi void Mvn(Condition cond, Register rd, const Operand& operand) { 2633*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2634*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2635*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2636*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2637*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2638*f5c631daSSadaf Ebrahimi bool can_use_it = 2639*f5c631daSSadaf Ebrahimi // MVN<c>{<q>} <Rd>, <Rm> ; T1 2640*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rd.IsLow() && 2641*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 2642*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2643*f5c631daSSadaf Ebrahimi mvn(cond, rd, operand); 2644*f5c631daSSadaf Ebrahimi } Mvn(Register rd,const Operand & operand)2645*f5c631daSSadaf Ebrahimi void Mvn(Register rd, const Operand& operand) { Mvn(al, rd, operand); } Mvn(FlagsUpdate flags,Condition cond,Register rd,const Operand & operand)2646*f5c631daSSadaf Ebrahimi void Mvn(FlagsUpdate flags, 2647*f5c631daSSadaf Ebrahimi Condition cond, 2648*f5c631daSSadaf Ebrahimi Register rd, 2649*f5c631daSSadaf Ebrahimi const Operand& operand) { 2650*f5c631daSSadaf Ebrahimi switch (flags) { 2651*f5c631daSSadaf Ebrahimi case LeaveFlags: 2652*f5c631daSSadaf Ebrahimi Mvn(cond, rd, operand); 2653*f5c631daSSadaf Ebrahimi break; 2654*f5c631daSSadaf Ebrahimi case SetFlags: 2655*f5c631daSSadaf Ebrahimi Mvns(cond, rd, operand); 2656*f5c631daSSadaf Ebrahimi break; 2657*f5c631daSSadaf Ebrahimi case DontCare: 2658*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 2659*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && 2660*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 2661*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 2662*f5c631daSSadaf Ebrahimi Mvns(cond, rd, operand); 2663*f5c631daSSadaf Ebrahimi } else { 2664*f5c631daSSadaf Ebrahimi Mvn(cond, rd, operand); 2665*f5c631daSSadaf Ebrahimi } 2666*f5c631daSSadaf Ebrahimi break; 2667*f5c631daSSadaf Ebrahimi } 2668*f5c631daSSadaf Ebrahimi } Mvn(FlagsUpdate flags,Register rd,const Operand & operand)2669*f5c631daSSadaf Ebrahimi void Mvn(FlagsUpdate flags, Register rd, const Operand& operand) { 2670*f5c631daSSadaf Ebrahimi Mvn(flags, al, rd, operand); 2671*f5c631daSSadaf Ebrahimi } 2672*f5c631daSSadaf Ebrahimi Mvns(Condition cond,Register rd,const Operand & operand)2673*f5c631daSSadaf Ebrahimi void Mvns(Condition cond, Register rd, const Operand& operand) { 2674*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2675*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2676*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2677*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2678*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2679*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2680*f5c631daSSadaf Ebrahimi mvns(cond, rd, operand); 2681*f5c631daSSadaf Ebrahimi } Mvns(Register rd,const Operand & operand)2682*f5c631daSSadaf Ebrahimi void Mvns(Register rd, const Operand& operand) { Mvns(al, rd, operand); } 2683*f5c631daSSadaf Ebrahimi Nop(Condition cond)2684*f5c631daSSadaf Ebrahimi void Nop(Condition cond) { 2685*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2686*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2687*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2688*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2689*f5c631daSSadaf Ebrahimi nop(cond); 2690*f5c631daSSadaf Ebrahimi } Nop()2691*f5c631daSSadaf Ebrahimi void Nop() { Nop(al); } 2692*f5c631daSSadaf Ebrahimi Orn(Condition cond,Register rd,Register rn,const Operand & operand)2693*f5c631daSSadaf Ebrahimi void Orn(Condition cond, Register rd, Register rn, const Operand& operand) { 2694*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2695*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2696*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2697*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2698*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2699*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2700*f5c631daSSadaf Ebrahimi if (cond.Is(al) && operand.IsImmediate()) { 2701*f5c631daSSadaf Ebrahimi uint32_t immediate = operand.GetImmediate(); 2702*f5c631daSSadaf Ebrahimi if (immediate == 0) { 2703*f5c631daSSadaf Ebrahimi mvn(rd, 0); 2704*f5c631daSSadaf Ebrahimi return; 2705*f5c631daSSadaf Ebrahimi } 2706*f5c631daSSadaf Ebrahimi if ((immediate == 0xffffffff) && rd.Is(rn)) { 2707*f5c631daSSadaf Ebrahimi return; 2708*f5c631daSSadaf Ebrahimi } 2709*f5c631daSSadaf Ebrahimi } 2710*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2711*f5c631daSSadaf Ebrahimi orn(cond, rd, rn, operand); 2712*f5c631daSSadaf Ebrahimi } Orn(Register rd,Register rn,const Operand & operand)2713*f5c631daSSadaf Ebrahimi void Orn(Register rd, Register rn, const Operand& operand) { 2714*f5c631daSSadaf Ebrahimi Orn(al, rd, rn, operand); 2715*f5c631daSSadaf Ebrahimi } Orn(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)2716*f5c631daSSadaf Ebrahimi void Orn(FlagsUpdate flags, 2717*f5c631daSSadaf Ebrahimi Condition cond, 2718*f5c631daSSadaf Ebrahimi Register rd, 2719*f5c631daSSadaf Ebrahimi Register rn, 2720*f5c631daSSadaf Ebrahimi const Operand& operand) { 2721*f5c631daSSadaf Ebrahimi switch (flags) { 2722*f5c631daSSadaf Ebrahimi case LeaveFlags: 2723*f5c631daSSadaf Ebrahimi Orn(cond, rd, rn, operand); 2724*f5c631daSSadaf Ebrahimi break; 2725*f5c631daSSadaf Ebrahimi case SetFlags: 2726*f5c631daSSadaf Ebrahimi Orns(cond, rd, rn, operand); 2727*f5c631daSSadaf Ebrahimi break; 2728*f5c631daSSadaf Ebrahimi case DontCare: 2729*f5c631daSSadaf Ebrahimi Orn(cond, rd, rn, operand); 2730*f5c631daSSadaf Ebrahimi break; 2731*f5c631daSSadaf Ebrahimi } 2732*f5c631daSSadaf Ebrahimi } Orn(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)2733*f5c631daSSadaf Ebrahimi void Orn(FlagsUpdate flags, 2734*f5c631daSSadaf Ebrahimi Register rd, 2735*f5c631daSSadaf Ebrahimi Register rn, 2736*f5c631daSSadaf Ebrahimi const Operand& operand) { 2737*f5c631daSSadaf Ebrahimi Orn(flags, al, rd, rn, operand); 2738*f5c631daSSadaf Ebrahimi } 2739*f5c631daSSadaf Ebrahimi Orns(Condition cond,Register rd,Register rn,const Operand & operand)2740*f5c631daSSadaf Ebrahimi void Orns(Condition cond, Register rd, Register rn, const Operand& operand) { 2741*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2742*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2743*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2744*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2745*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2746*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2747*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2748*f5c631daSSadaf Ebrahimi orns(cond, rd, rn, operand); 2749*f5c631daSSadaf Ebrahimi } Orns(Register rd,Register rn,const Operand & operand)2750*f5c631daSSadaf Ebrahimi void Orns(Register rd, Register rn, const Operand& operand) { 2751*f5c631daSSadaf Ebrahimi Orns(al, rd, rn, operand); 2752*f5c631daSSadaf Ebrahimi } 2753*f5c631daSSadaf Ebrahimi Orr(Condition cond,Register rd,Register rn,const Operand & operand)2754*f5c631daSSadaf Ebrahimi void Orr(Condition cond, Register rd, Register rn, const Operand& operand) { 2755*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2756*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2757*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2758*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2759*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2760*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2761*f5c631daSSadaf Ebrahimi if (rd.Is(rn) && operand.IsPlainRegister() && 2762*f5c631daSSadaf Ebrahimi rd.Is(operand.GetBaseRegister())) { 2763*f5c631daSSadaf Ebrahimi return; 2764*f5c631daSSadaf Ebrahimi } 2765*f5c631daSSadaf Ebrahimi if (cond.Is(al) && operand.IsImmediate()) { 2766*f5c631daSSadaf Ebrahimi uint32_t immediate = operand.GetImmediate(); 2767*f5c631daSSadaf Ebrahimi if ((immediate == 0) && rd.Is(rn)) { 2768*f5c631daSSadaf Ebrahimi return; 2769*f5c631daSSadaf Ebrahimi } 2770*f5c631daSSadaf Ebrahimi if (immediate == 0xffffffff) { 2771*f5c631daSSadaf Ebrahimi mvn(rd, 0); 2772*f5c631daSSadaf Ebrahimi return; 2773*f5c631daSSadaf Ebrahimi } 2774*f5c631daSSadaf Ebrahimi } 2775*f5c631daSSadaf Ebrahimi bool can_use_it = 2776*f5c631daSSadaf Ebrahimi // ORR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 2777*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() && 2778*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 2779*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 2780*f5c631daSSadaf Ebrahimi orr(cond, rd, rn, operand); 2781*f5c631daSSadaf Ebrahimi } Orr(Register rd,Register rn,const Operand & operand)2782*f5c631daSSadaf Ebrahimi void Orr(Register rd, Register rn, const Operand& operand) { 2783*f5c631daSSadaf Ebrahimi Orr(al, rd, rn, operand); 2784*f5c631daSSadaf Ebrahimi } Orr(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)2785*f5c631daSSadaf Ebrahimi void Orr(FlagsUpdate flags, 2786*f5c631daSSadaf Ebrahimi Condition cond, 2787*f5c631daSSadaf Ebrahimi Register rd, 2788*f5c631daSSadaf Ebrahimi Register rn, 2789*f5c631daSSadaf Ebrahimi const Operand& operand) { 2790*f5c631daSSadaf Ebrahimi switch (flags) { 2791*f5c631daSSadaf Ebrahimi case LeaveFlags: 2792*f5c631daSSadaf Ebrahimi Orr(cond, rd, rn, operand); 2793*f5c631daSSadaf Ebrahimi break; 2794*f5c631daSSadaf Ebrahimi case SetFlags: 2795*f5c631daSSadaf Ebrahimi Orrs(cond, rd, rn, operand); 2796*f5c631daSSadaf Ebrahimi break; 2797*f5c631daSSadaf Ebrahimi case DontCare: 2798*f5c631daSSadaf Ebrahimi if (operand.IsPlainRegister() && rd.Is(rn) && 2799*f5c631daSSadaf Ebrahimi rd.Is(operand.GetBaseRegister())) { 2800*f5c631daSSadaf Ebrahimi return; 2801*f5c631daSSadaf Ebrahimi } 2802*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 2803*f5c631daSSadaf Ebrahimi rn.Is(rd) && operand.IsPlainRegister() && 2804*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 2805*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 2806*f5c631daSSadaf Ebrahimi Orrs(cond, rd, rn, operand); 2807*f5c631daSSadaf Ebrahimi } else { 2808*f5c631daSSadaf Ebrahimi Orr(cond, rd, rn, operand); 2809*f5c631daSSadaf Ebrahimi } 2810*f5c631daSSadaf Ebrahimi break; 2811*f5c631daSSadaf Ebrahimi } 2812*f5c631daSSadaf Ebrahimi } Orr(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)2813*f5c631daSSadaf Ebrahimi void Orr(FlagsUpdate flags, 2814*f5c631daSSadaf Ebrahimi Register rd, 2815*f5c631daSSadaf Ebrahimi Register rn, 2816*f5c631daSSadaf Ebrahimi const Operand& operand) { 2817*f5c631daSSadaf Ebrahimi Orr(flags, al, rd, rn, operand); 2818*f5c631daSSadaf Ebrahimi } 2819*f5c631daSSadaf Ebrahimi Orrs(Condition cond,Register rd,Register rn,const Operand & operand)2820*f5c631daSSadaf Ebrahimi void Orrs(Condition cond, Register rd, Register rn, const Operand& operand) { 2821*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2822*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2823*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2824*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2825*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2826*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2827*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2828*f5c631daSSadaf Ebrahimi orrs(cond, rd, rn, operand); 2829*f5c631daSSadaf Ebrahimi } Orrs(Register rd,Register rn,const Operand & operand)2830*f5c631daSSadaf Ebrahimi void Orrs(Register rd, Register rn, const Operand& operand) { 2831*f5c631daSSadaf Ebrahimi Orrs(al, rd, rn, operand); 2832*f5c631daSSadaf Ebrahimi } 2833*f5c631daSSadaf Ebrahimi Pkhbt(Condition cond,Register rd,Register rn,const Operand & operand)2834*f5c631daSSadaf Ebrahimi void Pkhbt(Condition cond, Register rd, Register rn, const Operand& operand) { 2835*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2836*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2837*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2838*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2839*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2840*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2841*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2842*f5c631daSSadaf Ebrahimi pkhbt(cond, rd, rn, operand); 2843*f5c631daSSadaf Ebrahimi } Pkhbt(Register rd,Register rn,const Operand & operand)2844*f5c631daSSadaf Ebrahimi void Pkhbt(Register rd, Register rn, const Operand& operand) { 2845*f5c631daSSadaf Ebrahimi Pkhbt(al, rd, rn, operand); 2846*f5c631daSSadaf Ebrahimi } 2847*f5c631daSSadaf Ebrahimi Pkhtb(Condition cond,Register rd,Register rn,const Operand & operand)2848*f5c631daSSadaf Ebrahimi void Pkhtb(Condition cond, Register rd, Register rn, const Operand& operand) { 2849*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2850*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2851*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2852*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2853*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2854*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2855*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2856*f5c631daSSadaf Ebrahimi pkhtb(cond, rd, rn, operand); 2857*f5c631daSSadaf Ebrahimi } Pkhtb(Register rd,Register rn,const Operand & operand)2858*f5c631daSSadaf Ebrahimi void Pkhtb(Register rd, Register rn, const Operand& operand) { 2859*f5c631daSSadaf Ebrahimi Pkhtb(al, rd, rn, operand); 2860*f5c631daSSadaf Ebrahimi } 2861*f5c631daSSadaf Ebrahimi 2862*f5c631daSSadaf Ebrahimi Pld(Condition cond,const MemOperand & operand)2863*f5c631daSSadaf Ebrahimi void Pld(Condition cond, const MemOperand& operand) { 2864*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2865*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2866*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2867*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2868*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2869*f5c631daSSadaf Ebrahimi pld(cond, operand); 2870*f5c631daSSadaf Ebrahimi } Pld(const MemOperand & operand)2871*f5c631daSSadaf Ebrahimi void Pld(const MemOperand& operand) { Pld(al, operand); } 2872*f5c631daSSadaf Ebrahimi Pldw(Condition cond,const MemOperand & operand)2873*f5c631daSSadaf Ebrahimi void Pldw(Condition cond, const MemOperand& operand) { 2874*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2875*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2876*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2877*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2878*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2879*f5c631daSSadaf Ebrahimi pldw(cond, operand); 2880*f5c631daSSadaf Ebrahimi } Pldw(const MemOperand & operand)2881*f5c631daSSadaf Ebrahimi void Pldw(const MemOperand& operand) { Pldw(al, operand); } 2882*f5c631daSSadaf Ebrahimi Pli(Condition cond,const MemOperand & operand)2883*f5c631daSSadaf Ebrahimi void Pli(Condition cond, const MemOperand& operand) { 2884*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2885*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2886*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2887*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2888*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2889*f5c631daSSadaf Ebrahimi pli(cond, operand); 2890*f5c631daSSadaf Ebrahimi } Pli(const MemOperand & operand)2891*f5c631daSSadaf Ebrahimi void Pli(const MemOperand& operand) { Pli(al, operand); } 2892*f5c631daSSadaf Ebrahimi 2893*f5c631daSSadaf Ebrahimi Pop(Condition cond,RegisterList registers)2894*f5c631daSSadaf Ebrahimi void Pop(Condition cond, RegisterList registers) { 2895*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2896*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2897*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2898*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2899*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2900*f5c631daSSadaf Ebrahimi if (registers.IsSingleRegister() && 2901*f5c631daSSadaf Ebrahimi (!IsUsingT32() || !registers.IsR0toR7orPC())) { 2902*f5c631daSSadaf Ebrahimi pop(cond, registers.GetFirstAvailableRegister()); 2903*f5c631daSSadaf Ebrahimi } else if (!registers.IsEmpty()) { 2904*f5c631daSSadaf Ebrahimi pop(cond, registers); 2905*f5c631daSSadaf Ebrahimi } 2906*f5c631daSSadaf Ebrahimi } Pop(RegisterList registers)2907*f5c631daSSadaf Ebrahimi void Pop(RegisterList registers) { Pop(al, registers); } 2908*f5c631daSSadaf Ebrahimi Pop(Condition cond,Register rt)2909*f5c631daSSadaf Ebrahimi void Pop(Condition cond, Register rt) { 2910*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2911*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2912*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2913*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2914*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2915*f5c631daSSadaf Ebrahimi pop(cond, rt); 2916*f5c631daSSadaf Ebrahimi } Pop(Register rt)2917*f5c631daSSadaf Ebrahimi void Pop(Register rt) { Pop(al, rt); } 2918*f5c631daSSadaf Ebrahimi Push(Condition cond,RegisterList registers)2919*f5c631daSSadaf Ebrahimi void Push(Condition cond, RegisterList registers) { 2920*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2921*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2922*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2923*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2924*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2925*f5c631daSSadaf Ebrahimi if (registers.IsSingleRegister() && !registers.Includes(sp) && 2926*f5c631daSSadaf Ebrahimi (!IsUsingT32() || !registers.IsR0toR7orLR())) { 2927*f5c631daSSadaf Ebrahimi push(cond, registers.GetFirstAvailableRegister()); 2928*f5c631daSSadaf Ebrahimi } else if (!registers.IsEmpty()) { 2929*f5c631daSSadaf Ebrahimi push(cond, registers); 2930*f5c631daSSadaf Ebrahimi } 2931*f5c631daSSadaf Ebrahimi } Push(RegisterList registers)2932*f5c631daSSadaf Ebrahimi void Push(RegisterList registers) { Push(al, registers); } 2933*f5c631daSSadaf Ebrahimi Push(Condition cond,Register rt)2934*f5c631daSSadaf Ebrahimi void Push(Condition cond, Register rt) { 2935*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2936*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2937*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2938*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2939*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2940*f5c631daSSadaf Ebrahimi if (IsUsingA32() && rt.IsSP()) { 2941*f5c631daSSadaf Ebrahimi // Only the A32 multiple-register form can push sp. 2942*f5c631daSSadaf Ebrahimi push(cond, RegisterList(rt)); 2943*f5c631daSSadaf Ebrahimi } else { 2944*f5c631daSSadaf Ebrahimi push(cond, rt); 2945*f5c631daSSadaf Ebrahimi } 2946*f5c631daSSadaf Ebrahimi } Push(Register rt)2947*f5c631daSSadaf Ebrahimi void Push(Register rt) { Push(al, rt); } 2948*f5c631daSSadaf Ebrahimi Qadd(Condition cond,Register rd,Register rm,Register rn)2949*f5c631daSSadaf Ebrahimi void Qadd(Condition cond, Register rd, Register rm, Register rn) { 2950*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2951*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2952*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2953*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2954*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2955*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2956*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2957*f5c631daSSadaf Ebrahimi qadd(cond, rd, rm, rn); 2958*f5c631daSSadaf Ebrahimi } Qadd(Register rd,Register rm,Register rn)2959*f5c631daSSadaf Ebrahimi void Qadd(Register rd, Register rm, Register rn) { Qadd(al, rd, rm, rn); } 2960*f5c631daSSadaf Ebrahimi Qadd16(Condition cond,Register rd,Register rn,Register rm)2961*f5c631daSSadaf Ebrahimi void Qadd16(Condition cond, Register rd, Register rn, Register rm) { 2962*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2963*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2964*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2965*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2966*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2967*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2968*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2969*f5c631daSSadaf Ebrahimi qadd16(cond, rd, rn, rm); 2970*f5c631daSSadaf Ebrahimi } Qadd16(Register rd,Register rn,Register rm)2971*f5c631daSSadaf Ebrahimi void Qadd16(Register rd, Register rn, Register rm) { Qadd16(al, rd, rn, rm); } 2972*f5c631daSSadaf Ebrahimi Qadd8(Condition cond,Register rd,Register rn,Register rm)2973*f5c631daSSadaf Ebrahimi void Qadd8(Condition cond, Register rd, Register rn, Register rm) { 2974*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2975*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2976*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2977*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2978*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2979*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2980*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2981*f5c631daSSadaf Ebrahimi qadd8(cond, rd, rn, rm); 2982*f5c631daSSadaf Ebrahimi } Qadd8(Register rd,Register rn,Register rm)2983*f5c631daSSadaf Ebrahimi void Qadd8(Register rd, Register rn, Register rm) { Qadd8(al, rd, rn, rm); } 2984*f5c631daSSadaf Ebrahimi Qasx(Condition cond,Register rd,Register rn,Register rm)2985*f5c631daSSadaf Ebrahimi void Qasx(Condition cond, Register rd, Register rn, Register rm) { 2986*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2987*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2988*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2989*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 2990*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 2991*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 2992*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 2993*f5c631daSSadaf Ebrahimi qasx(cond, rd, rn, rm); 2994*f5c631daSSadaf Ebrahimi } Qasx(Register rd,Register rn,Register rm)2995*f5c631daSSadaf Ebrahimi void Qasx(Register rd, Register rn, Register rm) { Qasx(al, rd, rn, rm); } 2996*f5c631daSSadaf Ebrahimi Qdadd(Condition cond,Register rd,Register rm,Register rn)2997*f5c631daSSadaf Ebrahimi void Qdadd(Condition cond, Register rd, Register rm, Register rn) { 2998*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2999*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3000*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3001*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3002*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3003*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3004*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3005*f5c631daSSadaf Ebrahimi qdadd(cond, rd, rm, rn); 3006*f5c631daSSadaf Ebrahimi } Qdadd(Register rd,Register rm,Register rn)3007*f5c631daSSadaf Ebrahimi void Qdadd(Register rd, Register rm, Register rn) { Qdadd(al, rd, rm, rn); } 3008*f5c631daSSadaf Ebrahimi Qdsub(Condition cond,Register rd,Register rm,Register rn)3009*f5c631daSSadaf Ebrahimi void Qdsub(Condition cond, Register rd, Register rm, Register rn) { 3010*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3011*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3012*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3013*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3014*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3015*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3016*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3017*f5c631daSSadaf Ebrahimi qdsub(cond, rd, rm, rn); 3018*f5c631daSSadaf Ebrahimi } Qdsub(Register rd,Register rm,Register rn)3019*f5c631daSSadaf Ebrahimi void Qdsub(Register rd, Register rm, Register rn) { Qdsub(al, rd, rm, rn); } 3020*f5c631daSSadaf Ebrahimi Qsax(Condition cond,Register rd,Register rn,Register rm)3021*f5c631daSSadaf Ebrahimi void Qsax(Condition cond, Register rd, Register rn, Register rm) { 3022*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3023*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3024*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3025*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3026*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3027*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3028*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3029*f5c631daSSadaf Ebrahimi qsax(cond, rd, rn, rm); 3030*f5c631daSSadaf Ebrahimi } Qsax(Register rd,Register rn,Register rm)3031*f5c631daSSadaf Ebrahimi void Qsax(Register rd, Register rn, Register rm) { Qsax(al, rd, rn, rm); } 3032*f5c631daSSadaf Ebrahimi Qsub(Condition cond,Register rd,Register rm,Register rn)3033*f5c631daSSadaf Ebrahimi void Qsub(Condition cond, Register rd, Register rm, Register rn) { 3034*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3035*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3036*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3037*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3038*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3039*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3040*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3041*f5c631daSSadaf Ebrahimi qsub(cond, rd, rm, rn); 3042*f5c631daSSadaf Ebrahimi } Qsub(Register rd,Register rm,Register rn)3043*f5c631daSSadaf Ebrahimi void Qsub(Register rd, Register rm, Register rn) { Qsub(al, rd, rm, rn); } 3044*f5c631daSSadaf Ebrahimi Qsub16(Condition cond,Register rd,Register rn,Register rm)3045*f5c631daSSadaf Ebrahimi void Qsub16(Condition cond, Register rd, Register rn, Register rm) { 3046*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3047*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3048*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3049*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3050*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3051*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3052*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3053*f5c631daSSadaf Ebrahimi qsub16(cond, rd, rn, rm); 3054*f5c631daSSadaf Ebrahimi } Qsub16(Register rd,Register rn,Register rm)3055*f5c631daSSadaf Ebrahimi void Qsub16(Register rd, Register rn, Register rm) { Qsub16(al, rd, rn, rm); } 3056*f5c631daSSadaf Ebrahimi Qsub8(Condition cond,Register rd,Register rn,Register rm)3057*f5c631daSSadaf Ebrahimi void Qsub8(Condition cond, Register rd, Register rn, Register rm) { 3058*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3059*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3060*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3061*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3062*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3063*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3064*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3065*f5c631daSSadaf Ebrahimi qsub8(cond, rd, rn, rm); 3066*f5c631daSSadaf Ebrahimi } Qsub8(Register rd,Register rn,Register rm)3067*f5c631daSSadaf Ebrahimi void Qsub8(Register rd, Register rn, Register rm) { Qsub8(al, rd, rn, rm); } 3068*f5c631daSSadaf Ebrahimi Rbit(Condition cond,Register rd,Register rm)3069*f5c631daSSadaf Ebrahimi void Rbit(Condition cond, Register rd, Register rm) { 3070*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3071*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3072*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3073*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3074*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3075*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3076*f5c631daSSadaf Ebrahimi rbit(cond, rd, rm); 3077*f5c631daSSadaf Ebrahimi } Rbit(Register rd,Register rm)3078*f5c631daSSadaf Ebrahimi void Rbit(Register rd, Register rm) { Rbit(al, rd, rm); } 3079*f5c631daSSadaf Ebrahimi Rev(Condition cond,Register rd,Register rm)3080*f5c631daSSadaf Ebrahimi void Rev(Condition cond, Register rd, Register rm) { 3081*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3082*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3083*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3084*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3085*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3086*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3087*f5c631daSSadaf Ebrahimi rev(cond, rd, rm); 3088*f5c631daSSadaf Ebrahimi } Rev(Register rd,Register rm)3089*f5c631daSSadaf Ebrahimi void Rev(Register rd, Register rm) { Rev(al, rd, rm); } 3090*f5c631daSSadaf Ebrahimi Rev16(Condition cond,Register rd,Register rm)3091*f5c631daSSadaf Ebrahimi void Rev16(Condition cond, Register rd, Register rm) { 3092*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3093*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3094*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3095*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3096*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3097*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3098*f5c631daSSadaf Ebrahimi rev16(cond, rd, rm); 3099*f5c631daSSadaf Ebrahimi } Rev16(Register rd,Register rm)3100*f5c631daSSadaf Ebrahimi void Rev16(Register rd, Register rm) { Rev16(al, rd, rm); } 3101*f5c631daSSadaf Ebrahimi Revsh(Condition cond,Register rd,Register rm)3102*f5c631daSSadaf Ebrahimi void Revsh(Condition cond, Register rd, Register rm) { 3103*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3104*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3105*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3106*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3107*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3108*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3109*f5c631daSSadaf Ebrahimi revsh(cond, rd, rm); 3110*f5c631daSSadaf Ebrahimi } Revsh(Register rd,Register rm)3111*f5c631daSSadaf Ebrahimi void Revsh(Register rd, Register rm) { Revsh(al, rd, rm); } 3112*f5c631daSSadaf Ebrahimi Ror(Condition cond,Register rd,Register rm,const Operand & operand)3113*f5c631daSSadaf Ebrahimi void Ror(Condition cond, Register rd, Register rm, const Operand& operand) { 3114*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3115*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3116*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3117*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3118*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3119*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3120*f5c631daSSadaf Ebrahimi bool can_use_it = 3121*f5c631daSSadaf Ebrahimi // ROR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1 3122*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() && 3123*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 3124*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 3125*f5c631daSSadaf Ebrahimi ror(cond, rd, rm, operand); 3126*f5c631daSSadaf Ebrahimi } Ror(Register rd,Register rm,const Operand & operand)3127*f5c631daSSadaf Ebrahimi void Ror(Register rd, Register rm, const Operand& operand) { 3128*f5c631daSSadaf Ebrahimi Ror(al, rd, rm, operand); 3129*f5c631daSSadaf Ebrahimi } Ror(FlagsUpdate flags,Condition cond,Register rd,Register rm,const Operand & operand)3130*f5c631daSSadaf Ebrahimi void Ror(FlagsUpdate flags, 3131*f5c631daSSadaf Ebrahimi Condition cond, 3132*f5c631daSSadaf Ebrahimi Register rd, 3133*f5c631daSSadaf Ebrahimi Register rm, 3134*f5c631daSSadaf Ebrahimi const Operand& operand) { 3135*f5c631daSSadaf Ebrahimi switch (flags) { 3136*f5c631daSSadaf Ebrahimi case LeaveFlags: 3137*f5c631daSSadaf Ebrahimi Ror(cond, rd, rm, operand); 3138*f5c631daSSadaf Ebrahimi break; 3139*f5c631daSSadaf Ebrahimi case SetFlags: 3140*f5c631daSSadaf Ebrahimi Rors(cond, rd, rm, operand); 3141*f5c631daSSadaf Ebrahimi break; 3142*f5c631daSSadaf Ebrahimi case DontCare: 3143*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 3144*f5c631daSSadaf Ebrahimi rm.IsLow() && operand.IsPlainRegister() && 3145*f5c631daSSadaf Ebrahimi rd.Is(rm); 3146*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 3147*f5c631daSSadaf Ebrahimi Rors(cond, rd, rm, operand); 3148*f5c631daSSadaf Ebrahimi } else { 3149*f5c631daSSadaf Ebrahimi Ror(cond, rd, rm, operand); 3150*f5c631daSSadaf Ebrahimi } 3151*f5c631daSSadaf Ebrahimi break; 3152*f5c631daSSadaf Ebrahimi } 3153*f5c631daSSadaf Ebrahimi } Ror(FlagsUpdate flags,Register rd,Register rm,const Operand & operand)3154*f5c631daSSadaf Ebrahimi void Ror(FlagsUpdate flags, 3155*f5c631daSSadaf Ebrahimi Register rd, 3156*f5c631daSSadaf Ebrahimi Register rm, 3157*f5c631daSSadaf Ebrahimi const Operand& operand) { 3158*f5c631daSSadaf Ebrahimi Ror(flags, al, rd, rm, operand); 3159*f5c631daSSadaf Ebrahimi } 3160*f5c631daSSadaf Ebrahimi Rors(Condition cond,Register rd,Register rm,const Operand & operand)3161*f5c631daSSadaf Ebrahimi void Rors(Condition cond, Register rd, Register rm, const Operand& operand) { 3162*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3163*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3164*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3165*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3166*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3167*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3168*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3169*f5c631daSSadaf Ebrahimi rors(cond, rd, rm, operand); 3170*f5c631daSSadaf Ebrahimi } Rors(Register rd,Register rm,const Operand & operand)3171*f5c631daSSadaf Ebrahimi void Rors(Register rd, Register rm, const Operand& operand) { 3172*f5c631daSSadaf Ebrahimi Rors(al, rd, rm, operand); 3173*f5c631daSSadaf Ebrahimi } 3174*f5c631daSSadaf Ebrahimi Rrx(Condition cond,Register rd,Register rm)3175*f5c631daSSadaf Ebrahimi void Rrx(Condition cond, Register rd, Register rm) { 3176*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3177*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3178*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3179*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3180*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3181*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3182*f5c631daSSadaf Ebrahimi rrx(cond, rd, rm); 3183*f5c631daSSadaf Ebrahimi } Rrx(Register rd,Register rm)3184*f5c631daSSadaf Ebrahimi void Rrx(Register rd, Register rm) { Rrx(al, rd, rm); } Rrx(FlagsUpdate flags,Condition cond,Register rd,Register rm)3185*f5c631daSSadaf Ebrahimi void Rrx(FlagsUpdate flags, Condition cond, Register rd, Register rm) { 3186*f5c631daSSadaf Ebrahimi switch (flags) { 3187*f5c631daSSadaf Ebrahimi case LeaveFlags: 3188*f5c631daSSadaf Ebrahimi Rrx(cond, rd, rm); 3189*f5c631daSSadaf Ebrahimi break; 3190*f5c631daSSadaf Ebrahimi case SetFlags: 3191*f5c631daSSadaf Ebrahimi Rrxs(cond, rd, rm); 3192*f5c631daSSadaf Ebrahimi break; 3193*f5c631daSSadaf Ebrahimi case DontCare: 3194*f5c631daSSadaf Ebrahimi Rrx(cond, rd, rm); 3195*f5c631daSSadaf Ebrahimi break; 3196*f5c631daSSadaf Ebrahimi } 3197*f5c631daSSadaf Ebrahimi } Rrx(FlagsUpdate flags,Register rd,Register rm)3198*f5c631daSSadaf Ebrahimi void Rrx(FlagsUpdate flags, Register rd, Register rm) { 3199*f5c631daSSadaf Ebrahimi Rrx(flags, al, rd, rm); 3200*f5c631daSSadaf Ebrahimi } 3201*f5c631daSSadaf Ebrahimi Rrxs(Condition cond,Register rd,Register rm)3202*f5c631daSSadaf Ebrahimi void Rrxs(Condition cond, Register rd, Register rm) { 3203*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3204*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3205*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3206*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3207*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3208*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3209*f5c631daSSadaf Ebrahimi rrxs(cond, rd, rm); 3210*f5c631daSSadaf Ebrahimi } Rrxs(Register rd,Register rm)3211*f5c631daSSadaf Ebrahimi void Rrxs(Register rd, Register rm) { Rrxs(al, rd, rm); } 3212*f5c631daSSadaf Ebrahimi Rsb(Condition cond,Register rd,Register rn,const Operand & operand)3213*f5c631daSSadaf Ebrahimi void Rsb(Condition cond, Register rd, Register rn, const Operand& operand) { 3214*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3215*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3216*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3217*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3218*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3219*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3220*f5c631daSSadaf Ebrahimi bool can_use_it = 3221*f5c631daSSadaf Ebrahimi // RSB<c>{<q>} {<Rd>, }<Rn>, #0 ; T1 3222*f5c631daSSadaf Ebrahimi operand.IsImmediate() && rd.IsLow() && rn.IsLow() && 3223*f5c631daSSadaf Ebrahimi (operand.GetImmediate() == 0); 3224*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 3225*f5c631daSSadaf Ebrahimi rsb(cond, rd, rn, operand); 3226*f5c631daSSadaf Ebrahimi } Rsb(Register rd,Register rn,const Operand & operand)3227*f5c631daSSadaf Ebrahimi void Rsb(Register rd, Register rn, const Operand& operand) { 3228*f5c631daSSadaf Ebrahimi Rsb(al, rd, rn, operand); 3229*f5c631daSSadaf Ebrahimi } Rsb(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3230*f5c631daSSadaf Ebrahimi void Rsb(FlagsUpdate flags, 3231*f5c631daSSadaf Ebrahimi Condition cond, 3232*f5c631daSSadaf Ebrahimi Register rd, 3233*f5c631daSSadaf Ebrahimi Register rn, 3234*f5c631daSSadaf Ebrahimi const Operand& operand) { 3235*f5c631daSSadaf Ebrahimi switch (flags) { 3236*f5c631daSSadaf Ebrahimi case LeaveFlags: 3237*f5c631daSSadaf Ebrahimi Rsb(cond, rd, rn, operand); 3238*f5c631daSSadaf Ebrahimi break; 3239*f5c631daSSadaf Ebrahimi case SetFlags: 3240*f5c631daSSadaf Ebrahimi Rsbs(cond, rd, rn, operand); 3241*f5c631daSSadaf Ebrahimi break; 3242*f5c631daSSadaf Ebrahimi case DontCare: 3243*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 3244*f5c631daSSadaf Ebrahimi rn.IsLow() && operand.IsImmediate() && 3245*f5c631daSSadaf Ebrahimi (operand.GetImmediate() == 0); 3246*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 3247*f5c631daSSadaf Ebrahimi Rsbs(cond, rd, rn, operand); 3248*f5c631daSSadaf Ebrahimi } else { 3249*f5c631daSSadaf Ebrahimi Rsb(cond, rd, rn, operand); 3250*f5c631daSSadaf Ebrahimi } 3251*f5c631daSSadaf Ebrahimi break; 3252*f5c631daSSadaf Ebrahimi } 3253*f5c631daSSadaf Ebrahimi } Rsb(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3254*f5c631daSSadaf Ebrahimi void Rsb(FlagsUpdate flags, 3255*f5c631daSSadaf Ebrahimi Register rd, 3256*f5c631daSSadaf Ebrahimi Register rn, 3257*f5c631daSSadaf Ebrahimi const Operand& operand) { 3258*f5c631daSSadaf Ebrahimi Rsb(flags, al, rd, rn, operand); 3259*f5c631daSSadaf Ebrahimi } 3260*f5c631daSSadaf Ebrahimi Rsbs(Condition cond,Register rd,Register rn,const Operand & operand)3261*f5c631daSSadaf Ebrahimi void Rsbs(Condition cond, Register rd, Register rn, const Operand& operand) { 3262*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3263*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3264*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3265*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3266*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3267*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3268*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3269*f5c631daSSadaf Ebrahimi rsbs(cond, rd, rn, operand); 3270*f5c631daSSadaf Ebrahimi } Rsbs(Register rd,Register rn,const Operand & operand)3271*f5c631daSSadaf Ebrahimi void Rsbs(Register rd, Register rn, const Operand& operand) { 3272*f5c631daSSadaf Ebrahimi Rsbs(al, rd, rn, operand); 3273*f5c631daSSadaf Ebrahimi } 3274*f5c631daSSadaf Ebrahimi Rsc(Condition cond,Register rd,Register rn,const Operand & operand)3275*f5c631daSSadaf Ebrahimi void Rsc(Condition cond, Register rd, Register rn, const Operand& operand) { 3276*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3277*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3278*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3279*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3280*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3281*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3282*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3283*f5c631daSSadaf Ebrahimi rsc(cond, rd, rn, operand); 3284*f5c631daSSadaf Ebrahimi } Rsc(Register rd,Register rn,const Operand & operand)3285*f5c631daSSadaf Ebrahimi void Rsc(Register rd, Register rn, const Operand& operand) { 3286*f5c631daSSadaf Ebrahimi Rsc(al, rd, rn, operand); 3287*f5c631daSSadaf Ebrahimi } Rsc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3288*f5c631daSSadaf Ebrahimi void Rsc(FlagsUpdate flags, 3289*f5c631daSSadaf Ebrahimi Condition cond, 3290*f5c631daSSadaf Ebrahimi Register rd, 3291*f5c631daSSadaf Ebrahimi Register rn, 3292*f5c631daSSadaf Ebrahimi const Operand& operand) { 3293*f5c631daSSadaf Ebrahimi switch (flags) { 3294*f5c631daSSadaf Ebrahimi case LeaveFlags: 3295*f5c631daSSadaf Ebrahimi Rsc(cond, rd, rn, operand); 3296*f5c631daSSadaf Ebrahimi break; 3297*f5c631daSSadaf Ebrahimi case SetFlags: 3298*f5c631daSSadaf Ebrahimi Rscs(cond, rd, rn, operand); 3299*f5c631daSSadaf Ebrahimi break; 3300*f5c631daSSadaf Ebrahimi case DontCare: 3301*f5c631daSSadaf Ebrahimi Rsc(cond, rd, rn, operand); 3302*f5c631daSSadaf Ebrahimi break; 3303*f5c631daSSadaf Ebrahimi } 3304*f5c631daSSadaf Ebrahimi } Rsc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3305*f5c631daSSadaf Ebrahimi void Rsc(FlagsUpdate flags, 3306*f5c631daSSadaf Ebrahimi Register rd, 3307*f5c631daSSadaf Ebrahimi Register rn, 3308*f5c631daSSadaf Ebrahimi const Operand& operand) { 3309*f5c631daSSadaf Ebrahimi Rsc(flags, al, rd, rn, operand); 3310*f5c631daSSadaf Ebrahimi } 3311*f5c631daSSadaf Ebrahimi Rscs(Condition cond,Register rd,Register rn,const Operand & operand)3312*f5c631daSSadaf Ebrahimi void Rscs(Condition cond, Register rd, Register rn, const Operand& operand) { 3313*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3314*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3315*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3316*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3317*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3318*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3319*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3320*f5c631daSSadaf Ebrahimi rscs(cond, rd, rn, operand); 3321*f5c631daSSadaf Ebrahimi } Rscs(Register rd,Register rn,const Operand & operand)3322*f5c631daSSadaf Ebrahimi void Rscs(Register rd, Register rn, const Operand& operand) { 3323*f5c631daSSadaf Ebrahimi Rscs(al, rd, rn, operand); 3324*f5c631daSSadaf Ebrahimi } 3325*f5c631daSSadaf Ebrahimi Sadd16(Condition cond,Register rd,Register rn,Register rm)3326*f5c631daSSadaf Ebrahimi void Sadd16(Condition cond, Register rd, Register rn, Register rm) { 3327*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3328*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3329*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3330*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3331*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3332*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3333*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3334*f5c631daSSadaf Ebrahimi sadd16(cond, rd, rn, rm); 3335*f5c631daSSadaf Ebrahimi } Sadd16(Register rd,Register rn,Register rm)3336*f5c631daSSadaf Ebrahimi void Sadd16(Register rd, Register rn, Register rm) { Sadd16(al, rd, rn, rm); } 3337*f5c631daSSadaf Ebrahimi Sadd8(Condition cond,Register rd,Register rn,Register rm)3338*f5c631daSSadaf Ebrahimi void Sadd8(Condition cond, Register rd, Register rn, Register rm) { 3339*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3340*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3341*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3342*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3343*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3344*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3345*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3346*f5c631daSSadaf Ebrahimi sadd8(cond, rd, rn, rm); 3347*f5c631daSSadaf Ebrahimi } Sadd8(Register rd,Register rn,Register rm)3348*f5c631daSSadaf Ebrahimi void Sadd8(Register rd, Register rn, Register rm) { Sadd8(al, rd, rn, rm); } 3349*f5c631daSSadaf Ebrahimi Sasx(Condition cond,Register rd,Register rn,Register rm)3350*f5c631daSSadaf Ebrahimi void Sasx(Condition cond, Register rd, Register rn, Register rm) { 3351*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3352*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3353*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3354*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3355*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3356*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3357*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3358*f5c631daSSadaf Ebrahimi sasx(cond, rd, rn, rm); 3359*f5c631daSSadaf Ebrahimi } Sasx(Register rd,Register rn,Register rm)3360*f5c631daSSadaf Ebrahimi void Sasx(Register rd, Register rn, Register rm) { Sasx(al, rd, rn, rm); } 3361*f5c631daSSadaf Ebrahimi Sbc(Condition cond,Register rd,Register rn,const Operand & operand)3362*f5c631daSSadaf Ebrahimi void Sbc(Condition cond, Register rd, Register rn, const Operand& operand) { 3363*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3364*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3365*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3366*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3367*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3368*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3369*f5c631daSSadaf Ebrahimi bool can_use_it = 3370*f5c631daSSadaf Ebrahimi // SBC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 3371*f5c631daSSadaf Ebrahimi operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) && 3372*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 3373*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard, can_use_it); 3374*f5c631daSSadaf Ebrahimi sbc(cond, rd, rn, operand); 3375*f5c631daSSadaf Ebrahimi } Sbc(Register rd,Register rn,const Operand & operand)3376*f5c631daSSadaf Ebrahimi void Sbc(Register rd, Register rn, const Operand& operand) { 3377*f5c631daSSadaf Ebrahimi Sbc(al, rd, rn, operand); 3378*f5c631daSSadaf Ebrahimi } Sbc(FlagsUpdate flags,Condition cond,Register rd,Register rn,const Operand & operand)3379*f5c631daSSadaf Ebrahimi void Sbc(FlagsUpdate flags, 3380*f5c631daSSadaf Ebrahimi Condition cond, 3381*f5c631daSSadaf Ebrahimi Register rd, 3382*f5c631daSSadaf Ebrahimi Register rn, 3383*f5c631daSSadaf Ebrahimi const Operand& operand) { 3384*f5c631daSSadaf Ebrahimi switch (flags) { 3385*f5c631daSSadaf Ebrahimi case LeaveFlags: 3386*f5c631daSSadaf Ebrahimi Sbc(cond, rd, rn, operand); 3387*f5c631daSSadaf Ebrahimi break; 3388*f5c631daSSadaf Ebrahimi case SetFlags: 3389*f5c631daSSadaf Ebrahimi Sbcs(cond, rd, rn, operand); 3390*f5c631daSSadaf Ebrahimi break; 3391*f5c631daSSadaf Ebrahimi case DontCare: 3392*f5c631daSSadaf Ebrahimi bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 3393*f5c631daSSadaf Ebrahimi rn.Is(rd) && operand.IsPlainRegister() && 3394*f5c631daSSadaf Ebrahimi operand.GetBaseRegister().IsLow(); 3395*f5c631daSSadaf Ebrahimi if (setflags_is_smaller) { 3396*f5c631daSSadaf Ebrahimi Sbcs(cond, rd, rn, operand); 3397*f5c631daSSadaf Ebrahimi } else { 3398*f5c631daSSadaf Ebrahimi Sbc(cond, rd, rn, operand); 3399*f5c631daSSadaf Ebrahimi } 3400*f5c631daSSadaf Ebrahimi break; 3401*f5c631daSSadaf Ebrahimi } 3402*f5c631daSSadaf Ebrahimi } Sbc(FlagsUpdate flags,Register rd,Register rn,const Operand & operand)3403*f5c631daSSadaf Ebrahimi void Sbc(FlagsUpdate flags, 3404*f5c631daSSadaf Ebrahimi Register rd, 3405*f5c631daSSadaf Ebrahimi Register rn, 3406*f5c631daSSadaf Ebrahimi const Operand& operand) { 3407*f5c631daSSadaf Ebrahimi Sbc(flags, al, rd, rn, operand); 3408*f5c631daSSadaf Ebrahimi } 3409*f5c631daSSadaf Ebrahimi Sbcs(Condition cond,Register rd,Register rn,const Operand & operand)3410*f5c631daSSadaf Ebrahimi void Sbcs(Condition cond, Register rd, Register rn, const Operand& operand) { 3411*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3412*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3413*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3414*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3415*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3416*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3417*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3418*f5c631daSSadaf Ebrahimi sbcs(cond, rd, rn, operand); 3419*f5c631daSSadaf Ebrahimi } Sbcs(Register rd,Register rn,const Operand & operand)3420*f5c631daSSadaf Ebrahimi void Sbcs(Register rd, Register rn, const Operand& operand) { 3421*f5c631daSSadaf Ebrahimi Sbcs(al, rd, rn, operand); 3422*f5c631daSSadaf Ebrahimi } 3423*f5c631daSSadaf Ebrahimi Sbfx(Condition cond,Register rd,Register rn,uint32_t lsb,uint32_t width)3424*f5c631daSSadaf Ebrahimi void Sbfx( 3425*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { 3426*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3427*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3428*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3429*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3430*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3431*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3432*f5c631daSSadaf Ebrahimi sbfx(cond, rd, rn, lsb, width); 3433*f5c631daSSadaf Ebrahimi } Sbfx(Register rd,Register rn,uint32_t lsb,uint32_t width)3434*f5c631daSSadaf Ebrahimi void Sbfx(Register rd, Register rn, uint32_t lsb, uint32_t width) { 3435*f5c631daSSadaf Ebrahimi Sbfx(al, rd, rn, lsb, width); 3436*f5c631daSSadaf Ebrahimi } 3437*f5c631daSSadaf Ebrahimi Sdiv(Condition cond,Register rd,Register rn,Register rm)3438*f5c631daSSadaf Ebrahimi void Sdiv(Condition cond, Register rd, Register rn, Register rm) { 3439*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3440*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3441*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3442*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3443*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3444*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3445*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3446*f5c631daSSadaf Ebrahimi sdiv(cond, rd, rn, rm); 3447*f5c631daSSadaf Ebrahimi } Sdiv(Register rd,Register rn,Register rm)3448*f5c631daSSadaf Ebrahimi void Sdiv(Register rd, Register rn, Register rm) { Sdiv(al, rd, rn, rm); } 3449*f5c631daSSadaf Ebrahimi Sel(Condition cond,Register rd,Register rn,Register rm)3450*f5c631daSSadaf Ebrahimi void Sel(Condition cond, Register rd, Register rn, Register rm) { 3451*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3452*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3453*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3454*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3455*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3456*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3457*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3458*f5c631daSSadaf Ebrahimi sel(cond, rd, rn, rm); 3459*f5c631daSSadaf Ebrahimi } Sel(Register rd,Register rn,Register rm)3460*f5c631daSSadaf Ebrahimi void Sel(Register rd, Register rn, Register rm) { Sel(al, rd, rn, rm); } 3461*f5c631daSSadaf Ebrahimi Shadd16(Condition cond,Register rd,Register rn,Register rm)3462*f5c631daSSadaf Ebrahimi void Shadd16(Condition cond, Register rd, Register rn, Register rm) { 3463*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3464*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3465*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3466*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3467*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3468*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3469*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3470*f5c631daSSadaf Ebrahimi shadd16(cond, rd, rn, rm); 3471*f5c631daSSadaf Ebrahimi } Shadd16(Register rd,Register rn,Register rm)3472*f5c631daSSadaf Ebrahimi void Shadd16(Register rd, Register rn, Register rm) { 3473*f5c631daSSadaf Ebrahimi Shadd16(al, rd, rn, rm); 3474*f5c631daSSadaf Ebrahimi } 3475*f5c631daSSadaf Ebrahimi Shadd8(Condition cond,Register rd,Register rn,Register rm)3476*f5c631daSSadaf Ebrahimi void Shadd8(Condition cond, Register rd, Register rn, Register rm) { 3477*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3478*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3479*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3480*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3481*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3482*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3483*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3484*f5c631daSSadaf Ebrahimi shadd8(cond, rd, rn, rm); 3485*f5c631daSSadaf Ebrahimi } Shadd8(Register rd,Register rn,Register rm)3486*f5c631daSSadaf Ebrahimi void Shadd8(Register rd, Register rn, Register rm) { Shadd8(al, rd, rn, rm); } 3487*f5c631daSSadaf Ebrahimi Shasx(Condition cond,Register rd,Register rn,Register rm)3488*f5c631daSSadaf Ebrahimi void Shasx(Condition cond, Register rd, Register rn, Register rm) { 3489*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3490*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3491*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3492*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3493*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3494*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3495*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3496*f5c631daSSadaf Ebrahimi shasx(cond, rd, rn, rm); 3497*f5c631daSSadaf Ebrahimi } Shasx(Register rd,Register rn,Register rm)3498*f5c631daSSadaf Ebrahimi void Shasx(Register rd, Register rn, Register rm) { Shasx(al, rd, rn, rm); } 3499*f5c631daSSadaf Ebrahimi Shsax(Condition cond,Register rd,Register rn,Register rm)3500*f5c631daSSadaf Ebrahimi void Shsax(Condition cond, Register rd, Register rn, Register rm) { 3501*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3502*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3503*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3504*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3505*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3506*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3507*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3508*f5c631daSSadaf Ebrahimi shsax(cond, rd, rn, rm); 3509*f5c631daSSadaf Ebrahimi } Shsax(Register rd,Register rn,Register rm)3510*f5c631daSSadaf Ebrahimi void Shsax(Register rd, Register rn, Register rm) { Shsax(al, rd, rn, rm); } 3511*f5c631daSSadaf Ebrahimi Shsub16(Condition cond,Register rd,Register rn,Register rm)3512*f5c631daSSadaf Ebrahimi void Shsub16(Condition cond, Register rd, Register rn, Register rm) { 3513*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3514*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3515*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3516*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3517*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3518*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3519*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3520*f5c631daSSadaf Ebrahimi shsub16(cond, rd, rn, rm); 3521*f5c631daSSadaf Ebrahimi } Shsub16(Register rd,Register rn,Register rm)3522*f5c631daSSadaf Ebrahimi void Shsub16(Register rd, Register rn, Register rm) { 3523*f5c631daSSadaf Ebrahimi Shsub16(al, rd, rn, rm); 3524*f5c631daSSadaf Ebrahimi } 3525*f5c631daSSadaf Ebrahimi Shsub8(Condition cond,Register rd,Register rn,Register rm)3526*f5c631daSSadaf Ebrahimi void Shsub8(Condition cond, Register rd, Register rn, Register rm) { 3527*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3528*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3529*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3530*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3531*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3532*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3533*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3534*f5c631daSSadaf Ebrahimi shsub8(cond, rd, rn, rm); 3535*f5c631daSSadaf Ebrahimi } Shsub8(Register rd,Register rn,Register rm)3536*f5c631daSSadaf Ebrahimi void Shsub8(Register rd, Register rn, Register rm) { Shsub8(al, rd, rn, rm); } 3537*f5c631daSSadaf Ebrahimi Smlabb(Condition cond,Register rd,Register rn,Register rm,Register ra)3538*f5c631daSSadaf Ebrahimi void Smlabb( 3539*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3540*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3541*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3542*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3543*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3544*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3545*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3546*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3547*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3548*f5c631daSSadaf Ebrahimi smlabb(cond, rd, rn, rm, ra); 3549*f5c631daSSadaf Ebrahimi } Smlabb(Register rd,Register rn,Register rm,Register ra)3550*f5c631daSSadaf Ebrahimi void Smlabb(Register rd, Register rn, Register rm, Register ra) { 3551*f5c631daSSadaf Ebrahimi Smlabb(al, rd, rn, rm, ra); 3552*f5c631daSSadaf Ebrahimi } 3553*f5c631daSSadaf Ebrahimi Smlabt(Condition cond,Register rd,Register rn,Register rm,Register ra)3554*f5c631daSSadaf Ebrahimi void Smlabt( 3555*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3556*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3557*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3558*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3559*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3560*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3561*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3562*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3563*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3564*f5c631daSSadaf Ebrahimi smlabt(cond, rd, rn, rm, ra); 3565*f5c631daSSadaf Ebrahimi } Smlabt(Register rd,Register rn,Register rm,Register ra)3566*f5c631daSSadaf Ebrahimi void Smlabt(Register rd, Register rn, Register rm, Register ra) { 3567*f5c631daSSadaf Ebrahimi Smlabt(al, rd, rn, rm, ra); 3568*f5c631daSSadaf Ebrahimi } 3569*f5c631daSSadaf Ebrahimi Smlad(Condition cond,Register rd,Register rn,Register rm,Register ra)3570*f5c631daSSadaf Ebrahimi void Smlad( 3571*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3572*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3573*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3574*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3575*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3576*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3577*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3578*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3579*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3580*f5c631daSSadaf Ebrahimi smlad(cond, rd, rn, rm, ra); 3581*f5c631daSSadaf Ebrahimi } Smlad(Register rd,Register rn,Register rm,Register ra)3582*f5c631daSSadaf Ebrahimi void Smlad(Register rd, Register rn, Register rm, Register ra) { 3583*f5c631daSSadaf Ebrahimi Smlad(al, rd, rn, rm, ra); 3584*f5c631daSSadaf Ebrahimi } 3585*f5c631daSSadaf Ebrahimi Smladx(Condition cond,Register rd,Register rn,Register rm,Register ra)3586*f5c631daSSadaf Ebrahimi void Smladx( 3587*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3588*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3589*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3590*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3591*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3592*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3593*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3594*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3595*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3596*f5c631daSSadaf Ebrahimi smladx(cond, rd, rn, rm, ra); 3597*f5c631daSSadaf Ebrahimi } Smladx(Register rd,Register rn,Register rm,Register ra)3598*f5c631daSSadaf Ebrahimi void Smladx(Register rd, Register rn, Register rm, Register ra) { 3599*f5c631daSSadaf Ebrahimi Smladx(al, rd, rn, rm, ra); 3600*f5c631daSSadaf Ebrahimi } 3601*f5c631daSSadaf Ebrahimi Smlal(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3602*f5c631daSSadaf Ebrahimi void Smlal( 3603*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3604*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3605*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3606*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3607*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3608*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3609*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3610*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3611*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3612*f5c631daSSadaf Ebrahimi smlal(cond, rdlo, rdhi, rn, rm); 3613*f5c631daSSadaf Ebrahimi } Smlal(Register rdlo,Register rdhi,Register rn,Register rm)3614*f5c631daSSadaf Ebrahimi void Smlal(Register rdlo, Register rdhi, Register rn, Register rm) { 3615*f5c631daSSadaf Ebrahimi Smlal(al, rdlo, rdhi, rn, rm); 3616*f5c631daSSadaf Ebrahimi } 3617*f5c631daSSadaf Ebrahimi Smlalbb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3618*f5c631daSSadaf Ebrahimi void Smlalbb( 3619*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3620*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3621*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3622*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3623*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3624*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3625*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3626*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3627*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3628*f5c631daSSadaf Ebrahimi smlalbb(cond, rdlo, rdhi, rn, rm); 3629*f5c631daSSadaf Ebrahimi } Smlalbb(Register rdlo,Register rdhi,Register rn,Register rm)3630*f5c631daSSadaf Ebrahimi void Smlalbb(Register rdlo, Register rdhi, Register rn, Register rm) { 3631*f5c631daSSadaf Ebrahimi Smlalbb(al, rdlo, rdhi, rn, rm); 3632*f5c631daSSadaf Ebrahimi } 3633*f5c631daSSadaf Ebrahimi Smlalbt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3634*f5c631daSSadaf Ebrahimi void Smlalbt( 3635*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3636*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3637*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3638*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3639*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3640*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3641*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3642*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3643*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3644*f5c631daSSadaf Ebrahimi smlalbt(cond, rdlo, rdhi, rn, rm); 3645*f5c631daSSadaf Ebrahimi } Smlalbt(Register rdlo,Register rdhi,Register rn,Register rm)3646*f5c631daSSadaf Ebrahimi void Smlalbt(Register rdlo, Register rdhi, Register rn, Register rm) { 3647*f5c631daSSadaf Ebrahimi Smlalbt(al, rdlo, rdhi, rn, rm); 3648*f5c631daSSadaf Ebrahimi } 3649*f5c631daSSadaf Ebrahimi Smlald(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3650*f5c631daSSadaf Ebrahimi void Smlald( 3651*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3652*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3653*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3654*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3655*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3656*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3657*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3658*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3659*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3660*f5c631daSSadaf Ebrahimi smlald(cond, rdlo, rdhi, rn, rm); 3661*f5c631daSSadaf Ebrahimi } Smlald(Register rdlo,Register rdhi,Register rn,Register rm)3662*f5c631daSSadaf Ebrahimi void Smlald(Register rdlo, Register rdhi, Register rn, Register rm) { 3663*f5c631daSSadaf Ebrahimi Smlald(al, rdlo, rdhi, rn, rm); 3664*f5c631daSSadaf Ebrahimi } 3665*f5c631daSSadaf Ebrahimi Smlaldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3666*f5c631daSSadaf Ebrahimi void Smlaldx( 3667*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3668*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3669*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3670*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3671*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3672*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3673*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3674*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3675*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3676*f5c631daSSadaf Ebrahimi smlaldx(cond, rdlo, rdhi, rn, rm); 3677*f5c631daSSadaf Ebrahimi } Smlaldx(Register rdlo,Register rdhi,Register rn,Register rm)3678*f5c631daSSadaf Ebrahimi void Smlaldx(Register rdlo, Register rdhi, Register rn, Register rm) { 3679*f5c631daSSadaf Ebrahimi Smlaldx(al, rdlo, rdhi, rn, rm); 3680*f5c631daSSadaf Ebrahimi } 3681*f5c631daSSadaf Ebrahimi Smlals(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3682*f5c631daSSadaf Ebrahimi void Smlals( 3683*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3684*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3685*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3686*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3687*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3688*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3689*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3690*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3691*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3692*f5c631daSSadaf Ebrahimi smlals(cond, rdlo, rdhi, rn, rm); 3693*f5c631daSSadaf Ebrahimi } Smlals(Register rdlo,Register rdhi,Register rn,Register rm)3694*f5c631daSSadaf Ebrahimi void Smlals(Register rdlo, Register rdhi, Register rn, Register rm) { 3695*f5c631daSSadaf Ebrahimi Smlals(al, rdlo, rdhi, rn, rm); 3696*f5c631daSSadaf Ebrahimi } 3697*f5c631daSSadaf Ebrahimi Smlaltb(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3698*f5c631daSSadaf Ebrahimi void Smlaltb( 3699*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3700*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3701*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3702*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3703*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3704*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3705*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3706*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3707*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3708*f5c631daSSadaf Ebrahimi smlaltb(cond, rdlo, rdhi, rn, rm); 3709*f5c631daSSadaf Ebrahimi } Smlaltb(Register rdlo,Register rdhi,Register rn,Register rm)3710*f5c631daSSadaf Ebrahimi void Smlaltb(Register rdlo, Register rdhi, Register rn, Register rm) { 3711*f5c631daSSadaf Ebrahimi Smlaltb(al, rdlo, rdhi, rn, rm); 3712*f5c631daSSadaf Ebrahimi } 3713*f5c631daSSadaf Ebrahimi Smlaltt(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3714*f5c631daSSadaf Ebrahimi void Smlaltt( 3715*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3716*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3717*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3718*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3719*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3720*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3721*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3722*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3723*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3724*f5c631daSSadaf Ebrahimi smlaltt(cond, rdlo, rdhi, rn, rm); 3725*f5c631daSSadaf Ebrahimi } Smlaltt(Register rdlo,Register rdhi,Register rn,Register rm)3726*f5c631daSSadaf Ebrahimi void Smlaltt(Register rdlo, Register rdhi, Register rn, Register rm) { 3727*f5c631daSSadaf Ebrahimi Smlaltt(al, rdlo, rdhi, rn, rm); 3728*f5c631daSSadaf Ebrahimi } 3729*f5c631daSSadaf Ebrahimi Smlatb(Condition cond,Register rd,Register rn,Register rm,Register ra)3730*f5c631daSSadaf Ebrahimi void Smlatb( 3731*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3732*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3733*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3734*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3735*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3736*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3737*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3738*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3739*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3740*f5c631daSSadaf Ebrahimi smlatb(cond, rd, rn, rm, ra); 3741*f5c631daSSadaf Ebrahimi } Smlatb(Register rd,Register rn,Register rm,Register ra)3742*f5c631daSSadaf Ebrahimi void Smlatb(Register rd, Register rn, Register rm, Register ra) { 3743*f5c631daSSadaf Ebrahimi Smlatb(al, rd, rn, rm, ra); 3744*f5c631daSSadaf Ebrahimi } 3745*f5c631daSSadaf Ebrahimi Smlatt(Condition cond,Register rd,Register rn,Register rm,Register ra)3746*f5c631daSSadaf Ebrahimi void Smlatt( 3747*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3748*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3749*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3750*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3751*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3752*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3753*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3754*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3755*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3756*f5c631daSSadaf Ebrahimi smlatt(cond, rd, rn, rm, ra); 3757*f5c631daSSadaf Ebrahimi } Smlatt(Register rd,Register rn,Register rm,Register ra)3758*f5c631daSSadaf Ebrahimi void Smlatt(Register rd, Register rn, Register rm, Register ra) { 3759*f5c631daSSadaf Ebrahimi Smlatt(al, rd, rn, rm, ra); 3760*f5c631daSSadaf Ebrahimi } 3761*f5c631daSSadaf Ebrahimi Smlawb(Condition cond,Register rd,Register rn,Register rm,Register ra)3762*f5c631daSSadaf Ebrahimi void Smlawb( 3763*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3764*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3765*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3766*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3767*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3768*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3769*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3770*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3771*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3772*f5c631daSSadaf Ebrahimi smlawb(cond, rd, rn, rm, ra); 3773*f5c631daSSadaf Ebrahimi } Smlawb(Register rd,Register rn,Register rm,Register ra)3774*f5c631daSSadaf Ebrahimi void Smlawb(Register rd, Register rn, Register rm, Register ra) { 3775*f5c631daSSadaf Ebrahimi Smlawb(al, rd, rn, rm, ra); 3776*f5c631daSSadaf Ebrahimi } 3777*f5c631daSSadaf Ebrahimi Smlawt(Condition cond,Register rd,Register rn,Register rm,Register ra)3778*f5c631daSSadaf Ebrahimi void Smlawt( 3779*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3780*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3781*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3782*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3783*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3784*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3785*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3786*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3787*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3788*f5c631daSSadaf Ebrahimi smlawt(cond, rd, rn, rm, ra); 3789*f5c631daSSadaf Ebrahimi } Smlawt(Register rd,Register rn,Register rm,Register ra)3790*f5c631daSSadaf Ebrahimi void Smlawt(Register rd, Register rn, Register rm, Register ra) { 3791*f5c631daSSadaf Ebrahimi Smlawt(al, rd, rn, rm, ra); 3792*f5c631daSSadaf Ebrahimi } 3793*f5c631daSSadaf Ebrahimi Smlsd(Condition cond,Register rd,Register rn,Register rm,Register ra)3794*f5c631daSSadaf Ebrahimi void Smlsd( 3795*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3796*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3797*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3798*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3799*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3800*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3801*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3802*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3803*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3804*f5c631daSSadaf Ebrahimi smlsd(cond, rd, rn, rm, ra); 3805*f5c631daSSadaf Ebrahimi } Smlsd(Register rd,Register rn,Register rm,Register ra)3806*f5c631daSSadaf Ebrahimi void Smlsd(Register rd, Register rn, Register rm, Register ra) { 3807*f5c631daSSadaf Ebrahimi Smlsd(al, rd, rn, rm, ra); 3808*f5c631daSSadaf Ebrahimi } 3809*f5c631daSSadaf Ebrahimi Smlsdx(Condition cond,Register rd,Register rn,Register rm,Register ra)3810*f5c631daSSadaf Ebrahimi void Smlsdx( 3811*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3812*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3813*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3814*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3815*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3816*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3817*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3818*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3819*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3820*f5c631daSSadaf Ebrahimi smlsdx(cond, rd, rn, rm, ra); 3821*f5c631daSSadaf Ebrahimi } Smlsdx(Register rd,Register rn,Register rm,Register ra)3822*f5c631daSSadaf Ebrahimi void Smlsdx(Register rd, Register rn, Register rm, Register ra) { 3823*f5c631daSSadaf Ebrahimi Smlsdx(al, rd, rn, rm, ra); 3824*f5c631daSSadaf Ebrahimi } 3825*f5c631daSSadaf Ebrahimi Smlsld(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3826*f5c631daSSadaf Ebrahimi void Smlsld( 3827*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3828*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3829*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3830*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3831*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3832*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3833*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3834*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3835*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3836*f5c631daSSadaf Ebrahimi smlsld(cond, rdlo, rdhi, rn, rm); 3837*f5c631daSSadaf Ebrahimi } Smlsld(Register rdlo,Register rdhi,Register rn,Register rm)3838*f5c631daSSadaf Ebrahimi void Smlsld(Register rdlo, Register rdhi, Register rn, Register rm) { 3839*f5c631daSSadaf Ebrahimi Smlsld(al, rdlo, rdhi, rn, rm); 3840*f5c631daSSadaf Ebrahimi } 3841*f5c631daSSadaf Ebrahimi Smlsldx(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3842*f5c631daSSadaf Ebrahimi void Smlsldx( 3843*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3844*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3845*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3846*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3847*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3848*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3849*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3850*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3851*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3852*f5c631daSSadaf Ebrahimi smlsldx(cond, rdlo, rdhi, rn, rm); 3853*f5c631daSSadaf Ebrahimi } Smlsldx(Register rdlo,Register rdhi,Register rn,Register rm)3854*f5c631daSSadaf Ebrahimi void Smlsldx(Register rdlo, Register rdhi, Register rn, Register rm) { 3855*f5c631daSSadaf Ebrahimi Smlsldx(al, rdlo, rdhi, rn, rm); 3856*f5c631daSSadaf Ebrahimi } 3857*f5c631daSSadaf Ebrahimi Smmla(Condition cond,Register rd,Register rn,Register rm,Register ra)3858*f5c631daSSadaf Ebrahimi void Smmla( 3859*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3860*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3861*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3862*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3863*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3864*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3865*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3866*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3867*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3868*f5c631daSSadaf Ebrahimi smmla(cond, rd, rn, rm, ra); 3869*f5c631daSSadaf Ebrahimi } Smmla(Register rd,Register rn,Register rm,Register ra)3870*f5c631daSSadaf Ebrahimi void Smmla(Register rd, Register rn, Register rm, Register ra) { 3871*f5c631daSSadaf Ebrahimi Smmla(al, rd, rn, rm, ra); 3872*f5c631daSSadaf Ebrahimi } 3873*f5c631daSSadaf Ebrahimi Smmlar(Condition cond,Register rd,Register rn,Register rm,Register ra)3874*f5c631daSSadaf Ebrahimi void Smmlar( 3875*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3876*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3877*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3878*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3879*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3880*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3881*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3882*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3883*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3884*f5c631daSSadaf Ebrahimi smmlar(cond, rd, rn, rm, ra); 3885*f5c631daSSadaf Ebrahimi } Smmlar(Register rd,Register rn,Register rm,Register ra)3886*f5c631daSSadaf Ebrahimi void Smmlar(Register rd, Register rn, Register rm, Register ra) { 3887*f5c631daSSadaf Ebrahimi Smmlar(al, rd, rn, rm, ra); 3888*f5c631daSSadaf Ebrahimi } 3889*f5c631daSSadaf Ebrahimi Smmls(Condition cond,Register rd,Register rn,Register rm,Register ra)3890*f5c631daSSadaf Ebrahimi void Smmls( 3891*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3892*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3893*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3894*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3895*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3896*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3897*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3898*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3899*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3900*f5c631daSSadaf Ebrahimi smmls(cond, rd, rn, rm, ra); 3901*f5c631daSSadaf Ebrahimi } Smmls(Register rd,Register rn,Register rm,Register ra)3902*f5c631daSSadaf Ebrahimi void Smmls(Register rd, Register rn, Register rm, Register ra) { 3903*f5c631daSSadaf Ebrahimi Smmls(al, rd, rn, rm, ra); 3904*f5c631daSSadaf Ebrahimi } 3905*f5c631daSSadaf Ebrahimi Smmlsr(Condition cond,Register rd,Register rn,Register rm,Register ra)3906*f5c631daSSadaf Ebrahimi void Smmlsr( 3907*f5c631daSSadaf Ebrahimi Condition cond, Register rd, Register rn, Register rm, Register ra) { 3908*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3909*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3910*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3911*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 3912*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3913*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3914*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3915*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3916*f5c631daSSadaf Ebrahimi smmlsr(cond, rd, rn, rm, ra); 3917*f5c631daSSadaf Ebrahimi } Smmlsr(Register rd,Register rn,Register rm,Register ra)3918*f5c631daSSadaf Ebrahimi void Smmlsr(Register rd, Register rn, Register rm, Register ra) { 3919*f5c631daSSadaf Ebrahimi Smmlsr(al, rd, rn, rm, ra); 3920*f5c631daSSadaf Ebrahimi } 3921*f5c631daSSadaf Ebrahimi Smmul(Condition cond,Register rd,Register rn,Register rm)3922*f5c631daSSadaf Ebrahimi void Smmul(Condition cond, Register rd, Register rn, Register rm) { 3923*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3924*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3925*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3926*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3927*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3928*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3929*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3930*f5c631daSSadaf Ebrahimi smmul(cond, rd, rn, rm); 3931*f5c631daSSadaf Ebrahimi } Smmul(Register rd,Register rn,Register rm)3932*f5c631daSSadaf Ebrahimi void Smmul(Register rd, Register rn, Register rm) { Smmul(al, rd, rn, rm); } 3933*f5c631daSSadaf Ebrahimi Smmulr(Condition cond,Register rd,Register rn,Register rm)3934*f5c631daSSadaf Ebrahimi void Smmulr(Condition cond, Register rd, Register rn, Register rm) { 3935*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3936*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3937*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3938*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3939*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3940*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3941*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3942*f5c631daSSadaf Ebrahimi smmulr(cond, rd, rn, rm); 3943*f5c631daSSadaf Ebrahimi } Smmulr(Register rd,Register rn,Register rm)3944*f5c631daSSadaf Ebrahimi void Smmulr(Register rd, Register rn, Register rm) { Smmulr(al, rd, rn, rm); } 3945*f5c631daSSadaf Ebrahimi Smuad(Condition cond,Register rd,Register rn,Register rm)3946*f5c631daSSadaf Ebrahimi void Smuad(Condition cond, Register rd, Register rn, Register rm) { 3947*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3948*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3949*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3950*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3951*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3952*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3953*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3954*f5c631daSSadaf Ebrahimi smuad(cond, rd, rn, rm); 3955*f5c631daSSadaf Ebrahimi } Smuad(Register rd,Register rn,Register rm)3956*f5c631daSSadaf Ebrahimi void Smuad(Register rd, Register rn, Register rm) { Smuad(al, rd, rn, rm); } 3957*f5c631daSSadaf Ebrahimi Smuadx(Condition cond,Register rd,Register rn,Register rm)3958*f5c631daSSadaf Ebrahimi void Smuadx(Condition cond, Register rd, Register rn, Register rm) { 3959*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3960*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3961*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3962*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3963*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3964*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3965*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3966*f5c631daSSadaf Ebrahimi smuadx(cond, rd, rn, rm); 3967*f5c631daSSadaf Ebrahimi } Smuadx(Register rd,Register rn,Register rm)3968*f5c631daSSadaf Ebrahimi void Smuadx(Register rd, Register rn, Register rm) { Smuadx(al, rd, rn, rm); } 3969*f5c631daSSadaf Ebrahimi Smulbb(Condition cond,Register rd,Register rn,Register rm)3970*f5c631daSSadaf Ebrahimi void Smulbb(Condition cond, Register rd, Register rn, Register rm) { 3971*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3972*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3973*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3974*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3975*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3976*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3977*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3978*f5c631daSSadaf Ebrahimi smulbb(cond, rd, rn, rm); 3979*f5c631daSSadaf Ebrahimi } Smulbb(Register rd,Register rn,Register rm)3980*f5c631daSSadaf Ebrahimi void Smulbb(Register rd, Register rn, Register rm) { Smulbb(al, rd, rn, rm); } 3981*f5c631daSSadaf Ebrahimi Smulbt(Condition cond,Register rd,Register rn,Register rm)3982*f5c631daSSadaf Ebrahimi void Smulbt(Condition cond, Register rd, Register rn, Register rm) { 3983*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3984*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3985*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3986*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 3987*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 3988*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 3989*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 3990*f5c631daSSadaf Ebrahimi smulbt(cond, rd, rn, rm); 3991*f5c631daSSadaf Ebrahimi } Smulbt(Register rd,Register rn,Register rm)3992*f5c631daSSadaf Ebrahimi void Smulbt(Register rd, Register rn, Register rm) { Smulbt(al, rd, rn, rm); } 3993*f5c631daSSadaf Ebrahimi Smull(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)3994*f5c631daSSadaf Ebrahimi void Smull( 3995*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3996*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 3997*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 3998*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3999*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4000*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4001*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4002*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4003*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4004*f5c631daSSadaf Ebrahimi smull(cond, rdlo, rdhi, rn, rm); 4005*f5c631daSSadaf Ebrahimi } Smull(Register rdlo,Register rdhi,Register rn,Register rm)4006*f5c631daSSadaf Ebrahimi void Smull(Register rdlo, Register rdhi, Register rn, Register rm) { 4007*f5c631daSSadaf Ebrahimi Smull(al, rdlo, rdhi, rn, rm); 4008*f5c631daSSadaf Ebrahimi } Smull(FlagsUpdate flags,Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4009*f5c631daSSadaf Ebrahimi void Smull(FlagsUpdate flags, 4010*f5c631daSSadaf Ebrahimi Condition cond, 4011*f5c631daSSadaf Ebrahimi Register rdlo, 4012*f5c631daSSadaf Ebrahimi Register rdhi, 4013*f5c631daSSadaf Ebrahimi Register rn, 4014*f5c631daSSadaf Ebrahimi Register rm) { 4015*f5c631daSSadaf Ebrahimi switch (flags) { 4016*f5c631daSSadaf Ebrahimi case LeaveFlags: 4017*f5c631daSSadaf Ebrahimi Smull(cond, rdlo, rdhi, rn, rm); 4018*f5c631daSSadaf Ebrahimi break; 4019*f5c631daSSadaf Ebrahimi case SetFlags: 4020*f5c631daSSadaf Ebrahimi Smulls(cond, rdlo, rdhi, rn, rm); 4021*f5c631daSSadaf Ebrahimi break; 4022*f5c631daSSadaf Ebrahimi case DontCare: 4023*f5c631daSSadaf Ebrahimi Smull(cond, rdlo, rdhi, rn, rm); 4024*f5c631daSSadaf Ebrahimi break; 4025*f5c631daSSadaf Ebrahimi } 4026*f5c631daSSadaf Ebrahimi } Smull(FlagsUpdate flags,Register rdlo,Register rdhi,Register rn,Register rm)4027*f5c631daSSadaf Ebrahimi void Smull(FlagsUpdate flags, 4028*f5c631daSSadaf Ebrahimi Register rdlo, 4029*f5c631daSSadaf Ebrahimi Register rdhi, 4030*f5c631daSSadaf Ebrahimi Register rn, 4031*f5c631daSSadaf Ebrahimi Register rm) { 4032*f5c631daSSadaf Ebrahimi Smull(flags, al, rdlo, rdhi, rn, rm); 4033*f5c631daSSadaf Ebrahimi } 4034*f5c631daSSadaf Ebrahimi Smulls(Condition cond,Register rdlo,Register rdhi,Register rn,Register rm)4035*f5c631daSSadaf Ebrahimi void Smulls( 4036*f5c631daSSadaf Ebrahimi Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4037*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4038*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4039*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4040*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4041*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4042*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4043*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4044*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4045*f5c631daSSadaf Ebrahimi smulls(cond, rdlo, rdhi, rn, rm); 4046*f5c631daSSadaf Ebrahimi } Smulls(Register rdlo,Register rdhi,Register rn,Register rm)4047*f5c631daSSadaf Ebrahimi void Smulls(Register rdlo, Register rdhi, Register rn, Register rm) { 4048*f5c631daSSadaf Ebrahimi Smulls(al, rdlo, rdhi, rn, rm); 4049*f5c631daSSadaf Ebrahimi } 4050*f5c631daSSadaf Ebrahimi Smultb(Condition cond,Register rd,Register rn,Register rm)4051*f5c631daSSadaf Ebrahimi void Smultb(Condition cond, Register rd, Register rn, Register rm) { 4052*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4053*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4054*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4055*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4056*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4057*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4058*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4059*f5c631daSSadaf Ebrahimi smultb(cond, rd, rn, rm); 4060*f5c631daSSadaf Ebrahimi } Smultb(Register rd,Register rn,Register rm)4061*f5c631daSSadaf Ebrahimi void Smultb(Register rd, Register rn, Register rm) { Smultb(al, rd, rn, rm); } 4062*f5c631daSSadaf Ebrahimi Smultt(Condition cond,Register rd,Register rn,Register rm)4063*f5c631daSSadaf Ebrahimi void Smultt(Condition cond, Register rd, Register rn, Register rm) { 4064*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4065*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4066*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4067*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4068*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4069*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4070*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4071*f5c631daSSadaf Ebrahimi smultt(cond, rd, rn, rm); 4072*f5c631daSSadaf Ebrahimi } Smultt(Register rd,Register rn,Register rm)4073*f5c631daSSadaf Ebrahimi void Smultt(Register rd, Register rn, Register rm) { Smultt(al, rd, rn, rm); } 4074*f5c631daSSadaf Ebrahimi Smulwb(Condition cond,Register rd,Register rn,Register rm)4075*f5c631daSSadaf Ebrahimi void Smulwb(Condition cond, Register rd, Register rn, Register rm) { 4076*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4077*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4078*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4079*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4080*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4081*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4082*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4083*f5c631daSSadaf Ebrahimi smulwb(cond, rd, rn, rm); 4084*f5c631daSSadaf Ebrahimi } Smulwb(Register rd,Register rn,Register rm)4085*f5c631daSSadaf Ebrahimi void Smulwb(Register rd, Register rn, Register rm) { Smulwb(al, rd, rn, rm); } 4086*f5c631daSSadaf Ebrahimi Smulwt(Condition cond,Register rd,Register rn,Register rm)4087*f5c631daSSadaf Ebrahimi void Smulwt(Condition cond, Register rd, Register rn, Register rm) { 4088*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4089*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4090*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4091*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4092*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4093*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4094*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4095*f5c631daSSadaf Ebrahimi smulwt(cond, rd, rn, rm); 4096*f5c631daSSadaf Ebrahimi } Smulwt(Register rd,Register rn,Register rm)4097*f5c631daSSadaf Ebrahimi void Smulwt(Register rd, Register rn, Register rm) { Smulwt(al, rd, rn, rm); } 4098*f5c631daSSadaf Ebrahimi Smusd(Condition cond,Register rd,Register rn,Register rm)4099*f5c631daSSadaf Ebrahimi void Smusd(Condition cond, Register rd, Register rn, Register rm) { 4100*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4101*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4102*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4103*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4104*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4105*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4106*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4107*f5c631daSSadaf Ebrahimi smusd(cond, rd, rn, rm); 4108*f5c631daSSadaf Ebrahimi } Smusd(Register rd,Register rn,Register rm)4109*f5c631daSSadaf Ebrahimi void Smusd(Register rd, Register rn, Register rm) { Smusd(al, rd, rn, rm); } 4110*f5c631daSSadaf Ebrahimi Smusdx(Condition cond,Register rd,Register rn,Register rm)4111*f5c631daSSadaf Ebrahimi void Smusdx(Condition cond, Register rd, Register rn, Register rm) { 4112*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4113*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4114*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4115*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4116*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4117*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4118*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4119*f5c631daSSadaf Ebrahimi smusdx(cond, rd, rn, rm); 4120*f5c631daSSadaf Ebrahimi } Smusdx(Register rd,Register rn,Register rm)4121*f5c631daSSadaf Ebrahimi void Smusdx(Register rd, Register rn, Register rm) { Smusdx(al, rd, rn, rm); } 4122*f5c631daSSadaf Ebrahimi Ssat(Condition cond,Register rd,uint32_t imm,const Operand & operand)4123*f5c631daSSadaf Ebrahimi void Ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand) { 4124*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4125*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 4126*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4127*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4128*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4129*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4130*f5c631daSSadaf Ebrahimi ssat(cond, rd, imm, operand); 4131*f5c631daSSadaf Ebrahimi } Ssat(Register rd,uint32_t imm,const Operand & operand)4132*f5c631daSSadaf Ebrahimi void Ssat(Register rd, uint32_t imm, const Operand& operand) { 4133*f5c631daSSadaf Ebrahimi Ssat(al, rd, imm, operand); 4134*f5c631daSSadaf Ebrahimi } 4135*f5c631daSSadaf Ebrahimi Ssat16(Condition cond,Register rd,uint32_t imm,Register rn)4136*f5c631daSSadaf Ebrahimi void Ssat16(Condition cond, Register rd, uint32_t imm, Register rn) { 4137*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4138*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4139*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4140*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4141*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4142*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4143*f5c631daSSadaf Ebrahimi ssat16(cond, rd, imm, rn); 4144*f5c631daSSadaf Ebrahimi } Ssat16(Register rd,uint32_t imm,Register rn)4145*f5c631daSSadaf Ebrahimi void Ssat16(Register rd, uint32_t imm, Register rn) { 4146*f5c631daSSadaf Ebrahimi Ssat16(al, rd, imm, rn); 4147*f5c631daSSadaf Ebrahimi } 4148*f5c631daSSadaf Ebrahimi Ssax(Condition cond,Register rd,Register rn,Register rm)4149*f5c631daSSadaf Ebrahimi void Ssax(Condition cond, Register rd, Register rn, Register rm) { 4150*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4151*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4152*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4153*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4154*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4155*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4156*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4157*f5c631daSSadaf Ebrahimi ssax(cond, rd, rn, rm); 4158*f5c631daSSadaf Ebrahimi } Ssax(Register rd,Register rn,Register rm)4159*f5c631daSSadaf Ebrahimi void Ssax(Register rd, Register rn, Register rm) { Ssax(al, rd, rn, rm); } 4160*f5c631daSSadaf Ebrahimi Ssub16(Condition cond,Register rd,Register rn,Register rm)4161*f5c631daSSadaf Ebrahimi void Ssub16(Condition cond, Register rd, Register rn, Register rm) { 4162*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4163*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4164*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4165*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4166*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4167*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4168*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4169*f5c631daSSadaf Ebrahimi ssub16(cond, rd, rn, rm); 4170*f5c631daSSadaf Ebrahimi } Ssub16(Register rd,Register rn,Register rm)4171*f5c631daSSadaf Ebrahimi void Ssub16(Register rd, Register rn, Register rm) { Ssub16(al, rd, rn, rm); } 4172*f5c631daSSadaf Ebrahimi Ssub8(Condition cond,Register rd,Register rn,Register rm)4173*f5c631daSSadaf Ebrahimi void Ssub8(Condition cond, Register rd, Register rn, Register rm) { 4174*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4175*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4176*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4177*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4178*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4179*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4180*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4181*f5c631daSSadaf Ebrahimi ssub8(cond, rd, rn, rm); 4182*f5c631daSSadaf Ebrahimi } Ssub8(Register rd,Register rn,Register rm)4183*f5c631daSSadaf Ebrahimi void Ssub8(Register rd, Register rn, Register rm) { Ssub8(al, rd, rn, rm); } 4184*f5c631daSSadaf Ebrahimi Stl(Condition cond,Register rt,const MemOperand & operand)4185*f5c631daSSadaf Ebrahimi void Stl(Condition cond, Register rt, const MemOperand& operand) { 4186*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 4187*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 4188*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4189*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4190*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4191*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4192*f5c631daSSadaf Ebrahimi stl(cond, rt, operand); 4193*f5c631daSSadaf Ebrahimi } Stl(Register rt,const MemOperand & operand)4194*f5c631daSSadaf Ebrahimi void Stl(Register rt, const MemOperand& operand) { Stl(al, rt, operand); } 4195*f5c631daSSadaf Ebrahimi Stlb(Condition cond,Register rt,const MemOperand & operand)4196*f5c631daSSadaf Ebrahimi void Stlb(Condition cond, Register rt, const MemOperand& operand) { 4197*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 4198*f5c631daSSadaf Ebrahimi VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 4199*f5c631daSSadaf Ebrahimi VIXL_ASSERT(allow_macro_instructions_); 4200*f5c631daSSadaf Ebrahimi VIXL_ASSERT(OutsideITBlock()); 4201*f5c631daSSadaf Ebrahimi MacroEmissionCheckScope guard(this); 4202*f5c631daSSadaf Ebrahimi ITScope it_scope(this, &cond, guard); 4203*f5c631daSSadaf Ebrahimi stlb(cond, rt, operand); 4204*f5c631daSSadaf Ebrahimi } Stlb(Register rt,const MemOperand & operand)4205