9 #if V8_TARGET_ARCH_MIPS
22 #define __ ACCESS_MASM(masm)
40 int num_extra_args = 0;
50 __ Addu(a0, a0, num_extra_args + 1);
51 __ JumpToExternalReference(ExternalReference(
id, masm->isolate()));
56 static void GenerateLoadInternalArrayFunction(MacroAssembler* masm,
73 static void GenerateLoadArrayFunction(MacroAssembler* masm, Register result) {
93 Label generic_array_code, one_or_more_arguments, two_or_more_arguments;
96 GenerateLoadInternalArrayFunction(masm, a1);
98 if (FLAG_debug_code) {
102 __ Assert(
ne, kUnexpectedInitialMapForInternalArrayFunction,
103 t0, Operand(zero_reg));
104 __ GetObjectType(a2, a3, t0);
105 __ Assert(
eq, kUnexpectedInitialMapForInternalArrayFunction,
112 InternalArrayConstructorStub stub(masm->isolate());
113 __ TailCallStub(&stub);
123 Label generic_array_code;
126 GenerateLoadArrayFunction(masm, a1);
128 if (FLAG_debug_code) {
132 __ Assert(
ne, kUnexpectedInitialMapForArrayFunction1,
133 t0, Operand(zero_reg));
134 __ GetObjectType(a2, a3, t0);
135 __ Assert(
eq, kUnexpectedInitialMapForArrayFunction2,
141 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex);
142 ArrayConstructorStub stub(masm->isolate());
143 __ TailCallStub(&stub);
155 Counters* counters = masm->isolate()->counters();
156 __ IncrementCounter(counters->string_ctor_calls(), 1, a2, a3);
158 Register
function = a1;
159 if (FLAG_debug_code) {
161 __ Assert(
eq, kUnexpectedStringFunction,
function, Operand(a2));
166 __ Branch(&no_arguments,
eq, a0, Operand(zero_reg));
168 __ Subu(a0, a0, Operand(1));
175 Register argument = a2;
176 Label not_cached, argument_is_string;
177 __ LookupNumberStringCache(a0,
183 __ IncrementCounter(counters->string_ctor_cached_number(), 1, a3, t0);
184 __ bind(&argument_is_string);
202 __ LoadGlobalFunctionInitialMap(
function,
map, t0);
203 if (FLAG_debug_code) {
205 __ Assert(
eq, kUnexpectedStringWrapperInstanceSize,
208 __ Assert(
eq, kUnexpectedUnusedPropertiesOfStringWrapper,
209 t0, Operand(zero_reg));
213 __ LoadRoot(a3, Heap::kEmptyFixedArrayRootIndex);
226 Label convert_argument;
227 __ bind(¬_cached);
228 __ JumpIfSmi(a0, &convert_argument);
235 __ Branch(&convert_argument,
ne, t0, Operand(zero_reg));
236 __ mov(argument, a0);
237 __ IncrementCounter(counters->string_ctor_conversions(), 1, a3, t0);
238 __ Branch(&argument_is_string);
241 __ bind(&convert_argument);
243 __ IncrementCounter(counters->string_ctor_conversions(), 1, a3, t0);
250 __ mov(argument, v0);
251 __ Branch(&argument_is_string);
255 __ bind(&no_arguments);
256 __ LoadRoot(argument, Heap::kempty_stringRootIndex);
258 __ Branch(&argument_is_string);
262 __ bind(&gc_required);
263 __ IncrementCounter(counters->string_ctor_gc_required(), 1, a3, t0);
267 __ CallRuntime(Runtime::kNewStringWrapper, 1);
273 static void CallRuntimePassFunction(
280 __ CallRuntime(function_id, 1);
286 static void GenerateTailCallToSharedCode(MacroAssembler* masm) {
294 static void GenerateTailCallToReturnedCode(MacroAssembler* masm) {
307 __ LoadRoot(t0, Heap::kStackLimitRootIndex);
308 __ Branch(&ok,
hs,
sp, Operand(t0));
310 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode);
311 GenerateTailCallToReturnedCode(masm);
314 GenerateTailCallToSharedCode(masm);
318 static void Generate_JSConstructStubHelper(MacroAssembler* masm,
319 bool is_api_function,
320 bool create_memento) {
330 DCHECK(!is_api_function || !create_memento);
332 Isolate* isolate = masm->isolate();
343 FrameScope scope(masm, StackFrame::CONSTRUCT);
345 if (create_memento) {
346 __ AssertUndefinedOrAllocationSite(a2, a3);
352 __ MultiPushReversed(a0.bit() | a1.bit());
354 Label rt_call, allocated;
357 if (FLAG_inline_new) {
358 Label undo_allocation;
359 ExternalReference debug_step_in_fp =
360 ExternalReference::debug_step_in_fp_address(isolate);
361 __ li(a2, Operand(debug_step_in_fp));
363 __ Branch(&rt_call,
ne, a2, Operand(zero_reg));
368 __ JumpIfSmi(a2, &rt_call);
369 __ GetObjectType(a2, a3, t4);
380 if (!is_api_function) {
384 __ lw(t0, bit_field3);
385 __ DecodeField<Map::ConstructionCount>(t2, t0);
391 __ sw(t0, bit_field3);
394 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1);
399 __ mov(t2, zero_reg);
408 if (create_memento) {
420 __ LoadRoot(t6, Heap::kEmptyFixedArrayRootIndex);
440 __ LoadRoot(t7, Heap::kUndefinedValueRootIndex);
442 if (!is_api_function) {
443 Label no_inobject_slack_tracking;
446 __ Branch(&no_inobject_slack_tracking,
454 if (FLAG_debug_code) {
456 __ Addu(t6, t4, Operand(at));
457 __ Assert(
le, kUnexpectedNumberOfPreAllocatedPropertyFields,
460 __ InitializeFieldsWithFiller(t5, a0, t7);
462 __ LoadRoot(t7, Heap::kOnePointerFillerMapRootIndex);
465 __ bind(&no_inobject_slack_tracking);
468 if (create_memento) {
471 __ Addu(a0, t4, Operand(a0));
472 __ InitializeFieldsWithFiller(t5, a0, t7);
476 __ LoadRoot(t7, Heap::kAllocationMementoMapRootIndex);
487 __ Addu(a0, t4, Operand(at));
488 __ InitializeFieldsWithFiller(t5, a0, t7);
506 __ Addu(a3, a3, Operand(t6));
511 __ Branch(&allocated,
eq, a3, Operand(zero_reg));
513 a3, Operand(zero_reg));
535 __ LoadRoot(t6, Heap::kFixedArrayMapRootIndex);
555 if (!is_api_function || create_memento) {
556 __ LoadRoot(t7, Heap::kUndefinedValueRootIndex);
557 }
else if (FLAG_debug_code) {
558 __ LoadRoot(t2, Heap::kUndefinedValueRootIndex);
559 __ Assert(
eq, kUndefinedValueNotLoaded, t7, Operand(t2));
566 __ Branch(&loop,
less, a2, Operand(t6));
586 __ bind(&undo_allocation);
587 __ UndoAllocationInNewSpace(t4, t5);
593 if (create_memento) {
600 if (create_memento) {
601 __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 2);
603 __ CallRuntime(Runtime::kNewObject, 1);
610 Label count_incremented;
611 if (create_memento) {
612 __ jmp(&count_incremented);
619 if (create_memento) {
621 __ LoadRoot(t5, Heap::kUndefinedValueRootIndex);
622 __ Branch(&count_incremented,
eq, a2, Operand(t5));
630 __ bind(&count_incremented);
662 __ Addu(t0, a2, Operand(t0));
666 __ Addu(a3, a3, Operand(-2));
672 if (is_api_function) {
675 masm->isolate()->builtins()->HandleApiCallConstruct();
678 ParameterCount actual(a0);
683 if (!is_api_function) {
684 masm->isolate()->heap()->SetConstructStubDeoptPCOffset(masm->pc_offset());
693 Label use_receiver, exit;
700 __ JumpIfSmi(v0, &use_receiver);
704 __ GetObjectType(v0, a1, a3);
709 __ bind(&use_receiver);
727 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, a1, a2);
733 Generate_JSConstructStubHelper(masm,
false, FLAG_pretenuring_call_new);
738 Generate_JSConstructStubHelper(masm,
true,
false);
742 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
756 __ mov(
cp, zero_reg);
783 __ Branch(&loop,
ne,
s0, Operand(t2));
787 __ LoadRoot(t0, Heap::kUndefinedValueRootIndex);
800 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex);
804 ParameterCount actual(a0);
816 Generate_JSEntryTrampolineHelper(masm,
false);
821 Generate_JSEntryTrampolineHelper(masm,
true);
826 CallRuntimePassFunction(masm, Runtime::kCompileLazy);
827 GenerateTailCallToReturnedCode(masm);
831 static void CallCompileOptimized(MacroAssembler* masm,
bool concurrent) {
837 __ Push(masm->isolate()->factory()->ToBoolean(concurrent));
839 __ CallRuntime(Runtime::kCompileOptimized, 2);
846 CallCompileOptimized(masm,
false);
847 GenerateTailCallToReturnedCode(masm);
852 CallCompileOptimized(masm,
true);
853 GenerateTailCallToReturnedCode(masm);
858 static void GenerateMakeCodeYoungAgainCommon(MacroAssembler* masm) {
874 (a0.bit() | a1.bit() | ra.bit() |
fp.
bit()) & ~
sp.
bit();
875 FrameScope scope(masm, StackFrame::MANUAL);
876 __ MultiPush(saved_regs);
877 __ PrepareCallCFunction(2, 0, a2);
878 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate())));
880 ExternalReference::get_make_code_young_function(masm->isolate()), 2);
881 __ MultiPop(saved_regs);
885 #define DEFINE_CODE_AGE_BUILTIN_GENERATOR(C) \
886 void Builtins::Generate_Make##C##CodeYoungAgainEvenMarking( \
887 MacroAssembler* masm) { \
888 GenerateMakeCodeYoungAgainCommon(masm); \
890 void Builtins::Generate_Make##C##CodeYoungAgainOddMarking( \
891 MacroAssembler* masm) { \
892 GenerateMakeCodeYoungAgainCommon(masm); \
895 #undef DEFINE_CODE_AGE_BUILTIN_GENERATOR
913 (a0.bit() | a1.bit() | ra.bit() |
fp.
bit()) & ~
sp.
bit();
914 FrameScope scope(masm, StackFrame::MANUAL);
915 __ MultiPush(saved_regs);
916 __ PrepareCallCFunction(2, 0, a2);
917 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate())));
919 ExternalReference::get_mark_code_as_executed_function(masm->isolate()),
921 __ MultiPop(saved_regs);
934 GenerateMakeCodeYoungAgainCommon(masm);
938 static void Generate_NotifyStubFailureHelper(MacroAssembler* masm,
948 __ CallRuntime(Runtime::kNotifyStubFailure, 0, save_doubles);
963 Generate_NotifyStubFailureHelper(masm,
kSaveFPRegs);
967 static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm,
974 __ CallRuntime(Runtime::kNotifyDeoptimized, 1);
981 Label with_tos_register, unknown_state;
982 __ Branch(&with_tos_register,
988 __ bind(&with_tos_register);
996 __ bind(&unknown_state);
997 __ stop(
"no cases left");
1023 __ CallRuntime(Runtime::kCompileForOnStackReplacement, 1);
1041 __ addu(v0, v0, a1);
1052 __ LoadRoot(at, Heap::kStackLimitRootIndex);
1053 __ Branch(&ok,
hs,
sp, Operand(at));
1056 __ CallRuntime(Runtime::kStackGuard, 0);
1058 __ Jump(masm->isolate()->builtins()->OnStackReplacement(),
1070 __ Branch(&done,
ne, a0, Operand(zero_reg));
1071 __ LoadRoot(t2, Heap::kUndefinedValueRootIndex);
1073 __ Addu(a0, a0, Operand(1));
1080 Label slow, non_function;
1082 __ addu(at,
sp, at);
1084 __ JumpIfSmi(a1, &non_function);
1085 __ GetObjectType(a1, a2, a2);
1091 Label shift_arguments;
1093 { Label convert_to_object, use_global_proxy, patch_receiver;
1102 __ Branch(&shift_arguments,
ne, t3, Operand(zero_reg));
1106 __ Branch(&shift_arguments,
ne, t3, Operand(zero_reg));
1111 __ addu(a2,
sp, at);
1116 __ JumpIfSmi(a2, &convert_to_object, t2);
1118 __ LoadRoot(a3, Heap::kUndefinedValueRootIndex);
1119 __ Branch(&use_global_proxy,
eq, a2, Operand(a3));
1120 __ LoadRoot(a3, Heap::kNullValueRootIndex);
1121 __ Branch(&use_global_proxy,
eq, a2, Operand(a3));
1124 __ GetObjectType(a2, a3, a3);
1127 __ bind(&convert_to_object);
1143 __ addu(at,
sp, at);
1148 __ bind(&use_global_proxy);
1152 __ bind(&patch_receiver);
1154 __ addu(a3,
sp, at);
1157 __ Branch(&shift_arguments);
1165 __ bind(&non_function);
1176 __ addu(a2,
sp, at);
1185 __ bind(&shift_arguments);
1189 __ addu(a2,
sp, at);
1195 __ Branch(&loop,
ne, a2, Operand(
sp));
1198 __ Subu(a0, a0, Operand(1));
1207 { Label
function, non_proxy;
1208 __ Branch(&
function,
eq, t0, Operand(zero_reg));
1210 __ mov(a2, zero_reg);
1211 __ Branch(&non_proxy,
ne, t0, Operand(1));
1214 __ Addu(a0, a0, Operand(1));
1215 __ GetBuiltinFunction(a1, Builtins::CALL_FUNCTION_PROXY);
1216 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1219 __ bind(&non_proxy);
1220 __ GetBuiltinFunction(a1, Builtins::CALL_NON_FUNCTION);
1221 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1236 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1240 ParameterCount expected(0);
1241 __ InvokeCode(a3, expected, expected,
JUMP_FUNCTION, NullCallWrapper());
1246 const int kIndexOffset =
1248 const int kLimitOffset =
1267 __ LoadRoot(a2, Heap::kRealStackLimitRootIndex);
1270 __ subu(a2,
sp, a2);
1273 __ Branch(&okay,
gt, a2, Operand(t3));
1283 __ mov(a1, zero_reg);
1290 Label push_receiver;
1292 __ GetObjectType(a1, a2, a2);
1302 Label call_to_object, use_global_proxy;
1306 __ Branch(&push_receiver,
ne, t3, Operand(zero_reg));
1310 __ Branch(&push_receiver,
ne, t3, Operand(zero_reg));
1313 __ JumpIfSmi(a0, &call_to_object);
1314 __ LoadRoot(a1, Heap::kNullValueRootIndex);
1315 __ Branch(&use_global_proxy,
eq, a0, Operand(a1));
1316 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex);
1317 __ Branch(&use_global_proxy,
eq, a0, Operand(a2));
1322 __ GetObjectType(a0, a1, a1);
1327 __ bind(&call_to_object);
1331 __ Branch(&push_receiver);
1333 __ bind(&use_global_proxy);
1339 __ bind(&push_receiver);
1355 __ CallRuntime(Runtime::kGetProperty, 2);
1367 __ Branch(&loop,
ne, a0, Operand(a1));
1371 ParameterCount actual(a0);
1374 __ GetObjectType(a1, a2, a2);
1379 frame_scope.GenerateLeaveFrame();
1384 __ bind(&call_proxy);
1386 __ Addu(a0, a0, Operand(1));
1388 __ GetBuiltinFunction(a1, Builtins::CALL_FUNCTION_PROXY);
1389 __ Call(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1399 static void ArgumentAdaptorStackCheck(MacroAssembler* masm,
1400 Label* stack_overflow) {
1409 __ LoadRoot(t1, Heap::kRealStackLimitRootIndex);
1412 __ subu(t1,
sp, t1);
1416 __ Branch(stack_overflow,
le, t1, Operand(at));
1420 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) {
1423 __ MultiPush(a0.bit() | a1.bit() | t0.bit() |
fp.
bit() | ra.bit());
1429 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) {
1438 __ MultiPop(
fp.
bit() | ra.bit());
1454 Label stack_overflow;
1455 ArgumentAdaptorStackCheck(masm, &stack_overflow);
1456 Label invoke, dont_adapt_arguments;
1458 Label enough, too_few;
1460 __ Branch(&dont_adapt_arguments,
eq,
1463 __ Branch(&too_few,
Uless, a0, Operand(a2));
1471 EnterArgumentsAdaptorFrame(masm);
1475 __ Addu(a0,
fp, a0);
1480 __ subu(a2, a0, a2);
1500 EnterArgumentsAdaptorFrame(masm);
1508 __ Addu(a0,
fp, a0);
1532 __ LoadRoot(t0, Heap::kUndefinedValueRootIndex);
1534 __ Subu(a2,
fp, Operand(t2));
1552 masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset());
1555 LeaveArgumentsAdaptorFrame(masm);
1562 __ bind(&dont_adapt_arguments);
1565 __ bind(&stack_overflow);
1567 FrameScope frame(masm, StackFrame::MANUAL);
1568 EnterArgumentsAdaptorFrame(masm);
static const int kAllocationSiteOffset
static const int kPretenureCreateCountOffset
static const int kInstrSize
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 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 kBitField3Offset
static const int kInstanceTypeOffset
static const int kInstanceSizeOffset
static const int kPreAllocatedPropertyFieldsOffset
static const int kInObjectPropertiesOffset
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.