9 #if V8_TARGET_ARCH_MIPS64
21 #define __ ACCESS_MASM(masm)
39 int num_extra_args = 0;
49 __ Daddu(
s0, a0, num_extra_args + 1);
52 __ JumpToExternalReference(ExternalReference(
id, masm->isolate()));
57 static void GenerateLoadInternalArrayFunction(MacroAssembler* masm,
74 static void GenerateLoadArrayFunction(MacroAssembler* masm, Register result) {
94 Label generic_array_code, one_or_more_arguments, two_or_more_arguments;
97 GenerateLoadInternalArrayFunction(masm, a1);
99 if (FLAG_debug_code) {
103 __ Assert(
ne, kUnexpectedInitialMapForInternalArrayFunction,
104 a4, Operand(zero_reg));
105 __ GetObjectType(a2, a3, a4);
106 __ Assert(
eq, kUnexpectedInitialMapForInternalArrayFunction,
113 InternalArrayConstructorStub stub(masm->isolate());
114 __ TailCallStub(&stub);
124 Label generic_array_code;
127 GenerateLoadArrayFunction(masm, a1);
129 if (FLAG_debug_code) {
133 __ Assert(
ne, kUnexpectedInitialMapForArrayFunction1,
134 a4, Operand(zero_reg));
135 __ GetObjectType(a2, a3, a4);
136 __ Assert(
eq, kUnexpectedInitialMapForArrayFunction2,
142 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex);
143 ArrayConstructorStub stub(masm->isolate());
144 __ TailCallStub(&stub);
156 Counters* counters = masm->isolate()->counters();
157 __ IncrementCounter(counters->string_ctor_calls(), 1, a2, a3);
159 Register
function = a1;
160 if (FLAG_debug_code) {
162 __ Assert(
eq, kUnexpectedStringFunction,
function, Operand(a2));
167 __ Branch(&no_arguments,
eq, a0, Operand(zero_reg));
169 __ Dsubu(a0, a0, Operand(1));
176 Register argument = a2;
177 Label not_cached, argument_is_string;
178 __ LookupNumberStringCache(a0,
184 __ IncrementCounter(counters->string_ctor_cached_number(), 1, a3, a4);
185 __ bind(&argument_is_string);
203 __ LoadGlobalFunctionInitialMap(
function,
map, a4);
204 if (FLAG_debug_code) {
206 __ Assert(
eq, kUnexpectedStringWrapperInstanceSize,
209 __ Assert(
eq, kUnexpectedUnusedPropertiesOfStringWrapper,
210 a4, Operand(zero_reg));
214 __ LoadRoot(a3, Heap::kEmptyFixedArrayRootIndex);
227 Label convert_argument;
228 __ bind(¬_cached);
229 __ JumpIfSmi(a0, &convert_argument);
236 __ Branch(&convert_argument,
ne, a4, Operand(zero_reg));
237 __ mov(argument, a0);
238 __ IncrementCounter(counters->string_ctor_conversions(), 1, a3, a4);
239 __ Branch(&argument_is_string);
242 __ bind(&convert_argument);
244 __ IncrementCounter(counters->string_ctor_conversions(), 1, a3, a4);
251 __ mov(argument, v0);
252 __ Branch(&argument_is_string);
256 __ bind(&no_arguments);
257 __ LoadRoot(argument, Heap::kempty_stringRootIndex);
259 __ Branch(&argument_is_string);
263 __ bind(&gc_required);
264 __ IncrementCounter(counters->string_ctor_gc_required(), 1, a3, a4);
268 __ CallRuntime(Runtime::kNewStringWrapper, 1);
274 static void CallRuntimePassFunction(
281 __ CallRuntime(function_id, 1);
287 static void GenerateTailCallToSharedCode(MacroAssembler* masm) {
295 static void GenerateTailCallToReturnedCode(MacroAssembler* masm) {
308 __ LoadRoot(a4, Heap::kStackLimitRootIndex);
309 __ Branch(&ok,
hs,
sp, Operand(a4));
311 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode);
312 GenerateTailCallToReturnedCode(masm);
315 GenerateTailCallToSharedCode(masm);
319 static void Generate_JSConstructStubHelper(MacroAssembler* masm,
320 bool is_api_function,
321 bool create_memento) {
331 DCHECK(!is_api_function || !create_memento);
333 Isolate* isolate = masm->isolate();
344 FrameScope scope(masm, StackFrame::CONSTRUCT);
346 if (create_memento) {
347 __ AssertUndefinedOrAllocationSite(a2, a3);
353 __ dsll32(a0, a0, 0);
354 __ MultiPushReversed(a0.bit() | a1.bit());
356 Label rt_call, allocated;
359 if (FLAG_inline_new) {
360 Label undo_allocation;
361 ExternalReference debug_step_in_fp =
362 ExternalReference::debug_step_in_fp_address(isolate);
363 __ li(a2, Operand(debug_step_in_fp));
365 __ Branch(&rt_call,
ne, a2, Operand(zero_reg));
370 __ JumpIfSmi(a2, &rt_call);
371 __ GetObjectType(a2, a3, t0);
382 if (!is_api_function) {
386 __ lwu(a4, bit_field3);
387 __ DecodeField<Map::ConstructionCount>(a6, a4);
396 __ sw(a4, bit_field3);
399 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1);
404 __ mov(a6, zero_reg);
413 if (create_memento) {
425 __ LoadRoot(t2, Heap::kEmptyFixedArrayRootIndex);
445 __ LoadRoot(t3, Heap::kUndefinedValueRootIndex);
447 if (!is_api_function) {
448 Label no_inobject_slack_tracking;
451 __ Branch(&no_inobject_slack_tracking,
461 __ daddu(a0, t1, at);
463 if (FLAG_debug_code) {
465 __ Daddu(t2, t0, Operand(at));
466 __ Assert(
le, kUnexpectedNumberOfPreAllocatedPropertyFields,
469 __ InitializeFieldsWithFiller(t1, a0, t3);
471 __ LoadRoot(t3, Heap::kOnePointerFillerMapRootIndex);
474 __ bind(&no_inobject_slack_tracking);
477 if (create_memento) {
480 __ Daddu(a0, t0, Operand(a0));
481 __ InitializeFieldsWithFiller(t1, a0, t3);
485 __ LoadRoot(t3, Heap::kAllocationMementoMapRootIndex);
496 __ Daddu(a0, t0, Operand(at));
497 __ InitializeFieldsWithFiller(t1, a0, t3);
517 __ Daddu(a3, a3, Operand(t2));
520 __ dsubu(a3, a3, t2);
523 __ Branch(&allocated,
eq, a3, Operand(zero_reg));
525 a3, Operand(zero_reg));
547 __ LoadRoot(t2, Heap::kFixedArrayMapRootIndex);
551 __ dsll32(a0, a3, 0);
565 __ daddu(t2, a2, a7);
568 if (!is_api_function || create_memento) {
569 __ LoadRoot(t3, Heap::kUndefinedValueRootIndex);
570 }
else if (FLAG_debug_code) {
571 __ LoadRoot(a6, Heap::kUndefinedValueRootIndex);
572 __ Assert(
eq, kUndefinedValueNotLoaded, t3, Operand(a6));
579 __ Branch(&loop,
less, a2, Operand(t2));
599 __ bind(&undo_allocation);
600 __ UndoAllocationInNewSpace(t0, t1);
606 if (create_memento) {
613 if (create_memento) {
614 __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 2);
616 __ CallRuntime(Runtime::kNewObject, 1);
623 Label count_incremented;
624 if (create_memento) {
625 __ jmp(&count_incremented);
632 if (create_memento) {
634 __ LoadRoot(t1, Heap::kUndefinedValueRootIndex);
635 __ Branch(&count_incremented,
eq, a2, Operand(t1));
643 __ bind(&count_incremented);
676 __ Daddu(a4, a2, Operand(a4));
680 __ Daddu(a3, a3, Operand(-1));
686 if (is_api_function) {
689 masm->isolate()->builtins()->HandleApiCallConstruct();
692 ParameterCount actual(a0);
697 if (!is_api_function) {
698 masm->isolate()->heap()->SetConstructStubDeoptPCOffset(masm->pc_offset());
707 Label use_receiver, exit;
714 __ JumpIfSmi(v0, &use_receiver);
718 __ GetObjectType(v0, a1, a3);
723 __ bind(&use_receiver);
741 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, a1, a2);
747 Generate_JSConstructStubHelper(masm,
false, FLAG_pretenuring_call_new);
752 Generate_JSConstructStubHelper(masm,
true,
false);
756 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
769 __ mov(
cp, zero_reg);
788 __ dsll32(a3, a3, 0);
789 __ dsrl32(a3, a3, 0);
791 __ daddu(a6,
s0, a4);
801 __ Branch(&loop,
ne,
s0, Operand(a6));
805 __ LoadRoot(a4, Heap::kUndefinedValueRootIndex);
818 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex);
822 ParameterCount actual(a0);
833 Generate_JSEntryTrampolineHelper(masm,
false);
838 Generate_JSEntryTrampolineHelper(masm,
true);
843 CallRuntimePassFunction(masm, Runtime::kCompileLazy);
844 GenerateTailCallToReturnedCode(masm);
848 static void CallCompileOptimized(MacroAssembler* masm,
bool concurrent) {
854 __ Push(masm->isolate()->factory()->ToBoolean(concurrent));
856 __ CallRuntime(Runtime::kCompileOptimized, 2);
863 CallCompileOptimized(masm,
false);
864 GenerateTailCallToReturnedCode(masm);
869 CallCompileOptimized(masm,
true);
870 GenerateTailCallToReturnedCode(masm);
874 static void GenerateMakeCodeYoungAgainCommon(MacroAssembler* masm) {
890 (a0.bit() | a1.bit() | ra.bit() |
fp.
bit()) & ~
sp.
bit();
891 FrameScope scope(masm, StackFrame::MANUAL);
892 __ MultiPush(saved_regs);
893 __ PrepareCallCFunction(2, 0, a2);
894 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate())));
896 ExternalReference::get_make_code_young_function(masm->isolate()), 2);
897 __ MultiPop(saved_regs);
901 #define DEFINE_CODE_AGE_BUILTIN_GENERATOR(C) \
902 void Builtins::Generate_Make##C##CodeYoungAgainEvenMarking( \
903 MacroAssembler* masm) { \
904 GenerateMakeCodeYoungAgainCommon(masm); \
906 void Builtins::Generate_Make##C##CodeYoungAgainOddMarking( \
907 MacroAssembler* masm) { \
908 GenerateMakeCodeYoungAgainCommon(masm); \
911 #undef DEFINE_CODE_AGE_BUILTIN_GENERATOR
929 (a0.bit() | a1.bit() | ra.bit() |
fp.
bit()) & ~
sp.
bit();
930 FrameScope scope(masm, StackFrame::MANUAL);
931 __ MultiPush(saved_regs);
932 __ PrepareCallCFunction(2, 0, a2);
933 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate())));
935 ExternalReference::get_mark_code_as_executed_function(masm->isolate()),
937 __ MultiPop(saved_regs);
950 GenerateMakeCodeYoungAgainCommon(masm);
954 static void Generate_NotifyStubFailureHelper(MacroAssembler* masm,
964 __ CallRuntime(Runtime::kNotifyStubFailure, 0, save_doubles);
979 Generate_NotifyStubFailureHelper(masm,
kSaveFPRegs);
983 static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm,
990 __ CallRuntime(Runtime::kNotifyDeoptimized, 1);
997 Label with_tos_register, unknown_state;
998 __ Branch(&with_tos_register,
1004 __ bind(&with_tos_register);
1012 __ bind(&unknown_state);
1013 __ stop(
"no cases left");
1039 __ CallRuntime(Runtime::kCompileForOnStackReplacement, 1);
1057 __ daddu(v0, v0, a1);
1068 __ LoadRoot(at, Heap::kStackLimitRootIndex);
1069 __ Branch(&ok,
hs,
sp, Operand(at));
1072 __ CallRuntime(Runtime::kStackGuard, 0);
1074 __ Jump(masm->isolate()->builtins()->OnStackReplacement(),
1086 __ Branch(&done,
ne, a0, Operand(zero_reg));
1087 __ LoadRoot(a6, Heap::kUndefinedValueRootIndex);
1089 __ Daddu(a0, a0, Operand(1));
1096 Label slow, non_function;
1098 __ daddu(at,
sp, at);
1100 __ JumpIfSmi(a1, &non_function);
1101 __ GetObjectType(a1, a2, a2);
1107 Label shift_arguments;
1109 { Label convert_to_object, use_global_proxy, patch_receiver;
1117 __ Branch(&shift_arguments,
ne, a7, Operand(zero_reg));
1122 __ Branch(&shift_arguments,
ne, a7, Operand(zero_reg));
1127 __ daddu(a2,
sp, at);
1132 __ JumpIfSmi(a2, &convert_to_object, a6);
1134 __ LoadRoot(a3, Heap::kUndefinedValueRootIndex);
1135 __ Branch(&use_global_proxy,
eq, a2, Operand(a3));
1136 __ LoadRoot(a3, Heap::kNullValueRootIndex);
1137 __ Branch(&use_global_proxy,
eq, a2, Operand(a3));
1140 __ GetObjectType(a2, a3, a3);
1143 __ bind(&convert_to_object);
1158 __ daddu(at,
sp, at);
1163 __ bind(&use_global_proxy);
1167 __ bind(&patch_receiver);
1169 __ daddu(a3,
sp, at);
1172 __ Branch(&shift_arguments);
1180 __ bind(&non_function);
1191 __ daddu(a2,
sp, at);
1200 __ bind(&shift_arguments);
1204 __ daddu(a2,
sp, at);
1210 __ Branch(&loop,
ne, a2, Operand(
sp));
1213 __ Dsubu(a0, a0, Operand(1));
1222 { Label
function, non_proxy;
1223 __ Branch(&
function,
eq, a4, Operand(zero_reg));
1225 __ mov(a2, zero_reg);
1226 __ Branch(&non_proxy,
ne, a4, Operand(1));
1229 __ Daddu(a0, a0, Operand(1));
1230 __ GetBuiltinFunction(a1, Builtins::CALL_FUNCTION_PROXY);
1231 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1234 __ bind(&non_proxy);
1235 __ GetBuiltinFunction(a1, Builtins::CALL_NON_FUNCTION);
1236 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1252 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1256 ParameterCount expected(0);
1257 __ InvokeCode(a3, expected, expected,
JUMP_FUNCTION, NullCallWrapper());
1262 const int kIndexOffset =
1264 const int kLimitOffset =
1283 __ LoadRoot(a2, Heap::kRealStackLimitRootIndex);
1286 __ dsubu(a2,
sp, a2);
1289 __ Branch(&okay,
gt, a2, Operand(a7));
1299 __ mov(a1, zero_reg);
1306 Label push_receiver;
1308 __ GetObjectType(a1, a2, a2);
1318 Label call_to_object, use_global_proxy;
1321 __ Branch(&push_receiver,
ne, a7, Operand(zero_reg));
1326 __ Branch(&push_receiver,
ne, a7, Operand(zero_reg));
1329 __ JumpIfSmi(a0, &call_to_object);
1330 __ LoadRoot(a1, Heap::kNullValueRootIndex);
1331 __ Branch(&use_global_proxy,
eq, a0, Operand(a1));
1332 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex);
1333 __ Branch(&use_global_proxy,
eq, a0, Operand(a2));
1338 __ GetObjectType(a0, a1, a1);
1343 __ bind(&call_to_object);
1347 __ Branch(&push_receiver);
1349 __ bind(&use_global_proxy);
1355 __ bind(&push_receiver);
1371 __ CallRuntime(Runtime::kGetProperty, 2);
1383 __ Branch(&loop,
ne, a0, Operand(a1));
1387 ParameterCount actual(a0);
1390 __ GetObjectType(a1, a2, a2);
1395 frame_scope.GenerateLeaveFrame();
1400 __ bind(&call_proxy);
1402 __ Daddu(a0, a0, Operand(1));
1404 __ GetBuiltinFunction(a1, Builtins::CALL_FUNCTION_PROXY);
1405 __ Call(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1415 static void ArgumentAdaptorStackCheck(MacroAssembler* masm,
1416 Label* stack_overflow) {
1425 __ LoadRoot(a5, Heap::kRealStackLimitRootIndex);
1428 __ dsubu(a5,
sp, a5);
1432 __ Branch(stack_overflow,
le, a5, Operand(at));
1436 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) {
1438 __ dsll32(a0, a0, 0);
1440 __ MultiPush(a0.bit() | a1.bit() | a4.bit() |
fp.
bit() | ra.bit());
1446 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) {
1455 __ MultiPop(
fp.
bit() | ra.bit());
1471 Label stack_overflow;
1472 ArgumentAdaptorStackCheck(masm, &stack_overflow);
1473 Label invoke, dont_adapt_arguments;
1475 Label enough, too_few;
1477 __ Branch(&dont_adapt_arguments,
eq,
1480 __ Branch(&too_few,
Uless, a0, Operand(a2));
1488 EnterArgumentsAdaptorFrame(masm);
1492 __ Daddu(a0,
fp, a0);
1497 __ dsubu(a2, a0, a2);
1517 EnterArgumentsAdaptorFrame(masm);
1525 __ Daddu(a0,
fp, a0);
1549 __ LoadRoot(a4, Heap::kUndefinedValueRootIndex);
1551 __ Dsubu(a2,
fp, Operand(a6));
1569 masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset());
1572 LeaveArgumentsAdaptorFrame(masm);
1579 __ bind(&dont_adapt_arguments);
1582 __ bind(&stack_overflow);
1584 FrameScope frame(masm, StackFrame::MANUAL);
1585 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 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 kNativeBitWithinByte
static const int kStrictModeBitWithinByte
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.