5#ifndef V8_MAGLEV_X64_MAGLEV_ASSEMBLER_X64_INL_H_
6#define V8_MAGLEV_X64_MAGLEV_ASSEMBLER_X64_INL_H_
27 case Operation::kEqual:
28 case Operation::kStrictEqual:
30 case Operation::kLessThan:
32 case Operation::kLessThanOrEqual:
34 case Operation::kGreaterThan:
36 case Operation::kGreaterThanOrEqual:
78 :
Base(masm, saved_data),
118 if (map_count_ != 1) {
126 if (map_count_ == 1) {
128 masm_->JumpIf(cond, if_true, distance);
130 masm_->CompareTaggedAndJumpIf(
map_, map, cond, if_true, distance);
135 if (map_count_ == 1) {
148 return map_count == 1 ? 0 : 1;
153template <
typename... Args>
163 if (input.operand().IsConstant()) {
164 input.node()->LoadToRegister(masm, kScratchRegister);
165 masm->
Push(kScratchRegister);
170 compiler::AllocatedOperand::cast(input.operand());
181template <
typename T,
typename... Args>
182inline void PushIterator(MaglevAssembler* masm, base::iterator_range<T> range,
184 for (
auto iter = range.begin(),
end = range.end(); iter !=
end; ++iter) {
187 PushAllHelper<Args...>::Push(masm,
args...);
190template <
typename T,
typename... Args>
192 base::iterator_range<T> range, Args...
args) {
193 PushAllHelper<Args...>::PushReverse(masm,
args...);
194 for (
auto iter = range.rbegin(),
end = range.rend(); iter !=
end; ++iter) {
199template <
typename... Args>
211template <
typename Arg,
typename... Args>
217 masm->MacroAssembler::Push(arg);
233template <
typename... T>
235 detail::PushAllHelper<T...>::Push(
this, vals...);
238template <
typename... T>
240 detail::PushAllHelper<T...>::PushReverse(
this, vals...);
248 bind(block->label());
269 addl(scratch, scratch);
274 int value, Label* fail,
291 int value, Label* fail,
313 if (input.operand().IsRegister()) {
316 DCHECK(input.operand().IsStackSlot());
325 const compiler::AllocatedOperand& operand) {
330 const compiler::InstructionOperand& operand) {
342 data_pointer,
FieldOperand(
object, JSTypedArray::kExternalPointerOffset));
351 addq(data_pointer, base);
355 Register data_pointer, Register index,
int element_size) {
361 return Operand(data_pointer, index,
times_1, 0);
366 Register index,
int scale,
376#ifdef V8_ENABLE_SANDBOX
377 shrq(
result, Immediate(kBoundedSizeShift));
383#ifdef V8_ENABLE_SANDBOX
395 AbortReason::kUnexpectedNegativeValue);
408 Register
result, Register array, Register index) {
412 AbortReason::kUnexpectedNegativeValue);
424 AbortReason::kUnexpectedValue);
426 AbortReason::kUnexpectedNegativeValue);
443 }
else if (size == 2) {
455 }
else if (size == 2) {
469 Register slot_reg, Register
object, Register index) {
481 Register array, Register index, Register value) {
506 DCHECK(size == 1 || size == 2 || size == 4);
508 movb(operand, value);
509 }
else if (size == 2) {
510 movw(operand, value);
513 movl(operand, value);
517#ifdef V8_ENABLE_SANDBOX
519inline void MaglevAssembler::StoreTrustedPointerFieldNoWriteBarrier(
520 Register
object,
int offset, Register value) {
529 sarl(value, Immediate(16));
530 }
else if (size == 4) {
546 addl(
reg, Immediate(amount));
657#ifdef V8_COMPRESS_POINTERS
717 Label* max, Label* done) {
733template <
typename NodeT>
743 testl(scratch, Immediate(JSArrayBuffer::WasDetachedBit::kMask));
752 Register map, Register scratch) {
754 andl(scratch, Immediate(Map::Bits1::IsUndetectableBit::kMask |
755 Map::Bits1::IsCallableBit::kMask));
756 cmpl(scratch, Immediate(Map::Bits1::IsCallableBit::kMask));
761 Register map, Register scratch) {
763 Immediate(Map::Bits1::IsUndetectableBit::kMask |
764 Map::Bits1::IsCallableBit::kMask));
769 Register heap_object) {
770 LoadMap(instance_type, heap_object);
771 movzxwl(instance_type,
FieldOperand(instance_type, Map::kInstanceTypeOffset));
798 Register heap_object,
InstanceType type, Label* if_true,
799 Label::Distance true_distance,
bool fallthrough_when_true, Label* if_false,
802 Branch(
kEqual, if_true, true_distance, fallthrough_when_true, if_false,
803 false_distance, fallthrough_when_false);
833 Label* if_true,
Label::Distance true_distance,
bool fallthrough_when_true,
835 bool fallthrough_when_false) {
838 if_false, false_distance, fallthrough_when_false);
847#if V8_STATIC_ROOTS_BOOL
848inline void MaglevAssembler::JumpIfObjectInRange(Register heap_object,
854 DCHECK_LE(lower_limit, StaticReadOnlyRoot::kLastAllocatedRoot);
855 DCHECK_LE(higher_limit, StaticReadOnlyRoot::kLastAllocatedRoot);
861inline void MaglevAssembler::JumpIfObjectNotInRange(Register heap_object,
867 DCHECK_LE(lower_limit, StaticReadOnlyRoot::kLastAllocatedRoot);
868 DCHECK_LE(higher_limit, StaticReadOnlyRoot::kLastAllocatedRoot);
874inline void MaglevAssembler::AssertObjectInRange(Register heap_object,
879 DCHECK_LE(lower_limit, StaticReadOnlyRoot::kLastAllocatedRoot);
880 DCHECK_LE(higher_limit, StaticReadOnlyRoot::kLastAllocatedRoot);
905 Register map, Register instance_type_out,
InstanceType lower_limit,
922 JumpIf(cond, target, distance);
927 BasicBlock* if_true, BasicBlock* if_false, BasicBlock* next_block,
928 BasicBlock* nan_failed) {
931 Branch(cond, if_true, if_false, next_block);
935 int num_double_registers) {
937 num_double_registers);
950 jmp(target, distance);
963 ExternalReference counter = ExternalReference::stress_deopt_count(
isolate());
966 static constexpr size_t kSizeofRAX = 8;
977 RecordComment(
"-- deopt_every_n_times hit, jump to eager deopt");
1002 j(cond, target, distance);
1012 Label* if_not_equal,
1029 cmpb(value, Immediate(
byte));
1030 j(
cc, target, distance);
1041 ZoneLabelRef is_not_hole(
this);
1042 Ucomisd(value, value);
1046 ZoneLabelRef is_hole, ZoneLabelRef is_not_hole) {
1047 masm->Pextrd(scratch, value, 1);
1050 masm->Jump(*is_not_hole);
1052 value, scratch, is_hole, is_not_hole));
1060 Pextrd(scratch, value, 1);
1073 Ucomisd(value, value);
1079 Ucomisd(value, value);
1087 JumpIf(cond, target, distance);
1094 JumpIf(cond, target, distance);
1102 JumpIf(cond, target, distance);
1108 cmpq(r1, Immediate(value));
1109 JumpIf(cond, target, distance);
1113 Register r1, int32_t value,
Condition cond, Label* if_true,
1114 Label::Distance true_distance,
bool fallthrough_when_true, Label* if_false,
1117 Branch(cond, if_true, true_distance, fallthrough_when_true, if_false,
1118 false_distance, fallthrough_when_false);
1122 Register r1, Register r2,
Condition cond, Label* if_true,
1123 Label::Distance true_distance,
bool fallthrough_when_true, Label* if_false,
1126 Branch(cond, if_true, true_distance, fallthrough_when_true, if_false,
1127 false_distance, fallthrough_when_false);
1131 Register r1, int32_t value,
Condition cond, Label* if_true,
1132 Label::Distance true_distance,
bool fallthrough_when_true, Label* if_false,
1134 cmpq(r1, Immediate(value));
1135 Branch(cond, if_true, true_distance, fallthrough_when_true, if_false,
1136 false_distance, fallthrough_when_false);
1157 JumpIf(cond, target, distance);
1174 cmpb(left, Immediate(right));
1175 JumpIf(cond, target, distance);
1184 JumpIf(cond, target, distance);
1188 Handle<HeapObject> obj,
1193 JumpIf(cond, target, distance);
1201 cmp_tagged(src1, src2);
1202 JumpIf(cond, target, distance);
1225 testl(r1, Immediate(
mask));
1231 testl(operand, Immediate(
mask));
1243 testl(r1, Immediate(
mask));
1249 testl(operand, Immediate(
mask));
1260 Register heap_number) {
1265 Register heap_number) {
1270 Register heap_number) {
1294template <
typename NodeT>
1307 Assert(
equal, AbortReason::kStackAccessBelowStackPointer);
1312 int stack_check_offset) {
1316 leaq(stack_cmp_reg, Operand(rsp, -stack_check_offset));
1325template <
typename Dest,
typename Source>
1330 return movl(dst, src);
1335 return movq(dst, src);
#define Assert(condition)
interpreter::OperandScale scale
V8_INLINE void RecordComment(const char *comment, const SourceLocation &loc=SourceLocation::Current())
void load_rax(Address value, RelocInfo::Mode rmode)
void shll(const VRegister &vd, const VRegister &vn, int shift)
void store_rax(Address dst, RelocInfo::Mode mode)
void j(Condition cc, Label *L, Label::Distance distance=Label::kFar)
void pushq(Immediate value)
static constexpr int kIntraSegmentJmpInstrSize
void movb(Register dst, Operand src)
void movsxwl(Register dst, Register src)
void bswapq(Register dst)
void movw(Register reg, uint32_t immediate, Condition cond=al)
void movsxbl(Register dst, Register src)
void movq_heap_number(Register dst, double value)
void cmpb(Register reg, Immediate imm8)
void movsxlq(Register dst, Register src)
void movl(Operand dst, Label *src)
void testb(Register reg, Operand op)
void bswapl(Register dst)
void movq(XMMRegister dst, Operand src)
static bool IsSupported(CpuFeature f)
static constexpr int kMapOffset
uint64_t * stress_deopt_count_address()
static constexpr size_t kMaxSizeInHeap
static constexpr bool CanBeImmediate(RootIndex index)
Isolate * isolate() const
Tagged_t ReadOnlyRootPtr(RootIndex index)
void JumpIfRoot(Register with, RootIndex index, Label *if_equal)
void Cvtlui2sd(XMMRegister dst, Register src)
void Cmp(const Register &rn, int imm)
void IsObjectType(Register heap_object, Register scratch1, Register scratch2, InstanceType type)
void CmpInstanceTypeRange(Register map, Register instance_type_out, Register scratch, InstanceType lower_limit, InstanceType higher_limit)
void AssertNotSmi(Register object, AbortReason reason=AbortReason::kOperandIsASmi) NOOP_UNLESS_DEBUG_CODE
void JumpIfNotRoot(Register with, RootIndex index, Label *if_not_equal)
void CompareRoot(Register obj, RootIndex index)
void Move(Register dst, Tagged< Smi > smi)
void Cvtqsi2sd(XMMRegister dst, Register src)
void JumpIfSmi(Register value, Label *smi_label)
void LoadSandboxedPointerField(Register destination, MemOperand field_operand)
void Movq(XMMRegister dst, Register src)
void JumpIfJSAnyIsNotPrimitive(Register heap_object, Register scratch, Label *target, Label::Distance distance=Label::kFar, Condition condition=Condition::kUnsignedGreaterThanEqual)
void SmiTag(Register reg, SBit s=LeaveCC)
void EnterExitFrame(Register scratch, int stack_space, StackFrame::Type frame_type)
void Cvtsd2ss(XMMRegister dst, XMMRegister src)
void AssertSmi(Register object, AbortReason reason=AbortReason::kOperandIsNotASmi) NOOP_UNLESS_DEBUG_CODE
void IsObjectTypeInRange(Register heap_object, Register scratch, InstanceType lower_limit, InstanceType higher_limit)
void StoreTaggedField(const Register &value, const MemOperand &dst_field_operand)
void CompareRange(Register value, Register scratch, unsigned lower_limit, unsigned higher_limit)
void Cvtlsi2sd(XMMRegister dst, Register src)
void CmpInstanceType(Register map, InstanceType type)
void JumpIfNotSmi(Register value, Label *not_smi_label)
Operand StackLimitAsOperand(StackLimitKind kind)
void StoreTrustedPointerField(Register value, MemOperand dst_field_operand)
void Cvtss2sd(XMMRegister dst, XMMRegister src)
void PrepareCallCFunction(int num_reg_arguments, int num_double_registers=0, Register scratch=no_reg)
void BindJumpTarget(Label *label)
void StoreTaggedSignedField(Operand dst_field_operand, Tagged< Smi > value)
void LoadMap(Register destination, Register object)
void LoadTaggedFieldWithoutDecompressing(const Register &destination, const MemOperand &field_operand)
static constexpr Register no_reg()
@ COMPRESSED_EMBEDDED_OBJECT
void Pextrd(Register dst, XMMRegister src, uint8_t imm8)
static constexpr Tagged< Smi > FromInt(int value)
static constexpr int kFixedFrameSizeFromFp
Register GetRegister() const
static LocationOperand * cast(InstructionOperand *op)
TemporaryRegisterScope * prev_scope_
SavedData CopyForDeferBase()
Register AcquireScratch()
DoubleRegister AcquireScratchDouble()
void ResetToDefaultImpl()
bool has_scratch_register_
TemporaryRegisterScope(MaglevAssembler *masm)
bool has_double_scratch_register_
void IncludeScratch(Register reg)
TemporaryRegisterScope(MaglevAssembler *masm, const SavedData &saved_data)
void CompareMapWithRoot(Register object, RootIndex index, Register scratch)
void LoadFixedArrayElement(Register result, Register array, Register index)
void CompareInstanceType(Register map, InstanceType instance_type)
void SmiAddConstant(Register dst, Register src, int value, Label *fail, Label::Distance distance=Label::kFar)
void JumpIfByte(Condition cc, Register value, int32_t byte, Label *target, Label::Distance distance=Label::kFar)
void JumpIfNotNan(DoubleRegister value, Label *target, Label::Distance distance=Label::kFar)
Condition IsNotCallableNorUndetactable(Register map, Register scratch)
void JumpIfRoot(Register with, RootIndex index, Label *if_equal, Label::Distance distance=Label::kFar)
void ToUint8Clamped(Register result, DoubleRegister value, Label *min, Label *max, Label *done)
Condition IsCallableAndNotUndetectable(Register map, Register scratch)
void LoadFloat32(DoubleRegister dst, MemOperand src)
void JumpIfNotObjectType(Register heap_object, InstanceType type, Label *target, Label::Distance distance=Label::kFar)
void ReverseByteOrderAndStoreUnalignedFloat64(Register base, Register index, DoubleRegister src)
void AssertStackSizeCorrect()
void IncrementInt32(Register reg)
void IntPtrToDouble(DoubleRegister result, Register src)
void Branch(Condition condition, BasicBlock *if_true, BasicBlock *if_false, BasicBlock *next_block)
void AndInt32(Register reg, int mask)
void AddInt32(Register reg, int amount)
MemOperand GetStackSlot(const compiler::AllocatedOperand &operand)
void StoreField(MemOperand operand, Register value, int element_size)
void LoadSignedField(Register result, MemOperand operand, int element_size)
void DecrementInt32(Register reg)
void JumpIfSmi(Register src, Label *on_smi, Label::Distance near_jump=Label::kFar)
MaglevAssembler(Isolate *isolate, Zone *zone, MaglevCodeGenState *code_gen_state)
void TestUint8AndJumpIfAllClear(MemOperand operand, uint8_t mask, Label *target, Label::Distance distance=Label::kFar)
void AssertObjectTypeInRange(Register heap_object, InstanceType lower_limit, InstanceType higher_limit, AbortReason reason)
void CompareInt32AndAssert(Register r1, Register r2, Condition cond, AbortReason reason)
void CompareDoubleAndJumpIfZeroOrNaN(DoubleRegister reg, Label *target, Label::Distance distance=Label::kFar)
void LoadFixedDoubleArrayElement(DoubleRegister result, Register array, Register index)
void LoadUnsignedField(Register result, MemOperand operand, int element_size)
void JumpIfObjectTypeInRange(Register heap_object, InstanceType lower_limit, InstanceType higher_limit, Label *target, Label::Distance distance=Label::kFar)
void CheckInt32IsSmi(Register obj, Label *fail, Register scratch=Register::no_reg())
void PushReverse(T... vals)
void ReverseByteOrder(Register value, int element_size)
Condition FunctionEntryStackCheck(int stack_check_offset)
void EmitEagerDeoptStress(Label *label)
void LoadHeapNumberValue(DoubleRegister result, Register heap_number)
void Jump(Label *target, Label::Distance distance=Label::kFar)
MemOperand DataViewElementOperand(Register data_pointer, Register index)
void StoreTaggedSignedField(Register object, int offset, Register value)
void CompareSmiAndJumpIf(Register r1, Tagged< Smi > value, Condition cond, Label *target, Label::Distance distance=Label::kFar)
TemporaryRegisterScope * scratch_register_scope() const
void TestUint8AndJumpIfAnySet(MemOperand operand, uint8_t mask, Label *target, Label::Distance distance=Label::kFar)
void MoveRepr(MachineRepresentation repr, Dest dst, Source src)
void StoreFixedDoubleArrayElement(Register array, Register index, DoubleRegister value)
void SmiTagInt32AndSetFlags(Register dst, Register src)
void BindBlock(BasicBlock *block)
void LoadInstanceType(Register instance_type, Register heap_object)
void StoreHeapInt32Value(Register value, Register heap_number)
void LoadInt32(Register dst, MemOperand src)
void StoreFixedArrayElementNoWriteBarrier(Register array, Register index, Register value)
void LoadAddress(Register dst, MemOperand location)
void JumpIfJSAnyIsNotPrimitive(Register heap_object, Label *target, Label::Distance distance=Label::kFar)
void LoadBoundedSizeFromObject(Register result, Register object, int offset)
void SetSlotAddressForTaggedField(Register slot_reg, Register object, int offset)
void CompareFloat64AndBranch(DoubleRegister src1, DoubleRegister src2, Condition cond, BasicBlock *if_true, BasicBlock *if_false, BasicBlock *next_block, BasicBlock *nan_failed)
void CompareTaggedAndJumpIf(Register reg, Tagged< Smi > smi, Condition cond, Label *target, Label::Distance distance=Label::kFar)
void StoreInt32Field(Register object, int offset, int32_t value)
Register GetFramePointer()
void BranchOnObjectTypeInRange(Register heap_object, InstanceType lower_limit, InstanceType higher_limit, Label *if_true, Label::Distance true_distance, bool fallthrough_when_true, Label *if_false, Label::Distance false_distance, bool fallthrough_when_false)
void LoadExternalPointerField(Register result, MemOperand operand)
void StoreInt32(MemOperand dst, Register src)
void BuildTypedArrayDataPointer(Register data_pointer, Register object)
void JumpIfObjectTypeNotInRange(Register heap_object, InstanceType lower_limit, InstanceType higher_limit, Label *target, Label::Distance distance=Label::kFar)
void ShiftLeft(Register reg, int amount)
void JumpIfNotRoot(Register with, RootIndex index, Label *if_not_equal, Label::Distance distance=Label::kFar)
void EmitEnterExitFrame(int extra_slots, StackFrame::Type frame_type, Register c_function, Register scratch)
void BranchOnObjectType(Register heap_object, InstanceType type, Label *if_true, Label::Distance true_distance, bool fallthrough_when_true, Label *if_false, Label::Distance false_distance, bool fallthrough_when_false)
void LoadHeapInt32Value(Register result, Register heap_number)
void CompareInstanceTypeRange(Register map, InstanceType lower_limit, InstanceType higher_limit)
void Move(StackSlot dst, Register src)
void SignExtend32To64Bits(Register dst, Register src)
void LoadFixedArrayElementWithoutDecompressing(Register result, Register array, Register index)
void LoadUnalignedFloat64AndReverseByteOrder(DoubleRegister dst, Register base, Register index)
void IncrementAddress(Register reg, int32_t delta)
Label * MakeDeferredCode(Function &&deferred_code_gen, Args &&... args)
void JumpIfNan(DoubleRegister value, Label *target, Label::Distance distance=Label::kFar)
void TruncateDoubleToInt32(Register dst, DoubleRegister src)
void JumpIfNotSmi(Register src, Label *on_not_smi, Label::Distance near_jump=Label::kFar)
MemOperand TypedArrayElementOperand(Register data_pointer, Register index, int element_size)
MaglevCompilationInfo * compilation_info() const
void TestInt32AndJumpIfAllClear(Register r1, int32_t mask, Label *target, Label::Distance distance=Label::kFar)
int GetFramePointerOffsetForStackSlot(const compiler::AllocatedOperand &operand)
void CompareInt32AndJumpIf(Register r1, Register r2, Condition cond, Label *target, Label::Distance distance=Label::kFar)
MaglevCodeGenState * code_gen_state() const
void SetSlotAddressForFixedArrayElement(Register slot_reg, Register object, Register index)
void LoadTaggedFieldByIndex(Register result, Register object, Register index, int scale, int offset)
void CompareIntPtrAndJumpIf(Register r1, Register r2, Condition cond, Label *target, Label::Distance distance=Label::kFar)
void CompareInt32AndBranch(Register r1, int32_t value, Condition cond, BasicBlock *if_true, BasicBlock *if_false, BasicBlock *next_block)
void CompareSmiAndAssert(Register r1, Tagged< Smi > value, Condition cond, AbortReason reason)
void JumpIf(Condition cond, Label *target, Label::Distance distance=Label::kFar)
void LoadFloat64(DoubleRegister dst, MemOperand src)
void LoadUnalignedFloat64(DoubleRegister dst, Register base, Register index)
void LoadTaggedFieldWithoutDecompressing(Register result, Register object, int offset)
Condition IsRootConstant(Input input, RootIndex root_index)
void StoreFloat32(MemOperand dst, DoubleRegister src)
void EmitEagerDeoptIf(Condition cond, DeoptimizeReason reason, NodeT *node)
void StoreFloat64(MemOperand dst, DoubleRegister src)
void NegateInt32(Register val)
bool IsDeoptLabel(Label *label)
void EmitEagerDeoptIfNotEqual(DeoptimizeReason reason, NodeT *node)
void StoreTaggedFieldNoWriteBarrier(Register object, int offset, Register value)
MemOperand ToMemOperand(const compiler::InstructionOperand &operand)
void MoveHeapNumber(Register dst, double value)
void LoadTaggedField(Register result, MemOperand operand)
void LoadByte(Register dst, MemOperand src)
void MoveTagged(Register dst, Handle< HeapObject > obj)
void JumpIfNotHoleNan(DoubleRegister value, Register scratch, Label *target, Label::Distance distance=Label::kFar)
void DeoptIfBufferDetached(Register array, Register scratch, NodeT *node)
void StoreUnalignedFloat64(Register base, Register index, DoubleRegister src)
void TestInt32AndJumpIfAnySet(Register r1, int32_t mask, Label *target, Label::Distance distance=Label::kFar)
void JumpIfHoleNan(DoubleRegister value, Register scratch, Label *target, Label::Distance distance=Label::kFar)
void Uint32ToDouble(DoubleRegister result, Register src)
void CompareFloat64AndJumpIf(DoubleRegister src1, DoubleRegister src2, Condition cond, Label *target, Label *nan_failed, Label::Distance distance=Label::kFar)
void CompareIntPtrAndBranch(Register r1, int32_t value, Condition cond, BasicBlock *if_true, BasicBlock *if_false, BasicBlock *next_block)
void Int32ToDouble(DoubleRegister result, Register src)
void JumpIfObjectType(Register heap_object, InstanceType type, Label *target, Label::Distance distance=Label::kFar)
void AssertObjectType(Register heap_object, InstanceType type, AbortReason reason)
void SmiSubConstant(Register dst, Register src, int value, Label *fail, Label::Distance distance=Label::kFar)
void OrInt32(Register reg, int mask)
void BindJumpTarget(Label *label)
void JumpToDeopt(Label *target)
MemOperand StackSlotOperand(StackSlot slot)
void CompareByteAndJumpIf(MemOperand left, int8_t right, Condition cond, Register scratch, Label *target, Label::Distance distance=Label::kFar)
void PrepareCallCFunction(int num_reg_arguments, int num_double_registers=0)
void MaybeEmitPlaceHolderForDeopt()
static int TemporaryCount(size_t map_count)
MapCompare(MaglevAssembler *masm, Register object, size_t map_count)
void Generate(Handle< Map > map, Condition cond, Label *if_true, Label::Distance distance=Label::kFar)
static ZoneLabelRef UnsafeFromLabelPointer(Label *label)
#define COMPRESS_POINTERS_BOOL
base::Vector< const DirectHandle< Object > > args
ZoneVector< RpoNumber > & result
base::SmallVector< int32_t, 1 > stack_slots
MaglevAssembler *const masm_
FloatWithBits< 64 > Float64
void PushIterator(MaglevAssembler *masm, base::iterator_range< T > range, Args... args)
void PushIteratorReverse(MaglevAssembler *masm, base::iterator_range< T > range, Args... args)
void PushInput(MaglevAssembler *masm, const Input &input)
constexpr Condition ConditionForNaN()
ScaleFactor ScaleFactorFromInt(int n)
Register ToRegister(const compiler::InstructionOperand &operand)
constexpr Condition ConditionForFloat64(Operation operation)
NodeTMixin< Node, Derived > NodeT
constexpr VFPRoundingMode kRoundToNearest
constexpr int kTaggedSize
@ kUnsignedGreaterThanEqual
DwVfpRegister DoubleRegister
constexpr DoubleRegister kScratchDoubleReg
Operand FieldOperand(Register object, int offset)
MemOperand FieldMemOperand(Register object, int offset)
constexpr int kSystemPointerSize
constexpr int kStackLimitSlackForDeoptimizationInBytes
constexpr bool SmiValuesAre31Bits()
constexpr Register kScratchRegister
Condition NegateCondition(Condition cond)
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)
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr bool SmiValuesAre32Bits()
constexpr uint32_t kHoleNanUpper32
constexpr int kDoubleSize
#define DCHECK_LE(v1, v2)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
bool has_double_scratch_register_
bool has_scratch_register_
static void Push(MaglevAssembler *masm, Arg arg, Args... args)
static void PushReverse(MaglevAssembler *masm, Arg arg, Args... args)
static void PushReverse(MaglevAssembler *masm)
static void Push(MaglevAssembler *masm)
#define OFFSET_OF_DATA_START(Type)
#define V8_LIKELY(condition)
#define V8_UNLIKELY(condition)