5#ifndef V8_BASELINE_ARM_BASELINE_ASSEMBLER_ARM_INL_H_
6#define V8_BASELINE_ARM_BASELINE_ASSEMBLER_ARM_INL_H_
26 DCHECK(wrapped_scope_.CanAcquire());
27 wrapped_scope_.Include(r8, r9);
28 wrapped_scope_.Include(kInterpreterBytecodeOffsetRegister);
60 return __ add(rscratch, fp,
141 __ AssertNotSmi(map);
142 __ CompareObjectType(map, type, type, MAP_TYPE);
153 __ ldr(tmp, operand);
172 __ ldr(tmp, operand);
180 __ ldr(tmp, operand);
195 __ str(source, output);
198 __ Move32BitImmediate(output,
Operand(reference));
201 __ Move32BitImmediate(output,
Operand(value));
207 __ mov(output, source);
210 __ mov(output, source);
215template <
typename Arg>
229template <
typename... Args>
232struct PushAllHelper<> {
239template <
typename Arg>
240struct PushAllHelper<Arg> {
247 return Push(basm, arg);
253template <
typename Arg,
typename... Args>
254struct PushAllHelper<Arg, Args...> {
266struct PushAllHelper<interpreter::RegisterList> {
268 for (
int reg_index = 0; reg_index < list.
register_count(); ++reg_index) {
283template <
typename... T>
286struct PopAllHelper<> {
298template <
typename... T>
299struct PopAllHelper<
Register, T...> {
308template <
typename... T>
313template <
typename... T>
318template <
typename... T>
383 __ LoadWeakValue(scratch_and_result, scratch_and_result, &fallthrough);
390 __ ldr(scratch_and_result,
394 __ TestCodeIsMarkedForDeoptimization(scratch_and_result, scratch);
402 __ bind(&fallthrough);
403 Move(scratch_and_result, 0);
407 int32_t weight,
Label* skip_interrupt_label) {
414 __ ldr(interrupt_budget,
417 __ add(interrupt_budget, interrupt_budget,
Operand(weight),
SetCC);
418 __ str(interrupt_budget,
420 if (skip_interrupt_label) {
423 __ b(
ge, skip_interrupt_label);
435 __ ldr(interrupt_budget,
438 __ add(interrupt_budget, interrupt_budget, weight,
SetCC);
439 __ str(interrupt_budget,
441 if (skip_interrupt_label)
__ b(
ge, skip_interrupt_label);
447 for (; depth > 0; --depth) {
455 uint32_t index, uint32_t depth) {
456 for (; depth > 0; --depth) {
465 for (; depth > 0; --depth) {
469 if (cell_index > 0) {
470 LoadTaggedField(context, context, SourceTextModule::kRegularExportsOffset);
474 LoadTaggedField(context, context, SourceTextModule::kRegularImportsOffset);
476 cell_index = -cell_index - 1;
483 int cell_index, uint32_t depth) {
484 for (; depth > 0; --depth) {
488 LoadTaggedField(context, context, SourceTextModule::kRegularExportsOffset);
509 Label** labels,
int num_labels) {
523 Register params_size = BaselineLeaveFrameDescriptor::ParamsSizeRegister();
528 Label skip_interrupt_label;
537 __ CallRuntime(Runtime::kBytecodeBudgetInterrupt_Sparkplug, 1);
543 __ Bind(&skip_interrupt_label);
549 __ Move(actual_params_size,
554 __ masm()->
cmp(params_size, actual_params_size);
#define Assert(condition)
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 Switch(Register scratch, Register value, int case_value_base, Label **labels, int num_labels)
void DropArguments(Register count)
static constexpr Register no_reg()
static constexpr Tagged< Smi > FromInt(int value)
static constexpr int kArgCOffset
static constexpr int kFeedbackVectorFromFp
BaselineAssembler * assembler_
UseScratchRegisterScope wrapped_scope_
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 LoadMap(Register output, Register value)
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)
void JumpIfTagged(Condition cc, Register value, MemOperand operand, Label *target, Label::Distance distance=Label::kFar)
void LoadFunction(Register output)
void AssertEqualToAccumulator(Register reg)
BaselineAssembler * assembler_
int register_count() const
constexpr int32_t ToOperand() const
#define ASM_CODE_COMMENT_STRING(asm,...)
#define ASM_CODE_COMMENT(asm)
base::Vector< const DirectHandle< Object > > args
RegListBase< RegisterT > registers
Register ToRegister(BaselineAssembler *basm, BaselineAssembler::ScratchRegisterScope *scope, Arg arg)
constexpr Register kInterpreterAccumulatorRegister
MemOperand FieldMemOperand(Register object, int offset)
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
constexpr Register kJSFunctionRegister
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
static void Pop(BaselineAssembler *basm, Register reg, T... tail)
static void Pop(BaselineAssembler *basm, Register reg)
static void Pop(BaselineAssembler *basm)
static int Push(BaselineAssembler *basm, Arg arg, Args... args)
static int PushReverse(BaselineAssembler *basm, Arg arg, Args... args)
static int Push(BaselineAssembler *basm, Arg arg)
static int PushReverse(BaselineAssembler *basm, Arg arg)
static int Push(BaselineAssembler *basm, interpreter::RegisterList list)
static int PushReverse(BaselineAssembler *basm, interpreter::RegisterList list)
static int PushReverse(BaselineAssembler *basm)
static int Push(BaselineAssembler *basm)