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