| 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 #include "src/code-stubs.h" | 5 #include "src/code-stubs.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 821 // static | 821 // static |
| 822 compiler::Node* SubtractWithFeedbackStub::Generate( | 822 compiler::Node* SubtractWithFeedbackStub::Generate( |
| 823 CodeStubAssembler* assembler, compiler::Node* lhs, compiler::Node* rhs, | 823 CodeStubAssembler* assembler, compiler::Node* lhs, compiler::Node* rhs, |
| 824 compiler::Node* slot_id, compiler::Node* type_feedback_vector, | 824 compiler::Node* slot_id, compiler::Node* type_feedback_vector, |
| 825 compiler::Node* context) { | 825 compiler::Node* context) { |
| 826 typedef CodeStubAssembler::Label Label; | 826 typedef CodeStubAssembler::Label Label; |
| 827 typedef compiler::Node Node; | 827 typedef compiler::Node Node; |
| 828 typedef CodeStubAssembler::Variable Variable; | 828 typedef CodeStubAssembler::Variable Variable; |
| 829 | 829 |
| 830 // Shared entry for floating point subtraction. | 830 // Shared entry for floating point subtraction. |
| 831 Label do_fsub(assembler), end(assembler), call_subtract_stub(assembler), | 831 Label do_fsub(assembler), end(assembler), |
| 832 if_lhsisnotnumber(assembler), check_rhsisoddball(assembler), | 832 call_subtract_stub(assembler, Label::kDeferred); |
| 833 call_with_any_feedback(assembler); | |
| 834 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64), | 833 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64), |
| 835 var_fsub_rhs(assembler, MachineRepresentation::kFloat64), | 834 var_fsub_rhs(assembler, MachineRepresentation::kFloat64), |
| 836 var_type_feedback(assembler, MachineRepresentation::kWord32), | 835 var_type_feedback(assembler, MachineRepresentation::kWord32), |
| 837 var_result(assembler, MachineRepresentation::kTagged); | 836 var_result(assembler, MachineRepresentation::kTagged); |
| 838 | 837 |
| 839 // Check if the {lhs} is a Smi or a HeapObject. | 838 // Check if the {lhs} is a Smi or a HeapObject. |
| 840 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); | 839 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); |
| 841 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); | 840 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); |
| 842 | 841 |
| 843 assembler->Bind(&if_lhsissmi); | 842 assembler->Bind(&if_lhsissmi); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 873 assembler->Goto(&end); | 872 assembler->Goto(&end); |
| 874 } | 873 } |
| 875 | 874 |
| 876 assembler->Bind(&if_rhsisnotsmi); | 875 assembler->Bind(&if_rhsisnotsmi); |
| 877 { | 876 { |
| 878 // Load the map of the {rhs}. | 877 // Load the map of the {rhs}. |
| 879 Node* rhs_map = assembler->LoadMap(rhs); | 878 Node* rhs_map = assembler->LoadMap(rhs); |
| 880 | 879 |
| 881 // Check if {rhs} is a HeapNumber. | 880 // Check if {rhs} is a HeapNumber. |
| 882 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), | 881 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), |
| 883 &check_rhsisoddball); | 882 &call_subtract_stub); |
| 884 | 883 |
| 885 // Perform a floating point subtraction. | 884 // Perform a floating point subtraction. |
| 886 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); | 885 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); |
| 887 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); | 886 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); |
| 888 assembler->Goto(&do_fsub); | 887 assembler->Goto(&do_fsub); |
| 889 } | 888 } |
| 890 } | 889 } |
| 891 | 890 |
| 892 assembler->Bind(&if_lhsisnotsmi); | 891 assembler->Bind(&if_lhsisnotsmi); |
| 893 { | 892 { |
| 894 // Load the map of the {lhs}. | 893 // Load the map of the {lhs}. |
| 895 Node* lhs_map = assembler->LoadMap(lhs); | 894 Node* lhs_map = assembler->LoadMap(lhs); |
| 896 | 895 |
| 897 // Check if the {lhs} is a HeapNumber. | 896 // Check if the {lhs} is a HeapNumber. |
| 898 assembler->GotoUnless(assembler->IsHeapNumberMap(lhs_map), | 897 assembler->GotoUnless(assembler->IsHeapNumberMap(lhs_map), |
| 899 &if_lhsisnotnumber); | 898 &call_subtract_stub); |
| 900 | 899 |
| 901 // Check if the {rhs} is a Smi. | 900 // Check if the {rhs} is a Smi. |
| 902 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | 901 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); |
| 903 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); | 902 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); |
| 904 | 903 |
| 905 assembler->Bind(&if_rhsissmi); | 904 assembler->Bind(&if_rhsissmi); |
| 906 { | 905 { |
| 907 // Perform a floating point subtraction. | 906 // Perform a floating point subtraction. |
| 908 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); | 907 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); |
| 909 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); | 908 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); |
| 910 assembler->Goto(&do_fsub); | 909 assembler->Goto(&do_fsub); |
| 911 } | 910 } |
| 912 | 911 |
| 913 assembler->Bind(&if_rhsisnotsmi); | 912 assembler->Bind(&if_rhsisnotsmi); |
| 914 { | 913 { |
| 915 // Load the map of the {rhs}. | 914 // Load the map of the {rhs}. |
| 916 Node* rhs_map = assembler->LoadMap(rhs); | 915 Node* rhs_map = assembler->LoadMap(rhs); |
| 917 | 916 |
| 918 // Check if the {rhs} is a HeapNumber. | 917 // Check if the {rhs} is a HeapNumber. |
| 919 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), | 918 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), |
| 920 &check_rhsisoddball); | 919 &call_subtract_stub); |
| 921 | 920 |
| 922 // Perform a floating point subtraction. | 921 // Perform a floating point subtraction. |
| 923 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); | 922 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); |
| 924 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); | 923 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); |
| 925 assembler->Goto(&do_fsub); | 924 assembler->Goto(&do_fsub); |
| 926 } | 925 } |
| 927 } | 926 } |
| 928 | 927 |
| 929 assembler->Bind(&do_fsub); | 928 assembler->Bind(&do_fsub); |
| 930 { | 929 { |
| 931 var_type_feedback.Bind( | 930 var_type_feedback.Bind( |
| 932 assembler->Int32Constant(BinaryOperationFeedback::kNumber)); | 931 assembler->Int32Constant(BinaryOperationFeedback::kNumber)); |
| 933 Node* lhs_value = var_fsub_lhs.value(); | 932 Node* lhs_value = var_fsub_lhs.value(); |
| 934 Node* rhs_value = var_fsub_rhs.value(); | 933 Node* rhs_value = var_fsub_rhs.value(); |
| 935 Node* value = assembler->Float64Sub(lhs_value, rhs_value); | 934 Node* value = assembler->Float64Sub(lhs_value, rhs_value); |
| 936 var_result.Bind(assembler->ChangeFloat64ToTagged(value)); | 935 var_result.Bind(assembler->ChangeFloat64ToTagged(value)); |
| 937 assembler->Goto(&end); | 936 assembler->Goto(&end); |
| 938 } | 937 } |
| 939 | 938 |
| 940 assembler->Bind(&if_lhsisnotnumber); | |
| 941 { | |
| 942 // No checks on rhs are done yet. We just know lhs is not a number or Smi. | |
| 943 // Check if lhs is an oddball. | |
| 944 Node* lhs_instance_type = assembler->LoadInstanceType(lhs); | |
| 945 Node* lhs_is_oddball = assembler->Word32Equal( | |
| 946 lhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); | |
| 947 assembler->GotoUnless(lhs_is_oddball, &call_with_any_feedback); | |
| 948 | |
| 949 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); | |
| 950 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); | |
| 951 | |
| 952 assembler->Bind(&if_rhsissmi); | |
| 953 { | |
| 954 var_type_feedback.Bind( | |
| 955 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); | |
| 956 assembler->Goto(&call_subtract_stub); | |
| 957 } | |
| 958 | |
| 959 assembler->Bind(&if_rhsisnotsmi); | |
| 960 { | |
| 961 // Load the map of the {rhs}. | |
| 962 Node* rhs_map = assembler->LoadMap(rhs); | |
| 963 | |
| 964 // Check if {rhs} is a HeapNumber. | |
| 965 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), | |
| 966 &check_rhsisoddball); | |
| 967 | |
| 968 var_type_feedback.Bind( | |
| 969 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); | |
| 970 assembler->Goto(&call_subtract_stub); | |
| 971 } | |
| 972 } | |
| 973 | |
| 974 assembler->Bind(&check_rhsisoddball); | |
| 975 { | |
| 976 // Check if rhs is an oddball. At this point we know lhs is either a | |
| 977 // Smi or number or oddball and rhs is not a number or Smi. | |
| 978 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); | |
| 979 Node* rhs_is_oddball = assembler->Word32Equal( | |
| 980 rhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); | |
| 981 assembler->GotoUnless(rhs_is_oddball, &call_with_any_feedback); | |
| 982 | |
| 983 var_type_feedback.Bind( | |
| 984 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); | |
| 985 assembler->Goto(&call_subtract_stub); | |
| 986 } | |
| 987 | |
| 988 assembler->Bind(&call_with_any_feedback); | |
| 989 { | |
| 990 var_type_feedback.Bind( | |
| 991 assembler->Int32Constant(BinaryOperationFeedback::kAny)); | |
| 992 assembler->Goto(&call_subtract_stub); | |
| 993 } | |
| 994 | |
| 995 assembler->Bind(&call_subtract_stub); | 939 assembler->Bind(&call_subtract_stub); |
| 996 { | 940 { |
| 941 var_type_feedback.Bind( |
| 942 assembler->Int32Constant(BinaryOperationFeedback::kAny)); |
| 997 Callable callable = CodeFactory::Subtract(assembler->isolate()); | 943 Callable callable = CodeFactory::Subtract(assembler->isolate()); |
| 998 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); | 944 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); |
| 999 assembler->Goto(&end); | 945 assembler->Goto(&end); |
| 1000 } | 946 } |
| 1001 | 947 |
| 1002 assembler->Bind(&end); | 948 assembler->Bind(&end); |
| 1003 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, | 949 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, |
| 1004 slot_id); | 950 slot_id); |
| 1005 return var_result.value(); | 951 return var_result.value(); |
| 1006 } | 952 } |
| (...skipping 2055 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3062 | 3008 |
| 3063 if (type == MachineType::Pointer()) { | 3009 if (type == MachineType::Pointer()) { |
| 3064 return Representation::External(); | 3010 return Representation::External(); |
| 3065 } | 3011 } |
| 3066 | 3012 |
| 3067 return Representation::Tagged(); | 3013 return Representation::Tagged(); |
| 3068 } | 3014 } |
| 3069 | 3015 |
| 3070 } // namespace internal | 3016 } // namespace internal |
| 3071 } // namespace v8 | 3017 } // namespace v8 |
| OLD | NEW |