5#ifndef V8_CODEGEN_LOONG64_MACRO_ASSEMBLER_LOONG64_H_
6#define V8_CODEGEN_LOONG64_MACRO_ASSEMBLER_LOONG64_H_
8#ifndef INCLUDED_FROM_MACRO_ASSEMBLER_H
9#error This header must be included via macro-assembler.h
56#define SmiWordOffset(offset) (offset + kSystemPointerSize / 2)
65 using MacroAssemblerBase::MacroAssemblerBase;
79 if (bytes == 0)
return;
90#ifdef V8_COMPRESS_POINTERS
92 IsolateData::cage_base_offset());
127 bool need_link =
false);
129 bool need_link =
false);
131 bool need_sign_extend =
true);
134 const Operand& r2,
bool need_link =
false);
139 CompareF(cmp1, cmp2,
cc, cd,
true);
144 CompareIsNanF(cmp1, cmp2, cd,
true);
149 CompareF(cmp1, cmp2,
cc, cd,
false);
154 CompareIsNanF(cmp1, cmp2, cd,
false);
163 static int InstrCountForLi64Bit(int64_t value);
171 li(rd,
Operand(
static_cast<int64_t
>(j)), mode);
193 return ExternalReferenceAsOperand(ExternalReference::Create(
id),
no_reg);
197 Ld_d(output, operand);
205 Condition cond = al, Register rj = zero_reg, \
206 const Operand &rk = Operand(zero_reg)
211 return rmode != RelocInfo::EXTERNAL_REFERENCE;
257#ifdef V8_ENABLE_LEAPTIERING
259 uint16_t argument_count);
261#ifdef V8_ENABLE_WEBASSEMBLY
262 void ResolveWasmCodePointer(
Register target, uint64_t signature_hash);
263 void CallWasmCodePointer(
Register target, uint64_t signature_hash,
265 void CallWasmCodePointerNoSignatureCheck(
Register target);
279 Label* jump_deoptimization_entry_label);
380 Register exclusion3 = no_reg)
const;
422#define DEFINE_INSTRUCTION(instr) \
423 void instr(Register rd, Register rj, const Operand& rk); \
424 void instr(Register rd, Register rj, Register rk) { \
425 instr(rd, rj, Operand(rk)); \
427 void instr(Register rj, Register rk, int32_t j) { instr(rj, rk, Operand(j)); }
429#define DEFINE_INSTRUCTION2(instr) \
430 void instr(Register rj, const Operand& rk); \
431 void instr(Register rj, Register rk) { instr(rj, Operand(rk)); } \
432 void instr(Register rj, int32_t j) { instr(rj, Operand(j)); }
479#undef DEFINE_INSTRUCTION
480#undef DEFINE_INSTRUCTION2
481#undef DEFINE_INSTRUCTION3
486 slli_d(dst, src, 32);
489 add_w(dst, src, src);
533 int num_double_arguments);
555 Label* return_location =
nullptr);
557 Register function,
int num_arguments,
559 Label* return_location =
nullptr);
562 int num_double_arguments,
564 Label* return_location =
nullptr);
566 Register function,
int num_reg_arguments,
int num_double_arguments,
568 Label* return_location =
nullptr);
577 Label* condition_met);
604 bool sign_extend =
false);
677 movfr2gr_s(dst_low, src);
697 Move(dst, base::bit_cast<uint32_t>(imm));
700 Move(dst, base::bit_cast<uint64_t>(imm));
721 static const int kSwitchTablePrologueSize = 5;
725 template <
typename Func>
726 void GenerateSwitchTable(
Register index,
size_t case_count,
727 Func GetLabelFunction);
896 LoadTrustedPointerField(
destination, field_operand,
897 kCodeIndirectPointerTag);
901 StoreTrustedPointerField(value, dst_field_operand);
915#ifdef V8_ENABLE_SANDBOX
940#ifdef V8_ENABLE_LEAPTIERING
950 void LoadEntrypointAndParameterCountFromJSDispatchTable(
984 LoadRoot(scratch, index);
997 Branch(if_equal,
eq, with, index);
1002 Branch(if_not_equal,
ne, with, index);
1007 void JumpIfIsInRange(
Register value,
unsigned lower_limit,
1008 unsigned higher_limit,
Label* on_in_range);
1021 return JumpIfJSAnyIsNotPrimitive(heap_object, scratch, target, distance,
1022 Condition::kUnsignedLessThan);
1079 LoadNativeContextSlot(dst, Context::GLOBAL_PROXY_INDEX);
1095 Register expected_parameter_count_or_dispatch_handle,
1103#ifdef V8_ENABLE_LEAPTIERING
1165 CallRuntime(Runtime::FunctionForId(fid), num_arguments);
1173 bool builtin_exit_frame =
false);
1184 if (!
v8_flags.native_code_counters)
return;
1185 EmitIncrementCounter(counter, value, scratch1, scratch2);
1191 if (!
v8_flags.native_code_counters)
return;
1192 EmitDecrementCounter(counter, value, scratch1, scratch2);
1253#ifndef V8_ENABLE_LEAPTIERING
1256 Label* flags_need_processing);
1261 template <
typename Field>
1263 Bstrpick_d(dst, src, Field::kShift + Field::kSize - 1, Field::kShift);
1266 template <
typename Field>
1268 DecodeField<Field>(
reg,
reg);
1276 bool has_double_zero_reg_set_ =
false;
1288 const Operand& rk,
bool need_link);
1297 int CallCFunctionHelper(
1298 Register function,
int num_reg_arguments,
int num_double_arguments,
1300 Label* return_location =
nullptr);
1312template <
typename Func>
1314 Func GetLabelFunction) {
1321 jirl(zero_reg, scratch, 0);
1322 for (
size_t index = 0; index < case_count; ++
index) {
1323 b(GetLabelFunction(index));
1334 std::optional<UseScratchRegisterScope>
temps;
1362 Register function_address,
1363 ExternalReference thunk_ref, Register thunk_arg,
1364 int slots_to_drop_on_return,
1371#define ACCESS_MASM(masm) masm->
#define Assert(condition)
interpreter::OperandScale scale
void b(int branch_offset, Condition cond=al, RelocInfo::Mode rmode=RelocInfo::NO_INFO)
void alsl_d(Register rd, Register rj, Register rk, int32_t sa2)
void jirl(Register rd, Register rj, int32_t offset)
void BlockTrampolinePoolFor(int instructions)
void pcaddi(Register rd, int32_t si20)
static constexpr int kFixedSlotCountAboveFp
void JumpIfJSAnyIsPrimitive(Register heap_object, Register scratch, Label *target, Label::Distance distance=Label::kFar)
void JumpIfRoot(Register with, RootIndex index, Label *if_equal)
void Push(Register src1, Register src2, Register src3, Register src4, Register src5)
void GenerateSwitchTable(Register index, size_t case_count, Func GetLabelFunction)
void Abort(AbortReason msg)
void Ld_b(Register rd, const MemOperand &rj)
void LoadStackLimit(Register destination, StackLimitKind kind)
void LoadReceiver(Register dest)
void Ftintrp_w_d(FPURegister fd, FPURegister fj)
void Pop(Register src1, Register src2, Register src3)
void InitializeRootRegister()
void CallJSFunction(Register function_object, uint16_t argument_count)
void LiLower32BitHelper(Register rd, Operand j)
void Round_d(FPURegister fd, FPURegister fj)
void St_w(Register rd, const MemOperand &rj)
void AddOverflow_d(Register dst, Register left, const Operand &right, Register overflow)
bool IsNear(Label *L, Condition cond, int rs_reg)
int CallCFunction(ExternalReference function, int num_reg_arguments, int num_double_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void DecodeField(Register reg)
void ExtractBits(Register dest, Register source, Register pos, int size, bool sign_extend=false)
void Ffint_d_ul(FPURegister fd, Register rj)
int CallCFunction(Register function, int num_reg_arguments, int num_double_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void MultiPush(RegList regs1, RegList regs2, RegList regs3)
void Move(FPURegister dst, float imm)
void Trunc_uw_s(FPURegister fd, FPURegister fj, FPURegister scratch)
void Ftintrm_l_d(FPURegister fd, FPURegister fj)
void Move(FPURegister dst, FPURegister src)
void CallRuntime(Runtime::FunctionId fid)
int CalculateStackPassedWords(int num_reg_arguments, int num_double_arguments)
void Round_s(FPURegister fd, FPURegister fj)
void Floor_d(FPURegister fd, FPURegister fj)
void Fst_d(FPURegister fj, const MemOperand &dst)
void EnterFrame(StackFrame::Type type)
void mov(Register rd, Register rj)
void Move(FPURegister dst, double imm)
void DecodeField(Register dst, Register src)
void AssertFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void Call(Register target, COND_ARGS)
void Float64Min(FPURegister dst, FPURegister src1, FPURegister src2, Label *out_of_line)
void AssertGeneratorObject(Register object) NOOP_UNLESS_DEBUG_CODE
void StoreReceiver(Register rec)
void CompareIsNanF64(FPURegister cmp1, FPURegister cmp2, CFRegister cd=FCC0)
void JumpIfNotRoot(Register with, RootIndex index, Label *if_not_equal)
void Sc_d(Register rd, const MemOperand &rj)
void li(Register rd, int32_t j, LiFlags mode=OPTIMIZE_SIZE)
void CompareF32(FPURegister cmp1, FPURegister cmp2, FPUCondition cc, CFRegister cd=FCC0)
void LoadEntryFromBuiltin(Builtin builtin, Register destination)
void TestCodeIsMarkedForDeoptimizationAndJump(Register code_data_container, Register scratch, Condition cond, Label *target)
void PushStandardFrame(Register function_reg)
void BranchFalseF(Label *target, CFRegister cc=FCC0)
void RecordWrite(Register object, Operand offset, Register value, RAStatus ra_status, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline, SlotDescriptor slot=SlotDescriptor::ForDirectPointerSlot())
void LoadZeroIfNotFPUCondition(Register dest, CFRegister=FCC0)
int CallCFunction(ExternalReference function, int num_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void Ffint_d_uw(FPURegister fd, Register rj)
void Move(Register dst, Register src)
void DecompressTaggedSigned(Register dst, const MemOperand &src)
void Jump(intptr_t target, RelocInfo::Mode rmode, COND_ARGS)
void CompareIsNanF(FPURegister cmp1, FPURegister cmp2, CFRegister cd, bool f32=true)
void JumpIfEqual(Register a, int32_t b, Label *dest)
void Clz_d(Register rd, Register rj)
void Ffint_s_uw(FPURegister fd, Register rj)
void Bstrpick_w(Register rk, Register rj, uint16_t msbw, uint16_t lsbw)
void Bstrins_d(Register rk, Register rj, uint16_t msbw, uint16_t lsbw)
void StoreReturnAddressAndCall(Register target)
void DecompressTagged(Register dst, Tagged_t immediate)
void Move(Register dst, Tagged< Smi > value)
void Ftintrp_l_d(FPURegister fd, FPURegister fj)
void FmoveLow(FPURegister dst, Register src_low)
void Float64Max(FPURegister dst, FPURegister src1, FPURegister src2, Label *out_of_line)
void LeaveExitFrame(Register scratch)
void AssertFeedbackVector(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void CallBuiltinByIndex(Register builtin_index, Register target)
int32_t GetOffset(Label *L, OffsetSize bits)
void LoadTrustedPointerField(Register destination, MemOperand field_operand, IndirectPointerTag tag)
void MulOverflow_w(Register dst, Register left, const Operand &right, Register overflow)
void Movz(Register rd, Register rj, Register rk)
void LoadRootRelative(Register destination, int32_t offset) final
void JumpIfSmi(Register value, Label *smi_label)
void Ld_d(Register rd, const MemOperand &rj)
void Ftintrz_ul_s(FPURegister fd, FPURegister fj, FPURegister scratch, Register result=no_reg)
static int ActivationFrameAlignment()
void Push(Handle< HeapObject > handle)
void PrepareCallCFunction(int num_reg_arguments, Register scratch)
bool BranchShortOrFallback(Label *L, Condition cond, Register rj, const Operand &rk, bool need_link)
void LoadSandboxedPointerField(Register destination, MemOperand field_operand)
void AssertUnreachable(AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void Alsl_d(Register rd, Register rj, Register rk, uint8_t sa)
void Jump(Register target, COND_ARGS)
void Ll_d(Register rd, const MemOperand &rj)
void LoadRootRegisterOffset(Register destination, intptr_t offset) final
void Ftintrz_ul_s(Register rd, FPURegister fj, FPURegister scratch, Register result=no_reg)
void Ld_bu(Register rd, const MemOperand &rj)
void AssertSmi(Register object) NOOP_UNLESS_DEBUG_CODE
void AtomicDecompressTagged(Register dst, const MemOperand &src)
bool IsDoubleZeroRegSet()
void BranchFalseShortF(Label *target, CFRegister cc=FCC0)
void SmiUntag(Register dst, Register src)
void Alsl_w(Register rd, Register rj, Register rk, uint8_t sa)
void Ftintrz_ul_d(FPURegister fd, FPURegister fj, FPURegister scratch, Register result=no_reg)
void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(Register flags, Register feedback_vector, CodeKind current_code_kind, Label *flags_need_processing)
void LoadFeedbackVector(Register dst, Register closure, Register scratch, Label *fbv_undef)
void EmitIncrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
int CallCFunction(Register function, int num_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void TailCallBuiltin(Builtin builtin)
void LoadGlobalFunctionInitialMap(Register function, Register map, Register scratch)
void Movn(Register rd, Register rj, Register rk)
void BranchTrueF(Label *target, CFRegister cc=FCC0)
void InvokeFunctionCode(Register function, Register new_target, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void BailoutIfDeoptimized()
void Fld_d(FPURegister fd, const MemOperand &src)
void Ll_w(Register rd, const MemOperand &rj)
void DecodeSandboxedPointer(Register value)
void Branch(Label *L, Condition cond, Register rj, RootIndex index, bool need_sign_extend=true)
int RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg) const
void Move_d(FPURegister dst, FPURegister src)
void Jump(const ExternalReference &reference)
void JumpIfJSAnyIsNotPrimitive(Register heap_object, Register scratch, Label *target, Label::Distance distance=Label::kFar, Condition condition=Condition::kUnsignedGreaterThanEqual)
MemOperand ExternalReferenceAsOperand(IsolateFieldId id)
void Ffint_s_ul(FPURegister fd, Register rj)
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 RoundFloat(FPURegister dst, FPURegister src, FPURoundingMode mode)
void Ftintrne_l_d(FPURegister fd, FPURegister fj)
void Push(Register src1, Register src2, Register src3)
void Call(Address target, RelocInfo::Mode rmode, COND_ARGS)
void Ld_h(Register rd, const MemOperand &rj)
void Ctz_w(Register rd, Register rj)
void Ftintrz_l_ud(FPURegister fd, FPURegister fj, FPURegister scratch)
void Move(Register dst, Handle< HeapObject > handle)
void Ffint_s_uw(FPURegister fd, FPURegister fj)
void EnterExitFrame(Register scratch, int stack_space, StackFrame::Type frame_type)
void SmiTag(Register dst, Register src)
void Clz_w(Register rd, Register rj)
void CompareWord(Condition cond, Register dst, Register lhs, const Operand &rhs)
void Fst_s(FPURegister fj, const MemOperand &dst)
MemOperand ExternalReferenceAsOperand(ExternalReference reference, Register scratch)
void CallBuiltin(Builtin builtin)
void IncrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void Move(FPURegister dst, uint64_t src)
void PushCommonFrame(Register marker_reg=no_reg)
void LoadIndirectPointerField(Register destination, MemOperand field_operand, IndirectPointerTag tag)
void Trunc_d(FPURegister fd, FPURegister fj)
void CallIndirectPointerBarrier(Register object, Operand offset, SaveFPRegsMode fp_mode, IndirectPointerTag tag)
void RoundDouble(FPURegister dst, FPURegister src, FPURoundingMode mode)
void LeaveFrame(StackFrame::Type type)
void Ftintrz_ul_d(Register rd, FPURegister fj, FPURegister scratch, Register result=no_reg)
int PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
void Ftintrz_w_d(FPURegister fd, FPURegister fj)
void Ffint_d_ul(FPURegister fd, FPURegister fj)
void JumpToExternalReference(const ExternalReference &builtin, bool builtin_exit_frame=false)
void Ftintrm_w_d(FPURegister fd, FPURegister fj)
void Float64MaxOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2)
Operand ClearedValue() const
void StackOverflowCheck(Register num_args, Register scratch1, Register scratch2, Label *stack_overflow)
void St_d(Register rd, const MemOperand &rj)
void Ceil_s(FPURegister fd, FPURegister fj)
void StoreCodePointerField(Register value, MemOperand dst_field_operand)
void Ffint_d_uw(FPURegister fd, FPURegister fj)
void ByteSwap(Register dest, Register src, int operand_size)
void Trunc_s(FPURegister fd, FPURegister fj)
void GenPCRelativeJumpAndLink(Register rd, int64_t offset)
void Sc_w(Register rd, const MemOperand &rj)
void InvokeFunctionWithNewTarget(Register function, Register new_target, Register actual_parameter_count, InvokeType type)
void li(Register rd, int64_t j, LiFlags mode=OPTIMIZE_SIZE)
void FmoveLow(Register dst_low, FPURegister src)
void BindExceptionHandler(Label *label)
void LoadTaggedField(Register destination, const MemOperand &field_operand)
void LoadRoot(Register destination, RootIndex index) final
void MultiPop(RegList regs1, RegList regs2)
void DecompressProtected(const Register &destination, const MemOperand &field_operand)
void li(Register dst, Handle< HeapObject > value, RelocInfo::Mode rmode=RelocInfo::NO_INFO, LiFlags mode=OPTIMIZE_SIZE)
void PushRoot(RootIndex index)
void Pop(Register src1, Register src2)
void PrepareCEntryArgs(int num_args)
void Float64MinOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2)
void InvokeFunction(Register function, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void RecordWriteField(Register object, int offset, Register value, RAStatus ra_status, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline, SlotDescriptor slot=SlotDescriptor::ForDirectPointerSlot())
void LoadExternalPointerField(Register destination, MemOperand field_operand, ExternalPointerTagRange tag_range, Register isolate_root=no_reg)
void Float32MinOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2)
void AtomicDecompressTaggedSigned(Register dst, const MemOperand &src)
void Ftintrz_l_d(FPURegister fd, FPURegister fj)
void Float32Min(FPURegister dst, FPURegister src1, FPURegister src2, Label *out_of_line)
void PushArray(Register array, Register size, Register scratch, Register scratch2, PushArrayOrder order=kNormal)
void DecrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void Ftintrne_w_d(FPURegister fd, FPURegister fj)
void Call(Handle< Code > code, RelocInfo::Mode rmode=RelocInfo::CODE_TARGET, COND_ARGS)
void CallCodeObject(Register code_object, CodeEntrypointTag tag)
void Bstrpick_d(Register rk, Register rj, uint16_t msbw, uint16_t lsbw)
void AtomicStoreTaggedField(Register dst, const MemOperand &src)
void EmitDecrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void LoadFromConstantsTable(Register destination, int constant_index) final
void SmiUntag(Register reg)
void LoadProtectedPointerField(Register destination, MemOperand field_operand)
MemOperand EntryFromBuiltinAsOperand(Builtin builtin)
void Trunc_uw_s(Register rd, FPURegister fj, FPURegister scratch)
void AssertNotSmi(Register object) NOOP_UNLESS_DEBUG_CODE
void PrepareCEntryFunction(const ExternalReference &ref)
void ComputeCodeStartAddress(Register dst)
void MaybeSaveRegisters(RegList registers)
void CheckPageFlag(Register object, int mask, Condition cc, Label *condition_met)
void AllocateStackSpace(int bytes)
void LoadTaggedRoot(Register destination, RootIndex index)
DISALLOW_IMPLICIT_CONSTRUCTORS(MacroAssembler)
void Jump(Handle< Code > code, RelocInfo::Mode rmode, COND_ARGS)
static int64_t CalculateTargetOffset(Address target, RelocInfo::Mode rmode, uint8_t *pc)
void JumpIfNotSmi(Register value, Label *not_smi_label)
void StoreIndirectPointerField(Register value, MemOperand dst_field_operand)
void SmiTst(Register value, Register scratch)
void SmiToInt32(Register smi)
void JumpJSFunction(Register function_object, JumpMode jump_mode=JumpMode::kJump)
Register GetRkAsRegisterHelper(const Operand &rk, Register scratch)
void DecompressTagged(Register dst, const MemOperand &src)
void MoveObjectAndSlot(Register dst_object, Register dst_slot, Register object, Operand offset)
void AssertConstructor(Register object) NOOP_UNLESS_DEBUG_CODE
void LoadCompressedMap(Register dst, Register object)
void CallRuntime(const Runtime::Function *f, int num_arguments)
void LoadWeakValue(Register out, Register in, Label *target_if_cleared)
void Ceil_d(FPURegister fd, FPURegister fj)
void EnterFrame(StackFrame::Type type, bool load_constant_pool_pointer_reg)
void GenerateTailCallToReturnedCode(Runtime::FunctionId function_id)
void LoadCodePointerField(Register destination, MemOperand field_operand)
void AssertJSAny(Register object, Register map_tmp, Register tmp, AbortReason abort_reason) NOOP_UNLESS_DEBUG_CODE
void Push(Tagged< Smi > smi)
void CallEphemeronKeyBarrier(Register object, Operand offset, SaveFPRegsMode fp_mode)
void Float32MaxOutOfLine(FPURegister dst, FPURegister src1, FPURegister src2)
void Float32Max(FPURegister dst, FPURegister src1, FPURegister src2, Label *out_of_line)
void AssertFeedbackCell(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void JumpCodeObject(Register code_object, CodeEntrypointTag tag, JumpMode jump_mode=JumpMode::kJump)
void CallForDeoptimization(Builtin target, int deopt_id, Label *exit, DeoptimizeKind kind, Label *ret, Label *jump_deoptimization_entry_label)
void Ffint_s_ul(FPURegister fd, FPURegister fj)
void StoreTrustedPointerField(Register value, MemOperand dst_field_operand)
void DropArgumentsAndPushNewReceiver(Register argc, Register receiver)
void StoreSandboxedPointerField(Register value, MemOperand dst_field_operand)
void AllocateStackSpace(Register bytes)
void LoadEntryFromBuiltinIndex(Register builtin_index, Register target)
void Branch(Label *label, Condition cond, Register r1, const Operand &r2, bool need_link=false)
void JumpIfLessThan(Register a, int32_t b, Label *dest)
void MulOverflow_d(Register dst, Register left, const Operand &right, Register overflow)
static bool IsNearCallOffset(int64_t offset)
void Move(Register output, MemOperand operand)
void LoadLabelRelative(Register dst, Label *target)
void Ctz_d(Register rd, Register rj)
void ReplaceClosureCodeWithOptimizedCode(Register optimized_code, Register closure)
void DecompressTagged(Register dst, Register src)
void Push(Register src1, Register src2, Register src3, Register src4)
void Popcnt_d(Register rd, Register rj)
void Jump(Address target, RelocInfo::Mode rmode, COND_ARGS)
void AssertBoundFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void CallRecordWriteStubSaveRegisters(Register object, Operand offset, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void SmiTag(Register reg)
void Branch(Label *label, bool need_link=false)
void Ld_hu(Register rd, const MemOperand &rj)
void LoadTaggedSignedField(Register destination, const MemOperand &field_operand)
void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags, Register feedback_vector)
void LoadIsolateField(Register dst, IsolateFieldId id)
void LoadRoot(Register destination, RootIndex index, Condition cond, Register src1, const Operand &src2)
void Ftintrz_uw_s(FPURegister fd, FPURegister fs, FPURegister scratch)
void LoadZeroIfFPUCondition(Register dest, CFRegister=FCC0)
void CompareIsNanF32(FPURegister cmp1, FPURegister cmp2, CFRegister cd=FCC0)
void Move_s(FPURegister dst, FPURegister src)
void BranchTrueShortF(Label *target, CFRegister cc=FCC0)
void MaybeRestoreRegisters(RegList registers)
void CallRecordWriteStub(Register object, Register slot_address, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void CallDebugOnFunctionCall(Register fun, Register new_target, Register expected_parameter_count_or_dispatch_handle, Register actual_parameter_count)
void Popcnt_w(Register rd, Register rj)
void PrepareCallCFunction(int num_reg_arguments, int num_double_registers, Register scratch)
void Fld_s(FPURegister fd, const MemOperand &src)
void St_b(Register rd, const MemOperand &rj)
void StoreTaggedField(Register src, const MemOperand &dst)
void MultiPop(RegList regs1, RegList regs2, RegList regs3)
int PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
void AssertUndefinedOrAllocationSite(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void Bstrins_w(Register rk, Register rj, uint16_t msbw, uint16_t lswb)
void SmiUntagField(Register dst, const MemOperand &src)
void StubPrologue(StackFrame::Type type)
void Ftintrz_uw_d(Register rd, FPURegister fj, FPURegister scratch)
void St_h(Register rd, const MemOperand &rj)
void StoreRootRelative(int32_t offset, Register value) final
void Move(FPURegister dst, uint32_t src)
void Push(Register src1, Register src2)
void LoadMap(Register destination, Register object)
void SmiUntag(Register dst, const MemOperand &src)
void CompareF64(FPURegister cmp1, FPURegister cmp2, FPUCondition cc, CFRegister cd=FCC0)
void TailCallRuntime(Runtime::FunctionId fid)
void SubOverflow_d(Register dst, Register left, const Operand &right, Register overflow)
void CallRuntime(Runtime::FunctionId fid, int num_arguments)
void Floor_s(FPURegister fd, FPURegister fj)
void LoadNativeContextSlot(Register dst, int index)
void MultiPush(RegList regs1, RegList regs2)
void CompareF(FPURegister cmp1, FPURegister cmp2, FPUCondition cc, CFRegister cd, bool f32=true)
void Ftintrz_uw_d(FPURegister fd, FPURegister fj, FPURegister scratch)
void Ld_wu(Register rd, const MemOperand &rj)
void Ftintrz_uw_s(Register rd, FPURegister fs, FPURegister scratch)
void DropArguments(Register count)
void Ld_w(Register rd, const MemOperand &rj)
void AssertCallableFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void GenPCRelativeJump(Register rd, int64_t offset)
void SmiScale(Register dst, Register src, int scale)
#define NOOP_UNLESS_DEBUG_CODE
DirectHandle< Object > new_target
ZoneVector< RpoNumber > & result
#define DEFINE_INSTRUCTION2(instr)
#define DEFINE_INSTRUCTION(instr)
RegListBase< RegisterT > registers
InstructionOperand destination
constexpr Register no_reg
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr Register kRootRegister
MemOperand ExitFrameCallerStackSlotOperand(int index)
MemOperand FieldMemOperand(Register object, int offset)
constexpr uint8_t kInstrSizeLog2
constexpr int kSystemPointerSize
constexpr bool SmiValuesAre31Bits()
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr bool SmiValuesAre32Bits()
constexpr Register kPtrComprCageBaseRegister
const intptr_t kSmiTagMask
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)
Register GetRegisterThatIsNotOneOf(Register reg1, Register reg2=no_reg, Register reg3=no_reg, Register reg4=no_reg, Register reg5=no_reg, Register reg6=no_reg)
MemOperand ExitFrameStackSlotOperand(int offset)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define V8_EXPORT_PRIVATE
DoubleRegList scratch_fpregs
std::optional< Register > scratch_reg
std::optional< DoubleRegister > scratch_fpreg
std::optional< UseScratchRegisterScope > temps