1 // Copyright 2017, VIXL authors 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are met: 6 // 7 // * Redistributions of source code must retain the above copyright notice, 8 // this list of conditions and the following disclaimer. 9 // * Redistributions in binary form must reproduce the above copyright 10 // notice, this list of conditions and the following disclaimer in the 11 // documentation and/or other materials provided with the distribution. 12 // * Neither the name of ARM Limited nor the names of its contributors may 13 // be used to endorse or promote products derived from this software 14 // without specific prior written permission. 15 // 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 // POSSIBILITY OF SUCH DAMAGE. 27 28 #ifndef VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_ 29 #define VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_ 30 31 #include "code-generation-scopes-vixl.h" 32 #include "macro-assembler-interface.h" 33 #include "pool-manager-impl.h" 34 #include "pool-manager.h" 35 #include "utils-vixl.h" 36 37 #include "aarch32/assembler-aarch32.h" 38 #include "aarch32/instructions-aarch32.h" 39 #include "aarch32/operands-aarch32.h" 40 41 namespace vixl { 42 43 namespace aarch32 { 44 45 class UseScratchRegisterScope; 46 47 enum FlagsUpdate { LeaveFlags = 0, SetFlags = 1, DontCare = 2 }; 48 49 // We use a subclass to access the protected `ExactAssemblyScope` constructor 50 // giving us control over the pools, and make the constructor private to limit 51 // usage to code paths emitting pools. 52 class ExactAssemblyScopeWithoutPoolsCheck : public ExactAssemblyScope { 53 private: 54 ExactAssemblyScopeWithoutPoolsCheck(MacroAssembler* masm, 55 size_t size, 56 SizePolicy size_policy = kExactSize); 57 58 friend class MacroAssembler; 59 friend class Label; 60 }; 61 // Macro assembler for aarch32 instruction set. 62 class MacroAssembler : public Assembler, public MacroAssemblerInterface { 63 public: 64 enum FinalizeOption { 65 kFallThrough, // There may be more code to execute after calling Finalize. 66 kUnreachable // Anything generated after calling Finalize is unreachable. 67 }; 68 69 virtual internal::AssemblerBase* AsAssemblerBase() VIXL_OVERRIDE { 70 return this; 71 } 72 73 virtual bool ArePoolsBlocked() const VIXL_OVERRIDE { 74 return pool_manager_.IsBlocked(); 75 } 76 77 virtual void EmitPoolHeader() VIXL_OVERRIDE { 78 // Check that we have the correct alignment. 79 if (IsUsingT32()) { 80 VIXL_ASSERT(GetBuffer()->Is16bitAligned()); 81 } else { 82 VIXL_ASSERT(GetBuffer()->Is32bitAligned()); 83 } 84 VIXL_ASSERT(pool_end_ == NULL); 85 #ifndef PANDA_BUILD 86 pool_end_ = new Label(); 87 #else 88 pool_end_ = allocator_.New<Label>(allocator_); 89 #endif 90 ExactAssemblyScopeWithoutPoolsCheck guard(this, 91 kMaxInstructionSizeInBytes, 92 ExactAssemblyScope::kMaximumSize); 93 b(pool_end_); 94 } 95 virtual void EmitPoolFooter() VIXL_OVERRIDE { 96 // Align buffer to 4 bytes. 97 GetBuffer()->Align(); 98 if (pool_end_ != NULL) { 99 Bind(pool_end_); 100 #ifndef VIXL_USE_PANDA_ALLOC 101 delete pool_end_; 102 #endif 103 pool_end_ = NULL; 104 } 105 } 106 virtual void EmitPaddingBytes(int n) VIXL_OVERRIDE { 107 GetBuffer()->EmitZeroedBytes(n); 108 } 109 virtual void EmitNopBytes(int n) VIXL_OVERRIDE { 110 int nops = 0; 111 int nop_size = IsUsingT32() ? k16BitT32InstructionSizeInBytes 112 : kA32InstructionSizeInBytes; 113 VIXL_ASSERT(n % nop_size == 0); 114 nops = n / nop_size; 115 ExactAssemblyScopeWithoutPoolsCheck guard(this, 116 n, 117 ExactAssemblyScope::kExactSize); 118 for (int i = 0; i < nops; ++i) { 119 nop(); 120 } 121 } 122 123 124 private: 125 class MacroEmissionCheckScope : public EmissionCheckScope { 126 public: MacroEmissionCheckScope(MacroAssemblerInterface* masm, PoolPolicy pool_policy = kBlockPools)127 explicit MacroEmissionCheckScope(MacroAssemblerInterface* masm, 128 PoolPolicy pool_policy = kBlockPools) 129 : EmissionCheckScope(masm, 130 kTypicalMacroInstructionMaxSize, 131 kMaximumSize, 132 pool_policy) {} 133 134 private: 135 static const size_t kTypicalMacroInstructionMaxSize = 136 8 * kMaxInstructionSizeInBytes; 137 }; 138 139 class MacroAssemblerContext { 140 public: MacroAssemblerContext()141 MacroAssemblerContext() : count_(0) {} ~MacroAssemblerContext()142 ~MacroAssemblerContext() {} GetRecursiveCount() const143 unsigned GetRecursiveCount() const { return count_; } Up(const char* loc)144 void Up(const char* loc) { 145 location_stack_[count_] = loc; 146 count_++; 147 if (count_ >= kMaxRecursion) { 148 printf( 149 "Recursion limit reached; unable to resolve macro assembler " 150 "call.\n"); 151 printf("Macro assembler context stack:\n"); 152 for (unsigned i = 0; i < kMaxRecursion; i++) { 153 printf("%10s %s\n", (i == 0) ? "oldest -> " : "", location_stack_[i]); 154 } 155 VIXL_ABORT(); 156 } 157 } Down()158 void Down() { 159 VIXL_ASSERT((count_ > 0) && (count_ < kMaxRecursion)); 160 count_--; 161 } 162 163 private: 164 unsigned count_; 165 static const uint32_t kMaxRecursion = 6; 166 const char* location_stack_[kMaxRecursion]; 167 }; 168 169 // This scope is used at each Delegate entry to avoid infinite recursion of 170 // Delegate calls. The limit is defined by 171 // MacroAssemblerContext::kMaxRecursion. 172 class ContextScope { 173 public: ContextScope(MacroAssembler* const masm, const char* loc)174 explicit ContextScope(MacroAssembler* const masm, const char* loc) 175 : masm_(masm) { 176 VIXL_ASSERT(masm_->AllowMacroInstructions()); 177 masm_->GetContext()->Up(loc); 178 } ~ContextScope()179 ~ContextScope() { masm_->GetContext()->Down(); } 180 181 private: 182 MacroAssembler* const masm_; 183 }; 184 GetContext()185 MacroAssemblerContext* GetContext() { return &context_; } 186 187 class ITScope { 188 public: 189 #ifndef PANDA_BUILD ITScope(MacroAssembler* masm, Condition* cond, const MacroEmissionCheckScope& scope, bool can_use_it = false)190 ITScope(MacroAssembler* masm, 191 Condition* cond, 192 const MacroEmissionCheckScope& scope, 193 bool can_use_it = false) 194 : masm_(masm), cond_(*cond), can_use_it_(can_use_it) { 195 #else 196 ITScope(MacroAssembler* , Condition* , const MacroEmissionCheckScope& , 197 bool can_use_it = false) = delete; 198 ITScope(AllocatorWrapper allocator, MacroAssembler* masm, 199 Condition* cond, 200 const MacroEmissionCheckScope& scope, 201 bool can_use_it = false) 202 : masm_(masm), cond_(*cond), label_(allocator), can_use_it_(can_use_it) { 203 #endif 204 // The 'scope' argument is used to remind us to only use this scope inside 205 // a MacroEmissionCheckScope. This way, we do not need to check whether 206 // we need to emit the pools or grow the code buffer when emitting the 207 // IT or B instructions. 208 USE(scope); 209 if (!cond_.Is(al) && masm->IsUsingT32()) { 210 if (can_use_it_) { 211 // IT is not deprecated (that implies a 16 bit T32 instruction). 212 // We generate an IT instruction and a conditional instruction. 213 masm->it(cond_); 214 } else { 215 // The usage of IT is deprecated for the instruction. 216 // We generate a conditional branch and an unconditional instruction. 217 // Generate the branch. 218 masm_->b(cond_.Negate(), Narrow, &label_); 219 // Tell the macro-assembler to generate unconditional instructions. 220 *cond = al; 221 } 222 } 223 #ifdef VIXL_DEBUG 224 initial_cursor_offset_ = masm->GetCursorOffset(); 225 #else 226 USE(initial_cursor_offset_); 227 #endif 228 } 229 ~ITScope() { 230 if (label_.IsReferenced()) { 231 // We only use the label for conditional T32 instructions for which we 232 // cannot use IT. 233 VIXL_ASSERT(!cond_.Is(al)); 234 VIXL_ASSERT(masm_->IsUsingT32()); 235 VIXL_ASSERT(!can_use_it_); 236 VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <= 237 kMaxT32MacroInstructionSizeInBytes); 238 masm_->BindHelper(&label_); 239 } else if (masm_->IsUsingT32() && !cond_.Is(al)) { 240 // If we've generated a conditional T32 instruction but haven't used the 241 // label, we must have used IT. Check that we did not generate a 242 // deprecated sequence. 243 VIXL_ASSERT(can_use_it_); 244 VIXL_ASSERT(masm_->GetCursorOffset() - initial_cursor_offset_ <= 245 k16BitT32InstructionSizeInBytes); 246 } 247 } 248 249 private: 250 MacroAssembler* masm_; 251 Condition cond_; 252 Label label_; 253 bool can_use_it_; 254 uint32_t initial_cursor_offset_; 255 }; 256 257 protected: 258 virtual void BlockPools() VIXL_OVERRIDE { pool_manager_.Block(); } 259 virtual void ReleasePools() VIXL_OVERRIDE { 260 pool_manager_.Release(GetCursorOffset()); 261 } 262 virtual void EnsureEmitPoolsFor(size_t size) VIXL_OVERRIDE; 263 264 // Tell whether any of the macro instruction can be used. When false the 265 // MacroAssembler will assert if a method which can emit a variable number 266 // of instructions is called. 267 virtual void SetAllowMacroInstructions(bool value) VIXL_OVERRIDE { 268 allow_macro_instructions_ = value; 269 } 270 271 void HandleOutOfBoundsImmediate(Condition cond, Register tmp, uint32_t imm); 272 273 public: 274 // TODO: If we change the MacroAssembler to disallow setting a different ISA, 275 // we can change the alignment of the pool in the pool manager constructor to 276 // be 2 bytes for T32. 277 #ifdef PANDA_BUILD MacroAssembler(PandaAllocator* allocator, InstructionSet isa = kDefaultISA)278 explicit MacroAssembler(PandaAllocator* allocator, InstructionSet isa = kDefaultISA) 279 #else 280 explicit MacroAssembler(InstructionSet isa = kDefaultISA) 281 #endif 282 : Assembler(isa), 283 available_(r12), 284 current_scratch_scope_(NULL), 285 #ifndef PANDA_BUILD 286 pool_manager_(4 /*header_size*/, 287 4 /*alignment*/, 288 4 /*buffer_alignment*/), 289 generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE), 290 pool_end_(NULL) { 291 #else 292 pool_manager_(allocator, 293 4 /*header_size*/, 294 4 /*alignment*/, 295 4 /*buffer_alignment*/), 296 generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE), 297 pool_end_(NULL), allocator_(allocator) { 298 #endif 299 #ifdef VIXL_DEBUG 300 SetAllowMacroInstructions( // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall) 301 true); 302 #else 303 USE(allow_macro_instructions_); 304 #endif 305 } 306 307 #ifdef PANDA_BUILD 308 explicit MacroAssembler(size_t size, InstructionSet isa = kDefaultISA) = delete; 309 #else 310 explicit MacroAssembler(size_t size, InstructionSet isa = kDefaultISA) 311 : Assembler(size, isa), 312 available_(r12), 313 current_scratch_scope_(NULL), 314 pool_manager_(4 /*header_size*/, 315 4 /*alignment*/, 316 4 /*buffer_alignment*/), 317 generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE), 318 pool_end_(NULL) { 319 #ifdef VIXL_DEBUG 320 SetAllowMacroInstructions( // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall) 321 true); 322 #endif 323 } 324 #endif 325 326 #ifndef PANDA_BUILD 327 MacroAssembler(byte* buffer, size_t size, InstructionSet isa = kDefaultISA) 328 : Assembler(buffer, size, isa), 329 available_(r12), 330 current_scratch_scope_(NULL), 331 pool_manager_(4 /*header_size*/, 332 4 /*alignment*/, 333 4 /*buffer_alignment*/), 334 generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE), 335 pool_end_(NULL) { 336 #else 337 MacroAssembler(PandaAllocator* allocator, byte* buffer, size_t size, InstructionSet isa = kDefaultISA) 338 : Assembler(buffer, size, isa), 339 available_(r12), 340 current_scratch_scope_(NULL), 341 pool_manager_(allocator, 342 4 /*header_size*/, 343 4 /*alignment*/, 344 4 /*buffer_alignment*/), 345 generate_simulator_code_(VIXL_AARCH32_GENERATE_SIMULATOR_CODE), 346 pool_end_(NULL), allocator_(allocator) { 347 #endif 348 #ifdef VIXL_DEBUG 349 SetAllowMacroInstructions( // NOLINT(clang-analyzer-optin.cplusplus.VirtualCall) 350 true); 351 #endif 352 } 353 354 bool GenerateSimulatorCode() const { return generate_simulator_code_; } 355 356 virtual bool AllowMacroInstructions() const VIXL_OVERRIDE { 357 return allow_macro_instructions_; 358 } 359 360 void FinalizeCode(FinalizeOption option = kUnreachable) { 361 EmitLiteralPool(option == kUnreachable 362 ? PoolManager<int32_t>::kNoBranchRequired 363 : PoolManager<int32_t>::kBranchRequired); 364 Assembler::FinalizeCode(); 365 } 366 367 RegisterList* GetScratchRegisterList() { return &available_; } 368 VRegisterList* GetScratchVRegisterList() { return &available_vfp_; } 369 370 // Get or set the current (most-deeply-nested) UseScratchRegisterScope. 371 void SetCurrentScratchRegisterScope(UseScratchRegisterScope* scope) { 372 current_scratch_scope_ = scope; 373 } 374 UseScratchRegisterScope* GetCurrentScratchRegisterScope() { 375 return current_scratch_scope_; 376 } 377 378 // Given an address calculation (Register + immediate), generate code to 379 // partially compute the address. The returned MemOperand will perform any 380 // remaining computation in a subsequent load or store instruction. 381 // 382 // The offset provided should be the offset that would be used in a load or 383 // store instruction (if it had sufficient range). This only matters where 384 // base.Is(pc), since load and store instructions align the pc before 385 // dereferencing it. 386 // 387 // TODO: Improve the handling of negative offsets. They are not implemented 388 // precisely for now because they only have a marginal benefit for the 389 // existing uses (in delegates). 390 MemOperand MemOperandComputationHelper(Condition cond, 391 Register scratch, 392 Register base, 393 uint32_t offset, 394 uint32_t extra_offset_mask = 0); 395 396 MemOperand MemOperandComputationHelper(Register scratch, 397 Register base, 398 uint32_t offset, 399 uint32_t extra_offset_mask = 0) { 400 return MemOperandComputationHelper(al, 401 scratch, 402 base, 403 offset, 404 extra_offset_mask); 405 } 406 MemOperand MemOperandComputationHelper(Condition cond, 407 Register scratch, 408 Location* location, 409 uint32_t extra_offset_mask = 0) { 410 // Check for buffer space _before_ calculating the offset, in case we 411 // generate a pool that affects the offset calculation. 412 CodeBufferCheckScope scope(this, 4 * kMaxInstructionSizeInBytes); 413 Label::Offset offset = 414 location->GetLocation() - 415 AlignDown(GetCursorOffset() + GetArchitectureStatePCOffset(), 4); 416 return MemOperandComputationHelper(cond, 417 scratch, 418 pc, 419 offset, 420 extra_offset_mask); 421 } 422 MemOperand MemOperandComputationHelper(Register scratch, 423 Location* location, 424 uint32_t extra_offset_mask = 0) { 425 return MemOperandComputationHelper(al, 426 scratch, 427 location, 428 extra_offset_mask); 429 } 430 431 // Determine the appropriate mask to pass into MemOperandComputationHelper. 432 uint32_t GetOffsetMask(InstructionType type, AddrMode addrmode); 433 434 // State and type helpers. 435 bool IsModifiedImmediate(uint32_t imm) { 436 return IsUsingT32() ? ImmediateT32::IsImmediateT32(imm) 437 : ImmediateA32::IsImmediateA32(imm); 438 } 439 440 void Bind(Label* label) { 441 VIXL_ASSERT(allow_macro_instructions_); 442 BindHelper(label); 443 } 444 445 virtual void BindHelper(Label* label) VIXL_OVERRIDE { 446 // Assert that we have the correct buffer alignment. 447 if (IsUsingT32()) { 448 VIXL_ASSERT(GetBuffer()->Is16bitAligned()); 449 } else { 450 VIXL_ASSERT(GetBuffer()->Is32bitAligned()); 451 } 452 // If we need to add padding, check if we have to emit the pool. 453 const int32_t cursor = GetCursorOffset(); 454 if (label->Needs16BitPadding(cursor)) { 455 const int kPaddingBytes = 2; 456 if (pool_manager_.MustEmit(cursor, kPaddingBytes)) { 457 int32_t new_cursor = pool_manager_.Emit(this, cursor, kPaddingBytes); 458 USE(new_cursor); 459 VIXL_ASSERT(new_cursor == GetCursorOffset()); 460 } 461 } 462 pool_manager_.Bind(this, label, GetCursorOffset()); 463 } 464 465 void RegisterLiteralReference(RawLiteral* literal) { 466 if (literal->IsManuallyPlaced()) return; 467 RegisterForwardReference(literal); 468 } 469 470 void RegisterForwardReference(Location* location) { 471 if (location->IsBound()) return; 472 VIXL_ASSERT(location->HasForwardReferences()); 473 const Location::ForwardRef& reference = location->GetLastForwardReference(); 474 pool_manager_.AddObjectReference(&reference, location); 475 } 476 477 void CheckEmitPoolForInstruction(const ReferenceInfo* info, 478 Location* location, 479 Condition* cond = NULL) { 480 int size = info->size; 481 int32_t cursor = GetCursorOffset(); 482 // If we need to emit a branch over the instruction, take this into account. 483 if ((cond != NULL) && NeedBranch(cond)) { 484 size += kBranchSize; 485 cursor += kBranchSize; 486 } 487 int32_t from = cursor; 488 from += IsUsingT32() ? kT32PcDelta : kA32PcDelta; 489 if (info->pc_needs_aligning) from = AlignDown(from, 4); 490 int32_t min = from + info->min_offset; 491 int32_t max = from + info->max_offset; 492 ForwardReference<int32_t> temp_ref(cursor, 493 info->size, 494 min, 495 max, 496 info->alignment); 497 if (pool_manager_.MustEmit(GetCursorOffset(), size, &temp_ref, location)) { 498 int32_t new_cursor = pool_manager_.Emit(this, 499 GetCursorOffset(), 500 info->size, 501 &temp_ref, 502 location); 503 USE(new_cursor); 504 VIXL_ASSERT(new_cursor == GetCursorOffset()); 505 } 506 } 507 508 void Place(RawLiteral* literal) { 509 VIXL_ASSERT(allow_macro_instructions_); 510 VIXL_ASSERT(literal->IsManuallyPlaced()); 511 // Check if we need to emit the pools. Take the alignment of the literal 512 // into account, as well as potential 16-bit padding needed to reach the 513 // minimum accessible location. 514 int alignment = literal->GetMaxAlignment(); 515 int32_t cursor = GetCursorOffset(); 516 int total_size = AlignUp(cursor, alignment) - cursor + literal->GetSize(); 517 if (literal->Needs16BitPadding(cursor)) total_size += 2; 518 if (pool_manager_.MustEmit(cursor, total_size)) { 519 int32_t new_cursor = pool_manager_.Emit(this, cursor, total_size); 520 USE(new_cursor); 521 VIXL_ASSERT(new_cursor == GetCursorOffset()); 522 } 523 pool_manager_.Bind(this, literal, GetCursorOffset()); 524 literal->EmitPoolObject(this); 525 // Align the buffer, to be ready to generate instructions right after 526 // this. 527 GetBuffer()->Align(); 528 } 529 530 void EmitLiteralPool(PoolManager<int32_t>::EmitOption option = 531 PoolManager<int32_t>::kBranchRequired) { 532 VIXL_ASSERT(!ArePoolsBlocked()); 533 int32_t new_pc = 534 pool_manager_.Emit(this, GetCursorOffset(), 0, NULL, NULL, option); 535 VIXL_ASSERT(new_pc == GetCursorOffset()); 536 USE(new_pc); 537 } 538 539 void EnsureEmitFor(uint32_t size) { 540 EnsureEmitPoolsFor(size); 541 GetBuffer()->EnsureSpaceFor(size); 542 } 543 544 bool AliasesAvailableScratchRegister([[maybe_unused]] Register reg) { 545 #ifndef PANDA_BUILD 546 return GetScratchRegisterList()->Includes(reg); 547 #endif 548 return false; 549 } 550 551 bool AliasesAvailableScratchRegister([[maybe_unused]] RegisterOrAPSR_nzcv reg) { 552 #ifndef PANDA_BUILD 553 if (reg.IsAPSR_nzcv()) return false; 554 return GetScratchRegisterList()->Includes(reg.AsRegister()); 555 #endif 556 return false; 557 } 558 559 bool AliasesAvailableScratchRegister([[maybe_unused]] VRegister reg) { 560 #ifndef PANDA_BUILD 561 return GetScratchVRegisterList()->IncludesAliasOf(reg); 562 #endif 563 return false; 564 } 565 566 bool AliasesAvailableScratchRegister([[maybe_unused]] const Operand& operand) { 567 #ifndef PANDA_BUILD 568 if (operand.IsImmediate()) return false; 569 return AliasesAvailableScratchRegister(operand.GetBaseRegister()) || 570 (operand.IsRegisterShiftedRegister() && 571 AliasesAvailableScratchRegister(operand.GetShiftRegister())); 572 #endif 573 return false; 574 } 575 576 bool AliasesAvailableScratchRegister([[maybe_unused]] const NeonOperand& operand) { 577 #ifndef PANDA_BUILD 578 if (operand.IsImmediate()) return false; 579 return AliasesAvailableScratchRegister(operand.GetRegister()); 580 #endif 581 return false; 582 } 583 584 bool AliasesAvailableScratchRegister([[maybe_unused]] SRegisterList list) { 585 #ifndef PANDA_BUILD 586 for (int n = 0; n < list.GetLength(); n++) { 587 if (AliasesAvailableScratchRegister(list.GetSRegister(n))) return true; 588 } 589 return false; 590 #endif 591 return false; 592 } 593 594 bool AliasesAvailableScratchRegister([[maybe_unused]] DRegisterList list) { 595 #ifndef PANDA_BUILD 596 for (int n = 0; n < list.GetLength(); n++) { 597 if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true; 598 } 599 return false; 600 #endif 601 return false; 602 } 603 604 bool AliasesAvailableScratchRegister([[maybe_unused]] NeonRegisterList list) { 605 #ifndef PANDA_BUILD 606 for (int n = 0; n < list.GetLength(); n++) { 607 if (AliasesAvailableScratchRegister(list.GetDRegister(n))) return true; 608 } 609 return false; 610 #endif 611 return false; 612 } 613 614 bool AliasesAvailableScratchRegister([[maybe_unused]] RegisterList list) { 615 #ifndef PANDA_BUILD 616 return GetScratchRegisterList()->Overlaps(list); 617 #endif 618 return false; 619 } 620 621 bool AliasesAvailableScratchRegister([[maybe_unused]] const MemOperand& operand) { 622 #ifndef PANDA_BUILD 623 return AliasesAvailableScratchRegister(operand.GetBaseRegister()) || 624 (operand.IsShiftedRegister() && 625 AliasesAvailableScratchRegister(operand.GetOffsetRegister())); 626 #endif 627 return false; 628 } 629 630 // Adr with a literal already constructed. Add the literal to the pool if it 631 // is not already done. 632 void Adr(Condition cond, Register rd, RawLiteral* literal) { 633 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 634 VIXL_ASSERT(allow_macro_instructions_); 635 VIXL_ASSERT(OutsideITBlock()); 636 MacroEmissionCheckScope::PoolPolicy pool_policy = 637 MacroEmissionCheckScope::kBlockPools; 638 if (!literal->IsBound()) { 639 const ReferenceInfo* info; 640 bool can_encode = adr_info(cond, Best, rd, literal, &info); 641 VIXL_CHECK(can_encode); 642 CheckEmitPoolForInstruction(info, literal, &cond); 643 // We have already checked for pool emission. 644 pool_policy = MacroEmissionCheckScope::kIgnorePools; 645 } 646 MacroEmissionCheckScope guard(this, pool_policy); 647 #ifndef PANDA_BUILD 648 ITScope it_scope(this, &cond, guard); 649 #else 650 ITScope it_scope(allocator_, this, &cond, guard); 651 #endif 652 adr(cond, Best, rd, literal); 653 RegisterLiteralReference(literal); 654 } 655 void Adr(Register rd, RawLiteral* literal) { Adr(al, rd, literal); } 656 657 // Loads with literals already constructed. Add the literal to the pool 658 // if it is not already done. 659 void Ldr(Condition cond, Register rt, RawLiteral* literal) { 660 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 661 VIXL_ASSERT(allow_macro_instructions_); 662 VIXL_ASSERT(OutsideITBlock()); 663 MacroEmissionCheckScope::PoolPolicy pool_policy = 664 MacroEmissionCheckScope::kBlockPools; 665 if (!literal->IsBound()) { 666 const ReferenceInfo* info; 667 bool can_encode = ldr_info(cond, Best, rt, literal, &info); 668 VIXL_CHECK(can_encode); 669 CheckEmitPoolForInstruction(info, literal, &cond); 670 // We have already checked for pool emission. 671 pool_policy = MacroEmissionCheckScope::kIgnorePools; 672 } 673 MacroEmissionCheckScope guard(this, pool_policy); 674 #ifndef PANDA_BUILD 675 ITScope it_scope(this, &cond, guard); 676 #else 677 ITScope it_scope(allocator_, this, &cond, guard); 678 #endif 679 ldr(cond, rt, literal); 680 RegisterLiteralReference(literal); 681 } 682 void Ldr(Register rt, RawLiteral* literal) { Ldr(al, rt, literal); } 683 684 void Ldrb(Condition cond, Register rt, RawLiteral* literal) { 685 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 686 VIXL_ASSERT(allow_macro_instructions_); 687 VIXL_ASSERT(OutsideITBlock()); 688 MacroEmissionCheckScope::PoolPolicy pool_policy = 689 MacroEmissionCheckScope::kBlockPools; 690 if (!literal->IsBound()) { 691 const ReferenceInfo* info; 692 bool can_encode = ldrb_info(cond, rt, literal, &info); 693 VIXL_CHECK(can_encode); 694 CheckEmitPoolForInstruction(info, literal, &cond); 695 // We have already checked for pool emission. 696 pool_policy = MacroEmissionCheckScope::kIgnorePools; 697 } 698 MacroEmissionCheckScope guard(this, pool_policy); 699 #ifndef PANDA_BUILD 700 ITScope it_scope(this, &cond, guard); 701 #else 702 ITScope it_scope(allocator_, this, &cond, guard); 703 #endif 704 ldrb(cond, rt, literal); 705 RegisterLiteralReference(literal); 706 } 707 void Ldrb(Register rt, RawLiteral* literal) { Ldrb(al, rt, literal); } 708 709 void Ldrd(Condition cond, Register rt, Register rt2, RawLiteral* literal) { 710 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 711 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 712 VIXL_ASSERT(allow_macro_instructions_); 713 VIXL_ASSERT(OutsideITBlock()); 714 MacroEmissionCheckScope::PoolPolicy pool_policy = 715 MacroEmissionCheckScope::kBlockPools; 716 if (!literal->IsBound()) { 717 const ReferenceInfo* info; 718 bool can_encode = ldrd_info(cond, rt, rt2, literal, &info); 719 VIXL_CHECK(can_encode); 720 CheckEmitPoolForInstruction(info, literal, &cond); 721 // We have already checked for pool emission. 722 pool_policy = MacroEmissionCheckScope::kIgnorePools; 723 } 724 MacroEmissionCheckScope guard(this, pool_policy); 725 #ifndef PANDA_BUILD 726 ITScope it_scope(this, &cond, guard); 727 #else 728 ITScope it_scope(allocator_, this, &cond, guard); 729 #endif 730 ldrd(cond, rt, rt2, literal); 731 RegisterLiteralReference(literal); 732 } 733 void Ldrd(Register rt, Register rt2, RawLiteral* literal) { 734 Ldrd(al, rt, rt2, literal); 735 } 736 737 void Ldrh(Condition cond, Register rt, RawLiteral* literal) { 738 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 739 VIXL_ASSERT(allow_macro_instructions_); 740 VIXL_ASSERT(OutsideITBlock()); 741 MacroEmissionCheckScope::PoolPolicy pool_policy = 742 MacroEmissionCheckScope::kBlockPools; 743 if (!literal->IsBound()) { 744 const ReferenceInfo* info; 745 bool can_encode = ldrh_info(cond, rt, literal, &info); 746 VIXL_CHECK(can_encode); 747 CheckEmitPoolForInstruction(info, literal, &cond); 748 // We have already checked for pool emission. 749 pool_policy = MacroEmissionCheckScope::kIgnorePools; 750 } 751 MacroEmissionCheckScope guard(this, pool_policy); 752 #ifndef PANDA_BUILD 753 ITScope it_scope(this, &cond, guard); 754 #else 755 ITScope it_scope(allocator_, this, &cond, guard); 756 #endif 757 ldrh(cond, rt, literal); 758 RegisterLiteralReference(literal); 759 } 760 void Ldrh(Register rt, RawLiteral* literal) { Ldrh(al, rt, literal); } 761 762 void Ldrsb(Condition cond, Register rt, RawLiteral* literal) { 763 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 764 VIXL_ASSERT(allow_macro_instructions_); 765 VIXL_ASSERT(OutsideITBlock()); 766 MacroEmissionCheckScope::PoolPolicy pool_policy = 767 MacroEmissionCheckScope::kBlockPools; 768 if (!literal->IsBound()) { 769 const ReferenceInfo* info; 770 bool can_encode = ldrsb_info(cond, rt, literal, &info); 771 VIXL_CHECK(can_encode); 772 CheckEmitPoolForInstruction(info, literal, &cond); 773 // We have already checked for pool emission. 774 pool_policy = MacroEmissionCheckScope::kIgnorePools; 775 } 776 MacroEmissionCheckScope guard(this, pool_policy); 777 #ifndef PANDA_BUILD 778 ITScope it_scope(this, &cond, guard); 779 #else 780 ITScope it_scope(allocator_, this, &cond, guard); 781 #endif 782 ldrsb(cond, rt, literal); 783 RegisterLiteralReference(literal); 784 } 785 void Ldrsb(Register rt, RawLiteral* literal) { Ldrsb(al, rt, literal); } 786 787 void Ldrsh(Condition cond, Register rt, RawLiteral* literal) { 788 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 789 VIXL_ASSERT(allow_macro_instructions_); 790 VIXL_ASSERT(OutsideITBlock()); 791 MacroEmissionCheckScope::PoolPolicy pool_policy = 792 MacroEmissionCheckScope::kBlockPools; 793 if (!literal->IsBound()) { 794 const ReferenceInfo* info; 795 bool can_encode = ldrsh_info(cond, rt, literal, &info); 796 VIXL_CHECK(can_encode); 797 CheckEmitPoolForInstruction(info, literal, &cond); 798 // We have already checked for pool emission. 799 pool_policy = MacroEmissionCheckScope::kIgnorePools; 800 } 801 MacroEmissionCheckScope guard(this, pool_policy); 802 #ifndef PANDA_BUILD 803 ITScope it_scope(this, &cond, guard); 804 #else 805 ITScope it_scope(allocator_, this, &cond, guard); 806 #endif 807 ldrsh(cond, rt, literal); 808 RegisterLiteralReference(literal); 809 } 810 void Ldrsh(Register rt, RawLiteral* literal) { Ldrsh(al, rt, literal); } 811 812 void Vldr(Condition cond, DataType dt, DRegister rd, RawLiteral* literal) { 813 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 814 VIXL_ASSERT(allow_macro_instructions_); 815 VIXL_ASSERT(OutsideITBlock()); 816 MacroEmissionCheckScope::PoolPolicy pool_policy = 817 MacroEmissionCheckScope::kBlockPools; 818 if (!literal->IsBound()) { 819 const ReferenceInfo* info; 820 bool can_encode = vldr_info(cond, dt, rd, literal, &info); 821 VIXL_CHECK(can_encode); 822 CheckEmitPoolForInstruction(info, literal, &cond); 823 // We have already checked for pool emission. 824 pool_policy = MacroEmissionCheckScope::kIgnorePools; 825 } 826 MacroEmissionCheckScope guard(this, pool_policy); 827 #ifndef PANDA_BUILD 828 ITScope it_scope(this, &cond, guard); 829 #else 830 ITScope it_scope(allocator_, this, &cond, guard); 831 #endif 832 vldr(cond, dt, rd, literal); 833 RegisterLiteralReference(literal); 834 } 835 void Vldr(DataType dt, DRegister rd, RawLiteral* literal) { 836 Vldr(al, dt, rd, literal); 837 } 838 void Vldr(Condition cond, DRegister rd, RawLiteral* literal) { 839 Vldr(cond, Untyped64, rd, literal); 840 } 841 void Vldr(DRegister rd, RawLiteral* literal) { 842 Vldr(al, Untyped64, rd, literal); 843 } 844 845 void Vldr(Condition cond, DataType dt, SRegister rd, RawLiteral* literal) { 846 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 847 VIXL_ASSERT(allow_macro_instructions_); 848 VIXL_ASSERT(OutsideITBlock()); 849 MacroEmissionCheckScope::PoolPolicy pool_policy = 850 MacroEmissionCheckScope::kBlockPools; 851 if (!literal->IsBound()) { 852 const ReferenceInfo* info; 853 bool can_encode = vldr_info(cond, dt, rd, literal, &info); 854 VIXL_CHECK(can_encode); 855 CheckEmitPoolForInstruction(info, literal, &cond); 856 // We have already checked for pool emission. 857 pool_policy = MacroEmissionCheckScope::kIgnorePools; 858 } 859 MacroEmissionCheckScope guard(this, pool_policy); 860 #ifndef PANDA_BUILD 861 ITScope it_scope(this, &cond, guard); 862 #else 863 ITScope it_scope(allocator_, this, &cond, guard); 864 #endif 865 vldr(cond, dt, rd, literal); 866 RegisterLiteralReference(literal); 867 } 868 void Vldr(DataType dt, SRegister rd, RawLiteral* literal) { 869 Vldr(al, dt, rd, literal); 870 } 871 void Vldr(Condition cond, SRegister rd, RawLiteral* literal) { 872 Vldr(cond, Untyped32, rd, literal); 873 } 874 void Vldr(SRegister rd, RawLiteral* literal) { 875 Vldr(al, Untyped32, rd, literal); 876 } 877 878 // Generic Ldr(register, data) 879 void Ldr(Condition cond, Register rt, uint32_t v) { 880 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 881 VIXL_ASSERT(allow_macro_instructions_); 882 VIXL_ASSERT(OutsideITBlock()); 883 #ifndef PANDA_BUILD 884 RawLiteral* literal = 885 new Literal<uint32_t>(v, RawLiteral::kDeletedOnPlacementByPool); 886 #else 887 RawLiteral* literal = allocator_.New<Literal<uint32_t>>( 888 allocator_, v, RawLiteral::kDeletedOnPlacementByPool); 889 #endif 890 Ldr(cond, rt, literal); 891 } 892 template <typename T> 893 void Ldr(Register rt, T v) { 894 Ldr(al, rt, v); 895 } 896 897 // Generic Ldrd(rt, rt2, data) 898 void Ldrd(Condition cond, Register rt, Register rt2, uint64_t v) { 899 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 900 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 901 VIXL_ASSERT(allow_macro_instructions_); 902 VIXL_ASSERT(OutsideITBlock()); 903 #ifndef PANDA_BUILD 904 RawLiteral* literal = 905 new Literal<uint64_t>(v, RawLiteral::kDeletedOnPlacementByPool); 906 #else 907 RawLiteral* literal = allocator_.New<Literal<uint64_t>>( 908 allocator_, v, RawLiteral::kDeletedOnPlacementByPool); 909 #endif 910 Ldrd(cond, rt, rt2, literal); 911 } 912 template <typename T> 913 void Ldrd(Register rt, Register rt2, T v) { 914 Ldrd(al, rt, rt2, v); 915 } 916 917 void Vldr(Condition cond, SRegister rd, float v) { 918 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 919 VIXL_ASSERT(allow_macro_instructions_); 920 VIXL_ASSERT(OutsideITBlock()); 921 #ifndef PANDA_BUILD 922 RawLiteral* literal = 923 new Literal<float>(v, RawLiteral::kDeletedOnPlacementByPool); 924 #else 925 RawLiteral* literal = allocator_.New<Literal<float>>( 926 allocator_, v, RawLiteral::kDeletedOnPlacementByPool); 927 #endif 928 Vldr(cond, rd, literal); 929 } 930 void Vldr(SRegister rd, float v) { Vldr(al, rd, v); } 931 932 void Vldr(Condition cond, DRegister rd, double v) { 933 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 934 VIXL_ASSERT(allow_macro_instructions_); 935 VIXL_ASSERT(OutsideITBlock()); 936 #ifndef PANDA_BUILD 937 RawLiteral* literal = 938 new Literal<double>(v, RawLiteral::kDeletedOnPlacementByPool); 939 #else 940 RawLiteral* literal = allocator_.New<Literal<double>>( 941 allocator_, v, RawLiteral::kDeletedOnPlacementByPool); 942 #endif 943 Vldr(cond, rd, literal); 944 } 945 void Vldr(DRegister rd, double v) { Vldr(al, rd, v); } 946 947 void Vmov(Condition cond, DRegister rt, double v) { Vmov(cond, F64, rt, v); } 948 void Vmov(DRegister rt, double v) { Vmov(al, F64, rt, v); } 949 void Vmov(Condition cond, SRegister rt, float v) { Vmov(cond, F32, rt, v); } 950 void Vmov(SRegister rt, float v) { Vmov(al, F32, rt, v); } 951 952 // Claim memory on the stack. 953 // Note that the Claim, Drop, and Peek helpers below ensure that offsets used 954 // are multiples of 32 bits to help maintain 32-bit SP alignment. 955 // We could `Align{Up,Down}(size, 4)`, but that's potentially problematic: 956 // Claim(3) 957 // Claim(1) 958 // Drop(4) 959 // would seem correct, when in fact: 960 // Claim(3) -> sp = sp - 4 961 // Claim(1) -> sp = sp - 4 962 // Drop(4) -> sp = sp + 4 963 // 964 void Claim(int32_t size) { 965 if (size == 0) return; 966 // The stack must be kept 32bit aligned. 967 VIXL_ASSERT((size > 0) && ((size % 4) == 0)); 968 Sub(sp, sp, size); 969 } 970 // Release memory on the stack 971 void Drop(int32_t size) { 972 if (size == 0) return; 973 // The stack must be kept 32bit aligned. 974 VIXL_ASSERT((size > 0) && ((size % 4) == 0)); 975 Add(sp, sp, size); 976 } 977 void Peek(Register dst, int32_t offset) { 978 VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0)); 979 Ldr(dst, MemOperand(sp, offset)); 980 } 981 void Poke(Register src, int32_t offset) { 982 VIXL_ASSERT((offset >= 0) && ((offset % 4) == 0)); 983 Str(src, MemOperand(sp, offset)); 984 } 985 void Printf(const char* format, 986 CPURegister reg1 = NoReg, 987 CPURegister reg2 = NoReg, 988 CPURegister reg3 = NoReg, 989 CPURegister reg4 = NoReg); 990 // Functions used by Printf for generation. 991 void PushRegister(CPURegister reg); 992 void PreparePrintfArgument(CPURegister reg, 993 int* core_count, 994 int* vfp_count, 995 uint32_t* printf_type); 996 // Handlers for cases not handled by the assembler. 997 // ADD, MOVT, MOVW, SUB, SXTB16, TEQ, UXTB16 998 virtual void Delegate(InstructionType type, 999 InstructionCondROp instruction, 1000 Condition cond, 1001 Register rn, 1002 const Operand& operand) VIXL_OVERRIDE; 1003 // CMN, CMP, MOV, MOVS, MVN, MVNS, SXTB, SXTH, TST, UXTB, UXTH 1004 virtual void Delegate(InstructionType type, 1005 InstructionCondSizeROp instruction, 1006 Condition cond, 1007 EncodingSize size, 1008 Register rn, 1009 const Operand& operand) VIXL_OVERRIDE; 1010 // ADDW, ORN, ORNS, PKHBT, PKHTB, RSC, RSCS, SUBW, SXTAB, SXTAB16, SXTAH, 1011 // UXTAB, UXTAB16, UXTAH 1012 virtual void Delegate(InstructionType type, 1013 InstructionCondRROp instruction, 1014 Condition cond, 1015 Register rd, 1016 Register rn, 1017 const Operand& operand) VIXL_OVERRIDE; 1018 // ADC, ADCS, ADD, ADDS, AND, ANDS, ASR, ASRS, BIC, BICS, EOR, EORS, LSL, 1019 // LSLS, LSR, LSRS, ORR, ORRS, ROR, RORS, RSB, RSBS, SBC, SBCS, SUB, SUBS 1020 virtual void Delegate(InstructionType type, 1021 InstructionCondSizeRL instruction, 1022 Condition cond, 1023 EncodingSize size, 1024 Register rd, 1025 Location* location) VIXL_OVERRIDE; 1026 bool GenerateSplitInstruction(InstructionCondSizeRROp instruction, 1027 Condition cond, 1028 Register rd, 1029 Register rn, 1030 uint32_t imm, 1031 uint32_t mask); 1032 virtual void Delegate(InstructionType type, 1033 InstructionCondSizeRROp instruction, 1034 Condition cond, 1035 EncodingSize size, 1036 Register rd, 1037 Register rn, 1038 const Operand& operand) VIXL_OVERRIDE; 1039 // CBNZ, CBZ 1040 virtual void Delegate(InstructionType type, 1041 InstructionRL instruction, 1042 Register rn, 1043 Location* location) VIXL_OVERRIDE; 1044 // VMOV 1045 virtual void Delegate(InstructionType type, 1046 InstructionCondDtSSop instruction, 1047 Condition cond, 1048 DataType dt, 1049 SRegister rd, 1050 const SOperand& operand) VIXL_OVERRIDE; 1051 // VMOV, VMVN 1052 virtual void Delegate(InstructionType type, 1053 InstructionCondDtDDop instruction, 1054 Condition cond, 1055 DataType dt, 1056 DRegister rd, 1057 const DOperand& operand) VIXL_OVERRIDE; 1058 // VMOV, VMVN 1059 virtual void Delegate(InstructionType type, 1060 InstructionCondDtQQop instruction, 1061 Condition cond, 1062 DataType dt, 1063 QRegister rd, 1064 const QOperand& operand) VIXL_OVERRIDE; 1065 // LDR, LDRB, LDRH, LDRSB, LDRSH, STR, STRB, STRH 1066 virtual void Delegate(InstructionType type, 1067 InstructionCondSizeRMop instruction, 1068 Condition cond, 1069 EncodingSize size, 1070 Register rd, 1071 const MemOperand& operand) VIXL_OVERRIDE; 1072 // LDAEXD, LDRD, LDREXD, STLEX, STLEXB, STLEXH, STRD, STREX, STREXB, STREXH 1073 virtual void Delegate(InstructionType type, 1074 InstructionCondRL instruction, 1075 Condition cond, 1076 Register rt, 1077 Location* location) VIXL_OVERRIDE; 1078 virtual void Delegate(InstructionType type, 1079 InstructionCondRRL instruction, 1080 Condition cond, 1081 Register rt, 1082 Register rt2, 1083 Location* location) VIXL_OVERRIDE; 1084 virtual void Delegate(InstructionType type, 1085 InstructionCondRRMop instruction, 1086 Condition cond, 1087 Register rt, 1088 Register rt2, 1089 const MemOperand& operand) VIXL_OVERRIDE; 1090 // VLDR, VSTR 1091 virtual void Delegate(InstructionType type, 1092 InstructionCondDtSMop instruction, 1093 Condition cond, 1094 DataType dt, 1095 SRegister rd, 1096 const MemOperand& operand) VIXL_OVERRIDE; 1097 // VLDR, VSTR 1098 virtual void Delegate(InstructionType type, 1099 InstructionCondDtDMop instruction, 1100 Condition cond, 1101 DataType dt, 1102 DRegister rd, 1103 const MemOperand& operand) VIXL_OVERRIDE; 1104 // MSR 1105 virtual void Delegate(InstructionType type, 1106 InstructionCondMsrOp instruction, 1107 Condition cond, 1108 MaskedSpecialRegister spec_reg, 1109 const Operand& operand) VIXL_OVERRIDE; 1110 virtual void Delegate(InstructionType type, 1111 InstructionCondDtDL instruction, 1112 Condition cond, 1113 DataType dt, 1114 DRegister rd, 1115 Location* location) VIXL_OVERRIDE; 1116 virtual void Delegate(InstructionType type, 1117 InstructionCondDtSL instruction, 1118 Condition cond, 1119 DataType dt, 1120 SRegister rd, 1121 Location* location) VIXL_OVERRIDE; 1122 1123 // Start of generated code. 1124 1125 void Adc(Condition cond, Register rd, Register rn, const Operand& operand) { 1126 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1127 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1128 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1129 VIXL_ASSERT(allow_macro_instructions_); 1130 VIXL_ASSERT(OutsideITBlock()); 1131 MacroEmissionCheckScope guard(this); 1132 bool can_use_it = 1133 // ADC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 1134 operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) && 1135 operand.GetBaseRegister().IsLow(); 1136 #ifndef PANDA_BUILD 1137 ITScope it_scope(this, &cond, guard, can_use_it); 1138 #else 1139 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 1140 #endif 1141 adc(cond, rd, rn, operand); 1142 } 1143 void Adc(Register rd, Register rn, const Operand& operand) { 1144 Adc(al, rd, rn, operand); 1145 } 1146 void Adc(FlagsUpdate flags, 1147 Condition cond, 1148 Register rd, 1149 Register rn, 1150 const Operand& operand) { 1151 switch (flags) { 1152 case LeaveFlags: 1153 Adc(cond, rd, rn, operand); 1154 break; 1155 case SetFlags: 1156 Adcs(cond, rd, rn, operand); 1157 break; 1158 case DontCare: 1159 bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 1160 rn.Is(rd) && operand.IsPlainRegister() && 1161 operand.GetBaseRegister().IsLow(); 1162 if (setflags_is_smaller) { 1163 Adcs(cond, rd, rn, operand); 1164 } else { 1165 Adc(cond, rd, rn, operand); 1166 } 1167 break; 1168 } 1169 } 1170 void Adc(FlagsUpdate flags, 1171 Register rd, 1172 Register rn, 1173 const Operand& operand) { 1174 Adc(flags, al, rd, rn, operand); 1175 } 1176 1177 void Adcs(Condition cond, Register rd, Register rn, const Operand& operand) { 1178 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1179 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1180 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1181 VIXL_ASSERT(allow_macro_instructions_); 1182 VIXL_ASSERT(OutsideITBlock()); 1183 MacroEmissionCheckScope guard(this); 1184 #ifndef PANDA_BUILD 1185 ITScope it_scope(this, &cond, guard); 1186 #else 1187 ITScope it_scope(allocator_, this, &cond, guard); 1188 #endif 1189 adcs(cond, rd, rn, operand); 1190 } 1191 void Adcs(Register rd, Register rn, const Operand& operand) { 1192 Adcs(al, rd, rn, operand); 1193 } 1194 1195 void Add(Condition cond, Register rd, Register rn, const Operand& operand) { 1196 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1197 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1198 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1199 VIXL_ASSERT(allow_macro_instructions_); 1200 VIXL_ASSERT(OutsideITBlock()); 1201 MacroEmissionCheckScope guard(this); 1202 if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) { 1203 uint32_t immediate = operand.GetImmediate(); 1204 if (immediate == 0) { 1205 return; 1206 } 1207 } 1208 bool can_use_it = 1209 // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1 1210 (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() && 1211 rd.IsLow()) || 1212 // ADD<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2 1213 (operand.IsImmediate() && (operand.GetImmediate() <= 255) && 1214 rd.IsLow() && rn.Is(rd)) || 1215 // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1 1216 (operand.IsImmediate() && (operand.GetImmediate() <= 1020) && 1217 ((operand.GetImmediate() & 0x3) == 0) && rd.IsLow() && rn.IsSP()) || 1218 // ADD<c>{<q>} <Rd>, <Rn>, <Rm> 1219 (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() && 1220 operand.GetBaseRegister().IsLow()) || 1221 // ADD<c>{<q>} <Rdn>, <Rm> ; T2 1222 (operand.IsPlainRegister() && !rd.IsPC() && rn.Is(rd) && 1223 !operand.GetBaseRegister().IsSP() && 1224 !operand.GetBaseRegister().IsPC()) || 1225 // ADD{<c>}{<q>} {<Rdm>,} SP, <Rdm> ; T1 1226 (operand.IsPlainRegister() && !rd.IsPC() && rn.IsSP() && 1227 operand.GetBaseRegister().Is(rd)); 1228 #ifndef PANDA_BUILD 1229 ITScope it_scope(this, &cond, guard, can_use_it); 1230 #else 1231 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 1232 #endif 1233 add(cond, rd, rn, operand); 1234 } 1235 void Add(Register rd, Register rn, const Operand& operand) { 1236 Add(al, rd, rn, operand); 1237 } 1238 void Add(FlagsUpdate flags, 1239 Condition cond, 1240 Register rd, 1241 Register rn, 1242 const Operand& operand) { 1243 switch (flags) { 1244 case LeaveFlags: 1245 Add(cond, rd, rn, operand); 1246 break; 1247 case SetFlags: 1248 Adds(cond, rd, rn, operand); 1249 break; 1250 case DontCare: 1251 bool setflags_is_smaller = 1252 IsUsingT32() && cond.Is(al) && 1253 ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() && 1254 !rd.Is(rn) && operand.GetBaseRegister().IsLow()) || 1255 (operand.IsImmediate() && 1256 ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) || 1257 (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256))))); 1258 if (setflags_is_smaller) { 1259 Adds(cond, rd, rn, operand); 1260 } else { 1261 bool changed_op_is_smaller = 1262 operand.IsImmediate() && (operand.GetSignedImmediate() < 0) && 1263 ((rd.IsLow() && rn.IsLow() && 1264 (operand.GetSignedImmediate() >= -7)) || 1265 (rd.IsLow() && rn.Is(rd) && 1266 (operand.GetSignedImmediate() >= -255))); 1267 if (changed_op_is_smaller) { 1268 Subs(cond, rd, rn, -operand.GetSignedImmediate()); 1269 } else { 1270 Add(cond, rd, rn, operand); 1271 } 1272 } 1273 break; 1274 } 1275 } 1276 void Add(FlagsUpdate flags, 1277 Register rd, 1278 Register rn, 1279 const Operand& operand) { 1280 Add(flags, al, rd, rn, operand); 1281 } 1282 1283 void Adds(Condition cond, Register rd, Register rn, const Operand& operand) { 1284 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1285 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1286 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1287 VIXL_ASSERT(allow_macro_instructions_); 1288 VIXL_ASSERT(OutsideITBlock()); 1289 MacroEmissionCheckScope guard(this); 1290 #ifndef PANDA_BUILD 1291 ITScope it_scope(this, &cond, guard); 1292 #else 1293 ITScope it_scope(allocator_, this, &cond, guard); 1294 #endif 1295 adds(cond, rd, rn, operand); 1296 } 1297 void Adds(Register rd, Register rn, const Operand& operand) { 1298 Adds(al, rd, rn, operand); 1299 } 1300 1301 void And(Condition cond, Register rd, Register rn, const Operand& operand) { 1302 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1303 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1304 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1305 VIXL_ASSERT(allow_macro_instructions_); 1306 VIXL_ASSERT(OutsideITBlock()); 1307 MacroEmissionCheckScope guard(this); 1308 if (rd.Is(rn) && operand.IsPlainRegister() && 1309 rd.Is(operand.GetBaseRegister())) { 1310 return; 1311 } 1312 if (cond.Is(al) && operand.IsImmediate()) { 1313 uint32_t immediate = operand.GetImmediate(); 1314 if (immediate == 0) { 1315 mov(rd, 0); 1316 return; 1317 } 1318 if ((immediate == 0xffffffff) && rd.Is(rn)) { 1319 return; 1320 } 1321 } 1322 bool can_use_it = 1323 // AND<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 1324 operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() && 1325 operand.GetBaseRegister().IsLow(); 1326 #ifndef PANDA_BUILD 1327 ITScope it_scope(this, &cond, guard, can_use_it); 1328 #else 1329 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 1330 #endif 1331 and_(cond, rd, rn, operand); 1332 } 1333 void And(Register rd, Register rn, const Operand& operand) { 1334 And(al, rd, rn, operand); 1335 } 1336 void And(FlagsUpdate flags, 1337 Condition cond, 1338 Register rd, 1339 Register rn, 1340 const Operand& operand) { 1341 switch (flags) { 1342 case LeaveFlags: 1343 And(cond, rd, rn, operand); 1344 break; 1345 case SetFlags: 1346 Ands(cond, rd, rn, operand); 1347 break; 1348 case DontCare: 1349 if (operand.IsPlainRegister() && rd.Is(rn) && 1350 rd.Is(operand.GetBaseRegister())) { 1351 return; 1352 } 1353 bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 1354 rn.Is(rd) && operand.IsPlainRegister() && 1355 operand.GetBaseRegister().IsLow(); 1356 if (setflags_is_smaller) { 1357 Ands(cond, rd, rn, operand); 1358 } else { 1359 And(cond, rd, rn, operand); 1360 } 1361 break; 1362 } 1363 } 1364 void And(FlagsUpdate flags, 1365 Register rd, 1366 Register rn, 1367 const Operand& operand) { 1368 And(flags, al, rd, rn, operand); 1369 } 1370 1371 void Ands(Condition cond, Register rd, Register rn, const Operand& operand) { 1372 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1373 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1374 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1375 VIXL_ASSERT(allow_macro_instructions_); 1376 VIXL_ASSERT(OutsideITBlock()); 1377 MacroEmissionCheckScope guard(this); 1378 #ifndef PANDA_BUILD 1379 ITScope it_scope(this, &cond, guard); 1380 #else 1381 ITScope it_scope(allocator_, this, &cond, guard); 1382 #endif 1383 ands(cond, rd, rn, operand); 1384 } 1385 void Ands(Register rd, Register rn, const Operand& operand) { 1386 Ands(al, rd, rn, operand); 1387 } 1388 1389 void Asr(Condition cond, Register rd, Register rm, const Operand& operand) { 1390 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1391 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1392 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1393 VIXL_ASSERT(allow_macro_instructions_); 1394 VIXL_ASSERT(OutsideITBlock()); 1395 MacroEmissionCheckScope guard(this); 1396 bool can_use_it = 1397 // ASR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2 1398 (operand.IsImmediate() && (operand.GetImmediate() >= 1) && 1399 (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) || 1400 // ASR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1 1401 (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() && 1402 operand.GetBaseRegister().IsLow()); 1403 #ifndef PANDA_BUILD 1404 ITScope it_scope(this, &cond, guard, can_use_it); 1405 #else 1406 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 1407 #endif 1408 asr(cond, rd, rm, operand); 1409 } 1410 void Asr(Register rd, Register rm, const Operand& operand) { 1411 Asr(al, rd, rm, operand); 1412 } 1413 void Asr(FlagsUpdate flags, 1414 Condition cond, 1415 Register rd, 1416 Register rm, 1417 const Operand& operand) { 1418 switch (flags) { 1419 case LeaveFlags: 1420 Asr(cond, rd, rm, operand); 1421 break; 1422 case SetFlags: 1423 Asrs(cond, rd, rm, operand); 1424 break; 1425 case DontCare: 1426 bool setflags_is_smaller = 1427 IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() && 1428 ((operand.IsImmediate() && (operand.GetImmediate() >= 1) && 1429 (operand.GetImmediate() <= 32)) || 1430 (operand.IsPlainRegister() && rd.Is(rm))); 1431 if (setflags_is_smaller) { 1432 Asrs(cond, rd, rm, operand); 1433 } else { 1434 Asr(cond, rd, rm, operand); 1435 } 1436 break; 1437 } 1438 } 1439 void Asr(FlagsUpdate flags, 1440 Register rd, 1441 Register rm, 1442 const Operand& operand) { 1443 Asr(flags, al, rd, rm, operand); 1444 } 1445 1446 void Asrs(Condition cond, Register rd, Register rm, const Operand& operand) { 1447 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1448 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1449 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1450 VIXL_ASSERT(allow_macro_instructions_); 1451 VIXL_ASSERT(OutsideITBlock()); 1452 MacroEmissionCheckScope guard(this); 1453 #ifndef PANDA_BUILD 1454 ITScope it_scope(this, &cond, guard); 1455 #else 1456 ITScope it_scope(allocator_, this, &cond, guard); 1457 #endif 1458 asrs(cond, rd, rm, operand); 1459 } 1460 void Asrs(Register rd, Register rm, const Operand& operand) { 1461 Asrs(al, rd, rm, operand); 1462 } 1463 1464 void B(Condition cond, Label* label, BranchHint hint = kBranchWithoutHint) { 1465 VIXL_ASSERT(allow_macro_instructions_); 1466 VIXL_ASSERT(OutsideITBlock()); 1467 EncodingSize size = Best; 1468 MacroEmissionCheckScope::PoolPolicy pool_policy = 1469 MacroEmissionCheckScope::kBlockPools; 1470 if (!label->IsBound()) { 1471 if (hint == kNear) size = Narrow; 1472 const ReferenceInfo* info; 1473 bool can_encode = b_info(cond, size, label, &info); 1474 VIXL_CHECK(can_encode); 1475 CheckEmitPoolForInstruction(info, label, &cond); 1476 // We have already checked for pool emission. 1477 pool_policy = MacroEmissionCheckScope::kIgnorePools; 1478 } 1479 MacroEmissionCheckScope guard(this, pool_policy); 1480 b(cond, size, label); 1481 RegisterForwardReference(label); 1482 } 1483 void B(Label* label, BranchHint hint = kBranchWithoutHint) { 1484 B(al, label, hint); 1485 } 1486 void BPreferNear(Condition cond, Label* label) { B(cond, label, kNear); } 1487 void BPreferNear(Label* label) { B(al, label, kNear); } 1488 1489 void Bfc(Condition cond, Register rd, uint32_t lsb, uint32_t width) { 1490 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1491 VIXL_ASSERT(allow_macro_instructions_); 1492 VIXL_ASSERT(OutsideITBlock()); 1493 MacroEmissionCheckScope guard(this); 1494 #ifndef PANDA_BUILD 1495 ITScope it_scope(this, &cond, guard); 1496 #else 1497 ITScope it_scope(allocator_, this, &cond, guard); 1498 #endif 1499 bfc(cond, rd, lsb, width); 1500 } 1501 void Bfc(Register rd, uint32_t lsb, uint32_t width) { 1502 Bfc(al, rd, lsb, width); 1503 } 1504 1505 void Bfi( 1506 Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { 1507 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1508 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1509 VIXL_ASSERT(allow_macro_instructions_); 1510 VIXL_ASSERT(OutsideITBlock()); 1511 MacroEmissionCheckScope guard(this); 1512 #ifndef PANDA_BUILD 1513 ITScope it_scope(this, &cond, guard); 1514 #else 1515 ITScope it_scope(allocator_, this, &cond, guard); 1516 #endif 1517 bfi(cond, rd, rn, lsb, width); 1518 } 1519 void Bfi(Register rd, Register rn, uint32_t lsb, uint32_t width) { 1520 Bfi(al, rd, rn, lsb, width); 1521 } 1522 1523 void Bic(Condition cond, Register rd, Register rn, const Operand& operand) { 1524 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1525 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1526 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1527 VIXL_ASSERT(allow_macro_instructions_); 1528 VIXL_ASSERT(OutsideITBlock()); 1529 MacroEmissionCheckScope guard(this); 1530 if (cond.Is(al) && operand.IsImmediate()) { 1531 uint32_t immediate = operand.GetImmediate(); 1532 if ((immediate == 0) && rd.Is(rn)) { 1533 return; 1534 } 1535 if (immediate == 0xffffffff) { 1536 mov(rd, 0); 1537 return; 1538 } 1539 } 1540 bool can_use_it = 1541 // BIC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 1542 operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() && 1543 operand.GetBaseRegister().IsLow(); 1544 #ifndef PANDA_BUILD 1545 ITScope it_scope(this, &cond, guard, can_use_it); 1546 #else 1547 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 1548 #endif 1549 bic(cond, rd, rn, operand); 1550 } 1551 void Bic(Register rd, Register rn, const Operand& operand) { 1552 Bic(al, rd, rn, operand); 1553 } 1554 void Bic(FlagsUpdate flags, 1555 Condition cond, 1556 Register rd, 1557 Register rn, 1558 const Operand& operand) { 1559 switch (flags) { 1560 case LeaveFlags: 1561 Bic(cond, rd, rn, operand); 1562 break; 1563 case SetFlags: 1564 Bics(cond, rd, rn, operand); 1565 break; 1566 case DontCare: 1567 bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 1568 rn.Is(rd) && operand.IsPlainRegister() && 1569 operand.GetBaseRegister().IsLow(); 1570 if (setflags_is_smaller) { 1571 Bics(cond, rd, rn, operand); 1572 } else { 1573 Bic(cond, rd, rn, operand); 1574 } 1575 break; 1576 } 1577 } 1578 void Bic(FlagsUpdate flags, 1579 Register rd, 1580 Register rn, 1581 const Operand& operand) { 1582 Bic(flags, al, rd, rn, operand); 1583 } 1584 1585 void Bics(Condition cond, Register rd, Register rn, const Operand& operand) { 1586 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1587 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1588 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1589 VIXL_ASSERT(allow_macro_instructions_); 1590 VIXL_ASSERT(OutsideITBlock()); 1591 MacroEmissionCheckScope guard(this); 1592 #ifndef PANDA_BUILD 1593 ITScope it_scope(this, &cond, guard); 1594 #else 1595 ITScope it_scope(allocator_, this, &cond, guard); 1596 #endif 1597 bics(cond, rd, rn, operand); 1598 } 1599 void Bics(Register rd, Register rn, const Operand& operand) { 1600 Bics(al, rd, rn, operand); 1601 } 1602 1603 void Bkpt(Condition cond, uint32_t imm) { 1604 VIXL_ASSERT(allow_macro_instructions_); 1605 VIXL_ASSERT(OutsideITBlock()); 1606 MacroEmissionCheckScope guard(this); 1607 #ifndef PANDA_BUILD 1608 ITScope it_scope(this, &cond, guard); 1609 #else 1610 ITScope it_scope(allocator_, this, &cond, guard); 1611 #endif 1612 bkpt(cond, imm); 1613 } 1614 void Bkpt(uint32_t imm) { Bkpt(al, imm); } 1615 1616 void Bl(Condition cond, Label* label) { 1617 VIXL_ASSERT(allow_macro_instructions_); 1618 VIXL_ASSERT(OutsideITBlock()); 1619 MacroEmissionCheckScope::PoolPolicy pool_policy = 1620 MacroEmissionCheckScope::kBlockPools; 1621 if (!label->IsBound()) { 1622 const ReferenceInfo* info; 1623 bool can_encode = bl_info(cond, label, &info); 1624 VIXL_CHECK(can_encode); 1625 CheckEmitPoolForInstruction(info, label, &cond); 1626 // We have already checked for pool emission. 1627 pool_policy = MacroEmissionCheckScope::kIgnorePools; 1628 } 1629 MacroEmissionCheckScope guard(this, pool_policy); 1630 #ifndef PANDA_BUILD 1631 ITScope it_scope(this, &cond, guard); 1632 #else 1633 ITScope it_scope(allocator_, this, &cond, guard); 1634 #endif 1635 bl(cond, label); 1636 RegisterForwardReference(label); 1637 } 1638 void Bl(Label* label) { Bl(al, label); } 1639 1640 void Blx(Condition cond, Label* label) { 1641 VIXL_ASSERT(allow_macro_instructions_); 1642 VIXL_ASSERT(OutsideITBlock()); 1643 MacroEmissionCheckScope::PoolPolicy pool_policy = 1644 MacroEmissionCheckScope::kBlockPools; 1645 if (!label->IsBound()) { 1646 const ReferenceInfo* info; 1647 bool can_encode = blx_info(cond, label, &info); 1648 VIXL_CHECK(can_encode); 1649 CheckEmitPoolForInstruction(info, label, &cond); 1650 // We have already checked for pool emission. 1651 pool_policy = MacroEmissionCheckScope::kIgnorePools; 1652 } 1653 MacroEmissionCheckScope guard(this, pool_policy); 1654 #ifndef PANDA_BUILD 1655 ITScope it_scope(this, &cond, guard); 1656 #else 1657 ITScope it_scope(allocator_, this, &cond, guard); 1658 #endif 1659 blx(cond, label); 1660 RegisterForwardReference(label); 1661 } 1662 void Blx(Label* label) { Blx(al, label); } 1663 1664 void Blx(Condition cond, Register rm) { 1665 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1666 VIXL_ASSERT(allow_macro_instructions_); 1667 VIXL_ASSERT(OutsideITBlock()); 1668 MacroEmissionCheckScope guard(this); 1669 bool can_use_it = 1670 // BLX{<c>}{<q>} <Rm> ; T1 1671 !rm.IsPC(); 1672 #ifndef PANDA_BUILD 1673 ITScope it_scope(this, &cond, guard, can_use_it); 1674 #else 1675 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 1676 #endif 1677 blx(cond, rm); 1678 } 1679 void Blx(Register rm) { Blx(al, rm); } 1680 1681 void Bx(Condition cond, Register rm) { 1682 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1683 VIXL_ASSERT(allow_macro_instructions_); 1684 VIXL_ASSERT(OutsideITBlock()); 1685 MacroEmissionCheckScope guard(this); 1686 bool can_use_it = 1687 // BX{<c>}{<q>} <Rm> ; T1 1688 !rm.IsPC(); 1689 #ifndef PANDA_BUILD 1690 ITScope it_scope(this, &cond, guard, can_use_it); 1691 #else 1692 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 1693 #endif 1694 bx(cond, rm); 1695 } 1696 void Bx(Register rm) { Bx(al, rm); } 1697 1698 void Bxj(Condition cond, Register rm) { 1699 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1700 VIXL_ASSERT(allow_macro_instructions_); 1701 VIXL_ASSERT(OutsideITBlock()); 1702 MacroEmissionCheckScope guard(this); 1703 #ifndef PANDA_BUILD 1704 ITScope it_scope(this, &cond, guard); 1705 #else 1706 ITScope it_scope(allocator_, this, &cond, guard); 1707 #endif 1708 bxj(cond, rm); 1709 } 1710 void Bxj(Register rm) { Bxj(al, rm); } 1711 1712 void Cbnz(Register rn, Label* label) { 1713 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1714 VIXL_ASSERT(allow_macro_instructions_); 1715 VIXL_ASSERT(OutsideITBlock()); 1716 MacroEmissionCheckScope::PoolPolicy pool_policy = 1717 MacroEmissionCheckScope::kBlockPools; 1718 if (!label->IsBound()) { 1719 const ReferenceInfo* info; 1720 bool can_encode = cbnz_info(rn, label, &info); 1721 VIXL_CHECK(can_encode); 1722 CheckEmitPoolForInstruction(info, label); 1723 // We have already checked for pool emission. 1724 pool_policy = MacroEmissionCheckScope::kIgnorePools; 1725 } 1726 MacroEmissionCheckScope guard(this, pool_policy); 1727 cbnz(rn, label); 1728 RegisterForwardReference(label); 1729 } 1730 1731 void Cbz(Register rn, Label* label) { 1732 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1733 VIXL_ASSERT(allow_macro_instructions_); 1734 VIXL_ASSERT(OutsideITBlock()); 1735 MacroEmissionCheckScope::PoolPolicy pool_policy = 1736 MacroEmissionCheckScope::kBlockPools; 1737 if (!label->IsBound()) { 1738 const ReferenceInfo* info; 1739 bool can_encode = cbz_info(rn, label, &info); 1740 VIXL_CHECK(can_encode); 1741 CheckEmitPoolForInstruction(info, label); 1742 // We have already checked for pool emission. 1743 pool_policy = MacroEmissionCheckScope::kIgnorePools; 1744 } 1745 MacroEmissionCheckScope guard(this, pool_policy); 1746 cbz(rn, label); 1747 RegisterForwardReference(label); 1748 } 1749 1750 void Clrex(Condition cond) { 1751 VIXL_ASSERT(allow_macro_instructions_); 1752 VIXL_ASSERT(OutsideITBlock()); 1753 MacroEmissionCheckScope guard(this); 1754 #ifndef PANDA_BUILD 1755 ITScope it_scope(this, &cond, guard); 1756 #else 1757 ITScope it_scope(allocator_, this, &cond, guard); 1758 #endif 1759 clrex(cond); 1760 } 1761 void Clrex() { Clrex(al); } 1762 1763 void Clz(Condition cond, Register rd, Register rm) { 1764 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1765 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1766 VIXL_ASSERT(allow_macro_instructions_); 1767 VIXL_ASSERT(OutsideITBlock()); 1768 MacroEmissionCheckScope guard(this); 1769 #ifndef PANDA_BUILD 1770 ITScope it_scope(this, &cond, guard); 1771 #else 1772 ITScope it_scope(allocator_, this, &cond, guard); 1773 #endif 1774 clz(cond, rd, rm); 1775 } 1776 void Clz(Register rd, Register rm) { Clz(al, rd, rm); } 1777 1778 void Cmn(Condition cond, Register rn, const Operand& operand) { 1779 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1780 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1781 VIXL_ASSERT(allow_macro_instructions_); 1782 VIXL_ASSERT(OutsideITBlock()); 1783 MacroEmissionCheckScope guard(this); 1784 bool can_use_it = 1785 // CMN{<c>}{<q>} <Rn>, <Rm> ; T1 1786 operand.IsPlainRegister() && rn.IsLow() && 1787 operand.GetBaseRegister().IsLow(); 1788 #ifndef PANDA_BUILD 1789 ITScope it_scope(this, &cond, guard, can_use_it); 1790 #else 1791 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 1792 #endif 1793 cmn(cond, rn, operand); 1794 } 1795 void Cmn(Register rn, const Operand& operand) { Cmn(al, rn, operand); } 1796 1797 void Cmp(Condition cond, Register rn, const Operand& operand) { 1798 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1799 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1800 VIXL_ASSERT(allow_macro_instructions_); 1801 VIXL_ASSERT(OutsideITBlock()); 1802 MacroEmissionCheckScope guard(this); 1803 bool can_use_it = 1804 // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1 1805 (operand.IsImmediate() && (operand.GetImmediate() <= 255) && 1806 rn.IsLow()) || 1807 // CMP{<c>}{<q>} <Rn>, <Rm> ; T1 T2 1808 (operand.IsPlainRegister() && !rn.IsPC() && 1809 !operand.GetBaseRegister().IsPC()); 1810 #ifndef PANDA_BUILD 1811 ITScope it_scope(this, &cond, guard, can_use_it); 1812 #else 1813 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 1814 #endif 1815 cmp(cond, rn, operand); 1816 } 1817 void Cmp(Register rn, const Operand& operand) { Cmp(al, rn, operand); } 1818 1819 void Crc32b(Condition cond, Register rd, Register rn, Register rm) { 1820 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1821 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1822 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1823 VIXL_ASSERT(allow_macro_instructions_); 1824 VIXL_ASSERT(OutsideITBlock()); 1825 MacroEmissionCheckScope guard(this); 1826 #ifndef PANDA_BUILD 1827 ITScope it_scope(this, &cond, guard); 1828 #else 1829 ITScope it_scope(allocator_, this, &cond, guard); 1830 #endif 1831 crc32b(cond, rd, rn, rm); 1832 } 1833 void Crc32b(Register rd, Register rn, Register rm) { Crc32b(al, rd, rn, rm); } 1834 1835 void Crc32cb(Condition cond, Register rd, Register rn, Register rm) { 1836 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1837 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1838 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1839 VIXL_ASSERT(allow_macro_instructions_); 1840 VIXL_ASSERT(OutsideITBlock()); 1841 MacroEmissionCheckScope guard(this); 1842 #ifndef PANDA_BUILD 1843 ITScope it_scope(this, &cond, guard); 1844 #else 1845 ITScope it_scope(allocator_, this, &cond, guard); 1846 #endif 1847 crc32cb(cond, rd, rn, rm); 1848 } 1849 void Crc32cb(Register rd, Register rn, Register rm) { 1850 Crc32cb(al, rd, rn, rm); 1851 } 1852 1853 void Crc32ch(Condition cond, Register rd, Register rn, Register rm) { 1854 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1855 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1856 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1857 VIXL_ASSERT(allow_macro_instructions_); 1858 VIXL_ASSERT(OutsideITBlock()); 1859 MacroEmissionCheckScope guard(this); 1860 #ifndef PANDA_BUILD 1861 ITScope it_scope(this, &cond, guard); 1862 #else 1863 ITScope it_scope(allocator_, this, &cond, guard); 1864 #endif 1865 crc32ch(cond, rd, rn, rm); 1866 } 1867 void Crc32ch(Register rd, Register rn, Register rm) { 1868 Crc32ch(al, rd, rn, rm); 1869 } 1870 1871 void Crc32cw(Condition cond, Register rd, Register rn, Register rm) { 1872 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1873 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1874 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1875 VIXL_ASSERT(allow_macro_instructions_); 1876 VIXL_ASSERT(OutsideITBlock()); 1877 MacroEmissionCheckScope guard(this); 1878 #ifndef PANDA_BUILD 1879 ITScope it_scope(this, &cond, guard); 1880 #else 1881 ITScope it_scope(allocator_, this, &cond, guard); 1882 #endif 1883 crc32cw(cond, rd, rn, rm); 1884 } 1885 void Crc32cw(Register rd, Register rn, Register rm) { 1886 Crc32cw(al, rd, rn, rm); 1887 } 1888 1889 void Crc32h(Condition cond, Register rd, Register rn, Register rm) { 1890 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1891 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1892 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1893 VIXL_ASSERT(allow_macro_instructions_); 1894 VIXL_ASSERT(OutsideITBlock()); 1895 MacroEmissionCheckScope guard(this); 1896 #ifndef PANDA_BUILD 1897 ITScope it_scope(this, &cond, guard); 1898 #else 1899 ITScope it_scope(allocator_, this, &cond, guard); 1900 #endif 1901 crc32h(cond, rd, rn, rm); 1902 } 1903 void Crc32h(Register rd, Register rn, Register rm) { Crc32h(al, rd, rn, rm); } 1904 1905 void Crc32w(Condition cond, Register rd, Register rn, Register rm) { 1906 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1907 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1908 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 1909 VIXL_ASSERT(allow_macro_instructions_); 1910 VIXL_ASSERT(OutsideITBlock()); 1911 MacroEmissionCheckScope guard(this); 1912 #ifndef PANDA_BUILD 1913 ITScope it_scope(this, &cond, guard); 1914 #else 1915 ITScope it_scope(allocator_, this, &cond, guard); 1916 #endif 1917 crc32w(cond, rd, rn, rm); 1918 } 1919 void Crc32w(Register rd, Register rn, Register rm) { Crc32w(al, rd, rn, rm); } 1920 1921 void Dmb(Condition cond, MemoryBarrier option) { 1922 VIXL_ASSERT(allow_macro_instructions_); 1923 VIXL_ASSERT(OutsideITBlock()); 1924 MacroEmissionCheckScope guard(this); 1925 #ifndef PANDA_BUILD 1926 ITScope it_scope(this, &cond, guard); 1927 #else 1928 ITScope it_scope(allocator_, this, &cond, guard); 1929 #endif 1930 dmb(cond, option); 1931 } 1932 void Dmb(MemoryBarrier option) { Dmb(al, option); } 1933 1934 void Dsb(Condition cond, MemoryBarrier option) { 1935 VIXL_ASSERT(allow_macro_instructions_); 1936 VIXL_ASSERT(OutsideITBlock()); 1937 MacroEmissionCheckScope guard(this); 1938 #ifndef PANDA_BUILD 1939 ITScope it_scope(this, &cond, guard); 1940 #else 1941 ITScope it_scope(allocator_, this, &cond, guard); 1942 #endif 1943 dsb(cond, option); 1944 } 1945 void Dsb(MemoryBarrier option) { Dsb(al, option); } 1946 1947 void Eor(Condition cond, Register rd, Register rn, const Operand& operand) { 1948 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 1949 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 1950 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 1951 VIXL_ASSERT(allow_macro_instructions_); 1952 VIXL_ASSERT(OutsideITBlock()); 1953 MacroEmissionCheckScope guard(this); 1954 if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) { 1955 uint32_t immediate = operand.GetImmediate(); 1956 if (immediate == 0) { 1957 return; 1958 } 1959 if (immediate == 0xffffffff) { 1960 mvn(rd, rn); 1961 return; 1962 } 1963 } 1964 bool can_use_it = 1965 // EOR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 1966 operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() && 1967 operand.GetBaseRegister().IsLow(); 1968 #ifndef PANDA_BUILD 1969 ITScope it_scope(this, &cond, guard, can_use_it); 1970 #else 1971 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 1972 #endif 1973 eor(cond, rd, rn, operand); 1974 } 1975 void Eor(Register rd, Register rn, const Operand& operand) { 1976 Eor(al, rd, rn, operand); 1977 } 1978 void Eor(FlagsUpdate flags, 1979 Condition cond, 1980 Register rd, 1981 Register rn, 1982 const Operand& operand) { 1983 switch (flags) { 1984 case LeaveFlags: 1985 Eor(cond, rd, rn, operand); 1986 break; 1987 case SetFlags: 1988 Eors(cond, rd, rn, operand); 1989 break; 1990 case DontCare: 1991 bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 1992 rn.Is(rd) && operand.IsPlainRegister() && 1993 operand.GetBaseRegister().IsLow(); 1994 if (setflags_is_smaller) { 1995 Eors(cond, rd, rn, operand); 1996 } else { 1997 Eor(cond, rd, rn, operand); 1998 } 1999 break; 2000 } 2001 } 2002 void Eor(FlagsUpdate flags, 2003 Register rd, 2004 Register rn, 2005 const Operand& operand) { 2006 Eor(flags, al, rd, rn, operand); 2007 } 2008 2009 void Eors(Condition cond, Register rd, Register rn, const Operand& operand) { 2010 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2011 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2012 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2013 VIXL_ASSERT(allow_macro_instructions_); 2014 VIXL_ASSERT(OutsideITBlock()); 2015 MacroEmissionCheckScope guard(this); 2016 #ifndef PANDA_BUILD 2017 ITScope it_scope(this, &cond, guard); 2018 #else 2019 ITScope it_scope(allocator_, this, &cond, guard); 2020 #endif 2021 eors(cond, rd, rn, operand); 2022 } 2023 void Eors(Register rd, Register rn, const Operand& operand) { 2024 Eors(al, rd, rn, operand); 2025 } 2026 2027 void Fldmdbx(Condition cond, 2028 Register rn, 2029 WriteBack write_back, 2030 DRegisterList dreglist) { 2031 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2032 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 2033 VIXL_ASSERT(allow_macro_instructions_); 2034 VIXL_ASSERT(OutsideITBlock()); 2035 MacroEmissionCheckScope guard(this); 2036 #ifndef PANDA_BUILD 2037 ITScope it_scope(this, &cond, guard); 2038 #else 2039 ITScope it_scope(allocator_, this, &cond, guard); 2040 #endif 2041 fldmdbx(cond, rn, write_back, dreglist); 2042 } 2043 void Fldmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) { 2044 Fldmdbx(al, rn, write_back, dreglist); 2045 } 2046 2047 void Fldmiax(Condition cond, 2048 Register rn, 2049 WriteBack write_back, 2050 DRegisterList dreglist) { 2051 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2052 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 2053 VIXL_ASSERT(allow_macro_instructions_); 2054 VIXL_ASSERT(OutsideITBlock()); 2055 MacroEmissionCheckScope guard(this); 2056 #ifndef PANDA_BUILD 2057 ITScope it_scope(this, &cond, guard); 2058 #else 2059 ITScope it_scope(allocator_, this, &cond, guard); 2060 #endif 2061 fldmiax(cond, rn, write_back, dreglist); 2062 } 2063 void Fldmiax(Register rn, WriteBack write_back, DRegisterList dreglist) { 2064 Fldmiax(al, rn, write_back, dreglist); 2065 } 2066 2067 void Fstmdbx(Condition cond, 2068 Register rn, 2069 WriteBack write_back, 2070 DRegisterList dreglist) { 2071 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2072 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 2073 VIXL_ASSERT(allow_macro_instructions_); 2074 VIXL_ASSERT(OutsideITBlock()); 2075 MacroEmissionCheckScope guard(this); 2076 #ifndef PANDA_BUILD 2077 ITScope it_scope(this, &cond, guard); 2078 #else 2079 ITScope it_scope(allocator_, this, &cond, guard); 2080 #endif 2081 fstmdbx(cond, rn, write_back, dreglist); 2082 } 2083 void Fstmdbx(Register rn, WriteBack write_back, DRegisterList dreglist) { 2084 Fstmdbx(al, rn, write_back, dreglist); 2085 } 2086 2087 void Fstmiax(Condition cond, 2088 Register rn, 2089 WriteBack write_back, 2090 DRegisterList dreglist) { 2091 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2092 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 2093 VIXL_ASSERT(allow_macro_instructions_); 2094 VIXL_ASSERT(OutsideITBlock()); 2095 MacroEmissionCheckScope guard(this); 2096 #ifndef PANDA_BUILD 2097 ITScope it_scope(this, &cond, guard); 2098 #else 2099 ITScope it_scope(allocator_, this, &cond, guard); 2100 #endif 2101 fstmiax(cond, rn, write_back, dreglist); 2102 } 2103 void Fstmiax(Register rn, WriteBack write_back, DRegisterList dreglist) { 2104 Fstmiax(al, rn, write_back, dreglist); 2105 } 2106 2107 void Hlt(Condition cond, uint32_t imm) { 2108 VIXL_ASSERT(allow_macro_instructions_); 2109 VIXL_ASSERT(OutsideITBlock()); 2110 MacroEmissionCheckScope guard(this); 2111 #ifndef PANDA_BUILD 2112 ITScope it_scope(this, &cond, guard); 2113 #else 2114 ITScope it_scope(allocator_, this, &cond, guard); 2115 #endif 2116 hlt(cond, imm); 2117 } 2118 void Hlt(uint32_t imm) { Hlt(al, imm); } 2119 2120 void Hvc(Condition cond, uint32_t imm) { 2121 VIXL_ASSERT(allow_macro_instructions_); 2122 VIXL_ASSERT(OutsideITBlock()); 2123 MacroEmissionCheckScope guard(this); 2124 #ifndef PANDA_BUILD 2125 ITScope it_scope(this, &cond, guard); 2126 #else 2127 ITScope it_scope(allocator_, this, &cond, guard); 2128 #endif 2129 hvc(cond, imm); 2130 } 2131 void Hvc(uint32_t imm) { Hvc(al, imm); } 2132 2133 void Isb(Condition cond, MemoryBarrier option) { 2134 VIXL_ASSERT(allow_macro_instructions_); 2135 VIXL_ASSERT(OutsideITBlock()); 2136 MacroEmissionCheckScope guard(this); 2137 #ifndef PANDA_BUILD 2138 ITScope it_scope(this, &cond, guard); 2139 #else 2140 ITScope it_scope(allocator_, this, &cond, guard); 2141 #endif 2142 isb(cond, option); 2143 } 2144 void Isb(MemoryBarrier option) { Isb(al, option); } 2145 2146 void Lda(Condition cond, Register rt, const MemOperand& operand) { 2147 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2148 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2149 VIXL_ASSERT(allow_macro_instructions_); 2150 VIXL_ASSERT(OutsideITBlock()); 2151 MacroEmissionCheckScope guard(this); 2152 #ifndef PANDA_BUILD 2153 ITScope it_scope(this, &cond, guard); 2154 #else 2155 ITScope it_scope(allocator_, this, &cond, guard); 2156 #endif 2157 lda(cond, rt, operand); 2158 } 2159 void Lda(Register rt, const MemOperand& operand) { Lda(al, rt, operand); } 2160 2161 void Ldab(Condition cond, Register rt, const MemOperand& operand) { 2162 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2163 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2164 VIXL_ASSERT(allow_macro_instructions_); 2165 VIXL_ASSERT(OutsideITBlock()); 2166 MacroEmissionCheckScope guard(this); 2167 #ifndef PANDA_BUILD 2168 ITScope it_scope(this, &cond, guard); 2169 #else 2170 ITScope it_scope(allocator_, this, &cond, guard); 2171 #endif 2172 ldab(cond, rt, operand); 2173 } 2174 void Ldab(Register rt, const MemOperand& operand) { Ldab(al, rt, operand); } 2175 2176 void Ldaex(Condition cond, Register rt, const MemOperand& operand) { 2177 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2178 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2179 VIXL_ASSERT(allow_macro_instructions_); 2180 VIXL_ASSERT(OutsideITBlock()); 2181 MacroEmissionCheckScope guard(this); 2182 #ifndef PANDA_BUILD 2183 ITScope it_scope(this, &cond, guard); 2184 #else 2185 ITScope it_scope(allocator_, this, &cond, guard); 2186 #endif 2187 ldaex(cond, rt, operand); 2188 } 2189 void Ldaex(Register rt, const MemOperand& operand) { Ldaex(al, rt, operand); } 2190 2191 void Ldaexb(Condition cond, Register rt, const MemOperand& operand) { 2192 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2193 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2194 VIXL_ASSERT(allow_macro_instructions_); 2195 VIXL_ASSERT(OutsideITBlock()); 2196 MacroEmissionCheckScope guard(this); 2197 #ifndef PANDA_BUILD 2198 ITScope it_scope(this, &cond, guard); 2199 #else 2200 ITScope it_scope(allocator_, this, &cond, guard); 2201 #endif 2202 ldaexb(cond, rt, operand); 2203 } 2204 void Ldaexb(Register rt, const MemOperand& operand) { 2205 Ldaexb(al, rt, operand); 2206 } 2207 2208 void Ldaexd(Condition cond, 2209 Register rt, 2210 Register rt2, 2211 const MemOperand& operand) { 2212 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2213 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 2214 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2215 VIXL_ASSERT(allow_macro_instructions_); 2216 VIXL_ASSERT(OutsideITBlock()); 2217 MacroEmissionCheckScope guard(this); 2218 #ifndef PANDA_BUILD 2219 ITScope it_scope(this, &cond, guard); 2220 #else 2221 ITScope it_scope(allocator_, this, &cond, guard); 2222 #endif 2223 ldaexd(cond, rt, rt2, operand); 2224 } 2225 void Ldaexd(Register rt, Register rt2, const MemOperand& operand) { 2226 Ldaexd(al, rt, rt2, operand); 2227 } 2228 2229 void Ldaexh(Condition cond, Register rt, const MemOperand& operand) { 2230 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2231 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2232 VIXL_ASSERT(allow_macro_instructions_); 2233 VIXL_ASSERT(OutsideITBlock()); 2234 MacroEmissionCheckScope guard(this); 2235 #ifndef PANDA_BUILD 2236 ITScope it_scope(this, &cond, guard); 2237 #else 2238 ITScope it_scope(allocator_, this, &cond, guard); 2239 #endif 2240 ldaexh(cond, rt, operand); 2241 } 2242 void Ldaexh(Register rt, const MemOperand& operand) { 2243 Ldaexh(al, rt, operand); 2244 } 2245 2246 void Ldah(Condition cond, Register rt, const MemOperand& operand) { 2247 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2248 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2249 VIXL_ASSERT(allow_macro_instructions_); 2250 VIXL_ASSERT(OutsideITBlock()); 2251 MacroEmissionCheckScope guard(this); 2252 #ifndef PANDA_BUILD 2253 ITScope it_scope(this, &cond, guard); 2254 #else 2255 ITScope it_scope(allocator_, this, &cond, guard); 2256 #endif 2257 ldah(cond, rt, operand); 2258 } 2259 void Ldah(Register rt, const MemOperand& operand) { Ldah(al, rt, operand); } 2260 2261 void Ldm(Condition cond, 2262 Register rn, 2263 WriteBack write_back, 2264 RegisterList registers) { 2265 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2266 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2267 VIXL_ASSERT(allow_macro_instructions_); 2268 VIXL_ASSERT(OutsideITBlock()); 2269 MacroEmissionCheckScope guard(this); 2270 #ifndef PANDA_BUILD 2271 ITScope it_scope(this, &cond, guard); 2272 #else 2273 ITScope it_scope(allocator_, this, &cond, guard); 2274 #endif 2275 ldm(cond, rn, write_back, registers); 2276 } 2277 void Ldm(Register rn, WriteBack write_back, RegisterList registers) { 2278 Ldm(al, rn, write_back, registers); 2279 } 2280 2281 void Ldmda(Condition cond, 2282 Register rn, 2283 WriteBack write_back, 2284 RegisterList registers) { 2285 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2286 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2287 VIXL_ASSERT(allow_macro_instructions_); 2288 VIXL_ASSERT(OutsideITBlock()); 2289 MacroEmissionCheckScope guard(this); 2290 #ifndef PANDA_BUILD 2291 ITScope it_scope(this, &cond, guard); 2292 #else 2293 ITScope it_scope(allocator_, this, &cond, guard); 2294 #endif 2295 ldmda(cond, rn, write_back, registers); 2296 } 2297 void Ldmda(Register rn, WriteBack write_back, RegisterList registers) { 2298 Ldmda(al, rn, write_back, registers); 2299 } 2300 2301 void Ldmdb(Condition cond, 2302 Register rn, 2303 WriteBack write_back, 2304 RegisterList registers) { 2305 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2306 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2307 VIXL_ASSERT(allow_macro_instructions_); 2308 VIXL_ASSERT(OutsideITBlock()); 2309 MacroEmissionCheckScope guard(this); 2310 #ifndef PANDA_BUILD 2311 ITScope it_scope(this, &cond, guard); 2312 #else 2313 ITScope it_scope(allocator_, this, &cond, guard); 2314 #endif 2315 ldmdb(cond, rn, write_back, registers); 2316 } 2317 void Ldmdb(Register rn, WriteBack write_back, RegisterList registers) { 2318 Ldmdb(al, rn, write_back, registers); 2319 } 2320 2321 void Ldmea(Condition cond, 2322 Register rn, 2323 WriteBack write_back, 2324 RegisterList registers) { 2325 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2326 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2327 VIXL_ASSERT(allow_macro_instructions_); 2328 VIXL_ASSERT(OutsideITBlock()); 2329 MacroEmissionCheckScope guard(this); 2330 #ifndef PANDA_BUILD 2331 ITScope it_scope(this, &cond, guard); 2332 #else 2333 ITScope it_scope(allocator_, this, &cond, guard); 2334 #endif 2335 ldmea(cond, rn, write_back, registers); 2336 } 2337 void Ldmea(Register rn, WriteBack write_back, RegisterList registers) { 2338 Ldmea(al, rn, write_back, registers); 2339 } 2340 2341 void Ldmed(Condition cond, 2342 Register rn, 2343 WriteBack write_back, 2344 RegisterList registers) { 2345 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2346 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2347 VIXL_ASSERT(allow_macro_instructions_); 2348 VIXL_ASSERT(OutsideITBlock()); 2349 MacroEmissionCheckScope guard(this); 2350 #ifndef PANDA_BUILD 2351 ITScope it_scope(this, &cond, guard); 2352 #else 2353 ITScope it_scope(allocator_, this, &cond, guard); 2354 #endif 2355 ldmed(cond, rn, write_back, registers); 2356 } 2357 void Ldmed(Register rn, WriteBack write_back, RegisterList registers) { 2358 Ldmed(al, rn, write_back, registers); 2359 } 2360 2361 void Ldmfa(Condition cond, 2362 Register rn, 2363 WriteBack write_back, 2364 RegisterList registers) { 2365 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2366 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2367 VIXL_ASSERT(allow_macro_instructions_); 2368 VIXL_ASSERT(OutsideITBlock()); 2369 MacroEmissionCheckScope guard(this); 2370 #ifndef PANDA_BUILD 2371 ITScope it_scope(this, &cond, guard); 2372 #else 2373 ITScope it_scope(allocator_, this, &cond, guard); 2374 #endif 2375 ldmfa(cond, rn, write_back, registers); 2376 } 2377 void Ldmfa(Register rn, WriteBack write_back, RegisterList registers) { 2378 Ldmfa(al, rn, write_back, registers); 2379 } 2380 2381 void Ldmfd(Condition cond, 2382 Register rn, 2383 WriteBack write_back, 2384 RegisterList registers) { 2385 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2386 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2387 VIXL_ASSERT(allow_macro_instructions_); 2388 VIXL_ASSERT(OutsideITBlock()); 2389 MacroEmissionCheckScope guard(this); 2390 #ifndef PANDA_BUILD 2391 ITScope it_scope(this, &cond, guard); 2392 #else 2393 ITScope it_scope(allocator_, this, &cond, guard); 2394 #endif 2395 ldmfd(cond, rn, write_back, registers); 2396 } 2397 void Ldmfd(Register rn, WriteBack write_back, RegisterList registers) { 2398 Ldmfd(al, rn, write_back, registers); 2399 } 2400 2401 void Ldmib(Condition cond, 2402 Register rn, 2403 WriteBack write_back, 2404 RegisterList registers) { 2405 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2406 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 2407 VIXL_ASSERT(allow_macro_instructions_); 2408 VIXL_ASSERT(OutsideITBlock()); 2409 MacroEmissionCheckScope guard(this); 2410 #ifndef PANDA_BUILD 2411 ITScope it_scope(this, &cond, guard); 2412 #else 2413 ITScope it_scope(allocator_, this, &cond, guard); 2414 #endif 2415 ldmib(cond, rn, write_back, registers); 2416 } 2417 void Ldmib(Register rn, WriteBack write_back, RegisterList registers) { 2418 Ldmib(al, rn, write_back, registers); 2419 } 2420 2421 void Ldr(Condition cond, Register rt, const MemOperand& operand) { 2422 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2423 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2424 VIXL_ASSERT(allow_macro_instructions_); 2425 VIXL_ASSERT(OutsideITBlock()); 2426 MacroEmissionCheckScope guard(this); 2427 bool can_use_it = 2428 // LDR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1 2429 (operand.IsImmediate() && rt.IsLow() && 2430 operand.GetBaseRegister().IsLow() && 2431 operand.IsOffsetImmediateWithinRange(0, 124, 4) && 2432 (operand.GetAddrMode() == Offset)) || 2433 // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2 2434 (operand.IsImmediate() && rt.IsLow() && 2435 operand.GetBaseRegister().IsSP() && 2436 operand.IsOffsetImmediateWithinRange(0, 1020, 4) && 2437 (operand.GetAddrMode() == Offset)) || 2438 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 2439 (operand.IsPlainRegister() && rt.IsLow() && 2440 operand.GetBaseRegister().IsLow() && 2441 operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 2442 (operand.GetAddrMode() == Offset)); 2443 #ifndef PANDA_BUILD 2444 ITScope it_scope(this, &cond, guard, can_use_it); 2445 #else 2446 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 2447 #endif 2448 ldr(cond, rt, operand); 2449 } 2450 void Ldr(Register rt, const MemOperand& operand) { Ldr(al, rt, operand); } 2451 2452 2453 void Ldrb(Condition cond, Register rt, const MemOperand& operand) { 2454 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2455 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2456 VIXL_ASSERT(allow_macro_instructions_); 2457 VIXL_ASSERT(OutsideITBlock()); 2458 MacroEmissionCheckScope guard(this); 2459 bool can_use_it = 2460 // LDRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1 2461 (operand.IsImmediate() && rt.IsLow() && 2462 operand.GetBaseRegister().IsLow() && 2463 operand.IsOffsetImmediateWithinRange(0, 31) && 2464 (operand.GetAddrMode() == Offset)) || 2465 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 2466 (operand.IsPlainRegister() && rt.IsLow() && 2467 operand.GetBaseRegister().IsLow() && 2468 operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 2469 (operand.GetAddrMode() == Offset)); 2470 #ifndef PANDA_BUILD 2471 ITScope it_scope(this, &cond, guard, can_use_it); 2472 #else 2473 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 2474 #endif 2475 ldrb(cond, rt, operand); 2476 } 2477 void Ldrb(Register rt, const MemOperand& operand) { Ldrb(al, rt, operand); } 2478 2479 2480 void Ldrd(Condition cond, 2481 Register rt, 2482 Register rt2, 2483 const MemOperand& operand) { 2484 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2485 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 2486 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2487 VIXL_ASSERT(allow_macro_instructions_); 2488 VIXL_ASSERT(OutsideITBlock()); 2489 MacroEmissionCheckScope guard(this); 2490 #ifndef PANDA_BUILD 2491 ITScope it_scope(this, &cond, guard); 2492 #else 2493 ITScope it_scope(allocator_, this, &cond, guard); 2494 #endif 2495 ldrd(cond, rt, rt2, operand); 2496 } 2497 void Ldrd(Register rt, Register rt2, const MemOperand& operand) { 2498 Ldrd(al, rt, rt2, operand); 2499 } 2500 2501 2502 void Ldrex(Condition cond, Register rt, const MemOperand& operand) { 2503 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2504 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2505 VIXL_ASSERT(allow_macro_instructions_); 2506 VIXL_ASSERT(OutsideITBlock()); 2507 MacroEmissionCheckScope guard(this); 2508 #ifndef PANDA_BUILD 2509 ITScope it_scope(this, &cond, guard); 2510 #else 2511 ITScope it_scope(allocator_, this, &cond, guard); 2512 #endif 2513 ldrex(cond, rt, operand); 2514 } 2515 void Ldrex(Register rt, const MemOperand& operand) { Ldrex(al, rt, operand); } 2516 2517 void Ldrexb(Condition cond, Register rt, const MemOperand& operand) { 2518 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2519 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2520 VIXL_ASSERT(allow_macro_instructions_); 2521 VIXL_ASSERT(OutsideITBlock()); 2522 MacroEmissionCheckScope guard(this); 2523 #ifndef PANDA_BUILD 2524 ITScope it_scope(this, &cond, guard); 2525 #else 2526 ITScope it_scope(allocator_, this, &cond, guard); 2527 #endif 2528 ldrexb(cond, rt, operand); 2529 } 2530 void Ldrexb(Register rt, const MemOperand& operand) { 2531 Ldrexb(al, rt, operand); 2532 } 2533 2534 void Ldrexd(Condition cond, 2535 Register rt, 2536 Register rt2, 2537 const MemOperand& operand) { 2538 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2539 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 2540 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2541 VIXL_ASSERT(allow_macro_instructions_); 2542 VIXL_ASSERT(OutsideITBlock()); 2543 MacroEmissionCheckScope guard(this); 2544 #ifndef PANDA_BUILD 2545 ITScope it_scope(this, &cond, guard); 2546 #else 2547 ITScope it_scope(allocator_, this, &cond, guard); 2548 #endif 2549 ldrexd(cond, rt, rt2, operand); 2550 } 2551 void Ldrexd(Register rt, Register rt2, const MemOperand& operand) { 2552 Ldrexd(al, rt, rt2, operand); 2553 } 2554 2555 void Ldrexh(Condition cond, Register rt, const MemOperand& operand) { 2556 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2557 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2558 VIXL_ASSERT(allow_macro_instructions_); 2559 VIXL_ASSERT(OutsideITBlock()); 2560 MacroEmissionCheckScope guard(this); 2561 #ifndef PANDA_BUILD 2562 ITScope it_scope(this, &cond, guard); 2563 #else 2564 ITScope it_scope(allocator_, this, &cond, guard); 2565 #endif 2566 ldrexh(cond, rt, operand); 2567 } 2568 void Ldrexh(Register rt, const MemOperand& operand) { 2569 Ldrexh(al, rt, operand); 2570 } 2571 2572 void Ldrh(Condition cond, Register rt, const MemOperand& operand) { 2573 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2574 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2575 VIXL_ASSERT(allow_macro_instructions_); 2576 VIXL_ASSERT(OutsideITBlock()); 2577 MacroEmissionCheckScope guard(this); 2578 bool can_use_it = 2579 // LDRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1 2580 (operand.IsImmediate() && rt.IsLow() && 2581 operand.GetBaseRegister().IsLow() && 2582 operand.IsOffsetImmediateWithinRange(0, 62, 2) && 2583 (operand.GetAddrMode() == Offset)) || 2584 // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 2585 (operand.IsPlainRegister() && rt.IsLow() && 2586 operand.GetBaseRegister().IsLow() && 2587 operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 2588 (operand.GetAddrMode() == Offset)); 2589 #ifndef PANDA_BUILD 2590 ITScope it_scope(this, &cond, guard, can_use_it); 2591 #else 2592 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 2593 #endif 2594 ldrh(cond, rt, operand); 2595 } 2596 void Ldrh(Register rt, const MemOperand& operand) { Ldrh(al, rt, operand); } 2597 2598 2599 void Ldrsb(Condition cond, Register rt, const MemOperand& operand) { 2600 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2601 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2602 VIXL_ASSERT(allow_macro_instructions_); 2603 VIXL_ASSERT(OutsideITBlock()); 2604 MacroEmissionCheckScope guard(this); 2605 bool can_use_it = 2606 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 2607 operand.IsPlainRegister() && rt.IsLow() && 2608 operand.GetBaseRegister().IsLow() && 2609 operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 2610 (operand.GetAddrMode() == Offset); 2611 #ifndef PANDA_BUILD 2612 ITScope it_scope(this, &cond, guard, can_use_it); 2613 #else 2614 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 2615 #endif 2616 ldrsb(cond, rt, operand); 2617 } 2618 void Ldrsb(Register rt, const MemOperand& operand) { Ldrsb(al, rt, operand); } 2619 2620 2621 void Ldrsh(Condition cond, Register rt, const MemOperand& operand) { 2622 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 2623 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2624 VIXL_ASSERT(allow_macro_instructions_); 2625 VIXL_ASSERT(OutsideITBlock()); 2626 MacroEmissionCheckScope guard(this); 2627 bool can_use_it = 2628 // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 2629 operand.IsPlainRegister() && rt.IsLow() && 2630 operand.GetBaseRegister().IsLow() && 2631 operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 2632 (operand.GetAddrMode() == Offset); 2633 #ifndef PANDA_BUILD 2634 ITScope it_scope(this, &cond, guard, can_use_it); 2635 #else 2636 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 2637 #endif 2638 ldrsh(cond, rt, operand); 2639 } 2640 void Ldrsh(Register rt, const MemOperand& operand) { Ldrsh(al, rt, operand); } 2641 2642 2643 void Lsl(Condition cond, Register rd, Register rm, const Operand& operand) { 2644 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2645 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2646 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2647 VIXL_ASSERT(allow_macro_instructions_); 2648 VIXL_ASSERT(OutsideITBlock()); 2649 MacroEmissionCheckScope guard(this); 2650 bool can_use_it = 2651 // LSL<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2 2652 (operand.IsImmediate() && (operand.GetImmediate() >= 1) && 2653 (operand.GetImmediate() <= 31) && rd.IsLow() && rm.IsLow()) || 2654 // LSL<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1 2655 (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() && 2656 operand.GetBaseRegister().IsLow()); 2657 #ifndef PANDA_BUILD 2658 ITScope it_scope(this, &cond, guard, can_use_it); 2659 #else 2660 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 2661 #endif 2662 lsl(cond, rd, rm, operand); 2663 } 2664 void Lsl(Register rd, Register rm, const Operand& operand) { 2665 Lsl(al, rd, rm, operand); 2666 } 2667 void Lsl(FlagsUpdate flags, 2668 Condition cond, 2669 Register rd, 2670 Register rm, 2671 const Operand& operand) { 2672 switch (flags) { 2673 case LeaveFlags: 2674 Lsl(cond, rd, rm, operand); 2675 break; 2676 case SetFlags: 2677 Lsls(cond, rd, rm, operand); 2678 break; 2679 case DontCare: 2680 bool setflags_is_smaller = 2681 IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() && 2682 ((operand.IsImmediate() && (operand.GetImmediate() >= 1) && 2683 (operand.GetImmediate() < 32)) || 2684 (operand.IsPlainRegister() && rd.Is(rm))); 2685 if (setflags_is_smaller) { 2686 Lsls(cond, rd, rm, operand); 2687 } else { 2688 Lsl(cond, rd, rm, operand); 2689 } 2690 break; 2691 } 2692 } 2693 void Lsl(FlagsUpdate flags, 2694 Register rd, 2695 Register rm, 2696 const Operand& operand) { 2697 Lsl(flags, al, rd, rm, operand); 2698 } 2699 2700 void Lsls(Condition cond, Register rd, Register rm, const Operand& operand) { 2701 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2702 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2703 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2704 VIXL_ASSERT(allow_macro_instructions_); 2705 VIXL_ASSERT(OutsideITBlock()); 2706 MacroEmissionCheckScope guard(this); 2707 #ifndef PANDA_BUILD 2708 ITScope it_scope(this, &cond, guard); 2709 #else 2710 ITScope it_scope(allocator_, this, &cond, guard); 2711 #endif 2712 lsls(cond, rd, rm, operand); 2713 } 2714 void Lsls(Register rd, Register rm, const Operand& operand) { 2715 Lsls(al, rd, rm, operand); 2716 } 2717 2718 void Lsr(Condition cond, Register rd, Register rm, const Operand& operand) { 2719 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2720 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2721 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2722 VIXL_ASSERT(allow_macro_instructions_); 2723 VIXL_ASSERT(OutsideITBlock()); 2724 MacroEmissionCheckScope guard(this); 2725 bool can_use_it = 2726 // LSR<c>{<q>} {<Rd>,} <Rm>, #<imm> ; T2 2727 (operand.IsImmediate() && (operand.GetImmediate() >= 1) && 2728 (operand.GetImmediate() <= 32) && rd.IsLow() && rm.IsLow()) || 2729 // LSR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1 2730 (operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() && 2731 operand.GetBaseRegister().IsLow()); 2732 #ifndef PANDA_BUILD 2733 ITScope it_scope(this, &cond, guard, can_use_it); 2734 #else 2735 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 2736 #endif 2737 lsr(cond, rd, rm, operand); 2738 } 2739 void Lsr(Register rd, Register rm, const Operand& operand) { 2740 Lsr(al, rd, rm, operand); 2741 } 2742 void Lsr(FlagsUpdate flags, 2743 Condition cond, 2744 Register rd, 2745 Register rm, 2746 const Operand& operand) { 2747 switch (flags) { 2748 case LeaveFlags: 2749 Lsr(cond, rd, rm, operand); 2750 break; 2751 case SetFlags: 2752 Lsrs(cond, rd, rm, operand); 2753 break; 2754 case DontCare: 2755 bool setflags_is_smaller = 2756 IsUsingT32() && cond.Is(al) && rd.IsLow() && rm.IsLow() && 2757 ((operand.IsImmediate() && (operand.GetImmediate() >= 1) && 2758 (operand.GetImmediate() <= 32)) || 2759 (operand.IsPlainRegister() && rd.Is(rm))); 2760 if (setflags_is_smaller) { 2761 Lsrs(cond, rd, rm, operand); 2762 } else { 2763 Lsr(cond, rd, rm, operand); 2764 } 2765 break; 2766 } 2767 } 2768 void Lsr(FlagsUpdate flags, 2769 Register rd, 2770 Register rm, 2771 const Operand& operand) { 2772 Lsr(flags, al, rd, rm, operand); 2773 } 2774 2775 void Lsrs(Condition cond, Register rd, Register rm, const Operand& operand) { 2776 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2777 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2778 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2779 VIXL_ASSERT(allow_macro_instructions_); 2780 VIXL_ASSERT(OutsideITBlock()); 2781 MacroEmissionCheckScope guard(this); 2782 #ifndef PANDA_BUILD 2783 ITScope it_scope(this, &cond, guard); 2784 #else 2785 ITScope it_scope(allocator_, this, &cond, guard); 2786 #endif 2787 lsrs(cond, rd, rm, operand); 2788 } 2789 void Lsrs(Register rd, Register rm, const Operand& operand) { 2790 Lsrs(al, rd, rm, operand); 2791 } 2792 2793 void Mla(Condition cond, Register rd, Register rn, Register rm, Register ra) { 2794 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2795 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2796 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2797 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 2798 VIXL_ASSERT(allow_macro_instructions_); 2799 VIXL_ASSERT(OutsideITBlock()); 2800 MacroEmissionCheckScope guard(this); 2801 #ifndef PANDA_BUILD 2802 ITScope it_scope(this, &cond, guard); 2803 #else 2804 ITScope it_scope(allocator_, this, &cond, guard); 2805 #endif 2806 mla(cond, rd, rn, rm, ra); 2807 } 2808 void Mla(Register rd, Register rn, Register rm, Register ra) { 2809 Mla(al, rd, rn, rm, ra); 2810 } 2811 void Mla(FlagsUpdate flags, 2812 Condition cond, 2813 Register rd, 2814 Register rn, 2815 Register rm, 2816 Register ra) { 2817 switch (flags) { 2818 case LeaveFlags: 2819 Mla(cond, rd, rn, rm, ra); 2820 break; 2821 case SetFlags: 2822 Mlas(cond, rd, rn, rm, ra); 2823 break; 2824 case DontCare: 2825 Mla(cond, rd, rn, rm, ra); 2826 break; 2827 } 2828 } 2829 void Mla( 2830 FlagsUpdate flags, Register rd, Register rn, Register rm, Register ra) { 2831 Mla(flags, al, rd, rn, rm, ra); 2832 } 2833 2834 void Mlas( 2835 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2836 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2837 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2838 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2839 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 2840 VIXL_ASSERT(allow_macro_instructions_); 2841 VIXL_ASSERT(OutsideITBlock()); 2842 MacroEmissionCheckScope guard(this); 2843 #ifndef PANDA_BUILD 2844 ITScope it_scope(this, &cond, guard); 2845 #else 2846 ITScope it_scope(allocator_, this, &cond, guard); 2847 #endif 2848 mlas(cond, rd, rn, rm, ra); 2849 } 2850 void Mlas(Register rd, Register rn, Register rm, Register ra) { 2851 Mlas(al, rd, rn, rm, ra); 2852 } 2853 2854 void Mls(Condition cond, Register rd, Register rn, Register rm, Register ra) { 2855 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2856 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 2857 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 2858 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 2859 VIXL_ASSERT(allow_macro_instructions_); 2860 VIXL_ASSERT(OutsideITBlock()); 2861 MacroEmissionCheckScope guard(this); 2862 #ifndef PANDA_BUILD 2863 ITScope it_scope(this, &cond, guard); 2864 #else 2865 ITScope it_scope(allocator_, this, &cond, guard); 2866 #endif 2867 mls(cond, rd, rn, rm, ra); 2868 } 2869 void Mls(Register rd, Register rn, Register rm, Register ra) { 2870 Mls(al, rd, rn, rm, ra); 2871 } 2872 2873 void Mov(Condition cond, Register rd, const Operand& operand) { 2874 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2875 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2876 VIXL_ASSERT(allow_macro_instructions_); 2877 VIXL_ASSERT(OutsideITBlock()); 2878 MacroEmissionCheckScope guard(this); 2879 if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) { 2880 return; 2881 } 2882 bool can_use_it = 2883 // MOV<c>{<q>} <Rd>, #<imm8> ; T1 2884 (operand.IsImmediate() && rd.IsLow() && 2885 (operand.GetImmediate() <= 255)) || 2886 // MOV{<c>}{<q>} <Rd>, <Rm> ; T1 2887 (operand.IsPlainRegister() && !rd.IsPC() && 2888 !operand.GetBaseRegister().IsPC()) || 2889 // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount>} ; T2 2890 (operand.IsImmediateShiftedRegister() && rd.IsLow() && 2891 operand.GetBaseRegister().IsLow() && 2892 (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) || 2893 operand.GetShift().Is(ASR))) || 2894 // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1 2895 // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1 2896 // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1 2897 // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1 2898 (operand.IsRegisterShiftedRegister() && 2899 rd.Is(operand.GetBaseRegister()) && rd.IsLow() && 2900 (operand.GetShift().Is(LSL) || operand.GetShift().Is(LSR) || 2901 operand.GetShift().Is(ASR) || operand.GetShift().Is(ROR)) && 2902 operand.GetShiftRegister().IsLow()); 2903 #ifndef PANDA_BUILD 2904 ITScope it_scope(this, &cond, guard, can_use_it); 2905 #else 2906 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 2907 #endif 2908 mov(cond, rd, operand); 2909 } 2910 void Mov(Register rd, const Operand& operand) { Mov(al, rd, operand); } 2911 void Mov(FlagsUpdate flags, 2912 Condition cond, 2913 Register rd, 2914 const Operand& operand) { 2915 switch (flags) { 2916 case LeaveFlags: 2917 Mov(cond, rd, operand); 2918 break; 2919 case SetFlags: 2920 Movs(cond, rd, operand); 2921 break; 2922 case DontCare: 2923 if (operand.IsPlainRegister() && rd.Is(operand.GetBaseRegister())) { 2924 return; 2925 } 2926 bool setflags_is_smaller = 2927 IsUsingT32() && cond.Is(al) && 2928 ((operand.IsImmediateShiftedRegister() && rd.IsLow() && 2929 operand.GetBaseRegister().IsLow() && 2930 (operand.GetShiftAmount() >= 1) && 2931 (((operand.GetShiftAmount() <= 32) && 2932 ((operand.GetShift().IsLSR() || operand.GetShift().IsASR()))) || 2933 ((operand.GetShiftAmount() < 32) && 2934 operand.GetShift().IsLSL()))) || 2935 (operand.IsRegisterShiftedRegister() && rd.IsLow() && 2936 operand.GetBaseRegister().Is(rd) && 2937 operand.GetShiftRegister().IsLow() && 2938 (operand.GetShift().IsLSL() || operand.GetShift().IsLSR() || 2939 operand.GetShift().IsASR() || operand.GetShift().IsROR())) || 2940 (operand.IsImmediate() && rd.IsLow() && 2941 (operand.GetImmediate() < 256))); 2942 if (setflags_is_smaller) { 2943 Movs(cond, rd, operand); 2944 } else { 2945 Mov(cond, rd, operand); 2946 } 2947 break; 2948 } 2949 } 2950 void Mov(FlagsUpdate flags, Register rd, const Operand& operand) { 2951 Mov(flags, al, rd, operand); 2952 } 2953 2954 void Movs(Condition cond, Register rd, const Operand& operand) { 2955 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2956 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2957 VIXL_ASSERT(allow_macro_instructions_); 2958 VIXL_ASSERT(OutsideITBlock()); 2959 MacroEmissionCheckScope guard(this); 2960 #ifndef PANDA_BUILD 2961 ITScope it_scope(this, &cond, guard); 2962 #else 2963 ITScope it_scope(allocator_, this, &cond, guard); 2964 #endif 2965 movs(cond, rd, operand); 2966 } 2967 void Movs(Register rd, const Operand& operand) { Movs(al, rd, operand); } 2968 2969 void Movt(Condition cond, Register rd, const Operand& operand) { 2970 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2971 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 2972 VIXL_ASSERT(allow_macro_instructions_); 2973 VIXL_ASSERT(OutsideITBlock()); 2974 MacroEmissionCheckScope guard(this); 2975 #ifndef PANDA_BUILD 2976 ITScope it_scope(this, &cond, guard); 2977 #else 2978 ITScope it_scope(allocator_, this, &cond, guard); 2979 #endif 2980 movt(cond, rd, operand); 2981 } 2982 void Movt(Register rd, const Operand& operand) { Movt(al, rd, operand); } 2983 2984 void Mrs(Condition cond, Register rd, SpecialRegister spec_reg) { 2985 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 2986 VIXL_ASSERT(allow_macro_instructions_); 2987 VIXL_ASSERT(OutsideITBlock()); 2988 MacroEmissionCheckScope guard(this); 2989 #ifndef PANDA_BUILD 2990 ITScope it_scope(this, &cond, guard); 2991 #else 2992 ITScope it_scope(allocator_, this, &cond, guard); 2993 #endif 2994 mrs(cond, rd, spec_reg); 2995 } 2996 void Mrs(Register rd, SpecialRegister spec_reg) { Mrs(al, rd, spec_reg); } 2997 2998 void Msr(Condition cond, 2999 MaskedSpecialRegister spec_reg, 3000 const Operand& operand) { 3001 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3002 VIXL_ASSERT(allow_macro_instructions_); 3003 VIXL_ASSERT(OutsideITBlock()); 3004 MacroEmissionCheckScope guard(this); 3005 #ifndef PANDA_BUILD 3006 ITScope it_scope(this, &cond, guard); 3007 #else 3008 ITScope it_scope(allocator_, this, &cond, guard); 3009 #endif 3010 msr(cond, spec_reg, operand); 3011 } 3012 void Msr(MaskedSpecialRegister spec_reg, const Operand& operand) { 3013 Msr(al, spec_reg, operand); 3014 } 3015 3016 void Mul(Condition cond, Register rd, Register rn, Register rm) { 3017 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3018 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3019 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3020 VIXL_ASSERT(allow_macro_instructions_); 3021 VIXL_ASSERT(OutsideITBlock()); 3022 MacroEmissionCheckScope guard(this); 3023 bool can_use_it = 3024 // MUL<c>{<q>} <Rdm>, <Rn>{, <Rdm>} ; T1 3025 rd.Is(rm) && rn.IsLow() && rm.IsLow(); 3026 #ifndef PANDA_BUILD 3027 ITScope it_scope(this, &cond, guard, can_use_it); 3028 #else 3029 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 3030 #endif 3031 mul(cond, rd, rn, rm); 3032 } 3033 void Mul(Register rd, Register rn, Register rm) { Mul(al, rd, rn, rm); } 3034 void Mul(FlagsUpdate flags, 3035 Condition cond, 3036 Register rd, 3037 Register rn, 3038 Register rm) { 3039 switch (flags) { 3040 case LeaveFlags: 3041 Mul(cond, rd, rn, rm); 3042 break; 3043 case SetFlags: 3044 Muls(cond, rd, rn, rm); 3045 break; 3046 case DontCare: 3047 bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 3048 rn.IsLow() && rm.Is(rd); 3049 if (setflags_is_smaller) { 3050 Muls(cond, rd, rn, rm); 3051 } else { 3052 Mul(cond, rd, rn, rm); 3053 } 3054 break; 3055 } 3056 } 3057 void Mul(FlagsUpdate flags, Register rd, Register rn, Register rm) { 3058 Mul(flags, al, rd, rn, rm); 3059 } 3060 3061 void Muls(Condition cond, Register rd, Register rn, Register rm) { 3062 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3063 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3064 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3065 VIXL_ASSERT(allow_macro_instructions_); 3066 VIXL_ASSERT(OutsideITBlock()); 3067 MacroEmissionCheckScope guard(this); 3068 #ifndef PANDA_BUILD 3069 ITScope it_scope(this, &cond, guard); 3070 #else 3071 ITScope it_scope(allocator_, this, &cond, guard); 3072 #endif 3073 muls(cond, rd, rn, rm); 3074 } 3075 void Muls(Register rd, Register rn, Register rm) { Muls(al, rd, rn, rm); } 3076 3077 void Mvn(Condition cond, Register rd, const Operand& operand) { 3078 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3079 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3080 VIXL_ASSERT(allow_macro_instructions_); 3081 VIXL_ASSERT(OutsideITBlock()); 3082 MacroEmissionCheckScope guard(this); 3083 bool can_use_it = 3084 // MVN<c>{<q>} <Rd>, <Rm> ; T1 3085 operand.IsPlainRegister() && rd.IsLow() && 3086 operand.GetBaseRegister().IsLow(); 3087 #ifndef PANDA_BUILD 3088 ITScope it_scope(this, &cond, guard, can_use_it); 3089 #else 3090 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 3091 #endif 3092 mvn(cond, rd, operand); 3093 } 3094 void Mvn(Register rd, const Operand& operand) { Mvn(al, rd, operand); } 3095 void Mvn(FlagsUpdate flags, 3096 Condition cond, 3097 Register rd, 3098 const Operand& operand) { 3099 switch (flags) { 3100 case LeaveFlags: 3101 Mvn(cond, rd, operand); 3102 break; 3103 case SetFlags: 3104 Mvns(cond, rd, operand); 3105 break; 3106 case DontCare: 3107 bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 3108 operand.IsPlainRegister() && 3109 operand.GetBaseRegister().IsLow(); 3110 if (setflags_is_smaller) { 3111 Mvns(cond, rd, operand); 3112 } else { 3113 Mvn(cond, rd, operand); 3114 } 3115 break; 3116 } 3117 } 3118 void Mvn(FlagsUpdate flags, Register rd, const Operand& operand) { 3119 Mvn(flags, al, rd, operand); 3120 } 3121 3122 void Mvns(Condition cond, Register rd, const Operand& operand) { 3123 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3124 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3125 VIXL_ASSERT(allow_macro_instructions_); 3126 VIXL_ASSERT(OutsideITBlock()); 3127 MacroEmissionCheckScope guard(this); 3128 #ifndef PANDA_BUILD 3129 ITScope it_scope(this, &cond, guard); 3130 #else 3131 ITScope it_scope(allocator_, this, &cond, guard); 3132 #endif 3133 mvns(cond, rd, operand); 3134 } 3135 void Mvns(Register rd, const Operand& operand) { Mvns(al, rd, operand); } 3136 3137 void Nop(Condition cond) { 3138 VIXL_ASSERT(allow_macro_instructions_); 3139 VIXL_ASSERT(OutsideITBlock()); 3140 MacroEmissionCheckScope guard(this); 3141 #ifndef PANDA_BUILD 3142 ITScope it_scope(this, &cond, guard); 3143 #else 3144 ITScope it_scope(allocator_, this, &cond, guard); 3145 #endif 3146 nop(cond); 3147 } 3148 void Nop() { Nop(al); } 3149 3150 void Orn(Condition cond, Register rd, Register rn, const Operand& operand) { 3151 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3152 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3153 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3154 VIXL_ASSERT(allow_macro_instructions_); 3155 VIXL_ASSERT(OutsideITBlock()); 3156 MacroEmissionCheckScope guard(this); 3157 if (cond.Is(al) && operand.IsImmediate()) { 3158 uint32_t immediate = operand.GetImmediate(); 3159 if (immediate == 0) { 3160 mvn(rd, 0); 3161 return; 3162 } 3163 if ((immediate == 0xffffffff) && rd.Is(rn)) { 3164 return; 3165 } 3166 } 3167 #ifndef PANDA_BUILD 3168 ITScope it_scope(this, &cond, guard); 3169 #else 3170 ITScope it_scope(allocator_, this, &cond, guard); 3171 #endif 3172 orn(cond, rd, rn, operand); 3173 } 3174 void Orn(Register rd, Register rn, const Operand& operand) { 3175 Orn(al, rd, rn, operand); 3176 } 3177 void Orn(FlagsUpdate flags, 3178 Condition cond, 3179 Register rd, 3180 Register rn, 3181 const Operand& operand) { 3182 switch (flags) { 3183 case LeaveFlags: 3184 Orn(cond, rd, rn, operand); 3185 break; 3186 case SetFlags: 3187 Orns(cond, rd, rn, operand); 3188 break; 3189 case DontCare: 3190 Orn(cond, rd, rn, operand); 3191 break; 3192 } 3193 } 3194 void Orn(FlagsUpdate flags, 3195 Register rd, 3196 Register rn, 3197 const Operand& operand) { 3198 Orn(flags, al, rd, rn, operand); 3199 } 3200 3201 void Orns(Condition cond, Register rd, Register rn, const Operand& operand) { 3202 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3203 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3204 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3205 VIXL_ASSERT(allow_macro_instructions_); 3206 VIXL_ASSERT(OutsideITBlock()); 3207 MacroEmissionCheckScope guard(this); 3208 #ifndef PANDA_BUILD 3209 ITScope it_scope(this, &cond, guard); 3210 #else 3211 ITScope it_scope(allocator_, this, &cond, guard); 3212 #endif 3213 orns(cond, rd, rn, operand); 3214 } 3215 void Orns(Register rd, Register rn, const Operand& operand) { 3216 Orns(al, rd, rn, operand); 3217 } 3218 3219 void Orr(Condition cond, Register rd, Register rn, const Operand& operand) { 3220 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3221 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3222 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3223 VIXL_ASSERT(allow_macro_instructions_); 3224 VIXL_ASSERT(OutsideITBlock()); 3225 MacroEmissionCheckScope guard(this); 3226 if (rd.Is(rn) && operand.IsPlainRegister() && 3227 rd.Is(operand.GetBaseRegister())) { 3228 return; 3229 } 3230 if (cond.Is(al) && operand.IsImmediate()) { 3231 uint32_t immediate = operand.GetImmediate(); 3232 if ((immediate == 0) && rd.Is(rn)) { 3233 return; 3234 } 3235 if (immediate == 0xffffffff) { 3236 mvn(rd, 0); 3237 return; 3238 } 3239 } 3240 bool can_use_it = 3241 // ORR<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 3242 operand.IsPlainRegister() && rd.Is(rn) && rn.IsLow() && 3243 operand.GetBaseRegister().IsLow(); 3244 #ifndef PANDA_BUILD 3245 ITScope it_scope(this, &cond, guard, can_use_it); 3246 #else 3247 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 3248 #endif 3249 orr(cond, rd, rn, operand); 3250 } 3251 void Orr(Register rd, Register rn, const Operand& operand) { 3252 Orr(al, rd, rn, operand); 3253 } 3254 void Orr(FlagsUpdate flags, 3255 Condition cond, 3256 Register rd, 3257 Register rn, 3258 const Operand& operand) { 3259 switch (flags) { 3260 case LeaveFlags: 3261 Orr(cond, rd, rn, operand); 3262 break; 3263 case SetFlags: 3264 Orrs(cond, rd, rn, operand); 3265 break; 3266 case DontCare: 3267 if (operand.IsPlainRegister() && rd.Is(rn) && 3268 rd.Is(operand.GetBaseRegister())) { 3269 return; 3270 } 3271 bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 3272 rn.Is(rd) && operand.IsPlainRegister() && 3273 operand.GetBaseRegister().IsLow(); 3274 if (setflags_is_smaller) { 3275 Orrs(cond, rd, rn, operand); 3276 } else { 3277 Orr(cond, rd, rn, operand); 3278 } 3279 break; 3280 } 3281 } 3282 void Orr(FlagsUpdate flags, 3283 Register rd, 3284 Register rn, 3285 const Operand& operand) { 3286 Orr(flags, al, rd, rn, operand); 3287 } 3288 3289 void Orrs(Condition cond, Register rd, Register rn, const Operand& operand) { 3290 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3291 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3292 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3293 VIXL_ASSERT(allow_macro_instructions_); 3294 VIXL_ASSERT(OutsideITBlock()); 3295 MacroEmissionCheckScope guard(this); 3296 #ifndef PANDA_BUILD 3297 ITScope it_scope(this, &cond, guard); 3298 #else 3299 ITScope it_scope(allocator_, this, &cond, guard); 3300 #endif 3301 orrs(cond, rd, rn, operand); 3302 } 3303 void Orrs(Register rd, Register rn, const Operand& operand) { 3304 Orrs(al, rd, rn, operand); 3305 } 3306 3307 void Pkhbt(Condition cond, Register rd, Register rn, const Operand& operand) { 3308 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3309 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3310 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3311 VIXL_ASSERT(allow_macro_instructions_); 3312 VIXL_ASSERT(OutsideITBlock()); 3313 MacroEmissionCheckScope guard(this); 3314 #ifndef PANDA_BUILD 3315 ITScope it_scope(this, &cond, guard); 3316 #else 3317 ITScope it_scope(allocator_, this, &cond, guard); 3318 #endif 3319 pkhbt(cond, rd, rn, operand); 3320 } 3321 void Pkhbt(Register rd, Register rn, const Operand& operand) { 3322 Pkhbt(al, rd, rn, operand); 3323 } 3324 3325 void Pkhtb(Condition cond, Register rd, Register rn, const Operand& operand) { 3326 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3327 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3328 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3329 VIXL_ASSERT(allow_macro_instructions_); 3330 VIXL_ASSERT(OutsideITBlock()); 3331 MacroEmissionCheckScope guard(this); 3332 #ifndef PANDA_BUILD 3333 ITScope it_scope(this, &cond, guard); 3334 #else 3335 ITScope it_scope(allocator_, this, &cond, guard); 3336 #endif 3337 pkhtb(cond, rd, rn, operand); 3338 } 3339 void Pkhtb(Register rd, Register rn, const Operand& operand) { 3340 Pkhtb(al, rd, rn, operand); 3341 } 3342 3343 3344 void Pld(Condition cond, const MemOperand& operand) { 3345 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3346 VIXL_ASSERT(allow_macro_instructions_); 3347 VIXL_ASSERT(OutsideITBlock()); 3348 MacroEmissionCheckScope guard(this); 3349 #ifndef PANDA_BUILD 3350 ITScope it_scope(this, &cond, guard); 3351 #else 3352 ITScope it_scope(allocator_, this, &cond, guard); 3353 #endif 3354 pld(cond, operand); 3355 } 3356 void Pld(const MemOperand& operand) { Pld(al, operand); } 3357 3358 void Pldw(Condition cond, const MemOperand& operand) { 3359 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3360 VIXL_ASSERT(allow_macro_instructions_); 3361 VIXL_ASSERT(OutsideITBlock()); 3362 MacroEmissionCheckScope guard(this); 3363 #ifndef PANDA_BUILD 3364 ITScope it_scope(this, &cond, guard); 3365 #else 3366 ITScope it_scope(allocator_, this, &cond, guard); 3367 #endif 3368 pldw(cond, operand); 3369 } 3370 void Pldw(const MemOperand& operand) { Pldw(al, operand); } 3371 3372 void Pli(Condition cond, const MemOperand& operand) { 3373 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3374 VIXL_ASSERT(allow_macro_instructions_); 3375 VIXL_ASSERT(OutsideITBlock()); 3376 MacroEmissionCheckScope guard(this); 3377 #ifndef PANDA_BUILD 3378 ITScope it_scope(this, &cond, guard); 3379 #else 3380 ITScope it_scope(allocator_, this, &cond, guard); 3381 #endif 3382 pli(cond, operand); 3383 } 3384 void Pli(const MemOperand& operand) { Pli(al, operand); } 3385 3386 3387 void Pop(Condition cond, RegisterList registers) { 3388 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 3389 VIXL_ASSERT(allow_macro_instructions_); 3390 VIXL_ASSERT(OutsideITBlock()); 3391 MacroEmissionCheckScope guard(this); 3392 #ifndef PANDA_BUILD 3393 ITScope it_scope(this, &cond, guard); 3394 #else 3395 ITScope it_scope(allocator_, this, &cond, guard); 3396 #endif 3397 if (registers.IsSingleRegister() && 3398 (!IsUsingT32() || !registers.IsR0toR7orPC())) { 3399 pop(cond, registers.GetFirstAvailableRegister()); 3400 } else if (!registers.IsEmpty()) { 3401 pop(cond, registers); 3402 } 3403 } 3404 void Pop(RegisterList registers) { Pop(al, registers); } 3405 3406 void Pop(Condition cond, Register rt) { 3407 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 3408 VIXL_ASSERT(allow_macro_instructions_); 3409 VIXL_ASSERT(OutsideITBlock()); 3410 MacroEmissionCheckScope guard(this); 3411 #ifndef PANDA_BUILD 3412 ITScope it_scope(this, &cond, guard); 3413 #else 3414 ITScope it_scope(allocator_, this, &cond, guard); 3415 #endif 3416 pop(cond, rt); 3417 } 3418 void Pop(Register rt) { Pop(al, rt); } 3419 3420 void Push(Condition cond, RegisterList registers) { 3421 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 3422 VIXL_ASSERT(allow_macro_instructions_); 3423 VIXL_ASSERT(OutsideITBlock()); 3424 MacroEmissionCheckScope guard(this); 3425 #ifndef PANDA_BUILD 3426 ITScope it_scope(this, &cond, guard); 3427 #else 3428 ITScope it_scope(allocator_, this, &cond, guard); 3429 #endif 3430 if (registers.IsSingleRegister() && !registers.Includes(sp) && 3431 (!IsUsingT32() || !registers.IsR0toR7orLR())) { 3432 push(cond, registers.GetFirstAvailableRegister()); 3433 } else if (!registers.IsEmpty()) { 3434 push(cond, registers); 3435 } 3436 } 3437 void Push(RegisterList registers) { Push(al, registers); } 3438 3439 void Push(Condition cond, Register rt) { 3440 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 3441 VIXL_ASSERT(allow_macro_instructions_); 3442 VIXL_ASSERT(OutsideITBlock()); 3443 MacroEmissionCheckScope guard(this); 3444 #ifndef PANDA_BUILD 3445 ITScope it_scope(this, &cond, guard); 3446 #else 3447 ITScope it_scope(allocator_, this, &cond, guard); 3448 #endif 3449 if (IsUsingA32() && rt.IsSP()) { 3450 // Only the A32 multiple-register form can push sp. 3451 push(cond, RegisterList(rt)); 3452 } else { 3453 push(cond, rt); 3454 } 3455 } 3456 void Push(Register rt) { Push(al, rt); } 3457 3458 void Qadd(Condition cond, Register rd, Register rm, Register rn) { 3459 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3460 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3461 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3462 VIXL_ASSERT(allow_macro_instructions_); 3463 VIXL_ASSERT(OutsideITBlock()); 3464 MacroEmissionCheckScope guard(this); 3465 #ifndef PANDA_BUILD 3466 ITScope it_scope(this, &cond, guard); 3467 #else 3468 ITScope it_scope(allocator_, this, &cond, guard); 3469 #endif 3470 qadd(cond, rd, rm, rn); 3471 } 3472 void Qadd(Register rd, Register rm, Register rn) { Qadd(al, rd, rm, rn); } 3473 3474 void Qadd16(Condition cond, Register rd, Register rn, Register rm) { 3475 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3476 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3477 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3478 VIXL_ASSERT(allow_macro_instructions_); 3479 VIXL_ASSERT(OutsideITBlock()); 3480 MacroEmissionCheckScope guard(this); 3481 #ifndef PANDA_BUILD 3482 ITScope it_scope(this, &cond, guard); 3483 #else 3484 ITScope it_scope(allocator_, this, &cond, guard); 3485 #endif 3486 qadd16(cond, rd, rn, rm); 3487 } 3488 void Qadd16(Register rd, Register rn, Register rm) { Qadd16(al, rd, rn, rm); } 3489 3490 void Qadd8(Condition cond, Register rd, Register rn, Register rm) { 3491 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3492 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3493 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3494 VIXL_ASSERT(allow_macro_instructions_); 3495 VIXL_ASSERT(OutsideITBlock()); 3496 MacroEmissionCheckScope guard(this); 3497 #ifndef PANDA_BUILD 3498 ITScope it_scope(this, &cond, guard); 3499 #else 3500 ITScope it_scope(allocator_, this, &cond, guard); 3501 #endif 3502 qadd8(cond, rd, rn, rm); 3503 } 3504 void Qadd8(Register rd, Register rn, Register rm) { Qadd8(al, rd, rn, rm); } 3505 3506 void Qasx(Condition cond, Register rd, Register rn, Register rm) { 3507 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3508 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3509 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3510 VIXL_ASSERT(allow_macro_instructions_); 3511 VIXL_ASSERT(OutsideITBlock()); 3512 MacroEmissionCheckScope guard(this); 3513 #ifndef PANDA_BUILD 3514 ITScope it_scope(this, &cond, guard); 3515 #else 3516 ITScope it_scope(allocator_, this, &cond, guard); 3517 #endif 3518 qasx(cond, rd, rn, rm); 3519 } 3520 void Qasx(Register rd, Register rn, Register rm) { Qasx(al, rd, rn, rm); } 3521 3522 void Qdadd(Condition cond, Register rd, Register rm, Register rn) { 3523 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3524 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3525 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3526 VIXL_ASSERT(allow_macro_instructions_); 3527 VIXL_ASSERT(OutsideITBlock()); 3528 MacroEmissionCheckScope guard(this); 3529 #ifndef PANDA_BUILD 3530 ITScope it_scope(this, &cond, guard); 3531 #else 3532 ITScope it_scope(allocator_, this, &cond, guard); 3533 #endif 3534 qdadd(cond, rd, rm, rn); 3535 } 3536 void Qdadd(Register rd, Register rm, Register rn) { Qdadd(al, rd, rm, rn); } 3537 3538 void Qdsub(Condition cond, Register rd, Register rm, Register rn) { 3539 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3540 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3541 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3542 VIXL_ASSERT(allow_macro_instructions_); 3543 VIXL_ASSERT(OutsideITBlock()); 3544 MacroEmissionCheckScope guard(this); 3545 #ifndef PANDA_BUILD 3546 ITScope it_scope(this, &cond, guard); 3547 #else 3548 ITScope it_scope(allocator_, this, &cond, guard); 3549 #endif 3550 qdsub(cond, rd, rm, rn); 3551 } 3552 void Qdsub(Register rd, Register rm, Register rn) { Qdsub(al, rd, rm, rn); } 3553 3554 void Qsax(Condition cond, Register rd, Register rn, Register rm) { 3555 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3556 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3557 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3558 VIXL_ASSERT(allow_macro_instructions_); 3559 VIXL_ASSERT(OutsideITBlock()); 3560 MacroEmissionCheckScope guard(this); 3561 #ifndef PANDA_BUILD 3562 ITScope it_scope(this, &cond, guard); 3563 #else 3564 ITScope it_scope(allocator_, this, &cond, guard); 3565 #endif 3566 qsax(cond, rd, rn, rm); 3567 } 3568 void Qsax(Register rd, Register rn, Register rm) { Qsax(al, rd, rn, rm); } 3569 3570 void Qsub(Condition cond, Register rd, Register rm, Register rn) { 3571 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3572 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3573 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3574 VIXL_ASSERT(allow_macro_instructions_); 3575 VIXL_ASSERT(OutsideITBlock()); 3576 MacroEmissionCheckScope guard(this); 3577 #ifndef PANDA_BUILD 3578 ITScope it_scope(this, &cond, guard); 3579 #else 3580 ITScope it_scope(allocator_, this, &cond, guard); 3581 #endif 3582 qsub(cond, rd, rm, rn); 3583 } 3584 void Qsub(Register rd, Register rm, Register rn) { Qsub(al, rd, rm, rn); } 3585 3586 void Qsub16(Condition cond, Register rd, Register rn, Register rm) { 3587 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3588 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3589 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3590 VIXL_ASSERT(allow_macro_instructions_); 3591 VIXL_ASSERT(OutsideITBlock()); 3592 MacroEmissionCheckScope guard(this); 3593 #ifndef PANDA_BUILD 3594 ITScope it_scope(this, &cond, guard); 3595 #else 3596 ITScope it_scope(allocator_, this, &cond, guard); 3597 #endif 3598 qsub16(cond, rd, rn, rm); 3599 } 3600 void Qsub16(Register rd, Register rn, Register rm) { Qsub16(al, rd, rn, rm); } 3601 3602 void Qsub8(Condition cond, Register rd, Register rn, Register rm) { 3603 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3604 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3605 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3606 VIXL_ASSERT(allow_macro_instructions_); 3607 VIXL_ASSERT(OutsideITBlock()); 3608 MacroEmissionCheckScope guard(this); 3609 #ifndef PANDA_BUILD 3610 ITScope it_scope(this, &cond, guard); 3611 #else 3612 ITScope it_scope(allocator_, this, &cond, guard); 3613 #endif 3614 qsub8(cond, rd, rn, rm); 3615 } 3616 void Qsub8(Register rd, Register rn, Register rm) { Qsub8(al, rd, rn, rm); } 3617 3618 void Rbit(Condition cond, Register rd, Register rm) { 3619 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3620 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3621 VIXL_ASSERT(allow_macro_instructions_); 3622 VIXL_ASSERT(OutsideITBlock()); 3623 MacroEmissionCheckScope guard(this); 3624 #ifndef PANDA_BUILD 3625 ITScope it_scope(this, &cond, guard); 3626 #else 3627 ITScope it_scope(allocator_, this, &cond, guard); 3628 #endif 3629 rbit(cond, rd, rm); 3630 } 3631 void Rbit(Register rd, Register rm) { Rbit(al, rd, rm); } 3632 3633 void Rev(Condition cond, Register rd, Register rm) { 3634 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3635 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3636 VIXL_ASSERT(allow_macro_instructions_); 3637 VIXL_ASSERT(OutsideITBlock()); 3638 MacroEmissionCheckScope guard(this); 3639 #ifndef PANDA_BUILD 3640 ITScope it_scope(this, &cond, guard); 3641 #else 3642 ITScope it_scope(allocator_, this, &cond, guard); 3643 #endif 3644 rev(cond, rd, rm); 3645 } 3646 void Rev(Register rd, Register rm) { Rev(al, rd, rm); } 3647 3648 void Rev16(Condition cond, Register rd, Register rm) { 3649 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3650 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3651 VIXL_ASSERT(allow_macro_instructions_); 3652 VIXL_ASSERT(OutsideITBlock()); 3653 MacroEmissionCheckScope guard(this); 3654 #ifndef PANDA_BUILD 3655 ITScope it_scope(this, &cond, guard); 3656 #else 3657 ITScope it_scope(allocator_, this, &cond, guard); 3658 #endif 3659 rev16(cond, rd, rm); 3660 } 3661 void Rev16(Register rd, Register rm) { Rev16(al, rd, rm); } 3662 3663 void Revsh(Condition cond, Register rd, Register rm) { 3664 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3665 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3666 VIXL_ASSERT(allow_macro_instructions_); 3667 VIXL_ASSERT(OutsideITBlock()); 3668 MacroEmissionCheckScope guard(this); 3669 #ifndef PANDA_BUILD 3670 ITScope it_scope(this, &cond, guard); 3671 #else 3672 ITScope it_scope(allocator_, this, &cond, guard); 3673 #endif 3674 revsh(cond, rd, rm); 3675 } 3676 void Revsh(Register rd, Register rm) { Revsh(al, rd, rm); } 3677 3678 void Ror(Condition cond, Register rd, Register rm, const Operand& operand) { 3679 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3680 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3681 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3682 VIXL_ASSERT(allow_macro_instructions_); 3683 VIXL_ASSERT(OutsideITBlock()); 3684 MacroEmissionCheckScope guard(this); 3685 bool can_use_it = 3686 // ROR<c>{<q>} {<Rdm>,} <Rdm>, <Rs> ; T1 3687 operand.IsPlainRegister() && rd.Is(rm) && rd.IsLow() && 3688 operand.GetBaseRegister().IsLow(); 3689 #ifndef PANDA_BUILD 3690 ITScope it_scope(this, &cond, guard, can_use_it); 3691 #else 3692 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 3693 #endif 3694 ror(cond, rd, rm, operand); 3695 } 3696 void Ror(Register rd, Register rm, const Operand& operand) { 3697 Ror(al, rd, rm, operand); 3698 } 3699 void Ror(FlagsUpdate flags, 3700 Condition cond, 3701 Register rd, 3702 Register rm, 3703 const Operand& operand) { 3704 switch (flags) { 3705 case LeaveFlags: 3706 Ror(cond, rd, rm, operand); 3707 break; 3708 case SetFlags: 3709 Rors(cond, rd, rm, operand); 3710 break; 3711 case DontCare: 3712 bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 3713 rm.IsLow() && operand.IsPlainRegister() && 3714 rd.Is(rm); 3715 if (setflags_is_smaller) { 3716 Rors(cond, rd, rm, operand); 3717 } else { 3718 Ror(cond, rd, rm, operand); 3719 } 3720 break; 3721 } 3722 } 3723 void Ror(FlagsUpdate flags, 3724 Register rd, 3725 Register rm, 3726 const Operand& operand) { 3727 Ror(flags, al, rd, rm, operand); 3728 } 3729 3730 void Rors(Condition cond, Register rd, Register rm, const Operand& operand) { 3731 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3732 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3733 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3734 VIXL_ASSERT(allow_macro_instructions_); 3735 VIXL_ASSERT(OutsideITBlock()); 3736 MacroEmissionCheckScope guard(this); 3737 #ifndef PANDA_BUILD 3738 ITScope it_scope(this, &cond, guard); 3739 #else 3740 ITScope it_scope(allocator_, this, &cond, guard); 3741 #endif 3742 rors(cond, rd, rm, operand); 3743 } 3744 void Rors(Register rd, Register rm, const Operand& operand) { 3745 Rors(al, rd, rm, operand); 3746 } 3747 3748 void Rrx(Condition cond, Register rd, Register rm) { 3749 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3750 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3751 VIXL_ASSERT(allow_macro_instructions_); 3752 VIXL_ASSERT(OutsideITBlock()); 3753 MacroEmissionCheckScope guard(this); 3754 #ifndef PANDA_BUILD 3755 ITScope it_scope(this, &cond, guard); 3756 #else 3757 ITScope it_scope(allocator_, this, &cond, guard); 3758 #endif 3759 rrx(cond, rd, rm); 3760 } 3761 void Rrx(Register rd, Register rm) { Rrx(al, rd, rm); } 3762 void Rrx(FlagsUpdate flags, Condition cond, Register rd, Register rm) { 3763 switch (flags) { 3764 case LeaveFlags: 3765 Rrx(cond, rd, rm); 3766 break; 3767 case SetFlags: 3768 Rrxs(cond, rd, rm); 3769 break; 3770 case DontCare: 3771 Rrx(cond, rd, rm); 3772 break; 3773 } 3774 } 3775 void Rrx(FlagsUpdate flags, Register rd, Register rm) { 3776 Rrx(flags, al, rd, rm); 3777 } 3778 3779 void Rrxs(Condition cond, Register rd, Register rm) { 3780 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3781 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3782 VIXL_ASSERT(allow_macro_instructions_); 3783 VIXL_ASSERT(OutsideITBlock()); 3784 MacroEmissionCheckScope guard(this); 3785 #ifndef PANDA_BUILD 3786 ITScope it_scope(this, &cond, guard); 3787 #else 3788 ITScope it_scope(allocator_, this, &cond, guard); 3789 #endif 3790 rrxs(cond, rd, rm); 3791 } 3792 void Rrxs(Register rd, Register rm) { Rrxs(al, rd, rm); } 3793 3794 void Rsb(Condition cond, Register rd, Register rn, const Operand& operand) { 3795 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3796 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3797 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3798 VIXL_ASSERT(allow_macro_instructions_); 3799 VIXL_ASSERT(OutsideITBlock()); 3800 MacroEmissionCheckScope guard(this); 3801 bool can_use_it = 3802 // RSB<c>{<q>} {<Rd>, }<Rn>, #0 ; T1 3803 operand.IsImmediate() && rd.IsLow() && rn.IsLow() && 3804 (operand.GetImmediate() == 0); 3805 #ifndef PANDA_BUILD 3806 ITScope it_scope(this, &cond, guard, can_use_it); 3807 #else 3808 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 3809 #endif 3810 rsb(cond, rd, rn, operand); 3811 } 3812 void Rsb(Register rd, Register rn, const Operand& operand) { 3813 Rsb(al, rd, rn, operand); 3814 } 3815 void Rsb(FlagsUpdate flags, 3816 Condition cond, 3817 Register rd, 3818 Register rn, 3819 const Operand& operand) { 3820 switch (flags) { 3821 case LeaveFlags: 3822 Rsb(cond, rd, rn, operand); 3823 break; 3824 case SetFlags: 3825 Rsbs(cond, rd, rn, operand); 3826 break; 3827 case DontCare: 3828 bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 3829 rn.IsLow() && operand.IsImmediate() && 3830 (operand.GetImmediate() == 0); 3831 if (setflags_is_smaller) { 3832 Rsbs(cond, rd, rn, operand); 3833 } else { 3834 Rsb(cond, rd, rn, operand); 3835 } 3836 break; 3837 } 3838 } 3839 void Rsb(FlagsUpdate flags, 3840 Register rd, 3841 Register rn, 3842 const Operand& operand) { 3843 Rsb(flags, al, rd, rn, operand); 3844 } 3845 3846 void Rsbs(Condition cond, Register rd, Register rn, const Operand& operand) { 3847 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3848 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3849 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3850 VIXL_ASSERT(allow_macro_instructions_); 3851 VIXL_ASSERT(OutsideITBlock()); 3852 MacroEmissionCheckScope guard(this); 3853 #ifndef PANDA_BUILD 3854 ITScope it_scope(this, &cond, guard); 3855 #else 3856 ITScope it_scope(allocator_, this, &cond, guard); 3857 #endif 3858 rsbs(cond, rd, rn, operand); 3859 } 3860 void Rsbs(Register rd, Register rn, const Operand& operand) { 3861 Rsbs(al, rd, rn, operand); 3862 } 3863 3864 void Rsc(Condition cond, Register rd, Register rn, const Operand& operand) { 3865 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3866 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3867 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3868 VIXL_ASSERT(allow_macro_instructions_); 3869 VIXL_ASSERT(OutsideITBlock()); 3870 MacroEmissionCheckScope guard(this); 3871 #ifndef PANDA_BUILD 3872 ITScope it_scope(this, &cond, guard); 3873 #else 3874 ITScope it_scope(allocator_, this, &cond, guard); 3875 #endif 3876 rsc(cond, rd, rn, operand); 3877 } 3878 void Rsc(Register rd, Register rn, const Operand& operand) { 3879 Rsc(al, rd, rn, operand); 3880 } 3881 void Rsc(FlagsUpdate flags, 3882 Condition cond, 3883 Register rd, 3884 Register rn, 3885 const Operand& operand) { 3886 switch (flags) { 3887 case LeaveFlags: 3888 Rsc(cond, rd, rn, operand); 3889 break; 3890 case SetFlags: 3891 Rscs(cond, rd, rn, operand); 3892 break; 3893 case DontCare: 3894 Rsc(cond, rd, rn, operand); 3895 break; 3896 } 3897 } 3898 void Rsc(FlagsUpdate flags, 3899 Register rd, 3900 Register rn, 3901 const Operand& operand) { 3902 Rsc(flags, al, rd, rn, operand); 3903 } 3904 3905 void Rscs(Condition cond, Register rd, Register rn, const Operand& operand) { 3906 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3907 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3908 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3909 VIXL_ASSERT(allow_macro_instructions_); 3910 VIXL_ASSERT(OutsideITBlock()); 3911 MacroEmissionCheckScope guard(this); 3912 #ifndef PANDA_BUILD 3913 ITScope it_scope(this, &cond, guard); 3914 #else 3915 ITScope it_scope(allocator_, this, &cond, guard); 3916 #endif 3917 rscs(cond, rd, rn, operand); 3918 } 3919 void Rscs(Register rd, Register rn, const Operand& operand) { 3920 Rscs(al, rd, rn, operand); 3921 } 3922 3923 void Sadd16(Condition cond, Register rd, Register rn, Register rm) { 3924 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3925 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3926 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3927 VIXL_ASSERT(allow_macro_instructions_); 3928 VIXL_ASSERT(OutsideITBlock()); 3929 MacroEmissionCheckScope guard(this); 3930 #ifndef PANDA_BUILD 3931 ITScope it_scope(this, &cond, guard); 3932 #else 3933 ITScope it_scope(allocator_, this, &cond, guard); 3934 #endif 3935 sadd16(cond, rd, rn, rm); 3936 } 3937 void Sadd16(Register rd, Register rn, Register rm) { Sadd16(al, rd, rn, rm); } 3938 3939 void Sadd8(Condition cond, Register rd, Register rn, Register rm) { 3940 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3941 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3942 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3943 VIXL_ASSERT(allow_macro_instructions_); 3944 VIXL_ASSERT(OutsideITBlock()); 3945 MacroEmissionCheckScope guard(this); 3946 #ifndef PANDA_BUILD 3947 ITScope it_scope(this, &cond, guard); 3948 #else 3949 ITScope it_scope(allocator_, this, &cond, guard); 3950 #endif 3951 sadd8(cond, rd, rn, rm); 3952 } 3953 void Sadd8(Register rd, Register rn, Register rm) { Sadd8(al, rd, rn, rm); } 3954 3955 void Sasx(Condition cond, Register rd, Register rn, Register rm) { 3956 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3957 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3958 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 3959 VIXL_ASSERT(allow_macro_instructions_); 3960 VIXL_ASSERT(OutsideITBlock()); 3961 MacroEmissionCheckScope guard(this); 3962 #ifndef PANDA_BUILD 3963 ITScope it_scope(this, &cond, guard); 3964 #else 3965 ITScope it_scope(allocator_, this, &cond, guard); 3966 #endif 3967 sasx(cond, rd, rn, rm); 3968 } 3969 void Sasx(Register rd, Register rn, Register rm) { Sasx(al, rd, rn, rm); } 3970 3971 void Sbc(Condition cond, Register rd, Register rn, const Operand& operand) { 3972 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 3973 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 3974 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 3975 VIXL_ASSERT(allow_macro_instructions_); 3976 VIXL_ASSERT(OutsideITBlock()); 3977 MacroEmissionCheckScope guard(this); 3978 bool can_use_it = 3979 // SBC<c>{<q>} {<Rdn>,} <Rdn>, <Rm> ; T1 3980 operand.IsPlainRegister() && rn.IsLow() && rd.Is(rn) && 3981 operand.GetBaseRegister().IsLow(); 3982 #ifndef PANDA_BUILD 3983 ITScope it_scope(this, &cond, guard, can_use_it); 3984 #else 3985 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 3986 #endif 3987 sbc(cond, rd, rn, operand); 3988 } 3989 void Sbc(Register rd, Register rn, const Operand& operand) { 3990 Sbc(al, rd, rn, operand); 3991 } 3992 void Sbc(FlagsUpdate flags, 3993 Condition cond, 3994 Register rd, 3995 Register rn, 3996 const Operand& operand) { 3997 switch (flags) { 3998 case LeaveFlags: 3999 Sbc(cond, rd, rn, operand); 4000 break; 4001 case SetFlags: 4002 Sbcs(cond, rd, rn, operand); 4003 break; 4004 case DontCare: 4005 bool setflags_is_smaller = IsUsingT32() && cond.Is(al) && rd.IsLow() && 4006 rn.Is(rd) && operand.IsPlainRegister() && 4007 operand.GetBaseRegister().IsLow(); 4008 if (setflags_is_smaller) { 4009 Sbcs(cond, rd, rn, operand); 4010 } else { 4011 Sbc(cond, rd, rn, operand); 4012 } 4013 break; 4014 } 4015 } 4016 void Sbc(FlagsUpdate flags, 4017 Register rd, 4018 Register rn, 4019 const Operand& operand) { 4020 Sbc(flags, al, rd, rn, operand); 4021 } 4022 4023 void Sbcs(Condition cond, Register rd, Register rn, const Operand& operand) { 4024 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4025 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4026 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 4027 VIXL_ASSERT(allow_macro_instructions_); 4028 VIXL_ASSERT(OutsideITBlock()); 4029 MacroEmissionCheckScope guard(this); 4030 #ifndef PANDA_BUILD 4031 ITScope it_scope(this, &cond, guard); 4032 #else 4033 ITScope it_scope(allocator_, this, &cond, guard); 4034 #endif 4035 sbcs(cond, rd, rn, operand); 4036 } 4037 void Sbcs(Register rd, Register rn, const Operand& operand) { 4038 Sbcs(al, rd, rn, operand); 4039 } 4040 4041 void Sbfx( 4042 Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { 4043 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4044 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4045 VIXL_ASSERT(allow_macro_instructions_); 4046 VIXL_ASSERT(OutsideITBlock()); 4047 MacroEmissionCheckScope guard(this); 4048 #ifndef PANDA_BUILD 4049 ITScope it_scope(this, &cond, guard); 4050 #else 4051 ITScope it_scope(allocator_, this, &cond, guard); 4052 #endif 4053 sbfx(cond, rd, rn, lsb, width); 4054 } 4055 void Sbfx(Register rd, Register rn, uint32_t lsb, uint32_t width) { 4056 Sbfx(al, rd, rn, lsb, width); 4057 } 4058 4059 void Sdiv(Condition cond, Register rd, Register rn, Register rm) { 4060 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4061 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4062 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4063 VIXL_ASSERT(allow_macro_instructions_); 4064 VIXL_ASSERT(OutsideITBlock()); 4065 MacroEmissionCheckScope guard(this); 4066 #ifndef PANDA_BUILD 4067 ITScope it_scope(this, &cond, guard); 4068 #else 4069 ITScope it_scope(allocator_, this, &cond, guard); 4070 #endif 4071 sdiv(cond, rd, rn, rm); 4072 } 4073 void Sdiv(Register rd, Register rn, Register rm) { Sdiv(al, rd, rn, rm); } 4074 4075 void Sel(Condition cond, Register rd, Register rn, Register rm) { 4076 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4077 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4078 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4079 VIXL_ASSERT(allow_macro_instructions_); 4080 VIXL_ASSERT(OutsideITBlock()); 4081 MacroEmissionCheckScope guard(this); 4082 #ifndef PANDA_BUILD 4083 ITScope it_scope(this, &cond, guard); 4084 #else 4085 ITScope it_scope(allocator_, this, &cond, guard); 4086 #endif 4087 sel(cond, rd, rn, rm); 4088 } 4089 void Sel(Register rd, Register rn, Register rm) { Sel(al, rd, rn, rm); } 4090 4091 void Shadd16(Condition cond, Register rd, Register rn, Register rm) { 4092 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4093 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4094 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4095 VIXL_ASSERT(allow_macro_instructions_); 4096 VIXL_ASSERT(OutsideITBlock()); 4097 MacroEmissionCheckScope guard(this); 4098 #ifndef PANDA_BUILD 4099 ITScope it_scope(this, &cond, guard); 4100 #else 4101 ITScope it_scope(allocator_, this, &cond, guard); 4102 #endif 4103 shadd16(cond, rd, rn, rm); 4104 } 4105 void Shadd16(Register rd, Register rn, Register rm) { 4106 Shadd16(al, rd, rn, rm); 4107 } 4108 4109 void Shadd8(Condition cond, Register rd, Register rn, Register rm) { 4110 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4111 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4112 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4113 VIXL_ASSERT(allow_macro_instructions_); 4114 VIXL_ASSERT(OutsideITBlock()); 4115 MacroEmissionCheckScope guard(this); 4116 #ifndef PANDA_BUILD 4117 ITScope it_scope(this, &cond, guard); 4118 #else 4119 ITScope it_scope(allocator_, this, &cond, guard); 4120 #endif 4121 shadd8(cond, rd, rn, rm); 4122 } 4123 void Shadd8(Register rd, Register rn, Register rm) { Shadd8(al, rd, rn, rm); } 4124 4125 void Shasx(Condition cond, Register rd, Register rn, Register rm) { 4126 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4127 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4128 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4129 VIXL_ASSERT(allow_macro_instructions_); 4130 VIXL_ASSERT(OutsideITBlock()); 4131 MacroEmissionCheckScope guard(this); 4132 #ifndef PANDA_BUILD 4133 ITScope it_scope(this, &cond, guard); 4134 #else 4135 ITScope it_scope(allocator_, this, &cond, guard); 4136 #endif 4137 shasx(cond, rd, rn, rm); 4138 } 4139 void Shasx(Register rd, Register rn, Register rm) { Shasx(al, rd, rn, rm); } 4140 4141 void Shsax(Condition cond, Register rd, Register rn, Register rm) { 4142 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4143 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4144 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4145 VIXL_ASSERT(allow_macro_instructions_); 4146 VIXL_ASSERT(OutsideITBlock()); 4147 MacroEmissionCheckScope guard(this); 4148 #ifndef PANDA_BUILD 4149 ITScope it_scope(this, &cond, guard); 4150 #else 4151 ITScope it_scope(allocator_, this, &cond, guard); 4152 #endif 4153 shsax(cond, rd, rn, rm); 4154 } 4155 void Shsax(Register rd, Register rn, Register rm) { Shsax(al, rd, rn, rm); } 4156 4157 void Shsub16(Condition cond, Register rd, Register rn, Register rm) { 4158 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4159 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4160 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4161 VIXL_ASSERT(allow_macro_instructions_); 4162 VIXL_ASSERT(OutsideITBlock()); 4163 MacroEmissionCheckScope guard(this); 4164 #ifndef PANDA_BUILD 4165 ITScope it_scope(this, &cond, guard); 4166 #else 4167 ITScope it_scope(allocator_, this, &cond, guard); 4168 #endif 4169 shsub16(cond, rd, rn, rm); 4170 } 4171 void Shsub16(Register rd, Register rn, Register rm) { 4172 Shsub16(al, rd, rn, rm); 4173 } 4174 4175 void Shsub8(Condition cond, Register rd, Register rn, Register rm) { 4176 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4177 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4178 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4179 VIXL_ASSERT(allow_macro_instructions_); 4180 VIXL_ASSERT(OutsideITBlock()); 4181 MacroEmissionCheckScope guard(this); 4182 #ifndef PANDA_BUILD 4183 ITScope it_scope(this, &cond, guard); 4184 #else 4185 ITScope it_scope(allocator_, this, &cond, guard); 4186 #endif 4187 shsub8(cond, rd, rn, rm); 4188 } 4189 void Shsub8(Register rd, Register rn, Register rm) { Shsub8(al, rd, rn, rm); } 4190 4191 void Smlabb( 4192 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4193 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4194 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4195 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4196 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4197 VIXL_ASSERT(allow_macro_instructions_); 4198 VIXL_ASSERT(OutsideITBlock()); 4199 MacroEmissionCheckScope guard(this); 4200 #ifndef PANDA_BUILD 4201 ITScope it_scope(this, &cond, guard); 4202 #else 4203 ITScope it_scope(allocator_, this, &cond, guard); 4204 #endif 4205 smlabb(cond, rd, rn, rm, ra); 4206 } 4207 void Smlabb(Register rd, Register rn, Register rm, Register ra) { 4208 Smlabb(al, rd, rn, rm, ra); 4209 } 4210 4211 void Smlabt( 4212 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4213 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4214 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4215 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4216 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4217 VIXL_ASSERT(allow_macro_instructions_); 4218 VIXL_ASSERT(OutsideITBlock()); 4219 MacroEmissionCheckScope guard(this); 4220 #ifndef PANDA_BUILD 4221 ITScope it_scope(this, &cond, guard); 4222 #else 4223 ITScope it_scope(allocator_, this, &cond, guard); 4224 #endif 4225 smlabt(cond, rd, rn, rm, ra); 4226 } 4227 void Smlabt(Register rd, Register rn, Register rm, Register ra) { 4228 Smlabt(al, rd, rn, rm, ra); 4229 } 4230 4231 void Smlad( 4232 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4233 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4234 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4235 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4236 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4237 VIXL_ASSERT(allow_macro_instructions_); 4238 VIXL_ASSERT(OutsideITBlock()); 4239 MacroEmissionCheckScope guard(this); 4240 #ifndef PANDA_BUILD 4241 ITScope it_scope(this, &cond, guard); 4242 #else 4243 ITScope it_scope(allocator_, this, &cond, guard); 4244 #endif 4245 smlad(cond, rd, rn, rm, ra); 4246 } 4247 void Smlad(Register rd, Register rn, Register rm, Register ra) { 4248 Smlad(al, rd, rn, rm, ra); 4249 } 4250 4251 void Smladx( 4252 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4253 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4254 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4255 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4256 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4257 VIXL_ASSERT(allow_macro_instructions_); 4258 VIXL_ASSERT(OutsideITBlock()); 4259 MacroEmissionCheckScope guard(this); 4260 #ifndef PANDA_BUILD 4261 ITScope it_scope(this, &cond, guard); 4262 #else 4263 ITScope it_scope(allocator_, this, &cond, guard); 4264 #endif 4265 smladx(cond, rd, rn, rm, ra); 4266 } 4267 void Smladx(Register rd, Register rn, Register rm, Register ra) { 4268 Smladx(al, rd, rn, rm, ra); 4269 } 4270 4271 void Smlal( 4272 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4273 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4274 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4275 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4276 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4277 VIXL_ASSERT(allow_macro_instructions_); 4278 VIXL_ASSERT(OutsideITBlock()); 4279 MacroEmissionCheckScope guard(this); 4280 #ifndef PANDA_BUILD 4281 ITScope it_scope(this, &cond, guard); 4282 #else 4283 ITScope it_scope(allocator_, this, &cond, guard); 4284 #endif 4285 smlal(cond, rdlo, rdhi, rn, rm); 4286 } 4287 void Smlal(Register rdlo, Register rdhi, Register rn, Register rm) { 4288 Smlal(al, rdlo, rdhi, rn, rm); 4289 } 4290 4291 void Smlalbb( 4292 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4293 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4294 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4295 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4296 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4297 VIXL_ASSERT(allow_macro_instructions_); 4298 VIXL_ASSERT(OutsideITBlock()); 4299 MacroEmissionCheckScope guard(this); 4300 #ifndef PANDA_BUILD 4301 ITScope it_scope(this, &cond, guard); 4302 #else 4303 ITScope it_scope(allocator_, this, &cond, guard); 4304 #endif 4305 smlalbb(cond, rdlo, rdhi, rn, rm); 4306 } 4307 void Smlalbb(Register rdlo, Register rdhi, Register rn, Register rm) { 4308 Smlalbb(al, rdlo, rdhi, rn, rm); 4309 } 4310 4311 void Smlalbt( 4312 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4313 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4314 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4315 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4316 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4317 VIXL_ASSERT(allow_macro_instructions_); 4318 VIXL_ASSERT(OutsideITBlock()); 4319 MacroEmissionCheckScope guard(this); 4320 #ifndef PANDA_BUILD 4321 ITScope it_scope(this, &cond, guard); 4322 #else 4323 ITScope it_scope(allocator_, this, &cond, guard); 4324 #endif 4325 smlalbt(cond, rdlo, rdhi, rn, rm); 4326 } 4327 void Smlalbt(Register rdlo, Register rdhi, Register rn, Register rm) { 4328 Smlalbt(al, rdlo, rdhi, rn, rm); 4329 } 4330 4331 void Smlald( 4332 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4333 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4334 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4335 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4336 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4337 VIXL_ASSERT(allow_macro_instructions_); 4338 VIXL_ASSERT(OutsideITBlock()); 4339 MacroEmissionCheckScope guard(this); 4340 #ifndef PANDA_BUILD 4341 ITScope it_scope(this, &cond, guard); 4342 #else 4343 ITScope it_scope(allocator_, this, &cond, guard); 4344 #endif 4345 smlald(cond, rdlo, rdhi, rn, rm); 4346 } 4347 void Smlald(Register rdlo, Register rdhi, Register rn, Register rm) { 4348 Smlald(al, rdlo, rdhi, rn, rm); 4349 } 4350 4351 void Smlaldx( 4352 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4353 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4354 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4355 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4356 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4357 VIXL_ASSERT(allow_macro_instructions_); 4358 VIXL_ASSERT(OutsideITBlock()); 4359 MacroEmissionCheckScope guard(this); 4360 #ifndef PANDA_BUILD 4361 ITScope it_scope(this, &cond, guard); 4362 #else 4363 ITScope it_scope(allocator_, this, &cond, guard); 4364 #endif 4365 smlaldx(cond, rdlo, rdhi, rn, rm); 4366 } 4367 void Smlaldx(Register rdlo, Register rdhi, Register rn, Register rm) { 4368 Smlaldx(al, rdlo, rdhi, rn, rm); 4369 } 4370 4371 void Smlals( 4372 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4373 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4374 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4375 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4376 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4377 VIXL_ASSERT(allow_macro_instructions_); 4378 VIXL_ASSERT(OutsideITBlock()); 4379 MacroEmissionCheckScope guard(this); 4380 #ifndef PANDA_BUILD 4381 ITScope it_scope(this, &cond, guard); 4382 #else 4383 ITScope it_scope(allocator_, this, &cond, guard); 4384 #endif 4385 smlals(cond, rdlo, rdhi, rn, rm); 4386 } 4387 void Smlals(Register rdlo, Register rdhi, Register rn, Register rm) { 4388 Smlals(al, rdlo, rdhi, rn, rm); 4389 } 4390 4391 void Smlaltb( 4392 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4393 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4394 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4395 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4396 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4397 VIXL_ASSERT(allow_macro_instructions_); 4398 VIXL_ASSERT(OutsideITBlock()); 4399 MacroEmissionCheckScope guard(this); 4400 #ifndef PANDA_BUILD 4401 ITScope it_scope(this, &cond, guard); 4402 #else 4403 ITScope it_scope(allocator_, this, &cond, guard); 4404 #endif 4405 smlaltb(cond, rdlo, rdhi, rn, rm); 4406 } 4407 void Smlaltb(Register rdlo, Register rdhi, Register rn, Register rm) { 4408 Smlaltb(al, rdlo, rdhi, rn, rm); 4409 } 4410 4411 void Smlaltt( 4412 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4413 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4414 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4415 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4416 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4417 VIXL_ASSERT(allow_macro_instructions_); 4418 VIXL_ASSERT(OutsideITBlock()); 4419 MacroEmissionCheckScope guard(this); 4420 #ifndef PANDA_BUILD 4421 ITScope it_scope(this, &cond, guard); 4422 #else 4423 ITScope it_scope(allocator_, this, &cond, guard); 4424 #endif 4425 smlaltt(cond, rdlo, rdhi, rn, rm); 4426 } 4427 void Smlaltt(Register rdlo, Register rdhi, Register rn, Register rm) { 4428 Smlaltt(al, rdlo, rdhi, rn, rm); 4429 } 4430 4431 void Smlatb( 4432 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4433 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4434 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4435 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4436 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4437 VIXL_ASSERT(allow_macro_instructions_); 4438 VIXL_ASSERT(OutsideITBlock()); 4439 MacroEmissionCheckScope guard(this); 4440 #ifndef PANDA_BUILD 4441 ITScope it_scope(this, &cond, guard); 4442 #else 4443 ITScope it_scope(allocator_, this, &cond, guard); 4444 #endif 4445 smlatb(cond, rd, rn, rm, ra); 4446 } 4447 void Smlatb(Register rd, Register rn, Register rm, Register ra) { 4448 Smlatb(al, rd, rn, rm, ra); 4449 } 4450 4451 void Smlatt( 4452 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4453 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4454 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4455 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4456 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4457 VIXL_ASSERT(allow_macro_instructions_); 4458 VIXL_ASSERT(OutsideITBlock()); 4459 MacroEmissionCheckScope guard(this); 4460 #ifndef PANDA_BUILD 4461 ITScope it_scope(this, &cond, guard); 4462 #else 4463 ITScope it_scope(allocator_, this, &cond, guard); 4464 #endif 4465 smlatt(cond, rd, rn, rm, ra); 4466 } 4467 void Smlatt(Register rd, Register rn, Register rm, Register ra) { 4468 Smlatt(al, rd, rn, rm, ra); 4469 } 4470 4471 void Smlawb( 4472 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4473 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4474 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4475 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4476 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4477 VIXL_ASSERT(allow_macro_instructions_); 4478 VIXL_ASSERT(OutsideITBlock()); 4479 MacroEmissionCheckScope guard(this); 4480 #ifndef PANDA_BUILD 4481 ITScope it_scope(this, &cond, guard); 4482 #else 4483 ITScope it_scope(allocator_, this, &cond, guard); 4484 #endif 4485 smlawb(cond, rd, rn, rm, ra); 4486 } 4487 void Smlawb(Register rd, Register rn, Register rm, Register ra) { 4488 Smlawb(al, rd, rn, rm, ra); 4489 } 4490 4491 void Smlawt( 4492 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4493 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4494 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4495 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4496 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4497 VIXL_ASSERT(allow_macro_instructions_); 4498 VIXL_ASSERT(OutsideITBlock()); 4499 MacroEmissionCheckScope guard(this); 4500 #ifndef PANDA_BUILD 4501 ITScope it_scope(this, &cond, guard); 4502 #else 4503 ITScope it_scope(allocator_, this, &cond, guard); 4504 #endif 4505 smlawt(cond, rd, rn, rm, ra); 4506 } 4507 void Smlawt(Register rd, Register rn, Register rm, Register ra) { 4508 Smlawt(al, rd, rn, rm, ra); 4509 } 4510 4511 void Smlsd( 4512 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4513 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4514 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4515 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4516 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4517 VIXL_ASSERT(allow_macro_instructions_); 4518 VIXL_ASSERT(OutsideITBlock()); 4519 MacroEmissionCheckScope guard(this); 4520 #ifndef PANDA_BUILD 4521 ITScope it_scope(this, &cond, guard); 4522 #else 4523 ITScope it_scope(allocator_, this, &cond, guard); 4524 #endif 4525 smlsd(cond, rd, rn, rm, ra); 4526 } 4527 void Smlsd(Register rd, Register rn, Register rm, Register ra) { 4528 Smlsd(al, rd, rn, rm, ra); 4529 } 4530 4531 void Smlsdx( 4532 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4533 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4534 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4535 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4536 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4537 VIXL_ASSERT(allow_macro_instructions_); 4538 VIXL_ASSERT(OutsideITBlock()); 4539 MacroEmissionCheckScope guard(this); 4540 #ifndef PANDA_BUILD 4541 ITScope it_scope(this, &cond, guard); 4542 #else 4543 ITScope it_scope(allocator_, this, &cond, guard); 4544 #endif 4545 smlsdx(cond, rd, rn, rm, ra); 4546 } 4547 void Smlsdx(Register rd, Register rn, Register rm, Register ra) { 4548 Smlsdx(al, rd, rn, rm, ra); 4549 } 4550 4551 void Smlsld( 4552 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4553 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4554 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4555 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4556 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4557 VIXL_ASSERT(allow_macro_instructions_); 4558 VIXL_ASSERT(OutsideITBlock()); 4559 MacroEmissionCheckScope guard(this); 4560 #ifndef PANDA_BUILD 4561 ITScope it_scope(this, &cond, guard); 4562 #else 4563 ITScope it_scope(allocator_, this, &cond, guard); 4564 #endif 4565 smlsld(cond, rdlo, rdhi, rn, rm); 4566 } 4567 void Smlsld(Register rdlo, Register rdhi, Register rn, Register rm) { 4568 Smlsld(al, rdlo, rdhi, rn, rm); 4569 } 4570 4571 void Smlsldx( 4572 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4573 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4574 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4575 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4576 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4577 VIXL_ASSERT(allow_macro_instructions_); 4578 VIXL_ASSERT(OutsideITBlock()); 4579 MacroEmissionCheckScope guard(this); 4580 #ifndef PANDA_BUILD 4581 ITScope it_scope(this, &cond, guard); 4582 #else 4583 ITScope it_scope(allocator_, this, &cond, guard); 4584 #endif 4585 smlsldx(cond, rdlo, rdhi, rn, rm); 4586 } 4587 void Smlsldx(Register rdlo, Register rdhi, Register rn, Register rm) { 4588 Smlsldx(al, rdlo, rdhi, rn, rm); 4589 } 4590 4591 void Smmla( 4592 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4593 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4594 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4595 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4596 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4597 VIXL_ASSERT(allow_macro_instructions_); 4598 VIXL_ASSERT(OutsideITBlock()); 4599 MacroEmissionCheckScope guard(this); 4600 #ifndef PANDA_BUILD 4601 ITScope it_scope(this, &cond, guard); 4602 #else 4603 ITScope it_scope(allocator_, this, &cond, guard); 4604 #endif 4605 smmla(cond, rd, rn, rm, ra); 4606 } 4607 void Smmla(Register rd, Register rn, Register rm, Register ra) { 4608 Smmla(al, rd, rn, rm, ra); 4609 } 4610 4611 void Smmlar( 4612 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4613 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4614 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4615 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4616 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4617 VIXL_ASSERT(allow_macro_instructions_); 4618 VIXL_ASSERT(OutsideITBlock()); 4619 MacroEmissionCheckScope guard(this); 4620 #ifndef PANDA_BUILD 4621 ITScope it_scope(this, &cond, guard); 4622 #else 4623 ITScope it_scope(allocator_, this, &cond, guard); 4624 #endif 4625 smmlar(cond, rd, rn, rm, ra); 4626 } 4627 void Smmlar(Register rd, Register rn, Register rm, Register ra) { 4628 Smmlar(al, rd, rn, rm, ra); 4629 } 4630 4631 void Smmls( 4632 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4633 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4634 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4635 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4636 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4637 VIXL_ASSERT(allow_macro_instructions_); 4638 VIXL_ASSERT(OutsideITBlock()); 4639 MacroEmissionCheckScope guard(this); 4640 #ifndef PANDA_BUILD 4641 ITScope it_scope(this, &cond, guard); 4642 #else 4643 ITScope it_scope(allocator_, this, &cond, guard); 4644 #endif 4645 smmls(cond, rd, rn, rm, ra); 4646 } 4647 void Smmls(Register rd, Register rn, Register rm, Register ra) { 4648 Smmls(al, rd, rn, rm, ra); 4649 } 4650 4651 void Smmlsr( 4652 Condition cond, Register rd, Register rn, Register rm, Register ra) { 4653 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4654 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4655 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4656 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 4657 VIXL_ASSERT(allow_macro_instructions_); 4658 VIXL_ASSERT(OutsideITBlock()); 4659 MacroEmissionCheckScope guard(this); 4660 #ifndef PANDA_BUILD 4661 ITScope it_scope(this, &cond, guard); 4662 #else 4663 ITScope it_scope(allocator_, this, &cond, guard); 4664 #endif 4665 smmlsr(cond, rd, rn, rm, ra); 4666 } 4667 void Smmlsr(Register rd, Register rn, Register rm, Register ra) { 4668 Smmlsr(al, rd, rn, rm, ra); 4669 } 4670 4671 void Smmul(Condition cond, Register rd, Register rn, Register rm) { 4672 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4673 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4674 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4675 VIXL_ASSERT(allow_macro_instructions_); 4676 VIXL_ASSERT(OutsideITBlock()); 4677 MacroEmissionCheckScope guard(this); 4678 #ifndef PANDA_BUILD 4679 ITScope it_scope(this, &cond, guard); 4680 #else 4681 ITScope it_scope(allocator_, this, &cond, guard); 4682 #endif 4683 smmul(cond, rd, rn, rm); 4684 } 4685 void Smmul(Register rd, Register rn, Register rm) { Smmul(al, rd, rn, rm); } 4686 4687 void Smmulr(Condition cond, Register rd, Register rn, Register rm) { 4688 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4689 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4690 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4691 VIXL_ASSERT(allow_macro_instructions_); 4692 VIXL_ASSERT(OutsideITBlock()); 4693 MacroEmissionCheckScope guard(this); 4694 #ifndef PANDA_BUILD 4695 ITScope it_scope(this, &cond, guard); 4696 #else 4697 ITScope it_scope(allocator_, this, &cond, guard); 4698 #endif 4699 smmulr(cond, rd, rn, rm); 4700 } 4701 void Smmulr(Register rd, Register rn, Register rm) { Smmulr(al, rd, rn, rm); } 4702 4703 void Smuad(Condition cond, Register rd, Register rn, Register rm) { 4704 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4705 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4706 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4707 VIXL_ASSERT(allow_macro_instructions_); 4708 VIXL_ASSERT(OutsideITBlock()); 4709 MacroEmissionCheckScope guard(this); 4710 #ifndef PANDA_BUILD 4711 ITScope it_scope(this, &cond, guard); 4712 #else 4713 ITScope it_scope(allocator_, this, &cond, guard); 4714 #endif 4715 smuad(cond, rd, rn, rm); 4716 } 4717 void Smuad(Register rd, Register rn, Register rm) { Smuad(al, rd, rn, rm); } 4718 4719 void Smuadx(Condition cond, Register rd, Register rn, Register rm) { 4720 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4721 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4722 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4723 VIXL_ASSERT(allow_macro_instructions_); 4724 VIXL_ASSERT(OutsideITBlock()); 4725 MacroEmissionCheckScope guard(this); 4726 #ifndef PANDA_BUILD 4727 ITScope it_scope(this, &cond, guard); 4728 #else 4729 ITScope it_scope(allocator_, this, &cond, guard); 4730 #endif 4731 smuadx(cond, rd, rn, rm); 4732 } 4733 void Smuadx(Register rd, Register rn, Register rm) { Smuadx(al, rd, rn, rm); } 4734 4735 void Smulbb(Condition cond, Register rd, Register rn, Register rm) { 4736 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4737 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4738 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4739 VIXL_ASSERT(allow_macro_instructions_); 4740 VIXL_ASSERT(OutsideITBlock()); 4741 MacroEmissionCheckScope guard(this); 4742 #ifndef PANDA_BUILD 4743 ITScope it_scope(this, &cond, guard); 4744 #else 4745 ITScope it_scope(allocator_, this, &cond, guard); 4746 #endif 4747 smulbb(cond, rd, rn, rm); 4748 } 4749 void Smulbb(Register rd, Register rn, Register rm) { Smulbb(al, rd, rn, rm); } 4750 4751 void Smulbt(Condition cond, Register rd, Register rn, Register rm) { 4752 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4753 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4754 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4755 VIXL_ASSERT(allow_macro_instructions_); 4756 VIXL_ASSERT(OutsideITBlock()); 4757 MacroEmissionCheckScope guard(this); 4758 #ifndef PANDA_BUILD 4759 ITScope it_scope(this, &cond, guard); 4760 #else 4761 ITScope it_scope(allocator_, this, &cond, guard); 4762 #endif 4763 smulbt(cond, rd, rn, rm); 4764 } 4765 void Smulbt(Register rd, Register rn, Register rm) { Smulbt(al, rd, rn, rm); } 4766 4767 void Smull( 4768 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4769 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4770 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4771 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4772 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4773 VIXL_ASSERT(allow_macro_instructions_); 4774 VIXL_ASSERT(OutsideITBlock()); 4775 MacroEmissionCheckScope guard(this); 4776 #ifndef PANDA_BUILD 4777 ITScope it_scope(this, &cond, guard); 4778 #else 4779 ITScope it_scope(allocator_, this, &cond, guard); 4780 #endif 4781 smull(cond, rdlo, rdhi, rn, rm); 4782 } 4783 void Smull(Register rdlo, Register rdhi, Register rn, Register rm) { 4784 Smull(al, rdlo, rdhi, rn, rm); 4785 } 4786 void Smull(FlagsUpdate flags, 4787 Condition cond, 4788 Register rdlo, 4789 Register rdhi, 4790 Register rn, 4791 Register rm) { 4792 switch (flags) { 4793 case LeaveFlags: 4794 Smull(cond, rdlo, rdhi, rn, rm); 4795 break; 4796 case SetFlags: 4797 Smulls(cond, rdlo, rdhi, rn, rm); 4798 break; 4799 case DontCare: 4800 Smull(cond, rdlo, rdhi, rn, rm); 4801 break; 4802 } 4803 } 4804 void Smull(FlagsUpdate flags, 4805 Register rdlo, 4806 Register rdhi, 4807 Register rn, 4808 Register rm) { 4809 Smull(flags, al, rdlo, rdhi, rn, rm); 4810 } 4811 4812 void Smulls( 4813 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 4814 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 4815 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 4816 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4817 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4818 VIXL_ASSERT(allow_macro_instructions_); 4819 VIXL_ASSERT(OutsideITBlock()); 4820 MacroEmissionCheckScope guard(this); 4821 #ifndef PANDA_BUILD 4822 ITScope it_scope(this, &cond, guard); 4823 #else 4824 ITScope it_scope(allocator_, this, &cond, guard); 4825 #endif 4826 smulls(cond, rdlo, rdhi, rn, rm); 4827 } 4828 void Smulls(Register rdlo, Register rdhi, Register rn, Register rm) { 4829 Smulls(al, rdlo, rdhi, rn, rm); 4830 } 4831 4832 void Smultb(Condition cond, Register rd, Register rn, Register rm) { 4833 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4834 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4835 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4836 VIXL_ASSERT(allow_macro_instructions_); 4837 VIXL_ASSERT(OutsideITBlock()); 4838 MacroEmissionCheckScope guard(this); 4839 #ifndef PANDA_BUILD 4840 ITScope it_scope(this, &cond, guard); 4841 #else 4842 ITScope it_scope(allocator_, this, &cond, guard); 4843 #endif 4844 smultb(cond, rd, rn, rm); 4845 } 4846 void Smultb(Register rd, Register rn, Register rm) { Smultb(al, rd, rn, rm); } 4847 4848 void Smultt(Condition cond, Register rd, Register rn, Register rm) { 4849 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4850 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4851 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4852 VIXL_ASSERT(allow_macro_instructions_); 4853 VIXL_ASSERT(OutsideITBlock()); 4854 MacroEmissionCheckScope guard(this); 4855 #ifndef PANDA_BUILD 4856 ITScope it_scope(this, &cond, guard); 4857 #else 4858 ITScope it_scope(allocator_, this, &cond, guard); 4859 #endif 4860 smultt(cond, rd, rn, rm); 4861 } 4862 void Smultt(Register rd, Register rn, Register rm) { Smultt(al, rd, rn, rm); } 4863 4864 void Smulwb(Condition cond, Register rd, Register rn, Register rm) { 4865 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4866 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4867 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4868 VIXL_ASSERT(allow_macro_instructions_); 4869 VIXL_ASSERT(OutsideITBlock()); 4870 MacroEmissionCheckScope guard(this); 4871 #ifndef PANDA_BUILD 4872 ITScope it_scope(this, &cond, guard); 4873 #else 4874 ITScope it_scope(allocator_, this, &cond, guard); 4875 #endif 4876 smulwb(cond, rd, rn, rm); 4877 } 4878 void Smulwb(Register rd, Register rn, Register rm) { Smulwb(al, rd, rn, rm); } 4879 4880 void Smulwt(Condition cond, Register rd, Register rn, Register rm) { 4881 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4882 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4883 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4884 VIXL_ASSERT(allow_macro_instructions_); 4885 VIXL_ASSERT(OutsideITBlock()); 4886 MacroEmissionCheckScope guard(this); 4887 #ifndef PANDA_BUILD 4888 ITScope it_scope(this, &cond, guard); 4889 #else 4890 ITScope it_scope(allocator_, this, &cond, guard); 4891 #endif 4892 smulwt(cond, rd, rn, rm); 4893 } 4894 void Smulwt(Register rd, Register rn, Register rm) { Smulwt(al, rd, rn, rm); } 4895 4896 void Smusd(Condition cond, Register rd, Register rn, Register rm) { 4897 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4898 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4899 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4900 VIXL_ASSERT(allow_macro_instructions_); 4901 VIXL_ASSERT(OutsideITBlock()); 4902 MacroEmissionCheckScope guard(this); 4903 #ifndef PANDA_BUILD 4904 ITScope it_scope(this, &cond, guard); 4905 #else 4906 ITScope it_scope(allocator_, this, &cond, guard); 4907 #endif 4908 smusd(cond, rd, rn, rm); 4909 } 4910 void Smusd(Register rd, Register rn, Register rm) { Smusd(al, rd, rn, rm); } 4911 4912 void Smusdx(Condition cond, Register rd, Register rn, Register rm) { 4913 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4914 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4915 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4916 VIXL_ASSERT(allow_macro_instructions_); 4917 VIXL_ASSERT(OutsideITBlock()); 4918 MacroEmissionCheckScope guard(this); 4919 #ifndef PANDA_BUILD 4920 ITScope it_scope(this, &cond, guard); 4921 #else 4922 ITScope it_scope(allocator_, this, &cond, guard); 4923 #endif 4924 smusdx(cond, rd, rn, rm); 4925 } 4926 void Smusdx(Register rd, Register rn, Register rm) { Smusdx(al, rd, rn, rm); } 4927 4928 void Ssat(Condition cond, Register rd, uint32_t imm, const Operand& operand) { 4929 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4930 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 4931 VIXL_ASSERT(allow_macro_instructions_); 4932 VIXL_ASSERT(OutsideITBlock()); 4933 MacroEmissionCheckScope guard(this); 4934 #ifndef PANDA_BUILD 4935 ITScope it_scope(this, &cond, guard); 4936 #else 4937 ITScope it_scope(allocator_, this, &cond, guard); 4938 #endif 4939 ssat(cond, rd, imm, operand); 4940 } 4941 void Ssat(Register rd, uint32_t imm, const Operand& operand) { 4942 Ssat(al, rd, imm, operand); 4943 } 4944 4945 void Ssat16(Condition cond, Register rd, uint32_t imm, Register rn) { 4946 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4947 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4948 VIXL_ASSERT(allow_macro_instructions_); 4949 VIXL_ASSERT(OutsideITBlock()); 4950 MacroEmissionCheckScope guard(this); 4951 #ifndef PANDA_BUILD 4952 ITScope it_scope(this, &cond, guard); 4953 #else 4954 ITScope it_scope(allocator_, this, &cond, guard); 4955 #endif 4956 ssat16(cond, rd, imm, rn); 4957 } 4958 void Ssat16(Register rd, uint32_t imm, Register rn) { 4959 Ssat16(al, rd, imm, rn); 4960 } 4961 4962 void Ssax(Condition cond, Register rd, Register rn, Register rm) { 4963 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4964 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4965 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4966 VIXL_ASSERT(allow_macro_instructions_); 4967 VIXL_ASSERT(OutsideITBlock()); 4968 MacroEmissionCheckScope guard(this); 4969 #ifndef PANDA_BUILD 4970 ITScope it_scope(this, &cond, guard); 4971 #else 4972 ITScope it_scope(allocator_, this, &cond, guard); 4973 #endif 4974 ssax(cond, rd, rn, rm); 4975 } 4976 void Ssax(Register rd, Register rn, Register rm) { Ssax(al, rd, rn, rm); } 4977 4978 void Ssub16(Condition cond, Register rd, Register rn, Register rm) { 4979 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4980 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4981 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4982 VIXL_ASSERT(allow_macro_instructions_); 4983 VIXL_ASSERT(OutsideITBlock()); 4984 MacroEmissionCheckScope guard(this); 4985 #ifndef PANDA_BUILD 4986 ITScope it_scope(this, &cond, guard); 4987 #else 4988 ITScope it_scope(allocator_, this, &cond, guard); 4989 #endif 4990 ssub16(cond, rd, rn, rm); 4991 } 4992 void Ssub16(Register rd, Register rn, Register rm) { Ssub16(al, rd, rn, rm); } 4993 4994 void Ssub8(Condition cond, Register rd, Register rn, Register rm) { 4995 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 4996 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 4997 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 4998 VIXL_ASSERT(allow_macro_instructions_); 4999 VIXL_ASSERT(OutsideITBlock()); 5000 MacroEmissionCheckScope guard(this); 5001 #ifndef PANDA_BUILD 5002 ITScope it_scope(this, &cond, guard); 5003 #else 5004 ITScope it_scope(allocator_, this, &cond, guard); 5005 #endif 5006 ssub8(cond, rd, rn, rm); 5007 } 5008 void Ssub8(Register rd, Register rn, Register rm) { Ssub8(al, rd, rn, rm); } 5009 5010 void Stl(Condition cond, Register rt, const MemOperand& operand) { 5011 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5012 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5013 VIXL_ASSERT(allow_macro_instructions_); 5014 VIXL_ASSERT(OutsideITBlock()); 5015 MacroEmissionCheckScope guard(this); 5016 #ifndef PANDA_BUILD 5017 ITScope it_scope(this, &cond, guard); 5018 #else 5019 ITScope it_scope(allocator_, this, &cond, guard); 5020 #endif 5021 stl(cond, rt, operand); 5022 } 5023 void Stl(Register rt, const MemOperand& operand) { Stl(al, rt, operand); } 5024 5025 void Stlb(Condition cond, Register rt, const MemOperand& operand) { 5026 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5027 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5028 VIXL_ASSERT(allow_macro_instructions_); 5029 VIXL_ASSERT(OutsideITBlock()); 5030 MacroEmissionCheckScope guard(this); 5031 #ifndef PANDA_BUILD 5032 ITScope it_scope(this, &cond, guard); 5033 #else 5034 ITScope it_scope(allocator_, this, &cond, guard); 5035 #endif 5036 stlb(cond, rt, operand); 5037 } 5038 void Stlb(Register rt, const MemOperand& operand) { Stlb(al, rt, operand); } 5039 5040 void Stlex(Condition cond, 5041 Register rd, 5042 Register rt, 5043 const MemOperand& operand) { 5044 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5045 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5046 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5047 VIXL_ASSERT(allow_macro_instructions_); 5048 VIXL_ASSERT(OutsideITBlock()); 5049 MacroEmissionCheckScope guard(this); 5050 #ifndef PANDA_BUILD 5051 ITScope it_scope(this, &cond, guard); 5052 #else 5053 ITScope it_scope(allocator_, this, &cond, guard); 5054 #endif 5055 stlex(cond, rd, rt, operand); 5056 } 5057 void Stlex(Register rd, Register rt, const MemOperand& operand) { 5058 Stlex(al, rd, rt, operand); 5059 } 5060 5061 void Stlexb(Condition cond, 5062 Register rd, 5063 Register rt, 5064 const MemOperand& operand) { 5065 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5066 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5067 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5068 VIXL_ASSERT(allow_macro_instructions_); 5069 VIXL_ASSERT(OutsideITBlock()); 5070 MacroEmissionCheckScope guard(this); 5071 #ifndef PANDA_BUILD 5072 ITScope it_scope(this, &cond, guard); 5073 #else 5074 ITScope it_scope(allocator_, this, &cond, guard); 5075 #endif 5076 stlexb(cond, rd, rt, operand); 5077 } 5078 void Stlexb(Register rd, Register rt, const MemOperand& operand) { 5079 Stlexb(al, rd, rt, operand); 5080 } 5081 5082 void Stlexd(Condition cond, 5083 Register rd, 5084 Register rt, 5085 Register rt2, 5086 const MemOperand& operand) { 5087 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5088 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5089 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 5090 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5091 VIXL_ASSERT(allow_macro_instructions_); 5092 VIXL_ASSERT(OutsideITBlock()); 5093 MacroEmissionCheckScope guard(this); 5094 #ifndef PANDA_BUILD 5095 ITScope it_scope(this, &cond, guard); 5096 #else 5097 ITScope it_scope(allocator_, this, &cond, guard); 5098 #endif 5099 stlexd(cond, rd, rt, rt2, operand); 5100 } 5101 void Stlexd(Register rd, 5102 Register rt, 5103 Register rt2, 5104 const MemOperand& operand) { 5105 Stlexd(al, rd, rt, rt2, operand); 5106 } 5107 5108 void Stlexh(Condition cond, 5109 Register rd, 5110 Register rt, 5111 const MemOperand& operand) { 5112 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5113 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5114 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5115 VIXL_ASSERT(allow_macro_instructions_); 5116 VIXL_ASSERT(OutsideITBlock()); 5117 MacroEmissionCheckScope guard(this); 5118 #ifndef PANDA_BUILD 5119 ITScope it_scope(this, &cond, guard); 5120 #else 5121 ITScope it_scope(allocator_, this, &cond, guard); 5122 #endif 5123 stlexh(cond, rd, rt, operand); 5124 } 5125 void Stlexh(Register rd, Register rt, const MemOperand& operand) { 5126 Stlexh(al, rd, rt, operand); 5127 } 5128 5129 void Stlh(Condition cond, Register rt, const MemOperand& operand) { 5130 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5131 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5132 VIXL_ASSERT(allow_macro_instructions_); 5133 VIXL_ASSERT(OutsideITBlock()); 5134 MacroEmissionCheckScope guard(this); 5135 #ifndef PANDA_BUILD 5136 ITScope it_scope(this, &cond, guard); 5137 #else 5138 ITScope it_scope(allocator_, this, &cond, guard); 5139 #endif 5140 stlh(cond, rt, operand); 5141 } 5142 void Stlh(Register rt, const MemOperand& operand) { Stlh(al, rt, operand); } 5143 5144 void Stm(Condition cond, 5145 Register rn, 5146 WriteBack write_back, 5147 RegisterList registers) { 5148 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5149 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 5150 VIXL_ASSERT(allow_macro_instructions_); 5151 VIXL_ASSERT(OutsideITBlock()); 5152 MacroEmissionCheckScope guard(this); 5153 #ifndef PANDA_BUILD 5154 ITScope it_scope(this, &cond, guard); 5155 #else 5156 ITScope it_scope(allocator_, this, &cond, guard); 5157 #endif 5158 stm(cond, rn, write_back, registers); 5159 } 5160 void Stm(Register rn, WriteBack write_back, RegisterList registers) { 5161 Stm(al, rn, write_back, registers); 5162 } 5163 5164 void Stmda(Condition cond, 5165 Register rn, 5166 WriteBack write_back, 5167 RegisterList registers) { 5168 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5169 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 5170 VIXL_ASSERT(allow_macro_instructions_); 5171 VIXL_ASSERT(OutsideITBlock()); 5172 MacroEmissionCheckScope guard(this); 5173 #ifndef PANDA_BUILD 5174 ITScope it_scope(this, &cond, guard); 5175 #else 5176 ITScope it_scope(allocator_, this, &cond, guard); 5177 #endif 5178 stmda(cond, rn, write_back, registers); 5179 } 5180 void Stmda(Register rn, WriteBack write_back, RegisterList registers) { 5181 Stmda(al, rn, write_back, registers); 5182 } 5183 5184 void Stmdb(Condition cond, 5185 Register rn, 5186 WriteBack write_back, 5187 RegisterList registers) { 5188 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5189 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 5190 VIXL_ASSERT(allow_macro_instructions_); 5191 VIXL_ASSERT(OutsideITBlock()); 5192 MacroEmissionCheckScope guard(this); 5193 #ifndef PANDA_BUILD 5194 ITScope it_scope(this, &cond, guard); 5195 #else 5196 ITScope it_scope(allocator_, this, &cond, guard); 5197 #endif 5198 stmdb(cond, rn, write_back, registers); 5199 } 5200 void Stmdb(Register rn, WriteBack write_back, RegisterList registers) { 5201 Stmdb(al, rn, write_back, registers); 5202 } 5203 5204 void Stmea(Condition cond, 5205 Register rn, 5206 WriteBack write_back, 5207 RegisterList registers) { 5208 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5209 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 5210 VIXL_ASSERT(allow_macro_instructions_); 5211 VIXL_ASSERT(OutsideITBlock()); 5212 MacroEmissionCheckScope guard(this); 5213 #ifndef PANDA_BUILD 5214 ITScope it_scope(this, &cond, guard); 5215 #else 5216 ITScope it_scope(allocator_, this, &cond, guard); 5217 #endif 5218 stmea(cond, rn, write_back, registers); 5219 } 5220 void Stmea(Register rn, WriteBack write_back, RegisterList registers) { 5221 Stmea(al, rn, write_back, registers); 5222 } 5223 5224 void Stmed(Condition cond, 5225 Register rn, 5226 WriteBack write_back, 5227 RegisterList registers) { 5228 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5229 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 5230 VIXL_ASSERT(allow_macro_instructions_); 5231 VIXL_ASSERT(OutsideITBlock()); 5232 MacroEmissionCheckScope guard(this); 5233 #ifndef PANDA_BUILD 5234 ITScope it_scope(this, &cond, guard); 5235 #else 5236 ITScope it_scope(allocator_, this, &cond, guard); 5237 #endif 5238 stmed(cond, rn, write_back, registers); 5239 } 5240 void Stmed(Register rn, WriteBack write_back, RegisterList registers) { 5241 Stmed(al, rn, write_back, registers); 5242 } 5243 5244 void Stmfa(Condition cond, 5245 Register rn, 5246 WriteBack write_back, 5247 RegisterList registers) { 5248 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5249 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 5250 VIXL_ASSERT(allow_macro_instructions_); 5251 VIXL_ASSERT(OutsideITBlock()); 5252 MacroEmissionCheckScope guard(this); 5253 #ifndef PANDA_BUILD 5254 ITScope it_scope(this, &cond, guard); 5255 #else 5256 ITScope it_scope(allocator_, this, &cond, guard); 5257 #endif 5258 stmfa(cond, rn, write_back, registers); 5259 } 5260 void Stmfa(Register rn, WriteBack write_back, RegisterList registers) { 5261 Stmfa(al, rn, write_back, registers); 5262 } 5263 5264 void Stmfd(Condition cond, 5265 Register rn, 5266 WriteBack write_back, 5267 RegisterList registers) { 5268 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5269 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 5270 VIXL_ASSERT(allow_macro_instructions_); 5271 VIXL_ASSERT(OutsideITBlock()); 5272 MacroEmissionCheckScope guard(this); 5273 #ifndef PANDA_BUILD 5274 ITScope it_scope(this, &cond, guard); 5275 #else 5276 ITScope it_scope(allocator_, this, &cond, guard); 5277 #endif 5278 stmfd(cond, rn, write_back, registers); 5279 } 5280 void Stmfd(Register rn, WriteBack write_back, RegisterList registers) { 5281 Stmfd(al, rn, write_back, registers); 5282 } 5283 5284 void Stmib(Condition cond, 5285 Register rn, 5286 WriteBack write_back, 5287 RegisterList registers) { 5288 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5289 VIXL_ASSERT(!AliasesAvailableScratchRegister(registers)); 5290 VIXL_ASSERT(allow_macro_instructions_); 5291 VIXL_ASSERT(OutsideITBlock()); 5292 MacroEmissionCheckScope guard(this); 5293 #ifndef PANDA_BUILD 5294 ITScope it_scope(this, &cond, guard); 5295 #else 5296 ITScope it_scope(allocator_, this, &cond, guard); 5297 #endif 5298 stmib(cond, rn, write_back, registers); 5299 } 5300 void Stmib(Register rn, WriteBack write_back, RegisterList registers) { 5301 Stmib(al, rn, write_back, registers); 5302 } 5303 5304 void Str(Condition cond, Register rt, const MemOperand& operand) { 5305 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5306 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5307 VIXL_ASSERT(allow_macro_instructions_); 5308 VIXL_ASSERT(OutsideITBlock()); 5309 MacroEmissionCheckScope guard(this); 5310 bool can_use_it = 5311 // STR{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1 5312 (operand.IsImmediate() && rt.IsLow() && 5313 operand.GetBaseRegister().IsLow() && 5314 operand.IsOffsetImmediateWithinRange(0, 124, 4) && 5315 (operand.GetAddrMode() == Offset)) || 5316 // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2 5317 (operand.IsImmediate() && rt.IsLow() && 5318 operand.GetBaseRegister().IsSP() && 5319 operand.IsOffsetImmediateWithinRange(0, 1020, 4) && 5320 (operand.GetAddrMode() == Offset)) || 5321 // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 5322 (operand.IsPlainRegister() && rt.IsLow() && 5323 operand.GetBaseRegister().IsLow() && 5324 operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 5325 (operand.GetAddrMode() == Offset)); 5326 #ifndef PANDA_BUILD 5327 ITScope it_scope(this, &cond, guard, can_use_it); 5328 #else 5329 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 5330 #endif 5331 str(cond, rt, operand); 5332 } 5333 void Str(Register rt, const MemOperand& operand) { Str(al, rt, operand); } 5334 5335 void Strb(Condition cond, Register rt, const MemOperand& operand) { 5336 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5337 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5338 VIXL_ASSERT(allow_macro_instructions_); 5339 VIXL_ASSERT(OutsideITBlock()); 5340 MacroEmissionCheckScope guard(this); 5341 bool can_use_it = 5342 // STRB{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1 5343 (operand.IsImmediate() && rt.IsLow() && 5344 operand.GetBaseRegister().IsLow() && 5345 operand.IsOffsetImmediateWithinRange(0, 31) && 5346 (operand.GetAddrMode() == Offset)) || 5347 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 5348 (operand.IsPlainRegister() && rt.IsLow() && 5349 operand.GetBaseRegister().IsLow() && 5350 operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 5351 (operand.GetAddrMode() == Offset)); 5352 #ifndef PANDA_BUILD 5353 ITScope it_scope(this, &cond, guard, can_use_it); 5354 #else 5355 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 5356 #endif 5357 strb(cond, rt, operand); 5358 } 5359 void Strb(Register rt, const MemOperand& operand) { Strb(al, rt, operand); } 5360 5361 void Strd(Condition cond, 5362 Register rt, 5363 Register rt2, 5364 const MemOperand& operand) { 5365 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5366 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 5367 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5368 VIXL_ASSERT(allow_macro_instructions_); 5369 VIXL_ASSERT(OutsideITBlock()); 5370 MacroEmissionCheckScope guard(this); 5371 #ifndef PANDA_BUILD 5372 ITScope it_scope(this, &cond, guard); 5373 #else 5374 ITScope it_scope(allocator_, this, &cond, guard); 5375 #endif 5376 strd(cond, rt, rt2, operand); 5377 } 5378 void Strd(Register rt, Register rt2, const MemOperand& operand) { 5379 Strd(al, rt, rt2, operand); 5380 } 5381 5382 void Strex(Condition cond, 5383 Register rd, 5384 Register rt, 5385 const MemOperand& operand) { 5386 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5387 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5388 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5389 VIXL_ASSERT(allow_macro_instructions_); 5390 VIXL_ASSERT(OutsideITBlock()); 5391 MacroEmissionCheckScope guard(this); 5392 #ifndef PANDA_BUILD 5393 ITScope it_scope(this, &cond, guard); 5394 #else 5395 ITScope it_scope(allocator_, this, &cond, guard); 5396 #endif 5397 strex(cond, rd, rt, operand); 5398 } 5399 void Strex(Register rd, Register rt, const MemOperand& operand) { 5400 Strex(al, rd, rt, operand); 5401 } 5402 5403 void Strexb(Condition cond, 5404 Register rd, 5405 Register rt, 5406 const MemOperand& operand) { 5407 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5408 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5409 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5410 VIXL_ASSERT(allow_macro_instructions_); 5411 VIXL_ASSERT(OutsideITBlock()); 5412 MacroEmissionCheckScope guard(this); 5413 #ifndef PANDA_BUILD 5414 ITScope it_scope(this, &cond, guard); 5415 #else 5416 ITScope it_scope(allocator_, this, &cond, guard); 5417 #endif 5418 strexb(cond, rd, rt, operand); 5419 } 5420 void Strexb(Register rd, Register rt, const MemOperand& operand) { 5421 Strexb(al, rd, rt, operand); 5422 } 5423 5424 void Strexd(Condition cond, 5425 Register rd, 5426 Register rt, 5427 Register rt2, 5428 const MemOperand& operand) { 5429 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5430 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5431 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 5432 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5433 VIXL_ASSERT(allow_macro_instructions_); 5434 VIXL_ASSERT(OutsideITBlock()); 5435 MacroEmissionCheckScope guard(this); 5436 #ifndef PANDA_BUILD 5437 ITScope it_scope(this, &cond, guard); 5438 #else 5439 ITScope it_scope(allocator_, this, &cond, guard); 5440 #endif 5441 strexd(cond, rd, rt, rt2, operand); 5442 } 5443 void Strexd(Register rd, 5444 Register rt, 5445 Register rt2, 5446 const MemOperand& operand) { 5447 Strexd(al, rd, rt, rt2, operand); 5448 } 5449 5450 void Strexh(Condition cond, 5451 Register rd, 5452 Register rt, 5453 const MemOperand& operand) { 5454 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5455 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5456 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5457 VIXL_ASSERT(allow_macro_instructions_); 5458 VIXL_ASSERT(OutsideITBlock()); 5459 MacroEmissionCheckScope guard(this); 5460 #ifndef PANDA_BUILD 5461 ITScope it_scope(this, &cond, guard); 5462 #else 5463 ITScope it_scope(allocator_, this, &cond, guard); 5464 #endif 5465 strexh(cond, rd, rt, operand); 5466 } 5467 void Strexh(Register rd, Register rt, const MemOperand& operand) { 5468 Strexh(al, rd, rt, operand); 5469 } 5470 5471 void Strh(Condition cond, Register rt, const MemOperand& operand) { 5472 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 5473 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5474 VIXL_ASSERT(allow_macro_instructions_); 5475 VIXL_ASSERT(OutsideITBlock()); 5476 MacroEmissionCheckScope guard(this); 5477 bool can_use_it = 5478 // STRH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] ; T1 5479 (operand.IsImmediate() && rt.IsLow() && 5480 operand.GetBaseRegister().IsLow() && 5481 operand.IsOffsetImmediateWithinRange(0, 62, 2) && 5482 (operand.GetAddrMode() == Offset)) || 5483 // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] ; T1 5484 (operand.IsPlainRegister() && rt.IsLow() && 5485 operand.GetBaseRegister().IsLow() && 5486 operand.GetOffsetRegister().IsLow() && operand.GetSign().IsPlus() && 5487 (operand.GetAddrMode() == Offset)); 5488 #ifndef PANDA_BUILD 5489 ITScope it_scope(this, &cond, guard, can_use_it); 5490 #else 5491 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 5492 #endif 5493 strh(cond, rt, operand); 5494 } 5495 void Strh(Register rt, const MemOperand& operand) { Strh(al, rt, operand); } 5496 5497 void Sub(Condition cond, Register rd, Register rn, const Operand& operand) { 5498 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5499 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5500 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5501 VIXL_ASSERT(allow_macro_instructions_); 5502 VIXL_ASSERT(OutsideITBlock()); 5503 MacroEmissionCheckScope guard(this); 5504 if (cond.Is(al) && rd.Is(rn) && operand.IsImmediate()) { 5505 uint32_t immediate = operand.GetImmediate(); 5506 if (immediate == 0) { 5507 return; 5508 } 5509 } 5510 bool can_use_it = 5511 // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1 5512 (operand.IsImmediate() && (operand.GetImmediate() <= 7) && rn.IsLow() && 5513 rd.IsLow()) || 5514 // SUB<c>{<q>} {<Rdn>,} <Rdn>, #<imm8> ; T2 5515 (operand.IsImmediate() && (operand.GetImmediate() <= 255) && 5516 rd.IsLow() && rn.Is(rd)) || 5517 // SUB<c>{<q>} <Rd>, <Rn>, <Rm> 5518 (operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() && 5519 operand.GetBaseRegister().IsLow()); 5520 #ifndef PANDA_BUILD 5521 ITScope it_scope(this, &cond, guard, can_use_it); 5522 #else 5523 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 5524 #endif 5525 sub(cond, rd, rn, operand); 5526 } 5527 void Sub(Register rd, Register rn, const Operand& operand) { 5528 Sub(al, rd, rn, operand); 5529 } 5530 void Sub(FlagsUpdate flags, 5531 Condition cond, 5532 Register rd, 5533 Register rn, 5534 const Operand& operand) { 5535 switch (flags) { 5536 case LeaveFlags: 5537 Sub(cond, rd, rn, operand); 5538 break; 5539 case SetFlags: 5540 Subs(cond, rd, rn, operand); 5541 break; 5542 case DontCare: 5543 bool setflags_is_smaller = 5544 IsUsingT32() && cond.Is(al) && 5545 ((operand.IsPlainRegister() && rd.IsLow() && rn.IsLow() && 5546 operand.GetBaseRegister().IsLow()) || 5547 (operand.IsImmediate() && 5548 ((rd.IsLow() && rn.IsLow() && (operand.GetImmediate() < 8)) || 5549 (rd.IsLow() && rn.Is(rd) && (operand.GetImmediate() < 256))))); 5550 if (setflags_is_smaller) { 5551 Subs(cond, rd, rn, operand); 5552 } else { 5553 bool changed_op_is_smaller = 5554 operand.IsImmediate() && (operand.GetSignedImmediate() < 0) && 5555 ((rd.IsLow() && rn.IsLow() && 5556 (operand.GetSignedImmediate() >= -7)) || 5557 (rd.IsLow() && rn.Is(rd) && 5558 (operand.GetSignedImmediate() >= -255))); 5559 if (changed_op_is_smaller) { 5560 Adds(cond, rd, rn, -operand.GetSignedImmediate()); 5561 } else { 5562 Sub(cond, rd, rn, operand); 5563 } 5564 } 5565 break; 5566 } 5567 } 5568 void Sub(FlagsUpdate flags, 5569 Register rd, 5570 Register rn, 5571 const Operand& operand) { 5572 Sub(flags, al, rd, rn, operand); 5573 } 5574 5575 void Subs(Condition cond, Register rd, Register rn, const Operand& operand) { 5576 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5577 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5578 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5579 VIXL_ASSERT(allow_macro_instructions_); 5580 VIXL_ASSERT(OutsideITBlock()); 5581 MacroEmissionCheckScope guard(this); 5582 #ifndef PANDA_BUILD 5583 ITScope it_scope(this, &cond, guard); 5584 #else 5585 ITScope it_scope(allocator_, this, &cond, guard); 5586 #endif 5587 subs(cond, rd, rn, operand); 5588 } 5589 void Subs(Register rd, Register rn, const Operand& operand) { 5590 Subs(al, rd, rn, operand); 5591 } 5592 5593 void Svc(Condition cond, uint32_t imm) { 5594 VIXL_ASSERT(allow_macro_instructions_); 5595 VIXL_ASSERT(OutsideITBlock()); 5596 MacroEmissionCheckScope guard(this); 5597 #ifndef PANDA_BUILD 5598 ITScope it_scope(this, &cond, guard); 5599 #else 5600 ITScope it_scope(allocator_, this, &cond, guard); 5601 #endif 5602 svc(cond, imm); 5603 } 5604 void Svc(uint32_t imm) { Svc(al, imm); } 5605 5606 void Sxtab(Condition cond, Register rd, Register rn, const Operand& operand) { 5607 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5608 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5609 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5610 VIXL_ASSERT(allow_macro_instructions_); 5611 VIXL_ASSERT(OutsideITBlock()); 5612 MacroEmissionCheckScope guard(this); 5613 #ifndef PANDA_BUILD 5614 ITScope it_scope(this, &cond, guard); 5615 #else 5616 ITScope it_scope(allocator_, this, &cond, guard); 5617 #endif 5618 sxtab(cond, rd, rn, operand); 5619 } 5620 void Sxtab(Register rd, Register rn, const Operand& operand) { 5621 Sxtab(al, rd, rn, operand); 5622 } 5623 5624 void Sxtab16(Condition cond, 5625 Register rd, 5626 Register rn, 5627 const Operand& operand) { 5628 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5629 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5630 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5631 VIXL_ASSERT(allow_macro_instructions_); 5632 VIXL_ASSERT(OutsideITBlock()); 5633 MacroEmissionCheckScope guard(this); 5634 #ifndef PANDA_BUILD 5635 ITScope it_scope(this, &cond, guard); 5636 #else 5637 ITScope it_scope(allocator_, this, &cond, guard); 5638 #endif 5639 sxtab16(cond, rd, rn, operand); 5640 } 5641 void Sxtab16(Register rd, Register rn, const Operand& operand) { 5642 Sxtab16(al, rd, rn, operand); 5643 } 5644 5645 void Sxtah(Condition cond, Register rd, Register rn, const Operand& operand) { 5646 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5647 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5648 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5649 VIXL_ASSERT(allow_macro_instructions_); 5650 VIXL_ASSERT(OutsideITBlock()); 5651 MacroEmissionCheckScope guard(this); 5652 #ifndef PANDA_BUILD 5653 ITScope it_scope(this, &cond, guard); 5654 #else 5655 ITScope it_scope(allocator_, this, &cond, guard); 5656 #endif 5657 sxtah(cond, rd, rn, operand); 5658 } 5659 void Sxtah(Register rd, Register rn, const Operand& operand) { 5660 Sxtah(al, rd, rn, operand); 5661 } 5662 5663 void Sxtb(Condition cond, Register rd, const Operand& operand) { 5664 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5665 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5666 VIXL_ASSERT(allow_macro_instructions_); 5667 VIXL_ASSERT(OutsideITBlock()); 5668 MacroEmissionCheckScope guard(this); 5669 #ifndef PANDA_BUILD 5670 ITScope it_scope(this, &cond, guard); 5671 #else 5672 ITScope it_scope(allocator_, this, &cond, guard); 5673 #endif 5674 sxtb(cond, rd, operand); 5675 } 5676 void Sxtb(Register rd, const Operand& operand) { Sxtb(al, rd, operand); } 5677 5678 void Sxtb16(Condition cond, Register rd, const Operand& operand) { 5679 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5680 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5681 VIXL_ASSERT(allow_macro_instructions_); 5682 VIXL_ASSERT(OutsideITBlock()); 5683 MacroEmissionCheckScope guard(this); 5684 #ifndef PANDA_BUILD 5685 ITScope it_scope(this, &cond, guard); 5686 #else 5687 ITScope it_scope(allocator_, this, &cond, guard); 5688 #endif 5689 sxtb16(cond, rd, operand); 5690 } 5691 void Sxtb16(Register rd, const Operand& operand) { Sxtb16(al, rd, operand); } 5692 5693 void Sxth(Condition cond, Register rd, const Operand& operand) { 5694 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5695 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5696 VIXL_ASSERT(allow_macro_instructions_); 5697 VIXL_ASSERT(OutsideITBlock()); 5698 MacroEmissionCheckScope guard(this); 5699 #ifndef PANDA_BUILD 5700 ITScope it_scope(this, &cond, guard); 5701 #else 5702 ITScope it_scope(allocator_, this, &cond, guard); 5703 #endif 5704 sxth(cond, rd, operand); 5705 } 5706 void Sxth(Register rd, const Operand& operand) { Sxth(al, rd, operand); } 5707 5708 void Teq(Condition cond, Register rn, const Operand& operand) { 5709 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5710 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5711 VIXL_ASSERT(allow_macro_instructions_); 5712 VIXL_ASSERT(OutsideITBlock()); 5713 MacroEmissionCheckScope guard(this); 5714 #ifndef PANDA_BUILD 5715 ITScope it_scope(this, &cond, guard); 5716 #else 5717 ITScope it_scope(allocator_, this, &cond, guard); 5718 #endif 5719 teq(cond, rn, operand); 5720 } 5721 void Teq(Register rn, const Operand& operand) { Teq(al, rn, operand); } 5722 5723 void Tst(Condition cond, Register rn, const Operand& operand) { 5724 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5725 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 5726 VIXL_ASSERT(allow_macro_instructions_); 5727 VIXL_ASSERT(OutsideITBlock()); 5728 MacroEmissionCheckScope guard(this); 5729 bool can_use_it = 5730 // TST{<c>}{<q>} <Rn>, <Rm> ; T1 5731 operand.IsPlainRegister() && rn.IsLow() && 5732 operand.GetBaseRegister().IsLow(); 5733 #ifndef PANDA_BUILD 5734 ITScope it_scope(this, &cond, guard, can_use_it); 5735 #else 5736 ITScope it_scope(allocator_, this, &cond, guard, can_use_it); 5737 #endif 5738 tst(cond, rn, operand); 5739 } 5740 void Tst(Register rn, const Operand& operand) { Tst(al, rn, operand); } 5741 5742 void Uadd16(Condition cond, Register rd, Register rn, Register rm) { 5743 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5744 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5745 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5746 VIXL_ASSERT(allow_macro_instructions_); 5747 VIXL_ASSERT(OutsideITBlock()); 5748 MacroEmissionCheckScope guard(this); 5749 #ifndef PANDA_BUILD 5750 ITScope it_scope(this, &cond, guard); 5751 #else 5752 ITScope it_scope(allocator_, this, &cond, guard); 5753 #endif 5754 uadd16(cond, rd, rn, rm); 5755 } 5756 void Uadd16(Register rd, Register rn, Register rm) { Uadd16(al, rd, rn, rm); } 5757 5758 void Uadd8(Condition cond, Register rd, Register rn, Register rm) { 5759 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5760 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5761 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5762 VIXL_ASSERT(allow_macro_instructions_); 5763 VIXL_ASSERT(OutsideITBlock()); 5764 MacroEmissionCheckScope guard(this); 5765 #ifndef PANDA_BUILD 5766 ITScope it_scope(this, &cond, guard); 5767 #else 5768 ITScope it_scope(allocator_, this, &cond, guard); 5769 #endif 5770 uadd8(cond, rd, rn, rm); 5771 } 5772 void Uadd8(Register rd, Register rn, Register rm) { Uadd8(al, rd, rn, rm); } 5773 5774 void Uasx(Condition cond, Register rd, Register rn, Register rm) { 5775 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5776 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5777 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5778 VIXL_ASSERT(allow_macro_instructions_); 5779 VIXL_ASSERT(OutsideITBlock()); 5780 MacroEmissionCheckScope guard(this); 5781 #ifndef PANDA_BUILD 5782 ITScope it_scope(this, &cond, guard); 5783 #else 5784 ITScope it_scope(allocator_, this, &cond, guard); 5785 #endif 5786 uasx(cond, rd, rn, rm); 5787 } 5788 void Uasx(Register rd, Register rn, Register rm) { Uasx(al, rd, rn, rm); } 5789 5790 void Ubfx( 5791 Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { 5792 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5793 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5794 VIXL_ASSERT(allow_macro_instructions_); 5795 VIXL_ASSERT(OutsideITBlock()); 5796 MacroEmissionCheckScope guard(this); 5797 #ifndef PANDA_BUILD 5798 ITScope it_scope(this, &cond, guard); 5799 #else 5800 ITScope it_scope(allocator_, this, &cond, guard); 5801 #endif 5802 ubfx(cond, rd, rn, lsb, width); 5803 } 5804 void Ubfx(Register rd, Register rn, uint32_t lsb, uint32_t width) { 5805 Ubfx(al, rd, rn, lsb, width); 5806 } 5807 5808 void Udf(Condition cond, uint32_t imm) { 5809 VIXL_ASSERT(allow_macro_instructions_); 5810 VIXL_ASSERT(OutsideITBlock()); 5811 MacroEmissionCheckScope guard(this); 5812 #ifndef PANDA_BUILD 5813 ITScope it_scope(this, &cond, guard); 5814 #else 5815 ITScope it_scope(allocator_, this, &cond, guard); 5816 #endif 5817 udf(cond, imm); 5818 } 5819 void Udf(uint32_t imm) { Udf(al, imm); } 5820 5821 void Udiv(Condition cond, Register rd, Register rn, Register rm) { 5822 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5823 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5824 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5825 VIXL_ASSERT(allow_macro_instructions_); 5826 VIXL_ASSERT(OutsideITBlock()); 5827 MacroEmissionCheckScope guard(this); 5828 #ifndef PANDA_BUILD 5829 ITScope it_scope(this, &cond, guard); 5830 #else 5831 ITScope it_scope(allocator_, this, &cond, guard); 5832 #endif 5833 udiv(cond, rd, rn, rm); 5834 } 5835 void Udiv(Register rd, Register rn, Register rm) { Udiv(al, rd, rn, rm); } 5836 5837 void Uhadd16(Condition cond, Register rd, Register rn, Register rm) { 5838 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5839 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5840 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5841 VIXL_ASSERT(allow_macro_instructions_); 5842 VIXL_ASSERT(OutsideITBlock()); 5843 MacroEmissionCheckScope guard(this); 5844 #ifndef PANDA_BUILD 5845 ITScope it_scope(this, &cond, guard); 5846 #else 5847 ITScope it_scope(allocator_, this, &cond, guard); 5848 #endif 5849 uhadd16(cond, rd, rn, rm); 5850 } 5851 void Uhadd16(Register rd, Register rn, Register rm) { 5852 Uhadd16(al, rd, rn, rm); 5853 } 5854 5855 void Uhadd8(Condition cond, Register rd, Register rn, Register rm) { 5856 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5857 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5858 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5859 VIXL_ASSERT(allow_macro_instructions_); 5860 VIXL_ASSERT(OutsideITBlock()); 5861 MacroEmissionCheckScope guard(this); 5862 #ifndef PANDA_BUILD 5863 ITScope it_scope(this, &cond, guard); 5864 #else 5865 ITScope it_scope(allocator_, this, &cond, guard); 5866 #endif 5867 uhadd8(cond, rd, rn, rm); 5868 } 5869 void Uhadd8(Register rd, Register rn, Register rm) { Uhadd8(al, rd, rn, rm); } 5870 5871 void Uhasx(Condition cond, Register rd, Register rn, Register rm) { 5872 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5873 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5874 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5875 VIXL_ASSERT(allow_macro_instructions_); 5876 VIXL_ASSERT(OutsideITBlock()); 5877 MacroEmissionCheckScope guard(this); 5878 #ifndef PANDA_BUILD 5879 ITScope it_scope(this, &cond, guard); 5880 #else 5881 ITScope it_scope(allocator_, this, &cond, guard); 5882 #endif 5883 uhasx(cond, rd, rn, rm); 5884 } 5885 void Uhasx(Register rd, Register rn, Register rm) { Uhasx(al, rd, rn, rm); } 5886 5887 void Uhsax(Condition cond, Register rd, Register rn, Register rm) { 5888 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5889 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5890 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5891 VIXL_ASSERT(allow_macro_instructions_); 5892 VIXL_ASSERT(OutsideITBlock()); 5893 MacroEmissionCheckScope guard(this); 5894 #ifndef PANDA_BUILD 5895 ITScope it_scope(this, &cond, guard); 5896 #else 5897 ITScope it_scope(allocator_, this, &cond, guard); 5898 #endif 5899 uhsax(cond, rd, rn, rm); 5900 } 5901 void Uhsax(Register rd, Register rn, Register rm) { Uhsax(al, rd, rn, rm); } 5902 5903 void Uhsub16(Condition cond, Register rd, Register rn, Register rm) { 5904 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5905 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5906 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5907 VIXL_ASSERT(allow_macro_instructions_); 5908 VIXL_ASSERT(OutsideITBlock()); 5909 MacroEmissionCheckScope guard(this); 5910 #ifndef PANDA_BUILD 5911 ITScope it_scope(this, &cond, guard); 5912 #else 5913 ITScope it_scope(allocator_, this, &cond, guard); 5914 #endif 5915 uhsub16(cond, rd, rn, rm); 5916 } 5917 void Uhsub16(Register rd, Register rn, Register rm) { 5918 Uhsub16(al, rd, rn, rm); 5919 } 5920 5921 void Uhsub8(Condition cond, Register rd, Register rn, Register rm) { 5922 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 5923 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5924 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5925 VIXL_ASSERT(allow_macro_instructions_); 5926 VIXL_ASSERT(OutsideITBlock()); 5927 MacroEmissionCheckScope guard(this); 5928 #ifndef PANDA_BUILD 5929 ITScope it_scope(this, &cond, guard); 5930 #else 5931 ITScope it_scope(allocator_, this, &cond, guard); 5932 #endif 5933 uhsub8(cond, rd, rn, rm); 5934 } 5935 void Uhsub8(Register rd, Register rn, Register rm) { Uhsub8(al, rd, rn, rm); } 5936 5937 void Umaal( 5938 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 5939 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 5940 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 5941 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5942 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5943 VIXL_ASSERT(allow_macro_instructions_); 5944 VIXL_ASSERT(OutsideITBlock()); 5945 MacroEmissionCheckScope guard(this); 5946 #ifndef PANDA_BUILD 5947 ITScope it_scope(this, &cond, guard); 5948 #else 5949 ITScope it_scope(allocator_, this, &cond, guard); 5950 #endif 5951 umaal(cond, rdlo, rdhi, rn, rm); 5952 } 5953 void Umaal(Register rdlo, Register rdhi, Register rn, Register rm) { 5954 Umaal(al, rdlo, rdhi, rn, rm); 5955 } 5956 5957 void Umlal( 5958 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 5959 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 5960 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 5961 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 5962 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 5963 VIXL_ASSERT(allow_macro_instructions_); 5964 VIXL_ASSERT(OutsideITBlock()); 5965 MacroEmissionCheckScope guard(this); 5966 #ifndef PANDA_BUILD 5967 ITScope it_scope(this, &cond, guard); 5968 #else 5969 ITScope it_scope(allocator_, this, &cond, guard); 5970 #endif 5971 umlal(cond, rdlo, rdhi, rn, rm); 5972 } 5973 void Umlal(Register rdlo, Register rdhi, Register rn, Register rm) { 5974 Umlal(al, rdlo, rdhi, rn, rm); 5975 } 5976 void Umlal(FlagsUpdate flags, 5977 Condition cond, 5978 Register rdlo, 5979 Register rdhi, 5980 Register rn, 5981 Register rm) { 5982 switch (flags) { 5983 case LeaveFlags: 5984 Umlal(cond, rdlo, rdhi, rn, rm); 5985 break; 5986 case SetFlags: 5987 Umlals(cond, rdlo, rdhi, rn, rm); 5988 break; 5989 case DontCare: 5990 Umlal(cond, rdlo, rdhi, rn, rm); 5991 break; 5992 } 5993 } 5994 void Umlal(FlagsUpdate flags, 5995 Register rdlo, 5996 Register rdhi, 5997 Register rn, 5998 Register rm) { 5999 Umlal(flags, al, rdlo, rdhi, rn, rm); 6000 } 6001 6002 void Umlals( 6003 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 6004 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 6005 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 6006 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6007 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6008 VIXL_ASSERT(allow_macro_instructions_); 6009 VIXL_ASSERT(OutsideITBlock()); 6010 MacroEmissionCheckScope guard(this); 6011 #ifndef PANDA_BUILD 6012 ITScope it_scope(this, &cond, guard); 6013 #else 6014 ITScope it_scope(allocator_, this, &cond, guard); 6015 #endif 6016 umlals(cond, rdlo, rdhi, rn, rm); 6017 } 6018 void Umlals(Register rdlo, Register rdhi, Register rn, Register rm) { 6019 Umlals(al, rdlo, rdhi, rn, rm); 6020 } 6021 6022 void Umull( 6023 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 6024 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 6025 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 6026 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6027 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6028 VIXL_ASSERT(allow_macro_instructions_); 6029 VIXL_ASSERT(OutsideITBlock()); 6030 MacroEmissionCheckScope guard(this); 6031 #ifndef PANDA_BUILD 6032 ITScope it_scope(this, &cond, guard); 6033 #else 6034 ITScope it_scope(allocator_, this, &cond, guard); 6035 #endif 6036 umull(cond, rdlo, rdhi, rn, rm); 6037 } 6038 void Umull(Register rdlo, Register rdhi, Register rn, Register rm) { 6039 Umull(al, rdlo, rdhi, rn, rm); 6040 } 6041 void Umull(FlagsUpdate flags, 6042 Condition cond, 6043 Register rdlo, 6044 Register rdhi, 6045 Register rn, 6046 Register rm) { 6047 switch (flags) { 6048 case LeaveFlags: 6049 Umull(cond, rdlo, rdhi, rn, rm); 6050 break; 6051 case SetFlags: 6052 Umulls(cond, rdlo, rdhi, rn, rm); 6053 break; 6054 case DontCare: 6055 Umull(cond, rdlo, rdhi, rn, rm); 6056 break; 6057 } 6058 } 6059 void Umull(FlagsUpdate flags, 6060 Register rdlo, 6061 Register rdhi, 6062 Register rn, 6063 Register rm) { 6064 Umull(flags, al, rdlo, rdhi, rn, rm); 6065 } 6066 6067 void Umulls( 6068 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 6069 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdlo)); 6070 VIXL_ASSERT(!AliasesAvailableScratchRegister(rdhi)); 6071 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6072 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6073 VIXL_ASSERT(allow_macro_instructions_); 6074 VIXL_ASSERT(OutsideITBlock()); 6075 MacroEmissionCheckScope guard(this); 6076 #ifndef PANDA_BUILD 6077 ITScope it_scope(this, &cond, guard); 6078 #else 6079 ITScope it_scope(allocator_, this, &cond, guard); 6080 #endif 6081 umulls(cond, rdlo, rdhi, rn, rm); 6082 } 6083 void Umulls(Register rdlo, Register rdhi, Register rn, Register rm) { 6084 Umulls(al, rdlo, rdhi, rn, rm); 6085 } 6086 6087 void Uqadd16(Condition cond, Register rd, Register rn, Register rm) { 6088 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6089 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6090 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6091 VIXL_ASSERT(allow_macro_instructions_); 6092 VIXL_ASSERT(OutsideITBlock()); 6093 MacroEmissionCheckScope guard(this); 6094 #ifndef PANDA_BUILD 6095 ITScope it_scope(this, &cond, guard); 6096 #else 6097 ITScope it_scope(allocator_, this, &cond, guard); 6098 #endif 6099 uqadd16(cond, rd, rn, rm); 6100 } 6101 void Uqadd16(Register rd, Register rn, Register rm) { 6102 Uqadd16(al, rd, rn, rm); 6103 } 6104 6105 void Uqadd8(Condition cond, Register rd, Register rn, Register rm) { 6106 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6107 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6108 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6109 VIXL_ASSERT(allow_macro_instructions_); 6110 VIXL_ASSERT(OutsideITBlock()); 6111 MacroEmissionCheckScope guard(this); 6112 #ifndef PANDA_BUILD 6113 ITScope it_scope(this, &cond, guard); 6114 #else 6115 ITScope it_scope(allocator_, this, &cond, guard); 6116 #endif 6117 uqadd8(cond, rd, rn, rm); 6118 } 6119 void Uqadd8(Register rd, Register rn, Register rm) { Uqadd8(al, rd, rn, rm); } 6120 6121 void Uqasx(Condition cond, Register rd, Register rn, Register rm) { 6122 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6123 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6124 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6125 VIXL_ASSERT(allow_macro_instructions_); 6126 VIXL_ASSERT(OutsideITBlock()); 6127 MacroEmissionCheckScope guard(this); 6128 #ifndef PANDA_BUILD 6129 ITScope it_scope(this, &cond, guard); 6130 #else 6131 ITScope it_scope(allocator_, this, &cond, guard); 6132 #endif 6133 uqasx(cond, rd, rn, rm); 6134 } 6135 void Uqasx(Register rd, Register rn, Register rm) { Uqasx(al, rd, rn, rm); } 6136 6137 void Uqsax(Condition cond, Register rd, Register rn, Register rm) { 6138 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6139 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6140 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6141 VIXL_ASSERT(allow_macro_instructions_); 6142 VIXL_ASSERT(OutsideITBlock()); 6143 MacroEmissionCheckScope guard(this); 6144 #ifndef PANDA_BUILD 6145 ITScope it_scope(this, &cond, guard); 6146 #else 6147 ITScope it_scope(allocator_, this, &cond, guard); 6148 #endif 6149 uqsax(cond, rd, rn, rm); 6150 } 6151 void Uqsax(Register rd, Register rn, Register rm) { Uqsax(al, rd, rn, rm); } 6152 6153 void Uqsub16(Condition cond, Register rd, Register rn, Register rm) { 6154 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6155 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6156 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6157 VIXL_ASSERT(allow_macro_instructions_); 6158 VIXL_ASSERT(OutsideITBlock()); 6159 MacroEmissionCheckScope guard(this); 6160 #ifndef PANDA_BUILD 6161 ITScope it_scope(this, &cond, guard); 6162 #else 6163 ITScope it_scope(allocator_, this, &cond, guard); 6164 #endif 6165 uqsub16(cond, rd, rn, rm); 6166 } 6167 void Uqsub16(Register rd, Register rn, Register rm) { 6168 Uqsub16(al, rd, rn, rm); 6169 } 6170 6171 void Uqsub8(Condition cond, Register rd, Register rn, Register rm) { 6172 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6173 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6174 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6175 VIXL_ASSERT(allow_macro_instructions_); 6176 VIXL_ASSERT(OutsideITBlock()); 6177 MacroEmissionCheckScope guard(this); 6178 #ifndef PANDA_BUILD 6179 ITScope it_scope(this, &cond, guard); 6180 #else 6181 ITScope it_scope(allocator_, this, &cond, guard); 6182 #endif 6183 uqsub8(cond, rd, rn, rm); 6184 } 6185 void Uqsub8(Register rd, Register rn, Register rm) { Uqsub8(al, rd, rn, rm); } 6186 6187 void Usad8(Condition cond, Register rd, Register rn, Register rm) { 6188 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6189 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6190 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6191 VIXL_ASSERT(allow_macro_instructions_); 6192 VIXL_ASSERT(OutsideITBlock()); 6193 MacroEmissionCheckScope guard(this); 6194 #ifndef PANDA_BUILD 6195 ITScope it_scope(this, &cond, guard); 6196 #else 6197 ITScope it_scope(allocator_, this, &cond, guard); 6198 #endif 6199 usad8(cond, rd, rn, rm); 6200 } 6201 void Usad8(Register rd, Register rn, Register rm) { Usad8(al, rd, rn, rm); } 6202 6203 void Usada8( 6204 Condition cond, Register rd, Register rn, Register rm, Register ra) { 6205 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6206 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6207 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6208 VIXL_ASSERT(!AliasesAvailableScratchRegister(ra)); 6209 VIXL_ASSERT(allow_macro_instructions_); 6210 VIXL_ASSERT(OutsideITBlock()); 6211 MacroEmissionCheckScope guard(this); 6212 #ifndef PANDA_BUILD 6213 ITScope it_scope(this, &cond, guard); 6214 #else 6215 ITScope it_scope(allocator_, this, &cond, guard); 6216 #endif 6217 usada8(cond, rd, rn, rm, ra); 6218 } 6219 void Usada8(Register rd, Register rn, Register rm, Register ra) { 6220 Usada8(al, rd, rn, rm, ra); 6221 } 6222 6223 void Usat(Condition cond, Register rd, uint32_t imm, const Operand& operand) { 6224 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6225 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6226 VIXL_ASSERT(allow_macro_instructions_); 6227 VIXL_ASSERT(OutsideITBlock()); 6228 MacroEmissionCheckScope guard(this); 6229 #ifndef PANDA_BUILD 6230 ITScope it_scope(this, &cond, guard); 6231 #else 6232 ITScope it_scope(allocator_, this, &cond, guard); 6233 #endif 6234 usat(cond, rd, imm, operand); 6235 } 6236 void Usat(Register rd, uint32_t imm, const Operand& operand) { 6237 Usat(al, rd, imm, operand); 6238 } 6239 6240 void Usat16(Condition cond, Register rd, uint32_t imm, Register rn) { 6241 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6242 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6243 VIXL_ASSERT(allow_macro_instructions_); 6244 VIXL_ASSERT(OutsideITBlock()); 6245 MacroEmissionCheckScope guard(this); 6246 #ifndef PANDA_BUILD 6247 ITScope it_scope(this, &cond, guard); 6248 #else 6249 ITScope it_scope(allocator_, this, &cond, guard); 6250 #endif 6251 usat16(cond, rd, imm, rn); 6252 } 6253 void Usat16(Register rd, uint32_t imm, Register rn) { 6254 Usat16(al, rd, imm, rn); 6255 } 6256 6257 void Usax(Condition cond, Register rd, Register rn, Register rm) { 6258 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6259 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6260 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6261 VIXL_ASSERT(allow_macro_instructions_); 6262 VIXL_ASSERT(OutsideITBlock()); 6263 MacroEmissionCheckScope guard(this); 6264 #ifndef PANDA_BUILD 6265 ITScope it_scope(this, &cond, guard); 6266 #else 6267 ITScope it_scope(allocator_, this, &cond, guard); 6268 #endif 6269 usax(cond, rd, rn, rm); 6270 } 6271 void Usax(Register rd, Register rn, Register rm) { Usax(al, rd, rn, rm); } 6272 6273 void Usub16(Condition cond, Register rd, Register rn, Register rm) { 6274 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6275 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6276 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6277 VIXL_ASSERT(allow_macro_instructions_); 6278 VIXL_ASSERT(OutsideITBlock()); 6279 MacroEmissionCheckScope guard(this); 6280 #ifndef PANDA_BUILD 6281 ITScope it_scope(this, &cond, guard); 6282 #else 6283 ITScope it_scope(allocator_, this, &cond, guard); 6284 #endif 6285 usub16(cond, rd, rn, rm); 6286 } 6287 void Usub16(Register rd, Register rn, Register rm) { Usub16(al, rd, rn, rm); } 6288 6289 void Usub8(Condition cond, Register rd, Register rn, Register rm) { 6290 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6291 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6292 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6293 VIXL_ASSERT(allow_macro_instructions_); 6294 VIXL_ASSERT(OutsideITBlock()); 6295 MacroEmissionCheckScope guard(this); 6296 #ifndef PANDA_BUILD 6297 ITScope it_scope(this, &cond, guard); 6298 #else 6299 ITScope it_scope(allocator_, this, &cond, guard); 6300 #endif 6301 usub8(cond, rd, rn, rm); 6302 } 6303 void Usub8(Register rd, Register rn, Register rm) { Usub8(al, rd, rn, rm); } 6304 6305 void Uxtab(Condition cond, Register rd, Register rn, const Operand& operand) { 6306 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6307 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6308 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6309 VIXL_ASSERT(allow_macro_instructions_); 6310 VIXL_ASSERT(OutsideITBlock()); 6311 MacroEmissionCheckScope guard(this); 6312 #ifndef PANDA_BUILD 6313 ITScope it_scope(this, &cond, guard); 6314 #else 6315 ITScope it_scope(allocator_, this, &cond, guard); 6316 #endif 6317 uxtab(cond, rd, rn, operand); 6318 } 6319 void Uxtab(Register rd, Register rn, const Operand& operand) { 6320 Uxtab(al, rd, rn, operand); 6321 } 6322 6323 void Uxtab16(Condition cond, 6324 Register rd, 6325 Register rn, 6326 const Operand& operand) { 6327 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6328 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6329 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6330 VIXL_ASSERT(allow_macro_instructions_); 6331 VIXL_ASSERT(OutsideITBlock()); 6332 MacroEmissionCheckScope guard(this); 6333 #ifndef PANDA_BUILD 6334 ITScope it_scope(this, &cond, guard); 6335 #else 6336 ITScope it_scope(allocator_, this, &cond, guard); 6337 #endif 6338 uxtab16(cond, rd, rn, operand); 6339 } 6340 void Uxtab16(Register rd, Register rn, const Operand& operand) { 6341 Uxtab16(al, rd, rn, operand); 6342 } 6343 6344 void Uxtah(Condition cond, Register rd, Register rn, const Operand& operand) { 6345 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6346 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6347 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6348 VIXL_ASSERT(allow_macro_instructions_); 6349 VIXL_ASSERT(OutsideITBlock()); 6350 MacroEmissionCheckScope guard(this); 6351 #ifndef PANDA_BUILD 6352 ITScope it_scope(this, &cond, guard); 6353 #else 6354 ITScope it_scope(allocator_, this, &cond, guard); 6355 #endif 6356 uxtah(cond, rd, rn, operand); 6357 } 6358 void Uxtah(Register rd, Register rn, const Operand& operand) { 6359 Uxtah(al, rd, rn, operand); 6360 } 6361 6362 void Uxtb(Condition cond, Register rd, const Operand& operand) { 6363 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6364 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6365 VIXL_ASSERT(allow_macro_instructions_); 6366 VIXL_ASSERT(OutsideITBlock()); 6367 MacroEmissionCheckScope guard(this); 6368 #ifndef PANDA_BUILD 6369 ITScope it_scope(this, &cond, guard); 6370 #else 6371 ITScope it_scope(allocator_, this, &cond, guard); 6372 #endif 6373 uxtb(cond, rd, operand); 6374 } 6375 void Uxtb(Register rd, const Operand& operand) { Uxtb(al, rd, operand); } 6376 6377 void Uxtb16(Condition cond, Register rd, const Operand& operand) { 6378 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6379 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6380 VIXL_ASSERT(allow_macro_instructions_); 6381 VIXL_ASSERT(OutsideITBlock()); 6382 MacroEmissionCheckScope guard(this); 6383 #ifndef PANDA_BUILD 6384 ITScope it_scope(this, &cond, guard); 6385 #else 6386 ITScope it_scope(allocator_, this, &cond, guard); 6387 #endif 6388 uxtb16(cond, rd, operand); 6389 } 6390 void Uxtb16(Register rd, const Operand& operand) { Uxtb16(al, rd, operand); } 6391 6392 void Uxth(Condition cond, Register rd, const Operand& operand) { 6393 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6394 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6395 VIXL_ASSERT(allow_macro_instructions_); 6396 VIXL_ASSERT(OutsideITBlock()); 6397 MacroEmissionCheckScope guard(this); 6398 #ifndef PANDA_BUILD 6399 ITScope it_scope(this, &cond, guard); 6400 #else 6401 ITScope it_scope(allocator_, this, &cond, guard); 6402 #endif 6403 uxth(cond, rd, operand); 6404 } 6405 void Uxth(Register rd, const Operand& operand) { Uxth(al, rd, operand); } 6406 6407 void Vaba( 6408 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6409 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6410 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6411 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6412 VIXL_ASSERT(allow_macro_instructions_); 6413 VIXL_ASSERT(OutsideITBlock()); 6414 MacroEmissionCheckScope guard(this); 6415 #ifndef PANDA_BUILD 6416 ITScope it_scope(this, &cond, guard); 6417 #else 6418 ITScope it_scope(allocator_, this, &cond, guard); 6419 #endif 6420 vaba(cond, dt, rd, rn, rm); 6421 } 6422 void Vaba(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6423 Vaba(al, dt, rd, rn, rm); 6424 } 6425 6426 void Vaba( 6427 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6428 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6429 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6430 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6431 VIXL_ASSERT(allow_macro_instructions_); 6432 VIXL_ASSERT(OutsideITBlock()); 6433 MacroEmissionCheckScope guard(this); 6434 #ifndef PANDA_BUILD 6435 ITScope it_scope(this, &cond, guard); 6436 #else 6437 ITScope it_scope(allocator_, this, &cond, guard); 6438 #endif 6439 vaba(cond, dt, rd, rn, rm); 6440 } 6441 void Vaba(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6442 Vaba(al, dt, rd, rn, rm); 6443 } 6444 6445 void Vabal( 6446 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 6447 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6448 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6449 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6450 VIXL_ASSERT(allow_macro_instructions_); 6451 VIXL_ASSERT(OutsideITBlock()); 6452 MacroEmissionCheckScope guard(this); 6453 #ifndef PANDA_BUILD 6454 ITScope it_scope(this, &cond, guard); 6455 #else 6456 ITScope it_scope(allocator_, this, &cond, guard); 6457 #endif 6458 vabal(cond, dt, rd, rn, rm); 6459 } 6460 void Vabal(DataType dt, QRegister rd, DRegister rn, DRegister rm) { 6461 Vabal(al, dt, rd, rn, rm); 6462 } 6463 6464 void Vabd( 6465 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6466 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6467 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6468 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6469 VIXL_ASSERT(allow_macro_instructions_); 6470 VIXL_ASSERT(OutsideITBlock()); 6471 MacroEmissionCheckScope guard(this); 6472 #ifndef PANDA_BUILD 6473 ITScope it_scope(this, &cond, guard); 6474 #else 6475 ITScope it_scope(allocator_, this, &cond, guard); 6476 #endif 6477 vabd(cond, dt, rd, rn, rm); 6478 } 6479 void Vabd(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6480 Vabd(al, dt, rd, rn, rm); 6481 } 6482 6483 void Vabd( 6484 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6485 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6486 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6487 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6488 VIXL_ASSERT(allow_macro_instructions_); 6489 VIXL_ASSERT(OutsideITBlock()); 6490 MacroEmissionCheckScope guard(this); 6491 #ifndef PANDA_BUILD 6492 ITScope it_scope(this, &cond, guard); 6493 #else 6494 ITScope it_scope(allocator_, this, &cond, guard); 6495 #endif 6496 vabd(cond, dt, rd, rn, rm); 6497 } 6498 void Vabd(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6499 Vabd(al, dt, rd, rn, rm); 6500 } 6501 6502 void Vabdl( 6503 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 6504 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6505 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6506 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6507 VIXL_ASSERT(allow_macro_instructions_); 6508 VIXL_ASSERT(OutsideITBlock()); 6509 MacroEmissionCheckScope guard(this); 6510 #ifndef PANDA_BUILD 6511 ITScope it_scope(this, &cond, guard); 6512 #else 6513 ITScope it_scope(allocator_, this, &cond, guard); 6514 #endif 6515 vabdl(cond, dt, rd, rn, rm); 6516 } 6517 void Vabdl(DataType dt, QRegister rd, DRegister rn, DRegister rm) { 6518 Vabdl(al, dt, rd, rn, rm); 6519 } 6520 6521 void Vabs(Condition cond, DataType dt, DRegister rd, DRegister rm) { 6522 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6523 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6524 VIXL_ASSERT(allow_macro_instructions_); 6525 VIXL_ASSERT(OutsideITBlock()); 6526 MacroEmissionCheckScope guard(this); 6527 #ifndef PANDA_BUILD 6528 ITScope it_scope(this, &cond, guard); 6529 #else 6530 ITScope it_scope(allocator_, this, &cond, guard); 6531 #endif 6532 vabs(cond, dt, rd, rm); 6533 } 6534 void Vabs(DataType dt, DRegister rd, DRegister rm) { Vabs(al, dt, rd, rm); } 6535 6536 void Vabs(Condition cond, DataType dt, QRegister rd, QRegister rm) { 6537 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6538 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6539 VIXL_ASSERT(allow_macro_instructions_); 6540 VIXL_ASSERT(OutsideITBlock()); 6541 MacroEmissionCheckScope guard(this); 6542 #ifndef PANDA_BUILD 6543 ITScope it_scope(this, &cond, guard); 6544 #else 6545 ITScope it_scope(allocator_, this, &cond, guard); 6546 #endif 6547 vabs(cond, dt, rd, rm); 6548 } 6549 void Vabs(DataType dt, QRegister rd, QRegister rm) { Vabs(al, dt, rd, rm); } 6550 6551 void Vabs(Condition cond, DataType dt, SRegister rd, SRegister rm) { 6552 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6553 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6554 VIXL_ASSERT(allow_macro_instructions_); 6555 VIXL_ASSERT(OutsideITBlock()); 6556 MacroEmissionCheckScope guard(this); 6557 #ifndef PANDA_BUILD 6558 ITScope it_scope(this, &cond, guard); 6559 #else 6560 ITScope it_scope(allocator_, this, &cond, guard); 6561 #endif 6562 vabs(cond, dt, rd, rm); 6563 } 6564 void Vabs(DataType dt, SRegister rd, SRegister rm) { Vabs(al, dt, rd, rm); } 6565 6566 void Vacge( 6567 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6568 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6569 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6570 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6571 VIXL_ASSERT(allow_macro_instructions_); 6572 VIXL_ASSERT(OutsideITBlock()); 6573 MacroEmissionCheckScope guard(this); 6574 #ifndef PANDA_BUILD 6575 ITScope it_scope(this, &cond, guard); 6576 #else 6577 ITScope it_scope(allocator_, this, &cond, guard); 6578 #endif 6579 vacge(cond, dt, rd, rn, rm); 6580 } 6581 void Vacge(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6582 Vacge(al, dt, rd, rn, rm); 6583 } 6584 6585 void Vacge( 6586 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6587 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6588 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6589 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6590 VIXL_ASSERT(allow_macro_instructions_); 6591 VIXL_ASSERT(OutsideITBlock()); 6592 MacroEmissionCheckScope guard(this); 6593 #ifndef PANDA_BUILD 6594 ITScope it_scope(this, &cond, guard); 6595 #else 6596 ITScope it_scope(allocator_, this, &cond, guard); 6597 #endif 6598 vacge(cond, dt, rd, rn, rm); 6599 } 6600 void Vacge(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6601 Vacge(al, dt, rd, rn, rm); 6602 } 6603 6604 void Vacgt( 6605 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6606 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6607 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6608 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6609 VIXL_ASSERT(allow_macro_instructions_); 6610 VIXL_ASSERT(OutsideITBlock()); 6611 MacroEmissionCheckScope guard(this); 6612 #ifndef PANDA_BUILD 6613 ITScope it_scope(this, &cond, guard); 6614 #else 6615 ITScope it_scope(allocator_, this, &cond, guard); 6616 #endif 6617 vacgt(cond, dt, rd, rn, rm); 6618 } 6619 void Vacgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6620 Vacgt(al, dt, rd, rn, rm); 6621 } 6622 6623 void Vacgt( 6624 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6625 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6626 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6627 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6628 VIXL_ASSERT(allow_macro_instructions_); 6629 VIXL_ASSERT(OutsideITBlock()); 6630 MacroEmissionCheckScope guard(this); 6631 #ifndef PANDA_BUILD 6632 ITScope it_scope(this, &cond, guard); 6633 #else 6634 ITScope it_scope(allocator_, this, &cond, guard); 6635 #endif 6636 vacgt(cond, dt, rd, rn, rm); 6637 } 6638 void Vacgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6639 Vacgt(al, dt, rd, rn, rm); 6640 } 6641 6642 void Vacle( 6643 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6644 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6645 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6646 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6647 VIXL_ASSERT(allow_macro_instructions_); 6648 VIXL_ASSERT(OutsideITBlock()); 6649 MacroEmissionCheckScope guard(this); 6650 #ifndef PANDA_BUILD 6651 ITScope it_scope(this, &cond, guard); 6652 #else 6653 ITScope it_scope(allocator_, this, &cond, guard); 6654 #endif 6655 vacle(cond, dt, rd, rn, rm); 6656 } 6657 void Vacle(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6658 Vacle(al, dt, rd, rn, rm); 6659 } 6660 6661 void Vacle( 6662 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6663 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6664 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6665 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6666 VIXL_ASSERT(allow_macro_instructions_); 6667 VIXL_ASSERT(OutsideITBlock()); 6668 MacroEmissionCheckScope guard(this); 6669 #ifndef PANDA_BUILD 6670 ITScope it_scope(this, &cond, guard); 6671 #else 6672 ITScope it_scope(allocator_, this, &cond, guard); 6673 #endif 6674 vacle(cond, dt, rd, rn, rm); 6675 } 6676 void Vacle(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6677 Vacle(al, dt, rd, rn, rm); 6678 } 6679 6680 void Vaclt( 6681 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6682 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6683 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6684 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6685 VIXL_ASSERT(allow_macro_instructions_); 6686 VIXL_ASSERT(OutsideITBlock()); 6687 MacroEmissionCheckScope guard(this); 6688 #ifndef PANDA_BUILD 6689 ITScope it_scope(this, &cond, guard); 6690 #else 6691 ITScope it_scope(allocator_, this, &cond, guard); 6692 #endif 6693 vaclt(cond, dt, rd, rn, rm); 6694 } 6695 void Vaclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6696 Vaclt(al, dt, rd, rn, rm); 6697 } 6698 6699 void Vaclt( 6700 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6701 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6702 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6703 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6704 VIXL_ASSERT(allow_macro_instructions_); 6705 VIXL_ASSERT(OutsideITBlock()); 6706 MacroEmissionCheckScope guard(this); 6707 #ifndef PANDA_BUILD 6708 ITScope it_scope(this, &cond, guard); 6709 #else 6710 ITScope it_scope(allocator_, this, &cond, guard); 6711 #endif 6712 vaclt(cond, dt, rd, rn, rm); 6713 } 6714 void Vaclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6715 Vaclt(al, dt, rd, rn, rm); 6716 } 6717 6718 void Vadd( 6719 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6720 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6721 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6722 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6723 VIXL_ASSERT(allow_macro_instructions_); 6724 VIXL_ASSERT(OutsideITBlock()); 6725 MacroEmissionCheckScope guard(this); 6726 #ifndef PANDA_BUILD 6727 ITScope it_scope(this, &cond, guard); 6728 #else 6729 ITScope it_scope(allocator_, this, &cond, guard); 6730 #endif 6731 vadd(cond, dt, rd, rn, rm); 6732 } 6733 void Vadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6734 Vadd(al, dt, rd, rn, rm); 6735 } 6736 6737 void Vadd( 6738 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6739 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6740 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6741 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6742 VIXL_ASSERT(allow_macro_instructions_); 6743 VIXL_ASSERT(OutsideITBlock()); 6744 MacroEmissionCheckScope guard(this); 6745 #ifndef PANDA_BUILD 6746 ITScope it_scope(this, &cond, guard); 6747 #else 6748 ITScope it_scope(allocator_, this, &cond, guard); 6749 #endif 6750 vadd(cond, dt, rd, rn, rm); 6751 } 6752 void Vadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6753 Vadd(al, dt, rd, rn, rm); 6754 } 6755 6756 void Vadd( 6757 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 6758 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6759 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6760 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6761 VIXL_ASSERT(allow_macro_instructions_); 6762 VIXL_ASSERT(OutsideITBlock()); 6763 MacroEmissionCheckScope guard(this); 6764 #ifndef PANDA_BUILD 6765 ITScope it_scope(this, &cond, guard); 6766 #else 6767 ITScope it_scope(allocator_, this, &cond, guard); 6768 #endif 6769 vadd(cond, dt, rd, rn, rm); 6770 } 6771 void Vadd(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 6772 Vadd(al, dt, rd, rn, rm); 6773 } 6774 6775 void Vaddhn( 6776 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 6777 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6778 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6779 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6780 VIXL_ASSERT(allow_macro_instructions_); 6781 VIXL_ASSERT(OutsideITBlock()); 6782 MacroEmissionCheckScope guard(this); 6783 #ifndef PANDA_BUILD 6784 ITScope it_scope(this, &cond, guard); 6785 #else 6786 ITScope it_scope(allocator_, this, &cond, guard); 6787 #endif 6788 vaddhn(cond, dt, rd, rn, rm); 6789 } 6790 void Vaddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) { 6791 Vaddhn(al, dt, rd, rn, rm); 6792 } 6793 6794 void Vaddl( 6795 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 6796 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6797 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6798 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6799 VIXL_ASSERT(allow_macro_instructions_); 6800 VIXL_ASSERT(OutsideITBlock()); 6801 MacroEmissionCheckScope guard(this); 6802 #ifndef PANDA_BUILD 6803 ITScope it_scope(this, &cond, guard); 6804 #else 6805 ITScope it_scope(allocator_, this, &cond, guard); 6806 #endif 6807 vaddl(cond, dt, rd, rn, rm); 6808 } 6809 void Vaddl(DataType dt, QRegister rd, DRegister rn, DRegister rm) { 6810 Vaddl(al, dt, rd, rn, rm); 6811 } 6812 6813 void Vaddw( 6814 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) { 6815 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6816 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6817 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6818 VIXL_ASSERT(allow_macro_instructions_); 6819 VIXL_ASSERT(OutsideITBlock()); 6820 MacroEmissionCheckScope guard(this); 6821 #ifndef PANDA_BUILD 6822 ITScope it_scope(this, &cond, guard); 6823 #else 6824 ITScope it_scope(allocator_, this, &cond, guard); 6825 #endif 6826 vaddw(cond, dt, rd, rn, rm); 6827 } 6828 void Vaddw(DataType dt, QRegister rd, QRegister rn, DRegister rm) { 6829 Vaddw(al, dt, rd, rn, rm); 6830 } 6831 6832 void Vand(Condition cond, 6833 DataType dt, 6834 DRegister rd, 6835 DRegister rn, 6836 const DOperand& operand) { 6837 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6838 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6839 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6840 VIXL_ASSERT(allow_macro_instructions_); 6841 VIXL_ASSERT(OutsideITBlock()); 6842 MacroEmissionCheckScope guard(this); 6843 #ifndef PANDA_BUILD 6844 ITScope it_scope(this, &cond, guard); 6845 #else 6846 ITScope it_scope(allocator_, this, &cond, guard); 6847 #endif 6848 vand(cond, dt, rd, rn, operand); 6849 } 6850 void Vand(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) { 6851 Vand(al, dt, rd, rn, operand); 6852 } 6853 6854 void Vand(Condition cond, 6855 DataType dt, 6856 QRegister rd, 6857 QRegister rn, 6858 const QOperand& operand) { 6859 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6860 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6861 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6862 VIXL_ASSERT(allow_macro_instructions_); 6863 VIXL_ASSERT(OutsideITBlock()); 6864 MacroEmissionCheckScope guard(this); 6865 #ifndef PANDA_BUILD 6866 ITScope it_scope(this, &cond, guard); 6867 #else 6868 ITScope it_scope(allocator_, this, &cond, guard); 6869 #endif 6870 vand(cond, dt, rd, rn, operand); 6871 } 6872 void Vand(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) { 6873 Vand(al, dt, rd, rn, operand); 6874 } 6875 6876 void Vbic(Condition cond, 6877 DataType dt, 6878 DRegister rd, 6879 DRegister rn, 6880 const DOperand& operand) { 6881 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6882 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6883 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6884 VIXL_ASSERT(allow_macro_instructions_); 6885 VIXL_ASSERT(OutsideITBlock()); 6886 MacroEmissionCheckScope guard(this); 6887 #ifndef PANDA_BUILD 6888 ITScope it_scope(this, &cond, guard); 6889 #else 6890 ITScope it_scope(allocator_, this, &cond, guard); 6891 #endif 6892 vbic(cond, dt, rd, rn, operand); 6893 } 6894 void Vbic(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) { 6895 Vbic(al, dt, rd, rn, operand); 6896 } 6897 6898 void Vbic(Condition cond, 6899 DataType dt, 6900 QRegister rd, 6901 QRegister rn, 6902 const QOperand& operand) { 6903 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6904 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6905 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 6906 VIXL_ASSERT(allow_macro_instructions_); 6907 VIXL_ASSERT(OutsideITBlock()); 6908 MacroEmissionCheckScope guard(this); 6909 #ifndef PANDA_BUILD 6910 ITScope it_scope(this, &cond, guard); 6911 #else 6912 ITScope it_scope(allocator_, this, &cond, guard); 6913 #endif 6914 vbic(cond, dt, rd, rn, operand); 6915 } 6916 void Vbic(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) { 6917 Vbic(al, dt, rd, rn, operand); 6918 } 6919 6920 void Vbif( 6921 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6922 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6923 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6924 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6925 VIXL_ASSERT(allow_macro_instructions_); 6926 VIXL_ASSERT(OutsideITBlock()); 6927 MacroEmissionCheckScope guard(this); 6928 #ifndef PANDA_BUILD 6929 ITScope it_scope(this, &cond, guard); 6930 #else 6931 ITScope it_scope(allocator_, this, &cond, guard); 6932 #endif 6933 vbif(cond, dt, rd, rn, rm); 6934 } 6935 void Vbif(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6936 Vbif(al, dt, rd, rn, rm); 6937 } 6938 void Vbif(Condition cond, DRegister rd, DRegister rn, DRegister rm) { 6939 Vbif(cond, kDataTypeValueNone, rd, rn, rm); 6940 } 6941 void Vbif(DRegister rd, DRegister rn, DRegister rm) { 6942 Vbif(al, kDataTypeValueNone, rd, rn, rm); 6943 } 6944 6945 void Vbif( 6946 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6947 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6948 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6949 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6950 VIXL_ASSERT(allow_macro_instructions_); 6951 VIXL_ASSERT(OutsideITBlock()); 6952 MacroEmissionCheckScope guard(this); 6953 #ifndef PANDA_BUILD 6954 ITScope it_scope(this, &cond, guard); 6955 #else 6956 ITScope it_scope(allocator_, this, &cond, guard); 6957 #endif 6958 vbif(cond, dt, rd, rn, rm); 6959 } 6960 void Vbif(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6961 Vbif(al, dt, rd, rn, rm); 6962 } 6963 void Vbif(Condition cond, QRegister rd, QRegister rn, QRegister rm) { 6964 Vbif(cond, kDataTypeValueNone, rd, rn, rm); 6965 } 6966 void Vbif(QRegister rd, QRegister rn, QRegister rm) { 6967 Vbif(al, kDataTypeValueNone, rd, rn, rm); 6968 } 6969 6970 void Vbit( 6971 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6972 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6973 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6974 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 6975 VIXL_ASSERT(allow_macro_instructions_); 6976 VIXL_ASSERT(OutsideITBlock()); 6977 MacroEmissionCheckScope guard(this); 6978 #ifndef PANDA_BUILD 6979 ITScope it_scope(this, &cond, guard); 6980 #else 6981 ITScope it_scope(allocator_, this, &cond, guard); 6982 #endif 6983 vbit(cond, dt, rd, rn, rm); 6984 } 6985 void Vbit(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6986 Vbit(al, dt, rd, rn, rm); 6987 } 6988 void Vbit(Condition cond, DRegister rd, DRegister rn, DRegister rm) { 6989 Vbit(cond, kDataTypeValueNone, rd, rn, rm); 6990 } 6991 void Vbit(DRegister rd, DRegister rn, DRegister rm) { 6992 Vbit(al, kDataTypeValueNone, rd, rn, rm); 6993 } 6994 6995 void Vbit( 6996 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6997 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 6998 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 6999 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7000 VIXL_ASSERT(allow_macro_instructions_); 7001 VIXL_ASSERT(OutsideITBlock()); 7002 MacroEmissionCheckScope guard(this); 7003 #ifndef PANDA_BUILD 7004 ITScope it_scope(this, &cond, guard); 7005 #else 7006 ITScope it_scope(allocator_, this, &cond, guard); 7007 #endif 7008 vbit(cond, dt, rd, rn, rm); 7009 } 7010 void Vbit(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7011 Vbit(al, dt, rd, rn, rm); 7012 } 7013 void Vbit(Condition cond, QRegister rd, QRegister rn, QRegister rm) { 7014 Vbit(cond, kDataTypeValueNone, rd, rn, rm); 7015 } 7016 void Vbit(QRegister rd, QRegister rn, QRegister rm) { 7017 Vbit(al, kDataTypeValueNone, rd, rn, rm); 7018 } 7019 7020 void Vbsl( 7021 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7022 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7023 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7024 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7025 VIXL_ASSERT(allow_macro_instructions_); 7026 VIXL_ASSERT(OutsideITBlock()); 7027 MacroEmissionCheckScope guard(this); 7028 #ifndef PANDA_BUILD 7029 ITScope it_scope(this, &cond, guard); 7030 #else 7031 ITScope it_scope(allocator_, this, &cond, guard); 7032 #endif 7033 vbsl(cond, dt, rd, rn, rm); 7034 } 7035 void Vbsl(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7036 Vbsl(al, dt, rd, rn, rm); 7037 } 7038 void Vbsl(Condition cond, DRegister rd, DRegister rn, DRegister rm) { 7039 Vbsl(cond, kDataTypeValueNone, rd, rn, rm); 7040 } 7041 void Vbsl(DRegister rd, DRegister rn, DRegister rm) { 7042 Vbsl(al, kDataTypeValueNone, rd, rn, rm); 7043 } 7044 7045 void Vbsl( 7046 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7047 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7048 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7049 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7050 VIXL_ASSERT(allow_macro_instructions_); 7051 VIXL_ASSERT(OutsideITBlock()); 7052 MacroEmissionCheckScope guard(this); 7053 #ifndef PANDA_BUILD 7054 ITScope it_scope(this, &cond, guard); 7055 #else 7056 ITScope it_scope(allocator_, this, &cond, guard); 7057 #endif 7058 vbsl(cond, dt, rd, rn, rm); 7059 } 7060 void Vbsl(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7061 Vbsl(al, dt, rd, rn, rm); 7062 } 7063 void Vbsl(Condition cond, QRegister rd, QRegister rn, QRegister rm) { 7064 Vbsl(cond, kDataTypeValueNone, rd, rn, rm); 7065 } 7066 void Vbsl(QRegister rd, QRegister rn, QRegister rm) { 7067 Vbsl(al, kDataTypeValueNone, rd, rn, rm); 7068 } 7069 7070 void Vceq(Condition cond, 7071 DataType dt, 7072 DRegister rd, 7073 DRegister rm, 7074 const DOperand& operand) { 7075 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7076 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7077 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7078 VIXL_ASSERT(allow_macro_instructions_); 7079 VIXL_ASSERT(OutsideITBlock()); 7080 MacroEmissionCheckScope guard(this); 7081 #ifndef PANDA_BUILD 7082 ITScope it_scope(this, &cond, guard); 7083 #else 7084 ITScope it_scope(allocator_, this, &cond, guard); 7085 #endif 7086 vceq(cond, dt, rd, rm, operand); 7087 } 7088 void Vceq(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 7089 Vceq(al, dt, rd, rm, operand); 7090 } 7091 7092 void Vceq(Condition cond, 7093 DataType dt, 7094 QRegister rd, 7095 QRegister rm, 7096 const QOperand& operand) { 7097 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7098 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7099 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7100 VIXL_ASSERT(allow_macro_instructions_); 7101 VIXL_ASSERT(OutsideITBlock()); 7102 MacroEmissionCheckScope guard(this); 7103 #ifndef PANDA_BUILD 7104 ITScope it_scope(this, &cond, guard); 7105 #else 7106 ITScope it_scope(allocator_, this, &cond, guard); 7107 #endif 7108 vceq(cond, dt, rd, rm, operand); 7109 } 7110 void Vceq(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 7111 Vceq(al, dt, rd, rm, operand); 7112 } 7113 7114 void Vceq( 7115 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7116 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7117 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7118 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7119 VIXL_ASSERT(allow_macro_instructions_); 7120 VIXL_ASSERT(OutsideITBlock()); 7121 MacroEmissionCheckScope guard(this); 7122 #ifndef PANDA_BUILD 7123 ITScope it_scope(this, &cond, guard); 7124 #else 7125 ITScope it_scope(allocator_, this, &cond, guard); 7126 #endif 7127 vceq(cond, dt, rd, rn, rm); 7128 } 7129 void Vceq(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7130 Vceq(al, dt, rd, rn, rm); 7131 } 7132 7133 void Vceq( 7134 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7135 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7136 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7137 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7138 VIXL_ASSERT(allow_macro_instructions_); 7139 VIXL_ASSERT(OutsideITBlock()); 7140 MacroEmissionCheckScope guard(this); 7141 #ifndef PANDA_BUILD 7142 ITScope it_scope(this, &cond, guard); 7143 #else 7144 ITScope it_scope(allocator_, this, &cond, guard); 7145 #endif 7146 vceq(cond, dt, rd, rn, rm); 7147 } 7148 void Vceq(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7149 Vceq(al, dt, rd, rn, rm); 7150 } 7151 7152 void Vcge(Condition cond, 7153 DataType dt, 7154 DRegister rd, 7155 DRegister rm, 7156 const DOperand& operand) { 7157 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7158 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7159 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7160 VIXL_ASSERT(allow_macro_instructions_); 7161 VIXL_ASSERT(OutsideITBlock()); 7162 MacroEmissionCheckScope guard(this); 7163 #ifndef PANDA_BUILD 7164 ITScope it_scope(this, &cond, guard); 7165 #else 7166 ITScope it_scope(allocator_, this, &cond, guard); 7167 #endif 7168 vcge(cond, dt, rd, rm, operand); 7169 } 7170 void Vcge(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 7171 Vcge(al, dt, rd, rm, operand); 7172 } 7173 7174 void Vcge(Condition cond, 7175 DataType dt, 7176 QRegister rd, 7177 QRegister rm, 7178 const QOperand& operand) { 7179 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7180 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7181 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7182 VIXL_ASSERT(allow_macro_instructions_); 7183 VIXL_ASSERT(OutsideITBlock()); 7184 MacroEmissionCheckScope guard(this); 7185 #ifndef PANDA_BUILD 7186 ITScope it_scope(this, &cond, guard); 7187 #else 7188 ITScope it_scope(allocator_, this, &cond, guard); 7189 #endif 7190 vcge(cond, dt, rd, rm, operand); 7191 } 7192 void Vcge(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 7193 Vcge(al, dt, rd, rm, operand); 7194 } 7195 7196 void Vcge( 7197 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7198 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7199 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7200 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7201 VIXL_ASSERT(allow_macro_instructions_); 7202 VIXL_ASSERT(OutsideITBlock()); 7203 MacroEmissionCheckScope guard(this); 7204 #ifndef PANDA_BUILD 7205 ITScope it_scope(this, &cond, guard); 7206 #else 7207 ITScope it_scope(allocator_, this, &cond, guard); 7208 #endif 7209 vcge(cond, dt, rd, rn, rm); 7210 } 7211 void Vcge(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7212 Vcge(al, dt, rd, rn, rm); 7213 } 7214 7215 void Vcge( 7216 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7217 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7218 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7219 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7220 VIXL_ASSERT(allow_macro_instructions_); 7221 VIXL_ASSERT(OutsideITBlock()); 7222 MacroEmissionCheckScope guard(this); 7223 #ifndef PANDA_BUILD 7224 ITScope it_scope(this, &cond, guard); 7225 #else 7226 ITScope it_scope(allocator_, this, &cond, guard); 7227 #endif 7228 vcge(cond, dt, rd, rn, rm); 7229 } 7230 void Vcge(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7231 Vcge(al, dt, rd, rn, rm); 7232 } 7233 7234 void Vcgt(Condition cond, 7235 DataType dt, 7236 DRegister rd, 7237 DRegister rm, 7238 const DOperand& operand) { 7239 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7240 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7241 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7242 VIXL_ASSERT(allow_macro_instructions_); 7243 VIXL_ASSERT(OutsideITBlock()); 7244 MacroEmissionCheckScope guard(this); 7245 #ifndef PANDA_BUILD 7246 ITScope it_scope(this, &cond, guard); 7247 #else 7248 ITScope it_scope(allocator_, this, &cond, guard); 7249 #endif 7250 vcgt(cond, dt, rd, rm, operand); 7251 } 7252 void Vcgt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 7253 Vcgt(al, dt, rd, rm, operand); 7254 } 7255 7256 void Vcgt(Condition cond, 7257 DataType dt, 7258 QRegister rd, 7259 QRegister rm, 7260 const QOperand& operand) { 7261 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7262 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7263 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7264 VIXL_ASSERT(allow_macro_instructions_); 7265 VIXL_ASSERT(OutsideITBlock()); 7266 MacroEmissionCheckScope guard(this); 7267 #ifndef PANDA_BUILD 7268 ITScope it_scope(this, &cond, guard); 7269 #else 7270 ITScope it_scope(allocator_, this, &cond, guard); 7271 #endif 7272 vcgt(cond, dt, rd, rm, operand); 7273 } 7274 void Vcgt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 7275 Vcgt(al, dt, rd, rm, operand); 7276 } 7277 7278 void Vcgt( 7279 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7280 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7281 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7282 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7283 VIXL_ASSERT(allow_macro_instructions_); 7284 VIXL_ASSERT(OutsideITBlock()); 7285 MacroEmissionCheckScope guard(this); 7286 #ifndef PANDA_BUILD 7287 ITScope it_scope(this, &cond, guard); 7288 #else 7289 ITScope it_scope(allocator_, this, &cond, guard); 7290 #endif 7291 vcgt(cond, dt, rd, rn, rm); 7292 } 7293 void Vcgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7294 Vcgt(al, dt, rd, rn, rm); 7295 } 7296 7297 void Vcgt( 7298 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7299 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7300 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7301 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7302 VIXL_ASSERT(allow_macro_instructions_); 7303 VIXL_ASSERT(OutsideITBlock()); 7304 MacroEmissionCheckScope guard(this); 7305 #ifndef PANDA_BUILD 7306 ITScope it_scope(this, &cond, guard); 7307 #else 7308 ITScope it_scope(allocator_, this, &cond, guard); 7309 #endif 7310 vcgt(cond, dt, rd, rn, rm); 7311 } 7312 void Vcgt(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7313 Vcgt(al, dt, rd, rn, rm); 7314 } 7315 7316 void Vcle(Condition cond, 7317 DataType dt, 7318 DRegister rd, 7319 DRegister rm, 7320 const DOperand& operand) { 7321 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7322 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7323 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7324 VIXL_ASSERT(allow_macro_instructions_); 7325 VIXL_ASSERT(OutsideITBlock()); 7326 MacroEmissionCheckScope guard(this); 7327 #ifndef PANDA_BUILD 7328 ITScope it_scope(this, &cond, guard); 7329 #else 7330 ITScope it_scope(allocator_, this, &cond, guard); 7331 #endif 7332 vcle(cond, dt, rd, rm, operand); 7333 } 7334 void Vcle(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 7335 Vcle(al, dt, rd, rm, operand); 7336 } 7337 7338 void Vcle(Condition cond, 7339 DataType dt, 7340 QRegister rd, 7341 QRegister rm, 7342 const QOperand& operand) { 7343 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7344 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7345 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7346 VIXL_ASSERT(allow_macro_instructions_); 7347 VIXL_ASSERT(OutsideITBlock()); 7348 MacroEmissionCheckScope guard(this); 7349 #ifndef PANDA_BUILD 7350 ITScope it_scope(this, &cond, guard); 7351 #else 7352 ITScope it_scope(allocator_, this, &cond, guard); 7353 #endif 7354 vcle(cond, dt, rd, rm, operand); 7355 } 7356 void Vcle(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 7357 Vcle(al, dt, rd, rm, operand); 7358 } 7359 7360 void Vcle( 7361 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7362 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7363 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7364 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7365 VIXL_ASSERT(allow_macro_instructions_); 7366 VIXL_ASSERT(OutsideITBlock()); 7367 MacroEmissionCheckScope guard(this); 7368 #ifndef PANDA_BUILD 7369 ITScope it_scope(this, &cond, guard); 7370 #else 7371 ITScope it_scope(allocator_, this, &cond, guard); 7372 #endif 7373 vcle(cond, dt, rd, rn, rm); 7374 } 7375 void Vcle(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7376 Vcle(al, dt, rd, rn, rm); 7377 } 7378 7379 void Vcle( 7380 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7381 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7382 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7383 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7384 VIXL_ASSERT(allow_macro_instructions_); 7385 VIXL_ASSERT(OutsideITBlock()); 7386 MacroEmissionCheckScope guard(this); 7387 #ifndef PANDA_BUILD 7388 ITScope it_scope(this, &cond, guard); 7389 #else 7390 ITScope it_scope(allocator_, this, &cond, guard); 7391 #endif 7392 vcle(cond, dt, rd, rn, rm); 7393 } 7394 void Vcle(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7395 Vcle(al, dt, rd, rn, rm); 7396 } 7397 7398 void Vcls(Condition cond, DataType dt, DRegister rd, DRegister rm) { 7399 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7400 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7401 VIXL_ASSERT(allow_macro_instructions_); 7402 VIXL_ASSERT(OutsideITBlock()); 7403 MacroEmissionCheckScope guard(this); 7404 #ifndef PANDA_BUILD 7405 ITScope it_scope(this, &cond, guard); 7406 #else 7407 ITScope it_scope(allocator_, this, &cond, guard); 7408 #endif 7409 vcls(cond, dt, rd, rm); 7410 } 7411 void Vcls(DataType dt, DRegister rd, DRegister rm) { Vcls(al, dt, rd, rm); } 7412 7413 void Vcls(Condition cond, DataType dt, QRegister rd, QRegister rm) { 7414 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7415 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7416 VIXL_ASSERT(allow_macro_instructions_); 7417 VIXL_ASSERT(OutsideITBlock()); 7418 MacroEmissionCheckScope guard(this); 7419 #ifndef PANDA_BUILD 7420 ITScope it_scope(this, &cond, guard); 7421 #else 7422 ITScope it_scope(allocator_, this, &cond, guard); 7423 #endif 7424 vcls(cond, dt, rd, rm); 7425 } 7426 void Vcls(DataType dt, QRegister rd, QRegister rm) { Vcls(al, dt, rd, rm); } 7427 7428 void Vclt(Condition cond, 7429 DataType dt, 7430 DRegister rd, 7431 DRegister rm, 7432 const DOperand& operand) { 7433 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7434 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7435 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7436 VIXL_ASSERT(allow_macro_instructions_); 7437 VIXL_ASSERT(OutsideITBlock()); 7438 MacroEmissionCheckScope guard(this); 7439 #ifndef PANDA_BUILD 7440 ITScope it_scope(this, &cond, guard); 7441 #else 7442 ITScope it_scope(allocator_, this, &cond, guard); 7443 #endif 7444 vclt(cond, dt, rd, rm, operand); 7445 } 7446 void Vclt(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 7447 Vclt(al, dt, rd, rm, operand); 7448 } 7449 7450 void Vclt(Condition cond, 7451 DataType dt, 7452 QRegister rd, 7453 QRegister rm, 7454 const QOperand& operand) { 7455 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7456 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7457 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7458 VIXL_ASSERT(allow_macro_instructions_); 7459 VIXL_ASSERT(OutsideITBlock()); 7460 MacroEmissionCheckScope guard(this); 7461 #ifndef PANDA_BUILD 7462 ITScope it_scope(this, &cond, guard); 7463 #else 7464 ITScope it_scope(allocator_, this, &cond, guard); 7465 #endif 7466 vclt(cond, dt, rd, rm, operand); 7467 } 7468 void Vclt(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 7469 Vclt(al, dt, rd, rm, operand); 7470 } 7471 7472 void Vclt( 7473 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7474 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7475 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7476 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7477 VIXL_ASSERT(allow_macro_instructions_); 7478 VIXL_ASSERT(OutsideITBlock()); 7479 MacroEmissionCheckScope guard(this); 7480 #ifndef PANDA_BUILD 7481 ITScope it_scope(this, &cond, guard); 7482 #else 7483 ITScope it_scope(allocator_, this, &cond, guard); 7484 #endif 7485 vclt(cond, dt, rd, rn, rm); 7486 } 7487 void Vclt(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 7488 Vclt(al, dt, rd, rn, rm); 7489 } 7490 7491 void Vclt( 7492 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7493 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7494 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 7495 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7496 VIXL_ASSERT(allow_macro_instructions_); 7497 VIXL_ASSERT(OutsideITBlock()); 7498 MacroEmissionCheckScope guard(this); 7499 #ifndef PANDA_BUILD 7500 ITScope it_scope(this, &cond, guard); 7501 #else 7502 ITScope it_scope(allocator_, this, &cond, guard); 7503 #endif 7504 vclt(cond, dt, rd, rn, rm); 7505 } 7506 void Vclt(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 7507 Vclt(al, dt, rd, rn, rm); 7508 } 7509 7510 void Vclz(Condition cond, DataType dt, DRegister rd, DRegister rm) { 7511 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7512 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7513 VIXL_ASSERT(allow_macro_instructions_); 7514 VIXL_ASSERT(OutsideITBlock()); 7515 MacroEmissionCheckScope guard(this); 7516 #ifndef PANDA_BUILD 7517 ITScope it_scope(this, &cond, guard); 7518 #else 7519 ITScope it_scope(allocator_, this, &cond, guard); 7520 #endif 7521 vclz(cond, dt, rd, rm); 7522 } 7523 void Vclz(DataType dt, DRegister rd, DRegister rm) { Vclz(al, dt, rd, rm); } 7524 7525 void Vclz(Condition cond, DataType dt, QRegister rd, QRegister rm) { 7526 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7527 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7528 VIXL_ASSERT(allow_macro_instructions_); 7529 VIXL_ASSERT(OutsideITBlock()); 7530 MacroEmissionCheckScope guard(this); 7531 #ifndef PANDA_BUILD 7532 ITScope it_scope(this, &cond, guard); 7533 #else 7534 ITScope it_scope(allocator_, this, &cond, guard); 7535 #endif 7536 vclz(cond, dt, rd, rm); 7537 } 7538 void Vclz(DataType dt, QRegister rd, QRegister rm) { Vclz(al, dt, rd, rm); } 7539 7540 void Vcmp(Condition cond, 7541 DataType dt, 7542 SRegister rd, 7543 const SOperand& operand) { 7544 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7545 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7546 VIXL_ASSERT(allow_macro_instructions_); 7547 VIXL_ASSERT(OutsideITBlock()); 7548 MacroEmissionCheckScope guard(this); 7549 #ifndef PANDA_BUILD 7550 ITScope it_scope(this, &cond, guard); 7551 #else 7552 ITScope it_scope(allocator_, this, &cond, guard); 7553 #endif 7554 vcmp(cond, dt, rd, operand); 7555 } 7556 void Vcmp(DataType dt, SRegister rd, const SOperand& operand) { 7557 Vcmp(al, dt, rd, operand); 7558 } 7559 7560 void Vcmp(Condition cond, 7561 DataType dt, 7562 DRegister rd, 7563 const DOperand& operand) { 7564 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7565 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7566 VIXL_ASSERT(allow_macro_instructions_); 7567 VIXL_ASSERT(OutsideITBlock()); 7568 MacroEmissionCheckScope guard(this); 7569 #ifndef PANDA_BUILD 7570 ITScope it_scope(this, &cond, guard); 7571 #else 7572 ITScope it_scope(allocator_, this, &cond, guard); 7573 #endif 7574 vcmp(cond, dt, rd, operand); 7575 } 7576 void Vcmp(DataType dt, DRegister rd, const DOperand& operand) { 7577 Vcmp(al, dt, rd, operand); 7578 } 7579 7580 void Vcmpe(Condition cond, 7581 DataType dt, 7582 SRegister rd, 7583 const SOperand& operand) { 7584 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7585 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7586 VIXL_ASSERT(allow_macro_instructions_); 7587 VIXL_ASSERT(OutsideITBlock()); 7588 MacroEmissionCheckScope guard(this); 7589 #ifndef PANDA_BUILD 7590 ITScope it_scope(this, &cond, guard); 7591 #else 7592 ITScope it_scope(allocator_, this, &cond, guard); 7593 #endif 7594 vcmpe(cond, dt, rd, operand); 7595 } 7596 void Vcmpe(DataType dt, SRegister rd, const SOperand& operand) { 7597 Vcmpe(al, dt, rd, operand); 7598 } 7599 7600 void Vcmpe(Condition cond, 7601 DataType dt, 7602 DRegister rd, 7603 const DOperand& operand) { 7604 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7605 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 7606 VIXL_ASSERT(allow_macro_instructions_); 7607 VIXL_ASSERT(OutsideITBlock()); 7608 MacroEmissionCheckScope guard(this); 7609 #ifndef PANDA_BUILD 7610 ITScope it_scope(this, &cond, guard); 7611 #else 7612 ITScope it_scope(allocator_, this, &cond, guard); 7613 #endif 7614 vcmpe(cond, dt, rd, operand); 7615 } 7616 void Vcmpe(DataType dt, DRegister rd, const DOperand& operand) { 7617 Vcmpe(al, dt, rd, operand); 7618 } 7619 7620 void Vcnt(Condition cond, DataType dt, DRegister rd, DRegister rm) { 7621 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7622 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7623 VIXL_ASSERT(allow_macro_instructions_); 7624 VIXL_ASSERT(OutsideITBlock()); 7625 MacroEmissionCheckScope guard(this); 7626 #ifndef PANDA_BUILD 7627 ITScope it_scope(this, &cond, guard); 7628 #else 7629 ITScope it_scope(allocator_, this, &cond, guard); 7630 #endif 7631 vcnt(cond, dt, rd, rm); 7632 } 7633 void Vcnt(DataType dt, DRegister rd, DRegister rm) { Vcnt(al, dt, rd, rm); } 7634 7635 void Vcnt(Condition cond, DataType dt, QRegister rd, QRegister rm) { 7636 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7637 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7638 VIXL_ASSERT(allow_macro_instructions_); 7639 VIXL_ASSERT(OutsideITBlock()); 7640 MacroEmissionCheckScope guard(this); 7641 #ifndef PANDA_BUILD 7642 ITScope it_scope(this, &cond, guard); 7643 #else 7644 ITScope it_scope(allocator_, this, &cond, guard); 7645 #endif 7646 vcnt(cond, dt, rd, rm); 7647 } 7648 void Vcnt(DataType dt, QRegister rd, QRegister rm) { Vcnt(al, dt, rd, rm); } 7649 7650 void Vcvt( 7651 Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 7652 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7653 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7654 VIXL_ASSERT(allow_macro_instructions_); 7655 VIXL_ASSERT(OutsideITBlock()); 7656 MacroEmissionCheckScope guard(this); 7657 #ifndef PANDA_BUILD 7658 ITScope it_scope(this, &cond, guard); 7659 #else 7660 ITScope it_scope(allocator_, this, &cond, guard); 7661 #endif 7662 vcvt(cond, dt1, dt2, rd, rm); 7663 } 7664 void Vcvt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 7665 Vcvt(al, dt1, dt2, rd, rm); 7666 } 7667 7668 void Vcvt( 7669 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 7670 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7671 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7672 VIXL_ASSERT(allow_macro_instructions_); 7673 VIXL_ASSERT(OutsideITBlock()); 7674 MacroEmissionCheckScope guard(this); 7675 #ifndef PANDA_BUILD 7676 ITScope it_scope(this, &cond, guard); 7677 #else 7678 ITScope it_scope(allocator_, this, &cond, guard); 7679 #endif 7680 vcvt(cond, dt1, dt2, rd, rm); 7681 } 7682 void Vcvt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 7683 Vcvt(al, dt1, dt2, rd, rm); 7684 } 7685 7686 void Vcvt(Condition cond, 7687 DataType dt1, 7688 DataType dt2, 7689 DRegister rd, 7690 DRegister rm, 7691 int32_t fbits) { 7692 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7693 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7694 VIXL_ASSERT(allow_macro_instructions_); 7695 VIXL_ASSERT(OutsideITBlock()); 7696 MacroEmissionCheckScope guard(this); 7697 #ifndef PANDA_BUILD 7698 ITScope it_scope(this, &cond, guard); 7699 #else 7700 ITScope it_scope(allocator_, this, &cond, guard); 7701 #endif 7702 vcvt(cond, dt1, dt2, rd, rm, fbits); 7703 } 7704 void Vcvt( 7705 DataType dt1, DataType dt2, DRegister rd, DRegister rm, int32_t fbits) { 7706 Vcvt(al, dt1, dt2, rd, rm, fbits); 7707 } 7708 7709 void Vcvt(Condition cond, 7710 DataType dt1, 7711 DataType dt2, 7712 QRegister rd, 7713 QRegister rm, 7714 int32_t fbits) { 7715 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7716 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7717 VIXL_ASSERT(allow_macro_instructions_); 7718 VIXL_ASSERT(OutsideITBlock()); 7719 MacroEmissionCheckScope guard(this); 7720 #ifndef PANDA_BUILD 7721 ITScope it_scope(this, &cond, guard); 7722 #else 7723 ITScope it_scope(allocator_, this, &cond, guard); 7724 #endif 7725 vcvt(cond, dt1, dt2, rd, rm, fbits); 7726 } 7727 void Vcvt( 7728 DataType dt1, DataType dt2, QRegister rd, QRegister rm, int32_t fbits) { 7729 Vcvt(al, dt1, dt2, rd, rm, fbits); 7730 } 7731 7732 void Vcvt(Condition cond, 7733 DataType dt1, 7734 DataType dt2, 7735 SRegister rd, 7736 SRegister rm, 7737 int32_t fbits) { 7738 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7739 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7740 VIXL_ASSERT(allow_macro_instructions_); 7741 VIXL_ASSERT(OutsideITBlock()); 7742 MacroEmissionCheckScope guard(this); 7743 #ifndef PANDA_BUILD 7744 ITScope it_scope(this, &cond, guard); 7745 #else 7746 ITScope it_scope(allocator_, this, &cond, guard); 7747 #endif 7748 vcvt(cond, dt1, dt2, rd, rm, fbits); 7749 } 7750 void Vcvt( 7751 DataType dt1, DataType dt2, SRegister rd, SRegister rm, int32_t fbits) { 7752 Vcvt(al, dt1, dt2, rd, rm, fbits); 7753 } 7754 7755 void Vcvt( 7756 Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 7757 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7758 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7759 VIXL_ASSERT(allow_macro_instructions_); 7760 VIXL_ASSERT(OutsideITBlock()); 7761 MacroEmissionCheckScope guard(this); 7762 #ifndef PANDA_BUILD 7763 ITScope it_scope(this, &cond, guard); 7764 #else 7765 ITScope it_scope(allocator_, this, &cond, guard); 7766 #endif 7767 vcvt(cond, dt1, dt2, rd, rm); 7768 } 7769 void Vcvt(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 7770 Vcvt(al, dt1, dt2, rd, rm); 7771 } 7772 7773 void Vcvt( 7774 Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) { 7775 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7776 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7777 VIXL_ASSERT(allow_macro_instructions_); 7778 VIXL_ASSERT(OutsideITBlock()); 7779 MacroEmissionCheckScope guard(this); 7780 #ifndef PANDA_BUILD 7781 ITScope it_scope(this, &cond, guard); 7782 #else 7783 ITScope it_scope(allocator_, this, &cond, guard); 7784 #endif 7785 vcvt(cond, dt1, dt2, rd, rm); 7786 } 7787 void Vcvt(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { 7788 Vcvt(al, dt1, dt2, rd, rm); 7789 } 7790 7791 void Vcvt( 7792 Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) { 7793 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7794 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7795 VIXL_ASSERT(allow_macro_instructions_); 7796 VIXL_ASSERT(OutsideITBlock()); 7797 MacroEmissionCheckScope guard(this); 7798 #ifndef PANDA_BUILD 7799 ITScope it_scope(this, &cond, guard); 7800 #else 7801 ITScope it_scope(allocator_, this, &cond, guard); 7802 #endif 7803 vcvt(cond, dt1, dt2, rd, rm); 7804 } 7805 void Vcvt(DataType dt1, DataType dt2, DRegister rd, QRegister rm) { 7806 Vcvt(al, dt1, dt2, rd, rm); 7807 } 7808 7809 void Vcvt( 7810 Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) { 7811 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7812 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7813 VIXL_ASSERT(allow_macro_instructions_); 7814 VIXL_ASSERT(OutsideITBlock()); 7815 MacroEmissionCheckScope guard(this); 7816 #ifndef PANDA_BUILD 7817 ITScope it_scope(this, &cond, guard); 7818 #else 7819 ITScope it_scope(allocator_, this, &cond, guard); 7820 #endif 7821 vcvt(cond, dt1, dt2, rd, rm); 7822 } 7823 void Vcvt(DataType dt1, DataType dt2, QRegister rd, DRegister rm) { 7824 Vcvt(al, dt1, dt2, rd, rm); 7825 } 7826 7827 void Vcvt( 7828 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 7829 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7830 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7831 VIXL_ASSERT(allow_macro_instructions_); 7832 VIXL_ASSERT(OutsideITBlock()); 7833 MacroEmissionCheckScope guard(this); 7834 #ifndef PANDA_BUILD 7835 ITScope it_scope(this, &cond, guard); 7836 #else 7837 ITScope it_scope(allocator_, this, &cond, guard); 7838 #endif 7839 vcvt(cond, dt1, dt2, rd, rm); 7840 } 7841 void Vcvt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 7842 Vcvt(al, dt1, dt2, rd, rm); 7843 } 7844 7845 void Vcvta(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 7846 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7847 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7848 VIXL_ASSERT(allow_macro_instructions_); 7849 VIXL_ASSERT(OutsideITBlock()); 7850 MacroEmissionCheckScope guard(this); 7851 vcvta(dt1, dt2, rd, rm); 7852 } 7853 7854 void Vcvta(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { 7855 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7856 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7857 VIXL_ASSERT(allow_macro_instructions_); 7858 VIXL_ASSERT(OutsideITBlock()); 7859 MacroEmissionCheckScope guard(this); 7860 vcvta(dt1, dt2, rd, rm); 7861 } 7862 7863 void Vcvta(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 7864 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7865 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7866 VIXL_ASSERT(allow_macro_instructions_); 7867 VIXL_ASSERT(OutsideITBlock()); 7868 MacroEmissionCheckScope guard(this); 7869 vcvta(dt1, dt2, rd, rm); 7870 } 7871 7872 void Vcvta(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 7873 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7874 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7875 VIXL_ASSERT(allow_macro_instructions_); 7876 VIXL_ASSERT(OutsideITBlock()); 7877 MacroEmissionCheckScope guard(this); 7878 vcvta(dt1, dt2, rd, rm); 7879 } 7880 7881 void Vcvtb( 7882 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 7883 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7884 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7885 VIXL_ASSERT(allow_macro_instructions_); 7886 VIXL_ASSERT(OutsideITBlock()); 7887 MacroEmissionCheckScope guard(this); 7888 #ifndef PANDA_BUILD 7889 ITScope it_scope(this, &cond, guard); 7890 #else 7891 ITScope it_scope(allocator_, this, &cond, guard); 7892 #endif 7893 vcvtb(cond, dt1, dt2, rd, rm); 7894 } 7895 void Vcvtb(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 7896 Vcvtb(al, dt1, dt2, rd, rm); 7897 } 7898 7899 void Vcvtb( 7900 Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 7901 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7902 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7903 VIXL_ASSERT(allow_macro_instructions_); 7904 VIXL_ASSERT(OutsideITBlock()); 7905 MacroEmissionCheckScope guard(this); 7906 #ifndef PANDA_BUILD 7907 ITScope it_scope(this, &cond, guard); 7908 #else 7909 ITScope it_scope(allocator_, this, &cond, guard); 7910 #endif 7911 vcvtb(cond, dt1, dt2, rd, rm); 7912 } 7913 void Vcvtb(DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 7914 Vcvtb(al, dt1, dt2, rd, rm); 7915 } 7916 7917 void Vcvtb( 7918 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 7919 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7920 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7921 VIXL_ASSERT(allow_macro_instructions_); 7922 VIXL_ASSERT(OutsideITBlock()); 7923 MacroEmissionCheckScope guard(this); 7924 #ifndef PANDA_BUILD 7925 ITScope it_scope(this, &cond, guard); 7926 #else 7927 ITScope it_scope(allocator_, this, &cond, guard); 7928 #endif 7929 vcvtb(cond, dt1, dt2, rd, rm); 7930 } 7931 void Vcvtb(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 7932 Vcvtb(al, dt1, dt2, rd, rm); 7933 } 7934 7935 void Vcvtm(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 7936 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7937 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7938 VIXL_ASSERT(allow_macro_instructions_); 7939 VIXL_ASSERT(OutsideITBlock()); 7940 MacroEmissionCheckScope guard(this); 7941 vcvtm(dt1, dt2, rd, rm); 7942 } 7943 7944 void Vcvtm(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { 7945 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7946 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7947 VIXL_ASSERT(allow_macro_instructions_); 7948 VIXL_ASSERT(OutsideITBlock()); 7949 MacroEmissionCheckScope guard(this); 7950 vcvtm(dt1, dt2, rd, rm); 7951 } 7952 7953 void Vcvtm(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 7954 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7955 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7956 VIXL_ASSERT(allow_macro_instructions_); 7957 VIXL_ASSERT(OutsideITBlock()); 7958 MacroEmissionCheckScope guard(this); 7959 vcvtm(dt1, dt2, rd, rm); 7960 } 7961 7962 void Vcvtm(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 7963 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7964 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7965 VIXL_ASSERT(allow_macro_instructions_); 7966 VIXL_ASSERT(OutsideITBlock()); 7967 MacroEmissionCheckScope guard(this); 7968 vcvtm(dt1, dt2, rd, rm); 7969 } 7970 7971 void Vcvtn(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 7972 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7973 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7974 VIXL_ASSERT(allow_macro_instructions_); 7975 VIXL_ASSERT(OutsideITBlock()); 7976 MacroEmissionCheckScope guard(this); 7977 vcvtn(dt1, dt2, rd, rm); 7978 } 7979 7980 void Vcvtn(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { 7981 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7982 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7983 VIXL_ASSERT(allow_macro_instructions_); 7984 VIXL_ASSERT(OutsideITBlock()); 7985 MacroEmissionCheckScope guard(this); 7986 vcvtn(dt1, dt2, rd, rm); 7987 } 7988 7989 void Vcvtn(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 7990 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 7991 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 7992 VIXL_ASSERT(allow_macro_instructions_); 7993 VIXL_ASSERT(OutsideITBlock()); 7994 MacroEmissionCheckScope guard(this); 7995 vcvtn(dt1, dt2, rd, rm); 7996 } 7997 7998 void Vcvtn(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 7999 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8000 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8001 VIXL_ASSERT(allow_macro_instructions_); 8002 VIXL_ASSERT(OutsideITBlock()); 8003 MacroEmissionCheckScope guard(this); 8004 vcvtn(dt1, dt2, rd, rm); 8005 } 8006 8007 void Vcvtp(DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 8008 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8009 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8010 VIXL_ASSERT(allow_macro_instructions_); 8011 VIXL_ASSERT(OutsideITBlock()); 8012 MacroEmissionCheckScope guard(this); 8013 vcvtp(dt1, dt2, rd, rm); 8014 } 8015 8016 void Vcvtp(DataType dt1, DataType dt2, QRegister rd, QRegister rm) { 8017 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8018 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8019 VIXL_ASSERT(allow_macro_instructions_); 8020 VIXL_ASSERT(OutsideITBlock()); 8021 MacroEmissionCheckScope guard(this); 8022 vcvtp(dt1, dt2, rd, rm); 8023 } 8024 8025 void Vcvtp(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 8026 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8027 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8028 VIXL_ASSERT(allow_macro_instructions_); 8029 VIXL_ASSERT(OutsideITBlock()); 8030 MacroEmissionCheckScope guard(this); 8031 vcvtp(dt1, dt2, rd, rm); 8032 } 8033 8034 void Vcvtp(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 8035 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8036 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8037 VIXL_ASSERT(allow_macro_instructions_); 8038 VIXL_ASSERT(OutsideITBlock()); 8039 MacroEmissionCheckScope guard(this); 8040 vcvtp(dt1, dt2, rd, rm); 8041 } 8042 8043 void Vcvtr( 8044 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 8045 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8046 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8047 VIXL_ASSERT(allow_macro_instructions_); 8048 VIXL_ASSERT(OutsideITBlock()); 8049 MacroEmissionCheckScope guard(this); 8050 #ifndef PANDA_BUILD 8051 ITScope it_scope(this, &cond, guard); 8052 #else 8053 ITScope it_scope(allocator_, this, &cond, guard); 8054 #endif 8055 vcvtr(cond, dt1, dt2, rd, rm); 8056 } 8057 void Vcvtr(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 8058 Vcvtr(al, dt1, dt2, rd, rm); 8059 } 8060 8061 void Vcvtr( 8062 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 8063 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8064 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8065 VIXL_ASSERT(allow_macro_instructions_); 8066 VIXL_ASSERT(OutsideITBlock()); 8067 MacroEmissionCheckScope guard(this); 8068 #ifndef PANDA_BUILD 8069 ITScope it_scope(this, &cond, guard); 8070 #else 8071 ITScope it_scope(allocator_, this, &cond, guard); 8072 #endif 8073 vcvtr(cond, dt1, dt2, rd, rm); 8074 } 8075 void Vcvtr(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 8076 Vcvtr(al, dt1, dt2, rd, rm); 8077 } 8078 8079 void Vcvtt( 8080 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 8081 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8082 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8083 VIXL_ASSERT(allow_macro_instructions_); 8084 VIXL_ASSERT(OutsideITBlock()); 8085 MacroEmissionCheckScope guard(this); 8086 #ifndef PANDA_BUILD 8087 ITScope it_scope(this, &cond, guard); 8088 #else 8089 ITScope it_scope(allocator_, this, &cond, guard); 8090 #endif 8091 vcvtt(cond, dt1, dt2, rd, rm); 8092 } 8093 void Vcvtt(DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 8094 Vcvtt(al, dt1, dt2, rd, rm); 8095 } 8096 8097 void Vcvtt( 8098 Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 8099 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8100 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8101 VIXL_ASSERT(allow_macro_instructions_); 8102 VIXL_ASSERT(OutsideITBlock()); 8103 MacroEmissionCheckScope guard(this); 8104 #ifndef PANDA_BUILD 8105 ITScope it_scope(this, &cond, guard); 8106 #else 8107 ITScope it_scope(allocator_, this, &cond, guard); 8108 #endif 8109 vcvtt(cond, dt1, dt2, rd, rm); 8110 } 8111 void Vcvtt(DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 8112 Vcvtt(al, dt1, dt2, rd, rm); 8113 } 8114 8115 void Vcvtt( 8116 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 8117 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8118 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8119 VIXL_ASSERT(allow_macro_instructions_); 8120 VIXL_ASSERT(OutsideITBlock()); 8121 MacroEmissionCheckScope guard(this); 8122 #ifndef PANDA_BUILD 8123 ITScope it_scope(this, &cond, guard); 8124 #else 8125 ITScope it_scope(allocator_, this, &cond, guard); 8126 #endif 8127 vcvtt(cond, dt1, dt2, rd, rm); 8128 } 8129 void Vcvtt(DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 8130 Vcvtt(al, dt1, dt2, rd, rm); 8131 } 8132 8133 void Vdiv( 8134 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 8135 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8136 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8137 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8138 VIXL_ASSERT(allow_macro_instructions_); 8139 VIXL_ASSERT(OutsideITBlock()); 8140 MacroEmissionCheckScope guard(this); 8141 #ifndef PANDA_BUILD 8142 ITScope it_scope(this, &cond, guard); 8143 #else 8144 ITScope it_scope(allocator_, this, &cond, guard); 8145 #endif 8146 vdiv(cond, dt, rd, rn, rm); 8147 } 8148 void Vdiv(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 8149 Vdiv(al, dt, rd, rn, rm); 8150 } 8151 8152 void Vdiv( 8153 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8154 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8155 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8156 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8157 VIXL_ASSERT(allow_macro_instructions_); 8158 VIXL_ASSERT(OutsideITBlock()); 8159 MacroEmissionCheckScope guard(this); 8160 #ifndef PANDA_BUILD 8161 ITScope it_scope(this, &cond, guard); 8162 #else 8163 ITScope it_scope(allocator_, this, &cond, guard); 8164 #endif 8165 vdiv(cond, dt, rd, rn, rm); 8166 } 8167 void Vdiv(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8168 Vdiv(al, dt, rd, rn, rm); 8169 } 8170 8171 void Vdup(Condition cond, DataType dt, QRegister rd, Register rt) { 8172 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8173 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 8174 VIXL_ASSERT(allow_macro_instructions_); 8175 VIXL_ASSERT(OutsideITBlock()); 8176 MacroEmissionCheckScope guard(this); 8177 #ifndef PANDA_BUILD 8178 ITScope it_scope(this, &cond, guard); 8179 #else 8180 ITScope it_scope(allocator_, this, &cond, guard); 8181 #endif 8182 vdup(cond, dt, rd, rt); 8183 } 8184 void Vdup(DataType dt, QRegister rd, Register rt) { Vdup(al, dt, rd, rt); } 8185 8186 void Vdup(Condition cond, DataType dt, DRegister rd, Register rt) { 8187 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8188 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 8189 VIXL_ASSERT(allow_macro_instructions_); 8190 VIXL_ASSERT(OutsideITBlock()); 8191 MacroEmissionCheckScope guard(this); 8192 #ifndef PANDA_BUILD 8193 ITScope it_scope(this, &cond, guard); 8194 #else 8195 ITScope it_scope(allocator_, this, &cond, guard); 8196 #endif 8197 vdup(cond, dt, rd, rt); 8198 } 8199 void Vdup(DataType dt, DRegister rd, Register rt) { Vdup(al, dt, rd, rt); } 8200 8201 void Vdup(Condition cond, DataType dt, DRegister rd, DRegisterLane rm) { 8202 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8203 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8204 VIXL_ASSERT(allow_macro_instructions_); 8205 VIXL_ASSERT(OutsideITBlock()); 8206 MacroEmissionCheckScope guard(this); 8207 #ifndef PANDA_BUILD 8208 ITScope it_scope(this, &cond, guard); 8209 #else 8210 ITScope it_scope(allocator_, this, &cond, guard); 8211 #endif 8212 vdup(cond, dt, rd, rm); 8213 } 8214 void Vdup(DataType dt, DRegister rd, DRegisterLane rm) { 8215 Vdup(al, dt, rd, rm); 8216 } 8217 8218 void Vdup(Condition cond, DataType dt, QRegister rd, DRegisterLane rm) { 8219 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8220 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8221 VIXL_ASSERT(allow_macro_instructions_); 8222 VIXL_ASSERT(OutsideITBlock()); 8223 MacroEmissionCheckScope guard(this); 8224 #ifndef PANDA_BUILD 8225 ITScope it_scope(this, &cond, guard); 8226 #else 8227 ITScope it_scope(allocator_, this, &cond, guard); 8228 #endif 8229 vdup(cond, dt, rd, rm); 8230 } 8231 void Vdup(DataType dt, QRegister rd, DRegisterLane rm) { 8232 Vdup(al, dt, rd, rm); 8233 } 8234 8235 void Veor( 8236 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8237 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8238 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8239 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8240 VIXL_ASSERT(allow_macro_instructions_); 8241 VIXL_ASSERT(OutsideITBlock()); 8242 MacroEmissionCheckScope guard(this); 8243 #ifndef PANDA_BUILD 8244 ITScope it_scope(this, &cond, guard); 8245 #else 8246 ITScope it_scope(allocator_, this, &cond, guard); 8247 #endif 8248 veor(cond, dt, rd, rn, rm); 8249 } 8250 void Veor(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8251 Veor(al, dt, rd, rn, rm); 8252 } 8253 void Veor(Condition cond, DRegister rd, DRegister rn, DRegister rm) { 8254 Veor(cond, kDataTypeValueNone, rd, rn, rm); 8255 } 8256 void Veor(DRegister rd, DRegister rn, DRegister rm) { 8257 Veor(al, kDataTypeValueNone, rd, rn, rm); 8258 } 8259 8260 void Veor( 8261 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8262 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8263 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8264 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8265 VIXL_ASSERT(allow_macro_instructions_); 8266 VIXL_ASSERT(OutsideITBlock()); 8267 MacroEmissionCheckScope guard(this); 8268 #ifndef PANDA_BUILD 8269 ITScope it_scope(this, &cond, guard); 8270 #else 8271 ITScope it_scope(allocator_, this, &cond, guard); 8272 #endif 8273 veor(cond, dt, rd, rn, rm); 8274 } 8275 void Veor(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8276 Veor(al, dt, rd, rn, rm); 8277 } 8278 void Veor(Condition cond, QRegister rd, QRegister rn, QRegister rm) { 8279 Veor(cond, kDataTypeValueNone, rd, rn, rm); 8280 } 8281 void Veor(QRegister rd, QRegister rn, QRegister rm) { 8282 Veor(al, kDataTypeValueNone, rd, rn, rm); 8283 } 8284 8285 void Vext(Condition cond, 8286 DataType dt, 8287 DRegister rd, 8288 DRegister rn, 8289 DRegister rm, 8290 const DOperand& operand) { 8291 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8292 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8293 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8294 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 8295 VIXL_ASSERT(allow_macro_instructions_); 8296 VIXL_ASSERT(OutsideITBlock()); 8297 MacroEmissionCheckScope guard(this); 8298 #ifndef PANDA_BUILD 8299 ITScope it_scope(this, &cond, guard); 8300 #else 8301 ITScope it_scope(allocator_, this, &cond, guard); 8302 #endif 8303 vext(cond, dt, rd, rn, rm, operand); 8304 } 8305 void Vext(DataType dt, 8306 DRegister rd, 8307 DRegister rn, 8308 DRegister rm, 8309 const DOperand& operand) { 8310 Vext(al, dt, rd, rn, rm, operand); 8311 } 8312 8313 void Vext(Condition cond, 8314 DataType dt, 8315 QRegister rd, 8316 QRegister rn, 8317 QRegister rm, 8318 const QOperand& operand) { 8319 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8320 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8321 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8322 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 8323 VIXL_ASSERT(allow_macro_instructions_); 8324 VIXL_ASSERT(OutsideITBlock()); 8325 MacroEmissionCheckScope guard(this); 8326 #ifndef PANDA_BUILD 8327 ITScope it_scope(this, &cond, guard); 8328 #else 8329 ITScope it_scope(allocator_, this, &cond, guard); 8330 #endif 8331 vext(cond, dt, rd, rn, rm, operand); 8332 } 8333 void Vext(DataType dt, 8334 QRegister rd, 8335 QRegister rn, 8336 QRegister rm, 8337 const QOperand& operand) { 8338 Vext(al, dt, rd, rn, rm, operand); 8339 } 8340 8341 void Vfma( 8342 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8343 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8344 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8345 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8346 VIXL_ASSERT(allow_macro_instructions_); 8347 VIXL_ASSERT(OutsideITBlock()); 8348 MacroEmissionCheckScope guard(this); 8349 #ifndef PANDA_BUILD 8350 ITScope it_scope(this, &cond, guard); 8351 #else 8352 ITScope it_scope(allocator_, this, &cond, guard); 8353 #endif 8354 vfma(cond, dt, rd, rn, rm); 8355 } 8356 void Vfma(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8357 Vfma(al, dt, rd, rn, rm); 8358 } 8359 8360 void Vfma( 8361 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8362 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8363 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8364 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8365 VIXL_ASSERT(allow_macro_instructions_); 8366 VIXL_ASSERT(OutsideITBlock()); 8367 MacroEmissionCheckScope guard(this); 8368 #ifndef PANDA_BUILD 8369 ITScope it_scope(this, &cond, guard); 8370 #else 8371 ITScope it_scope(allocator_, this, &cond, guard); 8372 #endif 8373 vfma(cond, dt, rd, rn, rm); 8374 } 8375 void Vfma(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8376 Vfma(al, dt, rd, rn, rm); 8377 } 8378 8379 void Vfma( 8380 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 8381 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8382 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8383 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8384 VIXL_ASSERT(allow_macro_instructions_); 8385 VIXL_ASSERT(OutsideITBlock()); 8386 MacroEmissionCheckScope guard(this); 8387 #ifndef PANDA_BUILD 8388 ITScope it_scope(this, &cond, guard); 8389 #else 8390 ITScope it_scope(allocator_, this, &cond, guard); 8391 #endif 8392 vfma(cond, dt, rd, rn, rm); 8393 } 8394 void Vfma(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 8395 Vfma(al, dt, rd, rn, rm); 8396 } 8397 8398 void Vfms( 8399 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8400 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8401 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8402 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8403 VIXL_ASSERT(allow_macro_instructions_); 8404 VIXL_ASSERT(OutsideITBlock()); 8405 MacroEmissionCheckScope guard(this); 8406 #ifndef PANDA_BUILD 8407 ITScope it_scope(this, &cond, guard); 8408 #else 8409 ITScope it_scope(allocator_, this, &cond, guard); 8410 #endif 8411 vfms(cond, dt, rd, rn, rm); 8412 } 8413 void Vfms(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8414 Vfms(al, dt, rd, rn, rm); 8415 } 8416 8417 void Vfms( 8418 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8419 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8420 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8421 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8422 VIXL_ASSERT(allow_macro_instructions_); 8423 VIXL_ASSERT(OutsideITBlock()); 8424 MacroEmissionCheckScope guard(this); 8425 #ifndef PANDA_BUILD 8426 ITScope it_scope(this, &cond, guard); 8427 #else 8428 ITScope it_scope(allocator_, this, &cond, guard); 8429 #endif 8430 vfms(cond, dt, rd, rn, rm); 8431 } 8432 void Vfms(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8433 Vfms(al, dt, rd, rn, rm); 8434 } 8435 8436 void Vfms( 8437 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 8438 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8439 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8440 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8441 VIXL_ASSERT(allow_macro_instructions_); 8442 VIXL_ASSERT(OutsideITBlock()); 8443 MacroEmissionCheckScope guard(this); 8444 #ifndef PANDA_BUILD 8445 ITScope it_scope(this, &cond, guard); 8446 #else 8447 ITScope it_scope(allocator_, this, &cond, guard); 8448 #endif 8449 vfms(cond, dt, rd, rn, rm); 8450 } 8451 void Vfms(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 8452 Vfms(al, dt, rd, rn, rm); 8453 } 8454 8455 void Vfnma( 8456 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 8457 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8458 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8459 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8460 VIXL_ASSERT(allow_macro_instructions_); 8461 VIXL_ASSERT(OutsideITBlock()); 8462 MacroEmissionCheckScope guard(this); 8463 #ifndef PANDA_BUILD 8464 ITScope it_scope(this, &cond, guard); 8465 #else 8466 ITScope it_scope(allocator_, this, &cond, guard); 8467 #endif 8468 vfnma(cond, dt, rd, rn, rm); 8469 } 8470 void Vfnma(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 8471 Vfnma(al, dt, rd, rn, rm); 8472 } 8473 8474 void Vfnma( 8475 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8476 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8477 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8478 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8479 VIXL_ASSERT(allow_macro_instructions_); 8480 VIXL_ASSERT(OutsideITBlock()); 8481 MacroEmissionCheckScope guard(this); 8482 #ifndef PANDA_BUILD 8483 ITScope it_scope(this, &cond, guard); 8484 #else 8485 ITScope it_scope(allocator_, this, &cond, guard); 8486 #endif 8487 vfnma(cond, dt, rd, rn, rm); 8488 } 8489 void Vfnma(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8490 Vfnma(al, dt, rd, rn, rm); 8491 } 8492 8493 void Vfnms( 8494 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 8495 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8496 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8497 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8498 VIXL_ASSERT(allow_macro_instructions_); 8499 VIXL_ASSERT(OutsideITBlock()); 8500 MacroEmissionCheckScope guard(this); 8501 #ifndef PANDA_BUILD 8502 ITScope it_scope(this, &cond, guard); 8503 #else 8504 ITScope it_scope(allocator_, this, &cond, guard); 8505 #endif 8506 vfnms(cond, dt, rd, rn, rm); 8507 } 8508 void Vfnms(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 8509 Vfnms(al, dt, rd, rn, rm); 8510 } 8511 8512 void Vfnms( 8513 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8514 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8515 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8516 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8517 VIXL_ASSERT(allow_macro_instructions_); 8518 VIXL_ASSERT(OutsideITBlock()); 8519 MacroEmissionCheckScope guard(this); 8520 #ifndef PANDA_BUILD 8521 ITScope it_scope(this, &cond, guard); 8522 #else 8523 ITScope it_scope(allocator_, this, &cond, guard); 8524 #endif 8525 vfnms(cond, dt, rd, rn, rm); 8526 } 8527 void Vfnms(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8528 Vfnms(al, dt, rd, rn, rm); 8529 } 8530 8531 void Vhadd( 8532 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8533 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8534 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8535 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8536 VIXL_ASSERT(allow_macro_instructions_); 8537 VIXL_ASSERT(OutsideITBlock()); 8538 MacroEmissionCheckScope guard(this); 8539 #ifndef PANDA_BUILD 8540 ITScope it_scope(this, &cond, guard); 8541 #else 8542 ITScope it_scope(allocator_, this, &cond, guard); 8543 #endif 8544 vhadd(cond, dt, rd, rn, rm); 8545 } 8546 void Vhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8547 Vhadd(al, dt, rd, rn, rm); 8548 } 8549 8550 void Vhadd( 8551 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8552 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8553 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8554 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8555 VIXL_ASSERT(allow_macro_instructions_); 8556 VIXL_ASSERT(OutsideITBlock()); 8557 MacroEmissionCheckScope guard(this); 8558 #ifndef PANDA_BUILD 8559 ITScope it_scope(this, &cond, guard); 8560 #else 8561 ITScope it_scope(allocator_, this, &cond, guard); 8562 #endif 8563 vhadd(cond, dt, rd, rn, rm); 8564 } 8565 void Vhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8566 Vhadd(al, dt, rd, rn, rm); 8567 } 8568 8569 void Vhsub( 8570 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8571 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8572 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8573 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8574 VIXL_ASSERT(allow_macro_instructions_); 8575 VIXL_ASSERT(OutsideITBlock()); 8576 MacroEmissionCheckScope guard(this); 8577 #ifndef PANDA_BUILD 8578 ITScope it_scope(this, &cond, guard); 8579 #else 8580 ITScope it_scope(allocator_, this, &cond, guard); 8581 #endif 8582 vhsub(cond, dt, rd, rn, rm); 8583 } 8584 void Vhsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8585 Vhsub(al, dt, rd, rn, rm); 8586 } 8587 8588 void Vhsub( 8589 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8590 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8591 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8592 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8593 VIXL_ASSERT(allow_macro_instructions_); 8594 VIXL_ASSERT(OutsideITBlock()); 8595 MacroEmissionCheckScope guard(this); 8596 #ifndef PANDA_BUILD 8597 ITScope it_scope(this, &cond, guard); 8598 #else 8599 ITScope it_scope(allocator_, this, &cond, guard); 8600 #endif 8601 vhsub(cond, dt, rd, rn, rm); 8602 } 8603 void Vhsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8604 Vhsub(al, dt, rd, rn, rm); 8605 } 8606 8607 void Vld1(Condition cond, 8608 DataType dt, 8609 const NeonRegisterList& nreglist, 8610 const AlignedMemOperand& operand) { 8611 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 8612 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 8613 VIXL_ASSERT(allow_macro_instructions_); 8614 VIXL_ASSERT(OutsideITBlock()); 8615 MacroEmissionCheckScope guard(this); 8616 #ifndef PANDA_BUILD 8617 ITScope it_scope(this, &cond, guard); 8618 #else 8619 ITScope it_scope(allocator_, this, &cond, guard); 8620 #endif 8621 vld1(cond, dt, nreglist, operand); 8622 } 8623 void Vld1(DataType dt, 8624 const NeonRegisterList& nreglist, 8625 const AlignedMemOperand& operand) { 8626 Vld1(al, dt, nreglist, operand); 8627 } 8628 8629 void Vld2(Condition cond, 8630 DataType dt, 8631 const NeonRegisterList& nreglist, 8632 const AlignedMemOperand& operand) { 8633 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 8634 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 8635 VIXL_ASSERT(allow_macro_instructions_); 8636 VIXL_ASSERT(OutsideITBlock()); 8637 MacroEmissionCheckScope guard(this); 8638 #ifndef PANDA_BUILD 8639 ITScope it_scope(this, &cond, guard); 8640 #else 8641 ITScope it_scope(allocator_, this, &cond, guard); 8642 #endif 8643 vld2(cond, dt, nreglist, operand); 8644 } 8645 void Vld2(DataType dt, 8646 const NeonRegisterList& nreglist, 8647 const AlignedMemOperand& operand) { 8648 Vld2(al, dt, nreglist, operand); 8649 } 8650 8651 void Vld3(Condition cond, 8652 DataType dt, 8653 const NeonRegisterList& nreglist, 8654 const AlignedMemOperand& operand) { 8655 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 8656 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 8657 VIXL_ASSERT(allow_macro_instructions_); 8658 VIXL_ASSERT(OutsideITBlock()); 8659 MacroEmissionCheckScope guard(this); 8660 #ifndef PANDA_BUILD 8661 ITScope it_scope(this, &cond, guard); 8662 #else 8663 ITScope it_scope(allocator_, this, &cond, guard); 8664 #endif 8665 vld3(cond, dt, nreglist, operand); 8666 } 8667 void Vld3(DataType dt, 8668 const NeonRegisterList& nreglist, 8669 const AlignedMemOperand& operand) { 8670 Vld3(al, dt, nreglist, operand); 8671 } 8672 8673 void Vld3(Condition cond, 8674 DataType dt, 8675 const NeonRegisterList& nreglist, 8676 const MemOperand& operand) { 8677 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 8678 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 8679 VIXL_ASSERT(allow_macro_instructions_); 8680 VIXL_ASSERT(OutsideITBlock()); 8681 MacroEmissionCheckScope guard(this); 8682 #ifndef PANDA_BUILD 8683 ITScope it_scope(this, &cond, guard); 8684 #else 8685 ITScope it_scope(allocator_, this, &cond, guard); 8686 #endif 8687 vld3(cond, dt, nreglist, operand); 8688 } 8689 void Vld3(DataType dt, 8690 const NeonRegisterList& nreglist, 8691 const MemOperand& operand) { 8692 Vld3(al, dt, nreglist, operand); 8693 } 8694 8695 void Vld4(Condition cond, 8696 DataType dt, 8697 const NeonRegisterList& nreglist, 8698 const AlignedMemOperand& operand) { 8699 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 8700 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 8701 VIXL_ASSERT(allow_macro_instructions_); 8702 VIXL_ASSERT(OutsideITBlock()); 8703 MacroEmissionCheckScope guard(this); 8704 #ifndef PANDA_BUILD 8705 ITScope it_scope(this, &cond, guard); 8706 #else 8707 ITScope it_scope(allocator_, this, &cond, guard); 8708 #endif 8709 vld4(cond, dt, nreglist, operand); 8710 } 8711 void Vld4(DataType dt, 8712 const NeonRegisterList& nreglist, 8713 const AlignedMemOperand& operand) { 8714 Vld4(al, dt, nreglist, operand); 8715 } 8716 8717 void Vldm(Condition cond, 8718 DataType dt, 8719 Register rn, 8720 WriteBack write_back, 8721 DRegisterList dreglist) { 8722 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8723 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 8724 VIXL_ASSERT(allow_macro_instructions_); 8725 VIXL_ASSERT(OutsideITBlock()); 8726 MacroEmissionCheckScope guard(this); 8727 #ifndef PANDA_BUILD 8728 ITScope it_scope(this, &cond, guard); 8729 #else 8730 ITScope it_scope(allocator_, this, &cond, guard); 8731 #endif 8732 vldm(cond, dt, rn, write_back, dreglist); 8733 } 8734 void Vldm(DataType dt, 8735 Register rn, 8736 WriteBack write_back, 8737 DRegisterList dreglist) { 8738 Vldm(al, dt, rn, write_back, dreglist); 8739 } 8740 void Vldm(Condition cond, 8741 Register rn, 8742 WriteBack write_back, 8743 DRegisterList dreglist) { 8744 Vldm(cond, kDataTypeValueNone, rn, write_back, dreglist); 8745 } 8746 void Vldm(Register rn, WriteBack write_back, DRegisterList dreglist) { 8747 Vldm(al, kDataTypeValueNone, rn, write_back, dreglist); 8748 } 8749 8750 void Vldm(Condition cond, 8751 DataType dt, 8752 Register rn, 8753 WriteBack write_back, 8754 SRegisterList sreglist) { 8755 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8756 VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); 8757 VIXL_ASSERT(allow_macro_instructions_); 8758 VIXL_ASSERT(OutsideITBlock()); 8759 MacroEmissionCheckScope guard(this); 8760 #ifndef PANDA_BUILD 8761 ITScope it_scope(this, &cond, guard); 8762 #else 8763 ITScope it_scope(allocator_, this, &cond, guard); 8764 #endif 8765 vldm(cond, dt, rn, write_back, sreglist); 8766 } 8767 void Vldm(DataType dt, 8768 Register rn, 8769 WriteBack write_back, 8770 SRegisterList sreglist) { 8771 Vldm(al, dt, rn, write_back, sreglist); 8772 } 8773 void Vldm(Condition cond, 8774 Register rn, 8775 WriteBack write_back, 8776 SRegisterList sreglist) { 8777 Vldm(cond, kDataTypeValueNone, rn, write_back, sreglist); 8778 } 8779 void Vldm(Register rn, WriteBack write_back, SRegisterList sreglist) { 8780 Vldm(al, kDataTypeValueNone, rn, write_back, sreglist); 8781 } 8782 8783 void Vldmdb(Condition cond, 8784 DataType dt, 8785 Register rn, 8786 WriteBack write_back, 8787 DRegisterList dreglist) { 8788 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8789 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 8790 VIXL_ASSERT(allow_macro_instructions_); 8791 VIXL_ASSERT(OutsideITBlock()); 8792 MacroEmissionCheckScope guard(this); 8793 #ifndef PANDA_BUILD 8794 ITScope it_scope(this, &cond, guard); 8795 #else 8796 ITScope it_scope(allocator_, this, &cond, guard); 8797 #endif 8798 vldmdb(cond, dt, rn, write_back, dreglist); 8799 } 8800 void Vldmdb(DataType dt, 8801 Register rn, 8802 WriteBack write_back, 8803 DRegisterList dreglist) { 8804 Vldmdb(al, dt, rn, write_back, dreglist); 8805 } 8806 void Vldmdb(Condition cond, 8807 Register rn, 8808 WriteBack write_back, 8809 DRegisterList dreglist) { 8810 Vldmdb(cond, kDataTypeValueNone, rn, write_back, dreglist); 8811 } 8812 void Vldmdb(Register rn, WriteBack write_back, DRegisterList dreglist) { 8813 Vldmdb(al, kDataTypeValueNone, rn, write_back, dreglist); 8814 } 8815 8816 void Vldmdb(Condition cond, 8817 DataType dt, 8818 Register rn, 8819 WriteBack write_back, 8820 SRegisterList sreglist) { 8821 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8822 VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); 8823 VIXL_ASSERT(allow_macro_instructions_); 8824 VIXL_ASSERT(OutsideITBlock()); 8825 MacroEmissionCheckScope guard(this); 8826 #ifndef PANDA_BUILD 8827 ITScope it_scope(this, &cond, guard); 8828 #else 8829 ITScope it_scope(allocator_, this, &cond, guard); 8830 #endif 8831 vldmdb(cond, dt, rn, write_back, sreglist); 8832 } 8833 void Vldmdb(DataType dt, 8834 Register rn, 8835 WriteBack write_back, 8836 SRegisterList sreglist) { 8837 Vldmdb(al, dt, rn, write_back, sreglist); 8838 } 8839 void Vldmdb(Condition cond, 8840 Register rn, 8841 WriteBack write_back, 8842 SRegisterList sreglist) { 8843 Vldmdb(cond, kDataTypeValueNone, rn, write_back, sreglist); 8844 } 8845 void Vldmdb(Register rn, WriteBack write_back, SRegisterList sreglist) { 8846 Vldmdb(al, kDataTypeValueNone, rn, write_back, sreglist); 8847 } 8848 8849 void Vldmia(Condition cond, 8850 DataType dt, 8851 Register rn, 8852 WriteBack write_back, 8853 DRegisterList dreglist) { 8854 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8855 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 8856 VIXL_ASSERT(allow_macro_instructions_); 8857 VIXL_ASSERT(OutsideITBlock()); 8858 MacroEmissionCheckScope guard(this); 8859 #ifndef PANDA_BUILD 8860 ITScope it_scope(this, &cond, guard); 8861 #else 8862 ITScope it_scope(allocator_, this, &cond, guard); 8863 #endif 8864 vldmia(cond, dt, rn, write_back, dreglist); 8865 } 8866 void Vldmia(DataType dt, 8867 Register rn, 8868 WriteBack write_back, 8869 DRegisterList dreglist) { 8870 Vldmia(al, dt, rn, write_back, dreglist); 8871 } 8872 void Vldmia(Condition cond, 8873 Register rn, 8874 WriteBack write_back, 8875 DRegisterList dreglist) { 8876 Vldmia(cond, kDataTypeValueNone, rn, write_back, dreglist); 8877 } 8878 void Vldmia(Register rn, WriteBack write_back, DRegisterList dreglist) { 8879 Vldmia(al, kDataTypeValueNone, rn, write_back, dreglist); 8880 } 8881 8882 void Vldmia(Condition cond, 8883 DataType dt, 8884 Register rn, 8885 WriteBack write_back, 8886 SRegisterList sreglist) { 8887 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8888 VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); 8889 VIXL_ASSERT(allow_macro_instructions_); 8890 VIXL_ASSERT(OutsideITBlock()); 8891 MacroEmissionCheckScope guard(this); 8892 #ifndef PANDA_BUILD 8893 ITScope it_scope(this, &cond, guard); 8894 #else 8895 ITScope it_scope(allocator_, this, &cond, guard); 8896 #endif 8897 vldmia(cond, dt, rn, write_back, sreglist); 8898 } 8899 void Vldmia(DataType dt, 8900 Register rn, 8901 WriteBack write_back, 8902 SRegisterList sreglist) { 8903 Vldmia(al, dt, rn, write_back, sreglist); 8904 } 8905 void Vldmia(Condition cond, 8906 Register rn, 8907 WriteBack write_back, 8908 SRegisterList sreglist) { 8909 Vldmia(cond, kDataTypeValueNone, rn, write_back, sreglist); 8910 } 8911 void Vldmia(Register rn, WriteBack write_back, SRegisterList sreglist) { 8912 Vldmia(al, kDataTypeValueNone, rn, write_back, sreglist); 8913 } 8914 8915 8916 void Vldr(Condition cond, 8917 DataType dt, 8918 DRegister rd, 8919 const MemOperand& operand) { 8920 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8921 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 8922 VIXL_ASSERT(allow_macro_instructions_); 8923 VIXL_ASSERT(OutsideITBlock()); 8924 MacroEmissionCheckScope guard(this); 8925 #ifndef PANDA_BUILD 8926 ITScope it_scope(this, &cond, guard); 8927 #else 8928 ITScope it_scope(allocator_, this, &cond, guard); 8929 #endif 8930 vldr(cond, dt, rd, operand); 8931 } 8932 void Vldr(DataType dt, DRegister rd, const MemOperand& operand) { 8933 Vldr(al, dt, rd, operand); 8934 } 8935 void Vldr(Condition cond, DRegister rd, const MemOperand& operand) { 8936 Vldr(cond, Untyped64, rd, operand); 8937 } 8938 void Vldr(DRegister rd, const MemOperand& operand) { 8939 Vldr(al, Untyped64, rd, operand); 8940 } 8941 8942 8943 void Vldr(Condition cond, 8944 DataType dt, 8945 SRegister rd, 8946 const MemOperand& operand) { 8947 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8948 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 8949 VIXL_ASSERT(allow_macro_instructions_); 8950 VIXL_ASSERT(OutsideITBlock()); 8951 MacroEmissionCheckScope guard(this); 8952 #ifndef PANDA_BUILD 8953 ITScope it_scope(this, &cond, guard); 8954 #else 8955 ITScope it_scope(allocator_, this, &cond, guard); 8956 #endif 8957 vldr(cond, dt, rd, operand); 8958 } 8959 void Vldr(DataType dt, SRegister rd, const MemOperand& operand) { 8960 Vldr(al, dt, rd, operand); 8961 } 8962 void Vldr(Condition cond, SRegister rd, const MemOperand& operand) { 8963 Vldr(cond, Untyped32, rd, operand); 8964 } 8965 void Vldr(SRegister rd, const MemOperand& operand) { 8966 Vldr(al, Untyped32, rd, operand); 8967 } 8968 8969 void Vmax( 8970 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8971 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8972 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8973 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8974 VIXL_ASSERT(allow_macro_instructions_); 8975 VIXL_ASSERT(OutsideITBlock()); 8976 MacroEmissionCheckScope guard(this); 8977 #ifndef PANDA_BUILD 8978 ITScope it_scope(this, &cond, guard); 8979 #else 8980 ITScope it_scope(allocator_, this, &cond, guard); 8981 #endif 8982 vmax(cond, dt, rd, rn, rm); 8983 } 8984 void Vmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 8985 Vmax(al, dt, rd, rn, rm); 8986 } 8987 8988 void Vmax( 8989 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 8990 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 8991 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 8992 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 8993 VIXL_ASSERT(allow_macro_instructions_); 8994 VIXL_ASSERT(OutsideITBlock()); 8995 MacroEmissionCheckScope guard(this); 8996 #ifndef PANDA_BUILD 8997 ITScope it_scope(this, &cond, guard); 8998 #else 8999 ITScope it_scope(allocator_, this, &cond, guard); 9000 #endif 9001 vmax(cond, dt, rd, rn, rm); 9002 } 9003 void Vmax(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9004 Vmax(al, dt, rd, rn, rm); 9005 } 9006 9007 void Vmaxnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9008 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9009 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9010 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9011 VIXL_ASSERT(allow_macro_instructions_); 9012 VIXL_ASSERT(OutsideITBlock()); 9013 MacroEmissionCheckScope guard(this); 9014 vmaxnm(dt, rd, rn, rm); 9015 } 9016 9017 void Vmaxnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9018 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9019 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9020 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9021 VIXL_ASSERT(allow_macro_instructions_); 9022 VIXL_ASSERT(OutsideITBlock()); 9023 MacroEmissionCheckScope guard(this); 9024 vmaxnm(dt, rd, rn, rm); 9025 } 9026 9027 void Vmaxnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9028 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9029 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9030 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9031 VIXL_ASSERT(allow_macro_instructions_); 9032 VIXL_ASSERT(OutsideITBlock()); 9033 MacroEmissionCheckScope guard(this); 9034 vmaxnm(dt, rd, rn, rm); 9035 } 9036 9037 void Vmin( 9038 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9039 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9040 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9041 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9042 VIXL_ASSERT(allow_macro_instructions_); 9043 VIXL_ASSERT(OutsideITBlock()); 9044 MacroEmissionCheckScope guard(this); 9045 #ifndef PANDA_BUILD 9046 ITScope it_scope(this, &cond, guard); 9047 #else 9048 ITScope it_scope(allocator_, this, &cond, guard); 9049 #endif 9050 vmin(cond, dt, rd, rn, rm); 9051 } 9052 void Vmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9053 Vmin(al, dt, rd, rn, rm); 9054 } 9055 9056 void Vmin( 9057 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9058 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9059 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9060 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9061 VIXL_ASSERT(allow_macro_instructions_); 9062 VIXL_ASSERT(OutsideITBlock()); 9063 MacroEmissionCheckScope guard(this); 9064 #ifndef PANDA_BUILD 9065 ITScope it_scope(this, &cond, guard); 9066 #else 9067 ITScope it_scope(allocator_, this, &cond, guard); 9068 #endif 9069 vmin(cond, dt, rd, rn, rm); 9070 } 9071 void Vmin(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9072 Vmin(al, dt, rd, rn, rm); 9073 } 9074 9075 void Vminnm(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9076 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9077 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9078 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9079 VIXL_ASSERT(allow_macro_instructions_); 9080 VIXL_ASSERT(OutsideITBlock()); 9081 MacroEmissionCheckScope guard(this); 9082 vminnm(dt, rd, rn, rm); 9083 } 9084 9085 void Vminnm(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9086 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9087 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9088 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9089 VIXL_ASSERT(allow_macro_instructions_); 9090 VIXL_ASSERT(OutsideITBlock()); 9091 MacroEmissionCheckScope guard(this); 9092 vminnm(dt, rd, rn, rm); 9093 } 9094 9095 void Vminnm(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9096 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9097 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9098 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9099 VIXL_ASSERT(allow_macro_instructions_); 9100 VIXL_ASSERT(OutsideITBlock()); 9101 MacroEmissionCheckScope guard(this); 9102 vminnm(dt, rd, rn, rm); 9103 } 9104 9105 void Vmla(Condition cond, 9106 DataType dt, 9107 DRegister rd, 9108 DRegister rn, 9109 DRegisterLane rm) { 9110 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9111 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9112 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9113 VIXL_ASSERT(allow_macro_instructions_); 9114 VIXL_ASSERT(OutsideITBlock()); 9115 MacroEmissionCheckScope guard(this); 9116 #ifndef PANDA_BUILD 9117 ITScope it_scope(this, &cond, guard); 9118 #else 9119 ITScope it_scope(allocator_, this, &cond, guard); 9120 #endif 9121 vmla(cond, dt, rd, rn, rm); 9122 } 9123 void Vmla(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 9124 Vmla(al, dt, rd, rn, rm); 9125 } 9126 9127 void Vmla(Condition cond, 9128 DataType dt, 9129 QRegister rd, 9130 QRegister rn, 9131 DRegisterLane rm) { 9132 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9133 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9134 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9135 VIXL_ASSERT(allow_macro_instructions_); 9136 VIXL_ASSERT(OutsideITBlock()); 9137 MacroEmissionCheckScope guard(this); 9138 #ifndef PANDA_BUILD 9139 ITScope it_scope(this, &cond, guard); 9140 #else 9141 ITScope it_scope(allocator_, this, &cond, guard); 9142 #endif 9143 vmla(cond, dt, rd, rn, rm); 9144 } 9145 void Vmla(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 9146 Vmla(al, dt, rd, rn, rm); 9147 } 9148 9149 void Vmla( 9150 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9151 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9152 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9153 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9154 VIXL_ASSERT(allow_macro_instructions_); 9155 VIXL_ASSERT(OutsideITBlock()); 9156 MacroEmissionCheckScope guard(this); 9157 #ifndef PANDA_BUILD 9158 ITScope it_scope(this, &cond, guard); 9159 #else 9160 ITScope it_scope(allocator_, this, &cond, guard); 9161 #endif 9162 vmla(cond, dt, rd, rn, rm); 9163 } 9164 void Vmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9165 Vmla(al, dt, rd, rn, rm); 9166 } 9167 9168 void Vmla( 9169 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9170 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9171 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9172 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9173 VIXL_ASSERT(allow_macro_instructions_); 9174 VIXL_ASSERT(OutsideITBlock()); 9175 MacroEmissionCheckScope guard(this); 9176 #ifndef PANDA_BUILD 9177 ITScope it_scope(this, &cond, guard); 9178 #else 9179 ITScope it_scope(allocator_, this, &cond, guard); 9180 #endif 9181 vmla(cond, dt, rd, rn, rm); 9182 } 9183 void Vmla(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9184 Vmla(al, dt, rd, rn, rm); 9185 } 9186 9187 void Vmla( 9188 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9189 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9190 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9191 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9192 VIXL_ASSERT(allow_macro_instructions_); 9193 VIXL_ASSERT(OutsideITBlock()); 9194 MacroEmissionCheckScope guard(this); 9195 #ifndef PANDA_BUILD 9196 ITScope it_scope(this, &cond, guard); 9197 #else 9198 ITScope it_scope(allocator_, this, &cond, guard); 9199 #endif 9200 vmla(cond, dt, rd, rn, rm); 9201 } 9202 void Vmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9203 Vmla(al, dt, rd, rn, rm); 9204 } 9205 9206 void Vmlal(Condition cond, 9207 DataType dt, 9208 QRegister rd, 9209 DRegister rn, 9210 DRegisterLane rm) { 9211 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9212 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9213 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9214 VIXL_ASSERT(allow_macro_instructions_); 9215 VIXL_ASSERT(OutsideITBlock()); 9216 MacroEmissionCheckScope guard(this); 9217 #ifndef PANDA_BUILD 9218 ITScope it_scope(this, &cond, guard); 9219 #else 9220 ITScope it_scope(allocator_, this, &cond, guard); 9221 #endif 9222 vmlal(cond, dt, rd, rn, rm); 9223 } 9224 void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { 9225 Vmlal(al, dt, rd, rn, rm); 9226 } 9227 9228 void Vmlal( 9229 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 9230 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9231 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9232 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9233 VIXL_ASSERT(allow_macro_instructions_); 9234 VIXL_ASSERT(OutsideITBlock()); 9235 MacroEmissionCheckScope guard(this); 9236 #ifndef PANDA_BUILD 9237 ITScope it_scope(this, &cond, guard); 9238 #else 9239 ITScope it_scope(allocator_, this, &cond, guard); 9240 #endif 9241 vmlal(cond, dt, rd, rn, rm); 9242 } 9243 void Vmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) { 9244 Vmlal(al, dt, rd, rn, rm); 9245 } 9246 9247 void Vmls(Condition cond, 9248 DataType dt, 9249 DRegister rd, 9250 DRegister rn, 9251 DRegisterLane rm) { 9252 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9253 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9254 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9255 VIXL_ASSERT(allow_macro_instructions_); 9256 VIXL_ASSERT(OutsideITBlock()); 9257 MacroEmissionCheckScope guard(this); 9258 #ifndef PANDA_BUILD 9259 ITScope it_scope(this, &cond, guard); 9260 #else 9261 ITScope it_scope(allocator_, this, &cond, guard); 9262 #endif 9263 vmls(cond, dt, rd, rn, rm); 9264 } 9265 void Vmls(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 9266 Vmls(al, dt, rd, rn, rm); 9267 } 9268 9269 void Vmls(Condition cond, 9270 DataType dt, 9271 QRegister rd, 9272 QRegister rn, 9273 DRegisterLane rm) { 9274 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9275 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9276 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9277 VIXL_ASSERT(allow_macro_instructions_); 9278 VIXL_ASSERT(OutsideITBlock()); 9279 MacroEmissionCheckScope guard(this); 9280 #ifndef PANDA_BUILD 9281 ITScope it_scope(this, &cond, guard); 9282 #else 9283 ITScope it_scope(allocator_, this, &cond, guard); 9284 #endif 9285 vmls(cond, dt, rd, rn, rm); 9286 } 9287 void Vmls(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 9288 Vmls(al, dt, rd, rn, rm); 9289 } 9290 9291 void Vmls( 9292 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9293 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9294 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9295 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9296 VIXL_ASSERT(allow_macro_instructions_); 9297 VIXL_ASSERT(OutsideITBlock()); 9298 MacroEmissionCheckScope guard(this); 9299 #ifndef PANDA_BUILD 9300 ITScope it_scope(this, &cond, guard); 9301 #else 9302 ITScope it_scope(allocator_, this, &cond, guard); 9303 #endif 9304 vmls(cond, dt, rd, rn, rm); 9305 } 9306 void Vmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9307 Vmls(al, dt, rd, rn, rm); 9308 } 9309 9310 void Vmls( 9311 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9312 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9313 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9314 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9315 VIXL_ASSERT(allow_macro_instructions_); 9316 VIXL_ASSERT(OutsideITBlock()); 9317 MacroEmissionCheckScope guard(this); 9318 #ifndef PANDA_BUILD 9319 ITScope it_scope(this, &cond, guard); 9320 #else 9321 ITScope it_scope(allocator_, this, &cond, guard); 9322 #endif 9323 vmls(cond, dt, rd, rn, rm); 9324 } 9325 void Vmls(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9326 Vmls(al, dt, rd, rn, rm); 9327 } 9328 9329 void Vmls( 9330 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9331 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9332 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9333 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9334 VIXL_ASSERT(allow_macro_instructions_); 9335 VIXL_ASSERT(OutsideITBlock()); 9336 MacroEmissionCheckScope guard(this); 9337 #ifndef PANDA_BUILD 9338 ITScope it_scope(this, &cond, guard); 9339 #else 9340 ITScope it_scope(allocator_, this, &cond, guard); 9341 #endif 9342 vmls(cond, dt, rd, rn, rm); 9343 } 9344 void Vmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9345 Vmls(al, dt, rd, rn, rm); 9346 } 9347 9348 void Vmlsl(Condition cond, 9349 DataType dt, 9350 QRegister rd, 9351 DRegister rn, 9352 DRegisterLane rm) { 9353 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9354 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9355 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9356 VIXL_ASSERT(allow_macro_instructions_); 9357 VIXL_ASSERT(OutsideITBlock()); 9358 MacroEmissionCheckScope guard(this); 9359 #ifndef PANDA_BUILD 9360 ITScope it_scope(this, &cond, guard); 9361 #else 9362 ITScope it_scope(allocator_, this, &cond, guard); 9363 #endif 9364 vmlsl(cond, dt, rd, rn, rm); 9365 } 9366 void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { 9367 Vmlsl(al, dt, rd, rn, rm); 9368 } 9369 9370 void Vmlsl( 9371 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 9372 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9373 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9374 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9375 VIXL_ASSERT(allow_macro_instructions_); 9376 VIXL_ASSERT(OutsideITBlock()); 9377 MacroEmissionCheckScope guard(this); 9378 #ifndef PANDA_BUILD 9379 ITScope it_scope(this, &cond, guard); 9380 #else 9381 ITScope it_scope(allocator_, this, &cond, guard); 9382 #endif 9383 vmlsl(cond, dt, rd, rn, rm); 9384 } 9385 void Vmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) { 9386 Vmlsl(al, dt, rd, rn, rm); 9387 } 9388 9389 void Vmov(Condition cond, Register rt, SRegister rn) { 9390 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 9391 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9392 VIXL_ASSERT(allow_macro_instructions_); 9393 VIXL_ASSERT(OutsideITBlock()); 9394 MacroEmissionCheckScope guard(this); 9395 #ifndef PANDA_BUILD 9396 ITScope it_scope(this, &cond, guard); 9397 #else 9398 ITScope it_scope(allocator_, this, &cond, guard); 9399 #endif 9400 vmov(cond, rt, rn); 9401 } 9402 void Vmov(Register rt, SRegister rn) { Vmov(al, rt, rn); } 9403 9404 void Vmov(Condition cond, SRegister rn, Register rt) { 9405 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9406 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 9407 VIXL_ASSERT(allow_macro_instructions_); 9408 VIXL_ASSERT(OutsideITBlock()); 9409 MacroEmissionCheckScope guard(this); 9410 #ifndef PANDA_BUILD 9411 ITScope it_scope(this, &cond, guard); 9412 #else 9413 ITScope it_scope(allocator_, this, &cond, guard); 9414 #endif 9415 vmov(cond, rn, rt); 9416 } 9417 void Vmov(SRegister rn, Register rt) { Vmov(al, rn, rt); } 9418 9419 void Vmov(Condition cond, Register rt, Register rt2, DRegister rm) { 9420 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 9421 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 9422 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9423 VIXL_ASSERT(allow_macro_instructions_); 9424 VIXL_ASSERT(OutsideITBlock()); 9425 MacroEmissionCheckScope guard(this); 9426 #ifndef PANDA_BUILD 9427 ITScope it_scope(this, &cond, guard); 9428 #else 9429 ITScope it_scope(allocator_, this, &cond, guard); 9430 #endif 9431 vmov(cond, rt, rt2, rm); 9432 } 9433 void Vmov(Register rt, Register rt2, DRegister rm) { Vmov(al, rt, rt2, rm); } 9434 9435 void Vmov(Condition cond, DRegister rm, Register rt, Register rt2) { 9436 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9437 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 9438 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 9439 VIXL_ASSERT(allow_macro_instructions_); 9440 VIXL_ASSERT(OutsideITBlock()); 9441 MacroEmissionCheckScope guard(this); 9442 #ifndef PANDA_BUILD 9443 ITScope it_scope(this, &cond, guard); 9444 #else 9445 ITScope it_scope(allocator_, this, &cond, guard); 9446 #endif 9447 vmov(cond, rm, rt, rt2); 9448 } 9449 void Vmov(DRegister rm, Register rt, Register rt2) { Vmov(al, rm, rt, rt2); } 9450 9451 void Vmov( 9452 Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) { 9453 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 9454 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 9455 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9456 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1)); 9457 VIXL_ASSERT(allow_macro_instructions_); 9458 VIXL_ASSERT(OutsideITBlock()); 9459 MacroEmissionCheckScope guard(this); 9460 #ifndef PANDA_BUILD 9461 ITScope it_scope(this, &cond, guard); 9462 #else 9463 ITScope it_scope(allocator_, this, &cond, guard); 9464 #endif 9465 vmov(cond, rt, rt2, rm, rm1); 9466 } 9467 void Vmov(Register rt, Register rt2, SRegister rm, SRegister rm1) { 9468 Vmov(al, rt, rt2, rm, rm1); 9469 } 9470 9471 void Vmov( 9472 Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) { 9473 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9474 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm1)); 9475 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 9476 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt2)); 9477 VIXL_ASSERT(allow_macro_instructions_); 9478 VIXL_ASSERT(OutsideITBlock()); 9479 MacroEmissionCheckScope guard(this); 9480 #ifndef PANDA_BUILD 9481 ITScope it_scope(this, &cond, guard); 9482 #else 9483 ITScope it_scope(allocator_, this, &cond, guard); 9484 #endif 9485 vmov(cond, rm, rm1, rt, rt2); 9486 } 9487 void Vmov(SRegister rm, SRegister rm1, Register rt, Register rt2) { 9488 Vmov(al, rm, rm1, rt, rt2); 9489 } 9490 9491 void Vmov(Condition cond, DataType dt, DRegisterLane rd, Register rt) { 9492 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9493 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 9494 VIXL_ASSERT(allow_macro_instructions_); 9495 VIXL_ASSERT(OutsideITBlock()); 9496 MacroEmissionCheckScope guard(this); 9497 #ifndef PANDA_BUILD 9498 ITScope it_scope(this, &cond, guard); 9499 #else 9500 ITScope it_scope(allocator_, this, &cond, guard); 9501 #endif 9502 vmov(cond, dt, rd, rt); 9503 } 9504 void Vmov(DataType dt, DRegisterLane rd, Register rt) { 9505 Vmov(al, dt, rd, rt); 9506 } 9507 void Vmov(Condition cond, DRegisterLane rd, Register rt) { 9508 Vmov(cond, kDataTypeValueNone, rd, rt); 9509 } 9510 void Vmov(DRegisterLane rd, Register rt) { 9511 Vmov(al, kDataTypeValueNone, rd, rt); 9512 } 9513 9514 void Vmov(Condition cond, 9515 DataType dt, 9516 DRegister rd, 9517 const DOperand& operand) { 9518 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9519 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 9520 VIXL_ASSERT(allow_macro_instructions_); 9521 VIXL_ASSERT(OutsideITBlock()); 9522 MacroEmissionCheckScope guard(this); 9523 #ifndef PANDA_BUILD 9524 ITScope it_scope(this, &cond, guard); 9525 #else 9526 ITScope it_scope(allocator_, this, &cond, guard); 9527 #endif 9528 vmov(cond, dt, rd, operand); 9529 } 9530 void Vmov(DataType dt, DRegister rd, const DOperand& operand) { 9531 Vmov(al, dt, rd, operand); 9532 } 9533 9534 void Vmov(Condition cond, 9535 DataType dt, 9536 QRegister rd, 9537 const QOperand& operand) { 9538 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9539 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 9540 VIXL_ASSERT(allow_macro_instructions_); 9541 VIXL_ASSERT(OutsideITBlock()); 9542 MacroEmissionCheckScope guard(this); 9543 #ifndef PANDA_BUILD 9544 ITScope it_scope(this, &cond, guard); 9545 #else 9546 ITScope it_scope(allocator_, this, &cond, guard); 9547 #endif 9548 vmov(cond, dt, rd, operand); 9549 } 9550 void Vmov(DataType dt, QRegister rd, const QOperand& operand) { 9551 Vmov(al, dt, rd, operand); 9552 } 9553 9554 void Vmov(Condition cond, 9555 DataType dt, 9556 SRegister rd, 9557 const SOperand& operand) { 9558 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9559 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 9560 VIXL_ASSERT(allow_macro_instructions_); 9561 VIXL_ASSERT(OutsideITBlock()); 9562 MacroEmissionCheckScope guard(this); 9563 #ifndef PANDA_BUILD 9564 ITScope it_scope(this, &cond, guard); 9565 #else 9566 ITScope it_scope(allocator_, this, &cond, guard); 9567 #endif 9568 vmov(cond, dt, rd, operand); 9569 } 9570 void Vmov(DataType dt, SRegister rd, const SOperand& operand) { 9571 Vmov(al, dt, rd, operand); 9572 } 9573 9574 void Vmov(Condition cond, DataType dt, Register rt, DRegisterLane rn) { 9575 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 9576 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9577 VIXL_ASSERT(allow_macro_instructions_); 9578 VIXL_ASSERT(OutsideITBlock()); 9579 MacroEmissionCheckScope guard(this); 9580 #ifndef PANDA_BUILD 9581 ITScope it_scope(this, &cond, guard); 9582 #else 9583 ITScope it_scope(allocator_, this, &cond, guard); 9584 #endif 9585 vmov(cond, dt, rt, rn); 9586 } 9587 void Vmov(DataType dt, Register rt, DRegisterLane rn) { 9588 Vmov(al, dt, rt, rn); 9589 } 9590 void Vmov(Condition cond, Register rt, DRegisterLane rn) { 9591 Vmov(cond, kDataTypeValueNone, rt, rn); 9592 } 9593 void Vmov(Register rt, DRegisterLane rn) { 9594 Vmov(al, kDataTypeValueNone, rt, rn); 9595 } 9596 9597 void Vmovl(Condition cond, DataType dt, QRegister rd, DRegister rm) { 9598 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9599 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9600 VIXL_ASSERT(allow_macro_instructions_); 9601 VIXL_ASSERT(OutsideITBlock()); 9602 MacroEmissionCheckScope guard(this); 9603 #ifndef PANDA_BUILD 9604 ITScope it_scope(this, &cond, guard); 9605 #else 9606 ITScope it_scope(allocator_, this, &cond, guard); 9607 #endif 9608 vmovl(cond, dt, rd, rm); 9609 } 9610 void Vmovl(DataType dt, QRegister rd, DRegister rm) { Vmovl(al, dt, rd, rm); } 9611 9612 void Vmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) { 9613 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9614 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9615 VIXL_ASSERT(allow_macro_instructions_); 9616 VIXL_ASSERT(OutsideITBlock()); 9617 MacroEmissionCheckScope guard(this); 9618 #ifndef PANDA_BUILD 9619 ITScope it_scope(this, &cond, guard); 9620 #else 9621 ITScope it_scope(allocator_, this, &cond, guard); 9622 #endif 9623 vmovn(cond, dt, rd, rm); 9624 } 9625 void Vmovn(DataType dt, DRegister rd, QRegister rm) { Vmovn(al, dt, rd, rm); } 9626 9627 void Vmrs(Condition cond, 9628 RegisterOrAPSR_nzcv rt, 9629 SpecialFPRegister spec_reg) { 9630 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 9631 VIXL_ASSERT(allow_macro_instructions_); 9632 VIXL_ASSERT(OutsideITBlock()); 9633 MacroEmissionCheckScope guard(this); 9634 #ifndef PANDA_BUILD 9635 ITScope it_scope(this, &cond, guard); 9636 #else 9637 ITScope it_scope(allocator_, this, &cond, guard); 9638 #endif 9639 vmrs(cond, rt, spec_reg); 9640 } 9641 void Vmrs(RegisterOrAPSR_nzcv rt, SpecialFPRegister spec_reg) { 9642 Vmrs(al, rt, spec_reg); 9643 } 9644 9645 void Vmsr(Condition cond, SpecialFPRegister spec_reg, Register rt) { 9646 VIXL_ASSERT(!AliasesAvailableScratchRegister(rt)); 9647 VIXL_ASSERT(allow_macro_instructions_); 9648 VIXL_ASSERT(OutsideITBlock()); 9649 MacroEmissionCheckScope guard(this); 9650 #ifndef PANDA_BUILD 9651 ITScope it_scope(this, &cond, guard); 9652 #else 9653 ITScope it_scope(allocator_, this, &cond, guard); 9654 #endif 9655 vmsr(cond, spec_reg, rt); 9656 } 9657 void Vmsr(SpecialFPRegister spec_reg, Register rt) { Vmsr(al, spec_reg, rt); } 9658 9659 void Vmul(Condition cond, 9660 DataType dt, 9661 DRegister rd, 9662 DRegister rn, 9663 DRegister dm, 9664 unsigned index) { 9665 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9666 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9667 VIXL_ASSERT(!AliasesAvailableScratchRegister(dm)); 9668 VIXL_ASSERT(allow_macro_instructions_); 9669 VIXL_ASSERT(OutsideITBlock()); 9670 MacroEmissionCheckScope guard(this); 9671 #ifndef PANDA_BUILD 9672 ITScope it_scope(this, &cond, guard); 9673 #else 9674 ITScope it_scope(allocator_, this, &cond, guard); 9675 #endif 9676 vmul(cond, dt, rd, rn, dm, index); 9677 } 9678 void Vmul( 9679 DataType dt, DRegister rd, DRegister rn, DRegister dm, unsigned index) { 9680 Vmul(al, dt, rd, rn, dm, index); 9681 } 9682 9683 void Vmul(Condition cond, 9684 DataType dt, 9685 QRegister rd, 9686 QRegister rn, 9687 DRegister dm, 9688 unsigned index) { 9689 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9690 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9691 VIXL_ASSERT(!AliasesAvailableScratchRegister(dm)); 9692 VIXL_ASSERT(allow_macro_instructions_); 9693 VIXL_ASSERT(OutsideITBlock()); 9694 MacroEmissionCheckScope guard(this); 9695 #ifndef PANDA_BUILD 9696 ITScope it_scope(this, &cond, guard); 9697 #else 9698 ITScope it_scope(allocator_, this, &cond, guard); 9699 #endif 9700 vmul(cond, dt, rd, rn, dm, index); 9701 } 9702 void Vmul( 9703 DataType dt, QRegister rd, QRegister rn, DRegister dm, unsigned index) { 9704 Vmul(al, dt, rd, rn, dm, index); 9705 } 9706 9707 void Vmul( 9708 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9709 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9710 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9711 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9712 VIXL_ASSERT(allow_macro_instructions_); 9713 VIXL_ASSERT(OutsideITBlock()); 9714 MacroEmissionCheckScope guard(this); 9715 #ifndef PANDA_BUILD 9716 ITScope it_scope(this, &cond, guard); 9717 #else 9718 ITScope it_scope(allocator_, this, &cond, guard); 9719 #endif 9720 vmul(cond, dt, rd, rn, rm); 9721 } 9722 void Vmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9723 Vmul(al, dt, rd, rn, rm); 9724 } 9725 9726 void Vmul( 9727 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9728 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9729 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9730 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9731 VIXL_ASSERT(allow_macro_instructions_); 9732 VIXL_ASSERT(OutsideITBlock()); 9733 MacroEmissionCheckScope guard(this); 9734 #ifndef PANDA_BUILD 9735 ITScope it_scope(this, &cond, guard); 9736 #else 9737 ITScope it_scope(allocator_, this, &cond, guard); 9738 #endif 9739 vmul(cond, dt, rd, rn, rm); 9740 } 9741 void Vmul(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 9742 Vmul(al, dt, rd, rn, rm); 9743 } 9744 9745 void Vmul( 9746 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9747 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9748 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9749 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9750 VIXL_ASSERT(allow_macro_instructions_); 9751 VIXL_ASSERT(OutsideITBlock()); 9752 MacroEmissionCheckScope guard(this); 9753 #ifndef PANDA_BUILD 9754 ITScope it_scope(this, &cond, guard); 9755 #else 9756 ITScope it_scope(allocator_, this, &cond, guard); 9757 #endif 9758 vmul(cond, dt, rd, rn, rm); 9759 } 9760 void Vmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9761 Vmul(al, dt, rd, rn, rm); 9762 } 9763 9764 void Vmull(Condition cond, 9765 DataType dt, 9766 QRegister rd, 9767 DRegister rn, 9768 DRegister dm, 9769 unsigned index) { 9770 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9771 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9772 VIXL_ASSERT(!AliasesAvailableScratchRegister(dm)); 9773 VIXL_ASSERT(allow_macro_instructions_); 9774 VIXL_ASSERT(OutsideITBlock()); 9775 MacroEmissionCheckScope guard(this); 9776 #ifndef PANDA_BUILD 9777 ITScope it_scope(this, &cond, guard); 9778 #else 9779 ITScope it_scope(allocator_, this, &cond, guard); 9780 #endif 9781 vmull(cond, dt, rd, rn, dm, index); 9782 } 9783 void Vmull( 9784 DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) { 9785 Vmull(al, dt, rd, rn, dm, index); 9786 } 9787 9788 void Vmull( 9789 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 9790 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9791 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9792 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9793 VIXL_ASSERT(allow_macro_instructions_); 9794 VIXL_ASSERT(OutsideITBlock()); 9795 MacroEmissionCheckScope guard(this); 9796 #ifndef PANDA_BUILD 9797 ITScope it_scope(this, &cond, guard); 9798 #else 9799 ITScope it_scope(allocator_, this, &cond, guard); 9800 #endif 9801 vmull(cond, dt, rd, rn, rm); 9802 } 9803 void Vmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) { 9804 Vmull(al, dt, rd, rn, rm); 9805 } 9806 9807 void Vmvn(Condition cond, 9808 DataType dt, 9809 DRegister rd, 9810 const DOperand& operand) { 9811 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9812 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 9813 VIXL_ASSERT(allow_macro_instructions_); 9814 VIXL_ASSERT(OutsideITBlock()); 9815 MacroEmissionCheckScope guard(this); 9816 #ifndef PANDA_BUILD 9817 ITScope it_scope(this, &cond, guard); 9818 #else 9819 ITScope it_scope(allocator_, this, &cond, guard); 9820 #endif 9821 vmvn(cond, dt, rd, operand); 9822 } 9823 void Vmvn(DataType dt, DRegister rd, const DOperand& operand) { 9824 Vmvn(al, dt, rd, operand); 9825 } 9826 9827 void Vmvn(Condition cond, 9828 DataType dt, 9829 QRegister rd, 9830 const QOperand& operand) { 9831 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9832 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 9833 VIXL_ASSERT(allow_macro_instructions_); 9834 VIXL_ASSERT(OutsideITBlock()); 9835 MacroEmissionCheckScope guard(this); 9836 #ifndef PANDA_BUILD 9837 ITScope it_scope(this, &cond, guard); 9838 #else 9839 ITScope it_scope(allocator_, this, &cond, guard); 9840 #endif 9841 vmvn(cond, dt, rd, operand); 9842 } 9843 void Vmvn(DataType dt, QRegister rd, const QOperand& operand) { 9844 Vmvn(al, dt, rd, operand); 9845 } 9846 9847 void Vneg(Condition cond, DataType dt, DRegister rd, DRegister rm) { 9848 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9849 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9850 VIXL_ASSERT(allow_macro_instructions_); 9851 VIXL_ASSERT(OutsideITBlock()); 9852 MacroEmissionCheckScope guard(this); 9853 #ifndef PANDA_BUILD 9854 ITScope it_scope(this, &cond, guard); 9855 #else 9856 ITScope it_scope(allocator_, this, &cond, guard); 9857 #endif 9858 vneg(cond, dt, rd, rm); 9859 } 9860 void Vneg(DataType dt, DRegister rd, DRegister rm) { Vneg(al, dt, rd, rm); } 9861 9862 void Vneg(Condition cond, DataType dt, QRegister rd, QRegister rm) { 9863 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9864 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9865 VIXL_ASSERT(allow_macro_instructions_); 9866 VIXL_ASSERT(OutsideITBlock()); 9867 MacroEmissionCheckScope guard(this); 9868 #ifndef PANDA_BUILD 9869 ITScope it_scope(this, &cond, guard); 9870 #else 9871 ITScope it_scope(allocator_, this, &cond, guard); 9872 #endif 9873 vneg(cond, dt, rd, rm); 9874 } 9875 void Vneg(DataType dt, QRegister rd, QRegister rm) { Vneg(al, dt, rd, rm); } 9876 9877 void Vneg(Condition cond, DataType dt, SRegister rd, SRegister rm) { 9878 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9879 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9880 VIXL_ASSERT(allow_macro_instructions_); 9881 VIXL_ASSERT(OutsideITBlock()); 9882 MacroEmissionCheckScope guard(this); 9883 #ifndef PANDA_BUILD 9884 ITScope it_scope(this, &cond, guard); 9885 #else 9886 ITScope it_scope(allocator_, this, &cond, guard); 9887 #endif 9888 vneg(cond, dt, rd, rm); 9889 } 9890 void Vneg(DataType dt, SRegister rd, SRegister rm) { Vneg(al, dt, rd, rm); } 9891 9892 void Vnmla( 9893 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9894 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9895 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9896 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9897 VIXL_ASSERT(allow_macro_instructions_); 9898 VIXL_ASSERT(OutsideITBlock()); 9899 MacroEmissionCheckScope guard(this); 9900 #ifndef PANDA_BUILD 9901 ITScope it_scope(this, &cond, guard); 9902 #else 9903 ITScope it_scope(allocator_, this, &cond, guard); 9904 #endif 9905 vnmla(cond, dt, rd, rn, rm); 9906 } 9907 void Vnmla(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9908 Vnmla(al, dt, rd, rn, rm); 9909 } 9910 9911 void Vnmla( 9912 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9913 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9914 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9915 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9916 VIXL_ASSERT(allow_macro_instructions_); 9917 VIXL_ASSERT(OutsideITBlock()); 9918 MacroEmissionCheckScope guard(this); 9919 #ifndef PANDA_BUILD 9920 ITScope it_scope(this, &cond, guard); 9921 #else 9922 ITScope it_scope(allocator_, this, &cond, guard); 9923 #endif 9924 vnmla(cond, dt, rd, rn, rm); 9925 } 9926 void Vnmla(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9927 Vnmla(al, dt, rd, rn, rm); 9928 } 9929 9930 void Vnmls( 9931 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9932 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9933 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9934 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9935 VIXL_ASSERT(allow_macro_instructions_); 9936 VIXL_ASSERT(OutsideITBlock()); 9937 MacroEmissionCheckScope guard(this); 9938 #ifndef PANDA_BUILD 9939 ITScope it_scope(this, &cond, guard); 9940 #else 9941 ITScope it_scope(allocator_, this, &cond, guard); 9942 #endif 9943 vnmls(cond, dt, rd, rn, rm); 9944 } 9945 void Vnmls(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9946 Vnmls(al, dt, rd, rn, rm); 9947 } 9948 9949 void Vnmls( 9950 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9951 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9952 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9953 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9954 VIXL_ASSERT(allow_macro_instructions_); 9955 VIXL_ASSERT(OutsideITBlock()); 9956 MacroEmissionCheckScope guard(this); 9957 #ifndef PANDA_BUILD 9958 ITScope it_scope(this, &cond, guard); 9959 #else 9960 ITScope it_scope(allocator_, this, &cond, guard); 9961 #endif 9962 vnmls(cond, dt, rd, rn, rm); 9963 } 9964 void Vnmls(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9965 Vnmls(al, dt, rd, rn, rm); 9966 } 9967 9968 void Vnmul( 9969 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9970 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9971 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9972 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9973 VIXL_ASSERT(allow_macro_instructions_); 9974 VIXL_ASSERT(OutsideITBlock()); 9975 MacroEmissionCheckScope guard(this); 9976 #ifndef PANDA_BUILD 9977 ITScope it_scope(this, &cond, guard); 9978 #else 9979 ITScope it_scope(allocator_, this, &cond, guard); 9980 #endif 9981 vnmul(cond, dt, rd, rn, rm); 9982 } 9983 void Vnmul(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 9984 Vnmul(al, dt, rd, rn, rm); 9985 } 9986 9987 void Vnmul( 9988 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 9989 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 9990 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 9991 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 9992 VIXL_ASSERT(allow_macro_instructions_); 9993 VIXL_ASSERT(OutsideITBlock()); 9994 MacroEmissionCheckScope guard(this); 9995 #ifndef PANDA_BUILD 9996 ITScope it_scope(this, &cond, guard); 9997 #else 9998 ITScope it_scope(allocator_, this, &cond, guard); 9999 #endif 10000 vnmul(cond, dt, rd, rn, rm); 10001 } 10002 void Vnmul(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10003 Vnmul(al, dt, rd, rn, rm); 10004 } 10005 10006 void Vorn(Condition cond, 10007 DataType dt, 10008 DRegister rd, 10009 DRegister rn, 10010 const DOperand& operand) { 10011 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10012 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10013 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10014 VIXL_ASSERT(allow_macro_instructions_); 10015 VIXL_ASSERT(OutsideITBlock()); 10016 MacroEmissionCheckScope guard(this); 10017 #ifndef PANDA_BUILD 10018 ITScope it_scope(this, &cond, guard); 10019 #else 10020 ITScope it_scope(allocator_, this, &cond, guard); 10021 #endif 10022 vorn(cond, dt, rd, rn, operand); 10023 } 10024 void Vorn(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) { 10025 Vorn(al, dt, rd, rn, operand); 10026 } 10027 10028 void Vorn(Condition cond, 10029 DataType dt, 10030 QRegister rd, 10031 QRegister rn, 10032 const QOperand& operand) { 10033 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10034 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10035 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10036 VIXL_ASSERT(allow_macro_instructions_); 10037 VIXL_ASSERT(OutsideITBlock()); 10038 MacroEmissionCheckScope guard(this); 10039 #ifndef PANDA_BUILD 10040 ITScope it_scope(this, &cond, guard); 10041 #else 10042 ITScope it_scope(allocator_, this, &cond, guard); 10043 #endif 10044 vorn(cond, dt, rd, rn, operand); 10045 } 10046 void Vorn(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) { 10047 Vorn(al, dt, rd, rn, operand); 10048 } 10049 10050 void Vorr(Condition cond, 10051 DataType dt, 10052 DRegister rd, 10053 DRegister rn, 10054 const DOperand& operand) { 10055 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10056 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10057 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10058 VIXL_ASSERT(allow_macro_instructions_); 10059 VIXL_ASSERT(OutsideITBlock()); 10060 MacroEmissionCheckScope guard(this); 10061 #ifndef PANDA_BUILD 10062 ITScope it_scope(this, &cond, guard); 10063 #else 10064 ITScope it_scope(allocator_, this, &cond, guard); 10065 #endif 10066 vorr(cond, dt, rd, rn, operand); 10067 } 10068 void Vorr(DataType dt, DRegister rd, DRegister rn, const DOperand& operand) { 10069 Vorr(al, dt, rd, rn, operand); 10070 } 10071 void Vorr(Condition cond, 10072 DRegister rd, 10073 DRegister rn, 10074 const DOperand& operand) { 10075 Vorr(cond, kDataTypeValueNone, rd, rn, operand); 10076 } 10077 void Vorr(DRegister rd, DRegister rn, const DOperand& operand) { 10078 Vorr(al, kDataTypeValueNone, rd, rn, operand); 10079 } 10080 10081 void Vorr(Condition cond, 10082 DataType dt, 10083 QRegister rd, 10084 QRegister rn, 10085 const QOperand& operand) { 10086 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10087 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10088 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10089 VIXL_ASSERT(allow_macro_instructions_); 10090 VIXL_ASSERT(OutsideITBlock()); 10091 MacroEmissionCheckScope guard(this); 10092 #ifndef PANDA_BUILD 10093 ITScope it_scope(this, &cond, guard); 10094 #else 10095 ITScope it_scope(allocator_, this, &cond, guard); 10096 #endif 10097 vorr(cond, dt, rd, rn, operand); 10098 } 10099 void Vorr(DataType dt, QRegister rd, QRegister rn, const QOperand& operand) { 10100 Vorr(al, dt, rd, rn, operand); 10101 } 10102 void Vorr(Condition cond, 10103 QRegister rd, 10104 QRegister rn, 10105 const QOperand& operand) { 10106 Vorr(cond, kDataTypeValueNone, rd, rn, operand); 10107 } 10108 void Vorr(QRegister rd, QRegister rn, const QOperand& operand) { 10109 Vorr(al, kDataTypeValueNone, rd, rn, operand); 10110 } 10111 10112 void Vpadal(Condition cond, DataType dt, DRegister rd, DRegister rm) { 10113 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10114 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10115 VIXL_ASSERT(allow_macro_instructions_); 10116 VIXL_ASSERT(OutsideITBlock()); 10117 MacroEmissionCheckScope guard(this); 10118 #ifndef PANDA_BUILD 10119 ITScope it_scope(this, &cond, guard); 10120 #else 10121 ITScope it_scope(allocator_, this, &cond, guard); 10122 #endif 10123 vpadal(cond, dt, rd, rm); 10124 } 10125 void Vpadal(DataType dt, DRegister rd, DRegister rm) { 10126 Vpadal(al, dt, rd, rm); 10127 } 10128 10129 void Vpadal(Condition cond, DataType dt, QRegister rd, QRegister rm) { 10130 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10131 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10132 VIXL_ASSERT(allow_macro_instructions_); 10133 VIXL_ASSERT(OutsideITBlock()); 10134 MacroEmissionCheckScope guard(this); 10135 #ifndef PANDA_BUILD 10136 ITScope it_scope(this, &cond, guard); 10137 #else 10138 ITScope it_scope(allocator_, this, &cond, guard); 10139 #endif 10140 vpadal(cond, dt, rd, rm); 10141 } 10142 void Vpadal(DataType dt, QRegister rd, QRegister rm) { 10143 Vpadal(al, dt, rd, rm); 10144 } 10145 10146 void Vpadd( 10147 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10148 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10149 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10150 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10151 VIXL_ASSERT(allow_macro_instructions_); 10152 VIXL_ASSERT(OutsideITBlock()); 10153 MacroEmissionCheckScope guard(this); 10154 #ifndef PANDA_BUILD 10155 ITScope it_scope(this, &cond, guard); 10156 #else 10157 ITScope it_scope(allocator_, this, &cond, guard); 10158 #endif 10159 vpadd(cond, dt, rd, rn, rm); 10160 } 10161 void Vpadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10162 Vpadd(al, dt, rd, rn, rm); 10163 } 10164 10165 void Vpaddl(Condition cond, DataType dt, DRegister rd, DRegister rm) { 10166 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10167 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10168 VIXL_ASSERT(allow_macro_instructions_); 10169 VIXL_ASSERT(OutsideITBlock()); 10170 MacroEmissionCheckScope guard(this); 10171 #ifndef PANDA_BUILD 10172 ITScope it_scope(this, &cond, guard); 10173 #else 10174 ITScope it_scope(allocator_, this, &cond, guard); 10175 #endif 10176 vpaddl(cond, dt, rd, rm); 10177 } 10178 void Vpaddl(DataType dt, DRegister rd, DRegister rm) { 10179 Vpaddl(al, dt, rd, rm); 10180 } 10181 10182 void Vpaddl(Condition cond, DataType dt, QRegister rd, QRegister rm) { 10183 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10184 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10185 VIXL_ASSERT(allow_macro_instructions_); 10186 VIXL_ASSERT(OutsideITBlock()); 10187 MacroEmissionCheckScope guard(this); 10188 #ifndef PANDA_BUILD 10189 ITScope it_scope(this, &cond, guard); 10190 #else 10191 ITScope it_scope(allocator_, this, &cond, guard); 10192 #endif 10193 vpaddl(cond, dt, rd, rm); 10194 } 10195 void Vpaddl(DataType dt, QRegister rd, QRegister rm) { 10196 Vpaddl(al, dt, rd, rm); 10197 } 10198 10199 void Vpmax( 10200 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10201 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10202 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10203 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10204 VIXL_ASSERT(allow_macro_instructions_); 10205 VIXL_ASSERT(OutsideITBlock()); 10206 MacroEmissionCheckScope guard(this); 10207 #ifndef PANDA_BUILD 10208 ITScope it_scope(this, &cond, guard); 10209 #else 10210 ITScope it_scope(allocator_, this, &cond, guard); 10211 #endif 10212 vpmax(cond, dt, rd, rn, rm); 10213 } 10214 void Vpmax(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10215 Vpmax(al, dt, rd, rn, rm); 10216 } 10217 10218 void Vpmin( 10219 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10220 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10221 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10222 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10223 VIXL_ASSERT(allow_macro_instructions_); 10224 VIXL_ASSERT(OutsideITBlock()); 10225 MacroEmissionCheckScope guard(this); 10226 #ifndef PANDA_BUILD 10227 ITScope it_scope(this, &cond, guard); 10228 #else 10229 ITScope it_scope(allocator_, this, &cond, guard); 10230 #endif 10231 vpmin(cond, dt, rd, rn, rm); 10232 } 10233 void Vpmin(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10234 Vpmin(al, dt, rd, rn, rm); 10235 } 10236 10237 void Vpop(Condition cond, DataType dt, DRegisterList dreglist) { 10238 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 10239 VIXL_ASSERT(allow_macro_instructions_); 10240 VIXL_ASSERT(OutsideITBlock()); 10241 MacroEmissionCheckScope guard(this); 10242 #ifndef PANDA_BUILD 10243 ITScope it_scope(this, &cond, guard); 10244 #else 10245 ITScope it_scope(allocator_, this, &cond, guard); 10246 #endif 10247 vpop(cond, dt, dreglist); 10248 } 10249 void Vpop(DataType dt, DRegisterList dreglist) { Vpop(al, dt, dreglist); } 10250 void Vpop(Condition cond, DRegisterList dreglist) { 10251 Vpop(cond, kDataTypeValueNone, dreglist); 10252 } 10253 void Vpop(DRegisterList dreglist) { Vpop(al, kDataTypeValueNone, dreglist); } 10254 10255 void Vpop(Condition cond, DataType dt, SRegisterList sreglist) { 10256 VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); 10257 VIXL_ASSERT(allow_macro_instructions_); 10258 VIXL_ASSERT(OutsideITBlock()); 10259 MacroEmissionCheckScope guard(this); 10260 #ifndef PANDA_BUILD 10261 ITScope it_scope(this, &cond, guard); 10262 #else 10263 ITScope it_scope(allocator_, this, &cond, guard); 10264 #endif 10265 vpop(cond, dt, sreglist); 10266 } 10267 void Vpop(DataType dt, SRegisterList sreglist) { Vpop(al, dt, sreglist); } 10268 void Vpop(Condition cond, SRegisterList sreglist) { 10269 Vpop(cond, kDataTypeValueNone, sreglist); 10270 } 10271 void Vpop(SRegisterList sreglist) { Vpop(al, kDataTypeValueNone, sreglist); } 10272 10273 void Vpush(Condition cond, DataType dt, DRegisterList dreglist) { 10274 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 10275 VIXL_ASSERT(allow_macro_instructions_); 10276 VIXL_ASSERT(OutsideITBlock()); 10277 MacroEmissionCheckScope guard(this); 10278 #ifndef PANDA_BUILD 10279 ITScope it_scope(this, &cond, guard); 10280 #else 10281 ITScope it_scope(allocator_, this, &cond, guard); 10282 #endif 10283 vpush(cond, dt, dreglist); 10284 } 10285 void Vpush(DataType dt, DRegisterList dreglist) { Vpush(al, dt, dreglist); } 10286 void Vpush(Condition cond, DRegisterList dreglist) { 10287 Vpush(cond, kDataTypeValueNone, dreglist); 10288 } 10289 void Vpush(DRegisterList dreglist) { 10290 Vpush(al, kDataTypeValueNone, dreglist); 10291 } 10292 10293 void Vpush(Condition cond, DataType dt, SRegisterList sreglist) { 10294 VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); 10295 VIXL_ASSERT(allow_macro_instructions_); 10296 VIXL_ASSERT(OutsideITBlock()); 10297 MacroEmissionCheckScope guard(this); 10298 #ifndef PANDA_BUILD 10299 ITScope it_scope(this, &cond, guard); 10300 #else 10301 ITScope it_scope(allocator_, this, &cond, guard); 10302 #endif 10303 vpush(cond, dt, sreglist); 10304 } 10305 void Vpush(DataType dt, SRegisterList sreglist) { Vpush(al, dt, sreglist); } 10306 void Vpush(Condition cond, SRegisterList sreglist) { 10307 Vpush(cond, kDataTypeValueNone, sreglist); 10308 } 10309 void Vpush(SRegisterList sreglist) { 10310 Vpush(al, kDataTypeValueNone, sreglist); 10311 } 10312 10313 void Vqabs(Condition cond, DataType dt, DRegister rd, DRegister rm) { 10314 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10315 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10316 VIXL_ASSERT(allow_macro_instructions_); 10317 VIXL_ASSERT(OutsideITBlock()); 10318 MacroEmissionCheckScope guard(this); 10319 #ifndef PANDA_BUILD 10320 ITScope it_scope(this, &cond, guard); 10321 #else 10322 ITScope it_scope(allocator_, this, &cond, guard); 10323 #endif 10324 vqabs(cond, dt, rd, rm); 10325 } 10326 void Vqabs(DataType dt, DRegister rd, DRegister rm) { Vqabs(al, dt, rd, rm); } 10327 10328 void Vqabs(Condition cond, DataType dt, QRegister rd, QRegister rm) { 10329 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10330 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10331 VIXL_ASSERT(allow_macro_instructions_); 10332 VIXL_ASSERT(OutsideITBlock()); 10333 MacroEmissionCheckScope guard(this); 10334 #ifndef PANDA_BUILD 10335 ITScope it_scope(this, &cond, guard); 10336 #else 10337 ITScope it_scope(allocator_, this, &cond, guard); 10338 #endif 10339 vqabs(cond, dt, rd, rm); 10340 } 10341 void Vqabs(DataType dt, QRegister rd, QRegister rm) { Vqabs(al, dt, rd, rm); } 10342 10343 void Vqadd( 10344 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10345 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10346 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10347 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10348 VIXL_ASSERT(allow_macro_instructions_); 10349 VIXL_ASSERT(OutsideITBlock()); 10350 MacroEmissionCheckScope guard(this); 10351 #ifndef PANDA_BUILD 10352 ITScope it_scope(this, &cond, guard); 10353 #else 10354 ITScope it_scope(allocator_, this, &cond, guard); 10355 #endif 10356 vqadd(cond, dt, rd, rn, rm); 10357 } 10358 void Vqadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10359 Vqadd(al, dt, rd, rn, rm); 10360 } 10361 10362 void Vqadd( 10363 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 10364 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10365 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10366 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10367 VIXL_ASSERT(allow_macro_instructions_); 10368 VIXL_ASSERT(OutsideITBlock()); 10369 MacroEmissionCheckScope guard(this); 10370 #ifndef PANDA_BUILD 10371 ITScope it_scope(this, &cond, guard); 10372 #else 10373 ITScope it_scope(allocator_, this, &cond, guard); 10374 #endif 10375 vqadd(cond, dt, rd, rn, rm); 10376 } 10377 void Vqadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 10378 Vqadd(al, dt, rd, rn, rm); 10379 } 10380 10381 void Vqdmlal( 10382 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 10383 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10384 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10385 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10386 VIXL_ASSERT(allow_macro_instructions_); 10387 VIXL_ASSERT(OutsideITBlock()); 10388 MacroEmissionCheckScope guard(this); 10389 #ifndef PANDA_BUILD 10390 ITScope it_scope(this, &cond, guard); 10391 #else 10392 ITScope it_scope(allocator_, this, &cond, guard); 10393 #endif 10394 vqdmlal(cond, dt, rd, rn, rm); 10395 } 10396 void Vqdmlal(DataType dt, QRegister rd, DRegister rn, DRegister rm) { 10397 Vqdmlal(al, dt, rd, rn, rm); 10398 } 10399 10400 void Vqdmlal(Condition cond, 10401 DataType dt, 10402 QRegister rd, 10403 DRegister rn, 10404 DRegister dm, 10405 unsigned index) { 10406 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10407 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10408 VIXL_ASSERT(!AliasesAvailableScratchRegister(dm)); 10409 VIXL_ASSERT(allow_macro_instructions_); 10410 VIXL_ASSERT(OutsideITBlock()); 10411 MacroEmissionCheckScope guard(this); 10412 #ifndef PANDA_BUILD 10413 ITScope it_scope(this, &cond, guard); 10414 #else 10415 ITScope it_scope(allocator_, this, &cond, guard); 10416 #endif 10417 vqdmlal(cond, dt, rd, rn, dm, index); 10418 } 10419 void Vqdmlal( 10420 DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) { 10421 Vqdmlal(al, dt, rd, rn, dm, index); 10422 } 10423 10424 void Vqdmlsl( 10425 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 10426 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10427 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10428 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10429 VIXL_ASSERT(allow_macro_instructions_); 10430 VIXL_ASSERT(OutsideITBlock()); 10431 MacroEmissionCheckScope guard(this); 10432 #ifndef PANDA_BUILD 10433 ITScope it_scope(this, &cond, guard); 10434 #else 10435 ITScope it_scope(allocator_, this, &cond, guard); 10436 #endif 10437 vqdmlsl(cond, dt, rd, rn, rm); 10438 } 10439 void Vqdmlsl(DataType dt, QRegister rd, DRegister rn, DRegister rm) { 10440 Vqdmlsl(al, dt, rd, rn, rm); 10441 } 10442 10443 void Vqdmlsl(Condition cond, 10444 DataType dt, 10445 QRegister rd, 10446 DRegister rn, 10447 DRegister dm, 10448 unsigned index) { 10449 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10450 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10451 VIXL_ASSERT(!AliasesAvailableScratchRegister(dm)); 10452 VIXL_ASSERT(allow_macro_instructions_); 10453 VIXL_ASSERT(OutsideITBlock()); 10454 MacroEmissionCheckScope guard(this); 10455 #ifndef PANDA_BUILD 10456 ITScope it_scope(this, &cond, guard); 10457 #else 10458 ITScope it_scope(allocator_, this, &cond, guard); 10459 #endif 10460 vqdmlsl(cond, dt, rd, rn, dm, index); 10461 } 10462 void Vqdmlsl( 10463 DataType dt, QRegister rd, DRegister rn, DRegister dm, unsigned index) { 10464 Vqdmlsl(al, dt, rd, rn, dm, index); 10465 } 10466 10467 void Vqdmulh( 10468 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10469 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10470 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10471 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10472 VIXL_ASSERT(allow_macro_instructions_); 10473 VIXL_ASSERT(OutsideITBlock()); 10474 MacroEmissionCheckScope guard(this); 10475 #ifndef PANDA_BUILD 10476 ITScope it_scope(this, &cond, guard); 10477 #else 10478 ITScope it_scope(allocator_, this, &cond, guard); 10479 #endif 10480 vqdmulh(cond, dt, rd, rn, rm); 10481 } 10482 void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10483 Vqdmulh(al, dt, rd, rn, rm); 10484 } 10485 10486 void Vqdmulh( 10487 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 10488 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10489 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10490 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10491 VIXL_ASSERT(allow_macro_instructions_); 10492 VIXL_ASSERT(OutsideITBlock()); 10493 MacroEmissionCheckScope guard(this); 10494 #ifndef PANDA_BUILD 10495 ITScope it_scope(this, &cond, guard); 10496 #else 10497 ITScope it_scope(allocator_, this, &cond, guard); 10498 #endif 10499 vqdmulh(cond, dt, rd, rn, rm); 10500 } 10501 void Vqdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 10502 Vqdmulh(al, dt, rd, rn, rm); 10503 } 10504 10505 void Vqdmulh(Condition cond, 10506 DataType dt, 10507 DRegister rd, 10508 DRegister rn, 10509 DRegisterLane rm) { 10510 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10511 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10512 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10513 VIXL_ASSERT(allow_macro_instructions_); 10514 VIXL_ASSERT(OutsideITBlock()); 10515 MacroEmissionCheckScope guard(this); 10516 #ifndef PANDA_BUILD 10517 ITScope it_scope(this, &cond, guard); 10518 #else 10519 ITScope it_scope(allocator_, this, &cond, guard); 10520 #endif 10521 vqdmulh(cond, dt, rd, rn, rm); 10522 } 10523 void Vqdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 10524 Vqdmulh(al, dt, rd, rn, rm); 10525 } 10526 10527 void Vqdmulh(Condition cond, 10528 DataType dt, 10529 QRegister rd, 10530 QRegister rn, 10531 DRegisterLane rm) { 10532 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10533 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10534 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10535 VIXL_ASSERT(allow_macro_instructions_); 10536 VIXL_ASSERT(OutsideITBlock()); 10537 MacroEmissionCheckScope guard(this); 10538 #ifndef PANDA_BUILD 10539 ITScope it_scope(this, &cond, guard); 10540 #else 10541 ITScope it_scope(allocator_, this, &cond, guard); 10542 #endif 10543 vqdmulh(cond, dt, rd, rn, rm); 10544 } 10545 void Vqdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 10546 Vqdmulh(al, dt, rd, rn, rm); 10547 } 10548 10549 void Vqdmull( 10550 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 10551 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10552 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10553 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10554 VIXL_ASSERT(allow_macro_instructions_); 10555 VIXL_ASSERT(OutsideITBlock()); 10556 MacroEmissionCheckScope guard(this); 10557 #ifndef PANDA_BUILD 10558 ITScope it_scope(this, &cond, guard); 10559 #else 10560 ITScope it_scope(allocator_, this, &cond, guard); 10561 #endif 10562 vqdmull(cond, dt, rd, rn, rm); 10563 } 10564 void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegister rm) { 10565 Vqdmull(al, dt, rd, rn, rm); 10566 } 10567 10568 void Vqdmull(Condition cond, 10569 DataType dt, 10570 QRegister rd, 10571 DRegister rn, 10572 DRegisterLane rm) { 10573 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10574 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10575 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10576 VIXL_ASSERT(allow_macro_instructions_); 10577 VIXL_ASSERT(OutsideITBlock()); 10578 MacroEmissionCheckScope guard(this); 10579 #ifndef PANDA_BUILD 10580 ITScope it_scope(this, &cond, guard); 10581 #else 10582 ITScope it_scope(allocator_, this, &cond, guard); 10583 #endif 10584 vqdmull(cond, dt, rd, rn, rm); 10585 } 10586 void Vqdmull(DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { 10587 Vqdmull(al, dt, rd, rn, rm); 10588 } 10589 10590 void Vqmovn(Condition cond, DataType dt, DRegister rd, QRegister rm) { 10591 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10592 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10593 VIXL_ASSERT(allow_macro_instructions_); 10594 VIXL_ASSERT(OutsideITBlock()); 10595 MacroEmissionCheckScope guard(this); 10596 #ifndef PANDA_BUILD 10597 ITScope it_scope(this, &cond, guard); 10598 #else 10599 ITScope it_scope(allocator_, this, &cond, guard); 10600 #endif 10601 vqmovn(cond, dt, rd, rm); 10602 } 10603 void Vqmovn(DataType dt, DRegister rd, QRegister rm) { 10604 Vqmovn(al, dt, rd, rm); 10605 } 10606 10607 void Vqmovun(Condition cond, DataType dt, DRegister rd, QRegister rm) { 10608 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10609 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10610 VIXL_ASSERT(allow_macro_instructions_); 10611 VIXL_ASSERT(OutsideITBlock()); 10612 MacroEmissionCheckScope guard(this); 10613 #ifndef PANDA_BUILD 10614 ITScope it_scope(this, &cond, guard); 10615 #else 10616 ITScope it_scope(allocator_, this, &cond, guard); 10617 #endif 10618 vqmovun(cond, dt, rd, rm); 10619 } 10620 void Vqmovun(DataType dt, DRegister rd, QRegister rm) { 10621 Vqmovun(al, dt, rd, rm); 10622 } 10623 10624 void Vqneg(Condition cond, DataType dt, DRegister rd, DRegister rm) { 10625 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10626 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10627 VIXL_ASSERT(allow_macro_instructions_); 10628 VIXL_ASSERT(OutsideITBlock()); 10629 MacroEmissionCheckScope guard(this); 10630 #ifndef PANDA_BUILD 10631 ITScope it_scope(this, &cond, guard); 10632 #else 10633 ITScope it_scope(allocator_, this, &cond, guard); 10634 #endif 10635 vqneg(cond, dt, rd, rm); 10636 } 10637 void Vqneg(DataType dt, DRegister rd, DRegister rm) { Vqneg(al, dt, rd, rm); } 10638 10639 void Vqneg(Condition cond, DataType dt, QRegister rd, QRegister rm) { 10640 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10641 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10642 VIXL_ASSERT(allow_macro_instructions_); 10643 VIXL_ASSERT(OutsideITBlock()); 10644 MacroEmissionCheckScope guard(this); 10645 #ifndef PANDA_BUILD 10646 ITScope it_scope(this, &cond, guard); 10647 #else 10648 ITScope it_scope(allocator_, this, &cond, guard); 10649 #endif 10650 vqneg(cond, dt, rd, rm); 10651 } 10652 void Vqneg(DataType dt, QRegister rd, QRegister rm) { Vqneg(al, dt, rd, rm); } 10653 10654 void Vqrdmulh( 10655 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10656 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10657 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10658 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10659 VIXL_ASSERT(allow_macro_instructions_); 10660 VIXL_ASSERT(OutsideITBlock()); 10661 MacroEmissionCheckScope guard(this); 10662 #ifndef PANDA_BUILD 10663 ITScope it_scope(this, &cond, guard); 10664 #else 10665 ITScope it_scope(allocator_, this, &cond, guard); 10666 #endif 10667 vqrdmulh(cond, dt, rd, rn, rm); 10668 } 10669 void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10670 Vqrdmulh(al, dt, rd, rn, rm); 10671 } 10672 10673 void Vqrdmulh( 10674 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 10675 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10676 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10677 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10678 VIXL_ASSERT(allow_macro_instructions_); 10679 VIXL_ASSERT(OutsideITBlock()); 10680 MacroEmissionCheckScope guard(this); 10681 #ifndef PANDA_BUILD 10682 ITScope it_scope(this, &cond, guard); 10683 #else 10684 ITScope it_scope(allocator_, this, &cond, guard); 10685 #endif 10686 vqrdmulh(cond, dt, rd, rn, rm); 10687 } 10688 void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 10689 Vqrdmulh(al, dt, rd, rn, rm); 10690 } 10691 10692 void Vqrdmulh(Condition cond, 10693 DataType dt, 10694 DRegister rd, 10695 DRegister rn, 10696 DRegisterLane rm) { 10697 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10698 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10699 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10700 VIXL_ASSERT(allow_macro_instructions_); 10701 VIXL_ASSERT(OutsideITBlock()); 10702 MacroEmissionCheckScope guard(this); 10703 #ifndef PANDA_BUILD 10704 ITScope it_scope(this, &cond, guard); 10705 #else 10706 ITScope it_scope(allocator_, this, &cond, guard); 10707 #endif 10708 vqrdmulh(cond, dt, rd, rn, rm); 10709 } 10710 void Vqrdmulh(DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 10711 Vqrdmulh(al, dt, rd, rn, rm); 10712 } 10713 10714 void Vqrdmulh(Condition cond, 10715 DataType dt, 10716 QRegister rd, 10717 QRegister rn, 10718 DRegisterLane rm) { 10719 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10720 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10721 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10722 VIXL_ASSERT(allow_macro_instructions_); 10723 VIXL_ASSERT(OutsideITBlock()); 10724 MacroEmissionCheckScope guard(this); 10725 #ifndef PANDA_BUILD 10726 ITScope it_scope(this, &cond, guard); 10727 #else 10728 ITScope it_scope(allocator_, this, &cond, guard); 10729 #endif 10730 vqrdmulh(cond, dt, rd, rn, rm); 10731 } 10732 void Vqrdmulh(DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 10733 Vqrdmulh(al, dt, rd, rn, rm); 10734 } 10735 10736 void Vqrshl( 10737 Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) { 10738 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10739 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10740 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10741 VIXL_ASSERT(allow_macro_instructions_); 10742 VIXL_ASSERT(OutsideITBlock()); 10743 MacroEmissionCheckScope guard(this); 10744 #ifndef PANDA_BUILD 10745 ITScope it_scope(this, &cond, guard); 10746 #else 10747 ITScope it_scope(allocator_, this, &cond, guard); 10748 #endif 10749 vqrshl(cond, dt, rd, rm, rn); 10750 } 10751 void Vqrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) { 10752 Vqrshl(al, dt, rd, rm, rn); 10753 } 10754 10755 void Vqrshl( 10756 Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) { 10757 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10758 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10759 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10760 VIXL_ASSERT(allow_macro_instructions_); 10761 VIXL_ASSERT(OutsideITBlock()); 10762 MacroEmissionCheckScope guard(this); 10763 #ifndef PANDA_BUILD 10764 ITScope it_scope(this, &cond, guard); 10765 #else 10766 ITScope it_scope(allocator_, this, &cond, guard); 10767 #endif 10768 vqrshl(cond, dt, rd, rm, rn); 10769 } 10770 void Vqrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) { 10771 Vqrshl(al, dt, rd, rm, rn); 10772 } 10773 10774 void Vqrshrn(Condition cond, 10775 DataType dt, 10776 DRegister rd, 10777 QRegister rm, 10778 const QOperand& operand) { 10779 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10780 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10781 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10782 VIXL_ASSERT(allow_macro_instructions_); 10783 VIXL_ASSERT(OutsideITBlock()); 10784 MacroEmissionCheckScope guard(this); 10785 #ifndef PANDA_BUILD 10786 ITScope it_scope(this, &cond, guard); 10787 #else 10788 ITScope it_scope(allocator_, this, &cond, guard); 10789 #endif 10790 vqrshrn(cond, dt, rd, rm, operand); 10791 } 10792 void Vqrshrn(DataType dt, 10793 DRegister rd, 10794 QRegister rm, 10795 const QOperand& operand) { 10796 Vqrshrn(al, dt, rd, rm, operand); 10797 } 10798 10799 void Vqrshrun(Condition cond, 10800 DataType dt, 10801 DRegister rd, 10802 QRegister rm, 10803 const QOperand& operand) { 10804 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10805 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10806 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10807 VIXL_ASSERT(allow_macro_instructions_); 10808 VIXL_ASSERT(OutsideITBlock()); 10809 MacroEmissionCheckScope guard(this); 10810 #ifndef PANDA_BUILD 10811 ITScope it_scope(this, &cond, guard); 10812 #else 10813 ITScope it_scope(allocator_, this, &cond, guard); 10814 #endif 10815 vqrshrun(cond, dt, rd, rm, operand); 10816 } 10817 void Vqrshrun(DataType dt, 10818 DRegister rd, 10819 QRegister rm, 10820 const QOperand& operand) { 10821 Vqrshrun(al, dt, rd, rm, operand); 10822 } 10823 10824 void Vqshl(Condition cond, 10825 DataType dt, 10826 DRegister rd, 10827 DRegister rm, 10828 const DOperand& operand) { 10829 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10830 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10831 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10832 VIXL_ASSERT(allow_macro_instructions_); 10833 VIXL_ASSERT(OutsideITBlock()); 10834 MacroEmissionCheckScope guard(this); 10835 #ifndef PANDA_BUILD 10836 ITScope it_scope(this, &cond, guard); 10837 #else 10838 ITScope it_scope(allocator_, this, &cond, guard); 10839 #endif 10840 vqshl(cond, dt, rd, rm, operand); 10841 } 10842 void Vqshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 10843 Vqshl(al, dt, rd, rm, operand); 10844 } 10845 10846 void Vqshl(Condition cond, 10847 DataType dt, 10848 QRegister rd, 10849 QRegister rm, 10850 const QOperand& operand) { 10851 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10852 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10853 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10854 VIXL_ASSERT(allow_macro_instructions_); 10855 VIXL_ASSERT(OutsideITBlock()); 10856 MacroEmissionCheckScope guard(this); 10857 #ifndef PANDA_BUILD 10858 ITScope it_scope(this, &cond, guard); 10859 #else 10860 ITScope it_scope(allocator_, this, &cond, guard); 10861 #endif 10862 vqshl(cond, dt, rd, rm, operand); 10863 } 10864 void Vqshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 10865 Vqshl(al, dt, rd, rm, operand); 10866 } 10867 10868 void Vqshlu(Condition cond, 10869 DataType dt, 10870 DRegister rd, 10871 DRegister rm, 10872 const DOperand& operand) { 10873 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10874 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10875 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10876 VIXL_ASSERT(allow_macro_instructions_); 10877 VIXL_ASSERT(OutsideITBlock()); 10878 MacroEmissionCheckScope guard(this); 10879 #ifndef PANDA_BUILD 10880 ITScope it_scope(this, &cond, guard); 10881 #else 10882 ITScope it_scope(allocator_, this, &cond, guard); 10883 #endif 10884 vqshlu(cond, dt, rd, rm, operand); 10885 } 10886 void Vqshlu(DataType dt, 10887 DRegister rd, 10888 DRegister rm, 10889 const DOperand& operand) { 10890 Vqshlu(al, dt, rd, rm, operand); 10891 } 10892 10893 void Vqshlu(Condition cond, 10894 DataType dt, 10895 QRegister rd, 10896 QRegister rm, 10897 const QOperand& operand) { 10898 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10899 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10900 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10901 VIXL_ASSERT(allow_macro_instructions_); 10902 VIXL_ASSERT(OutsideITBlock()); 10903 MacroEmissionCheckScope guard(this); 10904 #ifndef PANDA_BUILD 10905 ITScope it_scope(this, &cond, guard); 10906 #else 10907 ITScope it_scope(allocator_, this, &cond, guard); 10908 #endif 10909 vqshlu(cond, dt, rd, rm, operand); 10910 } 10911 void Vqshlu(DataType dt, 10912 QRegister rd, 10913 QRegister rm, 10914 const QOperand& operand) { 10915 Vqshlu(al, dt, rd, rm, operand); 10916 } 10917 10918 void Vqshrn(Condition cond, 10919 DataType dt, 10920 DRegister rd, 10921 QRegister rm, 10922 const QOperand& operand) { 10923 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10924 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10925 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10926 VIXL_ASSERT(allow_macro_instructions_); 10927 VIXL_ASSERT(OutsideITBlock()); 10928 MacroEmissionCheckScope guard(this); 10929 #ifndef PANDA_BUILD 10930 ITScope it_scope(this, &cond, guard); 10931 #else 10932 ITScope it_scope(allocator_, this, &cond, guard); 10933 #endif 10934 vqshrn(cond, dt, rd, rm, operand); 10935 } 10936 void Vqshrn(DataType dt, 10937 DRegister rd, 10938 QRegister rm, 10939 const QOperand& operand) { 10940 Vqshrn(al, dt, rd, rm, operand); 10941 } 10942 10943 void Vqshrun(Condition cond, 10944 DataType dt, 10945 DRegister rd, 10946 QRegister rm, 10947 const QOperand& operand) { 10948 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10949 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10950 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 10951 VIXL_ASSERT(allow_macro_instructions_); 10952 VIXL_ASSERT(OutsideITBlock()); 10953 MacroEmissionCheckScope guard(this); 10954 #ifndef PANDA_BUILD 10955 ITScope it_scope(this, &cond, guard); 10956 #else 10957 ITScope it_scope(allocator_, this, &cond, guard); 10958 #endif 10959 vqshrun(cond, dt, rd, rm, operand); 10960 } 10961 void Vqshrun(DataType dt, 10962 DRegister rd, 10963 QRegister rm, 10964 const QOperand& operand) { 10965 Vqshrun(al, dt, rd, rm, operand); 10966 } 10967 10968 void Vqsub( 10969 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10970 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10971 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10972 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10973 VIXL_ASSERT(allow_macro_instructions_); 10974 VIXL_ASSERT(OutsideITBlock()); 10975 MacroEmissionCheckScope guard(this); 10976 #ifndef PANDA_BUILD 10977 ITScope it_scope(this, &cond, guard); 10978 #else 10979 ITScope it_scope(allocator_, this, &cond, guard); 10980 #endif 10981 vqsub(cond, dt, rd, rn, rm); 10982 } 10983 void Vqsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 10984 Vqsub(al, dt, rd, rn, rm); 10985 } 10986 10987 void Vqsub( 10988 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 10989 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 10990 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 10991 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 10992 VIXL_ASSERT(allow_macro_instructions_); 10993 VIXL_ASSERT(OutsideITBlock()); 10994 MacroEmissionCheckScope guard(this); 10995 #ifndef PANDA_BUILD 10996 ITScope it_scope(this, &cond, guard); 10997 #else 10998 ITScope it_scope(allocator_, this, &cond, guard); 10999 #endif 11000 vqsub(cond, dt, rd, rn, rm); 11001 } 11002 void Vqsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 11003 Vqsub(al, dt, rd, rn, rm); 11004 } 11005 11006 void Vraddhn( 11007 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 11008 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11009 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11010 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11011 VIXL_ASSERT(allow_macro_instructions_); 11012 VIXL_ASSERT(OutsideITBlock()); 11013 MacroEmissionCheckScope guard(this); 11014 #ifndef PANDA_BUILD 11015 ITScope it_scope(this, &cond, guard); 11016 #else 11017 ITScope it_scope(allocator_, this, &cond, guard); 11018 #endif 11019 vraddhn(cond, dt, rd, rn, rm); 11020 } 11021 void Vraddhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) { 11022 Vraddhn(al, dt, rd, rn, rm); 11023 } 11024 11025 void Vrecpe(Condition cond, DataType dt, DRegister rd, DRegister rm) { 11026 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11027 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11028 VIXL_ASSERT(allow_macro_instructions_); 11029 VIXL_ASSERT(OutsideITBlock()); 11030 MacroEmissionCheckScope guard(this); 11031 #ifndef PANDA_BUILD 11032 ITScope it_scope(this, &cond, guard); 11033 #else 11034 ITScope it_scope(allocator_, this, &cond, guard); 11035 #endif 11036 vrecpe(cond, dt, rd, rm); 11037 } 11038 void Vrecpe(DataType dt, DRegister rd, DRegister rm) { 11039 Vrecpe(al, dt, rd, rm); 11040 } 11041 11042 void Vrecpe(Condition cond, DataType dt, QRegister rd, QRegister rm) { 11043 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11044 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11045 VIXL_ASSERT(allow_macro_instructions_); 11046 VIXL_ASSERT(OutsideITBlock()); 11047 MacroEmissionCheckScope guard(this); 11048 #ifndef PANDA_BUILD 11049 ITScope it_scope(this, &cond, guard); 11050 #else 11051 ITScope it_scope(allocator_, this, &cond, guard); 11052 #endif 11053 vrecpe(cond, dt, rd, rm); 11054 } 11055 void Vrecpe(DataType dt, QRegister rd, QRegister rm) { 11056 Vrecpe(al, dt, rd, rm); 11057 } 11058 11059 void Vrecps( 11060 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 11061 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11062 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11063 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11064 VIXL_ASSERT(allow_macro_instructions_); 11065 VIXL_ASSERT(OutsideITBlock()); 11066 MacroEmissionCheckScope guard(this); 11067 #ifndef PANDA_BUILD 11068 ITScope it_scope(this, &cond, guard); 11069 #else 11070 ITScope it_scope(allocator_, this, &cond, guard); 11071 #endif 11072 vrecps(cond, dt, rd, rn, rm); 11073 } 11074 void Vrecps(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 11075 Vrecps(al, dt, rd, rn, rm); 11076 } 11077 11078 void Vrecps( 11079 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 11080 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11081 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11082 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11083 VIXL_ASSERT(allow_macro_instructions_); 11084 VIXL_ASSERT(OutsideITBlock()); 11085 MacroEmissionCheckScope guard(this); 11086 #ifndef PANDA_BUILD 11087 ITScope it_scope(this, &cond, guard); 11088 #else 11089 ITScope it_scope(allocator_, this, &cond, guard); 11090 #endif 11091 vrecps(cond, dt, rd, rn, rm); 11092 } 11093 void Vrecps(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 11094 Vrecps(al, dt, rd, rn, rm); 11095 } 11096 11097 void Vrev16(Condition cond, DataType dt, DRegister rd, DRegister rm) { 11098 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11099 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11100 VIXL_ASSERT(allow_macro_instructions_); 11101 VIXL_ASSERT(OutsideITBlock()); 11102 MacroEmissionCheckScope guard(this); 11103 #ifndef PANDA_BUILD 11104 ITScope it_scope(this, &cond, guard); 11105 #else 11106 ITScope it_scope(allocator_, this, &cond, guard); 11107 #endif 11108 vrev16(cond, dt, rd, rm); 11109 } 11110 void Vrev16(DataType dt, DRegister rd, DRegister rm) { 11111 Vrev16(al, dt, rd, rm); 11112 } 11113 11114 void Vrev16(Condition cond, DataType dt, QRegister rd, QRegister rm) { 11115 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11116 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11117 VIXL_ASSERT(allow_macro_instructions_); 11118 VIXL_ASSERT(OutsideITBlock()); 11119 MacroEmissionCheckScope guard(this); 11120 #ifndef PANDA_BUILD 11121 ITScope it_scope(this, &cond, guard); 11122 #else 11123 ITScope it_scope(allocator_, this, &cond, guard); 11124 #endif 11125 vrev16(cond, dt, rd, rm); 11126 } 11127 void Vrev16(DataType dt, QRegister rd, QRegister rm) { 11128 Vrev16(al, dt, rd, rm); 11129 } 11130 11131 void Vrev32(Condition cond, DataType dt, DRegister rd, DRegister rm) { 11132 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11133 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11134 VIXL_ASSERT(allow_macro_instructions_); 11135 VIXL_ASSERT(OutsideITBlock()); 11136 MacroEmissionCheckScope guard(this); 11137 #ifndef PANDA_BUILD 11138 ITScope it_scope(this, &cond, guard); 11139 #else 11140 ITScope it_scope(allocator_, this, &cond, guard); 11141 #endif 11142 vrev32(cond, dt, rd, rm); 11143 } 11144 void Vrev32(DataType dt, DRegister rd, DRegister rm) { 11145 Vrev32(al, dt, rd, rm); 11146 } 11147 11148 void Vrev32(Condition cond, DataType dt, QRegister rd, QRegister rm) { 11149 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11150 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11151 VIXL_ASSERT(allow_macro_instructions_); 11152 VIXL_ASSERT(OutsideITBlock()); 11153 MacroEmissionCheckScope guard(this); 11154 #ifndef PANDA_BUILD 11155 ITScope it_scope(this, &cond, guard); 11156 #else 11157 ITScope it_scope(allocator_, this, &cond, guard); 11158 #endif 11159 vrev32(cond, dt, rd, rm); 11160 } 11161 void Vrev32(DataType dt, QRegister rd, QRegister rm) { 11162 Vrev32(al, dt, rd, rm); 11163 } 11164 11165 void Vrev64(Condition cond, DataType dt, DRegister rd, DRegister rm) { 11166 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11167 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11168 VIXL_ASSERT(allow_macro_instructions_); 11169 VIXL_ASSERT(OutsideITBlock()); 11170 MacroEmissionCheckScope guard(this); 11171 #ifndef PANDA_BUILD 11172 ITScope it_scope(this, &cond, guard); 11173 #else 11174 ITScope it_scope(allocator_, this, &cond, guard); 11175 #endif 11176 vrev64(cond, dt, rd, rm); 11177 } 11178 void Vrev64(DataType dt, DRegister rd, DRegister rm) { 11179 Vrev64(al, dt, rd, rm); 11180 } 11181 11182 void Vrev64(Condition cond, DataType dt, QRegister rd, QRegister rm) { 11183 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11184 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11185 VIXL_ASSERT(allow_macro_instructions_); 11186 VIXL_ASSERT(OutsideITBlock()); 11187 MacroEmissionCheckScope guard(this); 11188 #ifndef PANDA_BUILD 11189 ITScope it_scope(this, &cond, guard); 11190 #else 11191 ITScope it_scope(allocator_, this, &cond, guard); 11192 #endif 11193 vrev64(cond, dt, rd, rm); 11194 } 11195 void Vrev64(DataType dt, QRegister rd, QRegister rm) { 11196 Vrev64(al, dt, rd, rm); 11197 } 11198 11199 void Vrhadd( 11200 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 11201 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11202 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11203 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11204 VIXL_ASSERT(allow_macro_instructions_); 11205 VIXL_ASSERT(OutsideITBlock()); 11206 MacroEmissionCheckScope guard(this); 11207 #ifndef PANDA_BUILD 11208 ITScope it_scope(this, &cond, guard); 11209 #else 11210 ITScope it_scope(allocator_, this, &cond, guard); 11211 #endif 11212 vrhadd(cond, dt, rd, rn, rm); 11213 } 11214 void Vrhadd(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 11215 Vrhadd(al, dt, rd, rn, rm); 11216 } 11217 11218 void Vrhadd( 11219 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 11220 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11221 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11222 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11223 VIXL_ASSERT(allow_macro_instructions_); 11224 VIXL_ASSERT(OutsideITBlock()); 11225 MacroEmissionCheckScope guard(this); 11226 #ifndef PANDA_BUILD 11227 ITScope it_scope(this, &cond, guard); 11228 #else 11229 ITScope it_scope(allocator_, this, &cond, guard); 11230 #endif 11231 vrhadd(cond, dt, rd, rn, rm); 11232 } 11233 void Vrhadd(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 11234 Vrhadd(al, dt, rd, rn, rm); 11235 } 11236 11237 void Vrinta(DataType dt, DRegister rd, DRegister rm) { 11238 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11239 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11240 VIXL_ASSERT(allow_macro_instructions_); 11241 VIXL_ASSERT(OutsideITBlock()); 11242 MacroEmissionCheckScope guard(this); 11243 vrinta(dt, rd, rm); 11244 } 11245 11246 void Vrinta(DataType dt, QRegister rd, QRegister rm) { 11247 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11248 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11249 VIXL_ASSERT(allow_macro_instructions_); 11250 VIXL_ASSERT(OutsideITBlock()); 11251 MacroEmissionCheckScope guard(this); 11252 vrinta(dt, rd, rm); 11253 } 11254 11255 void Vrinta(DataType dt, SRegister rd, SRegister rm) { 11256 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11257 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11258 VIXL_ASSERT(allow_macro_instructions_); 11259 VIXL_ASSERT(OutsideITBlock()); 11260 MacroEmissionCheckScope guard(this); 11261 vrinta(dt, rd, rm); 11262 } 11263 11264 void Vrintm(DataType dt, DRegister rd, DRegister rm) { 11265 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11266 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11267 VIXL_ASSERT(allow_macro_instructions_); 11268 VIXL_ASSERT(OutsideITBlock()); 11269 MacroEmissionCheckScope guard(this); 11270 vrintm(dt, rd, rm); 11271 } 11272 11273 void Vrintm(DataType dt, QRegister rd, QRegister rm) { 11274 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11275 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11276 VIXL_ASSERT(allow_macro_instructions_); 11277 VIXL_ASSERT(OutsideITBlock()); 11278 MacroEmissionCheckScope guard(this); 11279 vrintm(dt, rd, rm); 11280 } 11281 11282 void Vrintm(DataType dt, SRegister rd, SRegister rm) { 11283 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11284 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11285 VIXL_ASSERT(allow_macro_instructions_); 11286 VIXL_ASSERT(OutsideITBlock()); 11287 MacroEmissionCheckScope guard(this); 11288 vrintm(dt, rd, rm); 11289 } 11290 11291 void Vrintn(DataType dt, DRegister rd, DRegister rm) { 11292 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11293 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11294 VIXL_ASSERT(allow_macro_instructions_); 11295 VIXL_ASSERT(OutsideITBlock()); 11296 MacroEmissionCheckScope guard(this); 11297 vrintn(dt, rd, rm); 11298 } 11299 11300 void Vrintn(DataType dt, QRegister rd, QRegister rm) { 11301 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11302 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11303 VIXL_ASSERT(allow_macro_instructions_); 11304 VIXL_ASSERT(OutsideITBlock()); 11305 MacroEmissionCheckScope guard(this); 11306 vrintn(dt, rd, rm); 11307 } 11308 11309 void Vrintn(DataType dt, SRegister rd, SRegister rm) { 11310 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11311 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11312 VIXL_ASSERT(allow_macro_instructions_); 11313 VIXL_ASSERT(OutsideITBlock()); 11314 MacroEmissionCheckScope guard(this); 11315 vrintn(dt, rd, rm); 11316 } 11317 11318 void Vrintp(DataType dt, DRegister rd, DRegister rm) { 11319 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11320 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11321 VIXL_ASSERT(allow_macro_instructions_); 11322 VIXL_ASSERT(OutsideITBlock()); 11323 MacroEmissionCheckScope guard(this); 11324 vrintp(dt, rd, rm); 11325 } 11326 11327 void Vrintp(DataType dt, QRegister rd, QRegister rm) { 11328 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11329 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11330 VIXL_ASSERT(allow_macro_instructions_); 11331 VIXL_ASSERT(OutsideITBlock()); 11332 MacroEmissionCheckScope guard(this); 11333 vrintp(dt, rd, rm); 11334 } 11335 11336 void Vrintp(DataType dt, SRegister rd, SRegister rm) { 11337 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11338 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11339 VIXL_ASSERT(allow_macro_instructions_); 11340 VIXL_ASSERT(OutsideITBlock()); 11341 MacroEmissionCheckScope guard(this); 11342 vrintp(dt, rd, rm); 11343 } 11344 11345 void Vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm) { 11346 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11347 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11348 VIXL_ASSERT(allow_macro_instructions_); 11349 VIXL_ASSERT(OutsideITBlock()); 11350 MacroEmissionCheckScope guard(this); 11351 #ifndef PANDA_BUILD 11352 ITScope it_scope(this, &cond, guard); 11353 #else 11354 ITScope it_scope(allocator_, this, &cond, guard); 11355 #endif 11356 vrintr(cond, dt, rd, rm); 11357 } 11358 void Vrintr(DataType dt, SRegister rd, SRegister rm) { 11359 Vrintr(al, dt, rd, rm); 11360 } 11361 11362 void Vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm) { 11363 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11364 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11365 VIXL_ASSERT(allow_macro_instructions_); 11366 VIXL_ASSERT(OutsideITBlock()); 11367 MacroEmissionCheckScope guard(this); 11368 #ifndef PANDA_BUILD 11369 ITScope it_scope(this, &cond, guard); 11370 #else 11371 ITScope it_scope(allocator_, this, &cond, guard); 11372 #endif 11373 vrintr(cond, dt, rd, rm); 11374 } 11375 void Vrintr(DataType dt, DRegister rd, DRegister rm) { 11376 Vrintr(al, dt, rd, rm); 11377 } 11378 11379 void Vrintx(Condition cond, DataType dt, DRegister rd, DRegister rm) { 11380 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11381 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11382 VIXL_ASSERT(allow_macro_instructions_); 11383 VIXL_ASSERT(OutsideITBlock()); 11384 MacroEmissionCheckScope guard(this); 11385 #ifndef PANDA_BUILD 11386 ITScope it_scope(this, &cond, guard); 11387 #else 11388 ITScope it_scope(allocator_, this, &cond, guard); 11389 #endif 11390 vrintx(cond, dt, rd, rm); 11391 } 11392 void Vrintx(DataType dt, DRegister rd, DRegister rm) { 11393 Vrintx(al, dt, rd, rm); 11394 } 11395 11396 void Vrintx(DataType dt, QRegister rd, QRegister rm) { 11397 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11398 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11399 VIXL_ASSERT(allow_macro_instructions_); 11400 VIXL_ASSERT(OutsideITBlock()); 11401 MacroEmissionCheckScope guard(this); 11402 vrintx(dt, rd, rm); 11403 } 11404 11405 void Vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm) { 11406 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11407 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11408 VIXL_ASSERT(allow_macro_instructions_); 11409 VIXL_ASSERT(OutsideITBlock()); 11410 MacroEmissionCheckScope guard(this); 11411 #ifndef PANDA_BUILD 11412 ITScope it_scope(this, &cond, guard); 11413 #else 11414 ITScope it_scope(allocator_, this, &cond, guard); 11415 #endif 11416 vrintx(cond, dt, rd, rm); 11417 } 11418 void Vrintx(DataType dt, SRegister rd, SRegister rm) { 11419 Vrintx(al, dt, rd, rm); 11420 } 11421 11422 void Vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm) { 11423 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11424 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11425 VIXL_ASSERT(allow_macro_instructions_); 11426 VIXL_ASSERT(OutsideITBlock()); 11427 MacroEmissionCheckScope guard(this); 11428 #ifndef PANDA_BUILD 11429 ITScope it_scope(this, &cond, guard); 11430 #else 11431 ITScope it_scope(allocator_, this, &cond, guard); 11432 #endif 11433 vrintz(cond, dt, rd, rm); 11434 } 11435 void Vrintz(DataType dt, DRegister rd, DRegister rm) { 11436 Vrintz(al, dt, rd, rm); 11437 } 11438 11439 void Vrintz(DataType dt, QRegister rd, QRegister rm) { 11440 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11441 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11442 VIXL_ASSERT(allow_macro_instructions_); 11443 VIXL_ASSERT(OutsideITBlock()); 11444 MacroEmissionCheckScope guard(this); 11445 vrintz(dt, rd, rm); 11446 } 11447 11448 void Vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm) { 11449 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11450 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11451 VIXL_ASSERT(allow_macro_instructions_); 11452 VIXL_ASSERT(OutsideITBlock()); 11453 MacroEmissionCheckScope guard(this); 11454 #ifndef PANDA_BUILD 11455 ITScope it_scope(this, &cond, guard); 11456 #else 11457 ITScope it_scope(allocator_, this, &cond, guard); 11458 #endif 11459 vrintz(cond, dt, rd, rm); 11460 } 11461 void Vrintz(DataType dt, SRegister rd, SRegister rm) { 11462 Vrintz(al, dt, rd, rm); 11463 } 11464 11465 void Vrshl( 11466 Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) { 11467 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11468 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11469 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11470 VIXL_ASSERT(allow_macro_instructions_); 11471 VIXL_ASSERT(OutsideITBlock()); 11472 MacroEmissionCheckScope guard(this); 11473 #ifndef PANDA_BUILD 11474 ITScope it_scope(this, &cond, guard); 11475 #else 11476 ITScope it_scope(allocator_, this, &cond, guard); 11477 #endif 11478 vrshl(cond, dt, rd, rm, rn); 11479 } 11480 void Vrshl(DataType dt, DRegister rd, DRegister rm, DRegister rn) { 11481 Vrshl(al, dt, rd, rm, rn); 11482 } 11483 11484 void Vrshl( 11485 Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) { 11486 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11487 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11488 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11489 VIXL_ASSERT(allow_macro_instructions_); 11490 VIXL_ASSERT(OutsideITBlock()); 11491 MacroEmissionCheckScope guard(this); 11492 #ifndef PANDA_BUILD 11493 ITScope it_scope(this, &cond, guard); 11494 #else 11495 ITScope it_scope(allocator_, this, &cond, guard); 11496 #endif 11497 vrshl(cond, dt, rd, rm, rn); 11498 } 11499 void Vrshl(DataType dt, QRegister rd, QRegister rm, QRegister rn) { 11500 Vrshl(al, dt, rd, rm, rn); 11501 } 11502 11503 void Vrshr(Condition cond, 11504 DataType dt, 11505 DRegister rd, 11506 DRegister rm, 11507 const DOperand& operand) { 11508 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11509 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11510 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11511 VIXL_ASSERT(allow_macro_instructions_); 11512 VIXL_ASSERT(OutsideITBlock()); 11513 MacroEmissionCheckScope guard(this); 11514 #ifndef PANDA_BUILD 11515 ITScope it_scope(this, &cond, guard); 11516 #else 11517 ITScope it_scope(allocator_, this, &cond, guard); 11518 #endif 11519 vrshr(cond, dt, rd, rm, operand); 11520 } 11521 void Vrshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 11522 Vrshr(al, dt, rd, rm, operand); 11523 } 11524 11525 void Vrshr(Condition cond, 11526 DataType dt, 11527 QRegister rd, 11528 QRegister rm, 11529 const QOperand& operand) { 11530 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11531 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11532 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11533 VIXL_ASSERT(allow_macro_instructions_); 11534 VIXL_ASSERT(OutsideITBlock()); 11535 MacroEmissionCheckScope guard(this); 11536 #ifndef PANDA_BUILD 11537 ITScope it_scope(this, &cond, guard); 11538 #else 11539 ITScope it_scope(allocator_, this, &cond, guard); 11540 #endif 11541 vrshr(cond, dt, rd, rm, operand); 11542 } 11543 void Vrshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 11544 Vrshr(al, dt, rd, rm, operand); 11545 } 11546 11547 void Vrshrn(Condition cond, 11548 DataType dt, 11549 DRegister rd, 11550 QRegister rm, 11551 const QOperand& operand) { 11552 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11553 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11554 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11555 VIXL_ASSERT(allow_macro_instructions_); 11556 VIXL_ASSERT(OutsideITBlock()); 11557 MacroEmissionCheckScope guard(this); 11558 #ifndef PANDA_BUILD 11559 ITScope it_scope(this, &cond, guard); 11560 #else 11561 ITScope it_scope(allocator_, this, &cond, guard); 11562 #endif 11563 vrshrn(cond, dt, rd, rm, operand); 11564 } 11565 void Vrshrn(DataType dt, 11566 DRegister rd, 11567 QRegister rm, 11568 const QOperand& operand) { 11569 Vrshrn(al, dt, rd, rm, operand); 11570 } 11571 11572 void Vrsqrte(Condition cond, DataType dt, DRegister rd, DRegister rm) { 11573 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11574 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11575 VIXL_ASSERT(allow_macro_instructions_); 11576 VIXL_ASSERT(OutsideITBlock()); 11577 MacroEmissionCheckScope guard(this); 11578 #ifndef PANDA_BUILD 11579 ITScope it_scope(this, &cond, guard); 11580 #else 11581 ITScope it_scope(allocator_, this, &cond, guard); 11582 #endif 11583 vrsqrte(cond, dt, rd, rm); 11584 } 11585 void Vrsqrte(DataType dt, DRegister rd, DRegister rm) { 11586 Vrsqrte(al, dt, rd, rm); 11587 } 11588 11589 void Vrsqrte(Condition cond, DataType dt, QRegister rd, QRegister rm) { 11590 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11591 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11592 VIXL_ASSERT(allow_macro_instructions_); 11593 VIXL_ASSERT(OutsideITBlock()); 11594 MacroEmissionCheckScope guard(this); 11595 #ifndef PANDA_BUILD 11596 ITScope it_scope(this, &cond, guard); 11597 #else 11598 ITScope it_scope(allocator_, this, &cond, guard); 11599 #endif 11600 vrsqrte(cond, dt, rd, rm); 11601 } 11602 void Vrsqrte(DataType dt, QRegister rd, QRegister rm) { 11603 Vrsqrte(al, dt, rd, rm); 11604 } 11605 11606 void Vrsqrts( 11607 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 11608 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11609 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11610 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11611 VIXL_ASSERT(allow_macro_instructions_); 11612 VIXL_ASSERT(OutsideITBlock()); 11613 MacroEmissionCheckScope guard(this); 11614 #ifndef PANDA_BUILD 11615 ITScope it_scope(this, &cond, guard); 11616 #else 11617 ITScope it_scope(allocator_, this, &cond, guard); 11618 #endif 11619 vrsqrts(cond, dt, rd, rn, rm); 11620 } 11621 void Vrsqrts(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 11622 Vrsqrts(al, dt, rd, rn, rm); 11623 } 11624 11625 void Vrsqrts( 11626 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 11627 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11628 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11629 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11630 VIXL_ASSERT(allow_macro_instructions_); 11631 VIXL_ASSERT(OutsideITBlock()); 11632 MacroEmissionCheckScope guard(this); 11633 #ifndef PANDA_BUILD 11634 ITScope it_scope(this, &cond, guard); 11635 #else 11636 ITScope it_scope(allocator_, this, &cond, guard); 11637 #endif 11638 vrsqrts(cond, dt, rd, rn, rm); 11639 } 11640 void Vrsqrts(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 11641 Vrsqrts(al, dt, rd, rn, rm); 11642 } 11643 11644 void Vrsra(Condition cond, 11645 DataType dt, 11646 DRegister rd, 11647 DRegister rm, 11648 const DOperand& operand) { 11649 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11650 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11651 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11652 VIXL_ASSERT(allow_macro_instructions_); 11653 VIXL_ASSERT(OutsideITBlock()); 11654 MacroEmissionCheckScope guard(this); 11655 #ifndef PANDA_BUILD 11656 ITScope it_scope(this, &cond, guard); 11657 #else 11658 ITScope it_scope(allocator_, this, &cond, guard); 11659 #endif 11660 vrsra(cond, dt, rd, rm, operand); 11661 } 11662 void Vrsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 11663 Vrsra(al, dt, rd, rm, operand); 11664 } 11665 11666 void Vrsra(Condition cond, 11667 DataType dt, 11668 QRegister rd, 11669 QRegister rm, 11670 const QOperand& operand) { 11671 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11672 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11673 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11674 VIXL_ASSERT(allow_macro_instructions_); 11675 VIXL_ASSERT(OutsideITBlock()); 11676 MacroEmissionCheckScope guard(this); 11677 #ifndef PANDA_BUILD 11678 ITScope it_scope(this, &cond, guard); 11679 #else 11680 ITScope it_scope(allocator_, this, &cond, guard); 11681 #endif 11682 vrsra(cond, dt, rd, rm, operand); 11683 } 11684 void Vrsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 11685 Vrsra(al, dt, rd, rm, operand); 11686 } 11687 11688 void Vrsubhn( 11689 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 11690 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11691 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11692 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11693 VIXL_ASSERT(allow_macro_instructions_); 11694 VIXL_ASSERT(OutsideITBlock()); 11695 MacroEmissionCheckScope guard(this); 11696 #ifndef PANDA_BUILD 11697 ITScope it_scope(this, &cond, guard); 11698 #else 11699 ITScope it_scope(allocator_, this, &cond, guard); 11700 #endif 11701 vrsubhn(cond, dt, rd, rn, rm); 11702 } 11703 void Vrsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) { 11704 Vrsubhn(al, dt, rd, rn, rm); 11705 } 11706 11707 void Vseleq(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 11708 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11709 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11710 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11711 VIXL_ASSERT(allow_macro_instructions_); 11712 VIXL_ASSERT(OutsideITBlock()); 11713 MacroEmissionCheckScope guard(this); 11714 vseleq(dt, rd, rn, rm); 11715 } 11716 11717 void Vseleq(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 11718 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11719 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11720 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11721 VIXL_ASSERT(allow_macro_instructions_); 11722 VIXL_ASSERT(OutsideITBlock()); 11723 MacroEmissionCheckScope guard(this); 11724 vseleq(dt, rd, rn, rm); 11725 } 11726 11727 void Vselge(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 11728 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11729 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11730 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11731 VIXL_ASSERT(allow_macro_instructions_); 11732 VIXL_ASSERT(OutsideITBlock()); 11733 MacroEmissionCheckScope guard(this); 11734 vselge(dt, rd, rn, rm); 11735 } 11736 11737 void Vselge(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 11738 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11739 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11740 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11741 VIXL_ASSERT(allow_macro_instructions_); 11742 VIXL_ASSERT(OutsideITBlock()); 11743 MacroEmissionCheckScope guard(this); 11744 vselge(dt, rd, rn, rm); 11745 } 11746 11747 void Vselgt(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 11748 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11749 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11750 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11751 VIXL_ASSERT(allow_macro_instructions_); 11752 VIXL_ASSERT(OutsideITBlock()); 11753 MacroEmissionCheckScope guard(this); 11754 vselgt(dt, rd, rn, rm); 11755 } 11756 11757 void Vselgt(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 11758 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11759 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11760 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11761 VIXL_ASSERT(allow_macro_instructions_); 11762 VIXL_ASSERT(OutsideITBlock()); 11763 MacroEmissionCheckScope guard(this); 11764 vselgt(dt, rd, rn, rm); 11765 } 11766 11767 void Vselvs(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 11768 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11769 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11770 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11771 VIXL_ASSERT(allow_macro_instructions_); 11772 VIXL_ASSERT(OutsideITBlock()); 11773 MacroEmissionCheckScope guard(this); 11774 vselvs(dt, rd, rn, rm); 11775 } 11776 11777 void Vselvs(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 11778 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11779 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 11780 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11781 VIXL_ASSERT(allow_macro_instructions_); 11782 VIXL_ASSERT(OutsideITBlock()); 11783 MacroEmissionCheckScope guard(this); 11784 vselvs(dt, rd, rn, rm); 11785 } 11786 11787 void Vshl(Condition cond, 11788 DataType dt, 11789 DRegister rd, 11790 DRegister rm, 11791 const DOperand& operand) { 11792 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11793 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11794 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11795 VIXL_ASSERT(allow_macro_instructions_); 11796 VIXL_ASSERT(OutsideITBlock()); 11797 MacroEmissionCheckScope guard(this); 11798 #ifndef PANDA_BUILD 11799 ITScope it_scope(this, &cond, guard); 11800 #else 11801 ITScope it_scope(allocator_, this, &cond, guard); 11802 #endif 11803 vshl(cond, dt, rd, rm, operand); 11804 } 11805 void Vshl(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 11806 Vshl(al, dt, rd, rm, operand); 11807 } 11808 11809 void Vshl(Condition cond, 11810 DataType dt, 11811 QRegister rd, 11812 QRegister rm, 11813 const QOperand& operand) { 11814 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11815 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11816 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11817 VIXL_ASSERT(allow_macro_instructions_); 11818 VIXL_ASSERT(OutsideITBlock()); 11819 MacroEmissionCheckScope guard(this); 11820 #ifndef PANDA_BUILD 11821 ITScope it_scope(this, &cond, guard); 11822 #else 11823 ITScope it_scope(allocator_, this, &cond, guard); 11824 #endif 11825 vshl(cond, dt, rd, rm, operand); 11826 } 11827 void Vshl(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 11828 Vshl(al, dt, rd, rm, operand); 11829 } 11830 11831 void Vshll(Condition cond, 11832 DataType dt, 11833 QRegister rd, 11834 DRegister rm, 11835 const DOperand& operand) { 11836 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11837 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11838 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11839 VIXL_ASSERT(allow_macro_instructions_); 11840 VIXL_ASSERT(OutsideITBlock()); 11841 MacroEmissionCheckScope guard(this); 11842 #ifndef PANDA_BUILD 11843 ITScope it_scope(this, &cond, guard); 11844 #else 11845 ITScope it_scope(allocator_, this, &cond, guard); 11846 #endif 11847 vshll(cond, dt, rd, rm, operand); 11848 } 11849 void Vshll(DataType dt, QRegister rd, DRegister rm, const DOperand& operand) { 11850 Vshll(al, dt, rd, rm, operand); 11851 } 11852 11853 void Vshr(Condition cond, 11854 DataType dt, 11855 DRegister rd, 11856 DRegister rm, 11857 const DOperand& operand) { 11858 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11859 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11860 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11861 VIXL_ASSERT(allow_macro_instructions_); 11862 VIXL_ASSERT(OutsideITBlock()); 11863 MacroEmissionCheckScope guard(this); 11864 #ifndef PANDA_BUILD 11865 ITScope it_scope(this, &cond, guard); 11866 #else 11867 ITScope it_scope(allocator_, this, &cond, guard); 11868 #endif 11869 vshr(cond, dt, rd, rm, operand); 11870 } 11871 void Vshr(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 11872 Vshr(al, dt, rd, rm, operand); 11873 } 11874 11875 void Vshr(Condition cond, 11876 DataType dt, 11877 QRegister rd, 11878 QRegister rm, 11879 const QOperand& operand) { 11880 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11881 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11882 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11883 VIXL_ASSERT(allow_macro_instructions_); 11884 VIXL_ASSERT(OutsideITBlock()); 11885 MacroEmissionCheckScope guard(this); 11886 #ifndef PANDA_BUILD 11887 ITScope it_scope(this, &cond, guard); 11888 #else 11889 ITScope it_scope(allocator_, this, &cond, guard); 11890 #endif 11891 vshr(cond, dt, rd, rm, operand); 11892 } 11893 void Vshr(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 11894 Vshr(al, dt, rd, rm, operand); 11895 } 11896 11897 void Vshrn(Condition cond, 11898 DataType dt, 11899 DRegister rd, 11900 QRegister rm, 11901 const QOperand& operand) { 11902 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11903 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11904 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11905 VIXL_ASSERT(allow_macro_instructions_); 11906 VIXL_ASSERT(OutsideITBlock()); 11907 MacroEmissionCheckScope guard(this); 11908 #ifndef PANDA_BUILD 11909 ITScope it_scope(this, &cond, guard); 11910 #else 11911 ITScope it_scope(allocator_, this, &cond, guard); 11912 #endif 11913 vshrn(cond, dt, rd, rm, operand); 11914 } 11915 void Vshrn(DataType dt, DRegister rd, QRegister rm, const QOperand& operand) { 11916 Vshrn(al, dt, rd, rm, operand); 11917 } 11918 11919 void Vsli(Condition cond, 11920 DataType dt, 11921 DRegister rd, 11922 DRegister rm, 11923 const DOperand& operand) { 11924 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11925 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11926 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11927 VIXL_ASSERT(allow_macro_instructions_); 11928 VIXL_ASSERT(OutsideITBlock()); 11929 MacroEmissionCheckScope guard(this); 11930 #ifndef PANDA_BUILD 11931 ITScope it_scope(this, &cond, guard); 11932 #else 11933 ITScope it_scope(allocator_, this, &cond, guard); 11934 #endif 11935 vsli(cond, dt, rd, rm, operand); 11936 } 11937 void Vsli(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 11938 Vsli(al, dt, rd, rm, operand); 11939 } 11940 11941 void Vsli(Condition cond, 11942 DataType dt, 11943 QRegister rd, 11944 QRegister rm, 11945 const QOperand& operand) { 11946 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11947 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11948 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 11949 VIXL_ASSERT(allow_macro_instructions_); 11950 VIXL_ASSERT(OutsideITBlock()); 11951 MacroEmissionCheckScope guard(this); 11952 #ifndef PANDA_BUILD 11953 ITScope it_scope(this, &cond, guard); 11954 #else 11955 ITScope it_scope(allocator_, this, &cond, guard); 11956 #endif 11957 vsli(cond, dt, rd, rm, operand); 11958 } 11959 void Vsli(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 11960 Vsli(al, dt, rd, rm, operand); 11961 } 11962 11963 void Vsqrt(Condition cond, DataType dt, SRegister rd, SRegister rm) { 11964 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11965 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11966 VIXL_ASSERT(allow_macro_instructions_); 11967 VIXL_ASSERT(OutsideITBlock()); 11968 MacroEmissionCheckScope guard(this); 11969 #ifndef PANDA_BUILD 11970 ITScope it_scope(this, &cond, guard); 11971 #else 11972 ITScope it_scope(allocator_, this, &cond, guard); 11973 #endif 11974 vsqrt(cond, dt, rd, rm); 11975 } 11976 void Vsqrt(DataType dt, SRegister rd, SRegister rm) { Vsqrt(al, dt, rd, rm); } 11977 11978 void Vsqrt(Condition cond, DataType dt, DRegister rd, DRegister rm) { 11979 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11980 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 11981 VIXL_ASSERT(allow_macro_instructions_); 11982 VIXL_ASSERT(OutsideITBlock()); 11983 MacroEmissionCheckScope guard(this); 11984 #ifndef PANDA_BUILD 11985 ITScope it_scope(this, &cond, guard); 11986 #else 11987 ITScope it_scope(allocator_, this, &cond, guard); 11988 #endif 11989 vsqrt(cond, dt, rd, rm); 11990 } 11991 void Vsqrt(DataType dt, DRegister rd, DRegister rm) { Vsqrt(al, dt, rd, rm); } 11992 11993 void Vsra(Condition cond, 11994 DataType dt, 11995 DRegister rd, 11996 DRegister rm, 11997 const DOperand& operand) { 11998 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 11999 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12000 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12001 VIXL_ASSERT(allow_macro_instructions_); 12002 VIXL_ASSERT(OutsideITBlock()); 12003 MacroEmissionCheckScope guard(this); 12004 #ifndef PANDA_BUILD 12005 ITScope it_scope(this, &cond, guard); 12006 #else 12007 ITScope it_scope(allocator_, this, &cond, guard); 12008 #endif 12009 vsra(cond, dt, rd, rm, operand); 12010 } 12011 void Vsra(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 12012 Vsra(al, dt, rd, rm, operand); 12013 } 12014 12015 void Vsra(Condition cond, 12016 DataType dt, 12017 QRegister rd, 12018 QRegister rm, 12019 const QOperand& operand) { 12020 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12021 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12022 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12023 VIXL_ASSERT(allow_macro_instructions_); 12024 VIXL_ASSERT(OutsideITBlock()); 12025 MacroEmissionCheckScope guard(this); 12026 #ifndef PANDA_BUILD 12027 ITScope it_scope(this, &cond, guard); 12028 #else 12029 ITScope it_scope(allocator_, this, &cond, guard); 12030 #endif 12031 vsra(cond, dt, rd, rm, operand); 12032 } 12033 void Vsra(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 12034 Vsra(al, dt, rd, rm, operand); 12035 } 12036 12037 void Vsri(Condition cond, 12038 DataType dt, 12039 DRegister rd, 12040 DRegister rm, 12041 const DOperand& operand) { 12042 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12043 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12044 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12045 VIXL_ASSERT(allow_macro_instructions_); 12046 VIXL_ASSERT(OutsideITBlock()); 12047 MacroEmissionCheckScope guard(this); 12048 #ifndef PANDA_BUILD 12049 ITScope it_scope(this, &cond, guard); 12050 #else 12051 ITScope it_scope(allocator_, this, &cond, guard); 12052 #endif 12053 vsri(cond, dt, rd, rm, operand); 12054 } 12055 void Vsri(DataType dt, DRegister rd, DRegister rm, const DOperand& operand) { 12056 Vsri(al, dt, rd, rm, operand); 12057 } 12058 12059 void Vsri(Condition cond, 12060 DataType dt, 12061 QRegister rd, 12062 QRegister rm, 12063 const QOperand& operand) { 12064 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12065 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12066 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12067 VIXL_ASSERT(allow_macro_instructions_); 12068 VIXL_ASSERT(OutsideITBlock()); 12069 MacroEmissionCheckScope guard(this); 12070 #ifndef PANDA_BUILD 12071 ITScope it_scope(this, &cond, guard); 12072 #else 12073 ITScope it_scope(allocator_, this, &cond, guard); 12074 #endif 12075 vsri(cond, dt, rd, rm, operand); 12076 } 12077 void Vsri(DataType dt, QRegister rd, QRegister rm, const QOperand& operand) { 12078 Vsri(al, dt, rd, rm, operand); 12079 } 12080 12081 void Vst1(Condition cond, 12082 DataType dt, 12083 const NeonRegisterList& nreglist, 12084 const AlignedMemOperand& operand) { 12085 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 12086 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12087 VIXL_ASSERT(allow_macro_instructions_); 12088 VIXL_ASSERT(OutsideITBlock()); 12089 MacroEmissionCheckScope guard(this); 12090 #ifndef PANDA_BUILD 12091 ITScope it_scope(this, &cond, guard); 12092 #else 12093 ITScope it_scope(allocator_, this, &cond, guard); 12094 #endif 12095 vst1(cond, dt, nreglist, operand); 12096 } 12097 void Vst1(DataType dt, 12098 const NeonRegisterList& nreglist, 12099 const AlignedMemOperand& operand) { 12100 Vst1(al, dt, nreglist, operand); 12101 } 12102 12103 void Vst2(Condition cond, 12104 DataType dt, 12105 const NeonRegisterList& nreglist, 12106 const AlignedMemOperand& operand) { 12107 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 12108 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12109 VIXL_ASSERT(allow_macro_instructions_); 12110 VIXL_ASSERT(OutsideITBlock()); 12111 MacroEmissionCheckScope guard(this); 12112 #ifndef PANDA_BUILD 12113 ITScope it_scope(this, &cond, guard); 12114 #else 12115 ITScope it_scope(allocator_, this, &cond, guard); 12116 #endif 12117 vst2(cond, dt, nreglist, operand); 12118 } 12119 void Vst2(DataType dt, 12120 const NeonRegisterList& nreglist, 12121 const AlignedMemOperand& operand) { 12122 Vst2(al, dt, nreglist, operand); 12123 } 12124 12125 void Vst3(Condition cond, 12126 DataType dt, 12127 const NeonRegisterList& nreglist, 12128 const AlignedMemOperand& operand) { 12129 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 12130 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12131 VIXL_ASSERT(allow_macro_instructions_); 12132 VIXL_ASSERT(OutsideITBlock()); 12133 MacroEmissionCheckScope guard(this); 12134 #ifndef PANDA_BUILD 12135 ITScope it_scope(this, &cond, guard); 12136 #else 12137 ITScope it_scope(allocator_, this, &cond, guard); 12138 #endif 12139 vst3(cond, dt, nreglist, operand); 12140 } 12141 void Vst3(DataType dt, 12142 const NeonRegisterList& nreglist, 12143 const AlignedMemOperand& operand) { 12144 Vst3(al, dt, nreglist, operand); 12145 } 12146 12147 void Vst3(Condition cond, 12148 DataType dt, 12149 const NeonRegisterList& nreglist, 12150 const MemOperand& operand) { 12151 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 12152 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12153 VIXL_ASSERT(allow_macro_instructions_); 12154 VIXL_ASSERT(OutsideITBlock()); 12155 MacroEmissionCheckScope guard(this); 12156 #ifndef PANDA_BUILD 12157 ITScope it_scope(this, &cond, guard); 12158 #else 12159 ITScope it_scope(allocator_, this, &cond, guard); 12160 #endif 12161 vst3(cond, dt, nreglist, operand); 12162 } 12163 void Vst3(DataType dt, 12164 const NeonRegisterList& nreglist, 12165 const MemOperand& operand) { 12166 Vst3(al, dt, nreglist, operand); 12167 } 12168 12169 void Vst4(Condition cond, 12170 DataType dt, 12171 const NeonRegisterList& nreglist, 12172 const AlignedMemOperand& operand) { 12173 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 12174 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12175 VIXL_ASSERT(allow_macro_instructions_); 12176 VIXL_ASSERT(OutsideITBlock()); 12177 MacroEmissionCheckScope guard(this); 12178 #ifndef PANDA_BUILD 12179 ITScope it_scope(this, &cond, guard); 12180 #else 12181 ITScope it_scope(allocator_, this, &cond, guard); 12182 #endif 12183 vst4(cond, dt, nreglist, operand); 12184 } 12185 void Vst4(DataType dt, 12186 const NeonRegisterList& nreglist, 12187 const AlignedMemOperand& operand) { 12188 Vst4(al, dt, nreglist, operand); 12189 } 12190 12191 void Vstm(Condition cond, 12192 DataType dt, 12193 Register rn, 12194 WriteBack write_back, 12195 DRegisterList dreglist) { 12196 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12197 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 12198 VIXL_ASSERT(allow_macro_instructions_); 12199 VIXL_ASSERT(OutsideITBlock()); 12200 MacroEmissionCheckScope guard(this); 12201 #ifndef PANDA_BUILD 12202 ITScope it_scope(this, &cond, guard); 12203 #else 12204 ITScope it_scope(allocator_, this, &cond, guard); 12205 #endif 12206 vstm(cond, dt, rn, write_back, dreglist); 12207 } 12208 void Vstm(DataType dt, 12209 Register rn, 12210 WriteBack write_back, 12211 DRegisterList dreglist) { 12212 Vstm(al, dt, rn, write_back, dreglist); 12213 } 12214 void Vstm(Condition cond, 12215 Register rn, 12216 WriteBack write_back, 12217 DRegisterList dreglist) { 12218 Vstm(cond, kDataTypeValueNone, rn, write_back, dreglist); 12219 } 12220 void Vstm(Register rn, WriteBack write_back, DRegisterList dreglist) { 12221 Vstm(al, kDataTypeValueNone, rn, write_back, dreglist); 12222 } 12223 12224 void Vstm(Condition cond, 12225 DataType dt, 12226 Register rn, 12227 WriteBack write_back, 12228 SRegisterList sreglist) { 12229 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12230 VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); 12231 VIXL_ASSERT(allow_macro_instructions_); 12232 VIXL_ASSERT(OutsideITBlock()); 12233 MacroEmissionCheckScope guard(this); 12234 #ifndef PANDA_BUILD 12235 ITScope it_scope(this, &cond, guard); 12236 #else 12237 ITScope it_scope(allocator_, this, &cond, guard); 12238 #endif 12239 vstm(cond, dt, rn, write_back, sreglist); 12240 } 12241 void Vstm(DataType dt, 12242 Register rn, 12243 WriteBack write_back, 12244 SRegisterList sreglist) { 12245 Vstm(al, dt, rn, write_back, sreglist); 12246 } 12247 void Vstm(Condition cond, 12248 Register rn, 12249 WriteBack write_back, 12250 SRegisterList sreglist) { 12251 Vstm(cond, kDataTypeValueNone, rn, write_back, sreglist); 12252 } 12253 void Vstm(Register rn, WriteBack write_back, SRegisterList sreglist) { 12254 Vstm(al, kDataTypeValueNone, rn, write_back, sreglist); 12255 } 12256 12257 void Vstmdb(Condition cond, 12258 DataType dt, 12259 Register rn, 12260 WriteBack write_back, 12261 DRegisterList dreglist) { 12262 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12263 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 12264 VIXL_ASSERT(allow_macro_instructions_); 12265 VIXL_ASSERT(OutsideITBlock()); 12266 MacroEmissionCheckScope guard(this); 12267 #ifndef PANDA_BUILD 12268 ITScope it_scope(this, &cond, guard); 12269 #else 12270 ITScope it_scope(allocator_, this, &cond, guard); 12271 #endif 12272 vstmdb(cond, dt, rn, write_back, dreglist); 12273 } 12274 void Vstmdb(DataType dt, 12275 Register rn, 12276 WriteBack write_back, 12277 DRegisterList dreglist) { 12278 Vstmdb(al, dt, rn, write_back, dreglist); 12279 } 12280 void Vstmdb(Condition cond, 12281 Register rn, 12282 WriteBack write_back, 12283 DRegisterList dreglist) { 12284 Vstmdb(cond, kDataTypeValueNone, rn, write_back, dreglist); 12285 } 12286 void Vstmdb(Register rn, WriteBack write_back, DRegisterList dreglist) { 12287 Vstmdb(al, kDataTypeValueNone, rn, write_back, dreglist); 12288 } 12289 12290 void Vstmdb(Condition cond, 12291 DataType dt, 12292 Register rn, 12293 WriteBack write_back, 12294 SRegisterList sreglist) { 12295 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12296 VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); 12297 VIXL_ASSERT(allow_macro_instructions_); 12298 VIXL_ASSERT(OutsideITBlock()); 12299 MacroEmissionCheckScope guard(this); 12300 #ifndef PANDA_BUILD 12301 ITScope it_scope(this, &cond, guard); 12302 #else 12303 ITScope it_scope(allocator_, this, &cond, guard); 12304 #endif 12305 vstmdb(cond, dt, rn, write_back, sreglist); 12306 } 12307 void Vstmdb(DataType dt, 12308 Register rn, 12309 WriteBack write_back, 12310 SRegisterList sreglist) { 12311 Vstmdb(al, dt, rn, write_back, sreglist); 12312 } 12313 void Vstmdb(Condition cond, 12314 Register rn, 12315 WriteBack write_back, 12316 SRegisterList sreglist) { 12317 Vstmdb(cond, kDataTypeValueNone, rn, write_back, sreglist); 12318 } 12319 void Vstmdb(Register rn, WriteBack write_back, SRegisterList sreglist) { 12320 Vstmdb(al, kDataTypeValueNone, rn, write_back, sreglist); 12321 } 12322 12323 void Vstmia(Condition cond, 12324 DataType dt, 12325 Register rn, 12326 WriteBack write_back, 12327 DRegisterList dreglist) { 12328 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12329 VIXL_ASSERT(!AliasesAvailableScratchRegister(dreglist)); 12330 VIXL_ASSERT(allow_macro_instructions_); 12331 VIXL_ASSERT(OutsideITBlock()); 12332 MacroEmissionCheckScope guard(this); 12333 #ifndef PANDA_BUILD 12334 ITScope it_scope(this, &cond, guard); 12335 #else 12336 ITScope it_scope(allocator_, this, &cond, guard); 12337 #endif 12338 vstmia(cond, dt, rn, write_back, dreglist); 12339 } 12340 void Vstmia(DataType dt, 12341 Register rn, 12342 WriteBack write_back, 12343 DRegisterList dreglist) { 12344 Vstmia(al, dt, rn, write_back, dreglist); 12345 } 12346 void Vstmia(Condition cond, 12347 Register rn, 12348 WriteBack write_back, 12349 DRegisterList dreglist) { 12350 Vstmia(cond, kDataTypeValueNone, rn, write_back, dreglist); 12351 } 12352 void Vstmia(Register rn, WriteBack write_back, DRegisterList dreglist) { 12353 Vstmia(al, kDataTypeValueNone, rn, write_back, dreglist); 12354 } 12355 12356 void Vstmia(Condition cond, 12357 DataType dt, 12358 Register rn, 12359 WriteBack write_back, 12360 SRegisterList sreglist) { 12361 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12362 VIXL_ASSERT(!AliasesAvailableScratchRegister(sreglist)); 12363 VIXL_ASSERT(allow_macro_instructions_); 12364 VIXL_ASSERT(OutsideITBlock()); 12365 MacroEmissionCheckScope guard(this); 12366 #ifndef PANDA_BUILD 12367 ITScope it_scope(this, &cond, guard); 12368 #else 12369 ITScope it_scope(allocator_, this, &cond, guard); 12370 #endif 12371 vstmia(cond, dt, rn, write_back, sreglist); 12372 } 12373 void Vstmia(DataType dt, 12374 Register rn, 12375 WriteBack write_back, 12376 SRegisterList sreglist) { 12377 Vstmia(al, dt, rn, write_back, sreglist); 12378 } 12379 void Vstmia(Condition cond, 12380 Register rn, 12381 WriteBack write_back, 12382 SRegisterList sreglist) { 12383 Vstmia(cond, kDataTypeValueNone, rn, write_back, sreglist); 12384 } 12385 void Vstmia(Register rn, WriteBack write_back, SRegisterList sreglist) { 12386 Vstmia(al, kDataTypeValueNone, rn, write_back, sreglist); 12387 } 12388 12389 void Vstr(Condition cond, 12390 DataType dt, 12391 DRegister rd, 12392 const MemOperand& operand) { 12393 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12394 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12395 VIXL_ASSERT(allow_macro_instructions_); 12396 VIXL_ASSERT(OutsideITBlock()); 12397 MacroEmissionCheckScope guard(this); 12398 #ifndef PANDA_BUILD 12399 ITScope it_scope(this, &cond, guard); 12400 #else 12401 ITScope it_scope(allocator_, this, &cond, guard); 12402 #endif 12403 vstr(cond, dt, rd, operand); 12404 } 12405 void Vstr(DataType dt, DRegister rd, const MemOperand& operand) { 12406 Vstr(al, dt, rd, operand); 12407 } 12408 void Vstr(Condition cond, DRegister rd, const MemOperand& operand) { 12409 Vstr(cond, Untyped64, rd, operand); 12410 } 12411 void Vstr(DRegister rd, const MemOperand& operand) { 12412 Vstr(al, Untyped64, rd, operand); 12413 } 12414 12415 void Vstr(Condition cond, 12416 DataType dt, 12417 SRegister rd, 12418 const MemOperand& operand) { 12419 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12420 VIXL_ASSERT(!AliasesAvailableScratchRegister(operand)); 12421 VIXL_ASSERT(allow_macro_instructions_); 12422 VIXL_ASSERT(OutsideITBlock()); 12423 MacroEmissionCheckScope guard(this); 12424 #ifndef PANDA_BUILD 12425 ITScope it_scope(this, &cond, guard); 12426 #else 12427 ITScope it_scope(allocator_, this, &cond, guard); 12428 #endif 12429 vstr(cond, dt, rd, operand); 12430 } 12431 void Vstr(DataType dt, SRegister rd, const MemOperand& operand) { 12432 Vstr(al, dt, rd, operand); 12433 } 12434 void Vstr(Condition cond, SRegister rd, const MemOperand& operand) { 12435 Vstr(cond, Untyped32, rd, operand); 12436 } 12437 void Vstr(SRegister rd, const MemOperand& operand) { 12438 Vstr(al, Untyped32, rd, operand); 12439 } 12440 12441 void Vsub( 12442 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 12443 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12444 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12445 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12446 VIXL_ASSERT(allow_macro_instructions_); 12447 VIXL_ASSERT(OutsideITBlock()); 12448 MacroEmissionCheckScope guard(this); 12449 #ifndef PANDA_BUILD 12450 ITScope it_scope(this, &cond, guard); 12451 #else 12452 ITScope it_scope(allocator_, this, &cond, guard); 12453 #endif 12454 vsub(cond, dt, rd, rn, rm); 12455 } 12456 void Vsub(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 12457 Vsub(al, dt, rd, rn, rm); 12458 } 12459 12460 void Vsub( 12461 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 12462 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12463 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12464 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12465 VIXL_ASSERT(allow_macro_instructions_); 12466 VIXL_ASSERT(OutsideITBlock()); 12467 MacroEmissionCheckScope guard(this); 12468 #ifndef PANDA_BUILD 12469 ITScope it_scope(this, &cond, guard); 12470 #else 12471 ITScope it_scope(allocator_, this, &cond, guard); 12472 #endif 12473 vsub(cond, dt, rd, rn, rm); 12474 } 12475 void Vsub(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 12476 Vsub(al, dt, rd, rn, rm); 12477 } 12478 12479 void Vsub( 12480 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 12481 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12482 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12483 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12484 VIXL_ASSERT(allow_macro_instructions_); 12485 VIXL_ASSERT(OutsideITBlock()); 12486 MacroEmissionCheckScope guard(this); 12487 #ifndef PANDA_BUILD 12488 ITScope it_scope(this, &cond, guard); 12489 #else 12490 ITScope it_scope(allocator_, this, &cond, guard); 12491 #endif 12492 vsub(cond, dt, rd, rn, rm); 12493 } 12494 void Vsub(DataType dt, SRegister rd, SRegister rn, SRegister rm) { 12495 Vsub(al, dt, rd, rn, rm); 12496 } 12497 12498 void Vsubhn( 12499 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 12500 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12501 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12502 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12503 VIXL_ASSERT(allow_macro_instructions_); 12504 VIXL_ASSERT(OutsideITBlock()); 12505 MacroEmissionCheckScope guard(this); 12506 #ifndef PANDA_BUILD 12507 ITScope it_scope(this, &cond, guard); 12508 #else 12509 ITScope it_scope(allocator_, this, &cond, guard); 12510 #endif 12511 vsubhn(cond, dt, rd, rn, rm); 12512 } 12513 void Vsubhn(DataType dt, DRegister rd, QRegister rn, QRegister rm) { 12514 Vsubhn(al, dt, rd, rn, rm); 12515 } 12516 12517 void Vsubl( 12518 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 12519 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12520 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12521 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12522 VIXL_ASSERT(allow_macro_instructions_); 12523 VIXL_ASSERT(OutsideITBlock()); 12524 MacroEmissionCheckScope guard(this); 12525 #ifndef PANDA_BUILD 12526 ITScope it_scope(this, &cond, guard); 12527 #else 12528 ITScope it_scope(allocator_, this, &cond, guard); 12529 #endif 12530 vsubl(cond, dt, rd, rn, rm); 12531 } 12532 void Vsubl(DataType dt, QRegister rd, DRegister rn, DRegister rm) { 12533 Vsubl(al, dt, rd, rn, rm); 12534 } 12535 12536 void Vsubw( 12537 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) { 12538 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12539 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12540 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12541 VIXL_ASSERT(allow_macro_instructions_); 12542 VIXL_ASSERT(OutsideITBlock()); 12543 MacroEmissionCheckScope guard(this); 12544 #ifndef PANDA_BUILD 12545 ITScope it_scope(this, &cond, guard); 12546 #else 12547 ITScope it_scope(allocator_, this, &cond, guard); 12548 #endif 12549 vsubw(cond, dt, rd, rn, rm); 12550 } 12551 void Vsubw(DataType dt, QRegister rd, QRegister rn, DRegister rm) { 12552 Vsubw(al, dt, rd, rn, rm); 12553 } 12554 12555 void Vswp(Condition cond, DataType dt, DRegister rd, DRegister rm) { 12556 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12557 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12558 VIXL_ASSERT(allow_macro_instructions_); 12559 VIXL_ASSERT(OutsideITBlock()); 12560 MacroEmissionCheckScope guard(this); 12561 #ifndef PANDA_BUILD 12562 ITScope it_scope(this, &cond, guard); 12563 #else 12564 ITScope it_scope(allocator_, this, &cond, guard); 12565 #endif 12566 vswp(cond, dt, rd, rm); 12567 } 12568 void Vswp(DataType dt, DRegister rd, DRegister rm) { Vswp(al, dt, rd, rm); } 12569 void Vswp(Condition cond, DRegister rd, DRegister rm) { 12570 Vswp(cond, kDataTypeValueNone, rd, rm); 12571 } 12572 void Vswp(DRegister rd, DRegister rm) { 12573 Vswp(al, kDataTypeValueNone, rd, rm); 12574 } 12575 12576 void Vswp(Condition cond, DataType dt, QRegister rd, QRegister rm) { 12577 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12578 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12579 VIXL_ASSERT(allow_macro_instructions_); 12580 VIXL_ASSERT(OutsideITBlock()); 12581 MacroEmissionCheckScope guard(this); 12582 #ifndef PANDA_BUILD 12583 ITScope it_scope(this, &cond, guard); 12584 #else 12585 ITScope it_scope(allocator_, this, &cond, guard); 12586 #endif 12587 vswp(cond, dt, rd, rm); 12588 } 12589 void Vswp(DataType dt, QRegister rd, QRegister rm) { Vswp(al, dt, rd, rm); } 12590 void Vswp(Condition cond, QRegister rd, QRegister rm) { 12591 Vswp(cond, kDataTypeValueNone, rd, rm); 12592 } 12593 void Vswp(QRegister rd, QRegister rm) { 12594 Vswp(al, kDataTypeValueNone, rd, rm); 12595 } 12596 12597 void Vtbl(Condition cond, 12598 DataType dt, 12599 DRegister rd, 12600 const NeonRegisterList& nreglist, 12601 DRegister rm) { 12602 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12603 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 12604 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12605 VIXL_ASSERT(allow_macro_instructions_); 12606 VIXL_ASSERT(OutsideITBlock()); 12607 MacroEmissionCheckScope guard(this); 12608 #ifndef PANDA_BUILD 12609 ITScope it_scope(this, &cond, guard); 12610 #else 12611 ITScope it_scope(allocator_, this, &cond, guard); 12612 #endif 12613 vtbl(cond, dt, rd, nreglist, rm); 12614 } 12615 void Vtbl(DataType dt, 12616 DRegister rd, 12617 const NeonRegisterList& nreglist, 12618 DRegister rm) { 12619 Vtbl(al, dt, rd, nreglist, rm); 12620 } 12621 12622 void Vtbx(Condition cond, 12623 DataType dt, 12624 DRegister rd, 12625 const NeonRegisterList& nreglist, 12626 DRegister rm) { 12627 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12628 VIXL_ASSERT(!AliasesAvailableScratchRegister(nreglist)); 12629 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12630 VIXL_ASSERT(allow_macro_instructions_); 12631 VIXL_ASSERT(OutsideITBlock()); 12632 MacroEmissionCheckScope guard(this); 12633 #ifndef PANDA_BUILD 12634 ITScope it_scope(this, &cond, guard); 12635 #else 12636 ITScope it_scope(allocator_, this, &cond, guard); 12637 #endif 12638 vtbx(cond, dt, rd, nreglist, rm); 12639 } 12640 void Vtbx(DataType dt, 12641 DRegister rd, 12642 const NeonRegisterList& nreglist, 12643 DRegister rm) { 12644 Vtbx(al, dt, rd, nreglist, rm); 12645 } 12646 12647 void Vtrn(Condition cond, DataType dt, DRegister rd, DRegister rm) { 12648 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12649 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12650 VIXL_ASSERT(allow_macro_instructions_); 12651 VIXL_ASSERT(OutsideITBlock()); 12652 MacroEmissionCheckScope guard(this); 12653 #ifndef PANDA_BUILD 12654 ITScope it_scope(this, &cond, guard); 12655 #else 12656 ITScope it_scope(allocator_, this, &cond, guard); 12657 #endif 12658 vtrn(cond, dt, rd, rm); 12659 } 12660 void Vtrn(DataType dt, DRegister rd, DRegister rm) { Vtrn(al, dt, rd, rm); } 12661 12662 void Vtrn(Condition cond, DataType dt, QRegister rd, QRegister rm) { 12663 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12664 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12665 VIXL_ASSERT(allow_macro_instructions_); 12666 VIXL_ASSERT(OutsideITBlock()); 12667 MacroEmissionCheckScope guard(this); 12668 #ifndef PANDA_BUILD 12669 ITScope it_scope(this, &cond, guard); 12670 #else 12671 ITScope it_scope(allocator_, this, &cond, guard); 12672 #endif 12673 vtrn(cond, dt, rd, rm); 12674 } 12675 void Vtrn(DataType dt, QRegister rd, QRegister rm) { Vtrn(al, dt, rd, rm); } 12676 12677 void Vtst( 12678 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 12679 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12680 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12681 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12682 VIXL_ASSERT(allow_macro_instructions_); 12683 VIXL_ASSERT(OutsideITBlock()); 12684 MacroEmissionCheckScope guard(this); 12685 #ifndef PANDA_BUILD 12686 ITScope it_scope(this, &cond, guard); 12687 #else 12688 ITScope it_scope(allocator_, this, &cond, guard); 12689 #endif 12690 vtst(cond, dt, rd, rn, rm); 12691 } 12692 void Vtst(DataType dt, DRegister rd, DRegister rn, DRegister rm) { 12693 Vtst(al, dt, rd, rn, rm); 12694 } 12695 12696 void Vtst( 12697 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 12698 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12699 VIXL_ASSERT(!AliasesAvailableScratchRegister(rn)); 12700 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12701 VIXL_ASSERT(allow_macro_instructions_); 12702 VIXL_ASSERT(OutsideITBlock()); 12703 MacroEmissionCheckScope guard(this); 12704 #ifndef PANDA_BUILD 12705 ITScope it_scope(this, &cond, guard); 12706 #else 12707 ITScope it_scope(allocator_, this, &cond, guard); 12708 #endif 12709 vtst(cond, dt, rd, rn, rm); 12710 } 12711 void Vtst(DataType dt, QRegister rd, QRegister rn, QRegister rm) { 12712 Vtst(al, dt, rd, rn, rm); 12713 } 12714 12715 void Vuzp(Condition cond, DataType dt, DRegister rd, DRegister rm) { 12716 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12717 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12718 VIXL_ASSERT(allow_macro_instructions_); 12719 VIXL_ASSERT(OutsideITBlock()); 12720 MacroEmissionCheckScope guard(this); 12721 #ifndef PANDA_BUILD 12722 ITScope it_scope(this, &cond, guard); 12723 #else 12724 ITScope it_scope(allocator_, this, &cond, guard); 12725 #endif 12726 vuzp(cond, dt, rd, rm); 12727 } 12728 void Vuzp(DataType dt, DRegister rd, DRegister rm) { Vuzp(al, dt, rd, rm); } 12729 12730 void Vuzp(Condition cond, DataType dt, QRegister rd, QRegister rm) { 12731 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12732 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12733 VIXL_ASSERT(allow_macro_instructions_); 12734 VIXL_ASSERT(OutsideITBlock()); 12735 MacroEmissionCheckScope guard(this); 12736 #ifndef PANDA_BUILD 12737 ITScope it_scope(this, &cond, guard); 12738 #else 12739 ITScope it_scope(allocator_, this, &cond, guard); 12740 #endif 12741 vuzp(cond, dt, rd, rm); 12742 } 12743 void Vuzp(DataType dt, QRegister rd, QRegister rm) { Vuzp(al, dt, rd, rm); } 12744 12745 void Vzip(Condition cond, DataType dt, DRegister rd, DRegister rm) { 12746 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12747 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12748 VIXL_ASSERT(allow_macro_instructions_); 12749 VIXL_ASSERT(OutsideITBlock()); 12750 MacroEmissionCheckScope guard(this); 12751 #ifndef PANDA_BUILD 12752 ITScope it_scope(this, &cond, guard); 12753 #else 12754 ITScope it_scope(allocator_, this, &cond, guard); 12755 #endif 12756 vzip(cond, dt, rd, rm); 12757 } 12758 void Vzip(DataType dt, DRegister rd, DRegister rm) { Vzip(al, dt, rd, rm); } 12759 12760 void Vzip(Condition cond, DataType dt, QRegister rd, QRegister rm) { 12761 VIXL_ASSERT(!AliasesAvailableScratchRegister(rd)); 12762 VIXL_ASSERT(!AliasesAvailableScratchRegister(rm)); 12763 VIXL_ASSERT(allow_macro_instructions_); 12764 VIXL_ASSERT(OutsideITBlock()); 12765 MacroEmissionCheckScope guard(this); 12766 #ifndef PANDA_BUILD 12767 ITScope it_scope(this, &cond, guard); 12768 #else 12769 ITScope it_scope(allocator_, this, &cond, guard); 12770 #endif 12771 vzip(cond, dt, rd, rm); 12772 } 12773 void Vzip(DataType dt, QRegister rd, QRegister rm) { Vzip(al, dt, rd, rm); } 12774 12775 void Yield(Condition cond) { 12776 VIXL_ASSERT(allow_macro_instructions_); 12777 VIXL_ASSERT(OutsideITBlock()); 12778 MacroEmissionCheckScope guard(this); 12779 #ifndef PANDA_BUILD 12780 ITScope it_scope(this, &cond, guard); 12781 #else 12782 ITScope it_scope(allocator_, this, &cond, guard); 12783 #endif 12784 yield(cond); 12785 } 12786 void Yield() { Yield(al); } 12787 void Vabs(Condition cond, VRegister rd, VRegister rm) { 12788 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12789 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12790 if (rd.IsS()) { 12791 Vabs(cond, F32, rd.S(), rm.S()); 12792 } else { 12793 Vabs(cond, F64, rd.D(), rm.D()); 12794 } 12795 } 12796 void Vabs(VRegister rd, VRegister rm) { Vabs(al, rd, rm); } 12797 void Vadd(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12798 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12799 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12800 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12801 if (rd.IsS()) { 12802 Vadd(cond, F32, rd.S(), rn.S(), rm.S()); 12803 } else { 12804 Vadd(cond, F64, rd.D(), rn.D(), rm.D()); 12805 } 12806 } 12807 void Vadd(VRegister rd, VRegister rn, VRegister rm) { Vadd(al, rd, rn, rm); } 12808 void Vcmp(Condition cond, VRegister rd, VRegister rm) { 12809 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12810 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12811 if (rd.IsS()) { 12812 Vcmp(cond, F32, rd.S(), rm.S()); 12813 } else { 12814 Vcmp(cond, F64, rd.D(), rm.D()); 12815 } 12816 } 12817 void Vcmp(VRegister rd, VRegister rm) { Vcmp(al, rd, rm); } 12818 void Vcmpe(Condition cond, VRegister rd, VRegister rm) { 12819 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12820 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12821 if (rd.IsS()) { 12822 Vcmpe(cond, F32, rd.S(), rm.S()); 12823 } else { 12824 Vcmpe(cond, F64, rd.D(), rm.D()); 12825 } 12826 } 12827 void Vcmpe(VRegister rd, VRegister rm) { Vcmpe(al, rd, rm); } 12828 void Vdiv(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12829 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12830 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12831 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12832 if (rd.IsS()) { 12833 Vdiv(cond, F32, rd.S(), rn.S(), rm.S()); 12834 } else { 12835 Vdiv(cond, F64, rd.D(), rn.D(), rm.D()); 12836 } 12837 } 12838 void Vdiv(VRegister rd, VRegister rn, VRegister rm) { Vdiv(al, rd, rn, rm); } 12839 void Vfma(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12840 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12841 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12842 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12843 if (rd.IsS()) { 12844 Vfma(cond, F32, rd.S(), rn.S(), rm.S()); 12845 } else { 12846 Vfma(cond, F64, rd.D(), rn.D(), rm.D()); 12847 } 12848 } 12849 void Vfma(VRegister rd, VRegister rn, VRegister rm) { Vfma(al, rd, rn, rm); } 12850 void Vfms(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12851 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12852 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12853 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12854 if (rd.IsS()) { 12855 Vfms(cond, F32, rd.S(), rn.S(), rm.S()); 12856 } else { 12857 Vfms(cond, F64, rd.D(), rn.D(), rm.D()); 12858 } 12859 } 12860 void Vfms(VRegister rd, VRegister rn, VRegister rm) { Vfms(al, rd, rn, rm); } 12861 void Vfnma(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12862 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12863 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12864 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12865 if (rd.IsS()) { 12866 Vfnma(cond, F32, rd.S(), rn.S(), rm.S()); 12867 } else { 12868 Vfnma(cond, F64, rd.D(), rn.D(), rm.D()); 12869 } 12870 } 12871 void Vfnma(VRegister rd, VRegister rn, VRegister rm) { 12872 Vfnma(al, rd, rn, rm); 12873 } 12874 void Vfnms(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12875 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12876 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12877 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12878 if (rd.IsS()) { 12879 Vfnms(cond, F32, rd.S(), rn.S(), rm.S()); 12880 } else { 12881 Vfnms(cond, F64, rd.D(), rn.D(), rm.D()); 12882 } 12883 } 12884 void Vfnms(VRegister rd, VRegister rn, VRegister rm) { 12885 Vfnms(al, rd, rn, rm); 12886 } 12887 void Vmaxnm(VRegister rd, VRegister rn, VRegister rm) { 12888 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12889 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12890 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12891 if (rd.IsS()) { 12892 Vmaxnm(F32, rd.S(), rn.S(), rm.S()); 12893 } else { 12894 Vmaxnm(F64, rd.D(), rn.D(), rm.D()); 12895 } 12896 } 12897 void Vminnm(VRegister rd, VRegister rn, VRegister rm) { 12898 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12899 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12900 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12901 if (rd.IsS()) { 12902 Vminnm(F32, rd.S(), rn.S(), rm.S()); 12903 } else { 12904 Vminnm(F64, rd.D(), rn.D(), rm.D()); 12905 } 12906 } 12907 void Vmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12908 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12909 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12910 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12911 if (rd.IsS()) { 12912 Vmla(cond, F32, rd.S(), rn.S(), rm.S()); 12913 } else { 12914 Vmla(cond, F64, rd.D(), rn.D(), rm.D()); 12915 } 12916 } 12917 void Vmla(VRegister rd, VRegister rn, VRegister rm) { Vmla(al, rd, rn, rm); } 12918 void Vmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12919 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12920 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12921 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12922 if (rd.IsS()) { 12923 Vmls(cond, F32, rd.S(), rn.S(), rm.S()); 12924 } else { 12925 Vmls(cond, F64, rd.D(), rn.D(), rm.D()); 12926 } 12927 } 12928 void Vmls(VRegister rd, VRegister rn, VRegister rm) { Vmls(al, rd, rn, rm); } 12929 void Vmov(Condition cond, VRegister rd, VRegister rm) { 12930 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12931 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12932 if (rd.IsS()) { 12933 Vmov(cond, F32, rd.S(), rm.S()); 12934 } else { 12935 Vmov(cond, F64, rd.D(), rm.D()); 12936 } 12937 } 12938 void Vmov(VRegister rd, VRegister rm) { Vmov(al, rd, rm); } 12939 void Vmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12940 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12941 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12942 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12943 if (rd.IsS()) { 12944 Vmul(cond, F32, rd.S(), rn.S(), rm.S()); 12945 } else { 12946 Vmul(cond, F64, rd.D(), rn.D(), rm.D()); 12947 } 12948 } 12949 void Vmul(VRegister rd, VRegister rn, VRegister rm) { Vmul(al, rd, rn, rm); } 12950 void Vneg(Condition cond, VRegister rd, VRegister rm) { 12951 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12952 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12953 if (rd.IsS()) { 12954 Vneg(cond, F32, rd.S(), rm.S()); 12955 } else { 12956 Vneg(cond, F64, rd.D(), rm.D()); 12957 } 12958 } 12959 void Vneg(VRegister rd, VRegister rm) { Vneg(al, rd, rm); } 12960 void Vnmla(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12961 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12962 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12963 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12964 if (rd.IsS()) { 12965 Vnmla(cond, F32, rd.S(), rn.S(), rm.S()); 12966 } else { 12967 Vnmla(cond, F64, rd.D(), rn.D(), rm.D()); 12968 } 12969 } 12970 void Vnmla(VRegister rd, VRegister rn, VRegister rm) { 12971 Vnmla(al, rd, rn, rm); 12972 } 12973 void Vnmls(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12974 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12975 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12976 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12977 if (rd.IsS()) { 12978 Vnmls(cond, F32, rd.S(), rn.S(), rm.S()); 12979 } else { 12980 Vnmls(cond, F64, rd.D(), rn.D(), rm.D()); 12981 } 12982 } 12983 void Vnmls(VRegister rd, VRegister rn, VRegister rm) { 12984 Vnmls(al, rd, rn, rm); 12985 } 12986 void Vnmul(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 12987 VIXL_ASSERT(rd.IsS() || rd.IsD()); 12988 VIXL_ASSERT(rd.GetType() == rn.GetType()); 12989 VIXL_ASSERT(rd.GetType() == rm.GetType()); 12990 if (rd.IsS()) { 12991 Vnmul(cond, F32, rd.S(), rn.S(), rm.S()); 12992 } else { 12993 Vnmul(cond, F64, rd.D(), rn.D(), rm.D()); 12994 } 12995 } 12996 void Vnmul(VRegister rd, VRegister rn, VRegister rm) { 12997 Vnmul(al, rd, rn, rm); 12998 } 12999 void Vrinta(VRegister rd, VRegister rm) { 13000 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13001 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13002 if (rd.IsS()) { 13003 Vrinta(F32, rd.S(), rm.S()); 13004 } else { 13005 Vrinta(F64, rd.D(), rm.D()); 13006 } 13007 } 13008 void Vrintm(VRegister rd, VRegister rm) { 13009 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13010 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13011 if (rd.IsS()) { 13012 Vrintm(F32, rd.S(), rm.S()); 13013 } else { 13014 Vrintm(F64, rd.D(), rm.D()); 13015 } 13016 } 13017 void Vrintn(VRegister rd, VRegister rm) { 13018 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13019 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13020 if (rd.IsS()) { 13021 Vrintn(F32, rd.S(), rm.S()); 13022 } else { 13023 Vrintn(F64, rd.D(), rm.D()); 13024 } 13025 } 13026 void Vrintp(VRegister rd, VRegister rm) { 13027 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13028 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13029 if (rd.IsS()) { 13030 Vrintp(F32, rd.S(), rm.S()); 13031 } else { 13032 Vrintp(F64, rd.D(), rm.D()); 13033 } 13034 } 13035 void Vrintr(Condition cond, VRegister rd, VRegister rm) { 13036 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13037 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13038 if (rd.IsS()) { 13039 Vrintr(cond, F32, rd.S(), rm.S()); 13040 } else { 13041 Vrintr(cond, F64, rd.D(), rm.D()); 13042 } 13043 } 13044 void Vrintr(VRegister rd, VRegister rm) { Vrintr(al, rd, rm); } 13045 void Vrintx(Condition cond, VRegister rd, VRegister rm) { 13046 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13047 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13048 if (rd.IsS()) { 13049 Vrintx(cond, F32, rd.S(), rm.S()); 13050 } else { 13051 Vrintx(cond, F64, rd.D(), rm.D()); 13052 } 13053 } 13054 void Vrintx(VRegister rd, VRegister rm) { Vrintx(al, rd, rm); } 13055 void Vrintz(Condition cond, VRegister rd, VRegister rm) { 13056 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13057 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13058 if (rd.IsS()) { 13059 Vrintz(cond, F32, rd.S(), rm.S()); 13060 } else { 13061 Vrintz(cond, F64, rd.D(), rm.D()); 13062 } 13063 } 13064 void Vrintz(VRegister rd, VRegister rm) { Vrintz(al, rd, rm); } 13065 void Vseleq(VRegister rd, VRegister rn, VRegister rm) { 13066 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13067 VIXL_ASSERT(rd.GetType() == rn.GetType()); 13068 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13069 if (rd.IsS()) { 13070 Vseleq(F32, rd.S(), rn.S(), rm.S()); 13071 } else { 13072 Vseleq(F64, rd.D(), rn.D(), rm.D()); 13073 } 13074 } 13075 void Vselge(VRegister rd, VRegister rn, VRegister rm) { 13076 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13077 VIXL_ASSERT(rd.GetType() == rn.GetType()); 13078 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13079 if (rd.IsS()) { 13080 Vselge(F32, rd.S(), rn.S(), rm.S()); 13081 } else { 13082 Vselge(F64, rd.D(), rn.D(), rm.D()); 13083 } 13084 } 13085 void Vselgt(VRegister rd, VRegister rn, VRegister rm) { 13086 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13087 VIXL_ASSERT(rd.GetType() == rn.GetType()); 13088 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13089 if (rd.IsS()) { 13090 Vselgt(F32, rd.S(), rn.S(), rm.S()); 13091 } else { 13092 Vselgt(F64, rd.D(), rn.D(), rm.D()); 13093 } 13094 } 13095 void Vselvs(VRegister rd, VRegister rn, VRegister rm) { 13096 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13097 VIXL_ASSERT(rd.GetType() == rn.GetType()); 13098 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13099 if (rd.IsS()) { 13100 Vselvs(F32, rd.S(), rn.S(), rm.S()); 13101 } else { 13102 Vselvs(F64, rd.D(), rn.D(), rm.D()); 13103 } 13104 } 13105 void Vsqrt(Condition cond, VRegister rd, VRegister rm) { 13106 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13107 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13108 if (rd.IsS()) { 13109 Vsqrt(cond, F32, rd.S(), rm.S()); 13110 } else { 13111 Vsqrt(cond, F64, rd.D(), rm.D()); 13112 } 13113 } 13114 void Vsqrt(VRegister rd, VRegister rm) { Vsqrt(al, rd, rm); } 13115 void Vsub(Condition cond, VRegister rd, VRegister rn, VRegister rm) { 13116 VIXL_ASSERT(rd.IsS() || rd.IsD()); 13117 VIXL_ASSERT(rd.GetType() == rn.GetType()); 13118 VIXL_ASSERT(rd.GetType() == rm.GetType()); 13119 if (rd.IsS()) { 13120 Vsub(cond, F32, rd.S(), rn.S(), rm.S()); 13121 } else { 13122 Vsub(cond, F64, rd.D(), rn.D(), rm.D()); 13123 } 13124 } 13125 void Vsub(VRegister rd, VRegister rn, VRegister rm) { Vsub(al, rd, rn, rm); } 13126 // End of generated code. 13127 13128 virtual bool AllowUnpredictable() VIXL_OVERRIDE { 13129 VIXL_ABORT_WITH_MSG("Unpredictable instruction.\n"); 13130 return false; 13131 } 13132 virtual bool AllowStronglyDiscouraged() VIXL_OVERRIDE { 13133 VIXL_ABORT_WITH_MSG( 13134 "ARM strongly recommends to not use this instruction.\n"); 13135 return false; 13136 } 13137 // Old syntax of vrint instructions. 13138 VIXL_DEPRECATED( 13139 "void Vrinta(DataType dt, DRegister rd, DRegister rm)", 13140 void Vrinta(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) { 13141 USE(dt2); 13142 VIXL_ASSERT(dt1.Is(dt2)); 13143 return Vrinta(dt1, rd, rm); 13144 } 13145 VIXL_DEPRECATED( 13146 "void Vrinta(DataType dt, QRegister rd, QRegister rm)", 13147 void Vrinta(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) { 13148 USE(dt2); 13149 VIXL_ASSERT(dt1.Is(dt2)); 13150 return Vrinta(dt1, rd, rm); 13151 } 13152 VIXL_DEPRECATED( 13153 "void Vrinta(DataType dt, SRegister rd, SRegister rm)", 13154 void Vrinta(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) { 13155 USE(dt2); 13156 VIXL_ASSERT(dt1.Is(dt2)); 13157 return Vrinta(dt1, rd, rm); 13158 } 13159 13160 VIXL_DEPRECATED( 13161 "void Vrintm(DataType dt, DRegister rd, DRegister rm)", 13162 void Vrintm(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) { 13163 USE(dt2); 13164 VIXL_ASSERT(dt1.Is(dt2)); 13165 return Vrintm(dt1, rd, rm); 13166 } 13167 VIXL_DEPRECATED( 13168 "void Vrintm(DataType dt, QRegister rd, QRegister rm)", 13169 void Vrintm(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) { 13170 USE(dt2); 13171 VIXL_ASSERT(dt1.Is(dt2)); 13172 return Vrintm(dt1, rd, rm); 13173 } 13174 VIXL_DEPRECATED( 13175 "void Vrintm(DataType dt, SRegister rd, SRegister rm)", 13176 void Vrintm(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) { 13177 USE(dt2); 13178 VIXL_ASSERT(dt1.Is(dt2)); 13179 return Vrintm(dt1, rd, rm); 13180 } 13181 13182 VIXL_DEPRECATED( 13183 "void Vrintn(DataType dt, DRegister rd, DRegister rm)", 13184 void Vrintn(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) { 13185 USE(dt2); 13186 VIXL_ASSERT(dt1.Is(dt2)); 13187 return Vrintn(dt1, rd, rm); 13188 } 13189 VIXL_DEPRECATED( 13190 "void Vrintn(DataType dt, QRegister rd, QRegister rm)", 13191 void Vrintn(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) { 13192 USE(dt2); 13193 VIXL_ASSERT(dt1.Is(dt2)); 13194 return Vrintn(dt1, rd, rm); 13195 } 13196 VIXL_DEPRECATED( 13197 "void Vrintn(DataType dt, SRegister rd, SRegister rm)", 13198 void Vrintn(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) { 13199 USE(dt2); 13200 VIXL_ASSERT(dt1.Is(dt2)); 13201 return Vrintn(dt1, rd, rm); 13202 } 13203 13204 VIXL_DEPRECATED( 13205 "void Vrintp(DataType dt, DRegister rd, DRegister rm)", 13206 void Vrintp(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) { 13207 USE(dt2); 13208 VIXL_ASSERT(dt1.Is(dt2)); 13209 return Vrintp(dt1, rd, rm); 13210 } 13211 VIXL_DEPRECATED( 13212 "void Vrintp(DataType dt, QRegister rd, QRegister rm)", 13213 void Vrintp(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) { 13214 USE(dt2); 13215 VIXL_ASSERT(dt1.Is(dt2)); 13216 return Vrintp(dt1, rd, rm); 13217 } 13218 VIXL_DEPRECATED( 13219 "void Vrintp(DataType dt, SRegister rd, SRegister rm)", 13220 void Vrintp(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) { 13221 USE(dt2); 13222 VIXL_ASSERT(dt1.Is(dt2)); 13223 return Vrintp(dt1, rd, rm); 13224 } 13225 13226 VIXL_DEPRECATED( 13227 "void Vrintr(Condition cond, DataType dt, SRegister rd, SRegister rm)", 13228 void Vrintr(Condition cond, 13229 DataType dt1, 13230 DataType dt2, 13231 SRegister rd, 13232 SRegister rm)) { 13233 USE(dt2); 13234 VIXL_ASSERT(dt1.Is(dt2)); 13235 return Vrintr(cond, dt1, rd, rm); 13236 } 13237 VIXL_DEPRECATED( 13238 "void Vrintr(DataType dt, SRegister rd, SRegister rm)", 13239 void Vrintr(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) { 13240 USE(dt2); 13241 VIXL_ASSERT(dt1.Is(dt2)); 13242 return Vrintr(dt1, rd, rm); 13243 } 13244 13245 VIXL_DEPRECATED( 13246 "void Vrintr(Condition cond, DataType dt, DRegister rd, DRegister rm)", 13247 void Vrintr(Condition cond, 13248 DataType dt1, 13249 DataType dt2, 13250 DRegister rd, 13251 DRegister rm)) { 13252 USE(dt2); 13253 VIXL_ASSERT(dt1.Is(dt2)); 13254 return Vrintr(cond, dt1, rd, rm); 13255 } 13256 VIXL_DEPRECATED( 13257 "void Vrintr(DataType dt, DRegister rd, DRegister rm)", 13258 void Vrintr(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) { 13259 USE(dt2); 13260 VIXL_ASSERT(dt1.Is(dt2)); 13261 return Vrintr(dt1, rd, rm); 13262 } 13263 13264 VIXL_DEPRECATED( 13265 "void Vrintx(Condition cond, DataType dt, DRegister rd, DRegister rm)", 13266 void Vrintx(Condition cond, 13267 DataType dt1, 13268 DataType dt2, 13269 DRegister rd, 13270 DRegister rm)) { 13271 USE(dt2); 13272 VIXL_ASSERT(dt1.Is(dt2)); 13273 return Vrintx(cond, dt1, rd, rm); 13274 } 13275 VIXL_DEPRECATED( 13276 "void Vrintx(DataType dt, DRegister rd, DRegister rm)", 13277 void Vrintx(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) { 13278 USE(dt2); 13279 VIXL_ASSERT(dt1.Is(dt2)); 13280 return Vrintx(dt1, rd, rm); 13281 } 13282 13283 VIXL_DEPRECATED( 13284 "void Vrintx(DataType dt, QRegister rd, QRegister rm)", 13285 void Vrintx(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) { 13286 USE(dt2); 13287 VIXL_ASSERT(dt1.Is(dt2)); 13288 return Vrintx(dt1, rd, rm); 13289 } 13290 13291 VIXL_DEPRECATED( 13292 "void Vrintx(Condition cond, DataType dt, SRegister rd, SRegister rm)", 13293 void Vrintx(Condition cond, 13294 DataType dt1, 13295 DataType dt2, 13296 SRegister rd, 13297 SRegister rm)) { 13298 USE(dt2); 13299 VIXL_ASSERT(dt1.Is(dt2)); 13300 return Vrintx(cond, dt1, rd, rm); 13301 } 13302 VIXL_DEPRECATED( 13303 "void Vrintx(DataType dt, SRegister rd, SRegister rm)", 13304 void Vrintx(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) { 13305 USE(dt2); 13306 VIXL_ASSERT(dt1.Is(dt2)); 13307 return Vrintx(dt1, rd, rm); 13308 } 13309 13310 VIXL_DEPRECATED( 13311 "void Vrintz(Condition cond, DataType dt, DRegister rd, DRegister rm)", 13312 void Vrintz(Condition cond, 13313 DataType dt1, 13314 DataType dt2, 13315 DRegister rd, 13316 DRegister rm)) { 13317 USE(dt2); 13318 VIXL_ASSERT(dt1.Is(dt2)); 13319 return Vrintz(cond, dt1, rd, rm); 13320 } 13321 VIXL_DEPRECATED( 13322 "void Vrintz(DataType dt, DRegister rd, DRegister rm)", 13323 void Vrintz(DataType dt1, DataType dt2, DRegister rd, DRegister rm)) { 13324 USE(dt2); 13325 VIXL_ASSERT(dt1.Is(dt2)); 13326 return Vrintz(dt1, rd, rm); 13327 } 13328 13329 VIXL_DEPRECATED( 13330 "void Vrintz(DataType dt, QRegister rd, QRegister rm)", 13331 void Vrintz(DataType dt1, DataType dt2, QRegister rd, QRegister rm)) { 13332 USE(dt2); 13333 VIXL_ASSERT(dt1.Is(dt2)); 13334 return Vrintz(dt1, rd, rm); 13335 } 13336 13337 VIXL_DEPRECATED( 13338 "void Vrintz(Condition cond, DataType dt, SRegister rd, SRegister rm)", 13339 void Vrintz(Condition cond, 13340 DataType dt1, 13341 DataType dt2, 13342 SRegister rd, 13343 SRegister rm)) { 13344 USE(dt2); 13345 VIXL_ASSERT(dt1.Is(dt2)); 13346 return Vrintz(cond, dt1, rd, rm); 13347 } 13348 VIXL_DEPRECATED( 13349 "void Vrintz(DataType dt, SRegister rd, SRegister rm)", 13350 void Vrintz(DataType dt1, DataType dt2, SRegister rd, SRegister rm)) { 13351 USE(dt2); 13352 VIXL_ASSERT(dt1.Is(dt2)); 13353 return Vrintz(dt1, rd, rm); 13354 } 13355 13356 private: 13357 bool NeedBranch(Condition* cond) { return !cond->Is(al) && IsUsingT32(); } 13358 static const int kBranchSize = kMaxInstructionSizeInBytes; 13359 13360 RegisterList available_; 13361 VRegisterList available_vfp_; 13362 UseScratchRegisterScope* current_scratch_scope_; 13363 MacroAssemblerContext context_; 13364 PoolManager<int32_t> pool_manager_; 13365 bool generate_simulator_code_; 13366 bool allow_macro_instructions_; 13367 Label* pool_end_; 13368 #ifdef PANDA_BUILD 13369 AllocatorWrapper allocator_; 13370 #endif 13371 friend class TestMacroAssembler; 13372 }; 13373 13374 // This scope utility allows scratch registers to be managed safely. The 13375 // MacroAssembler's GetScratchRegisterList() is used as a pool of scratch 13376 // registers. These registers can be allocated on demand, and will be returned 13377 // at the end of the scope. 13378 // 13379 // When the scope ends, the MacroAssembler's lists will be restored to their 13380 // original state, even if the lists were modified by some other means. 13381 // 13382 // Scopes must nest perfectly. That is, they must be destructed in reverse 13383 // construction order. Otherwise, it is not clear how to handle cases where one 13384 // scope acquires a register that was included in a now-closing scope. With 13385 // perfect nesting, this cannot occur. 13386 class UseScratchRegisterScope { 13387 public: 13388 // This constructor implicitly calls the `Open` function to initialise the 13389 // scope, so it is ready to use immediately after it has been constructed. 13390 explicit UseScratchRegisterScope(MacroAssembler* masm) 13391 : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) { 13392 Open(masm); 13393 } 13394 // This constructor allows deferred and optional initialisation of the scope. 13395 // The user is required to explicitly call the `Open` function before using 13396 // the scope. 13397 UseScratchRegisterScope() 13398 : masm_(NULL), parent_(NULL), old_available_(0), old_available_vfp_(0) {} 13399 13400 // This function performs the actual initialisation work. 13401 void Open(MacroAssembler* masm); 13402 13403 // The destructor always implicitly calls the `Close` function. 13404 ~UseScratchRegisterScope() { Close(); } 13405 13406 // This function performs the cleaning-up work. It must succeed even if the 13407 // scope has not been opened. It is safe to call multiple times. 13408 void Close(); 13409 13410 bool IsAvailable(const Register& reg) const; 13411 bool IsAvailable(const VRegister& reg) const; 13412 13413 // Take a register from the temp list. It will be returned automatically when 13414 // the scope ends. 13415 Register Acquire(); 13416 VRegister AcquireV(unsigned size_in_bits); 13417 QRegister AcquireQ(); 13418 DRegister AcquireD(); 13419 SRegister AcquireS(); 13420 13421 // Explicitly release an acquired (or excluded) register, putting it back in 13422 // the temp list. 13423 void Release(const Register& reg); 13424 void Release(const VRegister& reg); 13425 13426 // Make the specified registers available as scratch registers for the 13427 // duration of this scope. 13428 void Include(const RegisterList& list); 13429 void Include(const Register& reg1, 13430 const Register& reg2 = NoReg, 13431 const Register& reg3 = NoReg, 13432 const Register& reg4 = NoReg) { 13433 Include(RegisterList(reg1, reg2, reg3, reg4)); 13434 } 13435 void Include(const VRegisterList& list); 13436 void Include(const VRegister& reg1, 13437 const VRegister& reg2 = NoVReg, 13438 const VRegister& reg3 = NoVReg, 13439 const VRegister& reg4 = NoVReg) { 13440 Include(VRegisterList(reg1, reg2, reg3, reg4)); 13441 } 13442 13443 // Make sure that the specified registers are not available in this scope. 13444 // This can be used to prevent helper functions from using sensitive 13445 // registers, for example. 13446 void Exclude(const RegisterList& list); 13447 void Exclude(const Register& reg1, 13448 const Register& reg2 = NoReg, 13449 const Register& reg3 = NoReg, 13450 const Register& reg4 = NoReg) { 13451 Exclude(RegisterList(reg1, reg2, reg3, reg4)); 13452 } 13453 void Exclude(const VRegisterList& list); 13454 void Exclude(const VRegister& reg1, 13455 const VRegister& reg2 = NoVReg, 13456 const VRegister& reg3 = NoVReg, 13457 const VRegister& reg4 = NoVReg) { 13458 Exclude(VRegisterList(reg1, reg2, reg3, reg4)); 13459 } 13460 13461 // A convenience helper to exclude any registers used by the operand. 13462 void Exclude(const Operand& operand); 13463 13464 // Prevent any scratch registers from being used in this scope. 13465 void ExcludeAll(); 13466 13467 private: 13468 // The MacroAssembler maintains a list of available scratch registers, and 13469 // also keeps track of the most recently-opened scope so that on destruction 13470 // we can check that scopes do not outlive their parents. 13471 MacroAssembler* masm_; 13472 UseScratchRegisterScope* parent_; 13473 13474 // The state of the available lists at the start of this scope. 13475 uint32_t old_available_; // kRRegister 13476 uint64_t old_available_vfp_; // kVRegister 13477 13478 VIXL_NO_RETURN_IN_DEBUG_MODE UseScratchRegisterScope( 13479 const UseScratchRegisterScope&) { 13480 VIXL_UNREACHABLE(); 13481 } 13482 VIXL_NO_RETURN_IN_DEBUG_MODE void operator=(const UseScratchRegisterScope&) { 13483 VIXL_UNREACHABLE(); 13484 } 13485 }; 13486 13487 13488 } // namespace aarch32 13489 } // namespace vixl 13490 13491 #endif // VIXL_AARCH32_MACRO_ASSEMBLER_AARCH32_H_ 13492