5#ifndef V8_BASELINE_X64_BASELINE_ASSEMBLER_X64_INL_H_
6#define V8_BASELINE_X64_BASELINE_ASSEMBLER_X64_INL_H_
54inline bool Clobbers(Register target,
MemOperand op) {
55 return op.AddressUsesRegister(target);
62 interpreter::Register interpreter_register) {
66 interpreter::Register interpreter_register, Register rscratch) {
67 return __ leaq(rscratch,
MemOperand(rbp, interpreter_register.ToOperand() *
84 __ jmp(target, distance);
106 __ testb(value, Immediate(
mask));
108 __ testl(value, Immediate(
mask));
110 __ j(
cc, target, distance);
116 __ j(
cc, target, distance);
119#if V8_STATIC_ROOTS_BOOL
120void BaselineAssembler::JumpIfJSAnyIsPrimitive(Register heap_object,
123 __ AssertNotSmi(heap_object);
124 ScratchRegisterScope temps(
this);
125 Register scratch = temps.AcquireScratch();
126 __ JumpIfJSAnyIsPrimitive(heap_object, scratch, target, distance);
134 __ AssertNotSmi(
object);
135 ScratchRegisterScope temps(
this);
136 Register scratch = temps.AcquireScratch();
137 if (
cc == Condition::kEqual ||
cc == Condition::kNotEqual) {
138 __ IsObjectType(
object, instance_type, scratch);
140 __ CmpObjectType(
object, instance_type, scratch);
142 __ j(
cc, target, distance);
147 Register map, Label* target,
149 __ AssertNotSmi(
object);
150 __ CmpObjectType(
object, instance_type, map);
151 __ j(
cc, target, distance);
158 __ AssertNotSmi(map);
162 __ CmpInstanceType(map, instance_type);
163 __ j(
cc, target, distance);
168 __ cmpq(value, operand);
169 __ j(
cc, target, distance);
173 __ SmiCompare(lhs, smi);
174 __ j(
cc, target, distance);
178 __ SmiCompare(lhs, rhs);
179 __ j(
cc, target, distance);
185 __ cmpq(left, Immediate(right));
186 __ j(
cc, target, distance);
193 __ cmp_tagged(value, operand);
194 __ j(
cc, target, distance);
197 Register value, Label* target,
199 __ cmp_tagged(operand, value);
200 __ j(
cc, target, distance);
204 __ cmpb(value, Immediate(
byte));
205 __ j(
cc, target, distance);
215 __ movq(output, source);
218 __ Move(output, reference);
227 __ mov_tagged(output, source);
230 __ mov_tagged(output, source);
235 masm->PushRoot(source);
237inline void PushSingle(MacroAssembler* masm, Register
reg) { masm->Push(
reg); }
238inline void PushSingle(MacroAssembler* masm, Tagged<TaggedIndex> value) {
244inline void PushSingle(MacroAssembler* masm, Handle<HeapObject>
object) {
247inline void PushSingle(MacroAssembler* masm, int32_t immediate) {
248 masm->Push(Immediate(immediate));
253inline void PushSingle(MacroAssembler* masm, interpreter::Register source) {
257template <
typename Arg>
264 return Push(basm, arg);
271 for (
int reg_index = 0; reg_index < list.
register_count(); ++reg_index) {
286template <
typename... Args>
293template <
typename Arg,
typename... Args>
307template <
typename... T>
309 return detail::PushAllHelper<T...>::Push(
this, vals...);
312template <
typename... T>
314 detail::PushAllHelper<T...>::PushReverse(
this, vals...);
317template <
typename... T>
336 Register source,
int offset) {
368 TaggedRegister source,
int offset) {
378 TaggedRegister array,
385 TaggedRegister array,
392 Register feedback_vector,
397 CodeKind::MAGLEV, feedback_vector,
398 slot, on_result, distance);
402 int32_t weight, Label* skip_interrupt_label) {
404 ScratchRegisterScope scratch_scope(
this);
405 Register feedback_cell = scratch_scope.AcquireScratch();
407 __ addl(
FieldOperand(feedback_cell, FeedbackCell::kInterruptBudgetOffset),
409 if (skip_interrupt_label) {
416 Register weight, Label* skip_interrupt_label) {
418 ScratchRegisterScope scratch_scope(
this);
419 Register feedback_cell = scratch_scope.AcquireScratch();
421 __ addl(
FieldOperand(feedback_cell, FeedbackCell::kInterruptBudgetOffset),
428 CompressionMode compression_mode) {
437 TaggedRegister tagged(context);
440 for (; depth > 0; --depth) {
453 uint32_t index, uint32_t depth) {
459 TaggedRegister tagged(context);
462 for (; depth > 0; --depth) {
479 TaggedRegister tagged(context);
485 for (; depth > 0; --depth) {
490 if (cell_index > 0) {
491 LoadTaggedField(tagged, tagged, SourceTextModule::kRegularExportsOffset);
495 LoadTaggedField(tagged, tagged, SourceTextModule::kRegularImportsOffset);
497 cell_index = -cell_index - 1;
504 int cell_index, uint32_t depth) {
508 TaggedRegister tagged(context);
514 for (; depth > 0; --depth) {
519 LoadTaggedField(tagged, tagged, SourceTextModule::kRegularExportsOffset);
533 __ andq(output, Immediate(rhs));
537 Label** labels,
int num_labels) {
539 ScratchRegisterScope scope(
this);
540 __ Switch(scope.AcquireScratch(),
reg, case_value_base, labels, num_labels);
543#ifdef V8_ENABLE_CET_SHADOW_STACK
544void BaselineAssembler::MaybeEmitPlaceHolderForDeopt() {
559 Register params_size = BaselineLeaveFrameDescriptor::ParamsSizeRegister();
564 Label skip_interrupt_label;
572 __ CallRuntime(Runtime::kBytecodeBudgetInterrupt_Sparkplug, 1);
577 __ Bind(&skip_interrupt_label);
580 BaselineAssembler::ScratchRegisterScope scope(&basm);
581 Register scratch = scope.AcquireScratch();
583 Register actual_params_size = scratch;
590 __ masm()->cmpq(params_size, actual_params_size);
#define Assert(condition)
void cmovq(Condition cc, Register dst, Register src)
static constexpr int kIntraSegmentJmpInstrSize
void movq(XMMRegister dst, Operand src)
static constexpr int kFeedbackCellFromFp
static constexpr Register WeightRegister()
static const int kExtensionOffset
static V8_INLINE constexpr int OffsetOfElementAt(int index)
static const int kPreviousOffset
void SmiUntagUnsigned(Register reg)
void Assert(Condition cond, AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void SmiTag(Register reg, SBit s=LeaveCC)
void Ret(Condition cond=al)
int LeaveFrame(StackFrame::Type type)
void TryLoadOptimizedOsrCode(Register scratch_and_result, CodeKind min_opt_level, Register feedback_vector, FeedbackSlot slot, Label *on_result, Label::Distance distance)
void DropArguments(Register count)
static constexpr Tagged< Smi > FromInt(int value)
static constexpr int kArgCOffset
static constexpr int kFunctionOffset
static constexpr int kFeedbackVectorFromFp
static constexpr Register SlotAddressRegister()
BaselineAssembler * assembler_
ScratchRegisterScope * prev_scope_
Register AcquireScratch()
ScratchRegisterScope(BaselineAssembler *assembler)
void JumpIfByte(Condition cc, Register value, int32_t byte, Label *target, Label::Distance distance=Label::kFar)
void PushReverse(T... vals)
void CallRuntime(Runtime::FunctionId function, int nargs)
void JumpIf(Condition cc, Register lhs, const Operand &rhs, Label *target, Label::Distance distance=Label::kFar)
void LoadFixedArrayElement(Register output, Register array, int32_t index)
static MemOperand RegisterFrameOperand(interpreter::Register interpreter_register)
void JumpIfNotRoot(Register value, RootIndex index, Label *target, Label ::Distance distance=Label::kFar)
void JumpIfPointer(Condition cc, Register value, MemOperand operand, Label *target, Label::Distance distance=Label::kFar)
void Move(Register output, Register source)
static void EmitReturn(MacroAssembler *masm)
void MoveSmi(Register output, Register source)
void TestAndBranch(Register value, int mask, Condition cc, Label *target, Label::Distance distance=Label::kFar)
void LoadWord8Field(Register output, Register source, int offset)
void LoadWord16FieldZeroExtend(Register output, Register source, int offset)
void AddToInterruptBudgetAndJumpIfNotExceeded(int32_t weight, Label *skip_interrupt_label)
void LdaContextSlot(Register context, uint32_t index, uint32_t depth, CompressionMode compression_mode=CompressionMode::kDefault)
void LoadTaggedField(Register output, Register source, int offset)
void Jump(Label *target, Label::Distance distance=Label::kFar)
void Switch(Register reg, int case_value_base, Label **labels, int num_labels)
void StaModuleVariable(Register context, Register value, int cell_index, uint32_t depth)
void LoadContext(Register output)
void JumpIfObjectTypeFast(Condition cc, Register object, InstanceType instance_type, Label *target, Label::Distance distance=Label::kFar)
void MoveMaybeSmi(Register output, Register source)
MemOperand FeedbackCellOperand()
void StoreTaggedFieldNoWriteBarrier(Register target, int offset, Register value)
void TryLoadOptimizedOsrCode(Register scratch_and_result, Register feedback_vector, FeedbackSlot slot, Label *on_result, Label::Distance distance)
void LoadFeedbackCell(Register output)
void LoadTaggedSignedFieldAndUntag(Register output, Register source, int offset)
ScratchRegisterScope * scratch_register_scope_
void JumpIfInstanceType(Condition cc, Register map, InstanceType instance_type, Label *target, Label::Distance distance=Label::kFar)
void JumpIfImmediate(Condition cc, Register left, int right, Label *target, Label::Distance distance=Label::kFar)
void JumpIfRoot(Register value, RootIndex index, Label *target, Label::Distance distance=Label::kFar)
MemOperand FeedbackVectorOperand()
void JumpIfSmi(Register value, Label *target, Label::Distance distance=Label::kFar)
void JumpIfNotSmi(Register value, Label *target, Label::Distance distance=Label::kFar)
void JumpIfObjectType(Condition cc, Register object, InstanceType instance_type, Register map, Label *target, Label::Distance distance=Label::kFar)
void LdaModuleVariable(Register context, int cell_index, uint32_t depth)
void IncrementSmi(MemOperand lhs)
void StoreTaggedFieldWithWriteBarrier(Register target, int offset, Register value)
void LoadTaggedSignedField(Register output, Register source, int offset)
void RegisterFrameAddress(interpreter::Register interpreter_register, Register rscratch)
void Word32And(Register output, Register lhs, int rhs)
void StoreTaggedSignedField(Register target, int offset, Tagged< Smi > value)
void StaContextSlot(Register context, Register value, uint32_t index, uint32_t depth)
BaselineAssembler(MacroAssembler *masm)
void JumpIfTagged(Condition cc, Register value, MemOperand operand, Label *target, Label::Distance distance=Label::kFar)
void AssertEqualToAccumulator(Register reg)
BaselineAssembler * assembler_
int register_count() const
#define ASM_CODE_COMMENT_STRING(asm,...)
#define ASM_CODE_COMMENT(asm)
#define COMPRESS_POINTERS_BOOL
base::Vector< const DirectHandle< Object > > args
RegListBase< RegisterT > registers
static constexpr int kNumScratchRegisters
void PushSingle(MacroAssembler *masm, RootIndex source)
static constexpr Register kScratchRegisters[]
constexpr int kTaggedSize
Operand FieldOperand(Register object, int offset)
constexpr Register kInterpreterAccumulatorRegister
constexpr int kSystemPointerSize
constexpr Register kScratchRegister
constexpr Register kContextRegister
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)
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr Register kPtrComprCageBaseRegister
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
static int PushReverse(BaselineAssembler *masm, Arg arg, Args... args)
static int Push(BaselineAssembler *masm, Arg arg, Args... args)
static int PushReverse(BaselineAssembler *masm)
static int Push(BaselineAssembler *masm)
static int PushReverse(BaselineAssembler *basm, interpreter::RegisterList list)
static int Push(BaselineAssembler *basm, interpreter::RegisterList list)
static int PushReverse(BaselineAssembler *basm, Arg arg)
static int Push(BaselineAssembler *basm, Arg arg)
#define OFFSET_OF_DATA_START(Type)