OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #if V8_TARGET_ARCH_X64 | 5 #if V8_TARGET_ARCH_X64 |
6 | 6 |
7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/codegen.h" | 8 #include "src/codegen.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/full-codegen/full-codegen.h" | 10 #include "src/full-codegen/full-codegen.h" |
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 } | 572 } |
573 | 573 |
574 | 574 |
575 // Generate code for entering a JS function with the interpreter. | 575 // Generate code for entering a JS function with the interpreter. |
576 // On entry to the function the receiver and arguments have been pushed on the | 576 // On entry to the function the receiver and arguments have been pushed on the |
577 // stack left to right. The actual argument count matches the formal parameter | 577 // stack left to right. The actual argument count matches the formal parameter |
578 // count expected by the function. | 578 // count expected by the function. |
579 // | 579 // |
580 // The live registers are: | 580 // The live registers are: |
581 // o rdi: the JS function object being called | 581 // o rdi: the JS function object being called |
| 582 // o rdx: the new target |
582 // o rsi: our context | 583 // o rsi: our context |
583 // o rbp: the caller's frame pointer | 584 // o rbp: the caller's frame pointer |
584 // o rsp: stack pointer (pointing to return address) | 585 // o rsp: stack pointer (pointing to return address) |
585 // | 586 // |
586 // The function builds a JS frame. Please see JavaScriptFrameConstants in | 587 // The function builds a JS frame. Please see JavaScriptFrameConstants in |
587 // frames-x64.h for its layout. | 588 // frames-x64.h for its layout. |
588 // TODO(rmcilroy): We will need to include the current bytecode pointer in the | 589 // TODO(rmcilroy): We will need to include the current bytecode pointer in the |
589 // frame. | 590 // frame. |
590 void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { | 591 void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
591 // Open a frame scope to indicate that there is a frame on the stack. The | 592 // Open a frame scope to indicate that there is a frame on the stack. The |
592 // MANUAL indicates that the scope shouldn't actually generate code to set up | 593 // MANUAL indicates that the scope shouldn't actually generate code to set up |
593 // the frame (that is done below). | 594 // the frame (that is done below). |
594 FrameScope frame_scope(masm, StackFrame::MANUAL); | 595 FrameScope frame_scope(masm, StackFrame::MANUAL); |
595 __ pushq(rbp); // Caller's frame pointer. | 596 __ pushq(rbp); // Caller's frame pointer. |
596 __ movp(rbp, rsp); | 597 __ movp(rbp, rsp); |
597 __ Push(rsi); // Callee's context. | 598 __ Push(rsi); // Callee's context. |
598 __ Push(rdi); // Callee's JS function. | 599 __ Push(rdi); // Callee's JS function. |
| 600 __ Push(rdx); // Callee's new target. |
599 | 601 |
600 // Get the bytecode array from the function object and load the pointer to the | 602 // Get the bytecode array from the function object and load the pointer to the |
601 // first entry into edi (InterpreterBytecodeRegister). | 603 // first entry into edi (InterpreterBytecodeRegister). |
602 __ movp(rax, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); | 604 __ movp(rax, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); |
603 __ movp(kInterpreterBytecodeArrayRegister, | 605 __ movp(kInterpreterBytecodeArrayRegister, |
604 FieldOperand(rax, SharedFunctionInfo::kFunctionDataOffset)); | 606 FieldOperand(rax, SharedFunctionInfo::kFunctionDataOffset)); |
605 | 607 |
606 if (FLAG_debug_code) { | 608 if (FLAG_debug_code) { |
607 // Check function data field is actually a BytecodeArray object. | 609 // Check function data field is actually a BytecodeArray object. |
608 __ AssertNotSmi(kInterpreterBytecodeArrayRegister); | 610 __ AssertNotSmi(kInterpreterBytecodeArrayRegister); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 __ Push(kInterpreterBytecodeArrayRegister); | 657 __ Push(kInterpreterBytecodeArrayRegister); |
656 __ CallRuntime(Runtime::kStackGuard, 0); | 658 __ CallRuntime(Runtime::kStackGuard, 0); |
657 __ Pop(kInterpreterBytecodeArrayRegister); | 659 __ Pop(kInterpreterBytecodeArrayRegister); |
658 __ bind(&ok); | 660 __ bind(&ok); |
659 } | 661 } |
660 | 662 |
661 // Load accumulator, register file, bytecode offset, dispatch table into | 663 // Load accumulator, register file, bytecode offset, dispatch table into |
662 // registers. | 664 // registers. |
663 __ LoadRoot(kInterpreterAccumulatorRegister, Heap::kUndefinedValueRootIndex); | 665 __ LoadRoot(kInterpreterAccumulatorRegister, Heap::kUndefinedValueRootIndex); |
664 __ movp(kInterpreterRegisterFileRegister, rbp); | 666 __ movp(kInterpreterRegisterFileRegister, rbp); |
665 __ subp( | 667 __ subp(kInterpreterRegisterFileRegister, |
666 kInterpreterRegisterFileRegister, | 668 Immediate(2 * kPointerSize + |
667 Immediate(kPointerSize + StandardFrameConstants::kFixedFrameSizeFromFp)); | 669 StandardFrameConstants::kFixedFrameSizeFromFp)); |
668 __ movp(kInterpreterBytecodeOffsetRegister, | 670 __ movp(kInterpreterBytecodeOffsetRegister, |
669 Immediate(BytecodeArray::kHeaderSize - kHeapObjectTag)); | 671 Immediate(BytecodeArray::kHeaderSize - kHeapObjectTag)); |
670 __ LoadRoot(kInterpreterDispatchTableRegister, | 672 __ LoadRoot(kInterpreterDispatchTableRegister, |
671 Heap::kInterpreterTableRootIndex); | 673 Heap::kInterpreterTableRootIndex); |
672 __ addp(kInterpreterDispatchTableRegister, | 674 __ addp(kInterpreterDispatchTableRegister, |
673 Immediate(FixedArray::kHeaderSize - kHeapObjectTag)); | 675 Immediate(FixedArray::kHeaderSize - kHeapObjectTag)); |
674 | 676 |
675 // Dispatch to the first bytecode handler for the function. | 677 // Dispatch to the first bytecode handler for the function. |
676 __ movzxbp(rbx, Operand(kInterpreterBytecodeArrayRegister, | 678 __ movzxbp(rbx, Operand(kInterpreterBytecodeArrayRegister, |
677 kInterpreterBytecodeOffsetRegister, times_1, 0)); | 679 kInterpreterBytecodeOffsetRegister, times_1, 0)); |
(...skipping 1239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1917 __ ret(0); | 1919 __ ret(0); |
1918 } | 1920 } |
1919 | 1921 |
1920 | 1922 |
1921 #undef __ | 1923 #undef __ |
1922 | 1924 |
1923 } // namespace internal | 1925 } // namespace internal |
1924 } // namespace v8 | 1926 } // namespace v8 |
1925 | 1927 |
1926 #endif // V8_TARGET_ARCH_X64 | 1928 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |