Chromium Code Reviews| 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 #include <memory> | 8 #include <memory> |
| 9 | 9 |
| 10 #include "src/ast/prettyprinter.h" | 10 #include "src/ast/prettyprinter.h" |
| (...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 808 // | 808 // |
| 809 // Modulo register <src> by accumulator. | 809 // Modulo register <src> by accumulator. |
| 810 void Interpreter::DoMod(InterpreterAssembler* assembler) { | 810 void Interpreter::DoMod(InterpreterAssembler* assembler) { |
| 811 DoBinaryOpWithFeedback<ModulusWithFeedbackStub>(assembler); | 811 DoBinaryOpWithFeedback<ModulusWithFeedbackStub>(assembler); |
| 812 } | 812 } |
| 813 | 813 |
| 814 // BitwiseOr <src> | 814 // BitwiseOr <src> |
| 815 // | 815 // |
| 816 // BitwiseOr register <src> to accumulator. | 816 // BitwiseOr register <src> to accumulator. |
| 817 void Interpreter::DoBitwiseOr(InterpreterAssembler* assembler) { | 817 void Interpreter::DoBitwiseOr(InterpreterAssembler* assembler) { |
| 818 DoBinaryOp<BitwiseOrStub>(assembler); | 818 typedef InterpreterAssembler::Label Label; |
| 819 typedef InterpreterAssembler::Variable Variable; | |
|
rmcilroy
2016/08/11 13:31:07
Typedefs are unecessary here
epertoso
2016/08/11 14:03:11
Done.
| |
| 820 | |
| 821 Node* reg_index = __ BytecodeOperandReg(0); | |
| 822 Node* lhs = __ LoadRegister(reg_index); | |
| 823 Node* rhs = __ GetAccumulator(); | |
| 824 Node* context = __ GetContext(); | |
| 825 Node* slot_index = __ BytecodeOperandIdx(1); | |
| 826 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | |
| 827 | |
| 828 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), | |
| 829 var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); | |
| 830 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 831 context, lhs, &var_lhs_type_feedback); | |
| 832 Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 833 context, rhs, &var_rhs_type_feedback); | |
| 834 Node* value = __ Word32Or(lhs_value, rhs_value); | |
| 835 Node* result = __ ChangeInt32ToTagged(value); | |
| 836 | |
| 837 Node* result_type = | |
| 838 __ Select(__ WordIsSmi(result), | |
| 839 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | |
| 840 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 841 | |
| 842 if (FLAG_debug_code) { | |
| 843 Label ok(assembler); | |
| 844 __ GotoIf(__ WordIsSmi(result), &ok); | |
| 845 Node* result_map = __ LoadMap(result); | |
| 846 __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), | |
| 847 kExpectedHeapNumber); | |
| 848 __ Bind(&ok); | |
| 849 } | |
| 850 | |
| 851 Node* input_feedback = | |
| 852 __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); | |
| 853 __ UpdateFeedback(__ Word32Or(result_type, input_feedback), | |
| 854 type_feedback_vector, slot_index); | |
| 855 __ SetAccumulator(result); | |
| 856 __ Dispatch(); | |
|
rmcilroy
2016/08/11 13:31:07
Could we share all the code in a single helper whi
epertoso
2016/08/11 14:03:11
Done.
| |
| 819 } | 857 } |
| 820 | 858 |
| 821 // BitwiseXor <src> | 859 // BitwiseXor <src> |
| 822 // | 860 // |
| 823 // BitwiseXor register <src> to accumulator. | 861 // BitwiseXor register <src> to accumulator. |
| 824 void Interpreter::DoBitwiseXor(InterpreterAssembler* assembler) { | 862 void Interpreter::DoBitwiseXor(InterpreterAssembler* assembler) { |
| 825 DoBinaryOp<BitwiseXorStub>(assembler); | 863 typedef InterpreterAssembler::Label Label; |
| 864 typedef InterpreterAssembler::Variable Variable; | |
| 865 | |
| 866 Node* reg_index = __ BytecodeOperandReg(0); | |
| 867 Node* lhs = __ LoadRegister(reg_index); | |
| 868 Node* rhs = __ GetAccumulator(); | |
| 869 Node* context = __ GetContext(); | |
| 870 Node* slot_index = __ BytecodeOperandIdx(1); | |
| 871 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | |
| 872 | |
| 873 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), | |
| 874 var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); | |
| 875 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 876 context, lhs, &var_lhs_type_feedback); | |
| 877 Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 878 context, rhs, &var_rhs_type_feedback); | |
| 879 Node* value = __ Word32Xor(lhs_value, rhs_value); | |
| 880 Node* result = __ ChangeInt32ToTagged(value); | |
| 881 | |
| 882 Node* result_type = | |
| 883 __ Select(__ WordIsSmi(result), | |
| 884 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | |
| 885 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 886 | |
| 887 if (FLAG_debug_code) { | |
| 888 Label ok(assembler); | |
| 889 __ GotoIf(__ WordIsSmi(result), &ok); | |
| 890 Node* result_map = __ LoadMap(result); | |
| 891 __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), | |
| 892 kExpectedHeapNumber); | |
| 893 __ Bind(&ok); | |
| 894 } | |
| 895 | |
| 896 Node* input_feedback = | |
| 897 __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); | |
| 898 __ UpdateFeedback(__ Word32Or(result_type, input_feedback), | |
| 899 type_feedback_vector, slot_index); | |
| 900 __ SetAccumulator(result); | |
| 901 __ Dispatch(); | |
| 826 } | 902 } |
| 827 | 903 |
| 828 // BitwiseAnd <src> | 904 // BitwiseAnd <src> |
| 829 // | 905 // |
| 830 // BitwiseAnd register <src> to accumulator. | 906 // BitwiseAnd register <src> to accumulator. |
| 831 void Interpreter::DoBitwiseAnd(InterpreterAssembler* assembler) { | 907 void Interpreter::DoBitwiseAnd(InterpreterAssembler* assembler) { |
| 832 DoBinaryOp<BitwiseAndStub>(assembler); | 908 typedef InterpreterAssembler::Label Label; |
| 909 typedef InterpreterAssembler::Variable Variable; | |
| 910 | |
| 911 Node* reg_index = __ BytecodeOperandReg(0); | |
| 912 Node* lhs = __ LoadRegister(reg_index); | |
| 913 Node* rhs = __ GetAccumulator(); | |
| 914 Node* context = __ GetContext(); | |
| 915 Node* slot_index = __ BytecodeOperandIdx(1); | |
| 916 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | |
| 917 | |
| 918 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), | |
| 919 var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); | |
| 920 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 921 context, lhs, &var_lhs_type_feedback); | |
| 922 Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 923 context, rhs, &var_rhs_type_feedback); | |
| 924 Node* value = __ Word32And(lhs_value, rhs_value); | |
| 925 Node* result = __ ChangeInt32ToTagged(value); | |
| 926 | |
| 927 Node* result_type = | |
| 928 __ Select(__ WordIsSmi(result), | |
| 929 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | |
| 930 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 931 | |
| 932 if (FLAG_debug_code) { | |
| 933 Label ok(assembler); | |
| 934 __ GotoIf(__ WordIsSmi(result), &ok); | |
| 935 Node* result_map = __ LoadMap(result); | |
| 936 __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), | |
| 937 kExpectedHeapNumber); | |
| 938 __ Bind(&ok); | |
| 939 } | |
| 940 | |
| 941 Node* input_feedback = | |
| 942 __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); | |
| 943 __ UpdateFeedback(__ Word32Or(result_type, input_feedback), | |
| 944 type_feedback_vector, slot_index); | |
| 945 __ SetAccumulator(result); | |
| 946 __ Dispatch(); | |
| 833 } | 947 } |
| 834 | 948 |
| 835 // ShiftLeft <src> | 949 // ShiftLeft <src> |
| 836 // | 950 // |
| 837 // Left shifts register <src> by the count specified in the accumulator. | 951 // Left shifts register <src> by the count specified in the accumulator. |
| 838 // Register <src> is converted to an int32 and the accumulator to uint32 | 952 // Register <src> is converted to an int32 and the accumulator to uint32 |
| 839 // before the operation. 5 lsb bits from the accumulator are used as count | 953 // before the operation. 5 lsb bits from the accumulator are used as count |
| 840 // i.e. <src> << (accumulator & 0x1F). | 954 // i.e. <src> << (accumulator & 0x1F). |
| 841 void Interpreter::DoShiftLeft(InterpreterAssembler* assembler) { | 955 void Interpreter::DoShiftLeft(InterpreterAssembler* assembler) { |
| 842 DoBinaryOp<ShiftLeftStub>(assembler); | 956 typedef InterpreterAssembler::Variable Variable; |
| 957 | |
| 958 Node* reg_index = __ BytecodeOperandReg(0); | |
| 959 Node* lhs = __ LoadRegister(reg_index); | |
| 960 Node* rhs = __ GetAccumulator(); | |
| 961 Node* context = __ GetContext(); | |
| 962 Node* slot_index = __ BytecodeOperandIdx(1); | |
| 963 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | |
| 964 | |
| 965 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), | |
| 966 var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); | |
| 967 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 968 context, lhs, &var_lhs_type_feedback); | |
| 969 Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 970 context, rhs, &var_rhs_type_feedback); | |
| 971 Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f)); | |
| 972 Node* value = __ Word32Shl(lhs_value, shift_count); | |
| 973 Node* result = __ ChangeInt32ToTagged(value); | |
| 974 | |
| 975 Node* result_type = | |
| 976 __ Select(__ WordIsSmi(result), | |
| 977 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | |
| 978 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 979 | |
| 980 if (FLAG_debug_code) { | |
| 981 InterpreterAssembler::Label ok(assembler); | |
| 982 __ GotoIf(__ WordIsSmi(result), &ok); | |
| 983 Node* result_map = __ LoadMap(result); | |
| 984 __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), | |
| 985 kExpectedHeapNumber); | |
| 986 __ Bind(&ok); | |
| 987 } | |
| 988 | |
| 989 Node* input_feedback = | |
| 990 __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); | |
| 991 __ UpdateFeedback(__ Word32Or(result_type, input_feedback), | |
| 992 type_feedback_vector, slot_index); | |
| 993 __ SetAccumulator(result); | |
| 994 __ Dispatch(); | |
| 843 } | 995 } |
| 844 | 996 |
| 845 // ShiftRight <src> | 997 // ShiftRight <src> |
| 846 // | 998 // |
| 847 // Right shifts register <src> by the count specified in the accumulator. | 999 // Right shifts register <src> by the count specified in the accumulator. |
| 848 // Result is sign extended. Register <src> is converted to an int32 and the | 1000 // Result is sign extended. Register <src> is converted to an int32 and the |
| 849 // accumulator to uint32 before the operation. 5 lsb bits from the accumulator | 1001 // accumulator to uint32 before the operation. 5 lsb bits from the accumulator |
| 850 // are used as count i.e. <src> >> (accumulator & 0x1F). | 1002 // are used as count i.e. <src> >> (accumulator & 0x1F). |
| 851 void Interpreter::DoShiftRight(InterpreterAssembler* assembler) { | 1003 void Interpreter::DoShiftRight(InterpreterAssembler* assembler) { |
| 852 DoBinaryOp<ShiftRightStub>(assembler); | 1004 typedef InterpreterAssembler::Variable Variable; |
| 1005 | |
| 1006 Node* reg_index = __ BytecodeOperandReg(0); | |
| 1007 Node* lhs = __ LoadRegister(reg_index); | |
| 1008 Node* rhs = __ GetAccumulator(); | |
| 1009 Node* context = __ GetContext(); | |
| 1010 Node* slot_index = __ BytecodeOperandIdx(1); | |
| 1011 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | |
| 1012 | |
| 1013 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), | |
| 1014 var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); | |
| 1015 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 1016 context, lhs, &var_lhs_type_feedback); | |
| 1017 Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 1018 context, rhs, &var_rhs_type_feedback); | |
| 1019 Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f)); | |
| 1020 Node* value = __ Word32Sar(lhs_value, shift_count); | |
| 1021 Node* result = __ ChangeInt32ToTagged(value); | |
| 1022 | |
| 1023 Node* result_type = | |
| 1024 __ Select(__ WordIsSmi(result), | |
| 1025 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | |
| 1026 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 1027 | |
| 1028 if (FLAG_debug_code) { | |
| 1029 InterpreterAssembler::Label ok(assembler); | |
| 1030 __ GotoIf(__ WordIsSmi(result), &ok); | |
| 1031 Node* result_map = __ LoadMap(result); | |
| 1032 __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), | |
| 1033 kExpectedHeapNumber); | |
| 1034 __ Bind(&ok); | |
| 1035 } | |
| 1036 | |
| 1037 Node* input_feedback = | |
| 1038 __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); | |
| 1039 __ UpdateFeedback(__ Word32Or(result_type, input_feedback), | |
| 1040 type_feedback_vector, slot_index); | |
| 1041 __ SetAccumulator(result); | |
| 1042 __ Dispatch(); | |
| 853 } | 1043 } |
| 854 | 1044 |
| 855 // ShiftRightLogical <src> | 1045 // ShiftRightLogical <src> |
| 856 // | 1046 // |
| 857 // Right Shifts register <src> by the count specified in the accumulator. | 1047 // Right Shifts register <src> by the count specified in the accumulator. |
| 858 // Result is zero-filled. The accumulator and register <src> are converted to | 1048 // Result is zero-filled. The accumulator and register <src> are converted to |
| 859 // uint32 before the operation 5 lsb bits from the accumulator are used as | 1049 // uint32 before the operation 5 lsb bits from the accumulator are used as |
| 860 // count i.e. <src> << (accumulator & 0x1F). | 1050 // count i.e. <src> << (accumulator & 0x1F). |
| 861 void Interpreter::DoShiftRightLogical(InterpreterAssembler* assembler) { | 1051 void Interpreter::DoShiftRightLogical(InterpreterAssembler* assembler) { |
| 862 DoBinaryOp<ShiftRightLogicalStub>(assembler); | 1052 typedef InterpreterAssembler::Variable Variable; |
| 1053 | |
| 1054 Node* reg_index = __ BytecodeOperandReg(0); | |
| 1055 Node* lhs = __ LoadRegister(reg_index); | |
| 1056 Node* rhs = __ GetAccumulator(); | |
| 1057 Node* context = __ GetContext(); | |
| 1058 Node* slot_index = __ BytecodeOperandIdx(1); | |
| 1059 Node* type_feedback_vector = __ LoadTypeFeedbackVector(); | |
| 1060 | |
| 1061 Variable var_lhs_type_feedback(assembler, MachineRepresentation::kWord32), | |
| 1062 var_rhs_type_feedback(assembler, MachineRepresentation::kWord32); | |
| 1063 Node* lhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 1064 context, lhs, &var_lhs_type_feedback); | |
| 1065 Node* rhs_value = __ TruncateTaggedToWord32WithFeedback( | |
| 1066 context, rhs, &var_rhs_type_feedback); | |
| 1067 Node* shift_count = __ Word32And(rhs_value, __ Int32Constant(0x1f)); | |
| 1068 Node* value = __ Word32Shr(lhs_value, shift_count); | |
| 1069 Node* result = __ ChangeUint32ToTagged(value); | |
| 1070 | |
| 1071 Node* result_type = | |
| 1072 __ Select(__ WordIsSmi(result), | |
| 1073 __ Int32Constant(BinaryOperationFeedback::kSignedSmall), | |
| 1074 __ Int32Constant(BinaryOperationFeedback::kNumber)); | |
| 1075 | |
| 1076 if (FLAG_debug_code) { | |
| 1077 InterpreterAssembler::Label ok(assembler); | |
| 1078 __ GotoIf(__ WordIsSmi(result), &ok); | |
| 1079 Node* result_map = __ LoadMap(result); | |
| 1080 __ AbortIfWordNotEqual(result_map, __ HeapNumberMapConstant(), | |
| 1081 kExpectedHeapNumber); | |
| 1082 __ Bind(&ok); | |
| 1083 } | |
| 1084 | |
| 1085 Node* input_feedback = | |
| 1086 __ Word32Or(var_lhs_type_feedback.value(), var_rhs_type_feedback.value()); | |
| 1087 __ UpdateFeedback(__ Word32Or(result_type, input_feedback), | |
| 1088 type_feedback_vector, slot_index); | |
| 1089 __ SetAccumulator(result); | |
| 1090 __ Dispatch(); | |
| 863 } | 1091 } |
| 864 | 1092 |
| 865 // AddSmi <imm> <reg> | 1093 // AddSmi <imm> <reg> |
| 866 // | 1094 // |
| 867 // Adds an immediate value <imm> to register <reg>. For this | 1095 // Adds an immediate value <imm> to register <reg>. For this |
| 868 // operation <reg> is the lhs operand and <imm> is the <rhs> operand. | 1096 // operation <reg> is the lhs operand and <imm> is the <rhs> operand. |
| 869 void Interpreter::DoAddSmi(InterpreterAssembler* assembler) { | 1097 void Interpreter::DoAddSmi(InterpreterAssembler* assembler) { |
| 870 Variable var_result(assembler, MachineRepresentation::kTagged); | 1098 Variable var_result(assembler, MachineRepresentation::kTagged); |
| 871 Label fastpath(assembler), slowpath(assembler, Label::kDeferred), | 1099 Label fastpath(assembler), slowpath(assembler, Label::kDeferred), |
| 872 end(assembler); | 1100 end(assembler); |
| (...skipping 1290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2163 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, | 2391 __ StoreObjectField(generator, JSGeneratorObject::kContinuationOffset, |
| 2164 __ SmiTag(new_state)); | 2392 __ SmiTag(new_state)); |
| 2165 __ SetAccumulator(old_state); | 2393 __ SetAccumulator(old_state); |
| 2166 | 2394 |
| 2167 __ Dispatch(); | 2395 __ Dispatch(); |
| 2168 } | 2396 } |
| 2169 | 2397 |
| 2170 } // namespace interpreter | 2398 } // namespace interpreter |
| 2171 } // namespace internal | 2399 } // namespace internal |
| 2172 } // namespace v8 | 2400 } // namespace v8 |
| OLD | NEW |