65#define __ ACCESS_MASM(masm)
82 ExternalReference isolate_root = ExternalReference::isolate_root(
isolate());
100 if (
IsSmi(*
object)) {
110 ExternalReference isolate_root = ExternalReference::isolate_root(
isolate());
122 ExternalReference isolate_root = ExternalReference::isolate_root(
isolate());
164 unsigned higher_limit, Register scratch) {
167 if (lower_limit != 0) {
168 lea(scratch, Operand(value, 0u - lower_limit));
169 cmp(scratch, Immediate(higher_limit - lower_limit));
171 cmp(value, Immediate(higher_limit));
176 unsigned higher_limit, Register scratch,
179 CompareRange(value, lower_limit, higher_limit, scratch);
184 PushArrayOrder order) {
212 if (reference.IsIsolateFieldId()) {
213 return Operand(
kRootRegister, reference.offset_from_root_register());
215 if (
options().enable_root_relative_access) {
220 if (
options().isolate_independent_code) {
232 return Operand(scratch, 0);
236 Move(scratch, Immediate(reference));
237 return Operand(scratch, 0);
247 if (
isolate()->roots_table().IsRootHandle(
object, &root_index)) {
249 }
else if (
isolate()->builtins()->IsBuiltinHandle(
object, &builtin)) {
262 int constant_index) {
295 ExternalReference source) {
297 if (source.IsIsolateFieldId()) {
302 if (
options().isolate_independent_code) {
309 CHECK(!source.IsIsolateFieldId());
314 Register exclusion)
const {
328 Register exclusion) {
335 for (Register
reg : saved_regs) {
346#if V8_ENABLE_WEBASSEMBLY
366#if V8_ENABLE_WEBASSEMBLY
372 add(esp, Immediate(delta));
386 Register value, Register slot_address,
437 Register slot_address,
451 pop(slot_address_parameter);
452 pop(object_parameter);
459 Register slot_address,
474 pop(slot_address_parameter);
475 pop(object_parameter);
490#if V8_ENABLE_WEBASSEMBLY
491 if (mode == StubCallMode::kCallWasmRuntimeStub) {
511 if (
v8_flags.disable_write_barriers) {
518 cmp(value, Operand(slot_address, 0));
568 Register src_reg = src.is_reg_only() ? src.reg() :
tmp;
569 if (src_reg == tmp)
mov(tmp, src);
571 test(src_reg, src_reg);
575 if (src_reg != tmp)
mov(tmp, src_reg);
580 or_(tmp, Immediate(1));
592 Move(tmp,
static_cast<float>(INT32_MIN));
595 or_(dst, Immediate(0x80000000));
601 cmp(src, Immediate(0));
602 ExternalReference uint32_bias = ExternalReference::address_of_uint32_bias();
610 Move(tmp, -2147483648.0);
613 add(dst, Immediate(0x80000000));
633 test(ecx, Immediate(0x20));
657 test(ecx, Immediate(0x20));
682 test(ecx, Immediate(0x20));
694 Register scratch, Label* fbv_undef,
708 LoadRoot(dst, RootIndex::kUndefinedValue);
709 jmp(fbv_undef, distance);
726 Register instance_type_out,
733 CompareRange(instance_type_out, lower_limit, higher_limit, scratch);
747#ifndef V8_ENABLE_LEAPTIERING
748void TailCallOptimizedCodeSlot(MacroAssembler* masm,
749 Register optimized_code_entry) {
762 Label heal_optimized_code_slot;
769 __ mov(optimized_code_entry,
770 FieldOperand(optimized_code_entry, CodeWrapper::kCodeOffset));
779 __ Push(optimized_code_entry);
783 __ Pop(optimized_code_entry);
792 __ bind(&heal_optimized_code_slot);
801#ifdef V8_ENABLE_DEBUG_CODE
811 Assert(
equal, AbortReason::kExpectedFeedbackVector);
817 Register optimized_code, Register closure, Register value,
818 Register slot_address) {
820#ifdef V8_ENABLE_LEAPTIERING
825 mov(value, optimized_code);
840 FrameScope scope(
this, StackFrame::INTERNAL);
864#ifndef V8_ENABLE_LEAPTIERING
871 CodeKind current_code_kind, Label* flags_need_processing) {
878 movd(saved_feedback_vector, feedback_vector);
886 if (current_code_kind != CodeKind::MAGLEV) {
889 test_w(flags, Immediate(kFlagsMask));
894 Register flags,
XMMRegister saved_feedback_vector) {
896 Label maybe_has_optimized_code, maybe_needs_logging;
899 j(zero, &maybe_needs_logging);
903 bind(&maybe_needs_logging);
904 test(flags, Immediate(FeedbackVector::LogNextExecutionBit::kMask));
905 j(zero, &maybe_has_optimized_code);
908 bind(&maybe_has_optimized_code);
911 movd(feedback_vector, saved_feedback_vector);
912 mov(optimized_code_entry,
913 FieldOperand(feedback_vector, FeedbackVector::kMaybeOptimizedCodeOffset));
914 TailCallOptimizedCodeSlot(
this, optimized_code_entry);
919#ifdef V8_ENABLE_DEBUG_CODE
943 Immediate(Map::Bits1::IsConstructorBit::kMask));
957 LAST_JS_FUNCTION_TYPE);
982 Check(
not_equal, AbortReason::kOperandIsASmiAndNotABoundFunction);
986 Check(
equal, AbortReason::kOperandIsNotABoundFunction);
995 Check(
not_equal, AbortReason::kOperandIsASmiAndNotAGeneratorObject);
1005 LAST_JS_GENERATOR_OBJECT_TYPE);
1016 Label done_checking;
1018 CompareRoot(
object, scratch, RootIndex::kUndefinedValue);
1019 j(
equal, &done_checking);
1020 LoadRoot(scratch, RootIndex::kAllocationSiteWithWeakNextMap);
1022 Assert(
equal, AbortReason::kExpectedUndefinedOrCell);
1023 bind(&done_checking);
1071 Abort(abort_reason);
1140#if V8_ENABLE_WEBASSEMBLY
1150 Check(
equal, AbortReason::kStackFrameTypesMustMatch);
1163 Label touch_next_page;
1165 bind(&touch_next_page);
1166 sub(esp, Immediate(kStackPageSize));
1168 mov(Operand(esp, 0), Immediate(0));
1169 sub(bytes_scratch, Immediate(kStackPageSize));
1172 cmp(bytes_scratch, kStackPageSize);
1175 sub(esp, bytes_scratch);
1181 while (bytes >= kStackPageSize) {
1182 sub(esp, Immediate(kStackPageSize));
1183 mov(Operand(esp, 0), Immediate(0));
1184 bytes -= kStackPageSize;
1186 if (bytes == 0)
return;
1187 sub(esp, Immediate(bytes));
1193 Register c_function) {
1195 DCHECK(frame_type == StackFrame::EXIT ||
1196 frame_type == StackFrame::BUILTIN_EXIT ||
1197 frame_type == StackFrame::API_ACCESSOR_EXIT ||
1198 frame_type == StackFrame::API_CALLBACK_EXIT);
1213 using ER = ExternalReference;
1214 ER
r0 = ER::Create(IsolateAddressId::kCEntryFPAddress,
isolate());
1216 ER r1 = ER::Create(IsolateAddressId::kContextAddress,
isolate());
1219 ER r2 = ER::Create(IsolateAddressId::kCFunctionAddress,
isolate());
1226 if (kFrameAlignment > 0) {
1228 and_(esp, -kFrameAlignment);
1241 ExternalReference c_entry_fp_address =
1246 ExternalReference context_address =
1267 ExternalReference handler_address =
1278 ExternalReference handler_address =
1285 int num_arguments) {
1290 CHECK(f->nargs < 0 || f->nargs == num_arguments);
1298 bool switch_to_central_stack =
options().is_wasm;
1315 if (function->nargs >= 0) {
1326 bool builtin_exit_frame) {
1337 : IsolateData::jslimit_offset();
1349 Label* stack_overflow,
1350 bool include_receiver) {
1356 ExternalReference real_stack_limit =
1357 ExternalReference::address_of_real_jslimit(
isolate());
1365 if (include_receiver) {
1369 cmp(scratch, Immediate(0));
1376 Register actual_parameter_count,
1378 if (expected_parameter_count == actual_parameter_count)
return;
1381 DCHECK_EQ(expected_parameter_count, ecx);
1382 Label regular_invoke;
1386 sub(expected_parameter_count, actual_parameter_count);
1395 Label stack_overflow;
1404 Register src = edx, dest = esp, num = edi, current = ebx;
1412 lea(num, Operand(eax, extra_words));
1427 LoadRoot(scratch, RootIndex::kUndefinedValue);
1431 dec(expected_parameter_count);
1442 jmp(®ular_invoke);
1444 bind(&stack_overflow);
1452 bind(®ular_invoke);
1456 Register expected_parameter_count,
1457 Register actual_parameter_count) {
1474 SmiTag(expected_parameter_count);
1475 Push(expected_parameter_count);
1477 SmiTag(actual_parameter_count);
1478 Push(actual_parameter_count);
1496 Pop(actual_parameter_count);
1499 Pop(expected_parameter_count);
1500 SmiUntag(expected_parameter_count);
1504 Register expected_parameter_count,
1505 Register actual_parameter_count,
1512 DCHECK(expected_parameter_count == ecx || expected_parameter_count == eax);
1516 Label debug_hook, continue_after_hook;
1518 ExternalReference debug_hook_active =
1519 ExternalReference::debug_hook_on_function_call_address(
isolate());
1525 bind(&continue_after_hook);
1529 Move(edx,
isolate()->factory()->undefined_value());
1532 InvokePrologue(expected_parameter_count, actual_parameter_count, type);
1536 constexpr int unused_argument_count = 0;
1551 actual_parameter_count);
1552 jmp(&continue_after_hook);
1558 Register actual_parameter_count,
1568 FieldOperand(ecx, SharedFunctionInfo::kFormalParameterCountOffset));
1583 Map::kConstructorOrBackPointerOrNativeContextOffset));
1591 if (is_uint16(bytes_dropped)) {
1595 add(esp, Immediate(bytes_dropped));
1603 if (value.is_external_reference()) {
1604 ExternalReference reference = value.external_reference();
1605 if (reference.IsIsolateFieldId()) {
1607 add(Operand(esp, 0), Immediate(reference.offset_from_root_register()));
1610 if (
options().isolate_independent_code) {
1617 if (value.is_embedded_object()) {
1626 if (stack_elements > 0) {
1638 if (!src.is_heap_number_request() && src.is_zero()) {
1640 }
else if (src.is_external_reference()) {
1649 bool isolate_independent_code,
1650 const Immediate& src) {
1652 if (src.is_external_reference() &&
1653 src.external_reference().IsIsolateFieldId()) {
1656 if (isolate_independent_code) {
1657 if (src.is_external_reference())
return true;
1658 if (src.is_embedded_object())
return true;
1659 if (src.is_heap_number_request())
return true;
1670 options().isolate_independent_code, src)) {
1673 }
else if (src.is_embedded_object()) {
1674 mov(dst, src.embedded_object());
1697 if (nlz +
cnt + ntz == 32) {
1703 if (nlz != 0)
psrld(dst, nlz);
1707 mov(eax, Immediate(src));
1708 movd(dst, Operand(eax));
1718 uint32_t lower =
static_cast<uint32_t
>(src);
1719 uint32_t upper =
static_cast<uint32_t
>(src >> 32);
1723 if (nlz +
cnt + ntz == 64) {
1729 if (nlz != 0)
psrlq(dst, nlz);
1731 }
else if (lower == 0) {
1735 CpuFeatureScope scope(
this, SSE4_1);
1737 Move(eax, Immediate(lower));
1738 movd(dst, Operand(eax));
1739 if (upper != lower) {
1740 Move(eax, Immediate(upper));
1742 pinsrd(dst, Operand(eax), 1);
1745 push(Immediate(upper));
1746 push(Immediate(lower));
1747 movsd(dst, Operand(esp, 0));
1764 movsd(Operand(esp, 0), src);
1770 uint32_t* load_pc_offset) {
1777 movsd(Operand(esp, 0), dst);
1779 if (src.is_reg_only()) {
1786 movsd(dst, Operand(esp, 0));
1792 CpuFeatureScope scope(
this, LZCNT);
1800 bind(¬_zero_src);
1801 xor_(dst, Immediate(31));
1806 CpuFeatureScope scope(
this, BMI1);
1814 bind(¬_zero_src);
1819 CpuFeatureScope scope(
this, POPCNT);
1823 FATAL(
"no POPCNT support");
1829 j(
equal, target_if_cleared);
1837 if (
v8_flags.native_code_counters && counter->Enabled()) {
1844 add(operand, Immediate(value));
1852 if (
v8_flags.native_code_counters && counter->Enabled()) {
1859 sub(operand, Immediate(value));
1875 int frame_alignment_mask = frame_alignment - 1;
1878 Label alignment_as_expected;
1879 test(esp, Immediate(frame_alignment_mask));
1880 j(zero, &alignment_as_expected);
1883 bind(&alignment_as_expected);
1889 if (kFrameAlignment > 0) {
1891 DCHECK(is_int8(kFrameAlignment));
1892 and_(esp, Immediate(-kFrameAlignment));
1913 mov(Operand(esp, 0), Immediate(
static_cast<int>(reason)));
1942 if (frame_alignment != 0) {
1956 Label* return_location) {
1960 Move(eax, Immediate(function));
1961 return CallCFunction(eax, num_arguments, set_isolate_data_slots,
1967 Label* return_location) {
1984 if (function == eax) pc_scratch = edx;
1985 if (function == ecx) scratch = edx;
2001 if (return_location)
bind(return_location);
2015 return call_pc_offset;
2033 if (
isolate()->builtins()->IsBuiltinHandle(code_object, &builtin)) {
2038 call(code_object, rmode);
2055 IsolateData::builtin_entry_table_offset()));
2067 switch (
options().builtin_call_jump_mode) {
2088 switch (
options().builtin_call_jump_mode) {
2112 Register code_object,
2125 switch (jump_mode) {
2136#ifdef V8_ENABLE_LEAPTIERING
2137void MacroAssembler::LoadEntrypointFromJSDispatchTable(
2143 static_assert(kJSDispatchHandleShift == 0);
2148 LoadAddress(eax, ExternalReference::js_dispatch_table_address());
2150 JSDispatchEntry::kEntrypointOffset));
2156 uint16_t argument_count) {
2157#if V8_ENABLE_LEAPTIERING
2159 mov(ecx,
FieldOperand(function_object, JSFunction::kDispatchHandleOffset));
2160 LoadEntrypointFromJSDispatchTable(ecx, ecx);
2172#if V8_ENABLE_LEAPTIERING
2173 mov(ecx,
FieldOperand(function_object, JSFunction::kDispatchHandleOffset));
2174 LoadEntrypointFromJSDispatchTable(ecx, ecx);
2182#ifdef V8_ENABLE_WEBASSEMBLY
2184void MacroAssembler::ResolveWasmCodePointer(Register target) {
2187 Register scratch = target == eax ? ebx : eax;
2191 Move(scratch, Immediate(ExternalReference::wasm_code_pointer_table()));
2192 static_assert(
sizeof(wasm::WasmCodePointerTableEntry) == 4);
2193 Move(target, Operand(scratch, target, ScaleFactor::times_4, 0));
2197void MacroAssembler::CallWasmCodePointer(Register target,
2199 ResolveWasmCodePointer(target);
2219 if (
isolate()->builtins()->IsBuiltinHandle(code_object, &builtin)) {
2224 jmp(code_object, rmode);
2235 const int kInsDelta = 10;
2241 add(dst, Immediate(kInsDelta));
2248 constexpr intptr_t alignment_mask =
2250 if (header ==
object) {
2251 and_(header, Immediate(~alignment_mask));
2253 mov(header, Immediate(~alignment_mask));
2254 and_(header,
object);
2269 j(
cc, condition_met, condition_met_distance);
2283 sub(dst, Immediate(
pc));
2291#if V8_ENABLE_WEBASSEMBLY
2317 Register function_address,
2318 ExternalReference thunk_ref, Register thunk_arg,
2319 int slots_to_drop_on_return,
2324 using ER = ExternalReference;
2326 Isolate* isolate = masm->isolate();
2328 ER::handle_scope_next_address(isolate),
no_reg);
2330 ER::handle_scope_limit_address(isolate),
no_reg);
2332 ER::handle_scope_level_address(isolate),
no_reg);
2335 DCHECK(function_address == edx || function_address == eax);
2337 Register scratch = function_address == edx ? ecx : edx;
2342 Register prev_next_address_reg = esi;
2351 scratch, prev_next_address_reg, prev_limit_reg));
2353 scratch, prev_next_address_reg, prev_limit_reg));
2356 "Allocate HandleScope in callee-save registers.");
2357 __ add(level_mem_op, Immediate(1));
2358 __ mov(prev_next_address_reg, next_mem_op);
2359 __ mov(prev_limit_reg, limit_mem_op);
2362 Label profiler_or_side_effects_check_enabled, done_api_call;
2363 if (with_profiling) {
2364 __ RecordComment(
"Check if profiler or side effects check is enabled");
2367 __ j(
not_zero, &profiler_or_side_effects_check_enabled);
2368#ifdef V8_RUNTIME_CALL_STATS
2370 __ Move(scratch, Immediate(ER::address_of_runtime_stats_flag()));
2371 __ cmp(Operand(scratch, 0), Immediate(0));
2372 __ j(
not_zero, &profiler_or_side_effects_check_enabled);
2377 __ call(function_address);
2381 __ mov(return_value, return_value_operand);
2383 Label propagate_exception;
2384 Label delete_allocated_handles;
2385 Label leave_exit_frame;
2390 "No more valid handles (the result handle was the last one)."
2391 "Restore previous handle scope.");
2392 __ mov(next_mem_op, prev_next_address_reg);
2393 __ sub(level_mem_op, Immediate(1));
2395 __ cmp(prev_limit_reg, limit_mem_op);
2400 __ bind(&leave_exit_frame);
2401 Register argc_reg = prev_limit_reg;
2402 if (argc_operand !=
nullptr) {
2403 __ mov(argc_reg, *argc_operand);
2409 "Check if the function scheduled an exception.");
2411 ER::exception_address(isolate),
no_reg));
2417 AbortReason::kAPICallReturnedInvalidObject);
2419 if (argc_operand ==
nullptr) {
2430 if (with_profiling) {
2432 __ bind(&profiler_or_side_effects_check_enabled);
2434 if (thunk_arg.is_valid()) {
2436 IsolateFieldId::kApiCallbackThunkArgument);
2437 __ mov(thunk_arg_mem_op, thunk_arg);
2439 __ Move(scratch, Immediate(thunk_ref));
2441 __ jmp(&done_api_call);
2445 __ bind(&propagate_exception);
2450 masm,
"HandleScope limit has changed. Delete allocated extensions.");
2451 __ bind(&delete_allocated_handles);
2452 __ mov(limit_mem_op, prev_limit_reg);
2454 Register saved_result = prev_limit_reg;
2455 __ mov(saved_result, return_value);
2456 __ Move(scratch, Immediate(ER::isolate_address()));
2457 __ mov(Operand(esp, 0), scratch);
2458 __ Move(scratch, Immediate(ER::delete_handle_scope_extensions()));
2460 __ mov(return_value, saved_result);
2461 __ jmp(&leave_exit_frame);
2475 cmp(dst, Immediate(src));
#define Assert(condition)
static int ActivationFrameAlignment()
V8_INLINE void RecordComment(const char *comment, const SourceLocation &loc=SourceLocation::Current())
const AssemblerOptions & options() const
void test_w(Register reg, Operand op)
void popcnt(Register dst, Register src)
void and_(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void movss(XMMRegister dst, Operand src)
void lzcnt(Register dst, Register src)
void sar(Register dst, uint8_t imm8)
void psllq(XMMRegister reg, uint8_t shift)
void psrlq(XMMRegister reg, uint8_t shift)
void mov_w(Register dst, Operand src)
void j(Condition cc, Label *L, Label::Distance distance=Label::kFar)
void movd(XMMRegister dst, Register src)
void shrd_cl(Register dst, Register src)
void add(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void cmpw(Operand dst, Immediate src)
void shl_cl(Register dst)
void cmp(Register src1, const Operand &src2, Condition cond=al)
void cvttsd2si(Register dst, Operand src)
void test_b(Register reg, Operand op)
void shrd(Register dst, Register src, uint8_t shift)
void psrld(XMMRegister reg, uint8_t shift)
void pinsrd(XMMRegister dst, Register src, uint8_t offset)
void shift(Operand dst, Immediate shift_amount, int subcode, int size)
void or_(Register dst, int32_t imm32)
void movzx_w(Register dst, Register src)
void sub(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void xor_(Register dst, int32_t imm32)
void shld_cl(Register dst, Register src)
void bsf(Register dst, Register src)
void movsd(XMMRegister dst, XMMRegister src)
void cvtsi2sd(XMMRegister dst, Register src)
void pslld(XMMRegister reg, uint8_t shift)
void cmpb(Register reg, Immediate imm8)
void shr_cl(Register dst)
void wasm_call(Address address, RelocInfo::Mode rmode)
void ext(const VRegister &vd, const VRegister &vn, const VRegister &vm, int index)
void lea(Register dst, Operand src)
void cnt(const VRegister &vd, const VRegister &vn)
void bsr(Register dst, Register src)
void shl(const VRegister &vd, const VRegister &vn, int shift)
void sar_cl(Register dst)
void cvtsi2ss(XMMRegister dst, Register src)
void cvttss2si(Register dst, Operand src)
void tzcnt(Register dst, Register src)
void shld(Register dst, Register src, uint8_t shift)
int SizeOfCodeGeneratedSince(Label *label)
void addss(XMMRegister dst, XMMRegister src)
static constexpr Builtin RecordWrite(SaveFPRegsMode fp_mode)
static bool IsIsolateIndependentBuiltin(Tagged< Code > code)
V8_EXPORT_PRIVATE Handle< Code > code_handle(Builtin builtin)
static constexpr Builtin RuntimeCEntry(int result_size, bool switch_to_central_stack=false)
static constexpr Builtin EphemeronKeyBarrier(SaveFPRegsMode fp_mode)
static constexpr bool IsBuiltinId(Builtin builtin)
static constexpr Builtin CEntry(int result_size, ArgvMode argv_mode, bool builtin_exit_frame=false, bool switch_to_central_stack=false)
static const int kMarkedForDeoptimizationBit
static constexpr int kContextOrFrameTypeOffset
static constexpr int kCallerFPOffset
static constexpr int kCallerPCOffset
static const int kInvalidContext
static V8_INLINE constexpr int SlotOffset(int index)
static bool IsSupported(CpuFeature f)
static V8_EXPORT_PRIVATE const int kEagerDeoptExitSize
static V8_EXPORT_PRIVATE const int kLazyDeoptExitSize
static constexpr int kSPOffset
static constexpr int kCallerSPDisplacement
static ExternalReference Create(const SCTableReference &table_ref)
static constexpr uint32_t kFlagsMaybeHasMaglevCode
static constexpr uint32_t kFlagsTieringStateIsAnyRequested
static constexpr uint32_t kFlagsLogNextExecution
static constexpr uint32_t kFlagsMaybeHasTurbofanCode
static constexpr int kMapOffset
static constexpr int BuiltinEntrySlotOffset(Builtin id)
static constexpr int real_jslimit_offset()
Handle< Object > root_handle(RootIndex index)
Address BuiltinEntry(Builtin builtin)
static bool IsAddressableThroughRootRegister(Isolate *isolate, const ExternalReference &reference)
V8_INLINE std::string CommentForOffHeapTrampoline(const char *prefix, Builtin builtin)
static int32_t RootRegisterOffsetForExternalReferenceTableEntry(Isolate *isolate, const ExternalReference &reference)
static int32_t RootRegisterOffsetForRootIndex(RootIndex root_index)
Isolate * isolate() const
IndirectHandle< HeapObject > code_object_
bool root_array_available() const
void IndirectLoadConstant(Register destination, Handle< HeapObject > object)
static intptr_t RootRegisterOffsetForExternalReference(Isolate *isolate, const ExternalReference &reference)
bool should_abort_hard() const
void IndirectLoadExternalReference(Register destination, ExternalReference reference)
static int32_t RootRegisterOffsetForBuiltin(Builtin builtin)
void PextrdPreSse41(Register dst, XMMRegister src, uint8_t imm8)
void Tzcnt(Register dst, Register src)
void LoadLabelAddress(Register dst, Label *lbl)
void Abort(AbortReason msg)
void InitializeRootRegister()
void Call(Register target, Condition cond=al)
void CallJSFunction(Register function_object, uint16_t argument_count)
void CallDebugOnFunctionCall(Register fun, Register new_target, Register expected_parameter_count, Register actual_parameter_count)
void LoadAddress(Register destination, ExternalReference source)
void TestCodeIsMarkedForDeoptimization(Register code, Register scratch)
void JumpIfIsInRange(Register value, Register scratch, unsigned lower_limit, unsigned higher_limit, Label *on_in_range)
void Drop(int count, Condition cond=al)
void ShlPair_cl(Register high, Register low)
void mov(Register rd, Register rj)
void CmpInstanceTypeRange(Register map, Register instance_type_out, Register scratch, InstanceType lower_limit, InstanceType higher_limit)
void SmiUntag(Register reg, SBit s=LeaveCC)
void AssertFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void AssertNotSmi(Register object, AbortReason reason=AbortReason::kOperandIsASmi) NOOP_UNLESS_DEBUG_CODE
void CompareStackLimit(Register with, StackLimitKind kind)
void AssertGeneratorObject(Register object) NOOP_UNLESS_DEBUG_CODE
void SarPair(Register high, Register low, uint8_t imm8)
void CompareRoot(Register obj, RootIndex index)
void Move(Register dst, Tagged< Smi > smi)
void Assert(Condition cond, AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void StackOverflowCheck(Register num_args, Register scratch, Label *stack_overflow)
void AssertFeedbackVector(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void CallBuiltinByIndex(Register builtin_index, Register target)
void LoadRootRelative(Register destination, int32_t offset) final
void JumpIfSmi(Register value, Label *smi_label)
void CallCodeObject(Register code_object)
void AssertUnreachable(AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void LoadRootRegisterOffset(Register destination, intptr_t offset) final
void LoadCodeInstructionStart(Register destination, Register code_object, CodeEntrypointTag tag=kDefaultCodeEntrypointTag)
void LoadFeedbackVectorFlagsAndJumpIfNeedsProcessing(Register flags, Register feedback_vector, CodeKind current_code_kind, Label *flags_need_processing)
void LoadFeedbackVector(Register dst, Register closure, Register scratch, Label *fbv_undef)
void EmitIncrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void near_jump(int offset, RelocInfo::Mode rmode)
void InvokeFunctionCode(Register function, Register new_target, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
int RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg) const
void InvokePrologue(Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void SmiTag(Register reg, SBit s=LeaveCC)
void Cvttsd2ui(Register dst, XMMRegister src, XMMRegister tmp)
void PushArray(Register array, Register size, Register scratch, PushArrayOrder order=PushArrayOrder::kNormal)
void EnterExitFrame(Register scratch, int stack_space, StackFrame::Type frame_type)
void RecordWriteField(Register object, int offset, Register value, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline)
MemOperand ExternalReferenceAsOperand(ExternalReference reference, Register scratch)
void CmpObjectType(Register heap_object, InstanceType type, Register map)
void AssertSmi(Register object, AbortReason reason=AbortReason::kOperandIsNotASmi) NOOP_UNLESS_DEBUG_CODE
void Cvtui2sd(XMMRegister dst, Register src, Register scratch)
void SarPair_cl(Register high, Register low)
void ShlPair(Register high, Register low, uint8_t imm8)
int LeaveFrame(StackFrame::Type type)
int PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
void LoadGlobalProxy(Register dst)
void ShrPair(Register high, Register low, uint8_t imm8)
void JumpToExternalReference(const ExternalReference &builtin, bool builtin_exit_frame=false)
Operand ClearedValue() const
void Cvtsi2sd(XMMRegister dst, Register src)
Operand RootAsOperand(RootIndex index)
void Jump(Register target, Condition cond=al)
void LoadRoot(Register destination, RootIndex index) final
void RecordWrite(Register object, Operand offset, Register value, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline)
void PushRoot(RootIndex index)
void EnterFrame(StackFrame::Type type, bool load_constant_pool_pointer_reg=false)
void InvokeFunction(Register function, Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
void Lzcnt(Register dst, Register src)
void CompareRange(Register value, Register scratch, unsigned lower_limit, unsigned higher_limit)
void JumpCodeObject(Register code_object, JumpMode jump_mode=JumpMode::kJump)
void EmitDecrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void LoadFromConstantsTable(Register destination, int constant_index) final
MemOperand EntryFromBuiltinAsOperand(Builtin builtin)
void CmpInstanceType(Register map, InstanceType type)
void ComputeCodeStartAddress(Register dst)
void MaybeSaveRegisters(RegList registers)
void CheckPageFlag(Register object, int mask, Condition cc, Label *condition_met)
int CallCFunction(ExternalReference function, int num_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_label=nullptr)
void JumpJSFunction(Register function_object, JumpMode jump_mode=JumpMode::kJump)
void AssertConstructor(Register object) NOOP_UNLESS_DEBUG_CODE
void CheckStackAlignment()
void CallRuntime(const Runtime::Function *f, int num_arguments)
void LoadWeakValue(Register out, Register in, Label *target_if_cleared)
void CallBuiltin(Builtin builtin, Condition cond=al)
void GenerateTailCallToReturnedCode(Runtime::FunctionId function_id)
void AssertJSAny(Register object, Register map_tmp, Register tmp, AbortReason abort_reason) NOOP_UNLESS_DEBUG_CODE
void Cvtsi2ss(XMMRegister dst, Register src)
void CallEphemeronKeyBarrier(Register object, Operand offset, SaveFPRegsMode fp_mode)
Operand StackLimitAsOperand(StackLimitKind kind)
void Check(Condition cond, AbortReason reason)
void AssertFeedbackCell(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void CallForDeoptimization(Builtin target, int deopt_id, Label *exit, DeoptimizeKind kind, Label *ret, Label *jump_deoptimization_entry_label)
void DropArgumentsAndPushNewReceiver(Register argc, Register receiver)
void AllocateStackSpace(Register bytes)
void LoadEntryFromBuiltinIndex(Register builtin_index, Register target)
void PushReturnAddressFrom(Register src)
void Popcnt(Register dst, Register src)
void ShrPair_cl(Register high, Register low)
void ReplaceClosureCodeWithOptimizedCode(Register optimized_code, Register closure)
void AssertBoundFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void CallRecordWriteStubSaveRegisters(Register object, Operand offset, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void PinsrdPreSse41(XMMRegister dst, Register src, uint8_t imm8, uint32_t *load_pc_offset)
void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags, Register feedback_vector)
void PrepareCallCFunction(int num_reg_arguments, int num_double_registers=0, Register scratch=no_reg)
void MaybeRestoreRegisters(RegList registers)
void CallRecordWriteStub(Register object, Register slot_address, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
void MemoryChunkHeaderFromObject(Register object, Register header)
int PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
void AssertUndefinedOrAllocationSite(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void SmiCompare(Register smi1, Register smi2)
void Cvtui2ss(XMMRegister dst, Register src, Register tmp)
void StubPrologue(StackFrame::Type type)
void StoreRootRelative(int32_t offset, Register value) final
void LoadMap(Register destination, Register object)
void TailCallRuntime(Runtime::FunctionId fid)
void LoadNativeContextSlot(Register dst, int index)
Operand HeapObjectAsOperand(Handle< HeapObject > object)
void PopReturnAddressTo(Register dst)
void TailCallBuiltin(Builtin builtin, Condition cond=al)
void DropArguments(Register count)
void Cvttss2ui(Register dst, XMMRegister src, XMMRegister tmp)
void AssertCallableFunction(Register object) NOOP_UNLESS_DEBUG_CODE
static constexpr MainThreadFlags kPointersToHereAreInterestingMask
static constexpr intptr_t FlagsOffset()
static constexpr MainThreadFlags kPointersFromHereAreInterestingMask
static constexpr intptr_t GetAlignmentMaskForAssembler()
constexpr unsigned Count() const
static constexpr bool IsCodeTarget(Mode mode)
static constexpr bool IsImmortalImmovable(RootIndex root_index)
static V8_EXPORT_PRIVATE const Function * FunctionForId(FunctionId id)
static constexpr Tagged< Smi > FromInt(int value)
Operand GetArgumentOperand(int index) const
static constexpr int32_t TypeToMarker(Type type)
static bool IsJavaScript(Type t)
static const int kNextOffset
static constexpr int OffsetOfElementAt(int index)
static constexpr Register ObjectRegister()
static constexpr RegList ComputeSavedRegisters(Register object, Register slot_address=no_reg)
static constexpr Register SlotAddressRegister()
static constexpr Builtin GetRecordWriteBuiltin(SaveFPRegsMode fp_mode)
#define ASM_CODE_COMMENT_STRING(asm,...)
#define ASM_CODE_COMMENT(asm)
#define V8_ENABLE_SANDBOX_BOOL
DirectHandle< Object > new_target
RegListBase< RegisterT > registers
InstructionOperand destination
constexpr unsigned CountTrailingZeros64(uint64_t value)
constexpr unsigned CountTrailingZeros32(uint32_t value)
constexpr unsigned CountLeadingZeros64(uint64_t value)
constexpr unsigned CountPopulation(T value)
constexpr bool IsPowerOfTwo(T value)
constexpr unsigned CountLeadingZeros32(uint32_t value)
V8_INLINE Dest bit_cast(Source const &source)
uint32_t WasmInterpreterRuntime int64_t r0
constexpr Register no_reg
constexpr Register kRootRegister
constexpr int kTaggedSize
constexpr Register kRuntimeCallFunctionRegister
constexpr int kBitsPerByte
RegListBase< Register > RegList
constexpr bool CodeKindCanTierUp(CodeKind kind)
constexpr Register kJavaScriptCallTargetRegister
constexpr int kPCOnStackSize
Operand FieldOperand(Register object, int offset)
constexpr int kStackSavedSavedFPSize
const Address kWeakHeapObjectMask
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
constexpr Register kJavaScriptCallArgCountRegister
constexpr int kSystemPointerSize
const RegList kCallerSaved
const char * GetAbortReason(AbortReason reason)
static constexpr int kMaxCParameters
constexpr uint32_t kZapValue
@ LAST_CALLABLE_JS_FUNCTION_TYPE
@ FIRST_CALLABLE_JS_FUNCTION_TYPE
constexpr Register kWasmImplicitArgRegister
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)
constexpr Register kRuntimeCallArgCountRegister
Tagged< ClearedWeakValue > ClearedValue(PtrComprCageBase cage_base)
V8_INLINE constexpr bool IsHeapObject(TaggedImpl< kRefType, StorageType > obj)
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr int kUInt32Size
constexpr Register kJavaScriptCallCodeStartRegister
constexpr int kJSDispatchTableEntrySizeLog2
const intptr_t kSmiTagMask
void CallApiFunctionAndReturn(MacroAssembler *masm, bool with_profiling, Register function_address, ExternalReference thunk_ref, Register thunk_arg, int slots_to_drop_on_return, MemOperand *argc_operand, MemOperand return_value_operand)
@ times_system_pointer_size
@ times_half_system_pointer_size
constexpr int kDoubleSize
static constexpr DoubleRegList kAllocatableDoubleRegisters
const uint32_t kClearedWeakHeapObjectLower32
constexpr Register kJavaScriptCallNewTargetRegister
constexpr Register kJSFunctionRegister
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define DCHECK_LE(v1, v2)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
constexpr bool IsAligned(T value, U alignment)