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