5#ifndef V8_BASELINE_PPC_BASELINE_ASSEMBLER_PPC_INL_H_
6#define V8_BASELINE_PPC_BASELINE_ASSEMBLER_PPC_INL_H_
30class BaselineAssembler::ScratchRegisterScope {
54template <
int w
idth = 64>
57 static_assert(width == 64 || width == 32,
58 "only support 64 and 32 bit compare");
83 interpreter::Register interpreter_register, Register rscratch) {
128 JumpIf(
cc, left, Operand(right), target, distance);
148 __ CmpS64(lhs, rhs, r0);
150 __ CmpU64(lhs, rhs, r0);
155#if V8_STATIC_ROOTS_BOOL
156void BaselineAssembler::JumpIfJSAnyIsPrimitive(Register heap_object,
159 __ AssertNotSmi(heap_object);
160 ScratchRegisterScope temps(
this);
161 Register scratch = temps.AcquireScratch();
162 __ JumpIfJSAnyIsPrimitive(heap_object, scratch, target, distance);
170 ScratchRegisterScope temps(
this);
171 Register scratch = temps.AcquireScratch();
173 Register scratch2 = temps.AcquireScratch();
174 __ IsObjectType(
object, scratch, scratch2, instance_type);
183 Register map, Label* target,
186 ScratchRegisterScope temps(
this);
187 Register type = temps.AcquireScratch();
190 JumpIf(
cc, type, Operand(instance_type), target);
197 ScratchRegisterScope temps(
this);
198 Register type = temps.AcquireScratch();
200 __ AssertNotSmi(map);
201 __ CompareObjectType(map, type, type, MAP_TYPE);
205 JumpIf(
cc, type, Operand(instance_type), target);
212 ScratchRegisterScope temps(
this);
213 Register tmp = temps.AcquireScratch();
214 __ LoadU64(tmp, operand, r0);
222 __ LoadSmiLiteral(r0, smi);
243 Register value, Label* target,
253 JumpIf(
cc, value, Operand(
byte), target);
263 __ mov(output, Operand(value.ptr()));
268 __ StoreU64(source, output, r0);
273 __ Move(output, reference);
283 __ mov(output, Operand(value));
288 __ mr(output, source);
293 __ mr(output, source);
298template <
typename Arg>
300 BaselineAssembler::ScratchRegisterScope* scope,
303 basm->Move(
reg, arg);
307 BaselineAssembler::ScratchRegisterScope* scope,
312template <
typename... Args>
315struct PushAllHelper<> {
322template <
typename Arg>
323struct PushAllHelper<Arg> {
330 return Push(basm, arg);
336template <
typename Arg,
typename... Args>
337struct PushAllHelper<Arg, Args...> {
349struct PushAllHelper<interpreter::RegisterList> {
351 for (
int reg_index = 0; reg_index < list.
register_count(); ++reg_index) {
366template <
typename... T>
369struct PopAllHelper<> {
381template <
typename... T>
382struct PopAllHelper<
Register, T...> {
391template <
typename... T>
393 return detail::PushAllHelper<T...>::Push(
this, vals...);
396template <
typename... T>
398 detail::PushAllHelper<T...>::PushReverse(
this, vals...);
401template <
typename... T>
403 detail::PopAllHelper<T...>::Pop(
this,
registers...);
426 Register source,
int offset) {
440 ScratchRegisterScope temps(
this);
441 Register tmp = temps.AcquireScratch();
442 __ LoadSmiLiteral(tmp, value);
464 Register feedback_vector,
471 __ LoadWeakValue(scratch_and_result, scratch_and_result, &fallthrough);
475 ScratchRegisterScope temps(
this);
478 __ LoadCodePointerField(
482 Register scratch = temps.AcquireScratch();
483 __ TestCodeIsMarkedForDeoptimization(scratch_and_result, scratch, r0);
484 __ beq(on_result, cr0);
491 __ bind(&fallthrough);
492 Move(scratch_and_result, 0);
496 int32_t weight, Label* skip_interrupt_label) {
498 ScratchRegisterScope scratch_scope(
this);
499 Register feedback_cell = scratch_scope.AcquireScratch();
502 Register interrupt_budget = scratch_scope.AcquireScratch();
505 FieldMemOperand(feedback_cell, FeedbackCell::kInterruptBudgetOffset), r0);
507 __ AddS32(interrupt_budget, interrupt_budget, Operand(weight), r0,
SetRC);
510 FieldMemOperand(feedback_cell, FeedbackCell::kInterruptBudgetOffset), r0);
511 if (skip_interrupt_label) {
514 __ bge(skip_interrupt_label, cr0);
519 Register weight, Label* skip_interrupt_label) {
521 ScratchRegisterScope scratch_scope(
this);
522 Register feedback_cell = scratch_scope.AcquireScratch();
525 Register interrupt_budget = scratch_scope.AcquireScratch();
528 FieldMemOperand(feedback_cell, FeedbackCell::kInterruptBudgetOffset), r0);
530 __ AddS32(interrupt_budget, interrupt_budget, weight,
SetRC);
533 FieldMemOperand(feedback_cell, FeedbackCell::kInterruptBudgetOffset), r0);
534 if (skip_interrupt_label)
__ bge(skip_interrupt_label, cr0);
539 CompressionMode compression_mode) {
541 for (; depth > 0; --depth) {
549 uint32_t index, uint32_t depth) {
551 for (; depth > 0; --depth) {
561 for (; depth > 0; --depth) {
565 if (cell_index > 0) {
566 LoadTaggedField(context, context, SourceTextModule::kRegularExportsOffset);
570 LoadTaggedField(context, context, SourceTextModule::kRegularImportsOffset);
572 cell_index = -cell_index - 1;
579 int cell_index, uint32_t depth) {
581 for (; depth > 0; --depth) {
585 LoadTaggedField(context, context, SourceTextModule::kRegularExportsOffset);
596 __ LoadS32(scratch, lhs, r0);
598 __ StoreU32(scratch, lhs, r0);
601 __ AddS64(scratch, scratch, Operand(1));
603 __ StoreU64(scratch, lhs, r0);
608 Label** labels,
int num_labels) {
610 Label fallthrough, jump_table;
611 if (case_value_base != 0) {
612 __ AddS64(
reg,
reg, Operand(-case_value_base));
618 int entry_size_log2 = 3;
619 __ ShiftLeftU32(
reg,
reg, Operand(entry_size_log2));
620 __ mov_label_addr(ip, &jump_table);
624 __ bind(&jump_table);
626 for (
int i = 0;
i < num_labels; ++
i) {
630 __ bind(&fallthrough);
634 __ AndU32(output, lhs, Operand(rhs));
646 Register params_size = BaselineLeaveFrameDescriptor::ParamsSizeRegister();
651 Label skip_interrupt_label;
660 __ CallRuntime(Runtime::kBytecodeBudgetInterrupt_Sparkplug, 1);
666 __ Bind(&skip_interrupt_label);
669 BaselineAssembler::ScratchRegisterScope temps(&basm);
670 Register actual_params_size = temps.AcquireScratch();
672 __ Move(actual_params_size,
677 Label corrected_args_count;
679 &corrected_args_count);
680 __ masm()->
mr(params_size, actual_params_size);
681 __ Bind(&corrected_args_count);
687 __ masm() -> DropArguments(params_size);
#define Assert(condition)
void mr(Register dst, Register src)
friend class BlockTrampolinePoolScope
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 Assert(Condition cond, AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void CmpU32(Register src1, const Operand &src2, Register scratch, CRegister cr=cr0)
void SmiTag(Register reg, SBit s=LeaveCC)
void Ret(Condition cond=al)
int LeaveFrame(StackFrame::Type type)
void CmpU64(Register src1, const Operand &src2, Register scratch, CRegister cr=cr0)
static constexpr Tagged< Smi > FromInt(int value)
static constexpr int kArgCOffset
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 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)
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
constexpr int32_t ToOperand() 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
Register ToRegister(BaselineAssembler *basm, BaselineAssembler::ScratchRegisterScope *scope, Arg arg)
static constexpr Register kScratchRegisters[]
static void JumpIfHelper(MacroAssembler *assm, Condition cc, Register lhs, Register rhs, Label *target)
@ kUnsignedGreaterThanEqual
constexpr Register kInterpreterAccumulatorRegister
MemOperand FieldMemOperand(Register object, int offset)
constexpr int kSystemPointerSize
constexpr bool SmiValuesAre31Bits()
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
Condition to_condition(Condition cond)
bool is_signed(Condition cond)
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)