18 #define __ ACCESS_MASM(masm)
37 int num_extra_args = 0;
49 __ addp(
rax, Immediate(num_extra_args + 1));
50 __ JumpToExternalReference(ExternalReference(
id, masm->isolate()), 1);
54 static void CallRuntimePassFunction(
62 __ CallRuntime(function_id, 1);
68 static void GenerateTailCallToSharedCode(MacroAssembler* masm) {
78 static void GenerateTailCallToReturnedCode(MacroAssembler* masm) {
91 __ CompareRoot(
rsp, Heap::kStackLimitRootIndex);
94 CallRuntimePassFunction(masm, Runtime::kTryInstallOptimizedCode);
95 GenerateTailCallToReturnedCode(masm);
98 GenerateTailCallToSharedCode(masm);
102 static void Generate_JSConstructStubHelper(MacroAssembler* masm,
103 bool is_api_function,
104 bool create_memento) {
112 DCHECK(!is_api_function || !create_memento);
116 FrameScope scope(masm, StackFrame::CONSTRUCT);
118 if (create_memento) {
119 __ AssertUndefinedOrAllocationSite(
rbx);
132 Label rt_call, allocated;
133 if (FLAG_inline_new) {
134 Label undo_allocation;
136 ExternalReference debug_step_in_fp =
137 ExternalReference::debug_step_in_fp_address(masm->isolate());
148 __ JumpIfSmi(
rax, &rt_call);
162 if (!is_api_function) {
183 __ CallRuntime(Runtime::kFinalizeInstanceSize, 1);
195 if (create_memento) {
205 Factory* factory = masm->isolate()->factory();
211 __ LoadRoot(
rcx, Heap::kEmptyFixedArrayRootIndex);
220 __ LoadRoot(
rdx, Heap::kUndefinedValueRootIndex);
221 if (!is_api_function) {
222 Label no_inobject_slack_tracking;
226 __ j(
equal, &no_inobject_slack_tracking);
234 if (FLAG_debug_code) {
237 kUnexpectedNumberOfPreAllocatedPropertyFields);
240 __ LoadRoot(
rdx, Heap::kOnePointerFillerMapRootIndex);
243 __ bind(&no_inobject_slack_tracking);
245 if (create_memento) {
252 factory->allocation_memento_map());
284 __ Assert(
positive, kPropertyAllocationCountFailed);
305 __ LoadRoot(
rcx, Heap::kFixedArrayMapRootIndex);
316 __ LoadRoot(
rdx, Heap::kUndefinedValueRootIndex);
343 __ bind(&undo_allocation);
344 __ UndoAllocationInNewSpace(
rbx);
351 if (create_memento) {
362 if (create_memento) {
363 __ CallRuntime(Runtime::kNewObjectWithAllocationSite, 2);
365 __ CallRuntime(Runtime::kNewObject, 1);
372 Label count_incremented;
373 if (create_memento) {
374 __ jmp(&count_incremented);
381 if (create_memento) {
383 __ Cmp(
rcx, masm->isolate()->factory()->undefined_value());
384 __ j(
equal, &count_incremented);
390 __ bind(&count_incremented);
420 if (is_api_function) {
423 masm->isolate()->builtins()->HandleApiCallConstruct();
426 ParameterCount actual(
rax);
431 if (!is_api_function) {
432 masm->isolate()->heap()->SetConstructStubDeoptPCOffset(masm->pc_offset());
441 Label use_receiver, exit;
443 __ JumpIfSmi(
rax, &use_receiver);
453 __ bind(&use_receiver);
464 __ PopReturnAddressTo(
rcx);
467 __ PushReturnAddressFrom(
rcx);
468 Counters* counters = masm->isolate()->counters();
469 __ IncrementCounter(counters->constructed_objects(), 1);
475 Generate_JSConstructStubHelper(masm,
false, FLAG_pretenuring_call_new);
480 Generate_JSConstructStubHelper(masm,
true,
false);
484 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
575 __ addp(
rcx, Immediate(1));
583 __ LoadRoot(
rbx, Heap::kUndefinedValueRootIndex);
588 ParameterCount actual(
rax);
603 Generate_JSEntryTrampolineHelper(masm,
false);
608 Generate_JSEntryTrampolineHelper(masm,
true);
613 CallRuntimePassFunction(masm, Runtime::kCompileLazy);
614 GenerateTailCallToReturnedCode(masm);
618 static void CallCompileOptimized(MacroAssembler* masm,
626 __ Push(masm->isolate()->factory()->ToBoolean(concurrent));
628 __ CallRuntime(Runtime::kCompileOptimized, 2);
635 CallCompileOptimized(masm,
false);
636 GenerateTailCallToReturnedCode(masm);
641 CallCompileOptimized(masm,
true);
642 GenerateTailCallToReturnedCode(masm);
646 static void GenerateMakeCodeYoungAgainCommon(MacroAssembler* masm) {
655 __ subp(Operand(
rsp, 0), Immediate(5));
657 __ Move(
arg_reg_2, ExternalReference::isolate_address(masm->isolate()));
660 FrameScope scope(masm, StackFrame::MANUAL);
661 __ PrepareCallCFunction(2);
663 ExternalReference::get_make_code_young_function(masm->isolate()), 2);
670 #define DEFINE_CODE_AGE_BUILTIN_GENERATOR(C) \
671 void Builtins::Generate_Make##C##CodeYoungAgainEvenMarking( \
672 MacroAssembler* masm) { \
673 GenerateMakeCodeYoungAgainCommon(masm); \
675 void Builtins::Generate_Make##C##CodeYoungAgainOddMarking( \
676 MacroAssembler* masm) { \
677 GenerateMakeCodeYoungAgainCommon(masm); \
680 #undef DEFINE_CODE_AGE_BUILTIN_GENERATOR
689 __ Move(
arg_reg_2, ExternalReference::isolate_address(masm->isolate()));
693 FrameScope scope(masm, StackFrame::MANUAL);
694 __ PrepareCallCFunction(2);
696 ExternalReference::get_mark_code_as_executed_function(masm->isolate()),
715 GenerateMakeCodeYoungAgainCommon(masm);
719 static void Generate_NotifyStubFailureHelper(MacroAssembler* masm,
729 __ CallRuntime(Runtime::kNotifyStubFailure, 0, save_doubles);
734 __ DropUnderReturnAddress(1);
745 Generate_NotifyStubFailureHelper(masm,
kSaveFPRegs);
749 static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm,
758 __ CallRuntime(Runtime::kNotifyDeoptimized, 1);
766 Label not_no_registers, not_tos_rax;
771 __ bind(¬_no_registers);
777 __ bind(¬_tos_rax);
778 __ Abort(kNoCasesLeft);
812 __ PopReturnAddressTo(
rbx);
813 __ Push(masm->isolate()->factory()->undefined_value());
814 __ PushReturnAddressFrom(
rbx);
821 Label slow, non_function;
822 StackArgumentsAccessor args(
rsp,
rax);
823 __ movp(
rdi, args.GetReceiverOperand());
824 __ JumpIfSmi(
rdi, &non_function);
829 Label shift_arguments;
831 { Label convert_to_object, use_global_proxy, patch_receiver;
848 __ movp(
rbx, args.GetArgumentOperand(1));
849 __ JumpIfSmi(
rbx, &convert_to_object, Label::kNear);
851 __ CompareRoot(
rbx, Heap::kNullValueRootIndex);
852 __ j(
equal, &use_global_proxy);
853 __ CompareRoot(
rbx, Heap::kUndefinedValueRootIndex);
854 __ j(
equal, &use_global_proxy);
860 __ bind(&convert_to_object);
877 __ movp(
rdi, args.GetReceiverOperand());
878 __ jmp(&patch_receiver, Label::kNear);
880 __ bind(&use_global_proxy);
885 __ bind(&patch_receiver);
886 __ movp(args.GetArgumentOperand(1),
rbx);
888 __ jmp(&shift_arguments);
896 __ bind(&non_function);
903 __ movp(args.GetArgumentOperand(1),
rdi);
908 __ bind(&shift_arguments);
911 StackArgumentsAccessor args(
rsp,
rcx);
913 __ movp(
rbx, args.GetArgumentOperand(1));
914 __ movp(args.GetArgumentOperand(0),
rbx);
917 __ DropUnderReturnAddress(1,
rbx);
923 { Label
function, non_proxy;
927 __ cmpp(
rdx, Immediate(1));
930 __ PopReturnAddressTo(
rdx);
932 __ PushReturnAddressFrom(
rdx);
934 __ GetBuiltinEntry(
rdx, Builtins::CALL_FUNCTION_PROXY);
935 __ jmp(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
939 __ GetBuiltinEntry(
rdx, Builtins::CALL_NON_FUNCTION);
940 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
949 __ LoadSharedFunctionInfoSpecialField(
rbx,
rdx,
954 masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
957 ParameterCount expected(0);
977 static const int kReceiverOffset = kArgumentsOffset +
kPointerSize;
978 static const int kFunctionOffset = kReceiverOffset +
kPointerSize;
1008 const int kLimitOffset =
1010 const int kIndexOffset = kLimitOffset - 1 *
kPointerSize;
1015 __ movp(
rbx, Operand(
rbp, kReceiverOffset));
1018 Label push_receiver;
1019 __ movp(
rdi, Operand(
rbp, kFunctionOffset));
1027 Label call_to_object, use_global_proxy;
1039 __ JumpIfSmi(
rbx, &call_to_object, Label::kNear);
1040 __ CompareRoot(
rbx, Heap::kNullValueRootIndex);
1041 __ j(
equal, &use_global_proxy);
1042 __ CompareRoot(
rbx, Heap::kUndefinedValueRootIndex);
1043 __ j(
equal, &use_global_proxy);
1052 __ bind(&call_to_object);
1056 __ jmp(&push_receiver, Label::kNear);
1058 __ bind(&use_global_proxy);
1064 __ bind(&push_receiver);
1071 __ movp(key, Operand(
rbp, kIndexOffset));
1074 __ movp(receiver, Operand(
rbp, kArgumentsOffset));
1077 if (FLAG_vector_ics) {
1080 Handle<Code> ic = CodeFactory::KeyedLoadIC(masm->isolate()).code();
1091 __ movp(key, Operand(
rbp, kIndexOffset));
1093 __ movp(Operand(
rbp, kIndexOffset), key);
1096 __ cmpp(key, Operand(
rbp, kLimitOffset));
1101 ParameterCount actual(
rax);
1102 __ SmiToInteger32(
rax, key);
1103 __ movp(
rdi, Operand(
rbp, kFunctionOffset));
1108 frame_scope.GenerateLeaveFrame();
1112 __ bind(&call_proxy);
1116 __ GetBuiltinEntry(
rdx, Builtins::CALL_FUNCTION_PROXY);
1117 __ call(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
1132 Label generic_array_code;
1137 if (FLAG_debug_code) {
1143 __ Check(not_smi, kUnexpectedInitialMapForInternalArrayFunction);
1145 __ Check(
equal, kUnexpectedInitialMapForInternalArrayFunction);
1151 InternalArrayConstructorStub stub(masm->isolate());
1152 __ TailCallStub(&stub);
1162 Label generic_array_code;
1167 if (FLAG_debug_code) {
1173 __ Check(not_smi, kUnexpectedInitialMapForArrayFunction);
1175 __ Check(
equal, kUnexpectedInitialMapForArrayFunction);
1180 __ LoadRoot(
rbx, Heap::kUndefinedValueRootIndex);
1181 ArrayConstructorStub stub(masm->isolate());
1182 __ TailCallStub(&stub);
1194 Counters* counters = masm->isolate()->counters();
1195 __ IncrementCounter(counters->string_ctor_calls(), 1);
1197 if (FLAG_debug_code) {
1200 __ Assert(
equal, kUnexpectedStringFunction);
1205 StackArgumentsAccessor args(
rsp,
rax);
1208 __ j(
zero, &no_arguments);
1209 __ movp(
rbx, args.GetArgumentOperand(1));
1210 __ PopReturnAddressTo(
rcx);
1212 __ PushReturnAddressFrom(
rcx);
1216 Label not_cached, argument_is_string;
1217 __ LookupNumberStringCache(
rax,
1222 __ IncrementCounter(counters->string_ctor_cached_number(), 1);
1223 __ bind(&argument_is_string);
1241 __ LoadGlobalFunctionInitialMap(
rdi,
rcx);
1242 if (FLAG_debug_code) {
1245 __ Assert(
equal, kUnexpectedStringWrapperInstanceSize);
1247 __ Assert(
equal, kUnexpectedUnusedPropertiesOfStringWrapper);
1252 __ LoadRoot(
rcx, Heap::kEmptyFixedArrayRootIndex);
1267 Label convert_argument;
1268 __ bind(¬_cached);
1270 __ JumpIfSmi(
rax, &convert_argument);
1274 __ IncrementCounter(counters->string_ctor_string_value(), 1);
1275 __ jmp(&argument_is_string);
1278 __ bind(&convert_argument);
1279 __ IncrementCounter(counters->string_ctor_conversions(), 1);
1288 __ jmp(&argument_is_string);
1292 __ bind(&no_arguments);
1293 __ LoadRoot(
rbx, Heap::kempty_stringRootIndex);
1294 __ PopReturnAddressTo(
rcx);
1296 __ PushReturnAddressFrom(
rcx);
1297 __ jmp(&argument_is_string);
1301 __ bind(&gc_required);
1302 __ IncrementCounter(counters->string_ctor_gc_required(), 1);
1306 __ CallRuntime(Runtime::kNewStringWrapper, 1);
1312 static void ArgumentsAdaptorStackCheck(MacroAssembler* masm,
1313 Label* stack_overflow) {
1323 __ LoadRoot(
rdx, Heap::kRealStackLimitRootIndex);
1338 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) {
1356 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) {
1365 __ PopReturnAddressTo(
rcx);
1368 __ PushReturnAddressFrom(
rcx);
1379 Label invoke, dont_adapt_arguments;
1380 Counters* counters = masm->isolate()->counters();
1381 __ IncrementCounter(counters->arguments_adaptors(), 1);
1383 Label stack_overflow;
1384 ArgumentsAdaptorStackCheck(masm, &stack_overflow);
1386 Label enough, too_few;
1391 __ j(
equal, &dont_adapt_arguments);
1395 EnterArgumentsAdaptorFrame(masm);
1414 EnterArgumentsAdaptorFrame(masm);
1447 masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset());
1450 LeaveArgumentsAdaptorFrame(masm);
1456 __ bind(&dont_adapt_arguments);
1459 __ bind(&stack_overflow);
1461 FrameScope frame(masm, StackFrame::MANUAL);
1462 EnterArgumentsAdaptorFrame(masm);
1476 __ CallRuntime(Runtime::kCompileForOnStackReplacement, 1);
1481 __ cmpp(
rax, Immediate(0));
1508 __ CompareRoot(
rsp, Heap::kStackLimitRootIndex);
1512 __ CallRuntime(Runtime::kStackGuard, 0);
1514 __ jmp(masm->isolate()->builtins()->OnStackReplacement(),
static const int kAllocationSiteOffset
static const int kPretenureCreateCountOffset
static const int kLengthOffset
static const int kShortCallInstructionLength
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 kArgvOffset
static const int kLengthOffset
static const int kHeaderSize
static int OffsetOfElementAt(int index)
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 Register ReceiverRegister()
static const Register NameRegister()
static const int kBitField3Offset
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 kNativeBitWithinByte
static const int kStrictModeBitWithinByte
static const int kCodeOffset
static Smi * FromInt(int value)
static const int kContextOffset
static const int kExpressionsOffset
static const int kCallerSPOffset
static const Register SlotRegister()
#define DCHECK(condition)
static int Push(SpecialRPOStackFrame *stack, int depth, BasicBlock *child, int unvisited)
Operand StackOperandForReturnAddress(int32_t disp)
const Register kScratchRegister
const int kNumSafepointRegisters
Operand FieldOperand(Register object, int offset)
const int kPointerSizeLog2
Condition NegateCondition(Condition cond)
STATIC_ASSERT(sizeof(CPURegister)==sizeof(Register))
@ NO_CALL_CONSTRUCTOR_FLAGS
Debugger support for the V8 JavaScript engine.