OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 26 matching lines...) Expand all Loading... |
37 namespace internal { | 37 namespace internal { |
38 | 38 |
39 | 39 |
40 #define __ ACCESS_MASM(masm) | 40 #define __ ACCESS_MASM(masm) |
41 | 41 |
42 | 42 |
43 void Builtins::Generate_Adaptor(MacroAssembler* masm, | 43 void Builtins::Generate_Adaptor(MacroAssembler* masm, |
44 CFunctionId id, | 44 CFunctionId id, |
45 BuiltinExtraArguments extra_args) { | 45 BuiltinExtraArguments extra_args) { |
46 // ----------- S t a t e ------------- | 46 // ----------- S t a t e ------------- |
47 // -- rax : number of arguments excluding receiver | 47 // -- rax : number of arguments excluding receiver |
48 // -- rdi : called function (only guaranteed when | 48 // -- rdi : called function (only guaranteed when |
49 // extra_args requires it) | 49 // extra_args requires it) |
50 // -- rsi : context | 50 // -- rsi : context |
51 // -- rsp[0] : return address | 51 // -- rsp[0] : return address |
52 // -- rsp[8] : last argument | 52 // -- rsp[8] : last argument |
53 // -- ... | 53 // -- ... |
54 // -- rsp[8 * argc] : first argument (argc == rax) | 54 // -- rsp[8 * argc] : first argument (argc == rax) |
55 // -- rsp[8 * (argc +1)] : receiver | 55 // -- rsp[8 * (argc + 1)] : receiver |
56 // ----------------------------------- | 56 // ----------------------------------- |
57 | 57 |
58 // Insert extra arguments. | 58 // Insert extra arguments. |
59 int num_extra_args = 0; | 59 int num_extra_args = 0; |
60 if (extra_args == NEEDS_CALLED_FUNCTION) { | 60 if (extra_args == NEEDS_CALLED_FUNCTION) { |
61 num_extra_args = 1; | 61 num_extra_args = 1; |
62 __ pop(kScratchRegister); // Save return address. | 62 __ pop(kScratchRegister); // Save return address. |
63 __ push(rdi); | 63 __ push(rdi); |
64 __ push(kScratchRegister); // Restore return address. | 64 __ push(kScratchRegister); // Restore return address. |
65 } else { | 65 } else { |
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 | 468 |
469 // Open a C++ scope for the FrameScope. | 469 // Open a C++ scope for the FrameScope. |
470 { | 470 { |
471 // Platform specific argument handling. After this, the stack contains | 471 // Platform specific argument handling. After this, the stack contains |
472 // an internal frame and the pushed function and receiver, and | 472 // an internal frame and the pushed function and receiver, and |
473 // register rax and rbx holds the argument count and argument array, | 473 // register rax and rbx holds the argument count and argument array, |
474 // while rdi holds the function pointer and rsi the context. | 474 // while rdi holds the function pointer and rsi the context. |
475 | 475 |
476 #ifdef _WIN64 | 476 #ifdef _WIN64 |
477 // MSVC parameters in: | 477 // MSVC parameters in: |
478 // rcx : entry (ignored) | 478 // rcx : entry (ignored) |
479 // rdx : function | 479 // rdx : function |
480 // r8 : receiver | 480 // r8 : receiver |
481 // r9 : argc | 481 // r9 : argc |
482 // [rsp+0x20] : argv | 482 // [rsp+0x20] : argv |
483 | 483 |
484 // Clear the context before we push it when entering the internal frame. | 484 // Clear the context before we push it when entering the internal frame. |
485 __ Set(rsi, 0); | 485 __ Set(rsi, 0); |
486 // Enter an internal frame. | 486 // Enter an internal frame. |
487 FrameScope scope(masm, StackFrame::INTERNAL); | 487 FrameScope scope(masm, StackFrame::INTERNAL); |
488 | 488 |
489 // Load the function context into rsi. | 489 // Load the function context into rsi. |
490 __ movq(rsi, FieldOperand(rdx, JSFunction::kContextOffset)); | 490 __ movq(rsi, FieldOperand(rdx, JSFunction::kContextOffset)); |
491 | 491 |
(...skipping 28 matching lines...) Expand all Loading... |
520 __ push(rdi); | 520 __ push(rdi); |
521 __ push(rdx); | 521 __ push(rdx); |
522 __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); | 522 __ movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); |
523 | 523 |
524 // Load the number of arguments and setup pointer to the arguments. | 524 // Load the number of arguments and setup pointer to the arguments. |
525 __ movq(rax, rcx); | 525 __ movq(rax, rcx); |
526 __ movq(rbx, r8); | 526 __ movq(rbx, r8); |
527 #endif // _WIN64 | 527 #endif // _WIN64 |
528 | 528 |
529 // Current stack contents: | 529 // Current stack contents: |
530 // [rsp + 2 * kPointerSize ... ]: Internal frame | 530 // [rsp + 2 * kPointerSize ... ] : Internal frame |
531 // [rsp + kPointerSize] : function | 531 // [rsp + kPointerSize] : function |
532 // [rsp] : receiver | 532 // [rsp] : receiver |
533 // Current register contents: | 533 // Current register contents: |
534 // rax : argc | 534 // rax : argc |
535 // rbx : argv | 535 // rbx : argv |
536 // rsi : context | 536 // rsi : context |
537 // rdi : function | 537 // rdi : function |
538 | 538 |
539 // Copy arguments to the stack in a loop. | 539 // Copy arguments to the stack in a loop. |
540 // Register rbx points to array of pointers to handle locations. | 540 // Register rbx points to array of pointers to handle locations. |
541 // Push the values of these handles. | 541 // Push the values of these handles. |
542 Label loop, entry; | 542 Label loop, entry; |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 FrameScope scope(masm, StackFrame::INTERNAL); | 751 FrameScope scope(masm, StackFrame::INTERNAL); |
752 __ CallRuntime(Runtime::kNotifyOSR, 0); | 752 __ CallRuntime(Runtime::kNotifyOSR, 0); |
753 } | 753 } |
754 __ Popad(); | 754 __ Popad(); |
755 __ ret(0); | 755 __ ret(0); |
756 } | 756 } |
757 | 757 |
758 | 758 |
759 void Builtins::Generate_FunctionCall(MacroAssembler* masm) { | 759 void Builtins::Generate_FunctionCall(MacroAssembler* masm) { |
760 // Stack Layout: | 760 // Stack Layout: |
761 // rsp[0]: Return address | 761 // rsp[0] : Return address |
762 // rsp[1]: Argument n | 762 // rsp[8] : Argument n |
763 // rsp[2]: Argument n-1 | 763 // rsp[16] : Argument n-1 |
764 // ... | 764 // ... |
765 // rsp[n]: Argument 1 | 765 // rsp[8 * n] : Argument 1 |
766 // rsp[n+1]: Receiver (function to call) | 766 // rsp[8 * (n + 1)] : Receiver (function to call) |
767 // | 767 // |
768 // rax contains the number of arguments, n, not counting the receiver. | 768 // rax contains the number of arguments, n, not counting the receiver. |
769 // | 769 // |
770 // 1. Make sure we have at least one argument. | 770 // 1. Make sure we have at least one argument. |
771 { Label done; | 771 { Label done; |
772 __ testq(rax, rax); | 772 __ testq(rax, rax); |
773 __ j(not_zero, &done); | 773 __ j(not_zero, &done); |
774 __ pop(rbx); | 774 __ pop(rbx); |
775 __ Push(masm->isolate()->factory()->undefined_value()); | 775 __ Push(masm->isolate()->factory()->undefined_value()); |
776 __ push(rbx); | 776 __ push(rbx); |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
924 RelocInfo::CODE_TARGET); | 924 RelocInfo::CODE_TARGET); |
925 | 925 |
926 ParameterCount expected(0); | 926 ParameterCount expected(0); |
927 __ InvokeCode(rdx, expected, expected, JUMP_FUNCTION, | 927 __ InvokeCode(rdx, expected, expected, JUMP_FUNCTION, |
928 NullCallWrapper(), CALL_AS_METHOD); | 928 NullCallWrapper(), CALL_AS_METHOD); |
929 } | 929 } |
930 | 930 |
931 | 931 |
932 void Builtins::Generate_FunctionApply(MacroAssembler* masm) { | 932 void Builtins::Generate_FunctionApply(MacroAssembler* masm) { |
933 // Stack at entry: | 933 // Stack at entry: |
934 // rsp: return address | 934 // rsp : return address |
935 // rsp+8: arguments | 935 // rsp[8] : arguments |
936 // rsp+16: receiver ("this") | 936 // rsp[16] : receiver ("this") |
937 // rsp+24: function | 937 // rsp[24] : function |
938 { | 938 { |
939 FrameScope frame_scope(masm, StackFrame::INTERNAL); | 939 FrameScope frame_scope(masm, StackFrame::INTERNAL); |
940 // Stack frame: | 940 // Stack frame: |
941 // rbp: Old base pointer | 941 // rbp : Old base pointer |
942 // rbp[1]: return address | 942 // rbp[8] : return address |
943 // rbp[2]: function arguments | 943 // rbp[16] : function arguments |
944 // rbp[3]: receiver | 944 // rbp[24] : receiver |
945 // rbp[4]: function | 945 // rbp[32] : function |
946 static const int kArgumentsOffset = 2 * kPointerSize; | 946 static const int kArgumentsOffset = 2 * kPointerSize; |
947 static const int kReceiverOffset = 3 * kPointerSize; | 947 static const int kReceiverOffset = 3 * kPointerSize; |
948 static const int kFunctionOffset = 4 * kPointerSize; | 948 static const int kFunctionOffset = 4 * kPointerSize; |
949 | 949 |
950 __ push(Operand(rbp, kFunctionOffset)); | 950 __ push(Operand(rbp, kFunctionOffset)); |
951 __ push(Operand(rbp, kArgumentsOffset)); | 951 __ push(Operand(rbp, kArgumentsOffset)); |
952 __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_FUNCTION); | 952 __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_FUNCTION); |
953 | 953 |
954 // Check the stack for overflow. We are not trying to catch | 954 // Check the stack for overflow. We are not trying to catch |
955 // interruptions (e.g. debug break and preemption) here, so the "real stack | 955 // interruptions (e.g. debug break and preemption) here, so the "real stack |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1090 RelocInfo::CODE_TARGET); | 1090 RelocInfo::CODE_TARGET); |
1091 | 1091 |
1092 // Leave internal frame. | 1092 // Leave internal frame. |
1093 } | 1093 } |
1094 __ ret(3 * kPointerSize); // remove this, receiver, and arguments | 1094 __ ret(3 * kPointerSize); // remove this, receiver, and arguments |
1095 } | 1095 } |
1096 | 1096 |
1097 | 1097 |
1098 void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) { | 1098 void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) { |
1099 // ----------- S t a t e ------------- | 1099 // ----------- S t a t e ------------- |
1100 // -- rax : argc | 1100 // -- rax : argc |
1101 // -- rsp[0] : return address | 1101 // -- rsp[0] : return address |
1102 // -- rsp[8] : last argument | 1102 // -- rsp[8] : last argument |
1103 // ----------------------------------- | 1103 // ----------------------------------- |
1104 Label generic_array_code; | 1104 Label generic_array_code; |
1105 | 1105 |
1106 // Get the InternalArray function. | 1106 // Get the InternalArray function. |
1107 __ LoadGlobalFunction(Context::INTERNAL_ARRAY_FUNCTION_INDEX, rdi); | 1107 __ LoadGlobalFunction(Context::INTERNAL_ARRAY_FUNCTION_INDEX, rdi); |
1108 | 1108 |
1109 if (FLAG_debug_code) { | 1109 if (FLAG_debug_code) { |
1110 // Initial map for the builtin InternalArray functions should be maps. | 1110 // Initial map for the builtin InternalArray functions should be maps. |
1111 __ movq(rbx, FieldOperand(rdi, JSFunction::kPrototypeOrInitialMapOffset)); | 1111 __ movq(rbx, FieldOperand(rdi, JSFunction::kPrototypeOrInitialMapOffset)); |
1112 // Will both indicate a NULL and a Smi. | 1112 // Will both indicate a NULL and a Smi. |
1113 STATIC_ASSERT(kSmiTag == 0); | 1113 STATIC_ASSERT(kSmiTag == 0); |
1114 Condition not_smi = NegateCondition(masm->CheckSmi(rbx)); | 1114 Condition not_smi = NegateCondition(masm->CheckSmi(rbx)); |
1115 __ Check(not_smi, "Unexpected initial map for InternalArray function"); | 1115 __ Check(not_smi, "Unexpected initial map for InternalArray function"); |
1116 __ CmpObjectType(rbx, MAP_TYPE, rcx); | 1116 __ CmpObjectType(rbx, MAP_TYPE, rcx); |
1117 __ Check(equal, "Unexpected initial map for InternalArray function"); | 1117 __ Check(equal, "Unexpected initial map for InternalArray function"); |
1118 } | 1118 } |
1119 | 1119 |
1120 // Run the native code for the InternalArray function called as a normal | 1120 // Run the native code for the InternalArray function called as a normal |
1121 // function. | 1121 // function. |
1122 // tail call a stub | 1122 // tail call a stub |
1123 InternalArrayConstructorStub stub(masm->isolate()); | 1123 InternalArrayConstructorStub stub(masm->isolate()); |
1124 __ TailCallStub(&stub); | 1124 __ TailCallStub(&stub); |
1125 } | 1125 } |
1126 | 1126 |
1127 | 1127 |
1128 void Builtins::Generate_ArrayCode(MacroAssembler* masm) { | 1128 void Builtins::Generate_ArrayCode(MacroAssembler* masm) { |
1129 // ----------- S t a t e ------------- | 1129 // ----------- S t a t e ------------- |
1130 // -- rax : argc | 1130 // -- rax : argc |
1131 // -- rsp[0] : return address | 1131 // -- rsp[0] : return address |
1132 // -- rsp[8] : last argument | 1132 // -- rsp[8] : last argument |
1133 // ----------------------------------- | 1133 // ----------------------------------- |
1134 Label generic_array_code; | 1134 Label generic_array_code; |
1135 | 1135 |
1136 // Get the Array function. | 1136 // Get the Array function. |
1137 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, rdi); | 1137 __ LoadGlobalFunction(Context::ARRAY_FUNCTION_INDEX, rdi); |
1138 | 1138 |
1139 if (FLAG_debug_code) { | 1139 if (FLAG_debug_code) { |
1140 // Initial map for the builtin Array functions should be maps. | 1140 // Initial map for the builtin Array functions should be maps. |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1434 Deoptimizer::EntryGenerator generator(masm, Deoptimizer::OSR); | 1434 Deoptimizer::EntryGenerator generator(masm, Deoptimizer::OSR); |
1435 generator.Generate(); | 1435 generator.Generate(); |
1436 } | 1436 } |
1437 | 1437 |
1438 | 1438 |
1439 #undef __ | 1439 #undef __ |
1440 | 1440 |
1441 } } // namespace v8::internal | 1441 } } // namespace v8::internal |
1442 | 1442 |
1443 #endif // V8_TARGET_ARCH_X64 | 1443 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |