5#ifndef V8_CODEGEN_X64_MACRO_ASSEMBLER_X64_H_
6#define V8_CODEGEN_X64_MACRO_ASSEMBLER_X64_H_
8#ifndef INCLUDED_FROM_MACRO_ASSEMBLER_H
9#error This header must be included via macro-assembler.h
92 Push(
Immediate(
static_cast<uint32_t
>(index.ptr())));
119 Label* return_location =
nullptr);
121 Register function,
int num_arguments,
123 Label* return_location =
nullptr);
131 Label* condition_met,
199 uint32_t* load_pc_offset =
nullptr);
201 uint32_t* load_pc_offset =
nullptr);
204 uint32_t* load_pc_offset =
nullptr);
206 uint32_t* load_pc_offset =
nullptr);
226 cmp_tagged(src1, src2);
250#define MACRO_ASM_X64_IEXTADDPAIRWISE_LIST(V) \
251 V(I32x8ExtAddPairwiseI16x16S) \
252 V(I32x8ExtAddPairwiseI16x16U) \
253 V(I16x16ExtAddPairwiseI8x32S) \
254 V(I16x16ExtAddPairwiseI8x32U)
256#define DECLARE_IEXTADDPAIRWISE(ExtAddPairwiseOp) \
257 void ExtAddPairwiseOp(YMMRegister dst, YMMRegister src, YMMRegister scratch);
259#undef DECLARE_IEXTADDPAIRWISE
260#undef MACRO_ASM_X64_IEXTADDPAIRWISE_LIST
277#define MACRO_ASM_X64_ISPLAT_LIST(V) \
278 V(I8x32Splat, b, vmovd) \
279 V(I16x16Splat, w, vmovd) \
280 V(I32x8Splat, d, vmovd) \
281 V(I64x4Splat, q, vmovq)
283#define DECLARE_ISPLAT(name, suffix, instr_mov) \
284 void name(YMMRegister dst, Register src); \
285 void name(YMMRegister dst, Operand src);
384 JumpIf(
equal, a, b, dest);
388 JumpIf(
less, a, b, dest);
392 JumpIf(
below, a, b, dest);
398 Label** labels,
int num_labels);
416 }
else if (is_uint32(
x)) {
417 movl(dst,
Immediate(
static_cast<uint32_t
>(
x)));
418 }
else if (is_int32(
x)) {
420 movq(dst,
Immediate(
static_cast<int32_t
>(
x)));
429 Register constant = GetSmiConstant(source);
434 Move(dst, source.ptr());
438 Move(dst, source.ptr());
446 Move(dst, base::bit_cast<uint32_t>(src));
449 Move(dst, base::bit_cast<uint64_t>(src));
469 DCHECK(rmode == RelocInfo::NO_INFO || rmode > RelocInfo::LAST_GCED_ENUM);
504 Register scratch = kScratchRegister);
507 return ExternalReferenceAsOperand(ExternalReference::Create(
id),
no_reg);
539#ifdef V8_ENABLE_LEAPTIERING
541 uint16_t argument_count);
543#ifdef V8_ENABLE_WEBASSEMBLY
544 void CallWasmCodePointer(
Register target, uint64_t signature_hash,
546 void CallWasmCodePointerNoSignatureCheck(
Register target);
563 Label* jump_deoptimization_entry_label);
643#if defined(V8_TARGET_OS_WIN) || defined(V8_TARGET_OS_MACOS)
644 void AllocateStackSpace(
Register bytes_scratch);
645 void AllocateStackSpace(
int bytes);
650 if (bytes == 0)
return;
658#ifdef V8_COMPRESS_POINTERS
660 IsolateData::cage_base_offset());
681 std::memory_order order);
710 int stack_slot_size = kStackSavedSavedFPSize);
712 int stack_slot_size = kStackSavedSavedFPSize);
793 IsolateRootLocation::kInRootRegister);
808 LoadTrustedPointerField(
destination, field_operand, kCodeIndirectPointerTag,
813 StoreTrustedPointerField(dst_field_operand, value);
827#ifdef V8_ENABLE_SANDBOX
853#ifdef V8_ENABLE_LEAPTIERING
860 void LoadEntrypointAndParameterCountFromJSDispatchTable(
887 CompareRoot(with, index);
888 j(
equal, if_equal, if_equal_distance);
892 CompareRoot(with, index);
893 j(
equal, if_equal, if_equal_distance);
899 CompareRoot(with, index);
900 j(
not_equal, if_not_equal, if_not_equal_distance);
904 CompareRoot(with, index);
905 j(
not_equal, if_not_equal, if_not_equal_distance);
947#ifdef V8_ENABLE_LEAPTIERING
979 Register expected_parameter_count_or_dispatch_handle,
992 unsigned higher_limit);
994 unsigned higher_limit,
Label* on_in_range,
1004 Register scratch = kScratchRegister);
1025#if V8_STATIC_ROOTS_BOOL
1030 void CompareInstanceTypeWithUniqueCompressedMap(
Register map,
1043 return JumpIfJSAnyIsNotPrimitive(heap_object, scratch, target, distance,
1044 Condition::kUnsignedLessThan);
1052 template <
typename Field>
1054 static const int shift = Field::kShift;
1055 static const int mask = Field::kMask >> Field::kShift;
1076#ifndef V8_ENABLE_LEAPTIERING
1081 Label* flags_need_processing);
1088 OptimizeCodeOrTailCallOptimizedCodeSlot(
1132 LoadNativeContextSlot(dst, Context::GLOBAL_PROXY_INDEX);
1159 CallRuntime(Runtime::FunctionForId(fid), num_arguments);
1167 bool builtin_exit_frame =
false);
1172 if (!
v8_flags.native_code_counters)
return;
1173 EmitIncrementCounter(counter, value);
1177 if (!
v8_flags.native_code_counters)
return;
1178 EmitDecrementCounter(counter, value);
1243#ifdef V8_TARGET_OS_WIN
1246 return Operand(rsp,
offset);
1272 int slots_to_drop_on_return,
1276#define ACCESS_MASM(masm) masm->
interpreter::OperandScale scale
static constexpr int kFixedSlotCountAboveFp
void LoadTaggedSignedField(Register destination, Operand field_operand)
void JumpIfJSAnyIsPrimitive(Register heap_object, Register scratch, Label *target, Label::Distance distance=Label::kFar)
void Cvttsd2ui(Register dst, Operand src, Label *fail=nullptr)
void Move(XMMRegister dst, float src)
void PextrdPreSse41(Register dst, XMMRegister src, uint8_t imm8)
void LoadTaggedField(Register destination, Operand field_operand)
void Cvttsd2si(Register dst, XMMRegister src)
void EncodeSandboxedPointer(Register value)
void Cvttss2si(Register dst, XMMRegister src)
void Cvtqui2sd(XMMRegister dst, Register src)
void Move(Register target, Register source)
void Push(Immediate value)
void S256Not(YMMRegister dst, YMMRegister src, YMMRegister scratch)
void Cvtlui2sd(XMMRegister dst, Register src)
void Abort(AbortReason msg)
void Cvttsd2uiq(Register dst, XMMRegister src, Label *fail=nullptr)
static int ArgumentStackSlotsForCFunctionCall(int num_arguments)
void JumpIf(Condition cond, Register a, int32_t b, Label *dest)
void Move(XMMRegister dst, uint32_t src)
void InitializeRootRegister()
void PinsrdPreSse41(XMMRegister dst, Operand src2, uint8_t imm8, uint32_t *load_pc_offset=nullptr)
void Push(Tagged< TaggedIndex > index)
void IncrementCounter(StatsCounter *counter, int value)
void CallJSFunction(Register function_object, uint16_t argument_count)
void Cvttss2siq(Register dst, XMMRegister src)
void JumpIfRoot(Register with, RootIndex index, Label *if_equal, Label::Distance if_equal_distance=Label::kFar)
void Cvttsd2siq(Register dst, XMMRegister src)
void Cmp(Register dst, Handle< Object > source)
void Cvttsd2uiq(Register dst, Operand src, Label *fail=nullptr)
void Cvttss2uiq(Register dst, Operand src, Label *fail=nullptr)
void F32x8Max(YMMRegister dst, YMMRegister lhs, YMMRegister rhs, YMMRegister scratch)
void LoadAddress(Register destination, ExternalReference source)
void StoreTrustedPointerField(Operand dst_field_operand, Register value)
void PushAddress(ExternalReference source)
void IsObjectType(Register heap_object, InstanceType type, Register scratch)
void AssertMap(Register object) NOOP_UNLESS_DEBUG_CODE
void DecodeField(Register reg)
void Jump(Handle< Code > code_object, RelocInfo::Mode rmode, Condition cc)
void Popcntq(Register dst, Register src)
void AtomicStoreTaggedField(Operand dst_field_operand, Register value)
void Lzcntq(Register dst, Operand src)
int PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion=no_reg)
void Pextrq(Register dst, XMMRegister src, int8_t imm8)
void CallRuntime(Runtime::FunctionId fid)
void F32x8Qfms(YMMRegister dst, YMMRegister src1, YMMRegister src2, YMMRegister src3, YMMRegister tmp)
void EnterFrame(StackFrame::Type type)
void Cvtlsi2ss(XMMRegister dst, Operand src)
void ClobberDecompressedSmiBits(Register smi)
void Popcntl(Register dst, Operand src)
void Move(Operand dst, Tagged< Smi > source)
void JumpIfUnsignedLessThan(Register a, int32_t b, Label *dest)
void AssertFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void SmiUntagField(Register dst, Operand src)
void CallIndirectPointerBarrier(Register object, Register slot_address, SaveFPRegsMode fp_mode, IndirectPointerTag tag)
void Cvtlsi2sd(XMMRegister dst, Operand src)
void SmiUntagUnsigned(Register reg)
void AssertGeneratorObject(Register object) NOOP_UNLESS_DEBUG_CODE
void DecompressTaggedSigned(Register destination, Operand field_operand)
void LoadProtectedPointerField(Register destination, Operand field_operand)
void EmitDecrementCounter(StatsCounter *counter, int value)
void Move(Operand dst, Handle< HeapObject > source, RelocInfo::Mode rmode=RelocInfo::FULL_EMBEDDED_OBJECT)
void Cvttsd2ui(Register dst, XMMRegister src, Label *fail=nullptr)
void LoadIndirectPointerField(Register destination, Operand field_operand, IndirectPointerTag tag, Register scratch)
void I16x16ExtMul(YMMRegister dst, XMMRegister src1, XMMRegister src2, YMMRegister scratch, bool is_signed)
int CallCFunction(ExternalReference function, int num_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void Cmpeqss(XMMRegister dst, XMMRegister src)
void Lzcntl(Register dst, Operand src)
void Store(ExternalReference destination, Register source)
void StoreIndirectPointerField(Operand dst_field_operand, Register value)
void InvokeFunction(Register function, Register new_target, Register actual_parameter_count, InvokeType type)
void Call(Handle< Code > code_object, RelocInfo::Mode rmode)
void Assert(Condition cc, AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void JumpIfEqual(Register a, int32_t b, Label *dest)
void InvokeFunction(Register function, Register new_target, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void Cvtqsi2sd(XMMRegister dst, Register src)
void JumpIfNotSmi(Register src, Label *on_not_smi, Label::Distance near_jump=Label::kFar)
void Cvttsd2si(Register dst, Operand src)
void RecordWriteField(Register object, int offset, Register value, Register slot_address, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline, ReadOnlyCheck ro_check=ReadOnlyCheck::kInline, SlotDescriptor slot=SlotDescriptor::ForDirectPointerSlot())
void Jump(Address destination, RelocInfo::Mode rmode)
void DropArguments(Register count, Register scratch)
void F16x8Max(YMMRegister dst, XMMRegister lhs, XMMRegister rhs, YMMRegister scratch, YMMRegister scratch2)
void AssertFeedbackVector(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void Movq(Register dst, XMMRegister src)
void EnterExitFrame(int extra_slots, StackFrame::Type frame_type, Register c_function)
void F64x4Max(YMMRegister dst, YMMRegister lhs, YMMRegister rhs, YMMRegister scratch)
void I32x8DotI8x32I7x32AddS(YMMRegister dst, YMMRegister src1, YMMRegister src2, YMMRegister src3, YMMRegister scratch, YMMRegister splat_reg)
void LoadRootRelative(Register destination, int32_t offset) final
void JumpIfNotRoot(Register with, RootIndex index, Label *if_not_equal, Label::Distance if_not_equal_distance=Label::kFar)
void Cvttss2si(Register dst, Operand src)
void Cvtsd2ss(XMMRegister dst, Operand src)
void CmpInstanceTypeRange(Register map, Register instance_type_out, InstanceType low, InstanceType high)
void StoreCodePointerField(Operand dst_field_operand, Register value)
void CallEphemeronKeyBarrier(Register object, Register slot_address, SaveFPRegsMode fp_mode)
void StoreTaggedField(Operand dst_field_operand, Immediate immediate)
void CmpTagged(const Register &src1, const Register &src2)
void AssertUnreachable(AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void LoadCompressedMap(Register destination, Register object)
void DropArgumentsAndPushNewReceiver(Register argc, Operand receiver, Register scratch)
void LoadRootRegisterOffset(Register destination, intptr_t offset) final
void EmitIncrementCounter(StatsCounter *counter, int value)
void PopQuad(Operand dst)
void Cvtlsi2ss(XMMRegister dst, Register src)
void Cvtqui2ss(XMMRegister dst, Register src)
void AssertSmi(Register object) NOOP_UNLESS_DEBUG_CODE
void Cvtph2pd(XMMRegister dst, XMMRegister src)
void Cvtqsi2ss(XMMRegister dst, Register src)
void LoadWeakValue(Register in_out, Label *target_if_cleared)
void Check(Condition cc, AbortReason reason)
void F16x8Qfma(YMMRegister dst, XMMRegister src1, XMMRegister src2, XMMRegister src3, YMMRegister tmp, YMMRegister tmp2)
void CheckPageFlag(Register object, Register scratch, int mask, Condition cc, Label *condition_met, Label::Distance condition_met_distance=Label::kFar)
void SmiUntag(Register dst, Register src)
void CompareRoot(Register with, RootIndex index, ComparisonMode mode=ComparisonMode::kDefault)
void PushTaggedField(Operand field_operand, Register scratch)
void SmiCompare(Operand dst, Register src)
void Cmp(Register dst, Tagged< Smi > src)
void Move(Register dst, Tagged< TaggedIndex > source)
void Cmp(Operand dst, Handle< Object > source)
int CallCFunction(Register function, int num_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void AssertCode(Register object) NOOP_UNLESS_DEBUG_CODE
void TailCallBuiltin(Builtin builtin)
int PopAll(DoubleRegList registers, int stack_slot_size=kStackSavedSavedFPSize)
void Move(XMMRegister dst, uint64_t high, uint64_t low)
void Movq(XMMRegister dst, Register src)
void LoadSandboxedPointerField(Register destination, Operand field_operand)
void InvokeFunctionCode(Register function, Register new_target, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void TailCallBuiltin(Builtin builtin, Condition cc)
void Load(Register destination, ExternalReference source)
void DecodeSandboxedPointer(Register value)
void Move(Operand dst, Tagged< TaggedIndex > source)
void JumpIfNotRoot(Operand with, RootIndex index, Label *if_not_equal, Label::Distance if_not_equal_distance=Label::kFar)
void Jump(const ExternalReference &reference)
void CompareTaggedRoot(Register with, RootIndex index)
void Cvtqsi2sd(XMMRegister dst, Operand src)
void JumpIfJSAnyIsNotPrimitive(Register heap_object, Register scratch, Label *target, Label::Distance distance=Label::kFar, Condition condition=Condition::kUnsignedGreaterThanEqual)
void Cvtlui2ss(XMMRegister dst, Operand src)
void LoadCodeInstructionStart(Register destination, Register code_object, CodeEntrypointTag tag)
void Jump(Address destination, RelocInfo::Mode rmode, Condition cc)
void Cvttss2ui(Register dst, Operand src, Label *fail=nullptr)
void InvokePrologue(Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
Operand EntryFromBuiltinIndexAsOperand(Register builtin_index)
void SmiToInt32(Register reg)
void Cvtqui2sd(XMMRegister dst, Operand src)
void SbxCheck(Condition cc, AbortReason reason)
void SmiCompare(Operand dst, Tagged< Smi > src)
void ReplaceClosureCodeWithOptimizedCode(Register optimized_code, Register closure, Register scratch1, Register slot_address)
void PushArray(Register array, Register size, Register scratch, PushArrayOrder order=PushArrayOrder::kNormal)
void AssertZeroExtended(Register reg) NOOP_UNLESS_DEBUG_CODE
SmiIndex SmiToIndex(Register dst, Register src, int shift)
void Tzcntq(Register dst, Register src)
void GenerateTailCallToReturnedCode(Runtime::FunctionId function_id, JumpMode jump_mode=JumpMode::kJump)
void SmiCompare(Register dst, Tagged< Smi > src)
void SmiUntagFieldUnsigned(Register dst, Operand src)
void BailoutIfDeoptimized(Register scratch)
void SmiTag(Register dst, Register src)
void Cvtsd2ss(XMMRegister dst, XMMRegister src)
void I16x8SConvertF16x8(YMMRegister dst, XMMRegister src, YMMRegister tmp, Register scratch)
void Cvttss2uiq(Register dst, XMMRegister src, Label *fail=nullptr)
void Call(ExternalReference ext)
void CompareRange(Register value, unsigned lower_limit, unsigned higher_limit)
void StackOverflowCheck(Register num_args, Label *stack_overflow, Label::Distance stack_overflow_distance=Label::kFar)
void CallBuiltin(Builtin builtin)
void Call(Address destination, RelocInfo::Mode rmode)
int PopAll(RegList registers)
void CmpObjectType(Register heap_object, InstanceType type, Register map)
Operand EntryFromBuiltinAsOperand(Builtin builtin_index)
void Move(Register target, Operand source)
void OptimizeCodeOrTailCallOptimizedCodeSlot(Register feedback_vector, Register closure, JumpMode jump_mode)
void LeaveFrame(StackFrame::Type type)
void F64x4Qfma(YMMRegister dst, YMMRegister src1, YMMRegister src2, YMMRegister src3, YMMRegister tmp)
void LoadGlobalProxy(Register dst)
int PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion=no_reg)
void JumpIfMarking(Label *is_marking, Label::Distance condition_met_distance=Label::kFar)
void Move(Register dst, Handle< HeapObject > source, RelocInfo::Mode rmode=RelocInfo::FULL_EMBEDDED_OBJECT)
void CompareRoot(Operand with, RootIndex index)
void Move(Register dst, Address ptr, RelocInfo::Mode rmode)
void F32x8Min(YMMRegister dst, YMMRegister lhs, YMMRegister rhs, YMMRegister scratch)
void CheckFeedbackVectorFlagsAndJumpIfNeedsProcessing(Register feedback_vector, CodeKind current_code_kind, Label *flags_need_processing)
void LoadExternalPointerField(Register destination, Operand field_operand, ExternalPointerTagRange tag_range, Register scratch, IsolateRootLocation isolateRootLocation=IsolateRootLocation::kInRootRegister)
void AssertSmi(Operand object) NOOP_UNLESS_DEBUG_CODE
Operand RootAsOperand(RootIndex index)
Operand ExternalReferenceAsOperand(ExternalReference reference, Register scratch=kScratchRegister)
int PushAll(DoubleRegList registers, int stack_slot_size=kStackSavedSavedFPSize)
void LoadCodePointerField(Register destination, Operand field_operand, Register scratch)
void BindExceptionHandler(Label *label)
void DropUnderReturnAddress(int stack_elements, Register scratch=kScratchRegister)
void LoadRoot(Register destination, RootIndex index) final
void Drop(int stack_elements)
Immediate ClearedValue() const
void PushRoot(RootIndex index)
void F64x4Splat(YMMRegister dst, XMMRegister src)
void Switch(Register scrach, Register reg, int case_base_value, Label **labels, int num_labels)
void Popcntl(Register dst, Register src)
void Push(Handle< HeapObject > source)
void LoadRoot(Operand destination, RootIndex index)
void MoveNumber(Register dst, double value)
void Pinsrq(XMMRegister dst, XMMRegister src1, Register src2, uint8_t imm8, uint32_t *load_pc_offset=nullptr)
void Cvtlsi2sd(XMMRegister dst, Register src)
void CallCodeObject(Register code_object, CodeEntrypointTag tag)
void Ret(int bytes_dropped, Register scratch)
void I64x4ExtMul(YMMRegister dst, XMMRegister src1, XMMRegister src2, YMMRegister scratch, bool is_signed)
void DropArgumentsAndPushNewReceiver(Register argc, Register receiver, Register scratch)
void LoadFromConstantsTable(Register destination, int constant_index) final
void SmiUntag(Register reg)
void PushImm32(int32_t imm32)
void LoadTaggedFieldWithoutDecompressing(Register destination, Operand field_operand)
void CmpInstanceType(Register map, InstanceType type)
void SmiUntag(Register dst, Operand src)
void Popcntq(Register dst, Operand src)
void AssertNotSmi(Register object) NOOP_UNLESS_DEBUG_CODE
int PushAll(RegList registers)
void StoreSandboxedPointerField(Operand dst_field_operand, Register value)
void ComputeCodeStartAddress(Register dst)
void Move(Register dst, Tagged< Smi > source)
void AllocateStackSpace(int bytes)
void Lzcntl(Register dst, Register src)
void LoadTaggedRoot(Register destination, RootIndex index)
DISALLOW_IMPLICIT_CONSTRUCTORS(MacroAssembler)
void MovePair(Register dst0, Register src0, Register dst1, Register src1)
void JumpJSFunction(Register function_object, JumpMode jump_mode=JumpMode::kJump)
void Tzcntl(Register dst, Operand src)
void JumpIfNotMarking(Label *not_marking, Label::Distance condition_met_distance=Label::kFar)
Condition CheckSmi(Operand src)
void Move(Register dst, ExternalReference ext)
void I32x8ExtMul(YMMRegister dst, XMMRegister src1, XMMRegister src2, YMMRegister scratch, bool is_signed)
void AssertConstructor(Register object) NOOP_UNLESS_DEBUG_CODE
void CheckStackAlignment()
void CheckMarkBit(Register object, Register scratch0, Register scratch1, Condition cc, Label *condition_met, Label::Distance condition_met_distance=Label::kFar)
void PinsrdPreSse41(XMMRegister dst, Register src2, uint8_t imm8, uint32_t *load_pc_offset=nullptr)
void StoreTaggedField(Operand dst_field_operand, Register value)
void JumpIfRoot(Operand with, RootIndex index, Label *if_equal, Label::Distance if_equal_distance=Label::kFar)
void CallRuntime(const Runtime::Function *f, int num_arguments)
void I16x8TruncF16x8U(YMMRegister dst, XMMRegister src, YMMRegister tmp)
void PushQuad(Operand src)
void JumpIfIsInRange(Register value, unsigned lower_limit, unsigned higher_limit, Label *on_in_range, Label::Distance near_jump=Label::kFar)
void EnterFrame(StackFrame::Type type, bool load_constant_pool_pointer_reg)
void RecordWrite(Register object, Register slot_address, Register value, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline, ReadOnlyCheck ro_check=ReadOnlyCheck::kInline, SlotDescriptor slot=SlotDescriptor::ForDirectPointerSlot())
void Move(Register dst, intptr_t x)
void Cvtlui2ss(XMMRegister dst, Register src)
void Cvttss2siq(Register dst, Operand src)
void DecrementCounter(StatsCounter *counter, int value)
void Push(Tagged< Smi > smi)
void Cmp(Register dst, int32_t src)
void I32x8SConvertF32x8(YMMRegister dst, YMMRegister src, YMMRegister tmp, Register scratch)
Operand StackLimitAsOperand(StackLimitKind kind)
void Cvtpd2ph(XMMRegister dst, XMMRegister src, Register tmp)
void JumpIfNotSmi(Operand src, Label *on_not_smi, Label::Distance near_jump=Label::kFar)
void Move(Register target, Immediate source)
void F64x4Qfms(YMMRegister dst, YMMRegister src1, YMMRegister src2, YMMRegister src3, YMMRegister tmp)
void Jump(Handle< Code > code_object, RelocInfo::Mode rmode)
void SmiCompare(Register dst, Operand src)
void AssertFeedbackCell(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void Pinsrq(XMMRegister dst, XMMRegister src1, Operand src2, uint8_t imm8, uint32_t *load_pc_offset=nullptr)
void JumpCodeObject(Register code_object, CodeEntrypointTag tag, JumpMode jump_mode=JumpMode::kJump)
void SmiAddConstant(Operand dst, Tagged< Smi > constant)
void CallForDeoptimization(Builtin target, int deopt_id, Label *exit, DeoptimizeKind kind, Label *ret, Label *jump_deoptimization_entry_label)
Operand ExternalReferenceAsOperand(IsolateFieldId id)
void Move(XMMRegister target, XMMRegister source)
void AssertSignedBitOfSmiIsZero(Register smi) NOOP_UNLESS_DEBUG_CODE
void Cvtqsi2ss(XMMRegister dst, Operand src)
void Jump(Operand op, Condition cc)
void AllocateStackSpace(Register bytes)
void Move(XMMRegister dst, double src)
void Cvtss2sd(XMMRegister dst, Operand src)
void JumpIfLessThan(Register a, int32_t b, Label *dest)
void PushReturnAddressFrom(Register src)
void SmiToInt32(Register dst, Register src)
void Cvtlui2sd(XMMRegister dst, Operand src)
void Cvttss2ui(Register dst, XMMRegister src, Label *fail=nullptr)
void AssertJSAny(Register object, Register map_tmp, AbortReason abort_reason) NOOP_UNLESS_DEBUG_CODE
void IsObjectTypeInRange(Register heap_object, InstanceType low, InstanceType high, Register scratch)
void AssertBoundFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void SmiTag(Register reg)
void Cvttsd2siq(Register dst, Operand src)
void F16x8Qfms(YMMRegister dst, XMMRegister src1, XMMRegister src2, XMMRegister src3, YMMRegister tmp, YMMRegister tmp2)
void Cvtss2sd(XMMRegister dst, XMMRegister src)
void CallBuiltinByIndex(Register builtin_index)
void PrepareCallCFunction(int num_arguments)
void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags, Register feedback_vector)
void DecompressTagged(Register destination, Operand field_operand)
void Move(Operand dst, intptr_t x)
void JumpToExternalReference(const ExternalReference &ext, bool builtin_exit_frame=false)
void F32x8Splat(YMMRegister dst, XMMRegister src)
void Move(XMMRegister dst, uint64_t src)
void I64x4Mul(YMMRegister dst, YMMRegister lhs, YMMRegister rhs, YMMRegister tmp1, YMMRegister tmp2)
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)
Condition CheckFeedbackVectorFlagsNeedsProcessing(Register feedback_vector, CodeKind current_code_kind)
void TryLoadOptimizedOsrCode(Register scratch_and_result, CodeKind min_opt_level, Register feedback_vector, FeedbackSlot slot, Label *on_result, Label::Distance distance)
void AssertUndefinedOrAllocationSite(Register object) NOOP_UNLESS_DEBUG_CODE
void MemoryChunkHeaderFromObject(Register object, Register header)
void F64x4Min(YMMRegister dst, YMMRegister lhs, YMMRegister rhs, YMMRegister scratch)
void SmiUntagUnsigned(Register dst, Operand src)
void BindJumpTarget(Label *label)
void IncsspqIfSupported(Register number_of_words, Register scratch)
void SmiCompare(Register smi1, Register smi2)
void Lzcntq(Register dst, Register src)
void DecompressTagged(Register destination, Tagged_t immediate)
void Cmpeqsd(XMMRegister dst, XMMRegister src)
void F32x8Qfma(YMMRegister dst, YMMRegister src1, YMMRegister src2, YMMRegister src3, YMMRegister tmp)
void MoveNonSmi(Register dst, double value)
void Tzcntq(Register dst, Operand src)
void StubPrologue(StackFrame::Type type)
void StoreTaggedSignedField(Operand dst_field_operand, Tagged< Smi > value)
void TestCodeIsMarkedForDeoptimization(Register code)
void TestCodeIsTurbofanned(Register code)
void DecompressTagged(Register destination, Register source)
Condition CheckSmi(Register src)
void LoadTaggedField(TaggedRegister destination, Operand field_operand)
void LoadTrustedPointerField(Register destination, Operand field_operand, IndirectPointerTag tag, Register scratch)
void StoreRootRelative(int32_t offset, Register value) final
void F16x8Min(YMMRegister dst, XMMRegister lhs, XMMRegister rhs, YMMRegister scratch, YMMRegister scratch2)
void Cmp(Operand dst, Tagged< Smi > src)
void LoadMap(Register destination, Register object)
void LoadFeedbackVector(Register dst, Register closure, Label *fbv_undef, Label::Distance distance)
void JumpIfSmi(Register src, Label *on_smi, Label::Distance near_jump=Label::kFar)
void TailCallRuntime(Runtime::FunctionId fid)
void CallRuntime(Runtime::FunctionId fid, int num_arguments)
void DecompressProtected(Register destination, Operand field_operand)
void LoadNativeContextSlot(Register dst, int index)
void CallRecordWriteStubSaveRegisters(Register object, Register slot_address, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void Tzcntl(Register dst, Register src)
void Cvtqui2ss(XMMRegister dst, Operand src)
int RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode, Register exclusion=no_reg) const
void S256Select(YMMRegister dst, YMMRegister mask, YMMRegister src1, YMMRegister src2, YMMRegister scratch)
void PopReturnAddressTo(Register dst)
Register GetSmiConstant(Tagged< Smi > value)
void AssertSmiOrHeapObjectInMainCompressionCage(Register object) NOOP_UNLESS_DEBUG_CODE
void DropArguments(Register count)
void AssertCallableFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void I32x8TruncF32x8U(YMMRegister dst, YMMRegister src, YMMRegister scratch1, YMMRegister scratch2)
DISALLOW_IMPLICIT_CONSTRUCTORS(StackArgumentsAccessor)
Operand GetReceiverOperand() const
StackArgumentsAccessor(Register argc)
Operand operator[](int index) const
Operand GetArgumentOperand(int index) const
#define NOOP_UNLESS_DEBUG_CODE
#define COMPRESS_POINTERS_BOOL
DirectHandle< Object > new_target
#define DECLARE_ISPLAT(name, suffix, instr_mov)
#define DECLARE_IEXTADDPAIRWISE(ExtAddPairwiseOp)
#define MACRO_ASM_X64_ISPLAT_LIST(V)
#define MACRO_ASM_X64_IEXTADDPAIRWISE_LIST(V)
RegListBase< RegisterT > registers
InstructionOperand destination
constexpr Register no_reg
constexpr Register kRootRegister
MemOperand ExitFrameCallerStackSlotOperand(int index)
Operand FieldOperand(Register object, int offset)
MemOperand FieldMemOperand(Register object, int offset)
constexpr int kSystemPointerSize
constexpr Register kScratchRegister
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr Register kPtrComprCageBaseRegister
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 Register kJSFunctionRegister
MemOperand ExitFrameStackSlotOperand(int offset)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define V8_EXPORT_PRIVATE
bool pending_double_scratch_register_use
bool pending_scratch_register_use
SmiIndex(Register index_register, ScaleFactor scale)