5#ifndef V8_BASELINE_S390_BASELINE_ASSEMBLER_S390_INL_H_
6#define V8_BASELINE_S390_BASELINE_ASSEMBLER_S390_INL_H_
29class BaselineAssembler::ScratchRegisterScope {
53template <
int w
idth = 64>
56 static_assert(width == 64 || width == 32,
57 "only support 64 and 32 bit compare");
83 interpreter::Register interpreter_register, Register rscratch) {
84 return __ AddS64(rscratch, fp,
127 JumpIf(
cc, left, Operand(right), target, distance);
139 __ AndP(r0, value, Operand(
mask));
158 ScratchRegisterScope temps(
this);
159 Register scratch = temps.AcquireScratch();
165 Register map, Label* target,
168 ScratchRegisterScope temps(
this);
169 Register type = temps.AcquireScratch();
172 JumpIf(
cc, type, Operand(instance_type), target);
179 ScratchRegisterScope temps(
this);
180 Register type = temps.AcquireScratch();
182 __ AssertNotSmi(map);
183 __ CompareObjectType(map, type, type, MAP_TYPE);
187 JumpIf(
cc, type, Operand(instance_type), target);
194 ScratchRegisterScope temps(
this);
195 Register tmp = temps.AcquireScratch();
196 __ LoadU64(tmp, operand);
204 __ LoadSmiLiteral(r0, smi);
216#ifdef V8_TARGET_BIG_ENDIAN
226 DCHECK(operand.
rb() == fp || operand.
rx() == fp);
241 DCHECK(operand.
rb() == fp || operand.
rx() == fp);
254 JumpIf(
cc, value, Operand(
byte), target);
263 __ mov(output, Operand(value.ptr()));
268 __ StoreU64(source, output);
273 __ Move(output, reference);
283 __ mov(output, Operand(value));
288 __ mov(output, source);
293 __ mov(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>
330 return Push(basm, arg);
336template <
typename Arg,
typename... Args>
337struct PushAllHelper<Arg, Args...> {
351 for (
int reg_index = 0; reg_index < list.
register_count(); ++reg_index) {
366template <
typename... T>
381template <
typename... 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);
482 Register scratch = temps.AcquireScratch();
483 __ TestCodeIsMarkedForDeoptimization(scratch_and_result, scratch);
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();
507 __ AddS32(interrupt_budget, Operand(weight));
510 FieldMemOperand(feedback_cell, FeedbackCell::kInterruptBudgetOffset), r0);
511 if (skip_interrupt_label) {
514 __ b(
ge, skip_interrupt_label);
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();
530 __ AddS32(interrupt_budget, interrupt_budget, weight);
534 if (skip_interrupt_label)
__ b(
ge, skip_interrupt_label);
539 CompressionMode compression_mode) {
540 for (; depth > 0; --depth) {
548 uint32_t index, uint32_t depth) {
549 for (; depth > 0; --depth) {
558 for (; depth > 0; --depth) {
562 if (cell_index > 0) {
563 LoadTaggedField(context, context, SourceTextModule::kRegularExportsOffset);
567 LoadTaggedField(context, context, SourceTextModule::kRegularImportsOffset);
569 cell_index = -cell_index - 1;
576 int cell_index, uint32_t depth) {
577 for (; depth > 0; --depth) {
581 LoadTaggedField(context, context, SourceTextModule::kRegularExportsOffset);
593 DCHECK(lhs.rb() == fp || lhs.rx() == fp);
595 __ LoadS32(scratch, addr);
597 __ StoreU32(scratch, addr);
600 __ AddU64(scratch, Operand(1));
602 __ StoreU64(scratch, lhs);
607 __ AndP(output, lhs, Operand(rhs));
611 Label** labels,
int num_labels) {
613 Label fallthrough, jump_table;
614 if (case_value_base != 0) {
615 __ AddS64(
reg, Operand(-case_value_base));
619 ScratchRegisterScope scope(
this);
622 int entry_size_log2 = 3;
623 __ ShiftLeftU32(
reg,
reg, Operand(entry_size_log2));
624 __ larl(r1, &jump_table);
628 __ bind(&jump_table);
629 for (
int i = 0;
i < num_labels; ++
i) {
633 __ bind(&fallthrough);
645 Register params_size = BaselineLeaveFrameDescriptor::ParamsSizeRegister();
650 Label skip_interrupt_label;
659 __ CallRuntime(Runtime::kBytecodeBudgetInterrupt_Sparkplug, 1);
665 __ Bind(&skip_interrupt_label);
668 BaselineAssembler::ScratchRegisterScope temps(&basm);
669 Register actual_params_size = temps.AcquireScratch();
671 __ Move(actual_params_size,
676 Label corrected_args_count;
678 &corrected_args_count);
679 __ masm()->
mov(params_size, actual_params_size);
680 __ Bind(&corrected_args_count);
686 __ masm() -> DropArguments(params_size);
#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 mov(Register rd, Register rj)
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)
static constexpr int stack_bias
@ 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)