34 auto js_object = Parameter<JSObject>(Descriptor::kObject);
38 CAST(LoadObjectField(js_object, JSObject::kElementsOffset));
40 CloneFixedArray(source, ExtractFixedArrayFlag::kFixedArrays);
41 StoreObjectField(js_object, JSObject::kElementsOffset, target);
46 auto object = Parameter<JSObject>(Descriptor::kObject);
47 auto key = Parameter<Smi>(Descriptor::kKey);
49 Label runtime(
this, Label::kDeferred);
56 TailCallRuntime(Runtime::kGrowArrayElements, NoContextConstant(),
object,
61 auto object = Parameter<JSObject>(Descriptor::kObject);
62 auto key = Parameter<Smi>(Descriptor::kKey);
64 Label runtime(
this, Label::kDeferred);
71 TailCallRuntime(Runtime::kGrowArrayElements, NoContextConstant(),
object,
76 auto receiver = Parameter<JSAny>(Descriptor::kReceiver);
81 Label tailcall_to_shared(
this);
82 auto context = Parameter<Context>(Descriptor::kContext);
83 auto new_target = Parameter<Object>(Descriptor::kJSNewTarget);
85 UncheckedParameter<Int32T>(Descriptor::kJSActualArgumentsCount);
86#ifdef V8_JS_LINKAGE_INCLUDES_DISPATCH_HANDLE
87 auto dispatch_handle =
88 UncheckedParameter<JSDispatchHandleT>(Descriptor::kJSDispatchHandle);
90 auto dispatch_handle = InvalidDispatchHandleConstant();
92 auto function = Parameter<JSFunction>(Descriptor::kJSTarget);
96 ExternalConstant(ExternalReference::debug_break_at_entry_function());
100 CAST(LoadObjectField(function, JSFunction::kSharedFunctionInfoOffset));
105 GotoIf(IntPtrEqual(
result, IntPtrConstant(0)), &tailcall_to_shared);
107 CallRuntime(Runtime::kDebugBreakAtEntry, context, function);
108 Goto(&tailcall_to_shared);
110 BIND(&tailcall_to_shared);
114 TNode<Code> code = GetSharedFunctionInfoCode(shared);
115 TailCallJSCode(code, context, function,
new_target, arg_count,
126 ExternalReference::heap_is_marking_flag_address(this->
isolate()));
132 ExternalReference::heap_is_minor_marking_flag_address(this->
isolate()));
139 ExternalReference::is_shared_space_isolate_flag_address(
162 Label slow_path(
this), next(
this);
176 LoadBucket(slot_set, slot_offset, num_buckets, &slow_path);
209 CSA_CHECK(
this, IntPtrLessThan(bucket_index, num_buckets));
241 Label marking_is_on(
this), marking_is_off(
this), next(
this);
247 BIND(&marking_is_off);
250 BIND(&marking_is_on);
264 IndirectPointerWriteBarrierDescriptor::kSlotAddress);
266 IndirectPointerWriteBarrierDescriptor::kObject));
268 IndirectPointerWriteBarrierDescriptor::kIndirectPointerTag);
272 write_barrier_indirect_pointer_marking_from_code_function());
285 Label generational_barrier(
this), shared_barrier(
this);
291 BIND(&generational_barrier);
301 BIND(&shared_barrier);
317 ExternalReference::shared_barrier_from_code_function());
331 Label incremental_barrier(
this);
336 BIND(&incremental_barrier);
344 Label generational_barrier_check(
this), shared_barrier_check(
this),
345 shared_barrier_slow(
this), generational_barrier_slow(
this);
357 BIND(&generational_barrier_check);
366 &shared_barrier_check);
368 BIND(&generational_barrier_slow);
371 BIND(&shared_barrier_check);
376 BIND(&shared_barrier_slow);
382 Label* false_label) {
388 Label not_read_only(
this);
392 Branch(is_read_only_page, false_label, ¬_read_only);
394 BIND(¬_read_only);
399 Branch(object_is_young, true_label, false_label);
404 Label* false_label) {
408 Branch(object_is_young, true_label, false_label);
420 BIND(&check_is_unmarked);
427 ExternalReference::write_barrier_marking_from_code_function());
440 Label marking_cpp_slow_path(
this);
444 BIND(&marking_cpp_slow_path);
447 ExternalReference::write_barrier_marking_from_code_function());
459 Label* false_label) {
478 false_label, true_label);
483 Label next(
this), write_into_shared_object(
this),
484 write_into_local_object(
this),
507 InSharedHeap(
object, &write_into_shared_object, &write_into_local_object);
509 BIND(&write_into_shared_object);
514 BIND(&write_into_local_object);
522 BIND(&local_object_and_value);
531 Label shared_marking_cpp_slow_path(
this);
535 BIND(&shared_marking_cpp_slow_path);
538 ExternalReference::write_barrier_shared_marking_from_code_function());
550 Label is_minor(
this), is_major(
this);
589 ExternalReference::ephemeron_key_write_barrier_function());
637class TSANRelaxedStoreCodeStubAssembler :
public CodeStubAssembler {
639 explicit TSANRelaxedStoreCodeStubAssembler(
640 compiler::CodeAssemblerState* state)
641 : CodeStubAssembler(state) {}
643 TNode<ExternalReference> GetExternalReference(
int size) {
644 if (size == kInt8Size) {
645 return ExternalConstant(
646 ExternalReference::tsan_relaxed_store_function_8_bits());
647 }
else if (size == kInt16Size) {
648 return ExternalConstant(
649 ExternalReference::tsan_relaxed_store_function_16_bits());
650 }
else if (size == kInt32Size) {
651 return ExternalConstant(
652 ExternalReference::tsan_relaxed_store_function_32_bits());
655 return ExternalConstant(
656 ExternalReference::tsan_relaxed_store_function_64_bits());
660 void GenerateTSANRelaxedStore(SaveFPRegsMode fp_mode,
int size) {
661 TNode<ExternalReference> function = GetExternalReference(size);
662 auto address = UncheckedParameter<IntPtrT>(TSANStoreDescriptor::kAddress);
663 TNode<IntPtrT> value = BitcastTaggedToWord(
664 UncheckedParameter<Object>(TSANStoreDescriptor::kValue));
665 CallCFunctionWithCallerSavedRegisters(
666 function, MachineType::Int32(), fp_mode,
667 std::make_pair(MachineType::IntPtr(), address),
668 std::make_pair(MachineType::IntPtr(), value));
673TF_BUILTIN(TSANRelaxedStore8IgnoreFP, TSANRelaxedStoreCodeStubAssembler) {
677TF_BUILTIN(TSANRelaxedStore8SaveFP, TSANRelaxedStoreCodeStubAssembler) {
681TF_BUILTIN(TSANRelaxedStore16IgnoreFP, TSANRelaxedStoreCodeStubAssembler) {
685TF_BUILTIN(TSANRelaxedStore16SaveFP, TSANRelaxedStoreCodeStubAssembler) {
689TF_BUILTIN(TSANRelaxedStore32IgnoreFP, TSANRelaxedStoreCodeStubAssembler) {
693TF_BUILTIN(TSANRelaxedStore32SaveFP, TSANRelaxedStoreCodeStubAssembler) {
697TF_BUILTIN(TSANRelaxedStore64IgnoreFP, TSANRelaxedStoreCodeStubAssembler) {
701TF_BUILTIN(TSANRelaxedStore64SaveFP, TSANRelaxedStoreCodeStubAssembler) {
705class TSANSeqCstStoreCodeStubAssembler :
public CodeStubAssembler {
707 explicit TSANSeqCstStoreCodeStubAssembler(compiler::CodeAssemblerState* state)
708 : CodeStubAssembler(state) {}
710 TNode<ExternalReference> GetExternalReference(
int size) {
711 if (size == kInt8Size) {
712 return ExternalConstant(
713 ExternalReference::tsan_seq_cst_store_function_8_bits());
714 }
else if (size == kInt16Size) {
715 return ExternalConstant(
716 ExternalReference::tsan_seq_cst_store_function_16_bits());
717 }
else if (size == kInt32Size) {
718 return ExternalConstant(
719 ExternalReference::tsan_seq_cst_store_function_32_bits());
722 return ExternalConstant(
723 ExternalReference::tsan_seq_cst_store_function_64_bits());
727 void GenerateTSANSeqCstStore(SaveFPRegsMode fp_mode,
int size) {
728 TNode<ExternalReference> function = GetExternalReference(size);
729 auto address = UncheckedParameter<IntPtrT>(TSANStoreDescriptor::kAddress);
730 TNode<IntPtrT> value = BitcastTaggedToWord(
731 UncheckedParameter<Object>(TSANStoreDescriptor::kValue));
732 CallCFunctionWithCallerSavedRegisters(
733 function, MachineType::Int32(), fp_mode,
734 std::make_pair(MachineType::IntPtr(), address),
735 std::make_pair(MachineType::IntPtr(), value));
740TF_BUILTIN(TSANSeqCstStore8IgnoreFP, TSANSeqCstStoreCodeStubAssembler) {
744TF_BUILTIN(TSANSeqCstStore8SaveFP, TSANSeqCstStoreCodeStubAssembler) {
748TF_BUILTIN(TSANSeqCstStore16IgnoreFP, TSANSeqCstStoreCodeStubAssembler) {
752TF_BUILTIN(TSANSeqCstStore16SaveFP, TSANSeqCstStoreCodeStubAssembler) {
756TF_BUILTIN(TSANSeqCstStore32IgnoreFP, TSANSeqCstStoreCodeStubAssembler) {
760TF_BUILTIN(TSANSeqCstStore32SaveFP, TSANSeqCstStoreCodeStubAssembler) {
764TF_BUILTIN(TSANSeqCstStore64IgnoreFP, TSANSeqCstStoreCodeStubAssembler) {
768TF_BUILTIN(TSANSeqCstStore64SaveFP, TSANSeqCstStoreCodeStubAssembler) {
772class TSANRelaxedLoadCodeStubAssembler :
public CodeStubAssembler {
774 explicit TSANRelaxedLoadCodeStubAssembler(compiler::CodeAssemblerState* state)
775 : CodeStubAssembler(state) {}
777 TNode<ExternalReference> GetExternalReference(
int size) {
778 if (size == kInt32Size) {
779 return ExternalConstant(
780 ExternalReference::tsan_relaxed_load_function_32_bits());
783 return ExternalConstant(
784 ExternalReference::tsan_relaxed_load_function_64_bits());
788 void GenerateTSANRelaxedLoad(SaveFPRegsMode fp_mode,
int size) {
789 TNode<ExternalReference> function = GetExternalReference(size);
790 auto address = UncheckedParameter<IntPtrT>(TSANLoadDescriptor::kAddress);
791 CallCFunctionWithCallerSavedRegisters(
792 function, MachineType::Int32(), fp_mode,
793 std::make_pair(MachineType::IntPtr(), address));
798TF_BUILTIN(TSANRelaxedLoad32IgnoreFP, TSANRelaxedLoadCodeStubAssembler) {
802TF_BUILTIN(TSANRelaxedLoad32SaveFP, TSANRelaxedLoadCodeStubAssembler) {
806TF_BUILTIN(TSANRelaxedLoad64IgnoreFP, TSANRelaxedLoadCodeStubAssembler) {
810TF_BUILTIN(TSANRelaxedLoad64SaveFP, TSANRelaxedLoadCodeStubAssembler) {
843 Label shrinking_done(
this);
845 GotoIf(SmiGreaterThan(new_nof,
SmiShr(capacity, 2)), &shrinking_done);
849 CAST(
CallRuntime(Runtime::kShrinkNameDictionary, context, properties));
851 StoreJSReceiverPropertiesOrHash(
receiver, new_properties);
853 Goto(&shrinking_done);
854 BIND(&shrinking_done);
861 Label shrunk(
this), done(
this);
864 SwissNameDictionaryDelete(properties, key_index, &shrunk, &shrunk_table);
867 StoreJSReceiverPropertiesOrHash(
receiver, shrunk_table.value());
873 template <
typename Dictionary>
879 Label dictionary_found(
this, &var_name_index);
881 &var_name_index, notfound);
883 BIND(&dictionary_found);
896 auto receiver = Parameter<Object>(Descriptor::kObject);
897 auto key = Parameter<Object>(Descriptor::kKey);
898 auto language_mode = Parameter<Smi>(Descriptor::kLanguageMode);
899 auto context = Parameter<Context>(Descriptor::kContext);
903 Label if_index(
this, &var_index), if_unique_name(
this), if_notunique(
this),
904 if_notfound(
this), slow(
this), if_proxy(
this);
906 GotoIf(TaggedIsSmi(
receiver), &slow);
909 GotoIf(InstanceTypeEqual(instance_type, JS_PROXY_TYPE), &if_proxy);
911 TryToName(
key, &if_index, &var_index, &if_unique_name, &var_unique, &slow,
916 Comment(
"integer index");
920 BIND(&if_unique_name);
922 Comment(
"key is unique name");
923 CheckForAssociatedProtector(var_unique.value(), &slow);
925 Label dictionary(
this), dont_delete(
this);
926 GotoIf(IsDictionaryMap(receiver_map), &dictionary);
934 InvalidateValidityCellIfPrototype(receiver_map);
938 DeleteDictionaryProperty(
CAST(
receiver), properties, var_unique.value(),
939 context, &dont_delete, &if_notfound);
947 Return(FalseConstant());
955 TryInternalizeString(
CAST(
key), &if_index, &var_index, &if_unique_name,
956 &var_unique, &if_notfound, &slow);
960 Return(TrueConstant());
966 TailCallBuiltin(Builtin::kProxyDeleteProperty, context,
receiver, name,
972 TailCallRuntime(Runtime::kDeleteProperty, context,
receiver,
key,
979class SetOrCopyDataPropertiesAssembler :
public CodeStubAssembler {
981 explicit SetOrCopyDataPropertiesAssembler(compiler::CodeAssemblerState* state)
982 : CodeStubAssembler(state) {}
985 TNode<JSObject> AllocateJsObjectTarget(TNode<Context> context) {
986 const TNode<NativeContext>
native_context = LoadNativeContext(context);
987 const TNode<JSFunction> object_function =
Cast(
988 LoadContextElement(
native_context, Context::OBJECT_FUNCTION_INDEX));
989 const TNode<Map> map =
990 Cast(LoadJSFunctionPrototypeOrInitialMap(object_function));
991 const TNode<JSObject> target = AllocateJSObjectFromMap(map);
994 TNode<Object> SetOrCopyDataProperties(
995 TNode<Context> context, TNode<JSReceiver> target, TNode<Object> source,
997 std::optional<TNode<IntPtrT>> excluded_property_count = std::nullopt,
998 std::optional<TNode<IntPtrT>> excluded_property_base = std::nullopt,
999 bool use_set =
true) {
1000 Label if_done(
this), if_noelements(
this),
1001 if_sourcenotjsobject(
this, Label::kDeferred);
1006 GotoIf(TaggedIsSmi(source), &if_done);
1010 TNode<Map> source_map = LoadMap(
CAST(source));
1011 TNode<Uint16T> source_instance_type = LoadMapInstanceType(source_map);
1012 GotoIfNot(IsJSObjectInstanceType(source_instance_type),
1013 &if_sourcenotjsobject);
1015 TNode<FixedArrayBase> source_elements = LoadElements(
CAST(source));
1016 GotoIf(IsEmptyFixedArray(source_elements), &if_noelements);
1017 Branch(IsEmptySlowElementDictionary(source_elements), &if_noelements,
1020 BIND(&if_noelements);
1026 TNode<Map> target_map = LoadMap(target);
1027 GotoIf(IsDeprecatedMap(target_map), if_runtime);
1029 TNode<BoolT> target_is_simple_receiver = IsSimpleObjectMap(target_map);
1030 ForEachEnumerableOwnProperty(
1032 [=,
this](TNode<Name>
key, LazyNode<Object> value) {
1034 state(), context, target, target_is_simple_receiver,
key,
1039 ForEachEnumerableOwnProperty(
1041 [=,
this](TNode<Name>
key, LazyNode<Object> value) {
1043 if (excluded_property_count.has_value()) {
1044 BuildFastLoop<IntPtrT>(
1045 IntPtrConstant(0), excluded_property_count.value(),
1046 [&](TNode<IntPtrT> index) {
1047 auto offset = Signed(TimesSystemPointerSize(index));
1048 TNode<IntPtrT> location = Signed(
1049 IntPtrSub(excluded_property_base.value(), offset));
1050 auto property = LoadFullTagged(location);
1052 Label continue_label(this);
1053 BranchIfSameValue(key, property, &skip, &continue_label);
1054 Bind(&continue_label);
1056 1, LoopUnrollingMode::kNo, IndexAdvanceMode::kPost);
1059 CallBuiltin(Builtin::kCreateDataProperty, context, target,
key,
1069 BIND(&if_sourcenotjsobject);
1072 GotoIf(IsJSReceiverInstanceType(source_instance_type), if_runtime);
1076 GotoIfNot(IsStringInstanceType(source_instance_type), &if_done);
1077 TNode<Uint32T> source_length = LoadStringLengthAsWord32(
CAST(source));
1078 Branch(
Word32Equal(source_length, Uint32Constant(0)), &if_done,
1090 SetOrCopyDataPropertiesAssembler) {
1091 auto source = UncheckedParameter<Object>(Descriptor::kSource);
1092 auto excluded_property_count =
1093 UncheckedParameter<IntPtrT>(Descriptor::kExcludedPropertyCount);
1094 auto excluded_properties =
1095 UncheckedParameter<IntPtrT>(Descriptor::kExcludedPropertyBase);
1096 auto context = Parameter<Context>(Descriptor::kContext);
1099 Label if_runtime(
this, Label::kDeferred);
1103 Return(SetOrCopyDataProperties(context, target, source, &if_runtime,
1104 excluded_property_count, excluded_properties,
1111 CSA_DCHECK(
this, IntPtrEqual(WordAnd(excluded_properties,
1114 TailCallRuntime(Runtime::kCopyDataPropertiesWithExcludedPropertiesOnStack,
1115 context, source, SmiTag(excluded_property_count),
1116 BitcastWordToTaggedSigned(excluded_properties));
1120 SetOrCopyDataPropertiesAssembler) {
1121 auto source = UncheckedParameter<Object>(Descriptor::kSource);
1123 auto excluded_property_count_smi =
1124 UncheckedParameter<Smi>(Descriptor::kExcludedPropertyCount);
1125 auto context = Parameter<Context>(Descriptor::kContext);
1127 auto excluded_property_count = SmiToIntPtr(excluded_property_count_smi);
1131 ReinterpretCast<IntPtrT>(arguments.AtIndexPtr(
1132 IntPtrSub(excluded_property_count, IntPtrConstant(2))));
1134 arguments.PopAndReturn(CallBuiltin<JSAny>(
1135 Builtin::kCopyDataPropertiesWithExcludedPropertiesOnStack, context,
1136 source, excluded_property_count, excluded_properties));
1140TF_BUILTIN(CopyDataProperties, SetOrCopyDataPropertiesAssembler) {
1141 auto target = Parameter<JSObject>(Descriptor::kTarget);
1142 auto source = Parameter<Object>(Descriptor::kSource);
1143 auto context = Parameter<Context>(Descriptor::kContext);
1145 CSA_DCHECK(
this, TaggedNotEqual(target, source));
1147 Label if_runtime(
this, Label::kDeferred);
1148 SetOrCopyDataProperties(context, target, source, &if_runtime, std::nullopt,
1149 std::nullopt,
false);
1150 Return(UndefinedConstant());
1153 TailCallRuntime(Runtime::kCopyDataProperties, context, target, source);
1157 auto target = Parameter<JSReceiver>(Descriptor::kTarget);
1158 auto source = Parameter<Object>(Descriptor::kSource);
1159 auto context = Parameter<Context>(Descriptor::kContext);
1161 Label if_runtime(
this, Label::kDeferred);
1162 GotoIfForceSlowPath(&if_runtime);
1163 SetOrCopyDataProperties(context, target, source, &if_runtime, std::nullopt,
1164 std::nullopt,
true);
1165 Return(UndefinedConstant());
1168 TailCallRuntime(Runtime::kSetDataProperties, context, target, source);
1172 auto receiver = Parameter<JSReceiver>(Descriptor::kReceiver);
1173 auto context = Parameter<Context>(Descriptor::kContext);
1175 Label if_empty(
this), if_runtime(
this, Label::kDeferred);
1177 Return(receiver_map);
1180 Return(EmptyFixedArrayConstant());
1183 TailCallRuntime(Runtime::kForInEnumerate, context,
receiver);
1188 auto enumerator = Parameter<HeapObject>(Descriptor::kEnumerator);
1189 auto index = Parameter<TaggedIndex>(Descriptor::kVectorIndex);
1190 auto feedback_vector = Parameter<FeedbackVector>(Descriptor::kFeedbackVector);
1195 ForInPrepare(enumerator, vector_index, feedback_vector, &cache_array,
1197 Return(cache_array, cache_length);
1201 auto key = Parameter<String>(Descriptor::kKey);
1202 auto object = Parameter<JSAnyNotSmi>(Descriptor::kObject);
1203 auto context = Parameter<Context>(Descriptor::kContext);
1205 Label if_true(
this), if_false(
this);
1207 Branch(IsTrue(
result), &if_true, &if_false);
1213 Return(UndefinedConstant());
1217 auto lhs = Parameter<Object>(Descriptor::kLeft);
1218 auto rhs = Parameter<Object>(Descriptor::kRight);
1220 Label if_true(
this), if_false(
this);
1221 BranchIfSameValue(lhs, rhs, &if_true, &if_false);
1224 Return(TrueConstant());
1227 Return(FalseConstant());
1231 auto lhs = Parameter<Object>(Descriptor::kLeft);
1232 auto rhs = Parameter<Object>(Descriptor::kRight);
1234 Label if_true(
this), if_false(
this);
1235 BranchIfSameValue(lhs, rhs, &if_true, &if_false, SameValueMode::kNumbersOnly);
1238 Return(TrueConstant());
1241 Return(FalseConstant());
1282 Label done_argc(
this);
1283 GotoIf(Int32GreaterThanOrEqual(pushed_argc.value(), formal_count),
1286 pushed_argc = formal_count;
1297 const bool builtin_exit_frame =
true;
1298 const bool switch_to_central_stack =
false;
1300 switch_to_central_stack);
1342 auto val = UncheckedParameter<Float64T>(Descriptor::kValue);
1343 Return(ChangeFloat64ToTagged(val));
1347 auto requested_size = UncheckedParameter<IntPtrT>(Descriptor::kRequestedSize);
1348 CSA_CHECK(
this, IsValidPositiveSmi(requested_size));
1352 TailCallRuntime(Runtime::kAllocateInYoungGeneration, NoContextConstant(),
1353 SmiFromIntPtr(requested_size), allocation_flags);
1357 auto requested_size = UncheckedParameter<IntPtrT>(Descriptor::kRequestedSize);
1358 CSA_CHECK(
this, IsValidPositiveSmi(requested_size));
1362 TailCallRuntime(Runtime::kAllocateInOldGeneration, NoContextConstant(),
1363 SmiFromIntPtr(requested_size), runtime_flags);
1366#if V8_ENABLE_WEBASSEMBLY
1367TF_BUILTIN(WasmAllocateInYoungGeneration, CodeStubAssembler) {
1368 auto requested_size = UncheckedParameter<IntPtrT>(Descriptor::kRequestedSize);
1369 CSA_CHECK(
this, IsValidPositiveSmi(requested_size));
1371 TNode<Smi> allocation_flags =
1373 TailCallRuntime(Runtime::kAllocateInYoungGeneration, NoContextConstant(),
1374 SmiFromIntPtr(requested_size), allocation_flags);
1377TF_BUILTIN(WasmAllocateInOldGeneration, CodeStubAssembler) {
1378 auto requested_size = UncheckedParameter<IntPtrT>(Descriptor::kRequestedSize);
1379 CSA_CHECK(
this, IsValidPositiveSmi(requested_size));
1381 TNode<Smi> runtime_flags =
1383 TailCallRuntime(Runtime::kAllocateInOldGeneration, NoContextConstant(),
1384 SmiFromIntPtr(requested_size), runtime_flags);
1389 auto message_id = Parameter<Smi>(Descriptor::kMessageOrMessageId);
1390 TailCallRuntime(Runtime::kAbort, NoContextConstant(), message_id);
1394 auto message = Parameter<String>(Descriptor::kMessageOrMessageId);
1395 TailCallRuntime(Runtime::kAbortCSADcheck, NoContextConstant(), message);
1398void Builtins::Generate_CEntry_Return1_ArgvOnStack_NoBuiltinExit(
1399 MacroAssembler* masm) {
1403void Builtins::Generate_CEntry_Return1_ArgvOnStack_BuiltinExit(
1404 MacroAssembler* masm) {
1408void Builtins::Generate_CEntry_Return1_ArgvInRegister_NoBuiltinExit(
1409 MacroAssembler* masm) {
1413void Builtins::Generate_CEntry_Return2_ArgvOnStack_NoBuiltinExit(
1414 MacroAssembler* masm) {
1418void Builtins::Generate_CEntry_Return2_ArgvOnStack_BuiltinExit(
1419 MacroAssembler* masm) {
1423void Builtins::Generate_CEntry_Return2_ArgvInRegister_NoBuiltinExit(
1424 MacroAssembler* masm) {
1428void Builtins::Generate_WasmCEntry(MacroAssembler* masm) {
1432#if !defined(V8_TARGET_ARCH_ARM)
1433void Builtins::Generate_MemCopyUint8Uint8(MacroAssembler* masm) {
1434 masm->CallBuiltin(Builtin::kIllegal);
1438#ifndef V8_TARGET_ARCH_IA32
1439void Builtins::Generate_MemMove(MacroAssembler* masm) {
1440 masm->CallBuiltin(Builtin::kIllegal);
1444void Builtins::Generate_BaselineLeaveFrame(MacroAssembler* masm) {
1445#ifdef V8_ENABLE_SPARKPLUG
1452#if defined(V8_ENABLE_MAGLEV) && !defined(V8_ENABLE_LEAPTIERING)
1453void Builtins::Generate_MaglevOptimizeCodeOrTailCallOptimizedCodeSlot(
1454 MacroAssembler* masm) {
1455 using D = MaglevOptimizeCodeOrTailCallOptimizedCodeSlotDescriptor;
1456 Register flags = D::GetRegisterParameter(D::kFlags);
1457 Register feedback_vector = D::GetRegisterParameter(D::kFeedbackVector);
1458 Register temporary = D::GetRegisterParameter(D::kTemporary);
1459 masm->AssertFeedbackVector(feedback_vector, temporary);
1460 masm->OptimizeCodeOrTailCallOptimizedCodeSlot(flags, feedback_vector);
1464void Builtins::Generate_MaglevOptimizeCodeOrTailCallOptimizedCodeSlot(
1465 MacroAssembler* masm) {
1470#ifndef V8_ENABLE_MAGLEV
1473 bool save_new_target) {
1478void Builtins::Generate_MaglevFunctionEntryStackCheck_WithoutNewTarget(
1483void Builtins::Generate_MaglevFunctionEntryStackCheck_WithNewTarget(
1484 MacroAssembler* masm) {
1490 auto object = Parameter<JSAny>(Descriptor::kObject);
1491 auto key = Parameter<Object>(Descriptor::kKey);
1492 auto context = Parameter<Context>(Descriptor::kContext);
1495 Label if_notfound(
this), if_proxy(
this, Label::kDeferred),
1496 if_slow(
this, Label::kDeferred);
1502 Label* if_bailout) {
1504 Label if_found(
this);
1507 TryGetOwnProperty(context,
receiver,
CAST(holder), holder_map,
1508 holder_instance_type, unique_name, &if_found,
1509 &var_value, next_holder, if_bailout,
1510 kExpectingJSReceiver);
1512 Return(var_value.value());
1524 TryPrototypeChainLookup(
object,
object,
key, lookup_property_in_holder,
1525 lookup_element_in_holder, &if_notfound, &if_slow,
1529 Return(UndefinedConstant());
1532 TailCallRuntime(Runtime::kGetProperty, context,
object,
key);
1542 TailCallBuiltin(Builtin::kProxyGetProperty, context,
object, name,
object,
1549 auto object = Parameter<JSAny>(Descriptor::kObject);
1550 auto key = Parameter<Object>(Descriptor::kKey);
1551 auto context = Parameter<Context>(Descriptor::kContext);
1552 auto receiver = Parameter<JSAny>(Descriptor::kReceiver);
1553 auto on_non_existent = Parameter<Object>(Descriptor::kOnNonExistent);
1554 Label if_notfound(
this), if_proxy(
this, Label::kDeferred),
1555 if_slow(
this, Label::kDeferred);
1561 Label* if_bailout) {
1563 Label if_found(
this);
1564 TryGetOwnProperty(context,
receiver,
CAST(holder), holder_map,
1565 holder_instance_type, unique_name, &if_found,
1566 &var_value, next_holder, if_bailout,
1567 kExpectingAnyReceiver);
1569 Return(var_value.value());
1581 TryPrototypeChainLookup(
receiver,
object,
key, lookup_property_in_holder,
1582 lookup_element_in_holder, &if_notfound, &if_slow,
1586 Label throw_reference_error(
this);
1587 GotoIf(TaggedEqual(on_non_existent,
1589 &throw_reference_error);
1590 CSA_DCHECK(
this, TaggedEqual(on_non_existent,
1592 Return(UndefinedConstant());
1594 BIND(&throw_reference_error);
1595 Return(
CallRuntime(Runtime::kThrowReferenceError, context,
key));
1598 TailCallRuntime(Runtime::kGetPropertyWithReceiver, context,
object,
key,
1612 TailCallBuiltin(Builtin::kProxyGetProperty, context,
object, name,
receiver,
1619 auto context = Parameter<Context>(Descriptor::kContext);
1620 auto receiver = Parameter<JSAny>(Descriptor::kReceiver);
1621 auto key = Parameter<Object>(Descriptor::kKey);
1622 auto value = Parameter<Object>(Descriptor::kValue);
1633 auto context = Parameter<Context>(Descriptor::kContext);
1634 auto receiver = Parameter<JSObject>(Descriptor::kReceiver);
1635 auto key = Parameter<Object>(Descriptor::kKey);
1636 auto value = Parameter<Object>(Descriptor::kValue);
1643 Label tailcall_to_function(
this);
1644 auto function = Parameter<JSFunction>(Descriptor::kTarget);
1645 auto context = Parameter<Context>(Descriptor::kContext);
1646 auto new_target = Parameter<Object>(Descriptor::kNewTarget);
1648 UncheckedParameter<Int32T>(Descriptor::kActualArgumentsCount);
1649#ifdef V8_JS_LINKAGE_INCLUDES_DISPATCH_HANDLE
1650 auto dispatch_handle =
1651 UncheckedParameter<JSDispatchHandleT>(Descriptor::kDispatchHandle);
1652#elif defined(V8_ENABLE_LEAPTIERING)
1654 LoadJSFunctionDispatchHandle(function));
1656 auto dispatch_handle = InvalidDispatchHandleConstant();
1660 SetSupportsDynamicParameterCount(function, dispatch_handle);
1672 Runtime::kInstantiateAsmJs, context, function, stdlib, foreign,
heap);
1673 GotoIf(TaggedIsSmi(maybe_result_or_smi_zero), &tailcall_to_function);
1674 args.PopAndReturn(maybe_result_or_smi_zero);
1676 BIND(&tailcall_to_function);
1681 TailCallJSCode(code, context, function,
new_target, arg_count,
1686 auto this_function = Parameter<JSFunction>(Descriptor::kThisFunction);
1687 auto new_target = Parameter<Object>(Descriptor::kNewTarget);
1688 auto context = Parameter<Context>(Descriptor::kContext);
1691 Label found_default_base_ctor(
this, &constructor),
1692 found_something_else(
this, &constructor);
1694 FindNonDefaultConstructor(this_function, constructor,
1695 &found_default_base_ctor, &found_something_else);
1697 BIND(&found_default_base_ctor);
1700 TNode<Object> instance = CallBuiltin(Builtin::kFastNewObject, context,
1702 Return(TrueConstant(), instance);
1705 BIND(&found_something_else);
1708 Return(FalseConstant(), constructor.value());
1716 auto context = Parameter<Context>(Descriptor::kContext);
1717 auto receiver = Parameter<JSReceiver>(Descriptor::kReceiver);
1718 auto key = Parameter<Name>(Descriptor::kKey);
1720 Label call_runtime(
this);
1726 TailCallBuiltin(Builtin::kOrdinaryGetOwnPropertyDescriptor, context,
receiver,
1729 BIND(&call_runtime);
1730 TailCallRuntime(Runtime::kGetOwnPropertyDescriptorObject, context,
receiver,
#define CSA_DCHECK(csa,...)
#define CSA_CHECK(csa, x)
#define TF_BUILTIN(Name, AssemblerBase)
static constexpr int kBitsPerCell
static constexpr int kCellSizeBytesLog2
static constexpr int kBitsPerCellLog2
static constexpr int kCellsPerBucket
static constexpr int kBitsPerBucketLog2
static constexpr int kNumBucketsSize
static constexpr U encode(T value)
static constexpr int kNewTargetIndex
static constexpr int kPaddingIndex
static constexpr int kArgcIndex
static constexpr int kTargetIndex
static constexpr int kNumExtraArgs
static void Generate_CEntry(MacroAssembler *masm, int result_size, ArgvMode argv_mode, bool builtin_exit_frame, bool switch_to_central_stack)
static void Generate_MaglevFunctionEntryStackCheck(MacroAssembler *masm, bool save_new_target)
static constexpr Builtin CEntry(int result_size, ArgvMode argv_mode, bool builtin_exit_frame=false, bool switch_to_central_stack=false)
TNode< IntPtrT > MemoryChunkFromAddress(TNode< IntPtrT > address)
TNode< Smi > SmiFromInt32(TNode< Int32T > value)
TNode< Smi > GetNumberOfElements(TNode< Dictionary > dictionary)
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< Int32T > TruncateIntPtrToInt32(TNode< IntPtrT > value)
std::function< void( TNode< JSAnyNotSmi > receiver, TNode< JSAnyNotSmi > holder, TNode< Map > map, TNode< Int32T > instance_type, TNode< IntPtrT > key, Label *next_holder, Label *if_bailout)> LookupElementInHolder
TNode< Uint32T > LoadDetailsByKeyIndex(TNode< ContainerType > container, TNode< IntPtrT > key_index)
void SetNumberOfDeletedElements(TNode< Dictionary > dictionary, TNode< Smi > num_deleted_smi)
void StoreFixedArrayElement(TNode< FixedArray > object, int index, TNode< Object > value, WriteBarrierMode barrier_mode=UPDATE_WRITE_BARRIER, CheckBounds check_bounds=CheckBounds::kAlways)
TNode< BoolT > TaggedEqual(TNode< AnyTaggedT > a, TNode< AnyTaggedT > b)
TNode< Smi > GetNumberOfDeletedElements(TNode< Dictionary > dictionary)
void StoreValueByKeyIndex(TNode< ContainerType > container, TNode< IntPtrT > key_index, TNode< Object > value, WriteBarrierMode write_barrier=UPDATE_WRITE_BARRIER)
TNode< IntPtrT > PageMetadataFromMemoryChunk(TNode< IntPtrT > address)
void SetNumberOfElements(TNode< Dictionary > dictionary, TNode< Smi > num_elements_smi)
TNode< BoolT > IsSetWord32(TNode< Word32T > word32)
void GetMarkBit(TNode< IntPtrT > object, TNode< IntPtrT > *cell, TNode< IntPtrT > *mask)
std::function< void( TNode< JSAnyNotSmi > receiver, TNode< JSAnyNotSmi > holder, TNode< Map > map, TNode< Int32T > instance_type, TNode< Name > key, Label *next_holder, Label *if_bailout)> LookupPropertyInHolder
void StoreDetailsByKeyIndex(TNode< ContainerType > container, TNode< IntPtrT > key_index, TNode< Smi > details)
void IncrementCounter(StatsCounter *counter, int delta)
TNode< BoolT > IsPageFlagSet(TNode< IntPtrT > object, int mask)
TNode< Smi > SmiShr(TNode< Smi > a, int shift)
TNode< Smi > GetCapacity(TNode< Dictionary > dictionary)
void GenerateAdaptor(int formal_parameter_count)
CppBuiltinsAdaptorAssembler(compiler::CodeAssemblerState *state)
void DictionarySpecificDelete(TNode< JSReceiver > receiver, TNode< NameDictionary > properties, TNode< IntPtrT > key_index, TNode< Context > context)
void DeleteDictionaryProperty(TNode< JSReceiver > receiver, TNode< Dictionary > properties, TNode< Name > name, TNode< Context > context, Label *dont_delete, Label *notfound)
void DictionarySpecificDelete(TNode< JSReceiver > receiver, TNode< SwissNameDictionary > properties, TNode< IntPtrT > key_index, TNode< Context > context)
DeletePropertyBaseAssembler(compiler::CodeAssemblerState *state)
static V8_EXPORT_PRIVATE ExternalReference isolate_address()
static void SetProperty(compiler::CodeAssemblerState *state, TNode< Context > context, TNode< JSReceiver > receiver, TNode< BoolT > is_simple_receiver, TNode< Name > name, TNode< Object > value, LanguageMode language_mode)
static void CreateDataProperty(compiler::CodeAssemblerState *state, TNode< Context > context, TNode< JSObject > receiver, TNode< Object > key, TNode< Object > value)
static constexpr MachineType Pointer()
static constexpr MachineType TaggedPointer()
static constexpr MachineType UintPtr()
static constexpr MainThreadFlags kIsOnlyOldOrMajorGCInProgressMask
static constexpr MainThreadFlags kIncrementalMarking
static constexpr MainThreadFlags kIsInYoungGenerationMask
static constexpr MainThreadFlags kInSharedHeap
static constexpr MainThreadFlags kSkipEvacuationSlotsRecordingMask
static constexpr MainThreadFlags kEvacuationCandidateMask
static constexpr intptr_t SlotSetOffset(RememberedSetType remembered_set_type)
static const int kAttributesDontDeleteMask
static constexpr bool IsImmortalImmovable(RootIndex root_index)
static constexpr Tagged< Smi > FromInt(int value)
void GenerateRecordWrite(SaveFPRegsMode fp_mode)
void IncrementalWriteBarrierMajor(TNode< IntPtrT > slot, TNode< IntPtrT > value, SaveFPRegsMode fp_mode, Label *next)
void InSharedHeap(TNode< IntPtrT > object, Label *true_label, Label *false_label)
void WriteBarrier(SaveFPRegsMode fp_mode)
TNode< BoolT > IsUnmarked(TNode< IntPtrT > object)
void GenerateEphemeronKeyBarrier(SaveFPRegsMode fp_mode)
void GenerationalBarrierSlow(TNode< IntPtrT > slot, Label *next, SaveFPRegsMode fp_mode)
TNode< IntPtrT > LoadBucket(TNode< IntPtrT > slot_set, TNode< WordT > slot_offset, TNode< IntPtrT > num_buckets, Label *slow_path)
void GenerationalOrSharedBarrierSlow(TNode< IntPtrT > slot, Label *next, SaveFPRegsMode fp_mode)
void GenerationalOrSharedBarrierDuringMarking(TNode< IntPtrT > slot, Label *next, SaveFPRegsMode fp_mode)
void IndirectPointerWriteBarrier(SaveFPRegsMode fp_mode)
void GenerateIndirectPointerBarrier(SaveFPRegsMode fp_mode)
void InsertIntoRememberedSet(TNode< IntPtrT > object, TNode< IntPtrT > slot, SaveFPRegsMode fp_mode)
void InYoungGeneration(TNode< IntPtrT > object, Label *true_label, Label *false_label)
TNode< BoolT > IsSharedSpaceIsolate()
TNode< BoolT > IsMarking()
TNode< BoolT > UsesSharedHeap()
void IsValueUnmarkedOrRecordSlot(TNode< IntPtrT > value, Label *true_label, Label *false_label)
void SetBitInCell(TNode< IntPtrT > bucket, TNode< WordT > slot_offset)
void SharedBarrierSlow(TNode< IntPtrT > slot, Label *next, SaveFPRegsMode fp_mode)
WriteBarrierCodeStubAssembler(compiler::CodeAssemblerState *state)
void IncrementalWriteBarrierMinor(TNode< IntPtrT > slot, TNode< IntPtrT > value, SaveFPRegsMode fp_mode, Label *next)
void WriteBarrierDuringMarking(TNode< IntPtrT > slot, Label *next, SaveFPRegsMode fp_mode)
void IncrementalWriteBarrier(TNode< IntPtrT > slot, SaveFPRegsMode fp_mode)
void IncrementalWriteBarrierShared(TNode< IntPtrT > object, TNode< IntPtrT > slot, TNode< IntPtrT > value, SaveFPRegsMode fp_mode, Label *next)
void IncrementalWriteBarrierLocal(TNode< IntPtrT > slot, TNode< IntPtrT > value, SaveFPRegsMode fp_mode, Label *next)
TNode< IntPtrT > LoadSlotSet(TNode< IntPtrT > page, Label *slow_path)
TNode< BoolT > IsMinorMarking()
TNode< BoolT > Word32NotEqual(TNode< Word32T > left, TNode< Word32T > right)
TNode< IntPtrT > IntPtrAdd(TNode< IntPtrT > left, TNode< IntPtrT > right)
TNode< IntPtrT > WordOr(TNode< IntPtrT > left, TNode< IntPtrT > right)
TNode< IntPtrT > IntPtrConstant(intptr_t value)
Node * CallCFunctionWithCallerSavedRegisters(Node *function, MachineType return_type, SaveFPRegsMode mode, CArgs... cargs)
TNode< T > UncheckedCast(Node *value)
TNode< IntPtrT > WordShl(TNode< IntPtrT > left, TNode< IntegralT > right)
TNode< BoolT > WordEqual(TNode< WordT > left, TNode< WordT > right)
void GotoIfNot(TNode< IntegralT > condition, Label *false_label, GotoHint goto_hint=GotoHint::kNone)
void Return(TNode< Object > value)
Isolate * isolate() const
TNode< Int32T > Int32Add(TNode< Int32T > left, TNode< Int32T > right)
TNode< IntPtrT > BitcastTaggedToWord(TNode< Smi > node)
TNode< Smi > SmiConstant(Tagged< Smi > value)
void GotoIf(TNode< IntegralT > condition, Label *true_label, GotoHint goto_hint=GotoHint::kNone)
TNode< T > UncheckedParameter(int value)
Node * Load(MachineType type, Node *base)
TNode< IntPtrT > ChangeInt32ToIntPtr(TNode< Word32T > value)
TNode< IntPtrT > WordAnd(TNode< IntPtrT > left, TNode< IntPtrT > right)
TNode< IntPtrT > IntPtrSub(TNode< IntPtrT > left, TNode< IntPtrT > right)
void TailCallBuiltin(Builtin id, TNode< Object > context, TArgs... args)
TNode< BoolT > BoolConstant(bool value)
TNode< ExternalReference > ExternalConstant(ExternalReference address)
TNode< Int32T > Int32Constant(int32_t value)
TNode< BoolT > Word32Equal(TNode< Word32T > left, TNode< Word32T > right)
TNode< T > CallRuntime(Runtime::FunctionId function, TNode< Object > context, TArgs... args)
TNode< ExternalReference > IsolateField(IsolateFieldId id)
TNode< UintPtrT > WordShr(TNode< UintPtrT > left, TNode< IntegralT > right)
void Branch(TNode< IntegralT > condition, Label *true_label, Label *false_label, BranchHint branch_hint=BranchHint::kNone)
void StoreNoWriteBarrier(MachineRepresentation rep, Node *base, Node *value)
TNode< T > Parameter(int value, const SourceLocation &loc=SourceLocation::Current())
#define V8_ENABLE_SANDBOX_BOOL
base::Vector< const DirectHandle< Object > > args
DirectHandle< Object > new_target
#define V8_DISABLE_WRITE_BARRIERS_BOOL
ZoneVector< RpoNumber > & result
LiftoffAssembler::CacheState state
bool Word32Equal(uint32_t a, uint32_t b)
TNode< Oddball > UndefinedConstant(JSGraph *jsgraph)
bool IsSpecialReceiverInstanceType(InstanceType instance_type)
constexpr uint16_t kDontAdaptArgumentsSentinel
constexpr int kSystemPointerSizeLog2
bool IsCustomElementsReceiverInstanceType(InstanceType instance_type)
bool IsNullOrUndefined(Tagged< Object > obj, Isolate *isolate)
Handle< To > UncheckedCast(Handle< From > value)
constexpr int kTaggedSizeLog2
void EmitReturnBaseline(MacroAssembler *masm)
V8_EXPORT_PRIVATE FlagValues v8_flags
constexpr int JSParameterCount(int param_count_without_receiver)
const intptr_t kSmiTagMask
bool IsPrivateSymbol(Tagged< Object > obj)
static const size_t LanguageModeSize
!IsContextMap !IsContextMap native_context
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define DCHECK_NE(v1, v2)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)