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 |