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