5#ifndef V8_BASELINE_IA32_BASELINE_ASSEMBLER_IA32_INL_H_
6#define V8_BASELINE_IA32_BASELINE_ASSEMBLER_IA32_INL_H_
52inline bool Clobbers(Register target,
MemOperand op) {
53 return op.is_reg(target);
60 interpreter::Register interpreter_register) {
64 interpreter::Register interpreter_register, Register rscratch) {
65 return __ lea(rscratch,
MemOperand(ebp, interpreter_register.ToOperand() *
82 __ jmp(target, distance);
103 __ cmp(left, Immediate(right));
104 __ j(
cc, target, distance);
115 __ test_b(value, Immediate(
mask));
119 __ j(
cc, target, distance);
125 __ j(
cc, target, distance);
132 ScratchRegisterScope temps(
this);
133 Register scratch = temps.AcquireScratch();
139 Register map, Label* target,
141 __ AssertNotSmi(
object);
142 __ CmpObjectType(
object, instance_type, map);
143 __ j(
cc, target, distance);
151 __ AssertNotSmi(map);
152 __ CmpObjectType(map, MAP_TYPE, eax);
156 __ CmpInstanceType(map, instance_type);
157 __ j(
cc, target, distance);
162 JumpIf(
cc, value, operand, target, distance);
166 if (smi.value() == 0) {
169 __ cmp(value, Immediate(smi));
171 __ j(
cc, target, distance);
178 __ j(
cc, target, distance);
183 __ cmp(operand, value);
184 __ j(
cc, target, distance);
187 Register value, Label* target,
189 __ cmp(operand, value);
190 __ j(
cc, target, distance);
194 __ cmpb(value, Immediate(
byte));
195 __ j(
cc, target, distance);
201 __ Move(output, Immediate(value.ptr()));
204 __ mov(output, source);
207 __ Move(output, Immediate(reference));
213 __ Move(output, Immediate(value));
216 __ mov(output, source);
219 __ mov(output, source);
246template <
typename Arg>
253 return Push(basm, arg);
258struct PushHelper<interpreter::RegisterList> {
260 for (
int reg_index = 0; reg_index < list.
register_count(); ++reg_index) {
275template <
typename... Args>
278struct PushAllHelper<> {
282template <
typename Arg,
typename... Args>
283struct PushAllHelper<Arg, Args...> {
296template <
typename... T>
298 return detail::PushAllHelper<T...>::Push(
this, vals...);
301template <
typename... T>
303 detail::PushAllHelper<T...>::PushReverse(
this, vals...);
306template <
typename... T>
329 Register source,
int offset) {
347 BaselineAssembler::ScratchRegisterScope scratch_scope(
this);
348 Register scratch = scratch_scope.AcquireScratch();
362 Register feedback_vector,
369 __ LoadWeakValue(scratch_and_result, &fallthrough);
373 ScratchRegisterScope temps(
this);
376 __ mov(scratch_and_result,
377 FieldOperand(scratch_and_result, CodeWrapper::kCodeOffset));
379 __ TestCodeIsMarkedForDeoptimization(scratch_and_result);
380 __ j(
equal, on_result, distance);
386 __ bind(&fallthrough);
387 __ Move(scratch_and_result, 0);
391 int32_t weight, Label* skip_interrupt_label) {
393 ScratchRegisterScope scratch_scope(
this);
394 Register feedback_cell = scratch_scope.AcquireScratch();
396 __ add(
FieldOperand(feedback_cell, FeedbackCell::kInterruptBudgetOffset),
398 if (skip_interrupt_label) {
405 Register weight, Label* skip_interrupt_label) {
407 ScratchRegisterScope scratch_scope(
this);
408 Register feedback_cell = scratch_scope.AcquireScratch();
411 __ add(
FieldOperand(feedback_cell, FeedbackCell::kInterruptBudgetOffset),
418 CompressionMode compression_mode) {
419 for (; depth > 0; --depth) {
427 uint32_t index, uint32_t depth) {
428 for (; depth > 0; --depth) {
437 for (; depth > 0; --depth) {
441 if (cell_index > 0) {
442 LoadTaggedField(context, context, SourceTextModule::kRegularExportsOffset);
446 LoadTaggedField(context, context, SourceTextModule::kRegularImportsOffset);
448 cell_index = -cell_index - 1;
455 int cell_index, uint32_t depth) {
456 for (; depth > 0; --depth) {
460 LoadTaggedField(context, context, SourceTextModule::kRegularExportsOffset);
474 __ and_(output, Immediate(rhs));
478 Label** labels,
int num_labels) {
480 ScratchRegisterScope scope(
this);
481 Register table = scope.AcquireScratch();
483 Label fallthrough, jump_table;
484 if (case_value_base != 0) {
485 __ sub(
reg, Immediate(case_value_base));
487 __ cmp(
reg, Immediate(num_labels));
493 __ bind(&jump_table);
494 for (
int i = 0;
i < num_labels; ++
i) {
497 __ bind(&fallthrough);
508 Register params_size = BaselineLeaveFrameDescriptor::ParamsSizeRegister();
512 Label skip_interrupt_label;
519 __ CallRuntime(Runtime::kBytecodeBudgetInterrupt_Sparkplug, 1);
524 __ Bind(&skip_interrupt_label);
527 BaselineAssembler::ScratchRegisterScope scope(&basm);
528 Register scratch = scope.AcquireScratch();
531 Register actual_params_size = scratch;
538 __ masm()->
cmp(params_size, actual_params_size);
#define Assert(condition)
void cmov(Condition cc, Register dst, Register src)
void cmp(Register src1, const Operand &src2, Condition cond=al)
static constexpr int kFeedbackCellFromFp
static constexpr Register WeightRegister()
static const int kExtensionOffset
static V8_INLINE constexpr int OffsetOfElementAt(int index)
static const int kPreviousOffset
static constexpr int OffsetOfElementAt(int index)
void mov(Register rd, Register rj)
void SmiUntag(Register reg, SBit s=LeaveCC)
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 PushRoot(RootIndex index)
void DropArguments(Register count)
static constexpr Tagged< Smi > FromInt(int value)
static constexpr int kArgCOffset
static constexpr int kFunctionOffset
static constexpr int kFeedbackVectorFromFp
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 SmiUntag(Register value)
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)
base::Vector< const DirectHandle< Object > > args
RegListBase< RegisterT > registers
static constexpr int kNumScratchRegisters
void PushSingle(MacroAssembler *masm, RootIndex source)
static constexpr Register kScratchRegisters[]
Operand FieldOperand(Register object, int offset)
constexpr Register kInterpreterAccumulatorRegister
constexpr int kSystemPointerSize
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)
Tagged< ClearedWeakValue > ClearedValue(PtrComprCageBase cage_base)
V8_EXPORT_PRIVATE FlagValues v8_flags
@ times_system_pointer_size
static const uint16_t * Align(const uint16_t *chars)
#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)