47#define __ ACCESS_MASM(masm)
66 if (is_int32(delta)) {
83 if (is_int32(delta)) {
89 if (source == rax && !
options().isolate_independent_code) {
124 ExternalReference source) {
126 if (source.IsIsolateFieldId()) {
131 if (
options().enable_root_relative_access) {
134 if (is_int32(delta)) {
138 }
else if (
options().isolate_independent_code) {
149 if (reference.IsIsolateFieldId()) {
150 return Operand(
kRootRegister, reference.offset_from_root_register());
152 if (
options().enable_root_relative_access) {
155 if (is_int32(delta)) {
159 if (
options().isolate_independent_code) {
172 return Operand(scratch, 0);
176 Move(scratch, reference);
177 return Operand(scratch, 0);
192 std::is_same_v<Tagged_t, uint32_t>);
232 cmp_tagged(with, Immediate(
static_cast<uint32_t
>(
ReadOnlyRootPtr(index))));
244 cmp_tagged(with, Immediate(
static_cast<uint32_t
>(
ReadOnlyRootPtr(index))));
278 TaggedRegister feedback_cell(dst);
280 FieldOperand(closure, JSFunction::kFeedbackCellOffset));
288 LoadRoot(dst, RootIndex::kUndefinedValue);
289 jmp(fbv_undef, distance);
295 Operand field_operand) {
304 Operand field_operand) {
314void MacroAssembler::UnpackMapWord(Register
r) {
317 shlq(
r, Immediate(16));
318 shrq(
r, Immediate(16));
319 xorq(
r, Immediate(Internals::kMapWordXorMask));
324 Operand field_operand) {
334 DCHECK(!field_operand.AddressUsesRegister(scratch));
353 movl(dst_field_operand, value);
355 movq(dst_field_operand, value);
362 movl(dst_field_operand, value);
364 movq(dst_field_operand, value);
390 Operand field_operand) {
396 Operand field_operand) {
416 Operand field_operand) {
422 Operand{
kRootRegister, IsolateData::trusted_cage_base_offset()});
429 Register value, Register slot_address,
433 SlotDescriptor slot) {
440#if V8_STATIC_ROOTS_BOOL
483#ifdef V8_ENABLE_SANDBOX
485 shlq(value, Immediate(kSandboxedPointerShift));
493#ifdef V8_ENABLE_SANDBOX
494 shrq(value, Immediate(kSandboxedPointerShift));
502 Operand field_operand) {
521 IsolateRootLocation isolateRootLocation) {
523#ifdef V8_ENABLE_SANDBOX
524 DCHECK(!tag_range.IsEmpty());
526 DCHECK(!field_operand.AddressUsesRegister(scratch));
532 IsolateData::external_pointer_table_offset() +
538 IsolateData::external_pointer_table_offset() +
542 shrq(
destination, Immediate(kExternalPointerIndexShift));
543 static_assert(kExternalPointerTableEntrySize == 8);
551 if (tag_range.Size() == 1) {
556 cmpl(scratch, Immediate(tag_range.first));
571 Operand field_operand,
574#ifdef V8_ENABLE_SANDBOX
583#ifdef V8_ENABLE_SANDBOX
591 Operand field_operand,
594#ifdef V8_ENABLE_SANDBOX
606#ifdef V8_ENABLE_SANDBOX
608 FieldOperand(value, ExposedTrustedObject::kSelfIndirectPointerOffset));
615#ifdef V8_ENABLE_SANDBOX
616void MacroAssembler::ResolveIndirectPointerHandle(Register
destination,
623 Label is_trusted_pointer_handle, done;
628 bind(&is_trusted_pointer_handle);
632 }
else if (tag == kCodeIndirectPointerTag) {
639void MacroAssembler::ResolveTrustedPointerHandle(Register
destination,
648 Operand{
kRootRegister, IsolateData::trusted_pointer_table_offset()});
656void MacroAssembler::ResolveCodePointerHandle(Register
destination,
660 LoadCodePointerTableBase(table);
672void MacroAssembler::LoadCodeEntrypointViaCodePointer(Register
destination,
673 Operand field_operand,
690void MacroAssembler::LoadCodePointerTableBase(Register
destination) {
691#ifdef V8_COMPRESS_POINTERS_IN_MULTIPLE_CAGES
695 ExternalReference::code_pointer_table_base_address(
isolate()));
705 ExternalReference::global_code_pointer_table_base_address());
710#ifdef V8_ENABLE_LEAPTIERING
711void MacroAssembler::LoadEntrypointFromJSDispatchTable(
716 shrl(
destination, Immediate(kJSDispatchHandleShift));
719 JSDispatchEntry::kEntrypointOffset));
722void MacroAssembler::LoadEntrypointFromJSDispatchTable(
732 static_assert(!JSDispatchTable::kSupportsCompaction);
733 int offset = JSDispatchTable::OffsetOfEntry(dispatch_handle) +
734 JSDispatchEntry::kEntrypointOffset;
738void MacroAssembler::LoadParameterCountFromJSDispatchTable(
743 shrl(
destination, Immediate(kJSDispatchHandleShift));
745 static_assert(JSDispatchEntry::kParameterCountMask == 0xffff);
747 JSDispatchEntry::kCodeObjectOffset));
750void MacroAssembler::LoadEntrypointAndParameterCountFromJSDispatchTable(
751 Register entrypoint, Register
parameter_count, Register dispatch_handle) {
757 shrl(
offset, Immediate(kJSDispatchHandleShift));
760 JSDispatchEntry::kEntrypointOffset));
761 static_assert(JSDispatchEntry::kParameterCountMask == 0xffff);
763 JSDispatchEntry::kCodeObjectOffset));
768 Operand field_operand) {
770#ifdef V8_ENABLE_SANDBOX
778 Register slot_address,
789 MovePair(slot_address_parameter, slot_address, object_parameter,
object);
796 Register slot_address,
807 object, slot_address);
814 MovePair(slot_address_parameter, slot_address, object_parameter,
object);
818 Move(tag_parameter, tag);
825 Register slot_address,
836 MovePair(object_parameter,
object, slot_address_parameter, slot_address);
850#if V8_ENABLE_WEBASSEMBLY
851 if (mode == StubCallMode::kCallWasmRuntimeStub) {
853 intptr_t wasm_target =
865void MacroAssembler::CallTSANStoreStub(Register address, Register value,
868 std::memory_order order) {
871 TSANStoreDescriptor descriptor;
877 descriptor.GetRegisterParameter(TSANStoreDescriptor::kAddress));
879 descriptor.GetRegisterParameter(TSANStoreDescriptor::kValue));
882 MovePair(address_parameter, address, value_parameter, value);
884#if V8_ENABLE_WEBASSEMBLY
885 if (mode != StubCallMode::kCallWasmRuntimeStub) {
887 CallBuiltin(CodeFactory::GetTSANStoreStub(fp_mode, size, order));
890 auto wasm_target =
static_cast<intptr_t
>(
891 wasm::WasmCode::GetTSANStoreBuiltin(fp_mode, size, order));
895 CallBuiltin(CodeFactory::GetTSANStoreStub(fp_mode, size, order));
901void MacroAssembler::CallTSANRelaxedLoadStub(Register address,
904 TSANLoadDescriptor descriptor;
910 descriptor.GetRegisterParameter(TSANLoadDescriptor::kAddress));
913 Move(address_parameter, address);
915#if V8_ENABLE_WEBASSEMBLY
916 if (mode != StubCallMode::kCallWasmRuntimeStub) {
918 CallBuiltin(CodeFactory::GetTSANRelaxedLoadStub(fp_mode, size));
921 auto wasm_target =
static_cast<intptr_t
>(
922 wasm::WasmCode::GetTSANRelaxedLoadBuiltin(fp_mode, size));
926 CallBuiltin(CodeFactory::GetTSANRelaxedLoadStub(fp_mode, size));
936 SlotDescriptor slot) {
941 if (
v8_flags.disable_write_barriers) {
948 if (slot.contains_indirect_pointer()) {
952 Register value_in_slot = slot_address;
954 slot.indirect_pointer_tag(), scratch);
955 cmp_tagged(value, value_in_slot);
961 cmp_tagged(value, Operand(slot_address, 0));
973#if V8_STATIC_ROOTS_BOOL
986 if (slot.contains_indirect_pointer()) {
990#if V8_ENABLE_STICKY_MARK_BITS_BOOL
1018 if (slot.contains_direct_pointer()) {
1022 DCHECK(slot.contains_indirect_pointer());
1024 slot.indirect_pointer_tag());
1052 int frame_alignment_mask = frame_alignment - 1;
1056 Label alignment_as_expected;
1057 testq(rsp, Immediate(frame_alignment_mask));
1061 bind(&alignment_as_expected);
1067 if (kFrameAlignment > 0) {
1069 DCHECK(is_int8(kFrameAlignment));
1070 andq(rsp, Immediate(-kFrameAlignment));
1092 LoadAddress(rax, ExternalReference::abort_with_reason());
1119 int num_arguments) {
1124 CHECK(f->nargs < 0 || f->nargs == num_arguments);
1130 Move(rax, num_arguments);
1133 bool switch_to_central =
options().is_wasm;
1150 if (function->nargs >= 0) {
1151 Move(rax, function->nargs);
1157 bool builtin_exit_frame) {
1166#ifndef V8_ENABLE_LEAPTIERING
1168void TailCallOptimizedCodeSlot(MacroAssembler* masm,
1169 Register optimized_code_entry, Register closure,
1170 Register scratch1, Register scratch2,
1183 Label heal_optimized_code_slot;
1191 optimized_code_entry,
1192 FieldOperand(optimized_code_entry, CodeWrapper::kCodeOffset), scratch1);
1203 scratch1, scratch2);
1205 __ Move(rcx, optimized_code_entry);
1211 __ bind(&heal_optimized_code_slot);
1218#ifdef V8_ENABLE_DEBUG_CODE
1222 Assert(
equal, AbortReason::kExpectedFeedbackCell);
1228 Assert(
equal, AbortReason::kExpectedFeedbackVector);
1243 FrameScope scope(
this, StackFrame::INTERNAL);
1250#ifdef V8_ENABLE_LEAPTIERING
1252 static_assert(kJSDispatchHandleShift > 0);
1263#ifdef V8_ENABLE_LEAPTIERING
1276 Register optimized_code, Register closure, Register scratch1,
1277 Register slot_address) {
1282#ifdef V8_ENABLE_LEAPTIERING
1292 movq(value, optimized_code);
1300#ifndef V8_ENABLE_LEAPTIERING
1305 Register feedback_vector,
CodeKind current_code_kind) {
1308 uint32_t flag_mask =
1311 Immediate(flag_mask));
1316 Register feedback_vector,
CodeKind current_code_kind,
1317 Label* flags_need_processing) {
1320 flags_need_processing);
1324 Register feedback_vector, Register closure,
JumpMode jump_mode) {
1328 Label maybe_has_optimized_code, maybe_needs_logging;
1332 j(zero, &maybe_needs_logging);
1336 bind(&maybe_needs_logging);
1338 Immediate(FeedbackVector::LogNextExecutionBit::kMask));
1339 j(zero, &maybe_has_optimized_code);
1342 bind(&maybe_has_optimized_code);
1345 optimized_code_entry,
1346 FieldOperand(feedback_vector, FeedbackVector::kMaybeOptimizedCodeOffset));
1347 TailCallOptimizedCodeSlot(
this, optimized_code_entry, closure, r9,
1355 Register exclusion)
const {
1369 Register exclusion) {
1411 const int delta = stack_slot_size *
registers.Count();
1416 Movsd(Operand(rsp, slot),
reg);
1419 Movdqu(Operand(rsp, slot),
reg);
1421 slot += stack_slot_size;
1432 Movsd(
reg, Operand(rsp, slot));
1435 Movdqu(
reg, Operand(rsp, slot));
1437 slot += stack_slot_size;
1440 addq(rsp, Immediate(slot));
1446 CpuFeatureScope avx_scope(
this, AVX);
1455 CpuFeatureScope avx_scope(
this, AVX);
1464 CpuFeatureScope avx_scope(
this, AVX);
1467 CpuFeatureScope sse_scope(
this, SSE4_1);
1474 CpuFeatureScope scope(
this, AVX);
1483 CpuFeatureScope scope(
this, AVX);
1492 CpuFeatureScope scope(
this, AVX);
1493 vcvtsd2ss(dst, src, src);
1501 CpuFeatureScope scope(
this, AVX);
1502 vcvtsd2ss(dst, dst, src);
1510 CpuFeatureScope scope(
this, AVX);
1520 CpuFeatureScope scope(
this, AVX);
1530 CpuFeatureScope scope(
this, AVX);
1540 CpuFeatureScope scope(
this, AVX);
1550 CpuFeatureScope scope(
this, AVX);
1560 CpuFeatureScope scope(
this, AVX);
1570 CpuFeatureScope scope(
this, AVX);
1580 CpuFeatureScope scope(
this, AVX);
1662 CpuFeatureScope scope(
this, AVX);
1671 CpuFeatureScope scope(
this, AVX);
1680 CpuFeatureScope scope(
this, AVX);
1689 CpuFeatureScope scope(
this, AVX);
1698 CpuFeatureScope scope(
this, AVX);
1707 CpuFeatureScope scope(
this, AVX);
1716 CpuFeatureScope scope(
this, AVX);
1725 CpuFeatureScope scope(
this, AVX);
1734 CpuFeatureScope f16c_scope(
this, F16C);
1735 CpuFeatureScope avx_scope(
this, AVX);
1743 CpuFeatureScope f16c_scope(
this, F16C);
1744 CpuFeatureScope avx_scope(
this, AVX);
1766 movzxbl(tmp2, tmp2);
1768 shll(tmp2, Immediate(12));
1774 andl(tmp, Immediate(0x1fff));
1790template <
typename OperandOrXMMRegister,
bool is_
double>
1791void ConvertFloatToUint64(MacroAssembler* masm, Register dst,
1792 OperandOrXMMRegister src, Label* fail) {
1797 masm->Cvttsd2siq(dst, src);
1799 masm->Cvttss2siq(dst, src);
1802 masm->testq(dst, dst);
1816 masm->testq(dst, dst);
1819 masm->j(
negative, fail ? fail : &success);
1825 masm->bind(&success);
1828template <
typename OperandOrXMMRegister,
bool is_
double>
1829void ConvertFloatToUint32(MacroAssembler* masm, Register dst,
1830 OperandOrXMMRegister src, Label* fail) {
1835 masm->Cvttsd2si(dst, src);
1837 masm->Cvttss2si(dst, src);
1840 masm->testl(dst, dst);
1854 masm->testl(dst, dst);
1857 masm->j(
negative, fail ? fail : &success);
1863 masm->bind(&success);
1868 ConvertFloatToUint64<Operand, true>(
this, dst, src, fail);
1872 ConvertFloatToUint64<XMMRegister, true>(
this, dst, src, fail);
1876 ConvertFloatToUint32<Operand, true>(
this, dst, src, fail);
1880 ConvertFloatToUint32<XMMRegister, true>(
this, dst, src, fail);
1884 ConvertFloatToUint64<Operand, false>(
this, dst, src, fail);
1888 ConvertFloatToUint64<XMMRegister, false>(
this, dst, src, fail);
1892 ConvertFloatToUint32<Operand, false>(
this, dst, src, fail);
1896 ConvertFloatToUint32<XMMRegister, false>(
this, dst, src, fail);
1901 CpuFeatureScope avx_scope(
this, AVX);
1910 CpuFeatureScope avx_scope(
this, AVX);
1920 CpuFeatureScope avx2_scope(
this, AVX2);
1922 vpcmpeqd(scratch, scratch, scratch);
1923 vpxor(dst, dst, scratch);
1925 vpcmpeqd(dst, dst, dst);
1926 vpxor(dst, dst, src);
1934 CpuFeatureScope avx2_scope(
this, AVX2);
1937 vpandn(scratch,
mask, src2);
1938 vpand(dst, src1,
mask);
1939 vpor(dst, dst, scratch);
1954 cmpl(dst, Immediate(src));
1965 CpuFeatureScope avx_scope(
this, AVX2);
1967 vpsrlq(tmp1, lhs, uint8_t{32});
1968 vpmuludq(tmp1, tmp1, rhs);
1970 vpsrlq(tmp2, rhs, uint8_t{32});
1971 vpmuludq(tmp2, tmp2, lhs);
1973 vpaddq(tmp2, tmp2, tmp1);
1974 vpsllq(tmp2, tmp2, uint8_t{32});
1976 vpmuludq(dst, lhs, rhs);
1978 vpaddq(dst, dst, tmp2);
1981#define DEFINE_ISPLAT(name, suffix, instr_mov) \
1982 void MacroAssembler::name(YMMRegister dst, Register src) { \
1983 ASM_CODE_COMMENT(this); \
1984 DCHECK(CpuFeatures::IsSupported(AVX) && CpuFeatures::IsSupported(AVX2)); \
1985 CpuFeatureScope avx_scope(this, AVX); \
1986 CpuFeatureScope avx2_scope(this, AVX2); \
1987 instr_mov(dst, src); \
1988 vpbroadcast##suffix(dst, dst); \
1991 void MacroAssembler::name(YMMRegister dst, Operand src) { \
1992 ASM_CODE_COMMENT(this); \
1993 DCHECK(CpuFeatures::IsSupported(AVX2)); \
1994 CpuFeatureScope avx2_scope(this, AVX2); \
1995 vpbroadcast##suffix(dst, src); \
2005 CpuFeatureScope avx2_scope(
this, AVX2);
2012 CpuFeatureScope avx2_scope(
this, AVX2);
2020 CpuFeatureScope avx_scope(
this, AVX);
2021 CpuFeatureScope avx2_scope(
this, AVX2);
2022 vminpd(scratch, lhs, rhs);
2023 vminpd(dst, rhs, lhs);
2024 vorpd(scratch, scratch, dst);
2025 vcmpunordpd(dst, dst, scratch);
2026 vorpd(scratch, scratch, dst);
2027 vpsrlq(dst, dst, uint8_t{13});
2028 vandnpd(dst, dst, scratch);
2035 CpuFeatureScope avx_scope(
this, AVX);
2036 CpuFeatureScope avx2_scope(
this, AVX2);
2037 vmaxpd(scratch, lhs, rhs);
2038 vmaxpd(dst, rhs, lhs);
2039 vxorpd(dst, dst, scratch);
2040 vorpd(scratch, scratch, dst);
2041 vsubpd(scratch, scratch, dst);
2042 vcmpunordpd(dst, dst, scratch);
2043 vpsrlq(dst, dst, uint8_t{13});
2044 vandnpd(dst, dst, scratch);
2051 CpuFeatureScope avx_scope(
this, AVX);
2052 CpuFeatureScope avx2_scope(
this, AVX2);
2053 vminps(scratch, lhs, rhs);
2054 vminps(dst, rhs, lhs);
2055 vorps(scratch, scratch, dst);
2056 vcmpunordps(dst, dst, scratch);
2057 vorps(scratch, scratch, dst);
2058 vpsrld(dst, dst, uint8_t{10});
2059 vandnps(dst, dst, scratch);
2066 CpuFeatureScope avx_scope(
this, AVX);
2067 CpuFeatureScope avx2_scope(
this, AVX2);
2068 vmaxps(scratch, lhs, rhs);
2069 vmaxps(dst, rhs, lhs);
2070 vxorps(dst, dst, scratch);
2071 vorps(scratch, scratch, dst);
2072 vsubps(scratch, scratch, dst);
2073 vcmpunordps(dst, dst, scratch);
2074 vpsrld(dst, dst, uint8_t{10});
2075 vandnps(dst, dst, scratch);
2081 CpuFeatureScope f16c_scope(
this, F16C);
2082 CpuFeatureScope avx_scope(
this, AVX);
2083 CpuFeatureScope avx2_scope(
this, AVX2);
2088 vminps(dst, scratch, scratch2);
2089 vminps(scratch, scratch2, scratch);
2091 vorps(scratch, scratch, dst);
2093 vcmpunordps(dst, dst, scratch);
2094 vorps(scratch, scratch, dst);
2095 vpsrld(dst, dst, uint8_t{10});
2096 vandnps(dst, dst, scratch);
2103 CpuFeatureScope f16c_scope(
this, F16C);
2104 CpuFeatureScope avx_scope(
this, AVX);
2105 CpuFeatureScope avx2_scope(
this, AVX2);
2110 vmaxps(dst, scratch, scratch2);
2111 vmaxps(scratch, scratch2, scratch);
2113 vxorps(dst, dst, scratch);
2115 vorps(scratch, scratch, dst);
2117 vsubps(scratch, scratch, dst);
2119 vcmpunordps(dst, dst, scratch);
2120 vpsrld(dst, dst, uint8_t{10});
2121 vandnps(dst, dst, scratch);
2136 CpuFeatureScope avx_scope(
this, AVX2);
2137 vpmovzxdq(scratch, src1);
2138 vpmovzxdq(dst, src2);
2140 vpmuldq(dst, scratch, dst);
2142 vpmuludq(dst, scratch, dst);
2156 CpuFeatureScope avx_scope(
this, AVX2);
2157 is_signed ? vpmovsxwd(scratch, src1) : vpmovzxwd(scratch, src1);
2158 is_signed ? vpmovsxwd(dst, src2) : vpmovzxwd(dst, src2);
2159 vpmulld(dst, dst, scratch);
2167 CpuFeatureScope avx_scope(
this, AVX2);
2168 is_signed ? vpmovsxbw(scratch, src1) : vpmovzxbw(scratch, src1);
2169 is_signed ? vpmovsxbw(dst, src2) : vpmovzxbw(dst, src2);
2170 vpmullw(dst, dst, scratch);
2173void MacroAssembler::I32x8ExtAddPairwiseI16x16S(
YMMRegister dst,
2178 CpuFeatureScope avx2_scope(
this, AVX2);
2179 Move(scratch, uint32_t{1});
2180 vpbroadcastw(scratch, scratch);
2185 vpmaddwd(dst, src, scratch);
2188void MacroAssembler::I32x8ExtAddPairwiseI16x16U(
YMMRegister dst,
2193 CpuFeatureScope avx2_scope(
this, AVX2);
2196 vpsrld(scratch, src, 16);
2199 vpaddd(dst, dst, scratch);
2202void MacroAssembler::I16x16ExtAddPairwiseI8x32S(
YMMRegister dst,
2207 CpuFeatureScope avx2_scope(
this, AVX2);
2208 Move(scratch, uint32_t{1});
2209 vpbroadcastb(scratch, scratch);
2214 vpmaddubsw(dst, scratch, src);
2217void MacroAssembler::I16x16ExtAddPairwiseI8x32U(
YMMRegister dst,
2222 CpuFeatureScope avx2_scope(
this, AVX2);
2223 Move(scratch, uint32_t{1});
2224 vpbroadcastb(scratch, scratch);
2225 vpmaddubsw(dst, src, scratch);
2232 CpuFeatureScope avx_scope(
this, AVX);
2233 CpuFeatureScope avx2_scope(
this, AVX2);
2235 ExternalReference::address_of_wasm_i32x8_int32_overflow_as_float(),
2245 vcmpeqps(tmp, src, src);
2246 vandps(dst, src, tmp);
2247 vcmpgeps(tmp, src, int32_overflow_as_float);
2249 vpxor(dst, dst, tmp);
2258 CpuFeatureScope f16c_scope(
this, F16C);
2259 CpuFeatureScope avx_scope(
this, AVX);
2260 CpuFeatureScope avx2_scope(
this, AVX2);
2263 ExternalReference::address_of_wasm_i32x8_int32_overflow_as_float(),
2268 vcmpeqps(tmp, dst, dst);
2270 vandps(dst, dst, tmp);
2272 vcmpgeps(tmp, dst, op);
2281 vpxor(dst, dst, tmp);
2292 vpackssdw(dst, dst, tmp);
2307 CpuFeatureScope f16c_scope(
this, F16C);
2308 CpuFeatureScope avx_scope(
this, AVX);
2309 CpuFeatureScope avx2_scope(
this, AVX2);
2312 ExternalReference::address_of_wasm_i32x8_int32_overflow_as_float(),
2316 vpxor(tmp, tmp, tmp);
2317 vmaxps(dst, dst, tmp);
2319 vcmpgeps(tmp, dst, op);
2328 vpxor(dst, dst, tmp);
2332 vpackusdw(dst, dst, tmp);
2338 CpuFeatureScope fma3_scope(
this, FMA3);
2339 CpuFeatureScope f16c_scope(
this, F16C);
2341 if (dst.code() == src2.code()) {
2345 vfmadd213ps(dst, tmp, tmp2);
2346 }
else if (dst.code() == src3.code()) {
2350 vfmadd231ps(dst, tmp, tmp2);
2355 vfmadd213ps(dst, tmp, tmp2);
2363 CpuFeatureScope fma3_scope(
this, FMA3);
2364 CpuFeatureScope f16c_scope(
this, F16C);
2366 if (dst.code() == src2.code()) {
2370 vfnmadd213ps(dst, tmp, tmp2);
2371 }
else if (dst.code() == src3.code()) {
2375 vfnmadd231ps(dst, tmp, tmp2);
2380 vfnmadd213ps(dst, tmp, tmp2);
2418 CpuFeatureScope avx_vnni_int8_scope(
this, AVX_VNNI_INT8);
2422 CpuFeatureScope avx_scope(
this, AVX_VNNI);
2428 CpuFeatureScope avx_scope(
this, AVX);
2429 CpuFeatureScope avx2_scope(
this, AVX2);
2431 vpcmpeqd(splat_reg, splat_reg, splat_reg);
2432 vpsrlw(splat_reg, splat_reg, uint8_t{15});
2433 vpmaddubsw(scratch, src2, src1);
2434 vpmaddwd(scratch, splat_reg, scratch);
2435 vpaddd(dst, src3, scratch);
2443 CpuFeatureScope avx_scope(
this, AVX);
2444 CpuFeatureScope avx2_scope(
this, AVX2);
2447 vpxor(scratch1, scratch1, scratch1);
2448 vmaxps(dst, src, scratch1);
2450 vpcmpeqd(scratch1, scratch1, scratch1);
2451 vpsrld(scratch1, scratch1, uint8_t{1});
2452 vcvtdq2ps(scratch1, scratch1);
2456 vsubps(scratch2, dst, scratch1);
2458 vcmpleps(scratch1, scratch1, scratch2);
2460 vpxor(scratch2, scratch2, scratch1);
2461 vpxor(scratch1, scratch1, scratch1);
2462 vpmaxsd(scratch2, scratch2, scratch1);
2466 vpaddd(dst, dst, scratch2);
2478#ifdef ENABLE_SLOW_DCHECKS
2576 mov_tagged(dst, src);
2584 cmp_tagged(smi1, smi2);
2593 if (src.value() == 0) {
2594 test_tagged(dst, dst);
2596 cmp_tagged(dst, Immediate(src));
2600 cmp_tagged(dst, constant_reg);
2607 cmp_tagged(dst, src);
2613 cmp_tagged(dst, src);
2622 cmpl(dst, Immediate(src));
2629 DCHECK(!dst.AddressUsesRegister(smi_reg));
2630 cmp_tagged(dst, smi_reg);
2634#ifdef V8_COMPRESS_POINTERS
2636 static constexpr unsigned int clobber_mask = 0x515151;
2637 static constexpr int rot_to_unused =
2639 rolq(src, Immediate(rot_to_unused));
2640 xorq(src, Immediate(clobber_mask));
2641 rorq(src, Immediate(rot_to_unused));
2676 if (constant.value() != 0) {
2689 addl(dst, Immediate(constant));
2708 return SmiIndex(dst,
times_1);
2722 return SmiIndex(dst,
times_1);
2727 Label** labels,
int num_labels) {
2729 Label fallthrough, jump_table;
2730 if (case_value_base != 0) {
2731 subq(
reg, Immediate(case_value_base));
2733 cmpq(
reg, Immediate(num_labels));
2736#ifdef V8_ENABLE_CET_IBT
2745 for (
int i = 0;
i < num_labels; ++
i) {
2752 intptr_t smi =
static_cast<intptr_t
>(source.ptr());
2753 if (is_int32(smi)) {
2759 if (first_byte_set == last_byte_set) {
2762 movb(Operand(rsp, first_byte_set),
2763 Immediate(
static_cast<int8_t
>(smi >> (8 * first_byte_set))));
2774 int value = source.value();
2780 uint32_t uvalue =
static_cast<uint32_t
>(source.ptr());
2799 if (
ext.IsIsolateFieldId()) {
2802 }
else if (
options().isolate_independent_code) {
2822 Move(dst, src.value());
2840 }
else if (dst1 != src0) {
2870 if (
pop + ntz + nlz == 32) {
2872 if (ntz) Pslld(dst,
static_cast<uint8_t
>(ntz + nlz));
2873 if (nlz) Psrld(dst,
static_cast<uint8_t
>(nlz));
2889 if (
pop + ntz + nlz == 64) {
2891 if (ntz) Psllq(dst,
static_cast<uint8_t
>(ntz + nlz));
2892 if (nlz) Psrlq(dst,
static_cast<uint8_t
>(nlz));
2894 uint32_t lower =
static_cast<uint32_t
>(src);
2895 uint32_t upper =
static_cast<uint32_t
>(src >> 32);
2909 Punpcklqdq(dst, dst);
2921 if (
IsSmi(*source)) {
2933 DCHECK(is_uint32(index));
2934 cmpl(dst, Immediate(
static_cast<int>(index),
2944 if (
IsSmi(*source)) {
2956 DCHECK(is_uint32(index));
2957 cmpl(dst, Immediate(
static_cast<int>(index),
2967 unsigned higher_limit) {
2970 if (lower_limit != 0) {
2974 cmpl(value, Immediate(higher_limit));
2979 unsigned higher_limit, Label* on_in_range,
3002 cmpq(counter, size);
3005 movq(counter, size);
3026 DCHECK(is_uint32(index));
3027 movl(
result, Immediate(
static_cast<int>(index), rmode));
3030 movq(
result, Immediate64(
object.address(), rmode));
3041 if (stack_elements > 0) {
3049 if (stack_elements == 1) {
3055 Drop(stack_elements);
3139 if (
isolate()->builtins()->IsBuiltinHandle(code_object, &builtin)) {
3144 jmp(code_object, rmode);
3152 if (
isolate()->builtins()->IsBuiltinHandle(code_object, &builtin)) {
3157 j(
cc, code_object, rmode);
3183 if (
isolate()->builtins()->IsBuiltinHandle(code_object, &builtin)) {
3188 call(code_object, rmode);
3202 IsolateData::builtin_entry_table_offset());
3210 IsolateData::builtin_entry_table_offset());
3220 switch (
options().builtin_call_jump_mode) {
3241 switch (
options().builtin_call_jump_mode) {
3262 switch (
options().builtin_call_jump_mode) {
3281 Register code_object,
3284#ifdef V8_ENABLE_SANDBOX
3285 LoadCodeEntrypointViaCodePointer(
3305 switch (jump_mode) {
3317 uint16_t argument_count) {
3318#ifdef V8_ENABLE_LEAPTIERING
3321 movl(r15,
FieldOperand(function_object, JSFunction::kDispatchHandleOffset));
3322 LoadEntrypointAndParameterCountFromJSDispatchTable(rcx, rbx, r15);
3324 cmpl(rbx, Immediate(argument_count));
3334#if V8_ENABLE_LEAPTIERING
3336 uint16_t argument_count) {
3347 static_assert(!JSDispatchTable::kSupportsCompaction);
3348 LoadEntrypointFromJSDispatchTable(rcx, dispatch_handle);
3359#ifdef V8_ENABLE_LEAPTIERING
3370#ifdef V8_ENABLE_WEBASSEMBLY
3372void MacroAssembler::CallWasmCodePointer(Register target,
3373 uint64_t signature_hash,
3378#ifdef V8_ENABLE_SANDBOX
3379 static_assert(
sizeof(wasm::WasmCodePointerTableEntry) == 16);
3381 static_assert(wasm::WasmCodePointerTable::kMaxWasmCodePointers <=
3383 shll(target, Immediate(4));
3387 Operand signature_hash_op{
target,
3388 wasm::WasmCodePointerTable::kOffsetOfSignatureHash};
3389 if (is_int32(signature_hash)) {
3391 cmpq(signature_hash_op, Immediate(
static_cast<int32_t>(signature_hash)));
3401 Abort(AbortReason::kWasmSignatureMismatch);
3404 Operand target_op{
target, 0};
3406 static_assert(
sizeof(wasm::WasmCodePointerTableEntry) == 8);
3417void MacroAssembler::CallWasmCodePointerNoSignatureCheck(Register target) {
3420#ifdef V8_ENABLE_SANDBOX
3421 static_assert(
sizeof(wasm::WasmCodePointerTableEntry) == 16);
3423 static_assert(wasm::WasmCodePointerTable::kMaxWasmCodePointers <=
3425 shll(target, Immediate(4));
3428 static_assert(
sizeof(wasm::WasmCodePointerTableEntry) == 8);
3433void MacroAssembler::LoadWasmCodePointer(Register dst, Operand src) {
3434 static_assert(
sizeof(WasmCodePointer) == 4);
3448 shrq(dst, Immediate(32));
3452template <
typename Op>
3453void PinsrdPreSse41Helper(MacroAssembler* masm,
XMMRegister dst, Op src,
3454 uint8_t imm8, uint32_t* load_pc_offset) {
3456 if (load_pc_offset) *load_pc_offset = masm->pc_offset();
3467 uint32_t* load_pc_offset) {
3468 PinsrdPreSse41Helper(
this, dst, src, imm8, load_pc_offset);
3472 uint32_t* load_pc_offset) {
3473 PinsrdPreSse41Helper(
this, dst, src, imm8, load_pc_offset);
3477 uint8_t imm8, uint32_t* load_pc_offset) {
3479 imm8, load_pc_offset, {SSE4_1});
3483 uint8_t imm8, uint32_t* load_pc_offset) {
3485 imm8, load_pc_offset, {SSE4_1});
3490 CpuFeatureScope scope(
this, LZCNT);
3498 bind(¬_zero_src);
3499 xorl(dst, Immediate(31));
3504 CpuFeatureScope scope(
this, LZCNT);
3512 bind(¬_zero_src);
3513 xorl(dst, Immediate(31));
3518 CpuFeatureScope scope(
this, LZCNT);
3526 bind(¬_zero_src);
3527 xorl(dst, Immediate(63));
3532 CpuFeatureScope scope(
this, LZCNT);
3540 bind(¬_zero_src);
3541 xorl(dst, Immediate(63));
3546 CpuFeatureScope scope(
this, BMI1);
3555 bind(¬_zero_src);
3560 CpuFeatureScope scope(
this, BMI1);
3569 bind(¬_zero_src);
3574 CpuFeatureScope scope(
this, BMI1);
3582 bind(¬_zero_src);
3587 CpuFeatureScope scope(
this, BMI1);
3595 bind(¬_zero_src);
3600 CpuFeatureScope scope(
this, POPCNT);
3609 CpuFeatureScope scope(
this, POPCNT);
3618 CpuFeatureScope scope(
this, POPCNT);
3627 CpuFeatureScope scope(
this, POPCNT);
3642 ExternalReference handler_address =
3652 ExternalReference handler_address =
3661 if (is_uint16(bytes_dropped)) {
3665 addq(rsp, Immediate(bytes_dropped));
3677 Label not_supported;
3678 ExternalReference supports_cetss =
3679 ExternalReference::supports_cetss_address();
3680 Operand supports_cetss_operand =
3682 cmpb(supports_cetss_operand, Immediate(0));
3685 bind(¬_supported);
3688#if V8_STATIC_ROOTS_BOOL
3689void MacroAssembler::CompareInstanceTypeWithUniqueCompressedMap(
3691 std::optional<RootIndex> expected =
3695 cmp_tagged(map, Immediate(expected_ptr));
3698void MacroAssembler::IsObjectTypeFast(Register
object,
InstanceType type,
3699 Register compressed_map_scratch) {
3703 CompareInstanceTypeWithUniqueCompressedMap(compressed_map_scratch, type);
3709#if V8_STATIC_ROOTS_BOOL
3712 CompareInstanceTypeWithUniqueCompressedMap(map, type);
3724#if V8_STATIC_ROOTS_BOOL
3725 if (
auto range = InstanceTypeChecker::UniqueMapRangeOfInstanceTypeRange(
3726 lower_limit, higher_limit)) {
3732 LoadMap(scratch, heap_object);
3737 Register scratch, Label* target,
3740 CHECK(
cc == Condition::kUnsignedLessThan ||
3741 cc == Condition::kUnsignedGreaterThanEqual);
3745 LoadMap(scratch, heap_object);
3747 LAST_JS_RECEIVER_TYPE);
3749 LoadMap(scratch, heap_object);
3751 LAST_PRIMITIVE_HEAP_OBJECT_TYPE);
3753 Abort(AbortReason::kInvalidReceiver);
3763 static_assert(LAST_JS_RECEIVER_TYPE ==
LAST_TYPE);
3764 CmpObjectType(heap_object, FIRST_JS_RECEIVER_TYPE, scratch);
3766 j(
cc, target, distance);
3780 Register instance_type_out,
3784 movzxwl(instance_type_out,
FieldOperand(map, Map::kInstanceTypeOffset));
3785 CompareRange(instance_type_out, lower_limit, higher_limit);
3789 const int kByteWithDeoptBitOffset = 0 *
kByteSize;
3790 const int kByteWithDeoptBitOffsetInBits = kByteWithDeoptBitOffset * 8;
3791 static_assert(V8_TARGET_LITTLE_ENDIAN == 1);
3794 kByteWithDeoptBitOffsetInBits);
3797 kByteWithDeoptBitOffsetInBits)));
3809#ifdef V8_ENABLE_DEBUG_CODE
3821 Check(is_smi, AbortReason::kOperandIsNotASmi);
3822#ifdef ENABLE_SLOW_DCHECKS
3831 Check(is_smi, AbortReason::kOperandIsNotASmi);
3835 if (!
v8_flags.slow_debug_code)
return;
3844 if (!
v8_flags.slow_debug_code)
return;
3847 testl(smi_register, Immediate(int32_t{0x10000000}));
3848 Check(zero, AbortReason::kSignedBitOfSmiIsNotZero);
3860 Check(
equal, AbortReason::kOperandIsNotAMap);
3872 Check(
equal, AbortReason::kOperandIsNotACode);
3885 shrq(
object, Immediate(32));
3886 shlq(
object, Immediate(32));
3904 Immediate(Map::Bits1::IsConstructorBit::kMask));
3917 LAST_JS_FUNCTION_TYPE);
3939 Check(
not_equal, AbortReason::kOperandIsASmiAndNotABoundFunction);
3943 Check(
equal, AbortReason::kOperandIsNotABoundFunction);
3950 Check(
not_equal, AbortReason::kOperandIsASmiAndNotAGeneratorObject);
3959 LAST_JS_GENERATOR_OBJECT_TYPE);
3968 Label done_checking;
3970 Cmp(
object,
isolate()->factory()->undefined_value());
3971 j(
equal, &done_checking);
3975 Cmp(map,
isolate()->factory()->allocation_site_map());
3977 Assert(
equal, AbortReason::kExpectedUndefinedOrCell);
3978 bind(&done_checking);
4018 Abort(abort_reason);
4034 j(
equal, target_if_cleared);
4041 if (
v8_flags.native_code_counters && counter->Enabled()) {
4043 Operand counter_operand =
4049 incl(counter_operand);
4051 addl(counter_operand, Immediate(value));
4058 if (
v8_flags.native_code_counters && counter->Enabled()) {
4060 Operand counter_operand =
4066 decl(counter_operand);
4068 subl(counter_operand, Immediate(value));
4073#ifdef V8_ENABLE_LEAPTIERING
4075 Register function, Register
new_target, Register actual_parameter_count,
4081 argument_adaption_mode);
4085 Register function, Register
new_target, Register actual_parameter_count,
4094 movl(dispatch_handle,
4095 FieldOperand(function, JSFunction::kDispatchHandleOffset));
4100 Label debug_hook, continue_after_hook;
4102 ExternalReference debug_hook_active =
4103 ExternalReference::debug_hook_on_function_call_address(
isolate());
4104 Operand debug_hook_active_operand =
4106 cmpb(debug_hook_active_operand, Immediate(0));
4109 bind(&continue_after_hook);
4113 LoadRoot(rdx, RootIndex::kUndefinedValue);
4117 Register expected_parameter_count = rbx;
4118 LoadParameterCountFromJSDispatchTable(expected_parameter_count,
4120 InvokePrologue(expected_parameter_count, actual_parameter_count, type);
4127 LoadEntrypointFromJSDispatchTable(rcx, dispatch_handle);
4142 actual_parameter_count);
4143 jmp(&continue_after_hook);
4149 Register actual_parameter_count,
4153 rbx,
FieldOperand(function, JSFunction::kSharedFunctionInfoOffset));
4155 FieldOperand(rbx, SharedFunctionInfo::kFormalParameterCountOffset));
4161 Register expected_parameter_count,
4162 Register actual_parameter_count,
4167 actual_parameter_count, type);
4171 Register expected_parameter_count,
4172 Register actual_parameter_count,
4183 Label debug_hook, continue_after_hook;
4185 ExternalReference debug_hook_active =
4186 ExternalReference::debug_hook_on_function_call_address(
isolate());
4187 Operand debug_hook_active_operand =
4189 cmpb(debug_hook_active_operand, Immediate(0));
4192 bind(&continue_after_hook);
4196 LoadRoot(rdx, RootIndex::kUndefinedValue);
4200 InvokePrologue(expected_parameter_count, actual_parameter_count, type);
4205 constexpr int unused_argument_count = 0;
4219 actual_parameter_count);
4220 jmp(&continue_after_hook);
4230 : IsolateData::jslimit_offset();
4237 Register num_args, Label* stack_overflow,
4256 j(
less_equal, stack_overflow, stack_overflow_distance);
4260 Register actual_parameter_count,
4263 if (expected_parameter_count == actual_parameter_count) {
4264 Move(rax, actual_parameter_count);
4267 Label regular_invoke;
4271 subq(expected_parameter_count, actual_parameter_count);
4274 Label stack_overflow;
4281 Register src = r8, dest = rsp, num = r9, current =
r11;
4290 leaq(num, Operand(rax, extra_words));
4309 decq(expected_parameter_count);
4314 jmp(®ular_invoke);
4316 bind(&stack_overflow);
4323 bind(®ular_invoke);
4328 Register expected_parameter_count_or_dispatch_handle,
4329 Register actual_parameter_count) {
4340 SmiTag(expected_parameter_count_or_dispatch_handle);
4341 Push(expected_parameter_count_or_dispatch_handle);
4343 SmiTag(actual_parameter_count);
4344 Push(actual_parameter_count);
4358 Pop(actual_parameter_count);
4360 Pop(expected_parameter_count_or_dispatch_handle);
4361 SmiUntag(expected_parameter_count_or_dispatch_handle);
4389#if V8_ENABLE_WEBASSEMBLY
4402 Check(
equal, AbortReason::kStackFrameTypesMustMatch);
4408#if defined(V8_TARGET_OS_WIN) || defined(V8_TARGET_OS_MACOS)
4416 Label touch_next_page;
4418 bind(&touch_next_page);
4419 subq(rsp, Immediate(kStackPageSize));
4421 movb(Operand(rsp, 0), Immediate(0));
4422 subq(bytes_scratch, Immediate(kStackPageSize));
4425 cmpq(bytes_scratch, Immediate(kStackPageSize));
4428 subq(rsp, bytes_scratch);
4434 while (bytes >= kStackPageSize) {
4435 subq(rsp, Immediate(kStackPageSize));
4436 movb(Operand(rsp, 0), Immediate(0));
4437 bytes -= kStackPageSize;
4439 if (bytes == 0)
return;
4440 subq(rsp, Immediate(bytes));
4446 Register c_function) {
4448 DCHECK(frame_type == StackFrame::EXIT ||
4449 frame_type == StackFrame::BUILTIN_EXIT ||
4450 frame_type == StackFrame::API_ACCESSOR_EXIT ||
4451 frame_type == StackFrame::API_CALLBACK_EXIT);
4467 using ER = ExternalReference;
4468 Store(ER::Create(IsolateAddressId::kCEntryFPAddress,
isolate()), rbp);
4469 Store(ER::Create(IsolateAddressId::kContextAddress,
isolate()),
4471 Store(ER::Create(IsolateAddressId::kCFunctionAddress,
isolate()), c_function);
4473#ifdef V8_TARGET_OS_WIN
4479 extra_slots += kWindowsHomeStackSlots;
4495 ExternalReference context_address =
4498 movq(rsi, context_operand);
4504 ExternalReference c_entry_fp_address =
4507 Move(c_entry_fp_operand, 0);
4516 FieldOperand(dst, Map::kConstructorOrBackPointerOrNativeContextOffset));
4523 Register feedback_vector,
4528 Label fallthrough, on_mark_deopt;
4540 FieldOperand(scratch_and_result, CodeWrapper::kCodeOffset),
4545 if (min_opt_level == CodeKind::TURBOFAN_JS) {
4552 DCHECK_EQ(min_opt_level, CodeKind::MAGLEV);
4553 j(
equal, on_result, distance);
4556 bind(&on_mark_deopt);
4564 Move(scratch_and_result, 0);
4569#ifdef V8_TARGET_OS_WIN
4570 return std::max(num_arguments, kWindowsHomeStackSlots);
4585 int argument_slots_on_stack =
4588 andq(rsp, Immediate(-frame_alignment));
4595 Label* return_location) {
4599 return CallCFunction(rax, num_arguments, set_isolate_data_slots,
4605 Label* return_location) {
4631 if (return_location)
bind(return_location);
4641 int argument_slots_on_stack =
4645 return call_pc_offset;
4650 constexpr intptr_t alignment_mask =
4652 if (header ==
object) {
4653 andq(header, Immediate(~alignment_mask));
4655 movq(header, Immediate(~alignment_mask));
4656 andq(header,
object);
4668 Immediate(
static_cast<uint8_t
>(
mask)));
4672 j(
cc, condition_met, condition_met_distance);
4678 Immediate(
static_cast<uint8_t
>(1)));
4679 j(
not_zero, is_marking, condition_met_distance);
4685 Immediate(
static_cast<uint8_t
>(1)));
4686 j(zero, not_marking, condition_met_distance);
4691 Label* condition_met,
4699#ifdef V8_ENABLE_SANDBOX
4700 movl(scratch0, Operand(scratch0, MemoryChunk::MetadataIndexOffset()));
4702 Immediate(MemoryChunkConstants::kMetadataPointerTableSizeMask));
4705 ExternalReference::memory_chunk_metadata_table_address());
4706 movq(scratch0, Operand(scratch1, scratch0,
times_1, 0));
4715 cmpq(
object, scratch1);
4716 Check(
equal, AbortReason::kMetadataAreaStartDoesNotMatch);
4721 movq(scratch1,
object);
4726 addq(scratch0, scratch1);
4729 movq(scratch1,
object);
4733 btq(Operand(scratch0, 0), scratch1);
4735 j(
cc, condition_met, condition_met_distance);
4743 leaq(dst, Operand(¤t, -
pc));
4762#ifdef V8_ENABLE_LEAPTIERING
4764 Assert(zero, AbortReason::kInvalidDeoptimizedCode);
4794 Register function_address,
4795 ExternalReference thunk_ref, Register thunk_arg,
4796 int slots_to_drop_on_return,
4800 Label propagate_exception;
4801 Label delete_allocated_handles;
4802 Label leave_exit_frame;
4804 using ER = ExternalReference;
4806 Isolate* isolate = masm->isolate();
4808 ER::handle_scope_next_address(isolate),
no_reg);
4810 ER::handle_scope_limit_address(isolate),
no_reg);
4812 ER::handle_scope_level_address(isolate),
no_reg);
4820 Register prev_next_address_reg = r12;
4828 prev_next_address_reg, prev_limit_reg));
4840 "Allocate HandleScope in callee-save registers.");
4841 __ movq(prev_next_address_reg, next_mem_op);
4842 __ movq(prev_limit_reg, limit_mem_op);
4843 __ addl(level_mem_op, Immediate(1));
4846 Label profiler_or_side_effects_check_enabled, done_api_call;
4847 if (with_profiling) {
4848 __ RecordComment(
"Check if profiler or side effects check is enabled");
4851 __ j(
not_zero, &profiler_or_side_effects_check_enabled);
4852#ifdef V8_RUNTIME_CALL_STATS
4854 __ Move(scratch, ER::address_of_runtime_stats_flag());
4855 __ cmpl(Operand(scratch, 0), Immediate(0));
4856 __ j(
not_zero, &profiler_or_side_effects_check_enabled);
4861 __ call(function_address);
4865 __ movq(return_value, return_value_operand);
4870 "No more valid handles (the result handle was the last one)."
4871 "Restore previous handle scope.");
4872 __ subl(level_mem_op, Immediate(1));
4874 __ movq(next_mem_op, prev_next_address_reg);
4875 __ cmpq(prev_limit_reg, limit_mem_op);
4880 __ bind(&leave_exit_frame);
4882 Register argc_reg = prev_limit_reg;
4883 if (argc_operand !=
nullptr) {
4884 __ movq(argc_reg, *argc_operand);
4890 "Check if the function scheduled an exception.");
4893 RootIndex::kTheHoleValue);
4898 AbortReason::kAPICallReturnedInvalidObject);
4900 if (argc_operand ==
nullptr) {
4913 if (with_profiling) {
4916 __ bind(&profiler_or_side_effects_check_enabled);
4918 if (thunk_arg.is_valid()) {
4920 IsolateFieldId::kApiCallbackThunkArgument);
4921 __ movq(thunk_arg_mem_op, thunk_arg);
4924 __ jmp(&done_api_call);
4927 __ bind(&propagate_exception);
4931 masm,
"HandleScope limit has changed. Delete allocated extensions.");
4932 __ bind(&delete_allocated_handles);
4933 __ movq(limit_mem_op, prev_limit_reg);
4935 Register saved_result = prev_limit_reg;
4936 __ movq(saved_result, return_value);
4938 __ Call(ER::delete_handle_scope_extensions());
4939 __ movq(return_value, saved_result);
4940 __ jmp(&leave_exit_frame);
constexpr int kRegularPageSize
constexpr int kReturnAddressStackSlotCount
#define Assert(condition)
static int ActivationFrameAlignment()
EmbeddedObjectIndex AddEmbeddedObject(IndirectHandle< HeapObject > object)
size_t EmbeddedObjectIndex
V8_INLINE void RecordComment(const char *comment, const SourceLocation &loc=SourceLocation::Current())
const AssemblerOptions & options() const
void cmpeqsd(XMMRegister dst, XMMRegister src)
void load_rax(Address value, RelocInfo::Mode rmode)
void near_j(Condition cc, intptr_t disp, RelocInfo::Mode rmode)
void cvtqsi2sd(XMMRegister dst, Operand src)
void shll(const VRegister &vd, const VRegister &vn, int shift)
void vmovd(XMMRegister dst, Register src)
void vmovq(XMMRegister dst, Register src)
void vpinsrq(XMMRegister dst, XMMRegister src1, Register src2, uint8_t imm8)
void vcvtqsi2sd(XMMRegister dst, XMMRegister src1, Register src2)
void vcvtss2sd(XMMRegister dst, XMMRegister src1, XMMRegister src2)
void pd(uint8_t op, XMMRegister dst, Operand src)
void popcntl(Register dst, Register src)
void vpsrld(XMMRegister dst, XMMRegister src, uint8_t imm8)
void testw(Register reg, Operand op)
void store_rax(Address dst, RelocInfo::Mode mode)
void j(Condition cc, Label *L, Label::Distance distance=Label::kFar)
void vcvttss2siq(Register dst, XMMRegister src)
void vpsrlq(XMMRegister dst, XMMRegister src, uint8_t imm8)
void vbroadcastss(XMMRegister dst, XMMRegister src)
void bsfq(Register dst, Register src)
void pinsrq(XMMRegister dst, Register src, uint8_t imm8)
void vcvtqsi2ss(XMMRegister dst, XMMRegister src1, Register src2)
void cmpeqss(XMMRegister dst, XMMRegister src)
void vcvttsd2si(Register dst, XMMRegister src)
void ps(uint8_t op, XMMRegister dst, Operand src)
void cmpw(Operand dst, Immediate src)
void btq(Operand dst, Register src)
void bsrq(Register dst, Register src)
void tzcntl(Register dst, Register src)
void cvttsd2si(Register dst, Operand src)
void vcvttss2si(Register dst, XMMRegister src)
void setcc(Condition cc, Register reg)
void pushq(Immediate value)
void movb(Register dst, Operand src)
void vcmpeqsd(XMMRegister dst, XMMRegister src)
void vcvtlsi2sd(XMMRegister dst, XMMRegister src1, Register src2)
void shift(Operand dst, Immediate shift_amount, int subcode, int size)
void vpsllq(XMMRegister dst, XMMRegister src, uint8_t imm8)
void pushq_imm32(int32_t imm32)
void vcvtlsi2ss(XMMRegister dst, XMMRegister src1, Register src2)
void cvtss2sd(XMMRegister dst, Operand src)
void cvtlsi2ss(XMMRegister dst, Operand src)
void movq_heap_number(Register dst, double value)
void cmpb(Register reg, Immediate imm8)
void vpdpbssd(XMMRegister dst, XMMRegister src1, XMMRegister src2)
void tzcntq(Register dst, Register src)
void lzcntl(Register dst, Register src)
void pextrq(Register dst, XMMRegister src, int8_t imm8)
void vcvtph2ps(XMMRegister dst, XMMRegister src)
void vpblendw(XMMRegister dst, XMMRegister src1, XMMRegister src2, uint8_t mask)
void cvttss2siq(Register dst, XMMRegister src)
void lzcntq(Register dst, Register src)
void bsrl(Register dst, Register src)
void ext(const VRegister &vd, const VRegister &vn, const VRegister &vm, int index)
void incsspq(Register number_of_words)
void cvttsd2siq(Register dst, XMMRegister src)
void vpsrlw(XMMRegister dst, XMMRegister src, uint8_t imm8)
void vcvttsd2siq(Register dst, XMMRegister src)
void cvtqsi2ss(XMMRegister dst, Operand src)
void vcmpeqss(XMMRegister dst, XMMRegister src)
void near_jmp(intptr_t disp, RelocInfo::Mode rmode)
void vpextrq(Register dst, XMMRegister src, int8_t imm8)
void popcntq(Register dst, Register src)
void movsxlq(Register dst, Register src)
void movl(Operand dst, Label *src)
void testb(Register reg, Operand op)
void vbroadcastsd(YMMRegister dst, XMMRegister src)
void vpermq(YMMRegister dst, Operand src, uint8_t imm8)
void vcvtps2ph(XMMRegister dst, XMMRegister src, uint8_t imm8)
void bsfl(Register dst, Register src)
void cvttss2si(Register dst, Operand src)
int SizeOfCodeGeneratedSince(Label *label)
void vcvttps2dq(XMMRegister dst, XMMRegister src)
void cvtlsi2sd(XMMRegister dst, Operand src)
void movq(XMMRegister dst, Operand src)
void vpdpbusd(XMMRegister dst, XMMRegister src1, XMMRegister src2)
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 Builtin IndirectPointerBarrier(SaveFPRegsMode fp_mode)
static constexpr Builtin CEntry(int result_size, ArgvMode argv_mode, bool builtin_exit_frame=false, bool switch_to_central_stack=false)
static const int kIsTurbofannedBit
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 V8_EXPORT_PRIVATE ExternalReference address_of_code_pointer_table_base_address()
static ExternalReference Create(const SCTableReference &table_ref)
static constexpr uint32_t kFlagsTieringStateIsAnyRequested
static constexpr uint32_t FlagMaskForNeedsProcessingCheckFrom(CodeKind code_kind)
static constexpr int OffsetOfElementAt(int index)
static constexpr int kHeaderSize
static constexpr int kMapOffset
static constexpr RegList ComputeSavedRegisters(Register object, Register slot_address=no_reg)
static constexpr Register IndirectPointerTagRegister()
static constexpr Register ObjectRegister()
static constexpr Register SlotAddressRegister()
static const int kExternalPointerTableBasePointerOffset
static constexpr int BuiltinEntrySlotOffset(Builtin id)
static constexpr int real_jslimit_offset()
static IsolateGroup * current()
Address BuiltinEntry(Builtin builtin)
bool root_array_available_
static bool IsAddressableThroughRootRegister(Isolate *isolate, const ExternalReference &reference)
static constexpr bool CanBeImmediate(RootIndex index)
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
Tagged_t ReadOnlyRootPtr(RootIndex index)
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)
void PextrdPreSse41(Register dst, XMMRegister src, uint8_t imm8)
void Cvttsd2si(Register dst, XMMRegister src)
void EncodeSandboxedPointer(Register value)
void Cvttss2si(Register dst, XMMRegister src)
void Cvtqui2sd(XMMRegister dst, Register src)
void PushAll(RegList registers)
void S256Not(YMMRegister dst, YMMRegister src, YMMRegister scratch)
void Cvtlui2sd(XMMRegister dst, Register src)
void Abort(AbortReason msg)
static int ArgumentStackSlotsForCFunctionCall(int num_arguments)
void Call(Register target, Condition cond=al)
void CallJSFunction(Register function_object, uint16_t argument_count)
void Cvttss2siq(Register dst, XMMRegister src)
void CallDebugOnFunctionCall(Register fun, Register new_target, Register expected_parameter_count, Register actual_parameter_count)
void Cvttsd2siq(Register dst, XMMRegister src)
void Cvttsd2uiq(Register dst, Operand src, Label *fail=nullptr)
void Cvttss2uiq(Register dst, Operand src, Label *fail=nullptr)
void F32x8Max(YMMRegister dst, YMMRegister lhs, YMMRegister rhs, YMMRegister scratch)
void LoadAddress(Register destination, ExternalReference source)
void PushAddress(ExternalReference source)
void TestCodeIsMarkedForDeoptimization(Register code, Register scratch)
void Cmp(const Register &rn, int imm)
void AssertMap(Register object) NOOP_UNLESS_DEBUG_CODE
void JumpIfIsInRange(Register value, Register scratch, unsigned lower_limit, unsigned higher_limit, Label *on_in_range)
void Popcntq(Register dst, Register src)
void DecompressTaggedSigned(const Register &destination, const MemOperand &field_operand)
void Pextrq(Register dst, XMMRegister src, int8_t imm8)
void Drop(int count, Condition cond=al)
void F32x8Qfms(YMMRegister dst, YMMRegister src1, YMMRegister src2, YMMRegister src3, YMMRegister tmp)
void ClobberDecompressedSmiBits(Register smi)
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 SmiUntag(Register reg, SBit s=LeaveCC)
void AssertFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void SmiUntagUnsigned(Register reg)
void AssertNotSmi(Register object, AbortReason reason=AbortReason::kOperandIsASmi) NOOP_UNLESS_DEBUG_CODE
void LoadExternalPointerField(Register destination, MemOperand field_operand, ExternalPointerTagRange tag_range, Register isolate_root=Register::no_reg())
void AssertGeneratorObject(Register object) NOOP_UNLESS_DEBUG_CODE
void near_call(int offset, RelocInfo::Mode rmode)
void I16x16ExtMul(YMMRegister dst, XMMRegister src1, XMMRegister src2, YMMRegister scratch, bool is_signed)
void Cmpeqss(XMMRegister dst, XMMRegister src)
void CompareRoot(Register obj, RootIndex index)
void Store(ExternalReference destination, Register source)
void Move(Register dst, Tagged< Smi > smi)
void Assert(Condition cond, AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void Cvtqsi2sd(XMMRegister dst, Register src)
void StackOverflowCheck(Register num_args, Register scratch, Label *stack_overflow)
void F16x8Max(YMMRegister dst, XMMRegister lhs, XMMRegister rhs, YMMRegister scratch, YMMRegister scratch2)
void AssertFeedbackVector(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void CallBuiltinByIndex(Register builtin_index, Register target)
void LoadTrustedPointerField(Register destination, MemOperand field_operand, IndirectPointerTag tag)
void F64x4Max(YMMRegister dst, YMMRegister lhs, YMMRegister rhs, YMMRegister scratch)
void I32x8DotI8x32I7x32AddS(YMMRegister dst, YMMRegister src1, YMMRegister src2, YMMRegister src3, YMMRegister scratch, YMMRegister splat_reg)
void LoadRootRelative(Register destination, int32_t offset) final
void JumpIfSmi(Register value, Label *smi_label)
void CallCodeObject(Register code_object)
void LoadSandboxedPointerField(Register destination, MemOperand field_operand)
void AssertUnreachable(AbortReason reason) NOOP_UNLESS_DEBUG_CODE
void LoadRootRegisterOffset(Register destination, intptr_t offset) final
void PopQuad(Operand dst)
void Cvtlsi2ss(XMMRegister dst, Register src)
void Cvtqui2ss(XMMRegister dst, Register src)
void Cvtph2pd(XMMRegister dst, XMMRegister src)
void Cvtqsi2ss(XMMRegister dst, Register src)
void LoadCodeInstructionStart(Register destination, Register code_object, CodeEntrypointTag tag=kDefaultCodeEntrypointTag)
void F16x8Qfma(YMMRegister dst, XMMRegister src1, XMMRegister src2, XMMRegister src3, YMMRegister tmp, YMMRegister tmp2)
void PushTaggedField(Operand field_operand, Register scratch)
void LoadFeedbackVector(Register dst, Register closure, Register scratch, Label *fbv_undef)
void EmitIncrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void AssertCode(Register object) NOOP_UNLESS_DEBUG_CODE
void Movq(XMMRegister dst, Register src)
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)
void JumpIfUnsignedLessThan(Register x, int32_t y, Label *dest)
void BailoutIfDeoptimized()
void Load(Register destination, ExternalReference source)
void DecodeSandboxedPointer(Register value)
int RequiredStackSizeForCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg) const
void CompareTaggedRoot(Register with, RootIndex index)
void JumpIfJSAnyIsNotPrimitive(Register heap_object, Register scratch, Label *target, Label::Distance distance=Label::kFar, Condition condition=Condition::kUnsignedGreaterThanEqual)
void InvokePrologue(Register expected_parameter_count, Register actual_parameter_count, InvokeType type)
Operand EntryFromBuiltinIndexAsOperand(Register builtin_index)
void SmiTag(Register reg, SBit s=LeaveCC)
void SbxCheck(Condition cc, AbortReason reason)
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)
SmiIndex SmiToIndex(Register dst, Register src, int shift)
void Tzcntq(Register dst, Register src)
void RecordWriteField(Register object, int offset, Register value, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, SmiCheck smi_check=SmiCheck::kInline)
void SmiUntagFieldUnsigned(Register dst, Operand src)
void Cvtsd2ss(XMMRegister dst, XMMRegister src)
void I16x8SConvertF16x8(YMMRegister dst, XMMRegister src, YMMRegister tmp, Register scratch)
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 LoadIndirectPointerField(Register destination, MemOperand field_operand, IndirectPointerTag tag)
void CallIndirectPointerBarrier(Register object, Operand offset, SaveFPRegsMode fp_mode, IndirectPointerTag tag)
int LeaveFrame(StackFrame::Type type)
int PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
void F64x4Qfma(YMMRegister dst, YMMRegister src1, YMMRegister src2, YMMRegister src3, YMMRegister tmp)
void JumpIfMarking(Label *is_marking, Label::Distance condition_met_distance=Label::kFar)
void JumpToExternalReference(const ExternalReference &builtin, bool builtin_exit_frame=false)
Operand ClearedValue() const
void F32x8Min(YMMRegister dst, YMMRegister lhs, YMMRegister rhs, YMMRegister scratch)
void StoreCodePointerField(Register value, MemOperand dst_field_operand)
void IsObjectTypeInRange(Register heap_object, Register scratch, InstanceType lower_limit, InstanceType higher_limit)
void CheckFeedbackVectorFlagsAndJumpIfNeedsProcessing(Register feedback_vector, CodeKind current_code_kind, Label *flags_need_processing)
Operand RootAsOperand(RootIndex index)
void Jump(Register target, Condition cond=al)
void DropUnderReturnAddress(int stack_elements, Register scratch=kScratchRegister)
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 DecompressProtected(const Register &destination, const MemOperand &field_operand)
void PushRoot(RootIndex index)
void StoreTaggedField(const Register &value, const MemOperand &dst_field_operand)
void F64x4Splat(YMMRegister dst, XMMRegister src)
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 Popcntl(Register dst, Register src)
void LoadTaggedField(const Register &destination, const MemOperand &field_operand)
void CompareRange(Register value, Register scratch, unsigned lower_limit, unsigned higher_limit)
void JumpCodeObject(Register code_object, JumpMode jump_mode=JumpMode::kJump)
void MoveNumber(Register dst, double value)
void Pinsrq(XMMRegister dst, XMMRegister src1, Register src2, uint8_t imm8, uint32_t *load_pc_offset=nullptr)
void Cvtlsi2sd(XMMRegister dst, Register src)
void EmitDecrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void I64x4ExtMul(YMMRegister dst, XMMRegister src1, XMMRegister src2, YMMRegister scratch, bool is_signed)
void LoadFromConstantsTable(Register destination, int constant_index) final
void PushImm32(int32_t imm32)
void LoadProtectedPointerField(Register destination, MemOperand field_operand)
MemOperand EntryFromBuiltinAsOperand(Builtin builtin)
void CmpInstanceType(Register map, InstanceType type)
void ComputeCodeStartAddress(Register dst)
void CheckPageFlag(Register object, int mask, Condition cc, Label *condition_met)
void Lzcntl(Register dst, Register src)
void LoadTaggedRoot(Register destination, RootIndex index)
void JumpIfNotSmi(Register value, Label *not_smi_label)
void StoreIndirectPointerField(Register value, MemOperand dst_field_operand)
void SmiToInt32(Register smi)
int CallCFunction(ExternalReference function, int num_arguments, SetIsolateDataSlots set_isolate_data_slots=SetIsolateDataSlots::kYes, Label *return_label=nullptr)
void MovePair(Register dst0, Register src0, Register dst1, Register src1)
void JumpJSFunction(Register function_object, JumpMode jump_mode=JumpMode::kJump)
void JumpIfNotMarking(Label *not_marking, Label::Distance condition_met_distance=Label::kFar)
void I32x8ExtMul(YMMRegister dst, XMMRegister src1, XMMRegister src2, YMMRegister scratch, bool is_signed)
void AssertConstructor(Register object) NOOP_UNLESS_DEBUG_CODE
void CheckStackAlignment()
void CheckMarkBit(Register object, Register scratch0, Register scratch1, Condition cc, Label *condition_met, Label::Distance condition_met_distance=Label::kFar)
void LoadCompressedMap(Register dst, Register object)
void CallRuntime(const Runtime::Function *f, int num_arguments)
void LoadWeakValue(Register out, Register in, Label *target_if_cleared)
void I16x8TruncF16x8U(YMMRegister dst, XMMRegister src, YMMRegister tmp)
void CallBuiltin(Builtin builtin, Condition cond=al)
void PushQuad(Operand src)
void GenerateTailCallToReturnedCode(Runtime::FunctionId function_id)
void Cvtlui2ss(XMMRegister dst, Register src)
void LoadCodePointerField(Register destination, MemOperand field_operand)
void AssertJSAny(Register object, Register map_tmp, Register tmp, AbortReason abort_reason) NOOP_UNLESS_DEBUG_CODE
void CallEphemeronKeyBarrier(Register object, Operand offset, SaveFPRegsMode fp_mode)
void I32x8SConvertF32x8(YMMRegister dst, YMMRegister src, YMMRegister tmp, Register scratch)
Operand StackLimitAsOperand(StackLimitKind kind)
void Cvtpd2ph(XMMRegister dst, XMMRegister src, Register tmp)
void Check(Condition cond, AbortReason reason)
void F64x4Qfms(YMMRegister dst, YMMRegister src1, YMMRegister src2, YMMRegister src3, YMMRegister tmp)
void AssertFeedbackCell(Register object, Register scratch) NOOP_UNLESS_DEBUG_CODE
void SmiAddConstant(Operand dst, Tagged< Smi > constant)
void CallForDeoptimization(Builtin target, int deopt_id, Label *exit, DeoptimizeKind kind, Label *ret, Label *jump_deoptimization_entry_label)
void StoreTrustedPointerField(Register value, MemOperand dst_field_operand)
void DropArgumentsAndPushNewReceiver(Register argc, Register receiver)
void AssertSignedBitOfSmiIsZero(Register smi) NOOP_UNLESS_DEBUG_CODE
void StoreSandboxedPointerField(Register value, MemOperand dst_field_operand)
void AllocateStackSpace(Register bytes)
void AssertZeroExtended(Register int32_register)
void PushReturnAddressFrom(Register src)
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 F16x8Qfms(YMMRegister dst, XMMRegister src1, XMMRegister src2, XMMRegister src3, YMMRegister tmp, YMMRegister tmp2)
void Cvtss2sd(XMMRegister dst, XMMRegister src)
void OptimizeCodeOrTailCallOptimizedCodeSlot(Register flags, Register feedback_vector)
void PrepareCallCFunction(int num_reg_arguments, int num_double_registers=0, Register scratch=no_reg)
void F32x8Splat(YMMRegister dst, XMMRegister src)
void I64x4Mul(YMMRegister dst, YMMRegister lhs, YMMRegister rhs, YMMRegister tmp1, YMMRegister tmp2)
void CallRecordWriteStub(Register object, Register slot_address, SaveFPRegsMode fp_mode, StubCallMode mode=StubCallMode::kCallBuiltinPointer)
Condition CheckFeedbackVectorFlagsNeedsProcessing(Register feedback_vector, CodeKind current_code_kind)
void TryLoadOptimizedOsrCode(Register scratch_and_result, CodeKind min_opt_level, Register feedback_vector, FeedbackSlot slot, Label *on_result, Label::Distance distance)
void MemoryChunkHeaderFromObject(Register object, Register header)
void F64x4Min(YMMRegister dst, YMMRegister lhs, YMMRegister rhs, YMMRegister scratch)
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 IncsspqIfSupported(Register number_of_words, Register scratch)
void SmiCompare(Register smi1, Register smi2)
void Lzcntq(Register dst, Register src)
void Cmpeqsd(XMMRegister dst, XMMRegister src)
void F32x8Qfma(YMMRegister dst, YMMRegister src1, YMMRegister src2, YMMRegister src3, YMMRegister tmp)
void SmiUntagField(Register dst, const MemOperand &src)
void PopAll(RegList registers)
void StubPrologue(StackFrame::Type type)
void StoreTaggedSignedField(Operand dst_field_operand, Tagged< Smi > value)
void TestCodeIsTurbofanned(Register code)
void DecompressTagged(const Register &destination, const MemOperand &field_operand)
Condition CheckSmi(Register src)
void StoreRootRelative(int32_t offset, Register value) final
void F16x8Min(YMMRegister dst, XMMRegister lhs, XMMRegister rhs, YMMRegister scratch, YMMRegister scratch2)
void LoadTaggedSignedField(const Register &destination, const MemOperand &field_operand)
void LoadMap(Register destination, Register object)
void AtomicStoreTaggedField(const Register &value, const Register &dst_base, const Register &dst_index, const Register &temp)
void TailCallRuntime(Runtime::FunctionId fid)
void LoadNativeContextSlot(Register dst, int index)
void Tzcntl(Register dst, Register src)
static const int kSmiShift
void LoadTaggedFieldWithoutDecompressing(const Register &destination, const MemOperand &field_operand)
void S256Select(YMMRegister dst, YMMRegister mask, YMMRegister src1, YMMRegister src2, YMMRegister scratch)
void PopReturnAddressTo(Register dst)
void TailCallBuiltin(Builtin builtin, Condition cond=al)
Register GetSmiConstant(Tagged< Smi > value)
void Switch(Register scratch, Register value, int case_value_base, Label **labels, int num_labels)
void AssertSmiOrHeapObjectInMainCompressionCage(Register object) NOOP_UNLESS_DEBUG_CODE
void DropArguments(Register count)
void Cvttss2ui(Register dst, XMMRegister src, XMMRegister tmp)
void AssertCallableFunction(Register object) NOOP_UNLESS_DEBUG_CODE
void I32x8TruncF32x8U(YMMRegister dst, YMMRegister src, YMMRegister scratch1, YMMRegister scratch2)
static constexpr uint32_t kBitsPerCellLog2
static constexpr uint32_t kBitIndexMask
static constexpr MainThreadFlags kIsInReadOnlyHeapMask
static constexpr MainThreadFlags kPointersToHereAreInterestingMask
static constexpr intptr_t FlagsOffset()
static constexpr intptr_t MetadataOffset()
static constexpr MainThreadFlags kPointersFromHereAreInterestingMask
static constexpr intptr_t GetAlignmentMaskForAssembler()
static constexpr intptr_t MarkingBitmapOffset()
constexpr unsigned Count() const
static constexpr bool IsCompressedEmbeddedObject(Mode mode)
static constexpr bool IsCodeTarget(Mode mode)
static constexpr bool IsFullEmbeddedObject(Mode mode)
@ COMPRESSED_EMBEDDED_OBJECT
static constexpr bool IsImmortalImmovable(RootIndex root_index)
static V8_EXPORT_PRIVATE const Function * FunctionForId(FunctionId id)
void PinsrHelper(Assembler *assm, AvxFn< Op > avx, NoAvxFn< Op > noavx, XMMRegister dst, XMMRegister src1, Op src2, uint8_t imm8, uint32_t *load_pc_offset=nullptr, std::optional< CpuFeature > feature=std::nullopt)
static SlotDescriptor ForCodePointerSlot()
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_LEAPTIERING_BOOL
#define COMPRESS_POINTERS_BOOL
#define V8_ENABLE_SANDBOX_BOOL
DirectHandle< Object > new_target
ZoneVector< RpoNumber > & result
#define MACRO_ASM_X64_ISPLAT_LIST(V)
RegListBase< RegisterT > registers
InstructionOperand destination
constexpr unsigned CountLeadingZeros(T value)
constexpr unsigned CountTrailingZeros64(uint64_t value)
constexpr unsigned CountLeadingZeros64(uint64_t value)
constexpr unsigned CountTrailingZeros(T value)
constexpr unsigned CountPopulation(T value)
constexpr bool IsPowerOfTwo(T value)
constexpr bool IsInRange(T value, U lower_limit, U higher_limit)
constexpr Tagged_t kNonJsReceiverMapLimit
V8_INLINE constexpr std::optional< RootIndex > UniqueMapOfInstanceType(InstanceType type)
constexpr Register no_reg
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
constexpr Register kRootRegister
constexpr int kCodePointerTableEntrySizeLog2
constexpr uint64_t kExternalPointerTagShift
RegListBase< DoubleRegister > DoubleRegList
constexpr int kTaggedSize
constexpr int kBitsPerByte
constexpr uint32_t kFP32SubnormalThresholdOfFP16
bool DoubleToSmiInteger(double value, int *smi_int_value)
static V8_INLINE constexpr bool IsSharedExternalPointerType(ExternalPointerTagRange tag_range)
constexpr DoubleRegister kScratchDoubleReg
constexpr uint64_t kExternalPointerPayloadMask
@ kUnknownIndirectPointerTag
RegListBase< Register > RegList
constexpr ExternalPointerTagRange kAnyExternalPointerTagRange(kFirstExternalPointerTag, kLastExternalPointerTag)
constexpr bool CodeKindCanTierUp(CodeKind kind)
constexpr Register kJavaScriptCallTargetRegister
constexpr int kPCOnStackSize
constexpr uint32_t kFP32MinFP16ZeroRepresentable
constexpr int kCodePointerTableEntryCodeObjectOffset
constexpr int kTrustedPointerTableEntrySize
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 kSystemPointerSizeLog2
base::StrongAlias< JSDispatchHandleAliasTag, uint32_t > JSDispatchHandle
TagRange< ExternalPointerTag > ExternalPointerTagRange
static const int kRegisterPassedArguments
constexpr int kFPOnStackSize
constexpr int kSystemPointerSize
const RegList kCallerSaved
const char * GetAbortReason(AbortReason reason)
constexpr int kTaggedSizeLog2
static constexpr int kMaxCParameters
constexpr uint32_t kZapValue
constexpr bool SmiValuesAre31Bits()
constexpr Register kScratchRegister
Condition NegateCondition(Condition cond)
@ 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 uint32_t kTrustedPointerHandleShift
constexpr uint32_t kFP32MaxFP16Representable
constexpr uint32_t kCodePointerHandleShift
Tagged< ClearedWeakValue > ClearedValue(PtrComprCageBase cage_base)
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr uint32_t kFP32WithoutSignMask
constexpr bool SmiValuesAre32Bits()
constexpr Register kJavaScriptCallCodeStartRegister
constexpr int kJSDispatchTableEntrySizeLog2
constexpr Register kPtrComprCageBaseRegister
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 kBitsPerByteLog2
constexpr uint64_t kTrustedPointerTableMarkBit
constexpr Register kCArgRegs[]
constexpr int kDoubleSize
constexpr Register kJavaScriptCallDispatchHandleRegister
static constexpr DoubleRegList kAllocatableDoubleRegisters
constexpr uint32_t kCodePointerHandleMarker
const uint32_t kClearedWeakHeapObjectLower32
@ kFirstStrongOrReadOnlyRoot
@ kLastStrongOrReadOnlyRoot
constexpr uint32_t kMaxUInt32
bool is_signed(Condition cond)
constexpr Register kJavaScriptCallNewTargetRegister
constexpr Register kJSFunctionRegister
constexpr uint64_t kExternalPointerShiftedTagMask
static V8_INLINE constexpr bool ExternalPointerCanBeEmpty(ExternalPointerTagRange tag_range)
constexpr bool PointerCompressionIsEnabled()
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 CHECK_EQ(lhs, rhs)
#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)
#define V8_STATIC_ROOTS_BOOL