| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 #include "src/interpreter/interpreter.h" | 5 #include "src/interpreter/interpreter.h" |
| 6 | 6 |
| 7 #include <fstream> | 7 #include <fstream> |
| 8 | 8 |
| 9 #include "src/ast/prettyprinter.h" | 9 #include "src/ast/prettyprinter.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 // operations, instead of calling builtins directly. | 700 // operations, instead of calling builtins directly. |
| 701 Node* reg_index = __ BytecodeOperandReg(0); | 701 Node* reg_index = __ BytecodeOperandReg(0); |
| 702 Node* lhs = __ LoadRegister(reg_index); | 702 Node* lhs = __ LoadRegister(reg_index); |
| 703 Node* rhs = __ GetAccumulator(); | 703 Node* rhs = __ GetAccumulator(); |
| 704 Node* context = __ GetContext(); | 704 Node* context = __ GetContext(); |
| 705 Node* result = __ CallRuntime(function_id, context, lhs, rhs); | 705 Node* result = __ CallRuntime(function_id, context, lhs, rhs); |
| 706 __ SetAccumulator(result); | 706 __ SetAccumulator(result); |
| 707 __ Dispatch(); | 707 __ Dispatch(); |
| 708 } | 708 } |
| 709 | 709 |
| 710 template <class Generator> |
| 711 void Interpreter::DoBinaryOp(InterpreterAssembler* assembler) { |
| 712 Node* reg_index = __ BytecodeOperandReg(0); |
| 713 Node* lhs = __ LoadRegister(reg_index); |
| 714 Node* rhs = __ GetAccumulator(); |
| 715 Node* context = __ GetContext(); |
| 716 Node* result = Generator::Generate(assembler, lhs, rhs, context); |
| 717 __ SetAccumulator(result); |
| 718 __ Dispatch(); |
| 719 } |
| 710 | 720 |
| 711 // Add <src> | 721 // Add <src> |
| 712 // | 722 // |
| 713 // Add register <src> to accumulator. | 723 // Add register <src> to accumulator. |
| 714 void Interpreter::DoAdd(InterpreterAssembler* assembler) { | 724 void Interpreter::DoAdd(InterpreterAssembler* assembler) { |
| 715 DoBinaryOp(CodeFactory::Add(isolate_), assembler); | 725 DoBinaryOp<AddStub>(assembler); |
| 716 } | 726 } |
| 717 | 727 |
| 718 | 728 |
| 719 // Sub <src> | 729 // Sub <src> |
| 720 // | 730 // |
| 721 // Subtract register <src> from accumulator. | 731 // Subtract register <src> from accumulator. |
| 722 void Interpreter::DoSub(InterpreterAssembler* assembler) { | 732 void Interpreter::DoSub(InterpreterAssembler* assembler) { |
| 723 DoBinaryOp(CodeFactory::Subtract(isolate_), assembler); | 733 DoBinaryOp<SubtractStub>(assembler); |
| 724 } | 734 } |
| 725 | 735 |
| 726 | 736 |
| 727 // Mul <src> | 737 // Mul <src> |
| 728 // | 738 // |
| 729 // Multiply accumulator by register <src>. | 739 // Multiply accumulator by register <src>. |
| 730 void Interpreter::DoMul(InterpreterAssembler* assembler) { | 740 void Interpreter::DoMul(InterpreterAssembler* assembler) { |
| 731 DoBinaryOp(CodeFactory::Multiply(isolate_), assembler); | 741 DoBinaryOp<MultiplyStub>(assembler); |
| 732 } | 742 } |
| 733 | 743 |
| 734 | 744 |
| 735 // Div <src> | 745 // Div <src> |
| 736 // | 746 // |
| 737 // Divide register <src> by accumulator. | 747 // Divide register <src> by accumulator. |
| 738 void Interpreter::DoDiv(InterpreterAssembler* assembler) { | 748 void Interpreter::DoDiv(InterpreterAssembler* assembler) { |
| 739 DoBinaryOp(CodeFactory::Divide(isolate_), assembler); | 749 DoBinaryOp<DivideStub>(assembler); |
| 740 } | 750 } |
| 741 | 751 |
| 742 | 752 |
| 743 // Mod <src> | 753 // Mod <src> |
| 744 // | 754 // |
| 745 // Modulo register <src> by accumulator. | 755 // Modulo register <src> by accumulator. |
| 746 void Interpreter::DoMod(InterpreterAssembler* assembler) { | 756 void Interpreter::DoMod(InterpreterAssembler* assembler) { |
| 747 DoBinaryOp(CodeFactory::Modulus(isolate_), assembler); | 757 DoBinaryOp<ModulusStub>(assembler); |
| 748 } | 758 } |
| 749 | 759 |
| 750 | 760 |
| 751 // BitwiseOr <src> | 761 // BitwiseOr <src> |
| 752 // | 762 // |
| 753 // BitwiseOr register <src> to accumulator. | 763 // BitwiseOr register <src> to accumulator. |
| 754 void Interpreter::DoBitwiseOr(InterpreterAssembler* assembler) { | 764 void Interpreter::DoBitwiseOr(InterpreterAssembler* assembler) { |
| 755 DoBinaryOp(CodeFactory::BitwiseOr(isolate_), assembler); | 765 DoBinaryOp<BitwiseOrStub>(assembler); |
| 756 } | 766 } |
| 757 | 767 |
| 758 | 768 |
| 759 // BitwiseXor <src> | 769 // BitwiseXor <src> |
| 760 // | 770 // |
| 761 // BitwiseXor register <src> to accumulator. | 771 // BitwiseXor register <src> to accumulator. |
| 762 void Interpreter::DoBitwiseXor(InterpreterAssembler* assembler) { | 772 void Interpreter::DoBitwiseXor(InterpreterAssembler* assembler) { |
| 763 DoBinaryOp(CodeFactory::BitwiseXor(isolate_), assembler); | 773 DoBinaryOp<BitwiseXorStub>(assembler); |
| 764 } | 774 } |
| 765 | 775 |
| 766 | 776 |
| 767 // BitwiseAnd <src> | 777 // BitwiseAnd <src> |
| 768 // | 778 // |
| 769 // BitwiseAnd register <src> to accumulator. | 779 // BitwiseAnd register <src> to accumulator. |
| 770 void Interpreter::DoBitwiseAnd(InterpreterAssembler* assembler) { | 780 void Interpreter::DoBitwiseAnd(InterpreterAssembler* assembler) { |
| 771 DoBinaryOp(CodeFactory::BitwiseAnd(isolate_), assembler); | 781 DoBinaryOp<BitwiseAndStub>(assembler); |
| 772 } | 782 } |
| 773 | 783 |
| 774 | 784 |
| 775 // ShiftLeft <src> | 785 // ShiftLeft <src> |
| 776 // | 786 // |
| 777 // Left shifts register <src> by the count specified in the accumulator. | 787 // Left shifts register <src> by the count specified in the accumulator. |
| 778 // Register <src> is converted to an int32 and the accumulator to uint32 | 788 // Register <src> is converted to an int32 and the accumulator to uint32 |
| 779 // before the operation. 5 lsb bits from the accumulator are used as count | 789 // before the operation. 5 lsb bits from the accumulator are used as count |
| 780 // i.e. <src> << (accumulator & 0x1F). | 790 // i.e. <src> << (accumulator & 0x1F). |
| 781 void Interpreter::DoShiftLeft(InterpreterAssembler* assembler) { | 791 void Interpreter::DoShiftLeft(InterpreterAssembler* assembler) { |
| 782 DoBinaryOp(CodeFactory::ShiftLeft(isolate_), assembler); | 792 DoBinaryOp<ShiftLeftStub>(assembler); |
| 783 } | 793 } |
| 784 | 794 |
| 785 | 795 |
| 786 // ShiftRight <src> | 796 // ShiftRight <src> |
| 787 // | 797 // |
| 788 // Right shifts register <src> by the count specified in the accumulator. | 798 // Right shifts register <src> by the count specified in the accumulator. |
| 789 // Result is sign extended. Register <src> is converted to an int32 and the | 799 // Result is sign extended. Register <src> is converted to an int32 and the |
| 790 // accumulator to uint32 before the operation. 5 lsb bits from the accumulator | 800 // accumulator to uint32 before the operation. 5 lsb bits from the accumulator |
| 791 // are used as count i.e. <src> >> (accumulator & 0x1F). | 801 // are used as count i.e. <src> >> (accumulator & 0x1F). |
| 792 void Interpreter::DoShiftRight(InterpreterAssembler* assembler) { | 802 void Interpreter::DoShiftRight(InterpreterAssembler* assembler) { |
| 793 DoBinaryOp(CodeFactory::ShiftRight(isolate_), assembler); | 803 DoBinaryOp<ShiftRightStub>(assembler); |
| 794 } | 804 } |
| 795 | 805 |
| 796 | 806 |
| 797 // ShiftRightLogical <src> | 807 // ShiftRightLogical <src> |
| 798 // | 808 // |
| 799 // Right Shifts register <src> by the count specified in the accumulator. | 809 // Right Shifts register <src> by the count specified in the accumulator. |
| 800 // Result is zero-filled. The accumulator and register <src> are converted to | 810 // Result is zero-filled. The accumulator and register <src> are converted to |
| 801 // uint32 before the operation 5 lsb bits from the accumulator are used as | 811 // uint32 before the operation 5 lsb bits from the accumulator are used as |
| 802 // count i.e. <src> << (accumulator & 0x1F). | 812 // count i.e. <src> << (accumulator & 0x1F). |
| 803 void Interpreter::DoShiftRightLogical(InterpreterAssembler* assembler) { | 813 void Interpreter::DoShiftRightLogical(InterpreterAssembler* assembler) { |
| 804 DoBinaryOp(CodeFactory::ShiftRightLogical(isolate_), assembler); | 814 DoBinaryOp<ShiftRightLogicalStub>(assembler); |
| 805 } | 815 } |
| 806 | 816 |
| 807 void Interpreter::DoCountOp(Runtime::FunctionId function_id, | 817 void Interpreter::DoCountOp(Runtime::FunctionId function_id, |
| 808 InterpreterAssembler* assembler) { | 818 InterpreterAssembler* assembler) { |
| 809 Node* value = __ GetAccumulator(); | 819 Node* value = __ GetAccumulator(); |
| 810 Node* one = __ NumberConstant(1); | 820 Node* one = __ NumberConstant(1); |
| 811 Node* context = __ GetContext(); | 821 Node* context = __ GetContext(); |
| 812 Node* result = __ CallRuntime(function_id, context, value, one); | 822 Node* result = __ CallRuntime(function_id, context, value, one); |
| 813 __ SetAccumulator(result); | 823 __ SetAccumulator(result); |
| 814 __ Dispatch(); | 824 __ Dispatch(); |
| (...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1681 // Illegal | 1691 // Illegal |
| 1682 // | 1692 // |
| 1683 // An invalid bytecode aborting execution if dispatched. | 1693 // An invalid bytecode aborting execution if dispatched. |
| 1684 void Interpreter::DoIllegal(InterpreterAssembler* assembler) { | 1694 void Interpreter::DoIllegal(InterpreterAssembler* assembler) { |
| 1685 __ Abort(kInvalidBytecode); | 1695 __ Abort(kInvalidBytecode); |
| 1686 } | 1696 } |
| 1687 | 1697 |
| 1688 } // namespace interpreter | 1698 } // namespace interpreter |
| 1689 } // namespace internal | 1699 } // namespace internal |
| 1690 } // namespace v8 | 1700 } // namespace v8 |
| OLD | NEW |