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

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

Issue 2406843002: [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') | src/globals.h » ('J')
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 818 matching lines...) Expand 10 before | Expand all | Expand 10 after
829 829
830 // Shared entry for floating point subtraction. 830 // Shared entry for floating point subtraction.
831 Label do_fsub(assembler), end(assembler), 831 Label do_fsub(assembler), end(assembler),
832 call_subtract_stub(assembler, Label::kDeferred); 832 call_subtract_stub(assembler, Label::kDeferred);
833 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64), 833 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64),
834 var_fsub_rhs(assembler, MachineRepresentation::kFloat64), 834 var_fsub_rhs(assembler, MachineRepresentation::kFloat64),
835 var_type_feedback(assembler, MachineRepresentation::kWord32), 835 var_type_feedback(assembler, MachineRepresentation::kWord32),
836 var_result(assembler, MachineRepresentation::kTagged); 836 var_result(assembler, MachineRepresentation::kTagged);
837 837
838 // Check if the {lhs} is a Smi or a HeapObject. 838 // Check if the {lhs} is a Smi or a HeapObject.
839 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); 839 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler),
840 if_lhsisnotnumber(assembler), check_rhsisoddball(assembler),
Leszek Swirski 2016/10/10 11:57:22 move the new label definitions to the above label
mythria 2016/10/10 13:26:00 Thanks, Done.
841 call_with_any_feedback(assembler);
840 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); 842 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi);
841 843
842 assembler->Bind(&if_lhsissmi); 844 assembler->Bind(&if_lhsissmi);
843 { 845 {
844 // Check if the {rhs} is also a Smi. 846 // Check if the {rhs} is also a Smi.
845 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); 847 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
846 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); 848 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi);
847 849
848 assembler->Bind(&if_rhsissmi); 850 assembler->Bind(&if_rhsissmi);
849 { 851 {
(...skipping 22 matching lines...) Expand all
872 assembler->Goto(&end); 874 assembler->Goto(&end);
873 } 875 }
874 876
875 assembler->Bind(&if_rhsisnotsmi); 877 assembler->Bind(&if_rhsisnotsmi);
876 { 878 {
877 // Load the map of the {rhs}. 879 // Load the map of the {rhs}.
878 Node* rhs_map = assembler->LoadMap(rhs); 880 Node* rhs_map = assembler->LoadMap(rhs);
879 881
880 // Check if {rhs} is a HeapNumber. 882 // Check if {rhs} is a HeapNumber.
881 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), 883 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map),
882 &call_subtract_stub); 884 &check_rhsisoddball);
883 885
884 // Perform a floating point subtraction. 886 // Perform a floating point subtraction.
885 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs)); 887 var_fsub_lhs.Bind(assembler->SmiToFloat64(lhs));
886 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); 888 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs));
887 assembler->Goto(&do_fsub); 889 assembler->Goto(&do_fsub);
888 } 890 }
889 } 891 }
890 892
891 assembler->Bind(&if_lhsisnotsmi); 893 assembler->Bind(&if_lhsisnotsmi);
892 { 894 {
893 // Load the map of the {lhs}. 895 // Load the map of the {lhs}.
894 Node* lhs_map = assembler->LoadMap(lhs); 896 Node* lhs_map = assembler->LoadMap(lhs);
895 897
896 // Check if the {lhs} is a HeapNumber. 898 // Check if the {lhs} is a HeapNumber.
897 assembler->GotoUnless(assembler->IsHeapNumberMap(lhs_map), 899 assembler->GotoUnless(assembler->IsHeapNumberMap(lhs_map),
898 &call_subtract_stub); 900 &if_lhsisnotnumber);
899 901
900 // Check if the {rhs} is a Smi. 902 // Check if the {rhs} is a Smi.
901 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); 903 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
902 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); 904 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi);
903 905
904 assembler->Bind(&if_rhsissmi); 906 assembler->Bind(&if_rhsissmi);
905 { 907 {
906 // Perform a floating point subtraction. 908 // Perform a floating point subtraction.
907 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); 909 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs));
908 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); 910 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs));
909 assembler->Goto(&do_fsub); 911 assembler->Goto(&do_fsub);
910 } 912 }
911 913
912 assembler->Bind(&if_rhsisnotsmi); 914 assembler->Bind(&if_rhsisnotsmi);
913 { 915 {
914 // Load the map of the {rhs}. 916 // Load the map of the {rhs}.
915 Node* rhs_map = assembler->LoadMap(rhs); 917 Node* rhs_map = assembler->LoadMap(rhs);
916 918
917 // Check if the {rhs} is a HeapNumber. 919 // Check if the {rhs} is a HeapNumber.
918 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), 920 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map),
919 &call_subtract_stub); 921 &check_rhsisoddball);
920 922
921 // Perform a floating point subtraction. 923 // Perform a floating point subtraction.
922 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); 924 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs));
923 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); 925 var_fsub_rhs.Bind(assembler->LoadHeapNumberValue(rhs));
924 assembler->Goto(&do_fsub); 926 assembler->Goto(&do_fsub);
925 } 927 }
926 } 928 }
927 929
928 assembler->Bind(&do_fsub); 930 assembler->Bind(&do_fsub);
929 { 931 {
930 var_type_feedback.Bind( 932 var_type_feedback.Bind(
931 assembler->Int32Constant(BinaryOperationFeedback::kNumber)); 933 assembler->Int32Constant(BinaryOperationFeedback::kNumber));
932 Node* lhs_value = var_fsub_lhs.value(); 934 Node* lhs_value = var_fsub_lhs.value();
933 Node* rhs_value = var_fsub_rhs.value(); 935 Node* rhs_value = var_fsub_rhs.value();
934 Node* value = assembler->Float64Sub(lhs_value, rhs_value); 936 Node* value = assembler->Float64Sub(lhs_value, rhs_value);
935 var_result.Bind(assembler->ChangeFloat64ToTagged(value)); 937 var_result.Bind(assembler->ChangeFloat64ToTagged(value));
936 assembler->Goto(&end); 938 assembler->Goto(&end);
937 } 939 }
938 940
941 assembler->Bind(&if_lhsisnotnumber);
942 {
943 // No checks on rhs are done yet. We just know lhs is not number or Smi.
944 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
Leszek Swirski 2016/10/10 11:57:22 nit: move these declarations to be next to the bra
mythria 2016/10/10 13:26:00 Done.
945
946 // Check if lhs is an oddball.
947 Node* lhs_instance_type = assembler->LoadInstanceType(lhs);
948 Node* lhs_is_oddball = assembler->Word32Equal(
949 lhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE));
950 assembler->GotoUnless(lhs_is_oddball, &call_with_any_feedback);
951
952 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi);
953
954 assembler->Bind(&if_rhsissmi);
955 {
956 var_type_feedback.Bind(
957 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball));
958 assembler->Goto(&call_subtract_stub);
Leszek Swirski 2016/10/10 11:57:22 if lhs is an oddball, can we not extract its float
mythria 2016/10/10 13:26:00 As discussed offline, we cannot directly go to fsu
959 }
960
961 assembler->Bind(&if_rhsisnotsmi);
962 {
963 // Load the map of the {rhs}.
964 Node* rhs_map = assembler->LoadMap(rhs);
965
966 // Check if {rhs} is a HeapNumber.
967 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map),
968 &check_rhsisoddball);
969
970 var_type_feedback.Bind(
971 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball));
972 assembler->Goto(&call_subtract_stub);
Leszek Swirski 2016/10/10 11:57:22 as above
mythria 2016/10/10 13:26:00 reply above.
973 }
974 }
975
976 assembler->Bind(&check_rhsisoddball);
977 {
978 // Check if rhs is an oddball. At this point we know lhs is either a
979 // Smi or number or oddball and rhs is not a number or Smi.
980 Node* rhs_instance_type = assembler->LoadInstanceType(rhs);
981 Node* rhs_is_oddball = assembler->Word32Equal(
982 rhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE));
983 assembler->GotoUnless(rhs_is_oddball, &call_with_any_feedback);
984
985 var_type_feedback.Bind(
986 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball));
987 assembler->Goto(&call_subtract_stub);
Leszek Swirski 2016/10/10 11:57:22 as above
mythria 2016/10/10 13:26:00 reply above
988 }
989
990 assembler->Bind(&call_with_any_feedback);
991 {
992 var_type_feedback.Bind(
993 assembler->Int32Constant(BinaryOperationFeedback::kAny));
994 assembler->Goto(&call_subtract_stub);
995 }
996
939 assembler->Bind(&call_subtract_stub); 997 assembler->Bind(&call_subtract_stub);
940 { 998 {
941 var_type_feedback.Bind( 999 var_type_feedback.Bind(
942 assembler->Int32Constant(BinaryOperationFeedback::kAny)); 1000 assembler->Int32Constant(BinaryOperationFeedback::kAny));
Leszek Swirski 2016/10/10 11:57:22 this needs to be removed
mythria 2016/10/10 13:26:00 oops. I missed it. Thanks, we might have wasted ti
943 Callable callable = CodeFactory::Subtract(assembler->isolate()); 1001 Callable callable = CodeFactory::Subtract(assembler->isolate());
944 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs)); 1002 var_result.Bind(assembler->CallStub(callable, context, lhs, rhs));
945 assembler->Goto(&end); 1003 assembler->Goto(&end);
946 } 1004 }
947 1005
948 assembler->Bind(&end); 1006 assembler->Bind(&end);
949 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, 1007 assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector,
950 slot_id); 1008 slot_id);
951 return var_result.value(); 1009 return var_result.value();
952 } 1010 }
(...skipping 2055 matching lines...) Expand 10 before | Expand all | Expand 10 after
3008 3066
3009 if (type == MachineType::Pointer()) { 3067 if (type == MachineType::Pointer()) {
3010 return Representation::External(); 3068 return Representation::External();
3011 } 3069 }
3012 3070
3013 return Representation::Tagged(); 3071 return Representation::Tagged();
3014 } 3072 }
3015 3073
3016 } // namespace internal 3074 } // namespace internal
3017 } // namespace v8 3075 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/globals.h » ('j') | src/globals.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698