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 818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 // ShiftRightLogical <src> | 829 // ShiftRightLogical <src> |
830 // | 830 // |
831 // Right Shifts register <src> by the count specified in the accumulator. | 831 // Right Shifts register <src> by the count specified in the accumulator. |
832 // Result is zero-filled. The accumulator and register <src> are converted to | 832 // Result is zero-filled. The accumulator and register <src> are converted to |
833 // uint32 before the operation 5 lsb bits from the accumulator are used as | 833 // uint32 before the operation 5 lsb bits from the accumulator are used as |
834 // count i.e. <src> << (accumulator & 0x1F). | 834 // count i.e. <src> << (accumulator & 0x1F). |
835 void Interpreter::DoShiftRightLogical(InterpreterAssembler* assembler) { | 835 void Interpreter::DoShiftRightLogical(InterpreterAssembler* assembler) { |
836 DoBinaryOp<ShiftRightLogicalStub>(assembler); | 836 DoBinaryOp<ShiftRightLogicalStub>(assembler); |
837 } | 837 } |
838 | 838 |
| 839 template <class Generator> |
| 840 void Interpreter::DoBinaryOpWithImmediate(InterpreterAssembler* assembler) { |
| 841 Node* reg_index = __ BytecodeOperandReg(1); |
| 842 Node* lhs = __ LoadRegister(reg_index); |
| 843 Node* raw_int = __ BytecodeOperandImm(0); |
| 844 Node* rhs = __ SmiTag(raw_int); |
| 845 Node* context = __ GetContext(); |
| 846 Node* result = Generator::Generate(assembler, lhs, rhs, context); |
| 847 __ SetAccumulator(result); |
| 848 __ Dispatch(); |
| 849 } |
| 850 |
| 851 void Interpreter::DoAddSmi(InterpreterAssembler* assembler) { |
| 852 DoBinaryOpWithImmediate<AddSmiStub>(assembler); |
| 853 } |
| 854 |
| 855 void Interpreter::DoSubSmi(InterpreterAssembler* assembler) { |
| 856 DoBinaryOpWithImmediate<SubtractSmiStub>(assembler); |
| 857 } |
| 858 |
| 859 void Interpreter::DoBitwiseOrSmi(InterpreterAssembler* assembler) { |
| 860 DoBinaryOpWithImmediate<BitwiseOrSmiStub>(assembler); |
| 861 } |
| 862 |
| 863 void Interpreter::DoBitwiseAndSmi(InterpreterAssembler* assembler) { |
| 864 DoBinaryOpWithImmediate<BitwiseAndSmiStub>(assembler); |
| 865 } |
| 866 |
| 867 void Interpreter::DoShiftLeftSmi(InterpreterAssembler* assembler) { |
| 868 DoBinaryOpWithImmediate<ShiftLeftSmiStub>(assembler); |
| 869 } |
| 870 |
| 871 void Interpreter::DoShiftRightSmi(InterpreterAssembler* assembler) { |
| 872 DoBinaryOpWithImmediate<ShiftRightSmiStub>(assembler); |
| 873 } |
| 874 |
839 void Interpreter::DoUnaryOp(Callable callable, | 875 void Interpreter::DoUnaryOp(Callable callable, |
840 InterpreterAssembler* assembler) { | 876 InterpreterAssembler* assembler) { |
841 Node* target = __ HeapConstant(callable.code()); | 877 Node* target = __ HeapConstant(callable.code()); |
842 Node* accumulator = __ GetAccumulator(); | 878 Node* accumulator = __ GetAccumulator(); |
843 Node* context = __ GetContext(); | 879 Node* context = __ GetContext(); |
844 Node* result = | 880 Node* result = |
845 __ CallStub(callable.descriptor(), target, context, accumulator); | 881 __ CallStub(callable.descriptor(), target, context, accumulator); |
846 __ SetAccumulator(result); | 882 __ SetAccumulator(result); |
847 __ Dispatch(); | 883 __ Dispatch(); |
848 } | 884 } |
(...skipping 1007 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1856 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 1892 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
1857 __ SmiTag(new_state)); | 1893 __ SmiTag(new_state)); |
1858 __ SetAccumulator(old_state); | 1894 __ SetAccumulator(old_state); |
1859 | 1895 |
1860 __ Dispatch(); | 1896 __ Dispatch(); |
1861 } | 1897 } |
1862 | 1898 |
1863 } // namespace interpreter | 1899 } // namespace interpreter |
1864 } // namespace internal | 1900 } // namespace internal |
1865 } // namespace v8 | 1901 } // namespace v8 |
OLD | NEW |