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_IA32 | 5 #if V8_TARGET_ARCH_IA32 |
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 690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 // Drop receiver + arguments and return. | 701 // Drop receiver + arguments and return. |
702 __ mov(ebx, FieldOperand(kInterpreterBytecodeArrayRegister, | 702 __ mov(ebx, FieldOperand(kInterpreterBytecodeArrayRegister, |
703 BytecodeArray::kParameterSizeOffset)); | 703 BytecodeArray::kParameterSizeOffset)); |
704 __ pop(ecx); | 704 __ pop(ecx); |
705 __ add(esp, ebx); | 705 __ add(esp, ebx); |
706 __ push(ecx); | 706 __ push(ecx); |
707 __ ret(0); | 707 __ ret(0); |
708 } | 708 } |
709 | 709 |
710 | 710 |
| 711 // static |
| 712 void Builtins::Generate_InterpreterPushArgsAndCall(MacroAssembler* masm) { |
| 713 // ----------- S t a t e ------------- |
| 714 // -- eax : the number of arguments (not including the receiver) |
| 715 // -- ebx : the address of the first argument to be pushed. Subsequent |
| 716 // arguments should be consecutive above this, in the same order as |
| 717 // they are to be pushed onto the stack. |
| 718 // -- edi : the target to call (can be any Object). |
| 719 |
| 720 // Pop return address to allow tail-call after pushing arguments. |
| 721 __ Pop(edx); |
| 722 |
| 723 // Find the address of the last argument. |
| 724 __ mov(ecx, eax); |
| 725 __ add(ecx, Immediate(1)); // Add one for receiver. |
| 726 __ shl(ecx, kPointerSizeLog2); |
| 727 __ neg(ecx); |
| 728 __ add(ecx, ebx); |
| 729 |
| 730 // Push the arguments. |
| 731 Label loop_header, loop_check; |
| 732 __ jmp(&loop_check); |
| 733 __ bind(&loop_header); |
| 734 __ Push(Operand(ebx, 0)); |
| 735 __ sub(ebx, Immediate(kPointerSize)); |
| 736 __ bind(&loop_check); |
| 737 __ cmp(ebx, ecx); |
| 738 __ j(greater, &loop_header, Label::kNear); |
| 739 |
| 740 // Call the target. |
| 741 __ Push(edx); // Re-push return address. |
| 742 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); |
| 743 } |
| 744 |
| 745 |
711 void Builtins::Generate_CompileLazy(MacroAssembler* masm) { | 746 void Builtins::Generate_CompileLazy(MacroAssembler* masm) { |
712 CallRuntimePassFunction(masm, Runtime::kCompileLazy); | 747 CallRuntimePassFunction(masm, Runtime::kCompileLazy); |
713 GenerateTailCallToReturnedCode(masm); | 748 GenerateTailCallToReturnedCode(masm); |
714 } | 749 } |
715 | 750 |
716 | 751 |
717 | 752 |
718 static void CallCompileOptimized(MacroAssembler* masm, bool concurrent) { | 753 static void CallCompileOptimized(MacroAssembler* masm, bool concurrent) { |
719 FrameScope scope(masm, StackFrame::INTERNAL); | 754 FrameScope scope(masm, StackFrame::INTERNAL); |
720 // Push a copy of the function. | 755 // Push a copy of the function. |
(...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1619 // method. | 1654 // method. |
1620 __ bind(&non_constructor); | 1655 __ bind(&non_constructor); |
1621 { | 1656 { |
1622 FrameScope scope(masm, StackFrame::INTERNAL); | 1657 FrameScope scope(masm, StackFrame::INTERNAL); |
1623 __ Push(edi); | 1658 __ Push(edi); |
1624 __ CallRuntime(Runtime::kThrowCalledNonCallable, 1); | 1659 __ CallRuntime(Runtime::kThrowCalledNonCallable, 1); |
1625 } | 1660 } |
1626 } | 1661 } |
1627 | 1662 |
1628 | 1663 |
1629 // static | |
1630 void Builtins::Generate_PushArgsAndCall(MacroAssembler* masm) { | |
1631 // ----------- S t a t e ------------- | |
1632 // -- eax : the number of arguments (not including the receiver) | |
1633 // -- ebx : the address of the first argument to be pushed. Subsequent | |
1634 // arguments should be consecutive above this, in the same order as | |
1635 // they are to be pushed onto the stack. | |
1636 // -- edi : the target to call (can be any Object). | |
1637 | |
1638 // Pop return address to allow tail-call after pushing arguments. | |
1639 __ Pop(edx); | |
1640 | |
1641 // Find the address of the last argument. | |
1642 __ mov(ecx, eax); | |
1643 __ add(ecx, Immediate(1)); // Add one for receiver. | |
1644 __ shl(ecx, kPointerSizeLog2); | |
1645 __ neg(ecx); | |
1646 __ add(ecx, ebx); | |
1647 | |
1648 // Push the arguments. | |
1649 Label loop_header, loop_check; | |
1650 __ jmp(&loop_check); | |
1651 __ bind(&loop_header); | |
1652 __ Push(Operand(ebx, 0)); | |
1653 __ sub(ebx, Immediate(kPointerSize)); | |
1654 __ bind(&loop_check); | |
1655 __ cmp(ebx, ecx); | |
1656 __ j(greater, &loop_header, Label::kNear); | |
1657 | |
1658 // Call the target. | |
1659 __ Push(edx); // Re-push return address. | |
1660 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); | |
1661 } | |
1662 | |
1663 | |
1664 void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { | 1664 void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { |
1665 // ----------- S t a t e ------------- | 1665 // ----------- S t a t e ------------- |
1666 // -- eax : actual number of arguments | 1666 // -- eax : actual number of arguments |
1667 // -- ebx : expected number of arguments | 1667 // -- ebx : expected number of arguments |
1668 // -- edi : function (passed through to callee) | 1668 // -- edi : function (passed through to callee) |
1669 // ----------------------------------- | 1669 // ----------------------------------- |
1670 | 1670 |
1671 Label invoke, dont_adapt_arguments; | 1671 Label invoke, dont_adapt_arguments; |
1672 __ IncrementCounter(masm->isolate()->counters()->arguments_adaptors(), 1); | 1672 __ IncrementCounter(masm->isolate()->counters()->arguments_adaptors(), 1); |
1673 | 1673 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1842 | 1842 |
1843 __ bind(&ok); | 1843 __ bind(&ok); |
1844 __ ret(0); | 1844 __ ret(0); |
1845 } | 1845 } |
1846 | 1846 |
1847 #undef __ | 1847 #undef __ |
1848 } // namespace internal | 1848 } // namespace internal |
1849 } // namespace v8 | 1849 } // namespace v8 |
1850 | 1850 |
1851 #endif // V8_TARGET_ARCH_IA32 | 1851 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |