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

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

Issue 2407303002: [stubs] Renames WordIsSmi to TaggedIsSmi, introducing an appropriate bitcast of the parameter. (Closed)
Patch Set: Renamed TaggedValueIsSmi to TaggedIsSmi. 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 | « src/code-stub-assembler.cc ('k') | src/interpreter/interpreter.cc » ('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 662 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 // Shared entry for floating point addition. 673 // Shared entry for floating point addition.
674 Label do_fadd(assembler), end(assembler), 674 Label do_fadd(assembler), end(assembler),
675 call_add_stub(assembler, Label::kDeferred); 675 call_add_stub(assembler, Label::kDeferred);
676 Variable var_fadd_lhs(assembler, MachineRepresentation::kFloat64), 676 Variable var_fadd_lhs(assembler, MachineRepresentation::kFloat64),
677 var_fadd_rhs(assembler, MachineRepresentation::kFloat64), 677 var_fadd_rhs(assembler, MachineRepresentation::kFloat64),
678 var_type_feedback(assembler, MachineRepresentation::kWord32), 678 var_type_feedback(assembler, MachineRepresentation::kWord32),
679 var_result(assembler, MachineRepresentation::kTagged); 679 var_result(assembler, MachineRepresentation::kTagged);
680 680
681 // Check if the {lhs} is a Smi or a HeapObject. 681 // Check if the {lhs} is a Smi or a HeapObject.
682 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); 682 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler);
683 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); 683 assembler->Branch(assembler->TaggedIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi);
684 684
685 assembler->Bind(&if_lhsissmi); 685 assembler->Bind(&if_lhsissmi);
686 { 686 {
687 // Check if the {rhs} is also a Smi. 687 // Check if the {rhs} is also a Smi.
688 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); 688 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
689 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); 689 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi,
690 &if_rhsisnotsmi);
690 691
691 assembler->Bind(&if_rhsissmi); 692 assembler->Bind(&if_rhsissmi);
692 { 693 {
693 // Try fast Smi addition first. 694 // Try fast Smi addition first.
694 Node* pair = assembler->SmiAddWithOverflow(lhs, rhs); 695 Node* pair = assembler->SmiAddWithOverflow(lhs, rhs);
695 Node* overflow = assembler->Projection(1, pair); 696 Node* overflow = assembler->Projection(1, pair);
696 697
697 // Check if the Smi additon overflowed. 698 // Check if the Smi additon overflowed.
698 Label if_overflow(assembler), if_notoverflow(assembler); 699 Label if_overflow(assembler), if_notoverflow(assembler);
699 assembler->Branch(overflow, &if_overflow, &if_notoverflow); 700 assembler->Branch(overflow, &if_overflow, &if_notoverflow);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 736
736 // Load the map of {lhs}. 737 // Load the map of {lhs}.
737 Node* lhs_map = assembler->LoadMap(lhs); 738 Node* lhs_map = assembler->LoadMap(lhs);
738 739
739 // Check if {lhs} is a HeapNumber. 740 // Check if {lhs} is a HeapNumber.
740 Label if_lhsisnumber(assembler), if_lhsisnotnumber(assembler); 741 Label if_lhsisnumber(assembler), if_lhsisnotnumber(assembler);
741 assembler->GotoUnless(assembler->IsHeapNumberMap(lhs_map), &check_string); 742 assembler->GotoUnless(assembler->IsHeapNumberMap(lhs_map), &check_string);
742 743
743 // Check if the {rhs} is Smi. 744 // Check if the {rhs} is Smi.
744 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); 745 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
745 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); 746 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi,
747 &if_rhsisnotsmi);
746 748
747 assembler->Bind(&if_rhsissmi); 749 assembler->Bind(&if_rhsissmi);
748 { 750 {
749 var_fadd_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); 751 var_fadd_lhs.Bind(assembler->LoadHeapNumberValue(lhs));
750 var_fadd_rhs.Bind(assembler->SmiToFloat64(rhs)); 752 var_fadd_rhs.Bind(assembler->SmiToFloat64(rhs));
751 assembler->Goto(&do_fadd); 753 assembler->Goto(&do_fadd);
752 } 754 }
753 755
754 assembler->Bind(&if_rhsisnotsmi); 756 assembler->Bind(&if_rhsisnotsmi);
755 { 757 {
756 // Load the map of {rhs}. 758 // Load the map of {rhs}.
757 Node* rhs_map = assembler->LoadMap(rhs); 759 Node* rhs_map = assembler->LoadMap(rhs);
758 760
759 // Check if the {rhs} is a HeapNumber. 761 // Check if the {rhs} is a HeapNumber.
760 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), 762 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map),
761 &call_add_stub); 763 &call_add_stub);
762 764
763 var_fadd_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); 765 var_fadd_lhs.Bind(assembler->LoadHeapNumberValue(lhs));
764 var_fadd_rhs.Bind(assembler->LoadHeapNumberValue(rhs)); 766 var_fadd_rhs.Bind(assembler->LoadHeapNumberValue(rhs));
765 assembler->Goto(&do_fadd); 767 assembler->Goto(&do_fadd);
766 } 768 }
767 769
768 assembler->Bind(&check_string); 770 assembler->Bind(&check_string);
769 { 771 {
770 // Check if the {rhs} is a smi, and exit the string check early if it is. 772 // Check if the {rhs} is a smi, and exit the string check early if it is.
771 assembler->GotoIf(assembler->WordIsSmi(rhs), &call_add_stub); 773 assembler->GotoIf(assembler->TaggedIsSmi(rhs), &call_add_stub);
772 774
773 Node* lhs_instance_type = assembler->LoadMapInstanceType(lhs_map); 775 Node* lhs_instance_type = assembler->LoadMapInstanceType(lhs_map);
774 776
775 // Exit unless {lhs} is a string 777 // Exit unless {lhs} is a string
776 assembler->GotoUnless(assembler->IsStringInstanceType(lhs_instance_type), 778 assembler->GotoUnless(assembler->IsStringInstanceType(lhs_instance_type),
777 &call_add_stub); 779 &call_add_stub);
778 780
779 Node* rhs_instance_type = assembler->LoadInstanceType(rhs); 781 Node* rhs_instance_type = assembler->LoadInstanceType(rhs);
780 782
781 // Exit unless {rhs} is a string 783 // Exit unless {rhs} is a string
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 Label do_fsub(assembler), end(assembler), call_subtract_stub(assembler), 833 Label do_fsub(assembler), end(assembler), call_subtract_stub(assembler),
832 if_lhsisnotnumber(assembler), check_rhsisoddball(assembler), 834 if_lhsisnotnumber(assembler), check_rhsisoddball(assembler),
833 call_with_any_feedback(assembler); 835 call_with_any_feedback(assembler);
834 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64), 836 Variable var_fsub_lhs(assembler, MachineRepresentation::kFloat64),
835 var_fsub_rhs(assembler, MachineRepresentation::kFloat64), 837 var_fsub_rhs(assembler, MachineRepresentation::kFloat64),
836 var_type_feedback(assembler, MachineRepresentation::kWord32), 838 var_type_feedback(assembler, MachineRepresentation::kWord32),
837 var_result(assembler, MachineRepresentation::kTagged); 839 var_result(assembler, MachineRepresentation::kTagged);
838 840
839 // Check if the {lhs} is a Smi or a HeapObject. 841 // Check if the {lhs} is a Smi or a HeapObject.
840 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler); 842 Label if_lhsissmi(assembler), if_lhsisnotsmi(assembler);
841 assembler->Branch(assembler->WordIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi); 843 assembler->Branch(assembler->TaggedIsSmi(lhs), &if_lhsissmi, &if_lhsisnotsmi);
842 844
843 assembler->Bind(&if_lhsissmi); 845 assembler->Bind(&if_lhsissmi);
844 { 846 {
845 // Check if the {rhs} is also a Smi. 847 // Check if the {rhs} is also a Smi.
846 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); 848 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
847 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); 849 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi,
850 &if_rhsisnotsmi);
848 851
849 assembler->Bind(&if_rhsissmi); 852 assembler->Bind(&if_rhsissmi);
850 { 853 {
851 // Try a fast Smi subtraction first. 854 // Try a fast Smi subtraction first.
852 Node* pair = assembler->SmiSubWithOverflow(lhs, rhs); 855 Node* pair = assembler->SmiSubWithOverflow(lhs, rhs);
853 Node* overflow = assembler->Projection(1, pair); 856 Node* overflow = assembler->Projection(1, pair);
854 857
855 // Check if the Smi subtraction overflowed. 858 // Check if the Smi subtraction overflowed.
856 Label if_overflow(assembler), if_notoverflow(assembler); 859 Label if_overflow(assembler), if_notoverflow(assembler);
857 assembler->Branch(overflow, &if_overflow, &if_notoverflow); 860 assembler->Branch(overflow, &if_overflow, &if_notoverflow);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 { 896 {
894 // Load the map of the {lhs}. 897 // Load the map of the {lhs}.
895 Node* lhs_map = assembler->LoadMap(lhs); 898 Node* lhs_map = assembler->LoadMap(lhs);
896 899
897 // Check if the {lhs} is a HeapNumber. 900 // Check if the {lhs} is a HeapNumber.
898 assembler->GotoUnless(assembler->IsHeapNumberMap(lhs_map), 901 assembler->GotoUnless(assembler->IsHeapNumberMap(lhs_map),
899 &if_lhsisnotnumber); 902 &if_lhsisnotnumber);
900 903
901 // Check if the {rhs} is a Smi. 904 // Check if the {rhs} is a Smi.
902 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); 905 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
903 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); 906 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi,
907 &if_rhsisnotsmi);
904 908
905 assembler->Bind(&if_rhsissmi); 909 assembler->Bind(&if_rhsissmi);
906 { 910 {
907 // Perform a floating point subtraction. 911 // Perform a floating point subtraction.
908 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs)); 912 var_fsub_lhs.Bind(assembler->LoadHeapNumberValue(lhs));
909 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs)); 913 var_fsub_rhs.Bind(assembler->SmiToFloat64(rhs));
910 assembler->Goto(&do_fsub); 914 assembler->Goto(&do_fsub);
911 } 915 }
912 916
913 assembler->Bind(&if_rhsisnotsmi); 917 assembler->Bind(&if_rhsisnotsmi);
(...skipping 26 matching lines...) Expand all
940 assembler->Bind(&if_lhsisnotnumber); 944 assembler->Bind(&if_lhsisnotnumber);
941 { 945 {
942 // No checks on rhs are done yet. We just know lhs is not a number or Smi. 946 // No checks on rhs are done yet. We just know lhs is not a number or Smi.
943 // Check if lhs is an oddball. 947 // Check if lhs is an oddball.
944 Node* lhs_instance_type = assembler->LoadInstanceType(lhs); 948 Node* lhs_instance_type = assembler->LoadInstanceType(lhs);
945 Node* lhs_is_oddball = assembler->Word32Equal( 949 Node* lhs_is_oddball = assembler->Word32Equal(
946 lhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE)); 950 lhs_instance_type, assembler->Int32Constant(ODDBALL_TYPE));
947 assembler->GotoUnless(lhs_is_oddball, &call_with_any_feedback); 951 assembler->GotoUnless(lhs_is_oddball, &call_with_any_feedback);
948 952
949 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler); 953 Label if_rhsissmi(assembler), if_rhsisnotsmi(assembler);
950 assembler->Branch(assembler->WordIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); 954 assembler->Branch(assembler->TaggedIsSmi(rhs), &if_rhsissmi,
955 &if_rhsisnotsmi);
951 956
952 assembler->Bind(&if_rhsissmi); 957 assembler->Bind(&if_rhsissmi);
953 { 958 {
954 var_type_feedback.Bind( 959 var_type_feedback.Bind(
955 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball)); 960 assembler->Int32Constant(BinaryOperationFeedback::kNumberOrOddball));
956 assembler->Goto(&call_subtract_stub); 961 assembler->Goto(&call_subtract_stub);
957 } 962 }
958 963
959 assembler->Bind(&if_rhsisnotsmi); 964 assembler->Bind(&if_rhsisnotsmi);
960 { 965 {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 Label do_fmul(assembler), end(assembler), 1024 Label do_fmul(assembler), end(assembler),
1020 call_multiply_stub(assembler, Label::kDeferred); 1025 call_multiply_stub(assembler, Label::kDeferred);
1021 Variable var_lhs_float64(assembler, MachineRepresentation::kFloat64), 1026 Variable var_lhs_float64(assembler, MachineRepresentation::kFloat64),
1022 var_rhs_float64(assembler, MachineRepresentation::kFloat64), 1027 var_rhs_float64(assembler, MachineRepresentation::kFloat64),
1023 var_result(assembler, MachineRepresentation::kTagged), 1028 var_result(assembler, MachineRepresentation::kTagged),
1024 var_type_feedback(assembler, MachineRepresentation::kWord32); 1029 var_type_feedback(assembler, MachineRepresentation::kWord32);
1025 1030
1026 Node* number_map = assembler->HeapNumberMapConstant(); 1031 Node* number_map = assembler->HeapNumberMapConstant();
1027 1032
1028 Label lhs_is_smi(assembler), lhs_is_not_smi(assembler); 1033 Label lhs_is_smi(assembler), lhs_is_not_smi(assembler);
1029 assembler->Branch(assembler->WordIsSmi(lhs), &lhs_is_smi, &lhs_is_not_smi); 1034 assembler->Branch(assembler->TaggedIsSmi(lhs), &lhs_is_smi, &lhs_is_not_smi);
1030 1035
1031 assembler->Bind(&lhs_is_smi); 1036 assembler->Bind(&lhs_is_smi);
1032 { 1037 {
1033 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); 1038 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler);
1034 assembler->Branch(assembler->WordIsSmi(rhs), &rhs_is_smi, &rhs_is_not_smi); 1039 assembler->Branch(assembler->TaggedIsSmi(rhs), &rhs_is_smi,
1040 &rhs_is_not_smi);
1035 1041
1036 assembler->Bind(&rhs_is_smi); 1042 assembler->Bind(&rhs_is_smi);
1037 { 1043 {
1038 // Both {lhs} and {rhs} are Smis. The result is not necessarily a smi, 1044 // Both {lhs} and {rhs} are Smis. The result is not necessarily a smi,
1039 // in case of overflow. 1045 // in case of overflow.
1040 var_result.Bind(assembler->SmiMul(lhs, rhs)); 1046 var_result.Bind(assembler->SmiMul(lhs, rhs));
1041 var_type_feedback.Bind(assembler->Select( 1047 var_type_feedback.Bind(assembler->Select(
1042 assembler->WordIsSmi(var_result.value()), 1048 assembler->TaggedIsSmi(var_result.value()),
1043 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall), 1049 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall),
1044 assembler->Int32Constant(BinaryOperationFeedback::kNumber), 1050 assembler->Int32Constant(BinaryOperationFeedback::kNumber),
1045 MachineRepresentation::kWord32)); 1051 MachineRepresentation::kWord32));
1046 assembler->Goto(&end); 1052 assembler->Goto(&end);
1047 } 1053 }
1048 1054
1049 assembler->Bind(&rhs_is_not_smi); 1055 assembler->Bind(&rhs_is_not_smi);
1050 { 1056 {
1051 Node* rhs_map = assembler->LoadMap(rhs); 1057 Node* rhs_map = assembler->LoadMap(rhs);
1052 1058
(...skipping 11 matching lines...) Expand all
1064 assembler->Bind(&lhs_is_not_smi); 1070 assembler->Bind(&lhs_is_not_smi);
1065 { 1071 {
1066 Node* lhs_map = assembler->LoadMap(lhs); 1072 Node* lhs_map = assembler->LoadMap(lhs);
1067 1073
1068 // Check if {lhs} is a HeapNumber. 1074 // Check if {lhs} is a HeapNumber.
1069 assembler->GotoUnless(assembler->WordEqual(lhs_map, number_map), 1075 assembler->GotoUnless(assembler->WordEqual(lhs_map, number_map),
1070 &call_multiply_stub); 1076 &call_multiply_stub);
1071 1077
1072 // Check if {rhs} is a Smi. 1078 // Check if {rhs} is a Smi.
1073 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); 1079 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler);
1074 assembler->Branch(assembler->WordIsSmi(rhs), &rhs_is_smi, &rhs_is_not_smi); 1080 assembler->Branch(assembler->TaggedIsSmi(rhs), &rhs_is_smi,
1081 &rhs_is_not_smi);
1075 1082
1076 assembler->Bind(&rhs_is_smi); 1083 assembler->Bind(&rhs_is_smi);
1077 { 1084 {
1078 // Convert {rhs} to a double and multiply it with the value of {lhs}. 1085 // Convert {rhs} to a double and multiply it with the value of {lhs}.
1079 var_lhs_float64.Bind(assembler->LoadHeapNumberValue(lhs)); 1086 var_lhs_float64.Bind(assembler->LoadHeapNumberValue(lhs));
1080 var_rhs_float64.Bind(assembler->SmiToFloat64(rhs)); 1087 var_rhs_float64.Bind(assembler->SmiToFloat64(rhs));
1081 assembler->Goto(&do_fmul); 1088 assembler->Goto(&do_fmul);
1082 } 1089 }
1083 1090
1084 assembler->Bind(&rhs_is_not_smi); 1091 assembler->Bind(&rhs_is_not_smi);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1136 // Shared entry point for floating point division. 1143 // Shared entry point for floating point division.
1137 Label do_fdiv(assembler), end(assembler), call_divide_stub(assembler); 1144 Label do_fdiv(assembler), end(assembler), call_divide_stub(assembler);
1138 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), 1145 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64),
1139 var_divisor_float64(assembler, MachineRepresentation::kFloat64), 1146 var_divisor_float64(assembler, MachineRepresentation::kFloat64),
1140 var_result(assembler, MachineRepresentation::kTagged), 1147 var_result(assembler, MachineRepresentation::kTagged),
1141 var_type_feedback(assembler, MachineRepresentation::kWord32); 1148 var_type_feedback(assembler, MachineRepresentation::kWord32);
1142 1149
1143 Node* number_map = assembler->HeapNumberMapConstant(); 1150 Node* number_map = assembler->HeapNumberMapConstant();
1144 1151
1145 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); 1152 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler);
1146 assembler->Branch(assembler->WordIsSmi(dividend), &dividend_is_smi, 1153 assembler->Branch(assembler->TaggedIsSmi(dividend), &dividend_is_smi,
1147 &dividend_is_not_smi); 1154 &dividend_is_not_smi);
1148 1155
1149 assembler->Bind(&dividend_is_smi); 1156 assembler->Bind(&dividend_is_smi);
1150 { 1157 {
1151 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); 1158 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler);
1152 assembler->Branch(assembler->WordIsSmi(divisor), &divisor_is_smi, 1159 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi,
1153 &divisor_is_not_smi); 1160 &divisor_is_not_smi);
1154 1161
1155 assembler->Bind(&divisor_is_smi); 1162 assembler->Bind(&divisor_is_smi);
1156 { 1163 {
1157 Label bailout(assembler); 1164 Label bailout(assembler);
1158 1165
1159 // Do floating point division if {divisor} is zero. 1166 // Do floating point division if {divisor} is zero.
1160 assembler->GotoIf( 1167 assembler->GotoIf(
1161 assembler->WordEqual(divisor, assembler->IntPtrConstant(0)), 1168 assembler->WordEqual(divisor, assembler->IntPtrConstant(0)),
1162 &bailout); 1169 &bailout);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1239 assembler->Bind(&dividend_is_not_smi); 1246 assembler->Bind(&dividend_is_not_smi);
1240 { 1247 {
1241 Node* dividend_map = assembler->LoadMap(dividend); 1248 Node* dividend_map = assembler->LoadMap(dividend);
1242 1249
1243 // Check if {dividend} is a HeapNumber. 1250 // Check if {dividend} is a HeapNumber.
1244 assembler->GotoUnless(assembler->WordEqual(dividend_map, number_map), 1251 assembler->GotoUnless(assembler->WordEqual(dividend_map, number_map),
1245 &call_divide_stub); 1252 &call_divide_stub);
1246 1253
1247 // Check if {divisor} is a Smi. 1254 // Check if {divisor} is a Smi.
1248 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); 1255 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler);
1249 assembler->Branch(assembler->WordIsSmi(divisor), &divisor_is_smi, 1256 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi,
1250 &divisor_is_not_smi); 1257 &divisor_is_not_smi);
1251 1258
1252 assembler->Bind(&divisor_is_smi); 1259 assembler->Bind(&divisor_is_smi);
1253 { 1260 {
1254 // Convert {divisor} to a double and use it for a floating point 1261 // Convert {divisor} to a double and use it for a floating point
1255 // division. 1262 // division.
1256 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); 1263 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend));
1257 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); 1264 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor));
1258 assembler->Goto(&do_fdiv); 1265 assembler->Goto(&do_fdiv);
1259 } 1266 }
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1312 // Shared entry point for floating point division. 1319 // Shared entry point for floating point division.
1313 Label do_fmod(assembler), end(assembler), call_modulus_stub(assembler); 1320 Label do_fmod(assembler), end(assembler), call_modulus_stub(assembler);
1314 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), 1321 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64),
1315 var_divisor_float64(assembler, MachineRepresentation::kFloat64), 1322 var_divisor_float64(assembler, MachineRepresentation::kFloat64),
1316 var_result(assembler, MachineRepresentation::kTagged), 1323 var_result(assembler, MachineRepresentation::kTagged),
1317 var_type_feedback(assembler, MachineRepresentation::kWord32); 1324 var_type_feedback(assembler, MachineRepresentation::kWord32);
1318 1325
1319 Node* number_map = assembler->HeapNumberMapConstant(); 1326 Node* number_map = assembler->HeapNumberMapConstant();
1320 1327
1321 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); 1328 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler);
1322 assembler->Branch(assembler->WordIsSmi(dividend), &dividend_is_smi, 1329 assembler->Branch(assembler->TaggedIsSmi(dividend), &dividend_is_smi,
1323 &dividend_is_not_smi); 1330 &dividend_is_not_smi);
1324 1331
1325 assembler->Bind(&dividend_is_smi); 1332 assembler->Bind(&dividend_is_smi);
1326 { 1333 {
1327 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); 1334 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler);
1328 assembler->Branch(assembler->WordIsSmi(divisor), &divisor_is_smi, 1335 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi,
1329 &divisor_is_not_smi); 1336 &divisor_is_not_smi);
1330 1337
1331 assembler->Bind(&divisor_is_smi); 1338 assembler->Bind(&divisor_is_smi);
1332 { 1339 {
1333 var_result.Bind(assembler->SmiMod(dividend, divisor)); 1340 var_result.Bind(assembler->SmiMod(dividend, divisor));
1334 var_type_feedback.Bind(assembler->Select( 1341 var_type_feedback.Bind(assembler->Select(
1335 assembler->WordIsSmi(var_result.value()), 1342 assembler->TaggedIsSmi(var_result.value()),
1336 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall), 1343 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall),
1337 assembler->Int32Constant(BinaryOperationFeedback::kNumber))); 1344 assembler->Int32Constant(BinaryOperationFeedback::kNumber)));
1338 assembler->Goto(&end); 1345 assembler->Goto(&end);
1339 } 1346 }
1340 1347
1341 assembler->Bind(&divisor_is_not_smi); 1348 assembler->Bind(&divisor_is_not_smi);
1342 { 1349 {
1343 Node* divisor_map = assembler->LoadMap(divisor); 1350 Node* divisor_map = assembler->LoadMap(divisor);
1344 1351
1345 // Check if {divisor} is a HeapNumber. 1352 // Check if {divisor} is a HeapNumber.
(...skipping 11 matching lines...) Expand all
1357 assembler->Bind(&dividend_is_not_smi); 1364 assembler->Bind(&dividend_is_not_smi);
1358 { 1365 {
1359 Node* dividend_map = assembler->LoadMap(dividend); 1366 Node* dividend_map = assembler->LoadMap(dividend);
1360 1367
1361 // Check if {dividend} is a HeapNumber. 1368 // Check if {dividend} is a HeapNumber.
1362 assembler->GotoUnless(assembler->WordEqual(dividend_map, number_map), 1369 assembler->GotoUnless(assembler->WordEqual(dividend_map, number_map),
1363 &call_modulus_stub); 1370 &call_modulus_stub);
1364 1371
1365 // Check if {divisor} is a Smi. 1372 // Check if {divisor} is a Smi.
1366 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); 1373 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler);
1367 assembler->Branch(assembler->WordIsSmi(divisor), &divisor_is_smi, 1374 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi,
1368 &divisor_is_not_smi); 1375 &divisor_is_not_smi);
1369 1376
1370 assembler->Bind(&divisor_is_smi); 1377 assembler->Bind(&divisor_is_smi);
1371 { 1378 {
1372 // Convert {divisor} to a double and use it for a floating point 1379 // Convert {divisor} to a double and use it for a floating point
1373 // division. 1380 // division.
1374 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); 1381 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend));
1375 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); 1382 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor));
1376 assembler->Goto(&do_fmod); 1383 assembler->Goto(&do_fmod);
1377 } 1384 }
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1439 Label start(assembler, 2, loop_vars); 1446 Label start(assembler, 2, loop_vars);
1440 value_var.Bind(value); 1447 value_var.Bind(value);
1441 var_type_feedback.Bind( 1448 var_type_feedback.Bind(
1442 assembler->Int32Constant(BinaryOperationFeedback::kNone)); 1449 assembler->Int32Constant(BinaryOperationFeedback::kNone));
1443 assembler->Goto(&start); 1450 assembler->Goto(&start);
1444 assembler->Bind(&start); 1451 assembler->Bind(&start);
1445 { 1452 {
1446 value = value_var.value(); 1453 value = value_var.value();
1447 1454
1448 Label if_issmi(assembler), if_isnotsmi(assembler); 1455 Label if_issmi(assembler), if_isnotsmi(assembler);
1449 assembler->Branch(assembler->WordIsSmi(value), &if_issmi, &if_isnotsmi); 1456 assembler->Branch(assembler->TaggedIsSmi(value), &if_issmi, &if_isnotsmi);
1450 1457
1451 assembler->Bind(&if_issmi); 1458 assembler->Bind(&if_issmi);
1452 { 1459 {
1453 // Try fast Smi addition first. 1460 // Try fast Smi addition first.
1454 Node* one = assembler->SmiConstant(Smi::FromInt(1)); 1461 Node* one = assembler->SmiConstant(Smi::FromInt(1));
1455 Node* pair = assembler->SmiAddWithOverflow(value, one); 1462 Node* pair = assembler->SmiAddWithOverflow(value, one);
1456 Node* overflow = assembler->Projection(1, pair); 1463 Node* overflow = assembler->Projection(1, pair);
1457 1464
1458 // Check if the Smi addition overflowed. 1465 // Check if the Smi addition overflowed.
1459 Label if_overflow(assembler), if_notoverflow(assembler); 1466 Label if_overflow(assembler), if_notoverflow(assembler);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1549 Label start(assembler, 2, loop_vars); 1556 Label start(assembler, 2, loop_vars);
1550 var_type_feedback.Bind( 1557 var_type_feedback.Bind(
1551 assembler->Int32Constant(BinaryOperationFeedback::kNone)); 1558 assembler->Int32Constant(BinaryOperationFeedback::kNone));
1552 value_var.Bind(value); 1559 value_var.Bind(value);
1553 assembler->Goto(&start); 1560 assembler->Goto(&start);
1554 assembler->Bind(&start); 1561 assembler->Bind(&start);
1555 { 1562 {
1556 value = value_var.value(); 1563 value = value_var.value();
1557 1564
1558 Label if_issmi(assembler), if_isnotsmi(assembler); 1565 Label if_issmi(assembler), if_isnotsmi(assembler);
1559 assembler->Branch(assembler->WordIsSmi(value), &if_issmi, &if_isnotsmi); 1566 assembler->Branch(assembler->TaggedIsSmi(value), &if_issmi, &if_isnotsmi);
1560 1567
1561 assembler->Bind(&if_issmi); 1568 assembler->Bind(&if_issmi);
1562 { 1569 {
1563 // Try fast Smi subtraction first. 1570 // Try fast Smi subtraction first.
1564 Node* one = assembler->SmiConstant(Smi::FromInt(1)); 1571 Node* one = assembler->SmiConstant(Smi::FromInt(1));
1565 Node* pair = assembler->SmiSubWithOverflow(value, one); 1572 Node* pair = assembler->SmiSubWithOverflow(value, one);
1566 Node* overflow = assembler->Projection(1, pair); 1573 Node* overflow = assembler->Projection(1, pair);
1567 1574
1568 // Check if the Smi subtraction overflowed. 1575 // Check if the Smi subtraction overflowed.
1569 Label if_overflow(assembler), if_notoverflow(assembler); 1576 Label if_overflow(assembler), if_notoverflow(assembler);
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
1721 Node* map_cell = assembler->HeapConstant(isolate()->factory()->NewWeakCell( 1728 Node* map_cell = assembler->HeapConstant(isolate()->factory()->NewWeakCell(
1722 StoreGlobalStub::global_map_placeholder(isolate()))); 1729 StoreGlobalStub::global_map_placeholder(isolate())));
1723 Node* expected_map = assembler->LoadWeakCellValue(map_cell); 1730 Node* expected_map = assembler->LoadWeakCellValue(map_cell);
1724 Node* map = assembler->LoadMap(global); 1731 Node* map = assembler->LoadMap(global);
1725 assembler->GotoIf(assembler->WordNotEqual(expected_map, map), &miss); 1732 assembler->GotoIf(assembler->WordNotEqual(expected_map, map), &miss);
1726 } 1733 }
1727 1734
1728 Node* weak_cell = assembler->HeapConstant(isolate()->factory()->NewWeakCell( 1735 Node* weak_cell = assembler->HeapConstant(isolate()->factory()->NewWeakCell(
1729 StoreGlobalStub::property_cell_placeholder(isolate()))); 1736 StoreGlobalStub::property_cell_placeholder(isolate())));
1730 Node* cell = assembler->LoadWeakCellValue(weak_cell); 1737 Node* cell = assembler->LoadWeakCellValue(weak_cell);
1731 assembler->GotoIf(assembler->WordIsSmi(cell), &miss); 1738 assembler->GotoIf(assembler->TaggedIsSmi(cell), &miss);
1732 1739
1733 // Load the payload of the global parameter cell. A hole indicates that the 1740 // Load the payload of the global parameter cell. A hole indicates that the
1734 // cell has been invalidated and that the store must be handled by the 1741 // cell has been invalidated and that the store must be handled by the
1735 // runtime. 1742 // runtime.
1736 Node* cell_contents = 1743 Node* cell_contents =
1737 assembler->LoadObjectField(cell, PropertyCell::kValueOffset); 1744 assembler->LoadObjectField(cell, PropertyCell::kValueOffset);
1738 1745
1739 PropertyCellType cell_type = this->cell_type(); 1746 PropertyCellType cell_type = this->cell_type();
1740 if (cell_type == PropertyCellType::kConstant || 1747 if (cell_type == PropertyCellType::kConstant ||
1741 cell_type == PropertyCellType::kUndefined) { 1748 cell_type == PropertyCellType::kUndefined) {
1742 // This is always valid for all states a cell can be in. 1749 // This is always valid for all states a cell can be in.
1743 assembler->GotoIf(assembler->WordNotEqual(cell_contents, value), &miss); 1750 assembler->GotoIf(assembler->WordNotEqual(cell_contents, value), &miss);
1744 } else { 1751 } else {
1745 assembler->GotoIf(assembler->IsTheHole(cell_contents), &miss); 1752 assembler->GotoIf(assembler->IsTheHole(cell_contents), &miss);
1746 1753
1747 // When dealing with constant types, the type may be allowed to change, as 1754 // When dealing with constant types, the type may be allowed to change, as
1748 // long as optimized code remains valid. 1755 // long as optimized code remains valid.
1749 bool value_is_smi = false; 1756 bool value_is_smi = false;
1750 if (cell_type == PropertyCellType::kConstantType) { 1757 if (cell_type == PropertyCellType::kConstantType) {
1751 switch (constant_type()) { 1758 switch (constant_type()) {
1752 case PropertyCellConstantType::kSmi: 1759 case PropertyCellConstantType::kSmi:
1753 assembler->GotoUnless(assembler->WordIsSmi(value), &miss); 1760 assembler->GotoUnless(assembler->TaggedIsSmi(value), &miss);
1754 value_is_smi = true; 1761 value_is_smi = true;
1755 break; 1762 break;
1756 case PropertyCellConstantType::kStableMap: { 1763 case PropertyCellConstantType::kStableMap: {
1757 // It is sufficient here to check that the value and cell contents 1764 // It is sufficient here to check that the value and cell contents
1758 // have identical maps, no matter if they are stable or not or if they 1765 // have identical maps, no matter if they are stable or not or if they
1759 // are the maps that were originally in the cell or not. If optimized 1766 // are the maps that were originally in the cell or not. If optimized
1760 // code will deopt when a cell has a unstable map and if it has a 1767 // code will deopt when a cell has a unstable map and if it has a
1761 // dependency on a stable map, it will deopt if the map destabilizes. 1768 // dependency on a stable map, it will deopt if the map destabilizes.
1762 assembler->GotoIf(assembler->WordIsSmi(value), &miss); 1769 assembler->GotoIf(assembler->TaggedIsSmi(value), &miss);
1763 assembler->GotoIf(assembler->WordIsSmi(cell_contents), &miss); 1770 assembler->GotoIf(assembler->TaggedIsSmi(cell_contents), &miss);
1764 Node* expected_map = assembler->LoadMap(cell_contents); 1771 Node* expected_map = assembler->LoadMap(cell_contents);
1765 Node* map = assembler->LoadMap(value); 1772 Node* map = assembler->LoadMap(value);
1766 assembler->GotoIf(assembler->WordNotEqual(expected_map, map), &miss); 1773 assembler->GotoIf(assembler->WordNotEqual(expected_map, map), &miss);
1767 break; 1774 break;
1768 } 1775 }
1769 } 1776 }
1770 } 1777 }
1771 if (value_is_smi) { 1778 if (value_is_smi) {
1772 assembler->StoreObjectFieldNoWriteBarrier( 1779 assembler->StoreObjectFieldNoWriteBarrier(
1773 cell, PropertyCell::kValueOffset, value); 1780 cell, PropertyCell::kValueOffset, value);
(...skipping 1122 matching lines...) Expand 10 before | Expand all | Expand 10 after
2896 AllocationSiteMode mode) { 2903 AllocationSiteMode mode) {
2897 typedef compiler::Node Node; 2904 typedef compiler::Node Node;
2898 typedef CodeStubAssembler::Label Label; 2905 typedef CodeStubAssembler::Label Label;
2899 2906
2900 Label ok(assembler); 2907 Label ok(assembler);
2901 Label smi_size(assembler); 2908 Label smi_size(assembler);
2902 Label small_smi_size(assembler); 2909 Label small_smi_size(assembler);
2903 Label call_runtime(assembler, Label::kDeferred); 2910 Label call_runtime(assembler, Label::kDeferred);
2904 2911
2905 Node* size = assembler->Parameter(Descriptor::kArraySizeSmiParameter); 2912 Node* size = assembler->Parameter(Descriptor::kArraySizeSmiParameter);
2906 assembler->Branch(assembler->WordIsSmi(size), &smi_size, &call_runtime); 2913 assembler->Branch(assembler->TaggedIsSmi(size), &smi_size, &call_runtime);
2907 2914
2908 assembler->Bind(&smi_size); 2915 assembler->Bind(&smi_size);
2909 2916
2910 if (IsFastPackedElementsKind(elements_kind)) { 2917 if (IsFastPackedElementsKind(elements_kind)) {
2911 Label abort(assembler, Label::kDeferred); 2918 Label abort(assembler, Label::kDeferred);
2912 assembler->Branch( 2919 assembler->Branch(
2913 assembler->SmiEqual(size, assembler->SmiConstant(Smi::kZero)), 2920 assembler->SmiEqual(size, assembler->SmiConstant(Smi::kZero)),
2914 &small_smi_size, &abort); 2921 &small_smi_size, &abort);
2915 2922
2916 assembler->Bind(&abort); 2923 assembler->Bind(&abort);
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
3026 3033
3027 if (type == MachineType::Pointer()) { 3034 if (type == MachineType::Pointer()) {
3028 return Representation::External(); 3035 return Representation::External();
3029 } 3036 }
3030 3037
3031 return Representation::Tagged(); 3038 return Representation::Tagged();
3032 } 3039 }
3033 3040
3034 } // namespace internal 3041 } // namespace internal
3035 } // namespace v8 3042 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.cc ('k') | src/interpreter/interpreter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698