5#ifndef V8_CODEGEN_IA32_MACRO_ASSEMBLER_IA32_H_
6#define V8_CODEGEN_IA32_MACRO_ASSEMBLER_IA32_H_
8#ifndef INCLUDED_FROM_MACRO_ASSEMBLER_H
9#error This header must be included via macro-assembler.h
40class InstructionStream;
41class ExternalReference;
53class StackArgumentsAccessor {
96 void AllocateStackSpace(
Register bytes_scratch);
97 void AllocateStackSpace(
int bytes);
102 if (bytes == 0)
return;
146 Move(dst, base::bit_cast<uint32_t>(src));
149 Move(dst, base::bit_cast<uint64_t>(src));
163 void TailCallBuiltin(
Builtin builtin);
165#ifdef V8_ENABLE_LEAPTIERING
181#ifdef V8_ENABLE_WEBASSEMBLY
182 void ResolveWasmCodePointer(
Register target);
183 void CallWasmCodePointer(
Register target,
202 Label* jump_deoptimization_entry_label);
208 j(zero, smi_label, distance);
214 j(zero, smi_label, distance);
242 void PrepareCallCFunction(
int num_arguments,
Register scratch);
252 Label* return_location =
nullptr);
254 Register function,
int num_arguments,
256 Label* return_location =
nullptr);
327 return ExternalReferenceAsOperand(ExternalReference::Create(
id),
no_reg);
343 uint32_t* load_pc_offset) {
344 PinsrdPreSse41(dst,
Operand(src), imm8, load_pc_offset);
347 uint32_t* load_pc_offset);
359 Cvtui2ss(dst,
Operand(src), tmp);
363 Cvttss2ui(dst,
Operand(src), tmp);
367 Cvtui2sd(dst,
Operand(src), scratch);
371 Cvttsd2ui(dst,
Operand(src), tmp);
441 CompareRoot(with, index);
442 j(
equal, if_equal, if_equal_distance);
448 CompareRoot(with, index);
449 j(
not_equal, if_not_equal, if_not_equal_distance);
459 unsigned higher_limit,
Register scratch,
550 j(
not_zero, not_smi_label, distance);
559 template <
typename Field>
561 static const int shift = Field::kShift;
562 static const int mask = Field::kMask >> Field::kShift;
644 CallRuntime(Runtime::FunctionForId(fid), num_arguments);
652 bool builtin_exit_frame =
false);
669 if (!
v8_flags.native_code_counters)
return;
670 EmitIncrementCounter(counter, value, scratch);
674 if (!
v8_flags.native_code_counters)
return;
675 EmitDecrementCounter(counter, value, scratch);
685 Label* stack_overflow,
bool include_receiver =
false);
715 return Operand(esp,
offset);
725struct MoveCycleState {
739 int slots_to_drop_on_return,
743#define ACCESS_MASM(masm) masm->
interpreter::OperandScale scale
static constexpr int kFixedSlotCountAboveFp
void Move(XMMRegister dst, float src)
void PextrdPreSse41(Register dst, XMMRegister src, uint8_t imm8)
void Tzcnt(Register dst, Register src)
void Abort(AbortReason reason)
void LoadLabelAddress(Register dst, Label *lbl)
void Push(Immediate value)
void Move(XMMRegister dst, uint32_t src)
void InitializeRootRegister()
void CallJSFunction(Register function_object, uint16_t argument_count)
void CallDebugOnFunctionCall(Register fun, Register new_target, Register expected_parameter_count, Register actual_parameter_count)
void JumpIfRoot(Register with, RootIndex index, Label *if_equal, Label::Distance if_equal_distance=Label::kFar)
void Popcnt(Register dst, Operand src)
void LoadAddress(Register destination, ExternalReference source)
void JumpIfSmi(Operand value, Label *smi_label, Label::Distance distance=Label::kFar)
void DecodeField(Register reg)
int PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion=no_reg)
void CompareRoot(Register with, Register scratch, RootIndex index)
void CallRuntime(Runtime::FunctionId fid)
void ShlPair_cl(Register high, Register low)
void SmiCompare(Operand dst, Smi src)
void EnterFrame(StackFrame::Type type)
void Pop(XMMRegister dst, Register scratch)
void CmpInstanceTypeRange(Register map, Register instance_type_out, Register scratch, InstanceType lower_limit, InstanceType higher_limit)
void CompareStackLimit(Register with, StackLimitKind kind)
void AssertGeneratorObject(Register object) NOOP_UNLESS_DEBUG_CODE
void RecordWriteField(Register object, int offset, Register value, Register scratch, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline)
void Push(XMMRegister src, Register scratch)
void SarPair(Register high, Register low, uint8_t imm8)
int CallCFunction(ExternalReference function, int num_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void RecordWrite(Register object, Register address, Register value, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline)
void Move(Register dst, Operand src)
void InvokeFunction(Register function, Register new_target, Register actual_parameter_count, InvokeType type)
void Move(Register dst, Register src)
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 DropArguments(Register count, Register scratch)
void LeaveExitFrame(Register scratch)
void AssertFeedbackVector(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void CallBuiltinByIndex(Register builtin_index, Register target)
void EnterExitFrame(int extra_slots, StackFrame::Type frame_type, Register c_function)
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 Push(Handle< HeapObject > handle)
void CompareRange(Register value, unsigned lower_limit, unsigned higher_limit, Register scratch)
void CallCodeObject(Register code_object)
void CallEphemeronKeyBarrier(Register object, Register slot_address, SaveFPRegsMode fp_mode)
void AssertUnreachable(AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void DropArgumentsAndPushNewReceiver(Register argc, Operand receiver, Register scratch)
void LoadRootRegisterOffset(Register destination, intptr_t offset) final
void EmitDecrementCounter(StatsCounter *counter, int value, Register scratch)
void AssertSmi(Register object) NOOP_UNLESS_DEBUG_CODE
void LoadWeakValue(Register in_out, Label *target_if_cleared)
void Check(Condition cc, AbortReason reason)
void CheckPageFlag(Register object, Register scratch, int mask, Condition cc, Label *condition_met, Label::Distance condition_met_distance=Label::kFar)
void PinsrdPreSse41(XMMRegister dst, Operand src, uint8_t imm8, uint32_t *load_pc_offset)
void SmiCompare(Operand dst, Register src)
int CallCFunction(Register function, int num_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_location=nullptr)
void Cvtsi2ss(XMMRegister dst, Operand src)
void InvokeFunctionCode(Register function, Register new_target, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void AssertCallableFunction(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void Jump(const ExternalReference &reference)
void InvokePrologue(Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void SmiToInt32(Register reg)
void Cvttsd2ui(Register dst, XMMRegister src, XMMRegister tmp)
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 LoadFeedbackVector(Register dst, Register closure, Register scratch, Label *fbv_undef, Label::Distance distance)
void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(Register flags, XMMRegister saved_feedback_vector, CodeKind current_code_kind, Label *flags_need_processing)
void SmiCompare(Register dst, Tagged< Smi > src)
void JumpIfIsInRange(Register value, unsigned lower_limit, unsigned higher_limit, Register scratch, Label *on_in_range, Label::Distance near_jump=Label::kFar)
void JumpIfNotSmi(Register value, Label *not_smi_label, Label::Distance distance=Label::kFar)
void Cvtui2sd(XMMRegister dst, Operand src, Register scratch)
void CallBuiltin(Builtin builtin)
void Tzcnt(Register dst, Operand src)
void CmpObjectType(Register heap_object, InstanceType type, Register map)
void Cvtui2sd(XMMRegister dst, Register src, Register scratch)
void SarPair_cl(Register high, Register low)
void ShlPair(Register high, Register low, uint8_t imm8)
void LeaveFrame(StackFrame::Type type)
void LoadGlobalProxy(Register dst)
int PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion=no_reg)
void ShrPair(Register high, Register low, uint8_t imm8)
void AssertSmi(Operand object) NOOP_UNLESS_DEBUG_CODE
void Cvtsi2sd(XMMRegister dst, Register src)
Operand RootAsOperand(RootIndex index)
void LoadCodeInstructionStart(Register destination, Register code_object, CodeEntrypointTag=kDefaultCodeEntrypointTag)
void PushStackHandler(Register scratch)
Operand ExternalReferenceAsOperand(ExternalReference reference, Register scratch)
void BindExceptionHandler(Label *label)
void Move(Operand dst, const Immediate &src)
void LoadRoot(Register destination, RootIndex index) final
void JumpIfNotSmi(Operand value, Label *smi_label, Label::Distance distance=Label::kFar)
Immediate ClearedValue() const
void PushRoot(RootIndex index)
void PopReturnAddressTo(XMMRegister dst, Register scratch)
void Lzcnt(Register dst, Register src)
void JumpCodeObject(Register code_object, JumpMode jump_mode=JumpMode::kJump)
void Ret(int bytes_dropped, Register scratch)
void JumpIfSmi(Register value, Label *smi_label, Label::Distance distance=Label::kFar)
void DropArgumentsAndPushNewReceiver(Register argc, Register receiver, Register scratch)
void LoadFromConstantsTable(Register destination, int constant_index) final
void SmiUntag(Register reg)
void CmpInstanceType(Register map, InstanceType type)
void AssertNotSmi(Register object) NOOP_UNLESS_DEBUG_CODE
void DecrementCounter(StatsCounter *counter, int value, Register scratch)
void ComputeCodeStartAddress(Register dst)
void MaybeSaveRegisters(RegList registers)
void AllocateStackSpace(int bytes)
void EmitIncrementCounter(StatsCounter *counter, int value, Register scratch)
void Move(Register dst, int32_t x)
DISALLOW_IMPLICIT_CONSTRUCTORS(MacroAssembler)
void JumpJSFunction(Register function_object, JumpMode jump_mode=JumpMode::kJump)
void IncrementCounter(StatsCounter *counter, int value, Register scratch)
void Move(Register dst, Tagged< Smi > src)
void AssertConstructor(Register object) NOOP_UNLESS_DEBUG_CODE
void CheckStackAlignment()
void CallRuntime(const Runtime::Function *f, int num_arguments)
void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags, XMMRegister saved_feedback_vector)
void SmiUntag(Register output, Register value)
void EnterFrame(StackFrame::Type type, bool load_constant_pool_pointer_reg)
void Drop(int element_count)
void GenerateTailCallToReturnedCode(Runtime::FunctionId function_id)
void AssertFunction(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void Push(Tagged< Smi > smi)
void Cvtsi2ss(XMMRegister dst, Register src)
Operand StackLimitAsOperand(StackLimitKind kind)
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 CallForDeoptimization(Builtin target, int deopt_id, Label *exit, DeoptimizeKind kind, Label *ret, Label *jump_deoptimization_entry_label)
Operand ExternalReferenceAsOperand(IsolateFieldId id)
void StackOverflowCheck(Register num_args, Register scratch, Label *stack_overflow, bool include_receiver=false)
void AllocateStackSpace(Register bytes)
void LoadEntryFromBuiltinIndex(Register builtin_index, Register target)
void Move(XMMRegister dst, double src)
void JumpIfLessThan(Register a, int32_t b, Label *dest)
void PushReturnAddressFrom(Register src)
void Popcnt(Register dst, Register src)
Operand EntryFromBuiltinAsOperand(Builtin builtin)
void Move(Register dst, Handle< HeapObject > src)
void ShrPair_cl(Register high, Register low)
void PopStackHandler(Register scratch)
void AssertJSAny(Register object, Register map_tmp, AbortReason abort_reason) NOOP_UNLESS_DEBUG_CODE
void AssertBoundFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void PinsrdPreSse41(XMMRegister dst, Register src, uint8_t imm8, uint32_t *load_pc_offset)
void SmiTag(Register reg)
void Cvtsi2sd(XMMRegister dst, Operand src)
void Cvttss2ui(Register dst, Operand src, XMMRegister tmp)
void Cvttsd2ui(Register dst, Operand src, XMMRegister tmp)
void JumpToExternalReference(const ExternalReference &ext, bool builtin_exit_frame=false)
void Move(XMMRegister dst, uint64_t src)
void MaybeRestoreRegisters(RegList registers)
void CallRecordWriteStub(Register object, Register slot_address, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void MemoryChunkHeaderFromObject(Register object, Register header)
void AssertUndefinedOrAllocationSite(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void Move(Register dst, const Immediate &src)
void Cvtui2ss(XMMRegister dst, Operand src, Register tmp)
void SmiCompare(Register smi1, Register smi2)
void Cvtui2ss(XMMRegister dst, Register src, Register tmp)
void StubPrologue(StackFrame::Type type)
void TestCodeIsMarkedForDeoptimization(Register code)
void StoreRootRelative(int32_t offset, Register value) final
void LoadMap(Register destination, Register object)
Operand ExternalReferenceAddressAsOperand(ExternalReference reference)
void TailCallRuntime(Runtime::FunctionId fid)
void PushReturnAddressFrom(XMMRegister src, Register scratch)
void CallRuntime(Runtime::FunctionId fid, int num_arguments)
void LoadNativeContextSlot(Register dst, int index)
void CompareRoot(Register with, RootIndex index)
Operand HeapObjectAsOperand(Handle< HeapObject > object)
void CallRecordWriteStubSaveRegisters(Register object, Register slot_address, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void Lzcnt(Register dst, Operand src)
int RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode, Register exclusion=no_reg) const
void PopReturnAddressTo(Register dst)
void DropArguments(Register count)
void Cvttss2ui(Register dst, XMMRegister src, XMMRegister tmp)
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
DirectHandle< Object > new_target
RegListBase< RegisterT > registers
InstructionOperand destination
constexpr Register no_reg
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
MemOperand ExitFrameCallerStackSlotOperand(int index)
Operand FieldOperand(Register object, int offset)
constexpr int kSystemPointerSize
V8_EXPORT_PRIVATE FlagValues v8_flags
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)
MemOperand ExitFrameStackSlotOperand(int offset)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define V8_EXPORT_PRIVATE
bool pending_double_scratch_register_use