Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(439)

Side by Side Diff: src/code-stubs.cc

Issue 2407923002: Revert of [Interpreter] Collect feedback about Oddballs in Subtract Stub. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/globals.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | src/globals.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698