39#define LOAD_KIND(kind) \
40 Int32Constant(static_cast<intptr_t>(LoadHandler::Kind::kind))
41#define STORE_KIND(kind) \
42 Int32Constant(static_cast<intptr_t>(StoreHandler::Kind::kind))
103 Comment(
"HandlePolymorphicCase");
107 const int kEntrySize = 2;
118 Label loop(
this, &var_index), loop_next(
this);
158 MegaDOMSymbolConstant()));
168 handler =
CAST(maybe_handler);
190 caller_context, lookup_start_object));
197 Label no_enum_cache(
this);
206 descriptors, DescriptorArray::kEnumCacheOffset);
218 GotoIf(IsEmptyFixedArray(enum_indices), &no_enum_cache);
225 uint32_t kIsMutableDoubleFieldMask = 1;
230 Label if_outofobject(
this);
232 GotoIf(Int32LessThan(field_index, zero), &if_outofobject);
246 BIND(&if_outofobject);
264 Label loaded_field(
this, &field), if_outofobject(
this);
267 GotoIf(Int32LessThan(field_index, zero), &if_outofobject);
279 BIND(&if_outofobject);
296 Label if_not_double(
this);
308 BIND(&if_not_double);
319 BIND(&no_enum_cache);
331 Label if_smi_handler(
this, {&var_holder, &var_smi_handler});
338 BIND(&try_proto_handler);
343 &if_smi_handler, miss, exit_point, ic_mode,
349 BIND(&if_smi_handler);
352 p, var_holder.value(),
CAST(var_smi_handler.value()), handler, miss,
353 exit_point, ic_mode, on_nonexistent, support_elements, access_mode);
359 exit_point->
Return(TrueConstant());
376 BIND(&call_code_handler);
388 Comment(
"native_data_property_load");
396 p->
receiver(), holder, accessor_info);
419 argc, caller_context, function_template_info,
436 is_inobject, [&]() {
return holder; },
439 Label is_double(
this);
442 exit_point->
Return(value);
454#if V8_ENABLE_WEBASSEMBLY
456void AccessorAssembler::HandleLoadWasmField(
460 Label type_I8(
this), type_I16(
this), type_I32(
this), type_U32(
this),
461 type_I64(
this), type_U64(
this), type_F32(
this), type_F64(
this),
464 Label* wasm_value_type_labels[] = {
465 &type_I8, &type_I16, &type_I32, &type_U32, &type_I64,
466 &type_F32, &type_F64, &type_Ref, &type_Ref, &unsupported_type};
467 int32_t wasm_value_types[] = {
479 const size_t kWasmValueTypeCount =
484 Switch(wasm_value_type, &unexpected_type, wasm_value_types,
485 wasm_value_type_labels, kWasmValueTypeCount);
513 TNode<RawPtrT> data_pointer =
518 exit_point->
Return(value);
524 *var_double_value = ChangeFloat32ToFloat64(value);
531 *var_double_value =
value;
538 exit_point->
Return(value);
540 BIND(&unsupported_type);
542 Print(
"Not supported Wasm field type");
545 BIND(&unexpected_type);
549void AccessorAssembler::HandleLoadWasmField(
550 TNode<WasmObject> holder, TNode<Word32T> handler_word,
552 ExitPoint* exit_point) {
554 TNode<Int32T> wasm_value_type =
556 TNode<IntPtrT> field_offset =
Signed(
559 HandleLoadWasmField(holder, wasm_value_type, field_offset, var_double_value,
560 rebox_double, exit_point);
582 Label rebox_double(
this, &var_double_value);
589 Label if_element(
this), if_indexed_string(
this), if_property(
this),
590 if_hole(
this), unimplemented_elements_kind(
this),
592 emit_element_load(
this);
601 &if_indexed_string, &if_property);
612 p->
name(), &try_string_to_array_index, &var_instance_type);
613 var_intptr_index = intptr_index;
614 Goto(&emit_element_load);
616 BIND(&try_string_to_array_index);
621 ExternalReference::string_to_array_index_function());
629 Goto(&emit_element_load);
632 BIND(&emit_element_load);
639 is_jsarray_condition, &if_hole, &rebox_double,
640 &var_double_value, &unimplemented_elements_kind,
641 &if_oob, miss, exit_point, access_mode);
645 BIND(&unimplemented_elements_kind);
655 Comment(
"out of bounds elements access");
656 Label return_undefined(
this);
684 BIND(&return_undefined);
692 Comment(
"read hole and convert to undefined");
703 BIND(&if_indexed_string);
712 GotoIf(UintPtrGreaterThanOrEqual(index, length), &if_oob_string);
717 BIND(&if_oob_string);
731 Return(UndefinedConstant());
741 exit_point, ic_mode);
744 p, holder, handler_kind, handler_word, &rebox_double, &var_double_value,
745 handler, miss, exit_point, ic_mode, on_nonexistent, support_elements);
777 &native_data_property);
792#if V8_ENABLE_WEBASSEMBLY
793 Label is_wasm_field(
this);
804#if V8_ENABLE_WEBASSEMBLY
805 BIND(&is_wasm_field);
806 HandleLoadWasmField(
CAST(holder), handler_word, var_double_value,
807 rebox_double, exit_point);
818 exit_point->
Return(UndefinedConstant());
824 exit_point->
Return(holder);
833 Label found(
this, &var_name_index);
835 &found, &var_name_index, miss);
841 properties, var_name_index.value(), &var_details, &var_value);
843 var_value.value(),
CAST(holder), var_details.value(), p->
context(),
845 exit_point->
Return(value);
860 BIND(&native_data_property);
871 handler_kind, exit_point);
888 Label if_index(
this), if_unique_name(
this),
894 TryToName(p->
name(), &if_index, &var_index, &if_unique_name, &var_unique,
897 BIND(&if_unique_name);
899 holder, var_unique.value(), p->
receiver(),
905 Goto(&to_name_failed);
907 BIND(&to_name_failed);
927 CAST(holder), PropertyCell::kPropertyDetailsRawOffset));
928 GotoIf(IsPropertyCellHole(value), miss);
956 BIND(&module_export);
969 GotoIf(IsTheHole(value), &is_the_hole);
970 exit_point->
Return(value);
982#ifdef V8_ENABLE_EXPERIMENTAL_UNDEFINED_DOUBLE
983 Label if_not_undefined(
this);
984 GotoIfNot(IsDoubleUndefined(var_double_value->
value()), &if_not_undefined);
985 exit_point->
Return(UndefinedConstant());
987 BIND(&if_not_undefined);
997 Label return_true(
this), return_false(
this), return_lookup(
this),
998 normal(
this), global(
this), slow(
this);
1023 exit_point->
Return(TrueConstant());
1025 BIND(&return_false);
1026 exit_point->
Return(FalseConstant());
1028 BIND(&return_lookup);
1047 &found, &var_name_index, miss);
1050 exit_point->
Return(TrueConstant());
1059 GotoIf(IsPropertyCellHole(value), miss);
1061 exit_point->
Return(TrueConstant());
1096template <
typename ICHandler,
typename ICParameters>
1117 if (on_code_handler) {
1118 Label if_smi_handler(
this);
1121 on_code_handler(code);
1123 BIND(&if_smi_handler);
1131 int mask = ICHandler::LookupOnLookupStartObjectBits::kMask |
1132 ICHandler::DoAccessCheckOnLookupStartObjectBits::kMask;
1138 Label done(
this), if_do_access_check(
this),
1139 if_lookup_on_lookup_start_object(
this);
1148 &if_do_access_check, &if_lookup_on_lookup_start_object);
1150 BIND(&if_do_access_check);
1157 p->lookup_start_object(), &done, miss);
1160 BIND(&if_lookup_on_lookup_start_object);
1169 CAST(p->lookup_start_object()), JS_GLOBAL_OBJECT_TYPE)));
1174 Label found(
this, &var_name_index);
1176 properties,
CAST(p->name()), &found, &var_name_index, &done);
1179 if (on_found_on_lookup_start_object) {
1180 on_found_on_lookup_start_object(properties, var_name_index.value());
1189 return smi_or_code_handler;
1206 exit_point->
Return(TrueConstant());
1211 properties, name_index, &var_details, &var_value);
1213 var_value.value(),
CAST(var_holder->
value()), var_details.value(),
1215 exit_point->
Return(value);
1223 Label load_from_cached_holder(
this), is_smi(
this), done(
this);
1227 &load_from_cached_holder);
1237 exit_point->
Return(TrueConstant());
1239 exit_point->
Return(
CAST(maybe_holder_or_constant));
1243 BIND(&load_from_cached_holder);
1252 *var_holder = holder;
1258 *var_smi_handler = smi_handler;
1259 Goto(if_smi_handler);
1267 CSA_DCHECK(
this, IsNativeContext(expected_native_context));
1277 expected_native_context, Context::SECURITY_TOKEN_INDEX);
1279 LoadContextElement(
native_context, Context::SECURITY_TOKEN_INDEX);
1303 Comment(
"native_data_property_store");
1310 holder, accessor_info, p->
name(), p->
value());
1330 is_inobject, [&]() {
return holder; },
1346 Label if_smi_handler(
this), if_nonsmi_handler(
this);
1347 Label if_proto_handler(
this), call_handler(
this),
1348 store_transition_or_global_or_accessor(
this);
1352 Label if_slow(
this);
1356 BIND(&if_smi_handler);
1361 Label if_fast_smi(
this), if_proxy(
this), if_interceptor(
this);
1363#define ASSERT_CONSECUTIVE(a, b) \
1364 static_assert(static_cast<intptr_t>(StoreHandler::Kind::a) + 1 == \
1365 static_cast<intptr_t>(StoreHandler::Kind::b));
1371#undef ASSERT_CONSECUTIVE
1375 GotoIf(Int32LessThan(handler_kind,
STORE_KIND(kGlobalProxy)), &if_fast_smi);
1385 Label dictionary_found(
this, &var_name_index);
1388 &if_slow,
nullptr, miss);
1392 &var_name_index, miss);
1398 BIND(&dictionary_found);
1400 Label if_constant(
this), done(
this);
1404 const int kTypeAndReadOnlyMask =
1415 properties, var_name_index.value(), p->
value());
1421 Label data(
this), shared_struct_field(
this), native_data_property(
this);
1423 &native_data_property);
1425 &shared_struct_field, &data);
1427 BIND(&native_data_property);
1430 BIND(&shared_struct_field);
1445 BIND(&if_interceptor);
1464 id = Runtime::kDefineNamedOwnIC_Slow;
1466 id = Runtime::kDefineKeyedOwnIC_Slow;
1468 id = Runtime::kKeyedStoreIC_Slow;
1475 BIND(&if_nonsmi_handler);
1479 &store_transition_or_global_or_accessor);
1482 Branch(IsCodeMap(handler_map), &call_handler, &if_proto_handler);
1484 BIND(&if_proto_handler);
1491 ic_mode, support_elements);
1495 BIND(&call_handler);
1504 BIND(&store_transition_or_global_or_accessor);
1510 Label store_global(
this), store_transition(
this), store_accessor(
this);
1512 GotoIf(IsPropertyCellMap(strong_handler_map), &store_global);
1513 Branch(IsAccessorPairMap(strong_handler_map), &store_accessor,
1516 BIND(&store_global);
1524 Label proceed_defining(
this);
1529 BIND(&proceed_defining);
1537 BIND(&store_accessor);
1547 BIND(&store_transition);
1594 Label attributes_ok(
this);
1595 const int kKindAndAttributesDontDeleteReadOnlyMask =
1609 &attributes_ok, miss);
1611 BIND(&attributes_ok);
1615 descriptors, last_key_index, details,
1616 p->
value(), miss,
true);
1621 Comment(
"UpdateMayHaveInterestingProperty");
1644 Label r_smi(
this), r_double(
this), r_heapobject(
this), all_fine(
this);
1664 Branch(IsHeapNumber(
CAST(value)), &all_fine, bailout);
1667 BIND(&r_heapobject);
1683 Label check_done(
this);
1709 bool do_transitioning_store) {
1710 Label done(
this), if_field(
this), if_descriptor(
this);
1719 &if_field, &if_descriptor);
1726 CheckFieldType(descriptors, descriptor_name_index, representation, value,
1737 Label inobject(
this), backing_store(
this);
1738 Branch(UintPtrLessThan(field_index, instance_size_in_words), &inobject,
1744 Label tagged_rep(
this), double_rep(
this);
1747 &double_rep, &tagged_rep);
1751 if (do_transitioning_store) {
1767 if (do_transitioning_store) {
1777 BIND(&backing_store);
1782 if (do_transitioning_store) {
1796 var_value = heap_number;
1810 Label tagged_rep(
this), double_rep(
this);
1815 &double_rep, &tagged_rep);
1835 BIND(&if_descriptor);
1842 if (do_transitioning_store) {
1871 Label inobject(
this), backing_store(
this);
1872 Branch(UintPtrLessThan(field_index, instance_size_in_words), &inobject,
1882 BIND(&backing_store);
1894 shared_value.value());
1920 Comment(
"HandleStoreICProtoHandler");
1925 on_code_handler = [=,
this](
TNode<Code> code_handler) {
1927 Label if_element_store(
this), if_transitioning_element_store(
this);
1928 Branch(IsStoreHandler0Map(
LoadMap(handler)), &if_element_store,
1929 &if_transitioning_element_store);
1930 BIND(&if_element_store);
1937 BIND(&if_transitioning_element_store);
1954 p, handler, on_code_handler,
1960 const int kTypeAndReadOnlyMask =
1973 Label if_add_normal(
this), if_store_global_proxy(
this), if_api_setter(
this),
1974 if_accessor(
this), if_native_data_property(
this);
1990 &if_store_global_proxy);
1996 &if_native_data_property);
2003 BIND(&if_add_normal);
2009 Label slow_runtime_call(
this);
2017 &slow_runtime_call);
2021 BIND(&slow_runtime_call);
2040 BIND(&if_native_data_property);
2043 BIND(&if_api_setter);
2065 caller_context, function_template_info, p->
receiver(),
2069 BIND(&if_store_global_proxy);
2087 Label if_index(
this), if_unique_name(
this),
2091 TryToName(p->
name(), &if_index, &var_index, &if_unique_name, &var_unique,
2094 BIND(&if_unique_name);
2103 Goto(&to_name_failed);
2105 BIND(&to_name_failed);
2131 Label if_smi_field(
this), if_double_field(
this), if_heap_object_field(
this),
2132 if_tagged_field(
this);
2136 Label* case_labels[] = {&if_tagged_field, &if_heap_object_field,
2139 Switch(field_representation, &if_double_field, case_values, case_labels, 3);
2141 BIND(&if_tagged_field);
2143 Comment(
"store tagged field");
2148 BIND(&if_heap_object_field);
2150 Comment(
"heap object field checks");
2153 Comment(
"store heap object field");
2158 BIND(&if_smi_field);
2168 BIND(&if_double_field);
2172 Comment(
"double field checks");
2174#ifdef V8_ENABLE_EXPERIMENTAL_UNDEFINED_DOUBLE
2180 Comment(
"store double field");
2212 Label check_done(
this);
2265 bool store_value_as_double = representation.
IsDouble();
2270 is_inobject, [&]() {
return holder; },
2279 if (store_value_as_double) {
2283 Label property_and_offset_ready(
this);
2288 actual_property_storage =
CAST(field);
2290 Goto(&property_and_offset_ready);
2292 BIND(&property_and_offset_ready);
2293 property_storage = actual_property_storage.value();
2294 offset = actual_offset.value();
2298 Label do_store(
this);
2303 if (store_value_as_double) {
2317 if (store_value_as_double) {
2319 }
else if (representation.
IsSmi()) {
2340 Label if_smi_hash(
this), if_property_array(
this), extend_store(
this);
2348 var_encoded_hash = encoded_hash;
2350 var_properties = EmptyFixedArrayConstant();
2351 Goto(&extend_store);
2354 BIND(&if_property_array);
2356 var_properties =
CAST(properties);
2358 var_properties.value(), PropertyArray::kLengthAndHashOffset);
2364 Goto(&extend_store);
2367 BIND(&extend_store);
2385 CSA_DCHECK(
this, IntPtrLessThan(new_capacity,
2390 var_new_properties = new_properties;
2403 Word32Or(var_encoded_hash.value(), new_capacity_int32);
2406 StoreObjectField(
object, JSObject::kPropertiesOrHashOffset, new_properties);
2410 return CAST(var_new_properties.value());
2419 Comment(
"Fast elements bounds check");
2420 Label if_array(
this), length_loaded(
this, &var_length);
2421 GotoIf(is_jsarray_condition, &if_array);
2424 Goto(&length_loaded);
2429 Goto(&length_loaded);
2431 BIND(&length_loaded);
2432 GotoIfNot(UintPtrLessThan(intptr_index, var_length.value()), miss);
2439 Label* unimplemented_elements_kind,
Label* out_of_bounds,
Label* miss,
2441 Label if_rab_gsab_typed_array(
this), if_typed_array(
this), if_fast(
this),
2442 if_fast_packed(
this), if_fast_holey(
this), if_fast_double(
this),
2443 if_fast_holey_double(
this), if_nonfast(
this), if_dictionary(
this);
2444 Branch(Int32GreaterThan(elements_kind,
2446 &if_nonfast, &if_fast);
2452 is_jsarray_condition, out_of_bounds);
2465 &if_fast_packed, &if_fast_packed, &if_fast_packed,
2466 &if_fast_packed, &if_fast_packed, &if_fast_packed,
2468 &if_fast_holey, &if_fast_holey, &if_fast_holey,
2469 &if_fast_holey, &if_fast_holey,
2473 &if_fast_holey_double};
2474 Switch(elements_kind, unimplemented_elements_kind, kinds, labels,
2477 BIND(&if_fast_packed);
2479 Comment(
"fast packed elements");
2486 BIND(&if_fast_holey);
2488 Comment(
"fast holey elements");
2496 BIND(&if_fast_double);
2498 Comment(
"packed double elements");
2500 exit_point->
Return(TrueConstant());
2508 BIND(&if_fast_holey_double);
2510 Comment(
"holey double elements");
2514 exit_point->
Return(TrueConstant());
2516#ifdef V8_ENABLE_EXPERIMENTAL_UNDEFINED_DOUBLE
2517 Label if_undefined(
this);
2518 TNode<Float64T> value = LoadFixedDoubleArrayElementWithUndefinedCheck(
2519 CAST(elements), intptr_index, &if_undefined, if_hole);
2520 *var_double_value =
value;
2523 BIND(&if_undefined);
2524 exit_point->
Return(UndefinedConstant());
2536 Label uint8_elements(
this), int8_elements(
this), uint16_elements(
this),
2537 int16_elements(
this), uint32_elements(
this), int32_elements(
this),
2538 float32_elements(
this), float64_elements(
this), bigint64_elements(
this),
2539 biguint64_elements(
this), float16_elements(
this);
2542 GotoIf(Int32GreaterThanOrEqual(
2545 &if_rab_gsab_typed_array);
2546 GotoIf(Int32GreaterThanOrEqual(
2552 Goto(unimplemented_elements_kind);
2554 BIND(&if_dictionary);
2556 Comment(
"dictionary elements");
2567 CAST(elements), intptr_index, miss, if_hole);
2573 BIND(&if_rab_gsab_typed_array);
2575 Comment(
"rab gsab typed elements");
2576 Label variable_length(
this), normal(
this), length_check_ok(
this);
2584 Branch(UintPtrLessThan(intptr_index, length), &length_check_ok,
2586 BIND(&length_check_ok);
2589 exit_point->
Return(TrueConstant());
2592 Label* elements_kind_labels[] = {
2593 &uint8_elements, &uint8_elements, &int8_elements,
2594 &uint16_elements, &int16_elements, &uint32_elements,
2595 &int32_elements, &float32_elements, &float64_elements,
2596 &bigint64_elements, &biguint64_elements, &float16_elements,
2598 int32_t elements_kinds[] = {
2599 RAB_GSAB_UINT8_ELEMENTS, RAB_GSAB_UINT8_CLAMPED_ELEMENTS,
2600 RAB_GSAB_INT8_ELEMENTS, RAB_GSAB_UINT16_ELEMENTS,
2601 RAB_GSAB_INT16_ELEMENTS, RAB_GSAB_UINT32_ELEMENTS,
2602 RAB_GSAB_INT32_ELEMENTS, RAB_GSAB_FLOAT32_ELEMENTS,
2603 RAB_GSAB_FLOAT64_ELEMENTS, RAB_GSAB_BIGINT64_ELEMENTS,
2604 RAB_GSAB_BIGUINT64_ELEMENTS, RAB_GSAB_FLOAT16_ELEMENTS};
2605 const size_t kTypedElementsKindCount =
2610 Switch(elements_kind, miss, elements_kinds, elements_kind_labels,
2611 kTypedElementsKindCount);
2615 BIND(&if_typed_array);
2620 GotoIf(IsDetachedBuffer(buffer), miss);
2624 GotoIfNot(UintPtrLessThan(intptr_index, length), out_of_bounds);
2626 exit_point->
Return(TrueConstant());
2630 Label* elements_kind_labels[] = {
2631 &uint8_elements, &uint8_elements, &int8_elements,
2632 &uint16_elements, &int16_elements, &uint32_elements,
2633 &int32_elements, &float32_elements, &float64_elements,
2634 &bigint64_elements, &biguint64_elements, &float16_elements};
2635 int32_t elements_kinds[] = {
2636 UINT8_ELEMENTS, UINT8_CLAMPED_ELEMENTS, INT8_ELEMENTS,
2637 UINT16_ELEMENTS, INT16_ELEMENTS, UINT32_ELEMENTS,
2638 INT32_ELEMENTS, FLOAT32_ELEMENTS, FLOAT64_ELEMENTS,
2639 BIGINT64_ELEMENTS, BIGUINT64_ELEMENTS, FLOAT16_ELEMENTS};
2640 const size_t kTypedElementsKindCount =
2645 Switch(elements_kind, miss, elements_kinds, elements_kind_labels,
2646 kTypedElementsKindCount);
2650 BIND(&uint8_elements);
2656 BIND(&int8_elements);
2662 BIND(&uint16_elements);
2669 BIND(&int16_elements);
2676 BIND(&uint32_elements);
2683 BIND(&int32_elements);
2690 BIND(&float16_elements);
2699 BIND(&float32_elements);
2704 *var_double_value = ChangeFloat32ToFloat64(element);
2707 BIND(&float64_elements);
2712 *var_double_value = element;
2715 BIND(&bigint64_elements);
2719 data_ptr.value(),
Unsigned(intptr_index), BIGINT64_ELEMENTS));
2721 BIND(&biguint64_elements);
2723 Comment(
"BIGUINT64_ELEMENTS");
2725 data_ptr.value(),
Unsigned(intptr_index), BIGUINT64_ELEMENTS));
2734 Label is_prototype(
this), cont(
this);
2736 if (maybe_bitfield3) {
2737 bitfield3 = maybe_bitfield3.value();
2743 &is_prototype, &cont);
2745 BIND(&is_prototype);
2753 ExternalReference::invalidate_prototype_chains_function());
2769 Label if_custom(
this), if_element_hole(
this), if_oob(
this);
2770 Label return_undefined(
this);
2780 Label rebox_double(
this, &var_double_value);
2783 Label* unimplemented_elements_kind = slow;
2785 is_jsarray_condition, &if_element_hole, &rebox_double,
2786 &var_double_value, unimplemented_elements_kind, &if_oob, slow,
2789 BIND(&rebox_double);
2790#ifdef V8_ENABLE_EXPERIMENTAL_UNDEFINED_DOUBLE
2791 GotoIf(IsDoubleUndefined(var_double_value.value()), &return_undefined);
2807 &if_element_hole, slow);
2813 BIND(&if_element_hole);
2824 Comment(
"load string character");
2826 GotoIfNot(UintPtrLessThan(index, length), slow);
2828 lookup_start_object, index);
2831 BIND(&return_undefined);
2832 Return(UndefinedConstant());
2842 Comment(
"key is unique name");
2843 Label if_found_on_lookup_start_object(
this), if_property_dictionary(
this),
2844 lookup_prototype_chain(
this), special_receiver(
this);
2858 &if_property_dictionary);
2866 Label if_descriptor_found(
this), try_stub_cache(
this);
2869 : &lookup_prototype_chain;
2871 &var_name_index, notfound);
2873 BIND(&if_descriptor_found);
2876 descriptors, var_name_index.value(),
2877 &var_details, &var_value);
2878 Goto(&if_found_on_lookup_start_object);
2883 Label stub_cache(
this);
2884 BIND(&try_stub_cache);
2891 Comment(
"stub cache probe for fast property load");
2893 Label found_handler(
this, &var_handler), stub_cache_miss(
this);
2895 lookup_start_object_map, name, &found_handler,
2896 &var_handler, &stub_cache_miss);
2897 BIND(&found_handler);
2904 BIND(&stub_cache_miss);
2908 Comment(
"KeyedLoadGeneric_miss");
2916 BIND(&if_property_dictionary);
2918 Comment(
"dictionary property load");
2923 Label dictionary_found(
this, &var_name_index);
2927 &dictionary_found, &var_name_index,
2928 &lookup_prototype_chain);
2929 BIND(&dictionary_found);
2932 properties, var_name_index.value(), &var_details, &var_value);
2933 Goto(&if_found_on_lookup_start_object);
2937 BIND(&if_found_on_lookup_start_object);
2940 var_value.value(),
CAST(lookup_start_object), var_details.value(),
2945 BIND(&lookup_prototype_chain);
2949 Label return_undefined(
this), is_private_symbol(
this);
2950 Label loop(
this, {&var_holder_map, &var_holder_instance_type});
2952 var_holder_map = lookup_start_object_map;
2953 var_holder_instance_type = lookup_start_object_instance_type;
2961 JS_TYPED_ARRAY_TYPE),
2967 var_holder_map = proto_map;
2968 var_holder_instance_type = proto_instance_type;
2969 Label next_proto(
this), return_value(
this, &var_value), goto_slow(
this);
2971 proto_instance_type, name, &return_value, &var_value,
2972 &next_proto, &goto_slow);
2982 BIND(&return_value);
2983 Return(var_value.value());
2986 BIND(&is_private_symbol);
2996 BIND(&return_undefined);
2997 Return(UndefinedConstant());
3000 BIND(&special_receiver);
3012 lookup_start_object, name, p->
receiver(),
3074 const int kMultiplier =
3109 Label try_secondary(
this), miss(
this);
3118 lookup_start_object_map, if_handler, var_handler,
3121 BIND(&try_secondary);
3127 lookup_start_object_map, if_handler, var_handler,
3161 Comment(
"LoadIC_BytecodeHandler_fast");
3164 Label try_polymorphic(
this), if_handler(
this, &var_handler);
3169 p->
slot(),
CAST(p->
vector()), weak_lookup_start_object_map, &if_handler,
3170 &var_handler, &try_polymorphic);
3175 BIND(&try_polymorphic);
3181 &if_handler, &var_handler, &miss);
3187 Comment(
"LoadIC_BytecodeHandler_noninlined");
3197 Comment(
"LoadIC_BytecodeHandler_nofeedback");
3206 Comment(
"LoadIC_BytecodeHandler_miss");
3233 p->
slot(),
CAST(p->
vector()), weak_lookup_start_object_map, &if_handler,
3234 &var_handler, &try_polymorphic);
3241 BIND(&try_polymorphic);
3245 Comment(
"LoadIC_try_polymorphic");
3248 &if_handler, &var_handler, &miss);
3254 &if_handler, &miss, &direct_exit);
3276 Label if_handler(
this, &var_handler), no_feedback(
this),
3290 p->
slot(),
CAST(p->
vector()), weak_lookup_start_object_map, &if_handler,
3291 &var_handler, &try_polymorphic);
3302 BIND(&try_polymorphic);
3305 Comment(
"LoadSuperIC_try_polymorphic");
3308 &if_handler, &var_handler, &miss);
3316 &if_handler, &miss, &direct_exit);
3337 Label try_megamorphic(
this), try_megadom(
this);
3343 BIND(&try_megamorphic);
3346 lookup_start_object_map,
CAST(p->
name()), if_handler,
3353 var_handler, p->
vector(), p->
slot(), miss, exit_point);
3373 GotoIfNot(IsPrototypeString(p->
name()), ¬_function_prototype);
3376 lookup_start_object_map,
3377 ¬_function_prototype);
3379 BIND(¬_function_prototype);
3422 GotoIf(IsUndefined(maybe_feedback_vector), &no_feedback);
3429 &try_handler, &miss);
3433 typeof_mode, exit_point, &miss);
3438 Comment(
"LoadGlobalIC_MissCase");
3442 slot, maybe_feedback_vector,
3454 lazy_context(), lazy_name(),
3463 Comment(
"LoadGlobalIC_TryPropertyCellCase");
3465 Label if_lexical_var(
this), if_property_cell(
this);
3469 BIND(&if_property_cell);
3480 exit_point->
Return(value);
3483 BIND(&if_lexical_var);
3488 Comment(
"Load lexical variable");
3505 Comment(
"LoadGlobalIC_TryHandlerCase");
3507 Label call_handler(
this), non_smi(
this);
3526 [=] {
return slot; }, vector, global);
3536 LoadContextElement(
native_context, Context::SCRIPT_CONTEXT_TABLE_INDEX));
3538 Label loop(
this, &context_index);
3555 IndexOfLocalName(scope_info, name, &loop);
3559 context_local_index);
3576 BIND(&throw_reference_error);
3579 BIND(®ular_load);
3582 TailCallBuiltin(Builtin::kLoadIC_NoFeedback, context, global_object, name,
3609 p->
slot(),
CAST(p->
vector()), weak_lookup_start_object_map, &if_handler,
3610 &var_handler, &try_polymorphic);
3619 BIND(&try_polymorphic);
3623 Comment(
"KeyedLoadIC_try_polymorphic");
3624 GotoIfNot(IsWeakFixedArrayMap(
LoadMap(strong_feedback)), &try_megamorphic);
3626 &if_handler, &var_handler, &miss);
3629 BIND(&try_megamorphic);
3632 Comment(
"KeyedLoadIC_try_megamorphic");
3634 &try_uninitialized);
3642 : Builtin::kKeyedHasIC_Megamorphic,
3646 BIND(&try_uninitialized);
3649 Comment(
"KeyedLoadIC_try_uninitialized");
3651 &try_polymorphic_name);
3654 BIND(&try_polymorphic_name);
3658 Comment(
"KeyedLoadIC_try_polymorphic_name");
3660 Label if_polymorphic_name(
this), feedback_matches(
this),
3669 TryToName(p->
name(), &miss, &var_index, &if_internalized, &var_name,
3670 &miss, &if_notinternalized);
3673 BIND(&if_internalized);
3677 &if_polymorphic_name, &miss);
3680 BIND(&if_notinternalized);
3684 &var_name, &miss, &miss);
3687 BIND(&feedback_matches);
3690 Goto(&if_polymorphic_name);
3693 BIND(&if_polymorphic_name);
3698 ? Builtin::kKeyedLoadIC_PolymorphicName
3699 : Builtin::kKeyedHasIC_PolymorphicName,
3710 : Runtime::kKeyedHasIC_Miss,
3726 Label if_index(
this), if_unique_name(
this, &var_name), if_notunique(
this),
3729 TryToName(var_name.value(), &if_index, &var_index, &if_unique_name,
3730 &var_unique, &if_other, &if_notunique);
3732 BIND(&if_unique_name);
3744 TryToName(var_name.value(), &if_index, &var_index, &if_unique_name,
3745 &var_unique, &if_runtime, &if_notunique);
3748 BIND(&if_notunique);
3750 if (
v8_flags.internalize_on_the_fly) {
3755 Label if_in_string_table(
this);
3757 &if_in_string_table, &var_unique, &if_runtime,
3760 BIND(&if_in_string_table);
3771 lookup_start_object_map,
3785 var_index.value(), &if_runtime);
3791 Comment(
"KeyedLoadGeneric_slow");
3822 &var_handler, &miss);
3838 : Runtime::kKeyedHasIC_Miss,
3847 Label if_handler(
this, &var_handler),
3862 &if_handler, &var_handler, &try_polymorphic);
3865 Comment(
"StoreIC_if_handler");
3870 BIND(&try_polymorphic);
3874 Comment(
"StoreIC_try_polymorphic");
3875 GotoIfNot(IsWeakFixedArrayMap(
LoadMap(strong_feedback)), &try_megamorphic);
3877 &var_handler, &miss);
3880 BIND(&try_megamorphic);
3886 CAST(p->
name()), &if_handler, &var_handler, &miss);
3893 auto builtin = p->
IsDefineNamedOwn() ? Builtin::kDefineNamedOwnIC_NoFeedback
3894 : Builtin::kStoreIC_NoFeedback;
3902 : Runtime::kStoreIC_Miss;
3910 if_heapobject(
this);
3917 BIND(&if_heapobject);
3934 Comment(
"StoreGlobalIC_try_handler");
3959 BIND(&if_lexical_var);
3964 Comment(
"Store lexical variable");
3972 StoreContextElementAndUpdateSideData(script_context, slot_index,
3987 Comment(
"StoreGlobalIC_TryPropertyCellCase");
3995 property_cell, PropertyCell::kPropertyDetailsRawOffset);
4004 Label constant(
this),
store(
this), not_smi(
this);
4036 exit_point->
Return(value);
4045 exit_point->
Return(value);
4054 Label if_handler(
this, &var_handler),
4069 &if_handler, &var_handler, &try_polymorphic);
4072 Comment(
"KeyedStoreIC_if_handler");
4077 BIND(&try_polymorphic);
4081 Comment(
"KeyedStoreIC_try_polymorphic");
4085 &if_handler, &var_handler, &miss);
4088 BIND(&try_megamorphic);
4091 Comment(
"KeyedStoreIC_try_megamorphic");
4093 &no_feedback, &try_polymorphic_name);
4103 BIND(&try_polymorphic_name);
4106 Comment(
"KeyedStoreIC_try_polymorphic_name");
4133 Label did_set_function_name_if_needed(
this);
4138 GotoIfNot(needs_set_function_name, &did_set_function_name_if_needed);
4140 Comment(
"DefineKeyedOwnIC_set_function_name");
4144 Goto(&did_set_function_name_if_needed);
4145 BIND(&did_set_function_name_if_needed);
4149 Label if_handler(
this, &var_handler),
4164 &if_handler, &var_handler, &try_polymorphic);
4167 Comment(
"DefineKeyedOwnIC_if_handler");
4172 BIND(&try_polymorphic);
4176 Comment(
"DefineKeyedOwnIC_try_polymorphic");
4180 &if_handler, &var_handler, &miss);
4183 BIND(&try_megamorphic);
4186 Comment(
"DefineKeyedOwnIC_try_megamorphic");
4188 &no_feedback, &try_polymorphic_name);
4197 BIND(&try_polymorphic_name);
4200 Comment(
"DefineKeyedOwnIC_try_polymorphic_name");
4213 Comment(
"DefineKeyedOwnIC_miss");
4224 Label if_handler(
this, &var_handler),
4236 &if_handler, &var_handler, &try_polymorphic);
4240 Comment(
"StoreInArrayLiteralIC_if_handler");
4242 Label if_transitioning_element_store(
this), if_smi_handler(
this);
4259 BIND(&if_transitioning_element_store);
4273 BIND(&if_smi_handler);
4283 Comment(
"StoreInArrayLiteralIC_Slow");
4289 BIND(&try_polymorphic);
4292 Comment(
"StoreInArrayLiteralIC_try_polymorphic");
4296 &var_handler, &miss);
4299 BIND(&try_megamorphic);
4301 Comment(
"StoreInArrayLiteralIC_try_megamorphic");
4305 TaggedEqual(strong_feedback, MegamorphicSymbolConstant())));
4315 Comment(
"StoreInArrayLiteralIC_NoFeedback");
4322 Comment(
"StoreInArrayLiteralIC_miss");
4358 MegamorphicSymbolConstant()));
4361 &if_handler, &var_handler, &miss);
4368 [=] {
return name; },
4370 [=] {
return slot; }, vector);
4397 &if_handler, &miss, &direct_exit);
4420 UndefinedConstant());
4465 auto lookup_start_object =
Parameter<JSAny>(Descriptor::kLookupStartObject);
4472 lookup_start_object);
4487 name, slot, vector);
4512 [=] {
return slot; },
4516 [=] {
return name; }, typeof_mode, &direct_exit);
4528 name, slot, vector);
4540 name, slot, vector);
4558 auto slot = lazy_slot();
4568 auto name = lazy_name();
4570 ? Runtime::kLoadLookupSlotInsideTypeof
4571 : Runtime::kLoadLookupSlot;
4609 lazy_name(), lazy_slot(), lazy_feedback_vector());
4615 ? Runtime::kLoadLookupSlotInsideTypeof
4616 : Runtime::kLoadLookupSlot;
4672 auto lookup_start_object = std::nullopt;
4675 enum_index, cache_type);
4728 enum_index, cache_type, slot, vector);
4763 auto flags = std::nullopt;
4781 TailCallBuiltin(Builtin::kStoreGlobalIC, context, name, value, slot, vector);
4793 TailCallBuiltin(Builtin::kStoreGlobalIC, context, name, value, slot, vector);
4802 auto flags = std::nullopt;
4818 auto flags = std::nullopt;
4828 MegamorphicSymbolConstant()));
4831 &if_handler, &var_handler, &miss);
4896 auto flags = std::nullopt;
4942 auto flags = std::nullopt;
4977 value, slot, vector);
5022 flags, slot, vector);
5037 flags, slot, vector);
5046 auto flags = std::nullopt;
5067 TailCallBuiltin(Builtin::kStoreInArrayLiteralIC, context, array, index, value,
5104 Goto(&try_fast_case);
5106 BIND(&try_fast_case);
5114 Label did_set_proto_if_needed(
this);
5118 GotoIfNot(is_null_proto, &did_set_proto_if_needed);
5123 Goto(&did_set_proto_if_needed);
5124 BIND(&did_set_proto_if_needed);
5151 BIND(&runtime_copy);
5156 BIND(&call_runtime);
5170 TailCallBuiltin(Builtin::kCloneObjectIC, context, source, flags, slot,
5182 Label if_result_map(
this, &result_map), if_empty_object(
this),
5189 GotoIf(IsUndefined(maybe_vector), &miss);
5197 Label if_handler(
this, &var_handler);
5199 &if_handler, &var_handler, &try_polymorphic);
5201 BIND(&try_polymorphic);
5204 Comment(
"CloneObjectIC_try_polymorphic");
5208 &var_handler, &miss);
5211 BIND(&try_megamorphic);
5213 Comment(
"CloneObjectIC_try_megamorphic");
5217 TaggedEqual(strong_feedback, MegamorphicSymbolConstant())));
5224 Comment(
"CloneObjectIC_if_handler");
5234 Goto(&if_result_map);
5239 BIND(&if_result_map);
5240 Comment(
"CloneObjectIC_if_result_map");
5243 CAST(source), source_map, result_map.value(),
5246 return UncheckedCast<JSObject>(AllocateJSObjectFromMap(
5247 map, properties, elements, AllocationFlag::kNone,
5248 SlackTrackingMode::kDontInitializeInObjectProperties));
5258 BIND(&if_empty_object);
5259 Comment(
"CloneObjectIC_if_empty_object");
5269 TailCallBuiltin(Builtin::kCloneObjectIC_Slow, context, source, flags, slot,
5275 Comment(
"CloneObjectIC_miss");
5277 CAST(
CallRuntime(Runtime::kCloneObjectIC_Miss, context, source, flags,
5278 slot, maybe_vector));
5279 Label restart(
this);
5285 result_map =
CAST(map_or_result);
5286 Goto(&if_result_map);
5341 Label* possibly_elements) {
5343 Label loop_body(
this, &var_map);
5346 EmptySlowElementDictionaryConstant();
5363 &if_custom, &if_notcustom);
5374 Branch(IsEmptyString(prototype_value), &if_notcustom, possibly_elements);
5377 BIND(&if_notcustom);
5380 var_map = prototype_map;
5383 &loop_body, possibly_elements);
#define CSA_DCHECK(csa,...)
#define CSA_CHECK(csa, x)
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static constexpr U encode(T value)
static constexpr int kShift
void GenerateKeyedLoadICBaseline()
void GenerateKeyedLoadICTrampoline_Megamorphic()
void HandleLoadICSmiHandlerHasNamedCase(const LazyLoadICParameters *p, TNode< Object > holder, TNode< Uint32T > handler_kind, Label *miss, ExitPoint *exit_point, ICMode ic_mode)
TNode< Object > HandleProtoHandler(const ICParameters *p, TNode< DataHandler > handler, const OnCodeHandler &on_code_handler, const OnFoundOnLookupStartObject &on_found_on_lookup_start_object, Label *miss, ICMode ic_mode)
void GenerateStoreICBaseline()
void GenerateLoadGlobalICBaseline(TypeofMode typeof_mode)
void UpdateMayHaveInterestingProperty(TNode< PropertyDictionary > dict, TNode< Name > name)
void GenerateStoreICTrampoline_Megamorphic()
void StoreIC(const StoreICParameters *p)
void GenerateLoadICTrampoline_Megamorphic()
void CheckPrototypeValidityCell(TNode< Object > maybe_validity_cell, Label *miss)
void GenerateKeyedLoadIC_PolymorphicName()
void InvalidateValidityCellIfPrototype(TNode< Map > map, std::optional< TNode< Uint32T > > bitfield3=std::nullopt)
void HandleStoreICSmiHandlerCase(TNode< Word32T > handler_word, TNode< JSObject > holder, TNode< Object > value, Label *miss)
void HandleStoreICSmiHandlerJSSharedStructFieldCase(TNode< Context > context, TNode< Word32T > handler_word, TNode< JSObject > holder, TNode< Object > value)
void LookupGlobalIC(LazyNode< Object > lazy_name, TNode< TaggedIndex > depth, LazyNode< TaggedIndex > lazy_slot, TNode< Context > context, LazyNode< FeedbackVector > lazy_feedback_vector, TypeofMode typeof_mode)
void GenerateKeyedHasIC()
void GenerateLoadIC_Megamorphic()
void JumpIfDataProperty(TNode< Uint32T > details, Label *writable, Label *readonly)
void EmitAccessCheck(TNode< Context > expected_native_context, TNode< Context > context, TNode< Object > receiver, Label *can_access, Label *miss)
void GenerateLoadGlobalICTrampoline(TypeofMode typeof_mode)
void GenerateKeyedStoreIC()
void GenerateLoadICBaseline()
void GenerateEnumeratedKeyedLoadICBaseline()
void EmitElementLoad(TNode< HeapObject > object, TNode< Word32T > elements_kind, TNode< IntPtrT > key, TNode< BoolT > is_jsarray_condition, Label *if_hole, Label *rebox_double, TVariable< Float64T > *var_double_value, Label *unimplemented_elements_kind, Label *out_of_bounds, Label *miss, ExitPoint *exit_point, LoadAccessMode access_mode=LoadAccessMode::kLoad)
void HandleStoreFieldAndReturn(TNode< Word32T > handler_word, TNode< JSObject > holder, TNode< Object > value, std::optional< TNode< Float64T > > double_value, Representation representation, Label *miss)
void HandleStoreToProxy(const StoreICParameters *p, TNode< JSProxy > proxy, Label *miss, ElementSupport support_elements)
void GenerateDefineKeyedOwnICTrampoline()
void HandleLoadCallbackProperty(const LazyLoadICParameters *p, TNode< JSObject > holder, TNode< Word32T > handler_word, ExitPoint *exit_point)
void CheckDescriptorConsidersNumbersMutable(TNode< Word32T > handler_word, TNode< JSObject > holder, Label *bailout)
void HandleStoreICTransitionMapHandlerCase(const StoreICParameters *p, TNode< Map > transition_map, Label *miss, StoreTransitionMapFlags flags)
void HandlePolymorphicCase(TNode< HeapObjectReference > weak_lookup_start_object_map, TNode< WeakFixedArray > feedback, Label *if_handler, TVariable< MaybeObject > *var_handler, Label *if_miss)
void GenerateLoadGlobalIC_NoFeedback()
void HandleLoadICHandlerCase(const LazyLoadICParameters *p, TNode< MaybeObject > handler, Label *miss, ExitPoint *exit_point, ICMode ic_mode=ICMode::kNonGlobalIC, OnNonExistent on_nonexistent=OnNonExistent::kReturnUndefined, ElementSupport support_elements=kOnlyProperties, LoadAccessMode access_mode=LoadAccessMode::kLoad)
void EmitFastElementsBoundsCheck(TNode< JSObject > object, TNode< FixedArrayBase > elements, TNode< IntPtrT > intptr_index, TNode< BoolT > is_jsarray_condition, Label *miss)
void LoadGlobalIC_TryHandlerCase(TNode< FeedbackVector > vector, TNode< TaggedIndex > slot, const LazyNode< Context > &lazy_context, const LazyNode< Name > &lazy_name, TypeofMode typeof_mode, ExitPoint *exit_point, Label *miss)
TNode< BoolT > IsPropertyDetailsConst(TNode< Uint32T > details)
void GenerateEnumeratedKeyedLoadIC()
void HandleStoreICProtoHandler(const StoreICParameters *p, TNode< StoreHandler > handler, Label *slow, Label *miss, ICMode ic_mode, ElementSupport support_elements)
void KeyedLoadIC(const LoadICParameters *p, LoadAccessMode access_mode)
void GenerateStoreInArrayLiteralIC()
@ kValidateTransitionHandler
@ kStoreTransitionMapFlagsMask
@ kCheckPrototypeValidity
@ kDontCheckPrototypeValidity
void GenerateKeyedHasIC_Megamorphic()
void LoadGlobalIC_TryPropertyCellCase(TNode< FeedbackVector > vector, TNode< TaggedIndex > slot, const LazyNode< Context > &lazy_context, ExitPoint *exit_point, Label *try_handler, Label *miss)
void KeyedLoadICGeneric(const LoadICParameters *p)
void OverwriteExistingFastDataProperty(TNode< HeapObject > object, TNode< Map > object_map, TNode< DescriptorArray > descriptors, TNode< IntPtrT > descriptor_name_index, TNode< Uint32T > details, TNode< Object > value, Label *slow, bool do_transitioning_store)
void GenerateKeyedLoadIC_Megamorphic()
void ScriptContextTableLookup(TNode< Name > name, TNode< NativeContext > native_context, Label *found_hole, Label *not_found)
TNode< PropertyArray > ExtendPropertiesBackingStore(TNode< HeapObject > object, TNode< IntPtrT > index)
void LoadSuperIC_NoFeedback(const LoadICParameters *p)
void HandleStoreICHandlerCase(const StoreICParameters *p, TNode< MaybeObject > handler, Label *miss, ICMode ic_mode, ElementSupport support_elements=kOnlyProperties)
void GenerateStoreGlobalICBaseline()
void GenerateCloneObjectIC_Slow()
TNode< Object > LoadDescriptorValue(TNode< Map > map, TNode< IntPtrT > descriptor_entry)
void TryEnumeratedKeyedLoad(const LoadICParameters *p, TNode< Map > lookup_start_object_map, ExitPoint *exit_point)
TNode< MaybeObject > LoadDescriptorValueOrFieldType(TNode< Map > map, TNode< IntPtrT > descriptor_entry)
void TryProbeStubCache(StubCache *stub_cache, TNode< JSAny > lookup_start_object, TNode< Map > lookup_start_object_map, TNode< Name > name, Label *if_handler, TVariable< MaybeObject > *var_handler, Label *if_miss)
void TryProbeStubCacheTable(StubCache *stub_cache, StubCacheTable table_id, TNode< IntPtrT > entry_offset, TNode< Object > name, TNode< Map > map, Label *if_handler, TVariable< MaybeObject > *var_handler, Label *if_miss)
void GenerateStoreInArrayLiteralICBaseline()
void HandleLoadICSmiHandlerLoadNamedCase(const LazyLoadICParameters *p, TNode< Object > holder, TNode< Uint32T > handler_kind, TNode< Word32T > handler_word, Label *rebox_double, TVariable< Float64T > *var_double_value, TNode< MaybeObject > handler, Label *miss, ExitPoint *exit_point, ICMode ic_mode, OnNonExistent on_nonexistent, ElementSupport support_elements)
TNode< IntPtrT > StubCacheSecondaryOffset(TNode< Name > name, TNode< Map > map)
void GenericElementLoad(TNode< JSAnyNotSmi > lookup_start_object, TNode< Map > lookup_start_object_map, TNode< Int32T > lookup_start_object_instance_type, TNode< IntPtrT > index, Label *slow)
void GenerateKeyedStoreICBaseline()
std::function< void(TNode< Code > code_handler)> OnCodeHandler
TNode< MaybeObject > LoadHandlerDataField(TNode< DataHandler > handler, int data_index)
void HandleLoadAccessor(const LazyLoadICParameters *p, TNode< FunctionTemplateInfo > function_template_info, TNode< Word32T > handler_word, TNode< DataHandler > handler, TNode< Uint32T > handler_kind, ExitPoint *exit_point)
void GenerateCloneObjectIC()
void GenerateKeyedStoreICTrampoline()
void StoreGlobalIC_PropertyCellCase(TNode< PropertyCell > property_cell, TNode< Object > value, ExitPoint *exit_point, Label *miss)
void GenerateDefineKeyedOwnICBaseline()
void StoreInArrayLiteralIC(const StoreICParameters *p)
void GotoIfNotSameNumberBitPattern(TNode< Float64T > left, TNode< Float64T > right, Label *miss)
void GenerateStoreGlobalIC()
void GenerateLoadICTrampoline()
void GenerateLookupContextTrampoline(TypeofMode typeof_mode, ContextKind context_kind)
void GenerateStoreGlobalICTrampoline()
void StoreJSSharedStructField(TNode< Context > context, TNode< HeapObject > shared_struct, TNode< Map > shared_struct_map, TNode< DescriptorArray > descriptors, TNode< IntPtrT > descriptor_name_index, TNode< Uint32T > details, TNode< Object > value)
void GenericPropertyLoad(TNode< JSAnyNotSmi > lookup_start_object, TNode< Map > lookup_start_object_map, TNode< Int32T > lookup_start_object_instance_type, const LoadICParameters *p, Label *slow, UseStubCache use_stub_cache=kUseStubCache)
void GenerateLookupContextBaseline(TypeofMode typeof_mode, ContextKind context_kind)
void GenerateLoadSuperIC()
void GenerateDefineKeyedOwnIC()
void HandleLoadICSmiHandlerCase(const LazyLoadICParameters *p, TNode< Object > holder, TNode< Smi > smi_handler, TNode< MaybeObject > handler, Label *miss, ExitPoint *exit_point, ICMode ic_mode, OnNonExistent on_nonexistent, ElementSupport support_elements, LoadAccessMode access_mode)
void LookupContext(LazyNode< Object > lazy_name, TNode< TaggedIndex > depth, LazyNode< TaggedIndex > lazy_slot, TNode< Context > context, TypeofMode typeof_mode, ContextKind context_kind)
void GenerateCloneObjectICBaseline()
void LoadGlobalIC(TNode< HeapObject > maybe_feedback_vector, const LazyNode< TaggedIndex > &lazy_slot, const LazyNode< Context > &lazy_context, const LazyNode< Name > &lazy_name, TypeofMode typeof_mode, ExitPoint *exit_point)
void GenerateStoreICTrampoline()
void KeyedStoreIC(const StoreICParameters *p)
TNode< IntPtrT > StubCachePrimaryOffset(TNode< Name > name, TNode< Map > map)
void CheckHeapObjectTypeMatchesDescriptor(TNode< Word32T > handler_word, TNode< JSObject > holder, TNode< Object > value, Label *bailout)
void KeyedLoadICPolymorphicName(const LoadICParameters *p, LoadAccessMode access_mode)
void GenerateLookupGlobalIC(TypeofMode typeof_mode)
void GenerateLookupGlobalICBaseline(TypeofMode typeof_mode)
void GenerateDefineNamedOwnICBaseline()
void GenerateLoadSuperICBaseline()
void GenerateDefineNamedOwnICTrampoline()
void GenerateStoreIC_Megamorphic()
void HandleLoadICProtoHandler(const LazyLoadICParameters *p, TNode< DataHandler > handler, TVariable< Object > *var_holder, TVariable< MaybeObject > *var_smi_handler, Label *if_smi_handler, Label *miss, ExitPoint *exit_point, ICMode ic_mode, LoadAccessMode access_mode)
void GenerateDefineNamedOwnIC()
void GenerateLookupGlobalICTrampoline(TypeofMode typeof_mode)
void CheckFieldType(TNode< DescriptorArray > descriptors, TNode< IntPtrT > name_index, TNode< Word32T > representation, TNode< Object > value, Label *bailout)
void LoadGlobalIC_NoFeedback(TNode< Context > context, TNode< Object > name, TNode< Smi > smi_typeof_mode)
void HandleLoadField(TNode< JSObject > holder, TNode< Word32T > handler_word, TVariable< Float64T > *var_double_value, Label *rebox_double, Label *miss, ExitPoint *exit_point)
void LoadIC_BytecodeHandler(const LazyLoadICParameters *p, ExitPoint *exit_point)
std::function< void( TNode< PropertyDictionary > properties, TNode< IntPtrT > name_index)> OnFoundOnLookupStartObject
void GenerateKeyedHasICBaseline()
void LoadSuperIC(const LoadICParameters *p)
void GenerateKeyedHasIC_PolymorphicName()
void HandleStoreICNativeDataProperty(const StoreICParameters *p, TNode< HeapObject > holder, TNode< Word32T > handler_word)
void GenerateKeyedLoadICTrampoline()
void LoadIC(const LoadICParameters *p)
void LoadIC_Noninlined(const LoadICParameters *p, TNode< Map > lookup_start_object_map, TNode< HeapObject > feedback, TVariable< MaybeObject > *var_handler, Label *if_handler, Label *miss, ExitPoint *exit_point)
void GenerateKeyedStoreICTrampoline_Megamorphic()
void BranchIfPrototypesHaveNoElements(TNode< Map > receiver_map, Label *definitely_no_elements, Label *possibly_elements)
TNode< HeapObjectReference > TryMonomorphicCase(TNode< TaggedIndex > slot, TNode< FeedbackVector > vector, TNode< HeapObjectReference > weak_lookup_start_object_map, Label *if_handler, TVariable< MaybeObject > *var_handler, Label *if_miss)
void GenerateLoadIC_NoFeedback()
void LoadIC_NoFeedback(const LoadICParameters *p, TNode< Smi > smi_typeof_mode)
void StoreGlobalIC(const StoreICParameters *p)
void DefineKeyedOwnIC(const StoreICParameters *p)
void GenerateLoadIC_Noninlined()
void GenerateLoadGlobalIC(TypeofMode typeof_mode)
void TryMegaDOMCase(TNode< Object > lookup_start_object, TNode< Map > lookup_start_object_map, TVariable< MaybeObject > *var_handler, TNode< Object > vector, TNode< TaggedIndex > slot, Label *miss, ExitPoint *exit_point)
void GenerateKeyedLoadIC()
static constexpr Builtin LoadGlobalICInOptimizedCode(TypeofMode typeof_mode)
TNode< BoolT > IsJSArrayInstanceType(TNode< Int32T > instance_type)
TNode< BoolT > IsJSObject(TNode< HeapObject > object)
void LoadPropertyFromDictionary(TNode< Dictionary > dictionary, TNode< IntPtrT > name_index, TVariable< Uint32T > *var_details, TVariable< Object > *var_value)
TNode< MaybeObject > LoadFieldTypeByDescriptorEntry(TNode< DescriptorArray > descriptors, TNode< IntPtrT > descriptor)
TNode< WordT > TimesTaggedSize(TNode< WordT > value)
TNode< IntPtrT > LoadAndUntagFixedArrayBaseLength(TNode< FixedArrayBase > array)
TNode< Smi > SmiFromInt32(TNode< Int32T > value)
TNode< MaybeObject > LoadMaybeWeakObjectField(TNode< HeapObject > object, int offset)
void StoreJSSharedStructPropertyArrayElement(TNode< PropertyArray > array, TNode< IntPtrT > index, TNode< Object > value)
TNode< Context > LoadContextFromBaseline()
TNode< Object > LoadPropertyArrayElement(TNode< PropertyArray > object, TNode< IntPtrT > index)
TNode< BoolT > IsNullOrUndefined(TNode< Object > object)
TNode< BoolT > IsJSGlobalProxy(TNode< HeapObject > object)
TNode< Number > ChangeInt32ToTagged(TNode< Int32T > value)
TNode< Context > LoadScriptContext(TNode< Context > context, TNode< IntPtrT > context_index)
TNode< BoolT > IsJSSharedStruct(TNode< HeapObject > object)
TNode< IntPtrT > TryToIntptr(TNode< Object > key, Label *if_not_intptr, TVariable< Int32T > *var_instance_type=nullptr)
TNode< BoolT > IsJSObjectMap(TNode< Map > map)
void NameDictionaryLookup(TNode< Dictionary > dictionary, TNode< Name > unique_name, Label *if_found, TVariable< IntPtrT > *var_name_index, Label *if_not_found, LookupMode mode=kFindExisting)
TNode< Float64T > TryTaggedToFloat64(TNode< Object > value, Label *if_valueisnotnumber)
TNode< BoolT > IsEqualInWord32(TNode< Word32T > word32, typename BitField::FieldType value)
TNode< Numeric > LoadFixedTypedArrayElementAsTagged(TNode< RawPtrT > data_pointer, TNode< UintPtrT > index, ElementsKind elements_kind)
void FillPropertyArrayWithUndefined(TNode< PropertyArray > array, TNode< IntPtrT > from_index, TNode< IntPtrT > to_index)
void Print(const char *s)
TNode< BoolT > IsStrong(TNode< MaybeObject > value)
TNode< Int32T > TruncateIntPtrToInt32(TNode< IntPtrT > value)
void CopyPropertyArrayValues(TNode< HeapObject > from_array, TNode< PropertyArray > to_array, TNode< IntPtrT > length, WriteBarrierMode barrier_mode, DestroySource destroy_source)
TNode< Uint32T > LoadDetailsByKeyIndex(TNode< ContainerType > container, TNode< IntPtrT > key_index)
TNode< IntPtrT > LoadMapInobjectPropertiesStartInWords(TNode< Map > map)
TNode< BoolT > IsMegaDOMProtectorCellInvalid()
TNode< JSAny > BasicLoadNumberDictionaryElement(TNode< NumberDictionary > dictionary, TNode< IntPtrT > intptr_index, Label *not_data, Label *if_hole)
TNode< IntPtrT > ParameterToIntPtr(TNode< Smi > value)
TNode< JSArrayBuffer > LoadJSArrayBufferViewBuffer(TNode< JSArrayBufferView > array_buffer_view)
TNode< BoolT > IsPrivateName(TNode< Symbol > symbol)
TNode< BoolT > InstanceTypeEqual(TNode< Int32T > instance_type, int type)
TNode< DescriptorArray > LoadMapDescriptors(TNode< Map > map)
TNode< HeapObject > LoadSlowProperties(TNode< JSReceiver > object)
TNode< Object > UnsafeLoadFixedArrayElement(TNode< FixedArray > object, TNode< IntPtrT > index, int additional_offset=0)
void StorePropertyArrayElement(TNode< PropertyArray > array, TNode< IntPtrT > index, TNode< Object > value)
TNode< Smi > GetNameDictionaryFlags(TNode< Dictionary > dictionary)
TNode< IntPtrT > MapUsedInObjectProperties(TNode< Map > map)
TNode< FeedbackVector > LoadFeedbackVectorForStub()
TNode< UintPtrT > DecodeWord(TNode< WordT > word)
TNode< String > StringFromSingleCharCode(TNode< Int32T > code)
void SetNameDictionaryFlags(TNode< Dictionary >, TNode< Smi > flags)
TNode< BoolT > IsInterestingProperty(TNode< Name > name)
TNode< BoolT > TaggedEqual(TNode< AnyTaggedT > a, TNode< AnyTaggedT > b)
TNode< FixedArrayBase > LoadElements(TNode< JSObject > object)
TNode< T > LoadObjectField(TNode< HeapObject > object, int offset)
TNode< UintPtrT > LoadVariableLengthJSTypedArrayLength(TNode< JSTypedArray > array, TNode< JSArrayBuffer > buffer, Label *detached_or_out_of_bounds)
TNode< BoolT > IsNotSetWord32(TNode< Word32T > word32)
TNode< BoolT > TaggedNotEqual(TNode< AnyTaggedT > a, TNode< AnyTaggedT > b)
TNode< Uint32T > LoadMapBitField3(TNode< Map > map)
TNode< BoolT > TaggedIsNotSmi(TNode< MaybeObject > a)
void TryToName(TNode< Object > key, Label *if_keyisindex, TVariable< IntPtrT > *var_index, Label *if_keyisunique, TVariable< Name > *var_unique, Label *if_bailout, Label *if_notinternalized=nullptr)
void GotoIfPrototypeRequiresRuntimeLookup(TNode< JSFunction > function, TNode< Map > map, Label *runtime)
TNode< Context > GotoIfHasContextExtensionUpToDepth(TNode< Context > context, TNode< Uint32T > depth, Label *target)
TNode< IntPtrT > ChangePositiveInt32ToIntPtr(TNode< Int32T > input)
TNode< Number > ChangeUint32ToTagged(TNode< Uint32T > value)
TNode< Uint32T > LoadDetailsByDescriptorEntry(TNode< DescriptorArray > descriptors, TNode< IntPtrT > descriptor)
TNode< BoolT > IsWeakOrCleared(TNode< MaybeObject > value)
void StoreValueByKeyIndex(TNode< ContainerType > container, TNode< IntPtrT > key_index, TNode< Object > value, WriteBarrierMode write_barrier=UPDATE_WRITE_BARRIER)
void TryGetOwnProperty(TNode< Context > context, TNode< JSAny > receiver, TNode< JSReceiver > object, TNode< Map > map, TNode< Int32T > instance_type, TNode< Name > unique_name, Label *if_found_value, TVariable< Object > *var_value, Label *if_not_found, Label *if_bailout, ExpectedReceiverMode expected_receiver_mode=kExpectingAnyReceiver)
void TryInternalizeString(TNode< String > string, Label *if_index, TVariable< IntPtrT > *var_index, Label *if_internalized, TVariable< Name > *var_internalized, Label *if_not_internalized, Label *if_bailout)
TNode< Uint16T > StringCharCodeAt(TNode< String > string, TNode< UintPtrT > index)
TNode< JSPrototype > LoadMapPrototype(TNode< Map > map)
TNode< BoolT > IsSetWord32(TNode< Word32T > word32)
TNode< BoolT > IsJSApiObjectMap(TNode< Map > map)
TNode< HeapObject > LoadFastProperties(TNode< JSReceiver > object, bool skip_empty_check=false)
TNode< IntPtrT > SmiUntag(TNode< Smi > value)
TNode< BoolT > IsDeprecatedMap(TNode< Map > map)
TNode< BoolT > IsNoElementsProtectorCellInvalid()
TNode< BoolT > IsNotCleared(TNode< MaybeObject > value)
TNode< RawPtrT > LoadJSTypedArrayDataPtr(TNode< JSTypedArray > typed_array)
TNode< BoolT > IsSetWord(TNode< WordT > word)
TNode< BoolT > IsCode(TNode< HeapObject > object)
void StoreMap(TNode< HeapObject > object, TNode< Map > map)
TNode< Uint32T > DecodeWord32(TNode< Word32T > word32)
TNode< Object > LoadValueByKeyIndex(TNode< ContainerType > container, TNode< IntPtrT > key_index)
TNode< Uint32T > LoadNameRawHash(TNode< Name > name)
TNode< Map > LoadCachedMap(TNode< NativeContext > native_context, TNode< IntPtrT > number_of_properties, Label *runtime)
TNode< BoolT > IsCustomElementsReceiverInstanceType(TNode< Int32T > instance_type)
void DescriptorLookup(TNode< Name > unique_name, TNode< DescriptorArray > descriptors, TNode< Uint32T > bitfield3, Label *if_found, TVariable< IntPtrT > *var_name_index, Label *if_not_found)
TNode< BoolT > IsCleared(TNode< MaybeObject > value)
TNode< Object > LoadAccessorPairGetter(TNode< AccessorPair > accessor_pair)
TNode< Int32T > LoadAndUntagToWord32ObjectField(TNode< HeapObject > object, int offset)
std::function< TNode< T >()> LazyNode
TNode< BoolT > IsClearWord32(TNode< Word32T > word32)
TNode< Map > LoadReceiverMap(TNode< Object > receiver)
void StoreObjectFieldNoWriteBarrier(TNode< HeapObject > object, TNode< IntPtrT > offset, TNode< T > value)
TNode< Object > LoadFixedArrayElement(TNode< FixedArray > object, TNode< TIndex > index, int additional_offset=0, CheckBounds check_bounds=CheckBounds::kAlways)
void IncrementCounter(StatsCounter *counter, int delta)
TNode< JSAny > Call(TNode< Context > context, TNode< TCallable > callable, ConvertReceiverMode mode, TNode< JSAny > receiver, TArgs... args)
TNode< Uint16T > LoadMapInstanceType(TNode< Map > map)
TNode< BoolT > HasInstanceType(TNode< HeapObject > object, InstanceType type)
TNode< IntPtrT > ElementOffsetFromIndex(TNode< TIndex > index, ElementsKind kind, int base_size=0)
TNode< BigInt > LoadFixedBigInt64ArrayElementAsTagged(TNode< RawPtrT > data_pointer, TNode< IntPtrT > offset)
TNode< Name > LoadKeyByKeyIndex(TNode< DescriptorArray > container, TNode< IntPtrT > key_index)
TNode< IntPtrT > LoadStringLengthAsWord(TNode< String > string)
void SharedValueBarrier(TNode< Context > context, TVariable< Object > *var_shared_value)
TNode< HeapNumber > AllocateHeapNumberWithValue(TNode< Float64T > value)
TNode< BoolT > IsNotAnyHole(TNode< Object > object)
void StoreSharedObjectField(TNode< HeapObject > object, TNode< IntPtrT > offset, TNode< Object > value)
TNode< Object > CreateDataProperty(TNode< Context > context, TNode< JSObject > receiver, TNode< Object > key, TNode< Object > value)
TNode< Smi > NoContextConstant()
TNode< NativeContext > LoadNativeContext(TNode< Context > context)
TNode< MaybeObject > LoadWeakFixedArrayElement(TNode< WeakFixedArray > object, TNode< IntPtrT > index, int additional_offset=0)
TNode< T > Select(TNode< BoolT > condition, const NodeGenerator< T > &true_body, const NodeGenerator< T > &false_body, BranchHint branch_hint=BranchHint::kNone)
TNode< BoolT > TaggedIsSmi(TNode< MaybeObject > a)
TNode< Smi > LoadFastJSArrayLength(TNode< JSArray > array)
TNode< BoolT > IsSpecialReceiverInstanceType(TNode< Int32T > instance_type)
TNode< PropertyArray > AllocatePropertyArray(TNode< IntPtrT > capacity)
TNode< Int32T > LoadMapBitField(TNode< Map > map)
TNode< Float64T > LoadHeapNumberValue(TNode< HeapObject > object)
TNode< BoolT > IsMap(TNode< HeapObject > object)
TNode< HeapObject > LoadJSFunctionPrototype(TNode< JSFunction > function, Label *if_bailout)
TNode< HeapObjectReference > MakeWeak(TNode< HeapObject > value)
TNode< Float64T > LoadFixedDoubleArrayElement(TNode< FixedDoubleArray > object, TNode< IntPtrT > index, Label *if_hole=nullptr, MachineType machine_type=MachineType::Float64())
TNode< Object > LoadJSPrimitiveWrapperValue(TNode< JSPrimitiveWrapper > object)
TNode< Map > LoadMap(TNode< HeapObject > object)
TNode< Object > FastCloneJSObject(TNode< HeapObject > source, TNode< Map > source_map, TNode< Map > target_map, const Function &materialize_target, bool target_is_new)
TNode< BoolT > IsString(TNode< HeapObject > object)
TNode< Int32T > SmiToInt32(TNode< Smi > value)
TNode< Int32T > LoadMapElementsKind(TNode< Map > map)
TNode< IntPtrT > TaggedIndexToIntPtr(TNode< TaggedIndex > value)
TNode< Float64T > ChangeNumberToFloat64(TNode< Number > value)
TNode< JSObject > AllocateJSObjectFromMap(TNode< Map > map, std::optional< TNode< HeapObject > > properties=std::nullopt, std::optional< TNode< FixedArray > > elements=std::nullopt, AllocationFlags flags=AllocationFlag::kNone, SlackTrackingMode slack_tracking_mode=kNoSlackTracking)
TNode< Object > LoadCellValue(TNode< Cell > cell)
TNode< BoolT > IsClearWord(TNode< WordT > word)
TNode< Uint32T > LoadAndUntagWeakFixedArrayLengthAsUint32(TNode< WeakFixedArray > array)
TNode< Float64T > ChangeFloat16ToFloat64(TNode< Float16RawBitsT > value)
TNode< MaybeObject > LoadFieldTypeByKeyIndex(TNode< DescriptorArray > container, TNode< IntPtrT > key_index)
Uint32LessThanOrEqual IntPtrGreaterThanOrEqual
TNode< BoolT > IsStringInstanceType(TNode< Int32T > instance_type)
TNode< Object > LoadAccessorPairSetter(TNode< AccessorPair > accessor_pair)
TNode< IntPtrT > PositiveSmiUntag(TNode< Smi > value)
TNode< BoolT > IsCallable(TNode< HeapObject > object)
TNode< BoolT > IsJSTypedArray(TNode< HeapObject > object)
TNode< HeapObject > GetHeapObjectIfStrong(TNode< MaybeObject > value, Label *if_not_strong)
void ForEachEnumerableOwnProperty(TNode< Context > context, TNode< Map > map, TNode< JSObject > object, PropertiesEnumerationMode mode, const ForEachKeyValueFunction &body, Label *bailout)
TNode< JSAny > CallFunction(TNode< Context > context, TNode< JSFunction > callable, ConvertReceiverMode mode, TNode< JSAny > receiver, TArgs... args)
TNode< BoolT > IsJSFunctionInstanceType(TNode< Int32T > instance_type)
void StoreObjectField(TNode< HeapObject > object, int offset, TNode< Smi > value)
TNode< Int32T > TruncateWordToInt32(TNode< WordT > value)
TNode< UintPtrT > DecodeWordFromWord32(TNode< Word32T > word32)
TNode< FeedbackVector > LoadFeedbackVectorFromBaseline()
TNode< UintPtrT > LoadJSTypedArrayLength(TNode< JSTypedArray > typed_array)
TNode< IntPtrT > LoadMapInstanceSizeInWords(TNode< Map > map)
TNode< MaybeObject > LoadFeedbackVectorSlot(TNode< FeedbackVector > feedback_vector, TNode< TIndex > slot, int additional_offset=0)
TNode< BoolT > IsPropertyCell(TNode< HeapObject > object)
TNode< Map > LoadObjectFunctionInitialMap(TNode< NativeContext > native_context)
TNode< Boolean > HasProperty(TNode< Context > context, TNode< JSAny > object, TNode< Object > key, HasPropertyLookupMode mode)
TNode< TValue > LoadArrayElement(TNode< Array > array, int array_header_size, TNode< TIndex > index, int additional_offset=0)
void LoadPropertyFromFastObject(TNode< HeapObject > object, TNode< Map > map, TNode< DescriptorArray > descriptors, TNode< IntPtrT > name_index, TVariable< Uint32T > *var_details, TVariable< Object > *var_value)
TNode< BoolT > IsJSTypedArrayInstanceType(TNode< Int32T > instance_type)
TNode< HeapObject > GetHeapObjectAssumeWeak(TNode< MaybeObject > value)
void StoreHeapNumberValue(TNode< HeapNumber > object, TNode< Float64T > value)
TNode< Object > CallGetterIfAccessor(TNode< Object > value, TNode< Union< JSReceiver, PropertyCell > > holder, TNode< Uint32T > details, TNode< Context > context, TNode< JSAny > receiver, TNode< Object > name, Label *if_bailout, GetOwnPropertyMode mode=kCallJSGetterDontUseCachedName, ExpectedReceiverMode expected_receiver_mode=kExpectingJSReceiver)
void AddToDictionary(TNode< Dictionary > dictionary, TNode< Name > key, TNode< Object > value, Label *bailout, std::optional< TNode< IntPtrT > > insertion_index=std::nullopt)
@ MIN_CONTEXT_EXTENDED_SLOTS
static constexpr int SizeFor(int count)
static constexpr int OffsetOf(int index)
static constexpr int ToKeyIndex(int descriptor_number)
static const int kEntrySize
void ReturnCallStub(const CallInterfaceDescriptor &descriptor, TNode< Code > target, TNode< Context > context, TArgs... args)
void Return(const TNode< Object > result)
void ReturnCallBuiltin(Builtin builtin, TNode< Context > context, TArgs... args)
void ReturnCallRuntime(Runtime::FunctionId function, TNode< Context > context, TArgs... args)
static ExternalReference Create(const SCTableReference &table_ref)
static FeedbackSlot Invalid()
static V8_EXPORT_PRIVATE Tagged< FieldType > Any()
static V8_EXPORT_PRIVATE Tagged< FieldType > None()
static int GetMaxLengthForNewSpaceAllocation(ElementsKind kind)
static const int kFieldsAdded
static const int kMapCacheSize
static constexpr uint32_t kMaxElementIndex
static constexpr MachineType Int32()
static constexpr MachineType AnyTagged()
static constexpr MachineType None()
static constexpr MachineType TaggedPointer()
static constexpr int kPrototypeChainValid
static constexpr int kHashNotComputedMask
static const int kAttributesDontEnumMask
static const int kAttributesReadOnlyMask
static const int kAttributesDontDeleteMask
static constexpr Representation Double()
constexpr bool IsSmi() const
static constexpr Representation HeapObject()
static constexpr Representation Smi()
static constexpr Representation Tagged()
constexpr bool IsDouble() const
static constexpr Tagged< Smi > zero()
static const int kCacheIndexShift
static const int kPrimaryTableBits
static const int kSecondaryTableBits
SCTableReference key_reference(StubCache::Table table)
static const int kSecondaryTableSize
static const int kPrimaryTableSize
MachineRepresentation rep() const
TNode< BoolT > Word32NotEqual(TNode< Word32T > left, TNode< Word32T > right)
TNode< IntPtrT > IntPtrMul(TNode< IntPtrT > left, TNode< IntPtrT > right)
TNode< IntPtrT > IntPtrAdd(TNode< IntPtrT > left, TNode< IntPtrT > right)
TNode< Int32T > Signed(TNode< Word32T > x)
void Comment(MessageWithSourceLocation message, Args &&... args)
TNode< IntPtrT > IntPtrConstant(intptr_t value)
TNode< UintPtrT > ChangeUint32ToWord(TNode< Word32T > value)
void ReturnIf(TNode< BoolT > condition, TNode< Object > value)
TNode< T > UncheckedCast(Node *value)
TNode< IntPtrT > WordShl(TNode< IntPtrT > left, TNode< IntegralT > right)
void GotoIfNot(TNode< IntegralT > condition, Label *false_label, GotoHint goto_hint=GotoHint::kNone)
void Return(TNode< Object > value)
Isolate * isolate() const
TNode< Uint32T > Unsigned(TNode< Word32T > x)
TNode< Int32T > Word32And(TNode< Int32T > left, TNode< Int32T > right)
TNode< T > ReinterpretCast(Node *value)
TNode< Int32T > Int32Add(TNode< Int32T > left, TNode< Int32T > right)
TNode< IntPtrT > BitcastTaggedToWord(TNode< Smi > node)
void TailCallRuntime(Runtime::FunctionId function, TNode< Object > context, TArgs... args)
TNode< Smi > SmiConstant(Tagged< Smi > value)
void GotoIf(TNode< IntegralT > condition, Label *true_label, GotoHint goto_hint=GotoHint::kNone)
Node * Load(MachineType type, Node *base)
TNode< IntPtrT > ChangeInt32ToIntPtr(TNode< Word32T > value)
TNode< Int32T > Int32Sub(TNode< Int32T > left, TNode< Int32T > right)
TNode< Int32T > Word32Or(TNode< Int32T > left, TNode< Int32T > right)
TNode< Int32T > Word32Shl(TNode< Int32T > left, TNode< Int32T > right)
TNode< IntPtrT > WordAnd(TNode< IntPtrT > left, TNode< IntPtrT > right)
void Switch(Node *index, Label *default_label, const int32_t *case_values, Label **case_labels, size_t case_count)
TNode< IntPtrT > IntPtrSub(TNode< IntPtrT > left, TNode< IntPtrT > right)
void TailCallBuiltin(Builtin id, TNode< Object > context, TArgs... args)
TNode< BoolT > BoolConstant(bool value)
TNode< Uint32T > Word32Shr(TNode< Uint32T > left, TNode< Uint32T > right)
TNode< ExternalReference > ExternalConstant(ExternalReference address)
TNode< TaggedIndex > TaggedIndexConstant(intptr_t value)
TNode< Int32T > Int32Constant(int32_t value)
TNode< BoolT > WordNotEqual(TNode< WordT > left, TNode< WordT > right)
Node * CallCFunction(Node *function, std::optional< MachineType > return_type, CArgs... cargs)
TNode< Int32T > Word32Sar(TNode< Int32T > left, TNode< Int32T > right)
TNode< BoolT > Word32Equal(TNode< Word32T > left, TNode< Word32T > right)
TNode< T > CallRuntime(Runtime::FunctionId function, TNode< Object > context, TArgs... args)
void TailCallStub(const CallInterfaceDescriptor &descriptor, TNode< Code > target, TNode< Object > context, TArgs... args)
TNode< UintPtrT > WordShr(TNode< UintPtrT > left, TNode< IntegralT > right)
TNode< T > CallBuiltin(Builtin id, TNode< Object > context, TArgs... args)
void Branch(TNode< IntegralT > condition, Label *true_label, Label *false_label, BranchHint branch_hint=BranchHint::kNone)
TNode< T > Parameter(int value, const SourceLocation &loc=SourceLocation::Current())
#define V8_ENABLE_SWISS_NAME_DICTIONARY_BOOL
#define V8_DICT_PROPERTY_CONST_TRACKING_BOOL
ZoneVector< RpoNumber > & result
#define ASSERT_CONSECUTIVE(rep1, rep2)
constexpr int kTaggedSize
compiler::TypedCodeAssemblerVariable< T > TVariable
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in allocation gc speed threshold for starting incremental marking via a task in percent of available threshold for starting incremental marking immediately in percent of available Use a single schedule for determining a marking schedule between JS and C objects schedules the minor GC task with kUserVisible priority max worker number of concurrent for NumberOfWorkerThreads start background threads that allocate memory concurrent_array_buffer_sweeping use parallel threads to clear weak refs in the atomic pause trace progress of the incremental marking trace object counts and memory usage report a tick only when allocated zone memory changes by this amount TracingFlags::gc_stats store(v8::tracing::TracingCategoryObserver::ENABLED_BY_NATIVE)) DEFINE_GENERIC_IMPLICATION(trace_gc_object_stats
@ kLoadGlobalNotInsideTypeof
@ kLoadGlobalInsideTypeof
@ HOLEY_NONEXTENSIBLE_ELEMENTS
@ FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND
@ LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND
@ PACKED_NONEXTENSIBLE_ELEMENTS
@ LAST_ANY_NONEXTENSIBLE_ELEMENTS_KIND
@ FIRST_RAB_GSAB_FIXED_TYPED_ARRAY_ELEMENTS_KIND
@ LAST_RAB_GSAB_FIXED_TYPED_ARRAY_ELEMENTS_KIND
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in name
constexpr int kTaggedSizeLog2
DONT_OVERRIDE DISABLE_ALLOCATION_SITES HOLEY_ELEMENTS
DONT_OVERRIDE DISABLE_ALLOCATION_SITES DISABLE_ALLOCATION_SITES HOLEY_DOUBLE_ELEMENTS
static const int kMaxNumberOfDescriptors
V8_EXPORT_PRIVATE FlagValues v8_flags
bool IsPrivateSymbol(Tagged< Object > obj)
kInstanceDescriptorsOffset kTransitionsOrPrototypeInfoOffset IsNull(value)||IsJSProxy(value)||IsWasmObject(value)||(IsJSObject(value) &&(HeapLayout
!IsContextMap !IsContextMap native_context
#define CHECK_GE(lhs, rhs)
#define CHECK_LT(lhs, rhs)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
TNode< HeapObject > vector() const
TNode< JSAny > lookup_start_object() const
TNode< JSAny > receiver() const
TNode< TaggedIndex > slot() const
TNode< JSAny > receiver_and_lookup_start_object() const
TNode< Context > context() const
TNode< Object > name() const
TNode< Context > context() const
bool IsEnumeratedKeyedLoad() const
TNode< JSAny > receiver() const
TNode< Smi > enum_index() const
TNode< JSAny > lookup_start_object() const
TNode< Object > name() const
TNode< JSAny > receiver_and_lookup_start_object() const
TNode< TaggedIndex > slot() const
TNode< HeapObject > vector() const
TNode< Object > cache_type() const
TNode< Object > name() const
TNode< Context > context() const
bool IsAnyDefineOwn() const
TNode< TaggedIndex > slot() const
bool flags_is_null() const
bool receiver_is_null() const
bool IsDefineKeyedOwn() const
TNode< HeapObject > vector() const
TNode< Smi > flags() const
StubCache * stub_cache(Isolate *isolate) const
TNode< Object > value() const
TNode< JSAny > receiver() const
bool IsDefineNamedOwn() const
#define OFFSET_OF_DATA_START(Type)