19 #define __ ACCESS_MASM(masm)
37 int num_extra_args = 0;
47 __ add(
r0,
r0, Operand(num_extra_args + 1));
48 __ JumpToExternalReference(ExternalReference(
id, masm->isolate()));
53 static void GenerateLoadInternalArrayFunction(MacroAssembler* masm,
70 static void GenerateLoadArrayFunction(MacroAssembler* masm, Register result) {
90 Label generic_array_code, one_or_more_arguments, two_or_more_arguments;
93 GenerateLoadInternalArrayFunction(masm,
r1);
95 if (FLAG_debug_code) {
99 __ Assert(
ne, kUnexpectedInitialMapForInternalArrayFunction);
101 __ Assert(
eq, kUnexpectedInitialMapForInternalArrayFunction);
107 InternalArrayConstructorStub stub(masm->isolate());
108 __ TailCallStub(&stub);
118 Label generic_array_code, one_or_more_arguments, two_or_more_arguments;
121 GenerateLoadArrayFunction(masm,
r1);
123 if (FLAG_debug_code) {
127 __ Assert(
ne, kUnexpectedInitialMapForArrayFunction);
129 __ Assert(
eq, kUnexpectedInitialMapForArrayFunction);
134 __ LoadRoot(
r2, Heap::kUndefinedValueRootIndex);
135 ArrayConstructorStub stub(masm->isolate());
136 __ TailCallStub(&stub);
148 Counters* counters = masm->isolate()->counters();
149 __ IncrementCounter(counters->string_ctor_calls(), 1,
r2,
r3);
151 Register
function =
r1;
152 if (FLAG_debug_code) {
154 __ cmp(
function, Operand(
r2));
155 __ Assert(
eq, kUnexpectedStringFunction);
160 __ cmp(
r0, Operand::Zero());
161 __ b(
eq, &no_arguments);
163 __ sub(
r0,
r0, Operand(1));
168 Register argument =
r2;
169 Label not_cached, argument_is_string;
170 __ LookupNumberStringCache(
r0,
176 __ IncrementCounter(counters->string_ctor_cached_number(), 1,
r3,
r4);
177 __ bind(&argument_is_string);
195 __ LoadGlobalFunctionInitialMap(
function,
map,
r4);
196 if (FLAG_debug_code) {
199 __ Assert(
eq, kUnexpectedStringWrapperInstanceSize);
201 __ cmp(
r4, Operand::Zero());
202 __ Assert(
eq, kUnexpectedUnusedPropertiesOfStringWrapper);
206 __ LoadRoot(
r3, Heap::kEmptyFixedArrayRootIndex);
219 Label convert_argument;
220 __ bind(¬_cached);
221 __ JumpIfSmi(
r0, &convert_argument);
228 __ b(
ne, &convert_argument);
229 __ mov(argument,
r0);
230 __ IncrementCounter(counters->string_ctor_conversions(), 1,
r3,
r4);
231 __ b(&argument_is_string);
234 __ bind(&convert_argument);
236 __ IncrementCounter(counters->string_ctor_conversions(), 1,
r3,
r4);
243 __ mov(argument,
r0);
244 __ b(&argument_is_string);
248 __ bind(&no_arguments);
249 __ LoadRoot(argument, Heap::kempty_stringRootIndex);
251 __ b(&argument_is_string);
255 __ bind(&gc_required);
256 __ IncrementCounter(counters->string_ctor_gc_required(), 1,
r3,
r4);
260 __ CallRuntime(Runtime::kNewStringWrapper, 1);
266 static void CallRuntimePassFunction(
274 __ CallRuntime(function_id, 1);
280 static void GenerateTailCallToSharedCode(MacroAssembler* masm) {
288 static void GenerateTailCallToReturnedCode(MacroAssembler* masm) {
301 __ LoadRoot(
ip, Heap::kStackLimitRootIndex);
305 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode);
306 GenerateTailCallToReturnedCode(masm);
309 GenerateTailCallToSharedCode(masm);
313 static void Generate_JSConstructStubHelper(MacroAssembler* masm,
314 bool is_api_function,
315 bool create_memento) {
325 DCHECK(!is_api_function || !create_memento);
327 Isolate* isolate = masm->isolate();
331 FrameAndConstantPoolScope scope(masm, StackFrame::CONSTRUCT);
333 if (create_memento) {
334 __ AssertUndefinedOrAllocationSite(
r2,
r3);
345 Label rt_call, allocated;
346 if (FLAG_inline_new) {
347 Label undo_allocation;
348 ExternalReference debug_step_in_fp =
349 ExternalReference::debug_step_in_fp_address(isolate);
350 __ mov(
r2, Operand(debug_step_in_fp));
358 __ JumpIfSmi(
r2, &rt_call);
370 if (!is_api_function) {
374 __ ldr(
r4, bit_field3);
375 __ DecodeField<Map::ConstructionCount>(
r3,
r4);
380 __ str(
r4, bit_field3);
387 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1);
399 if (create_memento) {
411 __ LoadRoot(
r6, Heap::kEmptyFixedArrayRootIndex);
427 __ LoadRoot(
r6, Heap::kUndefinedValueRootIndex);
429 if (!is_api_function) {
430 Label no_inobject_slack_tracking;
434 __ DecodeField<Map::ConstructionCount>(
ip);
436 __ b(
eq, &no_inobject_slack_tracking);
444 if (FLAG_debug_code) {
447 __ Assert(
le, kUnexpectedNumberOfPreAllocatedPropertyFields);
449 __ InitializeFieldsWithFiller(
r5,
r0,
r6);
451 __ LoadRoot(
r6, Heap::kOnePointerFillerMapRootIndex);
454 __ bind(&no_inobject_slack_tracking);
457 if (create_memento) {
460 __ InitializeFieldsWithFiller(
r5,
r0,
r6);
464 __ LoadRoot(
r6, Heap::kAllocationMementoMapRootIndex);
473 __ InitializeFieldsWithFiller(
r5,
r0,
r6);
499 __ b(
eq, &allocated);
500 __ Assert(
pl, kPropertyAllocationCountFailed);
522 __ LoadRoot(
r6, Heap::kFixedArrayMapRootIndex);
539 __ LoadRoot(
r0, Heap::kUndefinedValueRootIndex);
565 __ bind(&undo_allocation);
566 __ UndoAllocationInNewSpace(
r4,
r5);
572 if (create_memento) {
579 if (create_memento) {
580 __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 2);
582 __ CallRuntime(Runtime::kNewObject, 1);
589 Label count_incremented;
590 if (create_memento) {
591 __ jmp(&count_incremented);
598 if (create_memento) {
600 __ LoadRoot(
r5, Heap::kUndefinedValueRootIndex);
602 __ b(
eq, &count_incremented);
610 __ bind(&count_incremented);
651 if (is_api_function) {
654 masm->isolate()->builtins()->HandleApiCallConstruct();
657 ParameterCount actual(
r0);
662 if (!is_api_function) {
663 masm->isolate()->heap()->SetConstructStubDeoptPCOffset(masm->pc_offset());
676 Label use_receiver, exit;
683 __ JumpIfSmi(
r0, &use_receiver);
692 __ bind(&use_receiver);
709 __ IncrementCounter(isolate->counters()->constructed_objects(), 1,
r1,
r2);
715 Generate_JSConstructStubHelper(masm,
false, FLAG_pretenuring_call_new);
720 Generate_JSConstructStubHelper(masm,
true,
false);
724 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
736 __ mov(
cp, Operand::Zero());
745 __ InitializeRootRegister();
769 __ LoadRoot(
r4, Heap::kUndefinedValueRootIndex);
772 if (!FLAG_enable_ool_constant_pool) {
783 __ LoadRoot(
r2, Heap::kUndefinedValueRootIndex);
787 ParameterCount actual(
r0);
801 Generate_JSEntryTrampolineHelper(masm,
false);
806 Generate_JSEntryTrampolineHelper(masm,
true);
811 CallRuntimePassFunction(masm, Runtime::kCompileLazy);
812 GenerateTailCallToReturnedCode(masm);
816 static void CallCompileOptimized(MacroAssembler* masm,
bool concurrent) {
823 __ Push(masm->isolate()->factory()->ToBoolean(concurrent));
825 __ CallRuntime(Runtime::kCompileOptimized, 2);
832 CallCompileOptimized(masm,
false);
833 GenerateTailCallToReturnedCode(masm);
838 CallCompileOptimized(masm,
true);
839 GenerateTailCallToReturnedCode(masm);
843 static void GenerateMakeCodeYoungAgainCommon(MacroAssembler* masm) {
854 FrameScope scope(masm, StackFrame::MANUAL);
856 __ PrepareCallCFunction(2, 0,
r2);
857 __ mov(
r1, Operand(ExternalReference::isolate_address(masm->isolate())));
859 ExternalReference::get_make_code_young_function(masm->isolate()), 2);
864 #define DEFINE_CODE_AGE_BUILTIN_GENERATOR(C) \
865 void Builtins::Generate_Make##C##CodeYoungAgainEvenMarking( \
866 MacroAssembler* masm) { \
867 GenerateMakeCodeYoungAgainCommon(masm); \
869 void Builtins::Generate_Make##C##CodeYoungAgainOddMarking( \
870 MacroAssembler* masm) { \
871 GenerateMakeCodeYoungAgainCommon(masm); \
874 #undef DEFINE_CODE_AGE_BUILTIN_GENERATOR
887 FrameScope scope(masm, StackFrame::MANUAL);
889 __ PrepareCallCFunction(2, 0,
r2);
890 __ mov(
r1, Operand(ExternalReference::isolate_address(masm->isolate())));
891 __ CallCFunction(ExternalReference::get_mark_code_as_executed_function(
892 masm->isolate()), 2);
896 __ PushFixedFrame(
r1);
906 GenerateMakeCodeYoungAgainCommon(masm);
910 static void Generate_NotifyStubFailureHelper(MacroAssembler* masm,
920 __ CallRuntime(Runtime::kNotifyStubFailure, 0, save_doubles);
935 Generate_NotifyStubFailureHelper(masm,
kSaveFPRegs);
939 static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm,
946 __ CallRuntime(Runtime::kNotifyDeoptimized, 1);
953 Label with_tos_register, unknown_state;
955 __ b(
ne, &with_tos_register);
959 __ bind(&with_tos_register);
962 __ b(
ne, &unknown_state);
966 __ bind(&unknown_state);
967 __ stop(
"no cases left");
993 __ CallRuntime(Runtime::kCompileForOnStackReplacement, 1);
1008 { ConstantPoolUnavailableScope constant_pool_unavailable(masm);
1009 if (FLAG_enable_ool_constant_pool) {
1020 __ add(
r0,
r0, Operand::SmiUntag(
r1));
1032 __ LoadRoot(
ip, Heap::kStackLimitRootIndex);
1037 __ CallRuntime(Runtime::kStackGuard, 0);
1039 __ Jump(masm->isolate()->builtins()->OnStackReplacement(),
1051 __ cmp(
r0, Operand::Zero());
1053 __ LoadRoot(
r2, Heap::kUndefinedValueRootIndex);
1055 __ add(
r0,
r0, Operand(1));
1062 Label slow, non_function;
1064 __ JumpIfSmi(
r1, &non_function);
1071 Label shift_arguments;
1072 __ mov(
r4, Operand::Zero());
1073 { Label convert_to_object, use_global_proxy, patch_receiver;
1082 __ b(
ne, &shift_arguments);
1086 __ b(
ne, &shift_arguments);
1094 __ JumpIfSmi(
r2, &convert_to_object);
1096 __ LoadRoot(
r3, Heap::kUndefinedValueRootIndex);
1098 __ b(
eq, &use_global_proxy);
1099 __ LoadRoot(
r3, Heap::kNullValueRootIndex);
1101 __ b(
eq, &use_global_proxy);
1105 __ b(
ge, &shift_arguments);
1107 __ bind(&convert_to_object);
1127 __ mov(
r4, Operand::Zero());
1128 __ jmp(&patch_receiver);
1130 __ bind(&use_global_proxy);
1134 __ bind(&patch_receiver);
1138 __ jmp(&shift_arguments);
1145 __ b(
eq, &shift_arguments);
1146 __ bind(&non_function);
1165 __ bind(&shift_arguments);
1178 __ sub(
r0,
r0, Operand(1));
1187 { Label
function, non_proxy;
1189 __ b(
eq, &
function);
1191 __ mov(
r2, Operand::Zero());
1192 __ cmp(
r4, Operand(1));
1193 __ b(
ne, &non_proxy);
1196 __ add(
r0,
r0, Operand(1));
1197 __ GetBuiltinFunction(
r1, Builtins::CALL_FUNCTION_PROXY);
1198 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1201 __ bind(&non_proxy);
1202 __ GetBuiltinFunction(
r1, Builtins::CALL_NON_FUNCTION);
1203 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1218 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1223 ParameterCount expected(0);
1229 const int kIndexOffset =
1231 const int kLimitOffset =
1250 __ LoadRoot(
r2, Heap::kRealStackLimitRootIndex);
1255 __ cmp(
r2, Operand::PointerOffsetFromSmiKey(
r0));
1267 __ mov(
r1, Operand::Zero());
1274 Label push_receiver;
1277 __ b(
ne, &push_receiver);
1286 Label call_to_object, use_global_proxy;
1290 __ b(
ne, &push_receiver);
1294 __ b(
ne, &push_receiver);
1297 __ JumpIfSmi(
r0, &call_to_object);
1298 __ LoadRoot(
r1, Heap::kNullValueRootIndex);
1300 __ b(
eq, &use_global_proxy);
1301 __ LoadRoot(
r1, Heap::kUndefinedValueRootIndex);
1303 __ b(
eq, &use_global_proxy);
1309 __ b(
ge, &push_receiver);
1313 __ bind(&call_to_object);
1316 __ b(&push_receiver);
1318 __ bind(&use_global_proxy);
1324 __ bind(&push_receiver);
1340 __ CallRuntime(Runtime::kGetProperty, 2);
1357 ParameterCount actual(
r0);
1361 __ b(
ne, &call_proxy);
1364 frame_scope.GenerateLeaveFrame();
1369 __ bind(&call_proxy);
1371 __ add(
r0,
r0, Operand(1));
1372 __ mov(
r2, Operand::Zero());
1373 __ GetBuiltinFunction(
r1, Builtins::CALL_FUNCTION_PROXY);
1374 __ Call(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1384 static void ArgumentAdaptorStackCheck(MacroAssembler* masm,
1385 Label* stack_overflow) {
1394 __ LoadRoot(
r5, Heap::kRealStackLimitRootIndex);
1400 __ b(
le, stack_overflow);
1404 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) {
1408 (FLAG_enable_ool_constant_pool ?
pp.
bit() : 0) |
1415 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) {
1425 __ add(
sp,
sp, Operand::PointerOffsetFromSmiKey(
r1));
1437 Label stack_overflow;
1438 ArgumentAdaptorStackCheck(masm, &stack_overflow);
1439 Label invoke, dont_adapt_arguments;
1441 Label enough, too_few;
1446 __ b(
eq, &dont_adapt_arguments);
1450 EnterArgumentsAdaptorFrame(masm);
1457 __ add(
r0,
fp, Operand::PointerOffsetFromSmiKey(
r0));
1481 EnterArgumentsAdaptorFrame(masm);
1488 __ add(
r0,
fp, Operand::PointerOffsetFromSmiKey(
r0));
1508 __ LoadRoot(
ip, Heap::kUndefinedValueRootIndex);
1526 masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset());
1529 LeaveArgumentsAdaptorFrame(masm);
1536 __ bind(&dont_adapt_arguments);
1539 __ bind(&stack_overflow);
1541 FrameScope frame(masm, StackFrame::MANUAL);
1542 EnterArgumentsAdaptorFrame(masm);
static const int kAllocationSiteOffset
static const int kPretenureCreateCountOffset
static void Generate_InternalArrayCode(MacroAssembler *masm)
static void Generate_FunctionApply(MacroAssembler *masm)
static void Generate_Adaptor(MacroAssembler *masm, CFunctionId id, BuiltinExtraArguments extra_args)
static void Generate_NotifyDeoptimized(MacroAssembler *masm)
static void Generate_JSConstructEntryTrampoline(MacroAssembler *masm)
static void Generate_CompileLazy(MacroAssembler *masm)
static void Generate_JSEntryTrampoline(MacroAssembler *masm)
static void Generate_OnStackReplacement(MacroAssembler *masm)
static void Generate_MarkCodeAsExecutedTwice(MacroAssembler *masm)
static void Generate_NotifyLazyDeoptimized(MacroAssembler *masm)
static void Generate_ArgumentsAdaptorTrampoline(MacroAssembler *masm)
static void Generate_JSConstructStubApi(MacroAssembler *masm)
static void Generate_FunctionCall(MacroAssembler *masm)
static void Generate_MarkCodeAsExecutedOnce(MacroAssembler *masm)
static void Generate_NotifyStubFailureSaveDoubles(MacroAssembler *masm)
static void Generate_NotifySoftDeoptimized(MacroAssembler *masm)
static void Generate_ArrayCode(MacroAssembler *masm)
static void Generate_StringConstructCode(MacroAssembler *masm)
static void Generate_NotifyStubFailure(MacroAssembler *masm)
static void Generate_CompileOptimized(MacroAssembler *masm)
static void Generate_OsrAfterStackCheck(MacroAssembler *masm)
static void Generate_InOptimizationQueue(MacroAssembler *masm)
static void Generate_CompileOptimizedConcurrent(MacroAssembler *masm)
static void Generate_JSConstructStubGeneric(MacroAssembler *masm)
static const int kConstantPoolOffset
static const int kHeaderSize
static const int kDeoptimizationDataOffset
@ INTERNAL_ARRAY_FUNCTION_INDEX
static int SlotOffset(int index)
static const int kLengthOffset
static const int kHeaderSize
static int OffsetOfElementAt(int index)
static const int kNativeContextOffset
static const int kGlobalProxyOffset
static const int kMapOffset
static const int kSharedFunctionInfoOffset
static const int kNoSlackTracking
static const int kContextOffset
static const int kFinishSlackTracking
static const int kCodeEntryOffset
static const int kPrototypeOrInitialMapOffset
static const int kHeaderSize
static const int kPropertiesOffset
static const int kElementsOffset
static const int kValueOffset
static const int kFunctionOffset
static const int kInObjectPropertiesByte
static const int kBitField3Offset
static const int kInstanceTypeOffset
static const int kPreAllocatedPropertyFieldsByte
static const int kInstanceSizesOffset
static const int kInstanceSizeOffset
static const int kUnusedPropertyFieldsOffset
static void MaybeCallEntryHook(MacroAssembler *masm)
static const int kFormalParameterCountOffset
static const int kDontAdaptArgumentsSentinel
static const int kCompilerHintsOffset
static const int kCodeOffset
static Smi * FromInt(int value)
static const int kFixedFrameSizeFromFp
static const int kContextOffset
static const int kExpressionsOffset
static const int kCallerSPOffset
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf map
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
static int Push(SpecialRPOStackFrame *stack, int depth, BasicBlock *child, int unvisited)
MemOperand ContextOperand(Register context, int index)
const RegList kJSCallerSaved
const RegList kCalleeSaved
const uint32_t kNotStringTag
const int kPointerSizeLog2
MemOperand FieldMemOperand(Register object, int offset)
STATIC_ASSERT(sizeof(CPURegister)==sizeof(Register))
@ NO_CALL_CONSTRUCTOR_FLAGS
static const int kNoCodeAgeSequenceLength
const uint32_t kIsNotStringMask
Debugger support for the V8 JavaScript engine.