5#ifndef V8_BASELINE_RISCV_BASELINE_ASSEMBLER_RISCV_INL_H_
6#define V8_BASELINE_RISCV_BASELINE_ASSEMBLER_RISCV_INL_H_
16class BaselineAssembler::ScratchRegisterScope {
25 wrapped_scope_.Include(kScratchReg, kScratchReg2);
52 interpreter::Register interpreter_register) {
56 interpreter::Register interpreter_register, Register rscratch) {
57 return __ AddWord(rscratch, fp,
74 __ jmp(target, distance);
95 JumpIf(
cc, left, Operand(right), target, distance);
99 ScratchRegisterScope temps(
this);
100 Register tmp = temps.AcquireScratch();
102 __ Branch(target,
cc, tmp, Operand(zero_reg), distance);
107 __ Branch(target,
cc, lhs, Operand(rhs), distance);
110#if V8_STATIC_ROOTS_BOOL
111void BaselineAssembler::JumpIfJSAnyIsPrimitive(Register heap_object,
114 __ AssertNotSmi(heap_object);
115 ScratchRegisterScope temps(
this);
116 Register scratch = temps.AcquireScratch();
117 __ JumpIfJSAnyIsPrimitive(heap_object, scratch, target, distance);
125 ScratchRegisterScope temps(
this);
126 Register scratch = temps.AcquireScratch();
135 Register map, Label* target,
137 ScratchRegisterScope temps(
this);
138 Register type = temps.AcquireScratch();
139 __ GetObjectType(
object, map, type);
140 __ Branch(target,
cc, type, Operand(instance_type), distance);
146 ScratchRegisterScope temps(
this);
147 Register type = temps.AcquireScratch();
149 __ AssertNotSmi(map);
150 __ GetObjectType(map, type, type);
151 __ Assert(
eq, AbortReason::kUnexpectedValue, type, Operand(MAP_TYPE));
154 __ Branch(target,
cc, type, Operand(instance_type), distance);
159 ScratchRegisterScope temps(
this);
160 Register temp = temps.AcquireScratch();
161 __ LoadWord(temp, operand);
162 __ Branch(target,
cc, value, Operand(temp), distance);
166 __ CompareTaggedAndBranch(target,
cc, value, Operand(smi));
173 __ CompareTaggedAndBranch(target,
cc, lhs, Operand(rhs), distance);
179 ScratchRegisterScope temps(
this);
180 Register scratch = temps.AcquireScratch();
181 __ LoadWord(scratch, operand);
182 __ CompareTaggedAndBranch(target,
cc, value, Operand(scratch), distance);
185 Register value, Label* target,
188 ScratchRegisterScope temps(
this);
189 Register scratch = temps.AcquireScratch();
190 __ LoadWord(scratch, operand);
191 __ CompareTaggedAndBranch(target,
cc, scratch, Operand(value), distance);
195 __ Branch(target,
cc, value, Operand(
byte), distance);
202 __ li(output, Operand(value.ptr()));
205 __ StoreWord(source, output);
208 __ li(output, Operand(reference));
211 __ li(output, value);
214 __ li(output, Operand(value));
225template <
typename Arg>
227 BaselineAssembler::ScratchRegisterScope* scope,
230 basm->Move(
reg, arg);
234 BaselineAssembler::ScratchRegisterScope* scope,
239template <
typename... Args>
242struct PushAllHelper<> {
246template <
typename Arg>
247struct PushAllHelper<Arg> {
254 return Push(basm, arg);
257template <
typename Arg,
typename... Args>
258struct PushAllHelper<Arg, Args...> {
270struct PushAllHelper<interpreter::RegisterList> {
272 for (
int reg_index = 0; reg_index < list.
register_count(); ++reg_index) {
287template <
typename... T>
290struct PopAllHelper<> {
299template <
typename... T>
300struct PopAllHelper<
Register, T...> {
309template <
typename... T>
311 return detail::PushAllHelper<T...>::Push(
this, vals...);
314template <
typename... T>
316 detail::PushAllHelper<T...>::PushReverse(
this, vals...);
319template <
typename... T>
321 detail::PopAllHelper<T...>::Pop(
this,
registers...);
339 Register source,
int offset) {
349 ScratchRegisterScope temps(
this);
350 Register tmp = temps.AcquireScratch();
351 __ li(tmp, Operand(value));
369 Register feedback_vector,
373 Label fallthrough, clear_slot;
376 __ LoadWeakValue(scratch_and_result, scratch_and_result, &fallthrough);
380 ScratchRegisterScope temps(
this);
382 __ LoadCodePointerField(
386 __ JumpIfCodeIsMarkedForDeoptimization(scratch_and_result,
387 temps.AcquireScratch(), &clear_slot);
388 Jump(on_result, distance);
391 __ bind(&clear_slot);
397 __ bind(&fallthrough);
398 Move(scratch_and_result, 0);
402 int32_t weight, Label* skip_interrupt_label) {
404 ScratchRegisterScope scratch_scope(
this);
405 Register feedback_cell = scratch_scope.AcquireScratch();
408 Register interrupt_budget = scratch_scope.AcquireScratch();
409 __ Lw(interrupt_budget,
412 __ Add32(interrupt_budget, interrupt_budget, weight);
413 __ Sw(interrupt_budget,
415 if (skip_interrupt_label) {
417 __ Branch(skip_interrupt_label,
ge, interrupt_budget, Operand(zero_reg));
422 Register weight, Label* skip_interrupt_label) {
424 ScratchRegisterScope scratch_scope(
this);
425 Register feedback_cell = scratch_scope.AcquireScratch();
428 Register interrupt_budget = scratch_scope.AcquireScratch();
429 __ Lw(interrupt_budget,
432 __ Add32(interrupt_budget, interrupt_budget, weight);
433 __ Sw(interrupt_budget,
435 if (skip_interrupt_label) {
436 __ Branch(skip_interrupt_label,
ge, interrupt_budget, Operand(zero_reg));
442 CompressionMode compression_mode) {
443 for (; depth > 0; --depth) {
451 uint32_t index, uint32_t depth) {
452 for (; depth > 0; --depth) {
461 for (; depth > 0; --depth) {
465 if (cell_index > 0) {
466 LoadTaggedField(context, context, SourceTextModule::kRegularExportsOffset);
470 LoadTaggedField(context, context, SourceTextModule::kRegularImportsOffset);
472 cell_index = -cell_index - 1;
479 int cell_index, uint32_t depth) {
480 for (; depth > 0; --depth) {
484 LoadTaggedField(context, context, SourceTextModule::kRegularExportsOffset);
493 BaselineAssembler::ScratchRegisterScope temps(
this);
494 Register tmp = temps.AcquireScratch();
501 __ LoadWord(tmp, lhs);
503 __ StoreWord(tmp, lhs);
508 __ And(output, lhs, Operand(rhs));
511 Label** labels,
int num_labels) {
514 if (case_value_base != 0) {
515 __ SubWord(
reg,
reg, Operand(case_value_base));
519 ScratchRegisterScope scope(
this);
523 imm64 =
__ branch_long_offset(&table);
524 CHECK(is_int32(imm64 + 0x800));
527 __ BlockTrampolinePoolFor(2);
529 __ addi(t6, t6, Lo12);
531 int entry_size_log2 = 3;
532 __ BlockTrampolinePoolFor(num_labels * 2 + 5);
533 __ CalcScaledAddress(t6, t6,
reg, entry_size_log2);
537 for (
int i = 0;
i < num_labels; ++
i) {
538 __ BranchLong(labels[
i]);
540 DCHECK_EQ(num_labels * 2,
__ InstructionsGeneratedSince(&table));
542 __ bind(&fallthrough);
554 Register params_size = BaselineLeaveFrameDescriptor::ParamsSizeRegister();
559 Label skip_interrupt_label;
567 __ CallRuntime(Runtime::kBytecodeBudgetInterrupt_Sparkplug, 1);
572 __ Bind(&skip_interrupt_label);
575 BaselineAssembler::ScratchRegisterScope temps(&basm);
576 Register actual_params_size = temps.AcquireScratch();
578 __ Move(actual_params_size,
583 Label corrected_args_count;
586 __ masm()->
Move(params_size, actual_params_size);
587 __ Bind(&corrected_args_count);
#define Assert(condition)
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 SmiUntag(Register reg, SBit s=LeaveCC)
void Move(Register dst, Tagged< Smi > smi)
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 Branch(Label *label, bool need_link=false)
void DropArguments(Register count)
bool is_reg(Register reg) const
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 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 LoadFunction(Register output)
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
Register ToRegister(BaselineAssembler *basm, BaselineAssembler::ScratchRegisterScope *scope, Arg arg)
void And(LiftoffAssembler *lasm, Register dst, Register lhs, Register rhs)
@ kUnsignedGreaterThanEqual
constexpr Register kInterpreterAccumulatorRegister
MemOperand FieldMemOperand(Register object, int offset)
constexpr int kSystemPointerSize
constexpr bool SmiValuesAre31Bits()
constexpr Register kContextRegister
Tagged< ClearedWeakValue > ClearedValue(PtrComprCageBase cage_base)
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr Register kJSFunctionRegister
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(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)