5 #include "src/builtins/builtins-lazy-gen.h" 7 #include "src/builtins/builtins-utils-gen.h" 8 #include "src/builtins/builtins.h" 9 #include "src/feedback-vector.h" 10 #include "src/globals.h" 11 #include "src/objects/shared-function-info.h" 16 void LazyBuiltinsAssembler::GenerateTailCallToJSCode(
17 TNode<Code> code, TNode<JSFunction>
function) {
19 UncheckedCast<Int32T>(Parameter(Descriptor::kActualArgumentsCount));
20 TNode<Context> context = CAST(Parameter(Descriptor::kContext));
21 TNode<Object> new_target = CAST(Parameter(Descriptor::kNewTarget));
23 TailCallJSCode(code, context,
function, new_target, argc);
26 void LazyBuiltinsAssembler::GenerateTailCallToReturnedCode(
27 Runtime::FunctionId function_id, TNode<JSFunction>
function) {
28 TNode<Context> context = CAST(Parameter(Descriptor::kContext));
29 TNode<Code> code = CAST(CallRuntime(function_id, context,
function));
30 GenerateTailCallToJSCode(code,
function);
33 void LazyBuiltinsAssembler::TailCallRuntimeIfMarkerEquals(
34 TNode<Smi> marker, OptimizationMarker expected_marker,
35 Runtime::FunctionId function_id, TNode<JSFunction>
function) {
37 GotoIfNot(SmiEqual(marker, SmiConstant(expected_marker)), &no_match);
38 GenerateTailCallToReturnedCode(function_id,
function);
42 void LazyBuiltinsAssembler::MaybeTailCallOptimizedCodeSlot(
43 TNode<JSFunction>
function, TNode<FeedbackVector> feedback_vector) {
44 Label fallthrough(
this);
46 TNode<MaybeObject> maybe_optimized_code_entry = LoadMaybeWeakObjectField(
47 feedback_vector, FeedbackVector::kOptimizedCodeOffset);
52 Label optimized_code_slot_is_smi(
this), optimized_code_slot_is_weak_ref(
this);
53 Branch(TaggedIsSmi(maybe_optimized_code_entry), &optimized_code_slot_is_smi,
54 &optimized_code_slot_is_weak_ref);
56 BIND(&optimized_code_slot_is_smi);
59 TNode<Smi> marker = CAST(maybe_optimized_code_entry);
62 GotoIf(SmiEqual(marker, SmiConstant(OptimizationMarker::kNone)),
67 TailCallRuntimeIfMarkerEquals(marker,
68 OptimizationMarker::kLogFirstExecution,
69 Runtime::kFunctionFirstExecution,
function);
70 TailCallRuntimeIfMarkerEquals(marker, OptimizationMarker::kCompileOptimized,
71 Runtime::kCompileOptimized_NotConcurrent,
73 TailCallRuntimeIfMarkerEquals(
74 marker, OptimizationMarker::kCompileOptimizedConcurrent,
75 Runtime::kCompileOptimized_Concurrent,
function);
81 SmiConstant(OptimizationMarker::kInOptimizationQueue)));
85 BIND(&optimized_code_slot_is_weak_ref);
88 TNode<Code> optimized_code =
89 CAST(GetHeapObjectAssumeWeak(maybe_optimized_code_entry, &fallthrough));
93 Label found_deoptimized_code(
this);
94 TNode<CodeDataContainer> code_data_container =
95 CAST(LoadObjectField(optimized_code, Code::kCodeDataContainerOffset));
97 TNode<Int32T> code_kind_specific_flags = LoadObjectField<Int32T>(
98 code_data_container, CodeDataContainer::kKindSpecificFlagsOffset);
99 GotoIf(IsSetWord32<Code::MarkedForDeoptimizationField>(
100 code_kind_specific_flags),
101 &found_deoptimized_code);
105 StoreObjectField(
function, JSFunction::kCodeOffset, optimized_code);
106 GenerateTailCallToJSCode(optimized_code,
function);
110 BIND(&found_deoptimized_code);
111 GenerateTailCallToReturnedCode(Runtime::kEvictOptimizedCodeSlot,
function);
119 void LazyBuiltinsAssembler::CompileLazy(TNode<JSFunction>
function) {
121 Label compile_function(
this, Label::kDeferred);
124 TNode<FeedbackVector> feedback_vector =
125 LoadFeedbackVector(
function, &compile_function);
128 MaybeTailCallOptimizedCodeSlot(
function, feedback_vector);
131 TNode<SharedFunctionInfo> shared =
132 CAST(LoadObjectField(
function, JSFunction::kSharedFunctionInfoOffset));
135 TNode<Code> code = GetSharedFunctionInfoCode(shared, &compile_function);
139 WordNotEqual(code, HeapConstant(BUILTIN_CODE(isolate(), CompileLazy))));
142 StoreObjectField(
function, JSFunction::kCodeOffset, code);
143 GenerateTailCallToJSCode(code,
function);
145 BIND(&compile_function);
146 { GenerateTailCallToReturnedCode(Runtime::kCompileLazy,
function); }
149 TF_BUILTIN(CompileLazy, LazyBuiltinsAssembler) {
150 TNode<JSFunction>
function = CAST(Parameter(Descriptor::kTarget));
152 CompileLazy(
function);
155 TF_BUILTIN(CompileLazyDeoptimizedCode, LazyBuiltinsAssembler) {
156 TNode<JSFunction>
function = CAST(Parameter(Descriptor::kTarget));
159 TNode<Code> code = HeapConstant(BUILTIN_CODE(isolate(), CompileLazy));
160 StoreObjectField(
function, JSFunction::kCodeOffset, code);
161 GenerateTailCallToJSCode(code,
function);