5#ifndef V8_CODEGEN_ARM64_MACRO_ASSEMBLER_ARM64_H_
6#define V8_CODEGEN_ARM64_MACRO_ASSEMBLER_ARM64_H_
8#ifndef INCLUDED_FROM_MACRO_ASSEMBLER_H
9#error This header must be included via macro-assembler.h
23#define ASM_LOCATION(message) __ Debug("LOCATION: " message, __LINE__, NO_PARAM)
24#define ASM_LOCATION_IN_ASSEMBLER(message) \
25 Debug("LOCATION: " message, __LINE__, NO_PARAM)
27#define ASM_LOCATION(message)
28#define ASM_LOCATION_IN_ASSEMBLER(message)
31#define ASM_LOCATION(message)
32#define ASM_LOCATION_IN_ASSEMBLER(message)
39class JumpTableAssembler;
42#define LS_MACRO_LIST(V) \
43 V(Ldrb, Register&, rt, LDRB_w) \
44 V(Strb, Register&, rt, STRB_w) \
45 V(Ldrsb, Register&, rt, rt.Is64Bits() ? LDRSB_x : LDRSB_w) \
46 V(Ldrh, Register&, rt, LDRH_w) \
47 V(Strh, Register&, rt, STRH_w) \
48 V(Ldrsh, Register&, rt, rt.Is64Bits() ? LDRSH_x : LDRSH_w) \
49 V(Ldr, CPURegister&, rt, LoadOpFor(rt)) \
50 V(Str, CPURegister&, rt, StoreOpFor(rt)) \
51 V(Ldrsw, Register&, rt, LDRSW_x)
53#define LSPAIR_MACRO_LIST(V) \
54 V(Ldp, CPURegister&, rt, rt2, LoadPairOpFor(rt, rt2)) \
55 V(Stp, CPURegister&, rt, rt2, StorePairOpFor(rt, rt2)) \
56 V(Ldpsw, CPURegister&, rt, rt2, LDPSW_x)
58#define LDA_STL_MACRO_LIST(V) \
69#define STLX_MACRO_LIST(V) \
74#define CAS_SINGLE_MACRO_LIST(V) \
88#define CAS_PAIR_MACRO_LIST(V) \
97#define ATOMIC_MEMORY_SIMPLE_MACRO_LIST(V, DEF, MASM_PRE, ASM_PRE) \
98 V(DEF, MASM_PRE##add, ASM_PRE##add) \
99 V(DEF, MASM_PRE##clr, ASM_PRE##clr) \
100 V(DEF, MASM_PRE##eor, ASM_PRE##eor) \
101 V(DEF, MASM_PRE##set, ASM_PRE##set) \
102 V(DEF, MASM_PRE##smax, ASM_PRE##smax) \
103 V(DEF, MASM_PRE##smin, ASM_PRE##smin) \
104 V(DEF, MASM_PRE##umax, ASM_PRE##umax) \
105 V(DEF, MASM_PRE##umin, ASM_PRE##umin)
107#define ATOMIC_MEMORY_STORE_MACRO_MODES(V, MASM, ASM) \
111 V(MASM##lb, ASM##lb) \
115#define ATOMIC_MEMORY_LOAD_MACRO_MODES(V, MASM, ASM) \
116 ATOMIC_MEMORY_STORE_MACRO_MODES(V, MASM, ASM) \
118 V(MASM##al, ASM##al) \
119 V(MASM##ab, ASM##ab) \
120 V(MASM##alb, ASM##alb) \
121 V(MASM##ah, ASM##ah) \
122 V(MASM##alh, ASM##alh)
207 using MacroAssemblerBase::MacroAssemblerBase;
210 void set_allow_macro_instructions(
bool value) {
211 allow_macro_instructions_ =
value;
213 bool allow_macro_instructions()
const {
return allow_macro_instructions_; }
219 return rmode != RelocInfo::EXTERNAL_REFERENCE;
241 DCHECK(allow_macro_instructions());
242 mov(vd, vd_index, vn, vn_index);
246 DCHECK(allow_macro_instructions());
250 DCHECK(allow_macro_instructions());
251 mov(vd, vd_index, rn);
254 DCHECK(allow_macro_instructions());
255 mov(rd, vn, vn_index);
272#define NEON_BYELEMENT_MACRO_LIST(V) \
280 V(sqdmulh, Sqdmulh) \
281 V(sqrdmulh, Sqrdmulh) \
282 V(sqdmull, Sqdmull) \
283 V(sqdmull2, Sqdmull2) \
284 V(sqdmlal, Sqdmlal) \
285 V(sqdmlal2, Sqdmlal2) \
286 V(sqdmlsl, Sqdmlsl) \
287 V(sqdmlsl2, Sqdmlsl2) \
301#define DEFINE_MACRO_ASM_FUNC(ASM, MASM) \
302 void MASM(const VRegister& vd, const VRegister& vn, const VRegister& vm, \
304 DCHECK(allow_macro_instructions()); \
305 ASM(vd, vn, vm, vm_index); \
308#undef DEFINE_MACRO_ASM_FUNC
311#define NEON_2VREG_MACRO_LIST(V) \
329 V(fmaxnmp, Fmaxnmp) \
330 V(fmaxnmv, Fmaxnmv) \
333 V(fminnmp, Fminnmp) \
334 V(fminnmv, Fminnmv) \
347 V(frsqrte, Frsqrte) \
366 V(sqxtun2, Sqxtun2) \
379 V(ursqrte, Ursqrte) \
386#define DEFINE_MACRO_ASM_FUNC(ASM, MASM) \
387 void MASM(const VRegister& vd, const VRegister& vn) { \
388 DCHECK(allow_macro_instructions()); \
392#undef DEFINE_MACRO_ASM_FUNC
393#undef NEON_2VREG_MACRO_LIST
396#define NEON_2VREG_FPIMM_MACRO_LIST(V) \
403#define DEFINE_MACRO_ASM_FUNC(ASM, MASM) \
404 void MASM(const VRegister& vd, const VRegister& vn, double imm) { \
405 DCHECK(allow_macro_instructions()); \
409#undef DEFINE_MACRO_ASM_FUNC
412#define NEON_3VREG_MACRO_LIST(V) \
436 V(fmaxnmp, Fmaxnmp) \
438 V(fminnmp, Fminnmp) \
445 V(frsqrts, Frsqrts) \
454 V(raddhn2, Raddhn2) \
456 V(rsubhn2, Rsubhn2) \
482 V(sqdmlal2, Sqdmlal2) \
483 V(sqdmlal, Sqdmlal) \
484 V(sqdmlsl2, Sqdmlsl2) \
485 V(sqdmlsl, Sqdmlsl) \
486 V(sqdmulh, Sqdmulh) \
487 V(sqdmull2, Sqdmull2) \
488 V(sqdmull, Sqdmull) \
489 V(sqrdmulh, Sqrdmulh) \
543#define DEFINE_MACRO_ASM_FUNC(ASM, MASM) \
544 void MASM(const VRegister& vd, const VRegister& vn, const VRegister& vm) { \
545 DCHECK(allow_macro_instructions()); \
549#undef DEFINE_MACRO_ASM_FUNC
553 DCHECK(allow_macro_instructions());
554 bcax(vd, vn, vm, va);
559 DCHECK(allow_macro_instructions());
560 eor3(vd, vn, vm, va);
563 void Bic(
const VRegister& vd,
const int imm8,
const int left_shift = 0) {
564 DCHECK(allow_macro_instructions());
565 bic(vd, imm8, left_shift);
569 inline void jmp(
Label* L);
583 DCHECK(allow_macro_instructions_);
587 DCHECK(allow_macro_instructions_);
610 DCHECK(allow_macro_instructions_);
611 DCHECK(!TmpList()->IncludesAliasOf(x16));
612 DCHECK(!TmpList()->IncludesAliasOf(x17));
616 DCHECK(allow_macro_instructions_);
617 DCHECK(!TmpList()->IncludesAliasOf(x16));
618 DCHECK(!TmpList()->IncludesAliasOf(x17));
646 AbortReason reason = AbortReason::kOperandIsNotASmi)
671 inline void Debug(
const char* message, uint32_t code,
Instr params =
BREAK);
730 inline void JumpTarget();
739 inline void JumpOrCallTarget();
741 inline void BindJumpOrCallTarget(
Label*
label);
752 inline void Mvn(
const Register& rd, uint64_t imm);
763 void Orr(
const VRegister& vd,
const int imm8,
const int left_shift = 0) {
764 DCHECK(allow_macro_instructions());
765 orr(vd, imm8, left_shift);
780 inline void Blr(
const Register& xn);
793 unsigned higher_limit);
795 unsigned higher_limit,
Label* on_in_range);
825 kDstLessThanSrcAndReverse
849 inline void Claim(int64_t
count, uint64_t unit_size = kXRegSize);
850 inline void Claim(
const Register&
count, uint64_t unit_size = kXRegSize,
851 bool assume_sp_aligned =
true);
852 inline void Drop(int64_t
count, uint64_t unit_size = kXRegSize);
853 inline void Drop(
const Register&
count, uint64_t unit_size = kXRegSize);
858 inline void DropArguments(
const Register&
count,
int extra_slots = 0);
859 inline void DropArguments(int64_t
count);
863 inline void DropSlots(int64_t
count);
866 inline void PushArgument(
const Register& arg);
880#define DECLARE_FUNCTION(FN, REGTYPE, REG, OP) \
881 inline void FN(const REGTYPE REG, const MemOperand& addr);
883#undef DECLARE_FUNCTION
888 Label** labels,
int num_labels);
919 template <StoreLRMode lr_mode = kDontStoreLR>
926 template <LoadLRMode lr_mode = kDontLoadLR>
933 template <StoreLRMode lr_mode = kDontStoreLR>
997 Label* condition_met);
1001 CheckPageFlag(
object,
mask,
cc, condition_met);
1008 inline void CompareTaggedAndBranch(
const Register& lhs,
const Operand& rhs,
1013 inline void TestAndBranchIfAnySet(
const Register&
reg,
1018 inline void TestAndBranchIfAllClear(
const Register&
reg,
1021 inline void Brk(
int code);
1024 Label* not_smi_label =
nullptr);
1029 inline void JumpIfUnsignedLessThan(
Register x, int32_t
y,
Label* dest);
1031 void JumpIfMarking(
Label* is_marking,
1033 void JumpIfNotMarking(
Label* not_marking,
1048 inline void Fmov(
VRegister fd,
double imm);
1049 inline void Fmov(
VRegister fd,
float imm);
1051 template <
typename T>
1053 DCHECK(allow_macro_instructions());
1054 Fmov(fd,
static_cast<double>(imm));
1059 int shift_amount = 0);
1076 return ExternalReferenceAsOperand(ExternalReference::Create(
id),
no_reg);
1097 void CallBuiltin(
Builtin builtin);
1115#ifdef V8_ENABLE_LEAPTIERING
1117 uint16_t argument_count);
1119#ifdef V8_ENABLE_WEBASSEMBLY
1120 void ResolveWasmCodePointer(
Register target, uint64_t signature_hash);
1121 void CallWasmCodePointer(
Register target, uint64_t signature_hash,
1123 void CallWasmCodePointerNoSignatureCheck(
Register target);
1137 Label* jump_deoptimization_entry_label);
1147 Label* return_location =
nullptr);
1150 int num_double_arguments,
1152 Label* return_location =
nullptr);
1154 Register function,
int num_reg_arguments,
int num_double_arguments,
1156 Label* return_location =
nullptr);
1169 DCHECK(allow_macro_instructions());
1170 fcvtzs(vd, vn, fbits);
1174 DCHECK(allow_macro_instructions());
1181 DCHECK(allow_macro_instructions());
1182 fcvtzu(vd, vn, fbits);
1217 inline void Fcmp(
const VRegister&
fn,
double value);
1260 template <StoreLRMode lr_mode = kDontStoreLR>
1268 template <LoadLRMode lr_mode = kDontLoadLR>
1283 unsigned fbits = 0);
1285 DCHECK(allow_macro_instructions());
1286 scvtf(vd, vn, fbits);
1289 unsigned fbits = 0);
1291 DCHECK(allow_macro_instructions());
1292 ucvtf(vd, vn, fbits);
1315 DCHECK(allow_macro_instructions());
1316 ins(vd, vd_index, vn, vn_index);
1319 DCHECK(allow_macro_instructions());
1320 ins(vd, vd_index, rn);
1324 inline void Br(
const Register& xn);
1331 DCHECK(allow_macro_instructions());
1335 DCHECK(allow_macro_instructions());
1339#define DECLARE_FUNCTION(FN, REGTYPE, REG, REG2, OP) \
1340 inline void FN(const REGTYPE REG, const REGTYPE REG2, const MemOperand& addr);
1342#undef DECLARE_FUNCTION
1345 DCHECK(allow_macro_instructions());
1349 DCHECK(allow_macro_instructions());
1354 DCHECK(allow_macro_instructions());
1355 st1(vt, vt2, vt3, dst);
1359 DCHECK(allow_macro_instructions());
1360 st1(vt, vt2, vt3, vt4, dst);
1363 DCHECK(allow_macro_instructions());
1367#define NEON_2VREG_SHIFT_MACRO_LIST(V) \
1376 V(sqrshrn, Sqrshrn) \
1377 V(sqrshrn2, Sqrshrn2) \
1378 V(sqrshrun, Sqrshrun) \
1379 V(sqrshrun2, Sqrshrun2) \
1383 V(sqshrn2, Sqshrn2) \
1384 V(sqshrun, Sqshrun) \
1385 V(sqshrun2, Sqshrun2) \
1393 V(uqrshrn, Uqrshrn) \
1394 V(uqrshrn2, Uqrshrn2) \
1397 V(uqshrn2, Uqshrn2) \
1405#define DEFINE_MACRO_ASM_FUNC(ASM, MASM) \
1406 void MASM(const VRegister& vd, const VRegister& vn, int shift) { \
1407 DCHECK(allow_macro_instructions()); \
1408 ASM(vd, vn, shift); \
1411#undef DEFINE_MACRO_ASM_FUNC
1414 DCHECK(allow_macro_instructions());
1415 umov(rd, vn, vn_index);
1418 DCHECK(allow_macro_instructions());
1423 DCHECK(allow_macro_instructions());
1424 tbl(vd, vn, vn2, vm);
1428 DCHECK(allow_macro_instructions());
1429 tbl(vd, vn, vn2, vn3, vm);
1433 DCHECK(allow_macro_instructions());
1434 tbl(vd, vn, vn2, vn3, vn4, vm);
1438 DCHECK(allow_macro_instructions());
1439 ext(vd, vn, vm, index);
1443 DCHECK(allow_macro_instructions());
1444 smov(rd, vn, vn_index);
1448#define DECLARE_FUNCTION(FN, OP) \
1449 inline void FN(const Register& rt, const Register& rn);
1451#undef DECLARE_FUNCTION
1453#define DECLARE_FUNCTION(FN, OP) \
1454 inline void FN(const Register& rs, const Register& rt, const MemOperand& src);
1456#undef DECLARE_FUNCTION
1458#define DECLARE_FUNCTION(FN, OP) \
1459 inline void FN(const Register& rs, const Register& rs2, const Register& rt, \
1460 const Register& rt2, const MemOperand& src);
1462#undef DECLARE_FUNCTION
1464#define DECLARE_LOAD_FUNCTION(FN, OP) \
1465 inline void FN(const Register& rs, const Register& rt, const MemOperand& src);
1466#define DECLARE_STORE_FUNCTION(FN, OP) \
1467 inline void FN(const Register& rs, const MemOperand& src);
1474#define DECLARE_SWP_FUNCTION(FN, OP) \
1475 inline void FN(const Register& rs, const Register& rt, const MemOperand& src);
1479#undef DECLARE_LOAD_FUNCTION
1480#undef DECLARE_STORE_FUNCTION
1481#undef DECLARE_SWP_FUNCTION
1488 inline void Ret(
const Register& xn = lr);
1504 static constexpr int kExtraSlotClaimedByPrologue = 1;
1509 DCHECK(allow_macro_instructions());
1513 DCHECK(allow_macro_instructions());
1517 DCHECK(allow_macro_instructions());
1521 DCHECK(allow_macro_instructions());
1525 DCHECK(allow_macro_instructions());
1539 Label* is_not_representable =
nullptr,
1540 Label* is_representable =
nullptr);
1585 StoreTaggedField(value, dst_field_operand);
1610#if V8_ENABLE_WEBASSEMBLY
1611 void StoreReturnAddressInWasmExitFrame(
Label* return_location);
1639 Register isolate_root = Register::no_reg());
1653 LoadTrustedPointerField(
destination, field_operand,
1654 kCodeIndirectPointerTag);
1658 StoreTrustedPointerField(value, dst_field_operand);
1672#ifdef V8_ENABLE_SANDBOX
1698#ifdef V8_ENABLE_LEAPTIERING
1708 void LoadEntrypointAndParameterCountFromJSDispatchTable(
1731#define DECLARE_FUNCTION(FN, OP) \
1732 inline void FN(const Register& rs, const Register& rt, const Register& rn);
1734#undef DECLARE_FUNCTION
1753 DCHECK(allow_macro_instructions());
1757 DCHECK(allow_macro_instructions());
1761 DCHECK(allow_macro_instructions());
1765 DCHECK(allow_macro_instructions());
1781 inline void Hlt(
int code);
1784 inline void Movk(
const Register& rd, uint64_t imm,
int shift = -1);
1787 const int shift_amount = 0) {
1788 DCHECK(allow_macro_instructions());
1789 mvni(vd, imm8, shift, shift_amount);
1803 DCHECK(allow_macro_instructions());
1807 DCHECK(allow_macro_instructions());
1812 DCHECK(allow_macro_instructions());
1813 ld1(vt, vt2, vt3, src);
1817 DCHECK(allow_macro_instructions());
1818 ld1(vt, vt2, vt3, vt4, src);
1821 DCHECK(allow_macro_instructions());
1825 DCHECK(allow_macro_instructions());
1829 DCHECK(allow_macro_instructions());
1834 DCHECK(allow_macro_instructions());
1835 ld2(vt, vt2, lane, src);
1838 DCHECK(allow_macro_instructions());
1843 DCHECK(allow_macro_instructions());
1844 ld3(vt, vt2, vt3, src);
1848 DCHECK(allow_macro_instructions());
1849 ld3(vt, vt2, vt3, lane, src);
1853 DCHECK(allow_macro_instructions());
1854 ld3r(vt, vt2, vt3, src);
1858 DCHECK(allow_macro_instructions());
1859 ld4(vt, vt2, vt3, vt4, src);
1863 DCHECK(allow_macro_instructions());
1864 ld4(vt, vt2, vt3, vt4, lane, src);
1868 DCHECK(allow_macro_instructions());
1869 ld4r(vt, vt2, vt3, vt4, src);
1872 DCHECK(allow_macro_instructions());
1877 DCHECK(allow_macro_instructions());
1878 st3(vt, vt2, vt3, dst);
1882 DCHECK(allow_macro_instructions());
1883 st4(vt, vt2, vt3, vt4, dst);
1887 DCHECK(allow_macro_instructions());
1888 st2(vt, vt2, lane, dst);
1892 DCHECK(allow_macro_instructions());
1893 st3(vt, vt2, vt3, lane, dst);
1897 DCHECK(allow_macro_instructions());
1898 st4(vt, vt2, vt3, vt4, lane, dst);
1901 DCHECK(allow_macro_instructions());
1906 DCHECK(allow_macro_instructions());
1907 tbx(vd, vn, vn2, vm);
1911 DCHECK(allow_macro_instructions());
1912 tbx(vd, vn, vn2, vn3, vm);
1916 DCHECK(allow_macro_instructions());
1917 tbx(vd, vn, vn2, vn3, vn4, vm);
1969 int stack_slot_size = kDoubleSize) {
1977 int stack_slot_size = kDoubleSize) {
2022 inline void AssertFeedbackVector(
Register object);
2028#ifndef V8_ENABLE_LEAPTIERING
2033 Label* flags_need_processing);
2040 template <
typename Field>
2042 static const int shift = Field::kShift;
2043 static const int setbits =
CountSetBits(Field::kMask, 32);
2044 Ubfx(dst, src, shift, setbits);
2047 template <
typename Field>
2049 DecodeField<Field>(
reg,
reg);
2053 Label* if_marked_for_deoptimization);
2055 Label* if_marked_for_deoptimization);
2107 CallRuntime(Runtime::FunctionForId(fid), num_arguments);
2120 bool builtin_exit_frame =
false);
2135 Register expected_parameter_count_or_dispatch_handle,
2143#ifdef V8_ENABLE_LEAPTIERING
2197#if V8_STATIC_ROOTS_BOOL
2200 void IsObjectTypeFast(
Register heap_object,
Register compressed_map_scratch,
2202 void CompareInstanceTypeWithUniqueCompressedMap(
Register map,
2220 void JumpIfJSAnyIsNotPrimitive(
2227 return JumpIfJSAnyIsNotPrimitive(heap_object, scratch, target, distance,
2228 Condition::kUnsignedLessThan);
2262 unsigned higher_limit,
Label* on_in_range);
2312 if (!
v8_flags.native_code_counters)
return;
2313 EmitIncrementCounter(counter, value, scratch1, scratch2);
2319 if (!
v8_flags.native_code_counters)
return;
2320 EmitIncrementCounter(counter, -value, scratch1, scratch2);
2400 bool allow_macro_instructions_ =
true;
2415 template <ImmBranchType branch_type>
2421 bool need_longer_range =
false;
2427 if (
label->is_bound() ||
label->is_linked()) {
2428 need_longer_range = !Instruction::IsValidImmPCOffset(
2431 if (!need_longer_range && !
label->is_bound()) {
2432 int max_reachable_pc =
2433 pc_offset() + Instruction::ImmBranchRange(branch_type);
2440 unresolved_branches_.insert(
2441 std::pair<int, Label*>(max_reachable_pc + branch_type_tag,
label));
2443 next_veneer_pool_check_ =
2444 std::min(next_veneer_pool_check_,
2445 max_reachable_pc - kVeneerDistanceCheckMargin);
2447 return need_longer_range;
2462 static int64_t CalculateTargetOffset(Address target,
RelocInfo::Mode rmode,
2487 masm_->StartBlockVeneerPool();
2492 previous_allow_macro_instructions_ =
masm_->allow_macro_instructions();
2493 masm_->set_allow_macro_instructions(
false);
2498 masm_->EndBlockVeneerPool();
2503 masm_->set_allow_macro_instructions(previous_allow_macro_instructions_);
2513 bool previous_allow_macro_instructions_;
2530 availablefp_(masm->FPTmpList()),
2532 old_availablefp_(availablefp_->bits()) {
2534 DCHECK_EQ(availablefp_->type(), CPURegister::kVRegister);
2539 availablefp_->set_bits(old_availablefp_);
2550 return VRegister::Create(AcquireNextAvailable(availablefp_).
code(), format);
2558 return Register::Create(code,
reg.SizeInBits());
2562 int code = AcquireNextAvailable(availablefp_).
code();
2563 return VRegister::Create(code,
reg.SizeInBits());
2583 DCHECK(availablefp_->IncludesAliasOf(
reg));
2586 availablefp_->Remove(list);
2607 CHECK(!available->IsEmpty());
2629 std::optional<UseScratchRegisterScope>
temps;
2649 int slots_to_drop_on_return,
2656#define ACCESS_MASM(masm) masm->
CPURegister PopHighestIndex()
InstructionAccurateScope(MacroAssembler *masm, size_t count=0)
~InstructionAccurateScope()
MacroAssembler::BlockConstPoolScope block_pool_
void JumpIfJSAnyIsPrimitive(Register heap_object, Register scratch, Label *target, Label::Distance distance=Label::kFar)
ATOMIC_MEMORY_SIMPLE_MACRO_LIST(ATOMIC_MEMORY_LOAD_MACRO_MODES, DECLARE_LOAD_FUNCTION, Ld, ld) ATOMIC_MEMORY_SIMPLE_MACRO_LIST(ATOMIC_MEMORY_STORE_MACRO_MODES
void Ucvtf(const VRegister &vd, const VRegister &vn, int fbits=0)
bool NeedExtraInstructionsOrRegisterBranch(Label *label)
void Abort(AbortReason reason)
void PushAll(RegList registers)
void PushXRegList(RegList regs)
void LoadStackLimit(Register destination, StackLimitKind kind)
void St4(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const VRegister &vt4, const MemOperand &dst)
void InitializeRootRegister()
void Stnp(const CPURegister &rt, const CPURegister &rt2, const MemOperand &dst)
void CallJSFunction(Register function_object, uint16_t argument_count)
void AddSubWithCarryMacro(const Register &rd, const Register &rn, const Operand &operand, FlagsUpdate S, AddSubWithCarryOp op)
void PopXRegList(RegList regs)
void Tbx(const VRegister &vd, const VRegister &vn, const VRegister &vm)
void DecompressTagged(const Register &destination, const Register &source)
void St1(const VRegister &vt, const MemOperand &dst)
void CallBuiltinByIndex(Register builtin, Register target)
int CallCFunction(ExternalReference function, int num_reg_arguments, int num_double_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void AssertMap(Register object) NOOP_UNLESS_DEBUG_CODE
void DecodeField(Register reg)
void JumpIfIsInRange(Register value, Register scratch, unsigned lower_limit, unsigned higher_limit, Label *on_in_range)
void AddSubMacro(const Register &rd, const Register &rn, const Operand &operand, FlagsUpdate S, AddSubOp op)
int CallCFunction(Register function, int num_reg_arguments, int num_double_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
int PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion=no_reg)
void Cmge(const VRegister &vd, const VRegister &vn, int imm)
void DecompressTaggedSigned(const Register &destination, const MemOperand &field_operand)
void St3(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const MemOperand &dst)
void CompareInstanceType(Register map, Register type_reg, InstanceType type)
void CallRuntime(Runtime::FunctionId fid)
void Push(const CPURegister &src0, const CPURegister &src1, const CPURegister &src2, const CPURegister &src3, const CPURegister &src4, const CPURegister &src5=NoReg, const CPURegister &src6=NoReg, const CPURegister &src7=NoReg)
void IsObjectType(Register heap_object, Register scratch1, Register scratch2, InstanceType type)
void DecodeField(Register dst, Register src)
void AssertFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void PushSizeRegList(RegList registers, unsigned reg_size)
void SlotAddress(Register dst, int slot_offset)
void AssertNotSmi(Register object, AbortReason reason=AbortReason::kOperandIsASmi) NOOP_UNLESS_DEBUG_CODE
void Ext(const VRegister &vd, const VRegister &vn, const VRegister &vm, int index)
void LoadExternalPointerField(Register destination, MemOperand field_operand, ExternalPointerTagRange tag_range, Register isolate_root=Register::no_reg())
void AssertGeneratorObject(Register object) NOOP_UNLESS_DEBUG_CODE
void PushMultipleTimes(CPURegister src, Register count)
void Ld2(const VRegister &vt, const VRegister &vt2, const MemOperand &src)
void Bic(const VRegister &vd, const int imm8, const int left_shift=0)
void I64x2BitMask(Register dst, VRegister src)
static CPURegList DefaultTmpList()
void AssertPositiveOrZero(Register value) NOOP_UNLESS_DEBUG_CODE
void LoadStoreMacroComplex(const CPURegister &rt, const MemOperand &addr, LoadStoreOp op)
void Tbx(const VRegister &vd, const VRegister &vn, const VRegister &vn2, const VRegister &vm)
void LoadEntryFromBuiltin(Builtin builtin, Register destination)
void Pop(const CPURegister &dst0, const CPURegister &dst1, const CPURegister &dst2, const CPURegister &dst3, const CPURegister &dst4, const CPURegister &dst5=NoReg, const CPURegister &dst6=NoReg, const CPURegister &dst7=NoReg)
void St1(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const VRegister &vt4, const MemOperand &dst)
void Tbl(const VRegister &vd, const VRegister &vn, const VRegister &vn2, const VRegister &vn3, const VRegister &vn4, const VRegister &vm)
void Move(Register dst, Register src)
void Tbx(const VRegister &vd, const VRegister &vn, const VRegister &vn2, const VRegister &vn3, const VRegister &vn4, const VRegister &vm)
void CompareObjectType(Register heap_object, Register map, Register type_reg, InstanceType type)
void Bcax(const VRegister &vd, const VRegister &vn, const VRegister &vm, const VRegister &va)
void CanonicalizeNaN(const VRegister ®)
void I32x4BitMask(Register dst, VRegister src)
void Assert(Condition cond, AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void AtomicDecompressTaggedSigned(const Register &destination, const Register &base, const Register &index, const Register &temp)
void StoreReturnAddressAndCall(Register target)
void PopSRegList(DoubleRegList regs)
void CopyDoubleWords(Register dst, Register src, Register count, CopyDoubleWordsMode mode=kDstLessThanSrc)
void Tbl(const VRegister &vd, const VRegister &vn, const VRegister &vn2, const VRegister &vn3, const VRegister &vm)
void AssertFeedbackVector(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void LoadRootRelative(Register destination, int32_t offset) final
void Smov(const Register &rd, const VRegister &vn, int vn_index)
void PopHelper(int count, int size, const CPURegister &dst0, const CPURegister &dst1, const CPURegister &dst2, const CPURegister &dst3)
void Ldnp(const CPURegister &rt, const CPURegister &rt2, const MemOperand &src)
void JumpIfObjectType(Register object, Register map, Register type_reg, InstanceType type, Label *if_cond_pass, Condition cond=eq)
void CheckPageFlag(const Register &object, int mask, Condition cc, Label *condition_met)
void LoadSandboxedPointerField(Register destination, MemOperand field_operand)
void AssertUnreachable(AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void Ld3r(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const MemOperand &src)
void LoadRootRegisterOffset(Register destination, intptr_t offset) final
void PushCalleeSavedRegisters()
void Swap(Register lhs, Register rhs)
void PopAll(DoubleRegList registers, int stack_slot_size=kDoubleSize)
void Movi32bitHelper(const VRegister &vd, uint64_t imm)
void St1(const VRegister &vt, int lane, const MemOperand &dst)
void RecordWrite(Register object, Operand offset, Register value, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline, ReadOnlyCheck ro_check=ReadOnlyCheck::kInline, SlotDescriptor slot=SlotDescriptor::ForDirectPointerSlot())
void B(Label *label, BranchType type, Register reg=NoReg, int bit=-1)
void AtomicDecompressTagged(const Register &destination, const Register &base, const Register &index, const Register &temp)
void Dup(const VRegister &vd, const Register &rn)
void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(Register flags, Register feedback_vector, CodeKind current_code_kind, Label *flags_need_processing)
void Ld4(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const VRegister &vt4, int lane, const MemOperand &src)
void CallPrintf(int arg_count=0, const CPURegister *args=nullptr)
void St2(const VRegister &vt, const VRegister &vt2, int lane, const MemOperand &dst)
void LoadFeedbackVector(Register dst, Register closure, Register scratch, Label *fbv_undef)
void Ins(const VRegister &vd, int vd_index, const Register &rn)
void EmitIncrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void AssertCode(Register object) NOOP_UNLESS_DEBUG_CODE
void TryConvertDoubleToInt64(Register result, DoubleRegister input, Label *done)
void LoadMap(Register dst, Register object)
void Movi(const VRegister &vd, uint64_t hi, uint64_t lo)
void Fcvtzs(const VRegister &vd, const VRegister &vn, int fbits=0)
void Orr(const VRegister &vd, const int imm8, const int left_shift=0)
void Tbz(const Register &rt, unsigned bit_pos, Label *label)
void Scvtf(const VRegister &vd, const VRegister &vn, int fbits=0)
void Fcvtzu(const VRegister &vd, const VRegister &vn, int fbits=0)
void InvokeFunctionCode(Register function, Register new_target, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void PopcntHelper(Register dst, Register src)
void IndirectCall(Address target, RelocInfo::Mode rmode)
void BailoutIfDeoptimized()
void DecodeSandboxedPointer(Register value)
void Jump(const ExternalReference &reference)
void Ld4r(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const VRegister &vt4, const MemOperand &src)
MemOperand ExternalReferenceAsOperand(IsolateFieldId id)
void LoadCodeInstructionStart(Register destination, Register code_object, CodeEntrypointTag tag)
bool CanUseNearCallOrJump(RelocInfo::Mode rmode)
void InvokePrologue(Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void StoreTaggedField(const MemOperand &dst_field_operand, const Register &value)
int CallCFunction(ExternalReference function, int num_reg_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void Call(Handle< Code > code, RelocInfo::Mode rmode=RelocInfo::CODE_TARGET)
void SbxCheck(Condition cc, AbortReason reason)
void Mov(const VRegister &vd, const VRegister &vn, int index)
void PopQRegList(DoubleRegList regs)
void PushAll(DoubleRegList registers, int stack_slot_size=kDoubleSize)
void PushWRegList(RegList regs)
void Cmeq(const VRegister &vd, const VRegister &vn, int imm)
void Fjcvtzs(const Register &rd, const VRegister &vn)
void Mov(const Register &rd, ExternalReference reference)
void Ld1(const VRegister &vt, const VRegister &vt2, const MemOperand &src)
void Mvn(const Register &rd, const Operand &operand)
void Ins(const VRegister &vd, int vd_index, const VRegister &vn, int vn_index)
void JumpIfCodeIsTurbofanned(Register code, Register scratch, Label *if_marked_for_deoptimization)
void Tbx(const VRegister &vd, const VRegister &vn, const VRegister &vn2, const VRegister &vn3, const VRegister &vm)
MemOperand ExternalReferenceAsOperand(ExternalReference reference, Register scratch)
void IncrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void Ld4(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const VRegister &vt4, const MemOperand &src)
void AssertSmi(Register object, AbortReason reason=AbortReason::kOperandIsNotASmi) NOOP_UNLESS_DEBUG_CODE
void EnterExitFrame(const Register &scratch, int extra_space, StackFrame::Type frame_type)
void St3(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, int lane, const MemOperand &dst)
void Mov(const Register &rd, const Operand &operand, DiscardMoveMode discard_mode=kDontDiscardForSameWReg)
void LoadIndirectPointerField(Register destination, MemOperand field_operand, IndirectPointerTag tag)
void JumpIfEqual(Register x, int32_t y, Label *dest)
void LeaveFrame(StackFrame::Type type)
void CompareRoot(const Register &obj, RootIndex index, ComparisonMode mode=ComparisonMode::kDefault)
void LoadGlobalProxy(Register dst)
int PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion=no_reg)
void PopSizeRegList(DoubleRegList registers, unsigned reg_size)
static bool IsImmMovz(uint64_t imm, unsigned reg_size)
void JumpToExternalReference(const ExternalReference &builtin, bool builtin_exit_frame=false)
Operand ClearedValue() const
void StoreCodePointerField(Register value, MemOperand dst_field_operand)
void IsObjectTypeInRange(Register heap_object, Register scratch, InstanceType lower_limit, InstanceType higher_limit)
void Mov(const Register &rd, const VRegister &vn, int vn_index)
void Fcvtn2(const VRegister &vd, const VRegister &vn)
void Umov(const Register &rd, const VRegister &vn, int vn_index)
void InvokeFunctionWithNewTarget(Register function, Register new_target, Register actual_parameter_count, InvokeType type)
void Ld2(const VRegister &vt, const VRegister &vt2, int lane, const MemOperand &src)
void Jump(Register target, Condition cond=al)
void BindExceptionHandler(Label *label)
void PushSRegList(DoubleRegList regs)
void LoadRoot(Register destination, RootIndex index) final
void DecompressProtected(const Register &destination, const MemOperand &field_operand)
void PushRoot(RootIndex index)
void CheckPageFlag(const Register &object, Register scratch, int mask, Condition cc, Label *condition_met)
void StoreTaggedField(const Register &value, const MemOperand &dst_field_operand)
void InvokeFunction(Register function, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void Ld1(const VRegister &vt, int lane, const MemOperand &src)
static bool IsImmMovn(uint64_t imm, unsigned reg_size)
void CanonicalizeNaN(const VRegister &dst, const VRegister &src)
void Csel(const Register &rd, const Register &rn, const Operand &operand, Condition cond)
void LoadTaggedField(const Register &destination, const MemOperand &field_operand)
void CompareRange(Register value, Register scratch, unsigned lower_limit, unsigned higher_limit)
void DecrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void St1(const VRegister &vt, const VRegister &vt2, const MemOperand &dst)
void Ld3(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, int lane, const MemOperand &src)
void Swap(VRegister lhs, VRegister rhs)
int ActivationFrameAlignment()
void LoadFromConstantsTable(Register destination, int constant_index) final
void Ld1(const VRegister &vt, const MemOperand &src)
MemOperand EntryFromBuiltinAsOperand(Builtin builtin)
void LogicalMacro(const Register &rd, const Register &rn, const Operand &operand, LogicalOp op)
void I64x2AllTrue(Register dst, VRegister src)
void PokePair(const CPURegister &src1, const CPURegister &src2, int offset)
void LeaveExitFrame(const Register &scratch, const Register &scratch2)
void MaybeSaveRegisters(RegList registers)
void LoadStorePairMacro(const CPURegister &rt, const CPURegister &rt2, const MemOperand &addr, LoadStorePairOp op)
void AssertZeroExtended(Register int32_register) NOOP_UNLESS_DEBUG_CODE
void Tbnz(const Register &rt, unsigned bit_pos, Label *label)
void LoadTaggedRoot(Register destination, RootIndex index)
void PushCPURegList(CPURegList registers)
void Cmgt(const VRegister &vd, const VRegister &vn, int imm)
DISALLOW_IMPLICIT_CONSTRUCTORS(MacroAssembler)
void PopSizeRegList(RegList registers, unsigned reg_size)
void Movi(const VRegister &vd, uint64_t imm, Shift shift=LSL, int shift_amount=0)
void I16x8BitMask(Register dst, VRegister src)
void Printf(const char *format, CPURegister arg0=NoCPUReg, CPURegister arg1=NoCPUReg, CPURegister arg2=NoCPUReg, CPURegister arg3=NoCPUReg)
void JumpIfNotSmi(Register value, Label *not_smi_label)
void StoreIndirectPointerField(Register value, MemOperand dst_field_operand)
void SmiToInt32(Register smi)
void MovePair(Register dst0, Register src0, Register dst1, Register src1)
void JumpJSFunction(Register function_object, JumpMode jump_mode=JumpMode::kJump)
void PrintfNoPreserve(const char *format, const CPURegister &arg0=NoCPUReg, const CPURegister &arg1=NoCPUReg, const CPURegister &arg2=NoCPUReg, const CPURegister &arg3=NoCPUReg)
void Move(Register dst, Tagged< Smi > src)
void LoadStoreMacro(const CPURegister &rt, const MemOperand &addr, LoadStoreOp op)
void Dup(const VRegister &vd, const VRegister &vn, int index)
void PopWRegList(RegList regs)
void MoveObjectAndSlot(Register dst_object, Register dst_slot, Register object, Operand offset)
void AssertConstructor(Register object) NOOP_UNLESS_DEBUG_CODE
void Fmov(VRegister fd, T imm)
Condition LoadFeedbackVectorFlagsAndCheckIfNeedsProcessing(Register flags, Register feedback_vector, CodeKind current_code_kind)
void Call(ExternalReference target)
void CallRuntime(const Runtime::Function *f, int num_arguments)
void Tbl(const VRegister &vd, const VRegister &vn, const VRegister &vm)
void LoadWeakValue(Register out, Register in, Label *target_if_cleared)
void Fcvtxn(const VRegister &vd, const VRegister &vn)
void EnterFrame(StackFrame::Type type, bool load_constant_pool_pointer_reg)
void PopCPURegList(CPURegList registers)
void CompareInstanceTypeRange(Register map, Register type_reg, InstanceType lower_limit, InstanceType higher_limit)
void PeekPair(const CPURegister &dst1, const CPURegister &dst2, int offset)
void GenerateTailCallToReturnedCode(Runtime::FunctionId function_id)
void RecordWriteField(Register object, int offset, Register value, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline, ReadOnlyCheck ro_check=ReadOnlyCheck::kInline, SlotDescriptor slot=SlotDescriptor::ForDirectPointerSlot())
Operand ReceiverOperand()
void LoadCodePointerField(Register destination, MemOperand field_operand)
void AssertJSAny(Register object, Register map_tmp, Register tmp, AbortReason abort_reason) NOOP_UNLESS_DEBUG_CODE
void Ld2r(const VRegister &vt, const VRegister &vt2, const MemOperand &src)
void CallEphemeronKeyBarrier(Register object, Operand offset, SaveFPRegsMode fp_mode)
void Check(Condition cond, AbortReason reason)
void JumpIfRoot(const Register &obj, RootIndex index, Label *if_equal)
void AssertFeedbackCell(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void CallForDeoptimization(Builtin target, int deopt_id, Label *exit, DeoptimizeKind kind, Label *ret, Label *jump_deoptimization_entry_label)
void StoreSandboxedPointerField(Register value, MemOperand dst_field_operand)
void JumpIfCodeIsMarkedForDeoptimization(Register code, Register scratch, Label *if_marked_for_deoptimization)
void SlotAddress(Register dst, Register slot_offset)
void Move(Register dst, MemOperand src)
static bool IsNearCallOffset(int64_t offset)
void TruncateDoubleToI(Isolate *isolate, Zone *zone, Register result, DoubleRegister double_input, StubCallMode stub_mode, LinkRegisterStatus lr_status)
void ReplaceClosureCodeWithOptimizedCode(Register optimized_code, Register closure)
void Adr(const Register &rd, Label *label, AdrHint=kAdrNear)
void JumpIfLessThan(Register x, int32_t y, Label *dest)
void AssertBoundFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void ComputeCodeStartAddress(const Register &rd)
void Mov(const VRegister &vd, int vd_index, const Register &rn)
void CallRecordWriteStubSaveRegisters(Register object, Operand offset, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void Cmlt(const VRegister &vd, const VRegister &vn, int imm)
void I8x16BitMask(Register dst, VRegister src, VRegister temp=NoVReg)
Operand MoveImmediateForShiftedOp(const Register &dst, int64_t imm, PreShiftImmMode mode)
void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags, Register feedback_vector)
void StackOverflowCheck(Register num_args, Label *stack_overflow)
void LoadElementsKindFromMap(Register result, Register map)
void Mov(const Register &rd, uint64_t imm)
void ConditionalCompareMacro(const Register &rn, const Operand &operand, StatusFlags nzcv, Condition cond, ConditionalCompareOp op)
void Tbl(const VRegister &vd, const VRegister &vn, const VRegister &vn2, const VRegister &vm)
void Cbnz(const Register &rt, Label *label)
void MaybeRestoreRegisters(RegList registers)
void CallRecordWriteStub(Register object, Register slot_address, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void Fcvtxn2(const VRegister &vd, const VRegister &vn)
void CallDebugOnFunctionCall(Register fun, Register new_target, Register expected_parameter_count_or_dispatch_handle, Register actual_parameter_count)
void Cbz(const Register &rt, Label *label)
void Call(Register target)
void PopCalleeSavedRegisters()
void St1(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const MemOperand &dst)
void TryLoadOptimizedOsrCode(Register scratch_and_result, CodeKind min_opt_level, Register feedback_vector, FeedbackSlot slot, Label *on_result, Label::Distance distance)
void Jump(Address target, RelocInfo::Mode rmode, Condition cond=al)
void AssertUndefinedOrAllocationSite(Register object) NOOP_UNLESS_DEBUG_CODE
void Ld3(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const MemOperand &src)
void JumpIfIsInRange(const Register &value, unsigned lower_limit, unsigned higher_limit, Label *on_in_range)
void Abs(const Register &rd, const Register &rm, Label *is_not_representable=nullptr, Label *is_representable=nullptr)
void AssertSpAligned() NOOP_UNLESS_DEBUG_CODE
void Jump(Handle< Code > code, RelocInfo::Mode rmode, Condition cond=al)
void Mov(const VRegister &vd, int vd_index, const VRegister &vn, int vn_index)
void Movi16bitHelper(const VRegister &vd, uint64_t imm)
bool TryOneInstrMoveImmediate(const Register &dst, int64_t imm)
void Ld1(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const VRegister &vt4, const MemOperand &src)
void StoreTwoTaggedFields(const Register &value, const MemOperand &dst_field_operand)
void CompareTaggedRoot(const Register &with, RootIndex index)
void PopDRegList(DoubleRegList regs)
void LoadEntryFromBuiltinIndex(Register builtin, Register target)
int RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode, Register exclusion) const
void St2(const VRegister &vt, const VRegister &vt2, const MemOperand &dst)
void SmiUntagField(Register dst, const MemOperand &src)
void PopAll(RegList registers)
void Movi64bitHelper(const VRegister &vd, uint64_t imm)
void DecompressTagged(const Register &destination, Tagged_t immediate)
void DecompressTagged(const Register &destination, const MemOperand &field_operand)
Condition CheckSmi(Register src)
void Call(Address target, RelocInfo::Mode rmode)
void JumpIf(Condition cond, Register x, int32_t y, Label *dest)
void SmiToInt32(Register dst, Register smi)
void StoreRootRelative(int32_t offset, Register value) final
void Ld1r(const VRegister &vt, const MemOperand &src)
void B(Label *label, Condition cond)
void LoadTaggedSignedField(const Register &destination, const MemOperand &field_operand)
void AtomicStoreTaggedField(const Register &value, const Register &dst_base, const Register &dst_index, const Register &temp)
void AssertFPCRState(Register fpcr=NoReg) NOOP_UNLESS_DEBUG_CODE
void TailCallRuntime(Runtime::FunctionId fid)
void PushHelper(int count, int size, const CPURegister &src0, const CPURegister &src1, const CPURegister &src2, const CPURegister &src3)
static unsigned CountSetHalfWords(uint64_t imm, unsigned reg_size)
void CallRuntime(Runtime::FunctionId fid, int num_arguments)
void JumpHelper(int64_t offset, RelocInfo::Mode rmode, Condition cond=al)
void Eor3(const VRegister &vd, const VRegister &vn, const VRegister &vm, const VRegister &va)
void PushDRegList(DoubleRegList regs)
void LoadNativeContextSlot(Register dst, int index)
void JumpIfNotRoot(const Register &obj, RootIndex index, Label *if_not_equal)
static CPURegList DefaultFPTmpList()
void LoadTaggedFieldWithoutDecompressing(const Register &destination, const MemOperand &field_operand)
void TailCallBuiltin(Builtin builtin, Condition cond=al)
void Cmle(const VRegister &vd, const VRegister &vn, int imm)
void Mov(const Register &rd, Tagged< Smi > smi)
void St4(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const VRegister &vt4, int lane, const MemOperand &dst)
void PushSizeRegList(DoubleRegList registers, unsigned reg_size)
void Switch(Register scratch, Register value, int case_value_base, Label **labels, int num_labels)
void Fcvtl2(const VRegister &vd, const VRegister &vn)
void Mvni(const VRegister &vd, const int imm8, Shift shift=LSL, const int shift_amount=0)
void AssertSmiOrHeapObjectInMainCompressionCage(Register object) NOOP_UNLESS_DEBUG_CODE
void AssertCallableFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void Ld1(const VRegister &vt, const VRegister &vt2, const VRegister &vt3, const MemOperand &src)
void PushQRegList(DoubleRegList regs)
constexpr int8_t code() const
Register AcquireSameSizeAs(const Register ®)
void ExcludeFP(const VRegister ®)
static V8_EXPORT_PRIVATE CPURegister AcquireNextAvailable(CPURegList *available)
void Include(const Register ®1, const Register ®2=NoReg)
void Exclude(const CPURegList &list)
CPURegList * AvailableFP()
uint64_t old_availablefp_
VRegister AcquireV(VectorFormat format)
void Exclude(const Register ®1, const Register ®2=NoReg)
CPURegList * availablefp_
V8_EXPORT_PRIVATE VRegister AcquireSameSizeAs(const VRegister ®)
bool CanAcquireFP() const
UseScratchRegisterScope(MacroAssembler *masm)
void Include(const CPURegList &list)
void SetAvailable(const CPURegList &list)
V8_EXPORT_PRIVATE ~UseScratchRegisterScope()
void IncludeFP(const CPURegList &list)
void ExcludeFP(const CPURegList &list)
void SetAvailableFP(const CPURegList &list)
#define NOOP_UNLESS_DEBUG_CODE
base::Vector< const DirectHandle< Object > > args
DirectHandle< Object > new_target
ZoneVector< RpoNumber > & result
#define ATOMIC_MEMORY_SIMPLE_MACRO_LIST(V, DEF, MASM_PRE, ASM_PRE)
#define STLX_MACRO_LIST(V)
#define DECLARE_FUNCTION(FN, REGTYPE, REG, OP)
#define DECLARE_SWP_FUNCTION(FN, OP)
#define CAS_SINGLE_MACRO_LIST(V)
#define DECLARE_LOAD_FUNCTION(FN, OP)
#define NEON_3VREG_MACRO_LIST(V)
#define DEFINE_MACRO_ASM_FUNC(ASM, MASM)
#define NEON_2VREG_FPIMM_MACRO_LIST(V)
#define LDA_STL_MACRO_LIST(V)
#define NEON_BYELEMENT_MACRO_LIST(V)
#define LSPAIR_MACRO_LIST(V)
#define ATOMIC_MEMORY_STORE_MACRO_MODES(V, MASM, ASM)
#define NEON_2VREG_MACRO_LIST(V)
#define DECLARE_STORE_FUNCTION(FN, OP)
#define ATOMIC_MEMORY_LOAD_MACRO_MODES(V, MASM, ASM)
#define NEON_2VREG_SHIFT_MACRO_LIST(V)
#define CAS_PAIR_MACRO_LIST(V)
RegListBase< RegisterT > registers
MaglevAssembler *const masm_
InstructionOperand destination
constexpr Register no_reg
uint32_t AddSubWithCarryOp
V8_EXPORT_PRIVATE int CountSetBits(uint64_t value, int width)
MemOperand ExitFrameCallerStackSlotOperand(int index)
uint32_t ConditionalCompareOp
constexpr int kWRegSizeInBits
MemOperand FieldMemOperand(Register object, int offset)
Condition NegateCondition(Condition cond)
@ kDontDiscardForSameWReg
V8_EXPORT_PRIVATE bool AreAliased(const CPURegister ®1, const CPURegister ®2, const CPURegister ®3=NoReg, const CPURegister ®4=NoReg, const CPURegister ®5=NoReg, const CPURegister ®6=NoReg, const CPURegister ®7=NoReg, const CPURegister ®8=NoReg)
BranchType InvertBranchType(BranchType type)
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr int kXRegSizeInBits
void CallApiFunctionAndReturn(MacroAssembler *masm, bool with_profiling, Register function_address, ExternalReference thunk_ref, Register thunk_arg, int slots_to_drop_on_return, MemOperand *argc_operand, MemOperand return_value_operand)
constexpr uint8_t kInstrSize
constexpr int kSRegSizeInBits
constexpr int kQRegSizeInBits
@ kBranchTypeLastCondition
@ kBranchTypeFirstUsingReg
@ kBranchTypeFirstUsingBit
@ kBranchTypeFirstCondition
MemOperand ExitFrameStackSlotOperand(int offset)
constexpr int kDRegSizeInBits
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_EXPORT_PRIVATE
std::optional< CPURegister > scratch_reg
std::optional< UseScratchRegisterScope > temps
DoubleRegList scratch_fp_regs
std::unique_ptr< ValueMirror > value