| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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/builtins/builtins-utils.h" | 5 #include "src/builtins/builtins-utils.h" |
| 6 #include "src/builtins/builtins.h" | 6 #include "src/builtins/builtins.h" |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 #include "src/code-stub-assembler.h" | 8 #include "src/code-stub-assembler.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 971 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 982 } | 982 } |
| 983 } | 983 } |
| 984 | 984 |
| 985 Bind(&if_lhsisnotsmi); | 985 Bind(&if_lhsisnotsmi); |
| 986 { | 986 { |
| 987 // Load the map of the {lhs}. | 987 // Load the map of the {lhs}. |
| 988 Node* lhs_map = LoadMap(lhs); | 988 Node* lhs_map = LoadMap(lhs); |
| 989 | 989 |
| 990 // Check if the {lhs} is a HeapNumber. | 990 // Check if the {lhs} is a HeapNumber. |
| 991 Label if_lhsisnumber(this), if_lhsisnotnumber(this, Label::kDeferred); | 991 Label if_lhsisnumber(this), if_lhsisnotnumber(this, Label::kDeferred); |
| 992 Node* number_map = HeapNumberMapConstant(); | 992 Branch(IsHeapNumberMap(lhs_map), &if_lhsisnumber, &if_lhsisnotnumber); |
| 993 Branch(WordEqual(lhs_map, number_map), &if_lhsisnumber, | |
| 994 &if_lhsisnotnumber); | |
| 995 | 993 |
| 996 Bind(&if_lhsisnumber); | 994 Bind(&if_lhsisnumber); |
| 997 { | 995 { |
| 998 // Check if the {rhs} is a Smi. | 996 // Check if the {rhs} is a Smi. |
| 999 Label if_rhsissmi(this), if_rhsisnotsmi(this); | 997 Label if_rhsissmi(this), if_rhsisnotsmi(this); |
| 1000 Branch(TaggedIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); | 998 Branch(TaggedIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); |
| 1001 | 999 |
| 1002 Bind(&if_rhsissmi); | 1000 Bind(&if_rhsissmi); |
| 1003 { | 1001 { |
| 1004 // Perform a floating point subtraction. | 1002 // Perform a floating point subtraction. |
| 1005 var_fsub_lhs.Bind(LoadHeapNumberValue(lhs)); | 1003 var_fsub_lhs.Bind(LoadHeapNumberValue(lhs)); |
| 1006 var_fsub_rhs.Bind(SmiToFloat64(rhs)); | 1004 var_fsub_rhs.Bind(SmiToFloat64(rhs)); |
| 1007 Goto(&do_fsub); | 1005 Goto(&do_fsub); |
| 1008 } | 1006 } |
| 1009 | 1007 |
| 1010 Bind(&if_rhsisnotsmi); | 1008 Bind(&if_rhsisnotsmi); |
| 1011 { | 1009 { |
| 1012 // Load the map of the {rhs}. | 1010 // Load the map of the {rhs}. |
| 1013 Node* rhs_map = LoadMap(rhs); | 1011 Node* rhs_map = LoadMap(rhs); |
| 1014 | 1012 |
| 1015 // Check if the {rhs} is a HeapNumber. | 1013 // Check if the {rhs} is a HeapNumber. |
| 1016 Label if_rhsisnumber(this), if_rhsisnotnumber(this, Label::kDeferred); | 1014 Label if_rhsisnumber(this), if_rhsisnotnumber(this, Label::kDeferred); |
| 1017 Branch(WordEqual(rhs_map, number_map), &if_rhsisnumber, | 1015 Branch(IsHeapNumberMap(rhs_map), &if_rhsisnumber, &if_rhsisnotnumber); |
| 1018 &if_rhsisnotnumber); | |
| 1019 | 1016 |
| 1020 Bind(&if_rhsisnumber); | 1017 Bind(&if_rhsisnumber); |
| 1021 { | 1018 { |
| 1022 // Perform a floating point subtraction. | 1019 // Perform a floating point subtraction. |
| 1023 var_fsub_lhs.Bind(LoadHeapNumberValue(lhs)); | 1020 var_fsub_lhs.Bind(LoadHeapNumberValue(lhs)); |
| 1024 var_fsub_rhs.Bind(LoadHeapNumberValue(rhs)); | 1021 var_fsub_rhs.Bind(LoadHeapNumberValue(rhs)); |
| 1025 Goto(&do_fsub); | 1022 Goto(&do_fsub); |
| 1026 } | 1023 } |
| 1027 | 1024 |
| 1028 Bind(&if_rhsisnotnumber); | 1025 Bind(&if_rhsisnotnumber); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1060 TF_BUILTIN(Multiply, CodeStubAssembler) { | 1057 TF_BUILTIN(Multiply, CodeStubAssembler) { |
| 1061 Node* left = Parameter(0); | 1058 Node* left = Parameter(0); |
| 1062 Node* right = Parameter(1); | 1059 Node* right = Parameter(1); |
| 1063 Node* context = Parameter(2); | 1060 Node* context = Parameter(2); |
| 1064 | 1061 |
| 1065 // Shared entry point for floating point multiplication. | 1062 // Shared entry point for floating point multiplication. |
| 1066 Label do_fmul(this), return_result(this); | 1063 Label do_fmul(this), return_result(this); |
| 1067 Variable var_lhs_float64(this, MachineRepresentation::kFloat64), | 1064 Variable var_lhs_float64(this, MachineRepresentation::kFloat64), |
| 1068 var_rhs_float64(this, MachineRepresentation::kFloat64); | 1065 var_rhs_float64(this, MachineRepresentation::kFloat64); |
| 1069 | 1066 |
| 1070 Node* number_map = HeapNumberMapConstant(); | |
| 1071 | |
| 1072 // We might need to loop one or two times due to ToNumber conversions. | 1067 // We might need to loop one or two times due to ToNumber conversions. |
| 1073 Variable var_lhs(this, MachineRepresentation::kTagged), | 1068 Variable var_lhs(this, MachineRepresentation::kTagged), |
| 1074 var_rhs(this, MachineRepresentation::kTagged), | 1069 var_rhs(this, MachineRepresentation::kTagged), |
| 1075 var_result(this, MachineRepresentation::kTagged); | 1070 var_result(this, MachineRepresentation::kTagged); |
| 1076 Variable* loop_variables[] = {&var_lhs, &var_rhs}; | 1071 Variable* loop_variables[] = {&var_lhs, &var_rhs}; |
| 1077 Label loop(this, 2, loop_variables); | 1072 Label loop(this, 2, loop_variables); |
| 1078 var_lhs.Bind(left); | 1073 var_lhs.Bind(left); |
| 1079 var_rhs.Bind(right); | 1074 var_rhs.Bind(right); |
| 1080 Goto(&loop); | 1075 Goto(&loop); |
| 1081 Bind(&loop); | 1076 Bind(&loop); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1098 var_result.Bind(SmiMul(lhs, rhs)); | 1093 var_result.Bind(SmiMul(lhs, rhs)); |
| 1099 Goto(&return_result); | 1094 Goto(&return_result); |
| 1100 } | 1095 } |
| 1101 | 1096 |
| 1102 Bind(&rhs_is_not_smi); | 1097 Bind(&rhs_is_not_smi); |
| 1103 { | 1098 { |
| 1104 Node* rhs_map = LoadMap(rhs); | 1099 Node* rhs_map = LoadMap(rhs); |
| 1105 | 1100 |
| 1106 // Check if {rhs} is a HeapNumber. | 1101 // Check if {rhs} is a HeapNumber. |
| 1107 Label rhs_is_number(this), rhs_is_not_number(this, Label::kDeferred); | 1102 Label rhs_is_number(this), rhs_is_not_number(this, Label::kDeferred); |
| 1108 Branch(WordEqual(rhs_map, number_map), &rhs_is_number, | 1103 Branch(IsHeapNumberMap(rhs_map), &rhs_is_number, &rhs_is_not_number); |
| 1109 &rhs_is_not_number); | |
| 1110 | 1104 |
| 1111 Bind(&rhs_is_number); | 1105 Bind(&rhs_is_number); |
| 1112 { | 1106 { |
| 1113 // Convert {lhs} to a double and multiply it with the value of {rhs}. | 1107 // Convert {lhs} to a double and multiply it with the value of {rhs}. |
| 1114 var_lhs_float64.Bind(SmiToFloat64(lhs)); | 1108 var_lhs_float64.Bind(SmiToFloat64(lhs)); |
| 1115 var_rhs_float64.Bind(LoadHeapNumberValue(rhs)); | 1109 var_rhs_float64.Bind(LoadHeapNumberValue(rhs)); |
| 1116 Goto(&do_fmul); | 1110 Goto(&do_fmul); |
| 1117 } | 1111 } |
| 1118 | 1112 |
| 1119 Bind(&rhs_is_not_number); | 1113 Bind(&rhs_is_not_number); |
| 1120 { | 1114 { |
| 1121 // Multiplication is commutative, swap {lhs} with {rhs} and loop. | 1115 // Multiplication is commutative, swap {lhs} with {rhs} and loop. |
| 1122 var_lhs.Bind(rhs); | 1116 var_lhs.Bind(rhs); |
| 1123 var_rhs.Bind(lhs); | 1117 var_rhs.Bind(lhs); |
| 1124 Goto(&loop); | 1118 Goto(&loop); |
| 1125 } | 1119 } |
| 1126 } | 1120 } |
| 1127 } | 1121 } |
| 1128 | 1122 |
| 1129 Bind(&lhs_is_not_smi); | 1123 Bind(&lhs_is_not_smi); |
| 1130 { | 1124 { |
| 1131 Node* lhs_map = LoadMap(lhs); | 1125 Node* lhs_map = LoadMap(lhs); |
| 1132 | 1126 |
| 1133 // Check if {lhs} is a HeapNumber. | 1127 // Check if {lhs} is a HeapNumber. |
| 1134 Label lhs_is_number(this), lhs_is_not_number(this, Label::kDeferred); | 1128 Label lhs_is_number(this), lhs_is_not_number(this, Label::kDeferred); |
| 1135 Branch(WordEqual(lhs_map, number_map), &lhs_is_number, | 1129 Branch(IsHeapNumberMap(lhs_map), &lhs_is_number, &lhs_is_not_number); |
| 1136 &lhs_is_not_number); | |
| 1137 | 1130 |
| 1138 Bind(&lhs_is_number); | 1131 Bind(&lhs_is_number); |
| 1139 { | 1132 { |
| 1140 // Check if {rhs} is a Smi. | 1133 // Check if {rhs} is a Smi. |
| 1141 Label rhs_is_smi(this), rhs_is_not_smi(this); | 1134 Label rhs_is_smi(this), rhs_is_not_smi(this); |
| 1142 Branch(TaggedIsSmi(rhs), &rhs_is_smi, &rhs_is_not_smi); | 1135 Branch(TaggedIsSmi(rhs), &rhs_is_smi, &rhs_is_not_smi); |
| 1143 | 1136 |
| 1144 Bind(&rhs_is_smi); | 1137 Bind(&rhs_is_smi); |
| 1145 { | 1138 { |
| 1146 // Convert {rhs} to a double and multiply it with the value of {lhs}. | 1139 // Convert {rhs} to a double and multiply it with the value of {lhs}. |
| 1147 var_lhs_float64.Bind(LoadHeapNumberValue(lhs)); | 1140 var_lhs_float64.Bind(LoadHeapNumberValue(lhs)); |
| 1148 var_rhs_float64.Bind(SmiToFloat64(rhs)); | 1141 var_rhs_float64.Bind(SmiToFloat64(rhs)); |
| 1149 Goto(&do_fmul); | 1142 Goto(&do_fmul); |
| 1150 } | 1143 } |
| 1151 | 1144 |
| 1152 Bind(&rhs_is_not_smi); | 1145 Bind(&rhs_is_not_smi); |
| 1153 { | 1146 { |
| 1154 Node* rhs_map = LoadMap(rhs); | 1147 Node* rhs_map = LoadMap(rhs); |
| 1155 | 1148 |
| 1156 // Check if {rhs} is a HeapNumber. | 1149 // Check if {rhs} is a HeapNumber. |
| 1157 Label rhs_is_number(this), rhs_is_not_number(this, Label::kDeferred); | 1150 Label rhs_is_number(this), rhs_is_not_number(this, Label::kDeferred); |
| 1158 Branch(WordEqual(rhs_map, number_map), &rhs_is_number, | 1151 Branch(IsHeapNumberMap(rhs_map), &rhs_is_number, &rhs_is_not_number); |
| 1159 &rhs_is_not_number); | |
| 1160 | 1152 |
| 1161 Bind(&rhs_is_number); | 1153 Bind(&rhs_is_number); |
| 1162 { | 1154 { |
| 1163 // Both {lhs} and {rhs} are HeapNumbers. Load their values and | 1155 // Both {lhs} and {rhs} are HeapNumbers. Load their values and |
| 1164 // multiply them. | 1156 // multiply them. |
| 1165 var_lhs_float64.Bind(LoadHeapNumberValue(lhs)); | 1157 var_lhs_float64.Bind(LoadHeapNumberValue(lhs)); |
| 1166 var_rhs_float64.Bind(LoadHeapNumberValue(rhs)); | 1158 var_rhs_float64.Bind(LoadHeapNumberValue(rhs)); |
| 1167 Goto(&do_fmul); | 1159 Goto(&do_fmul); |
| 1168 } | 1160 } |
| 1169 | 1161 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1202 TF_BUILTIN(Divide, CodeStubAssembler) { | 1194 TF_BUILTIN(Divide, CodeStubAssembler) { |
| 1203 Node* left = Parameter(0); | 1195 Node* left = Parameter(0); |
| 1204 Node* right = Parameter(1); | 1196 Node* right = Parameter(1); |
| 1205 Node* context = Parameter(2); | 1197 Node* context = Parameter(2); |
| 1206 | 1198 |
| 1207 // Shared entry point for floating point division. | 1199 // Shared entry point for floating point division. |
| 1208 Label do_fdiv(this), end(this); | 1200 Label do_fdiv(this), end(this); |
| 1209 Variable var_dividend_float64(this, MachineRepresentation::kFloat64), | 1201 Variable var_dividend_float64(this, MachineRepresentation::kFloat64), |
| 1210 var_divisor_float64(this, MachineRepresentation::kFloat64); | 1202 var_divisor_float64(this, MachineRepresentation::kFloat64); |
| 1211 | 1203 |
| 1212 Node* number_map = HeapNumberMapConstant(); | |
| 1213 | |
| 1214 // We might need to loop one or two times due to ToNumber conversions. | 1204 // We might need to loop one or two times due to ToNumber conversions. |
| 1215 Variable var_dividend(this, MachineRepresentation::kTagged), | 1205 Variable var_dividend(this, MachineRepresentation::kTagged), |
| 1216 var_divisor(this, MachineRepresentation::kTagged), | 1206 var_divisor(this, MachineRepresentation::kTagged), |
| 1217 var_result(this, MachineRepresentation::kTagged); | 1207 var_result(this, MachineRepresentation::kTagged); |
| 1218 Variable* loop_variables[] = {&var_dividend, &var_divisor}; | 1208 Variable* loop_variables[] = {&var_dividend, &var_divisor}; |
| 1219 Label loop(this, 2, loop_variables); | 1209 Label loop(this, 2, loop_variables); |
| 1220 var_dividend.Bind(left); | 1210 var_dividend.Bind(left); |
| 1221 var_divisor.Bind(right); | 1211 var_divisor.Bind(right); |
| 1222 Goto(&loop); | 1212 Goto(&loop); |
| 1223 Bind(&loop); | 1213 Bind(&loop); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1292 } | 1282 } |
| 1293 } | 1283 } |
| 1294 | 1284 |
| 1295 Bind(&divisor_is_not_smi); | 1285 Bind(&divisor_is_not_smi); |
| 1296 { | 1286 { |
| 1297 Node* divisor_map = LoadMap(divisor); | 1287 Node* divisor_map = LoadMap(divisor); |
| 1298 | 1288 |
| 1299 // Check if {divisor} is a HeapNumber. | 1289 // Check if {divisor} is a HeapNumber. |
| 1300 Label divisor_is_number(this), | 1290 Label divisor_is_number(this), |
| 1301 divisor_is_not_number(this, Label::kDeferred); | 1291 divisor_is_not_number(this, Label::kDeferred); |
| 1302 Branch(WordEqual(divisor_map, number_map), &divisor_is_number, | 1292 Branch(IsHeapNumberMap(divisor_map), &divisor_is_number, |
| 1303 &divisor_is_not_number); | 1293 &divisor_is_not_number); |
| 1304 | 1294 |
| 1305 Bind(&divisor_is_number); | 1295 Bind(&divisor_is_number); |
| 1306 { | 1296 { |
| 1307 // Convert {dividend} to a double and divide it with the value of | 1297 // Convert {dividend} to a double and divide it with the value of |
| 1308 // {divisor}. | 1298 // {divisor}. |
| 1309 var_dividend_float64.Bind(SmiToFloat64(dividend)); | 1299 var_dividend_float64.Bind(SmiToFloat64(dividend)); |
| 1310 var_divisor_float64.Bind(LoadHeapNumberValue(divisor)); | 1300 var_divisor_float64.Bind(LoadHeapNumberValue(divisor)); |
| 1311 Goto(&do_fdiv); | 1301 Goto(&do_fdiv); |
| 1312 } | 1302 } |
| 1313 | 1303 |
| 1314 Bind(&divisor_is_not_number); | 1304 Bind(&divisor_is_not_number); |
| 1315 { | 1305 { |
| 1316 // Convert {divisor} to a number and loop. | 1306 // Convert {divisor} to a number and loop. |
| 1317 Callable callable = CodeFactory::NonNumberToNumber(isolate()); | 1307 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1318 var_divisor.Bind(CallStub(callable, context, divisor)); | 1308 var_divisor.Bind(CallStub(callable, context, divisor)); |
| 1319 Goto(&loop); | 1309 Goto(&loop); |
| 1320 } | 1310 } |
| 1321 } | 1311 } |
| 1322 } | 1312 } |
| 1323 | 1313 |
| 1324 Bind(÷nd_is_not_smi); | 1314 Bind(÷nd_is_not_smi); |
| 1325 { | 1315 { |
| 1326 Node* dividend_map = LoadMap(dividend); | 1316 Node* dividend_map = LoadMap(dividend); |
| 1327 | 1317 |
| 1328 // Check if {dividend} is a HeapNumber. | 1318 // Check if {dividend} is a HeapNumber. |
| 1329 Label dividend_is_number(this), | 1319 Label dividend_is_number(this), |
| 1330 dividend_is_not_number(this, Label::kDeferred); | 1320 dividend_is_not_number(this, Label::kDeferred); |
| 1331 Branch(WordEqual(dividend_map, number_map), ÷nd_is_number, | 1321 Branch(IsHeapNumberMap(dividend_map), ÷nd_is_number, |
| 1332 ÷nd_is_not_number); | 1322 ÷nd_is_not_number); |
| 1333 | 1323 |
| 1334 Bind(÷nd_is_number); | 1324 Bind(÷nd_is_number); |
| 1335 { | 1325 { |
| 1336 // Check if {divisor} is a Smi. | 1326 // Check if {divisor} is a Smi. |
| 1337 Label divisor_is_smi(this), divisor_is_not_smi(this); | 1327 Label divisor_is_smi(this), divisor_is_not_smi(this); |
| 1338 Branch(TaggedIsSmi(divisor), &divisor_is_smi, &divisor_is_not_smi); | 1328 Branch(TaggedIsSmi(divisor), &divisor_is_smi, &divisor_is_not_smi); |
| 1339 | 1329 |
| 1340 Bind(&divisor_is_smi); | 1330 Bind(&divisor_is_smi); |
| 1341 { | 1331 { |
| 1342 // Convert {divisor} to a double and use it for a floating point | 1332 // Convert {divisor} to a double and use it for a floating point |
| 1343 // division. | 1333 // division. |
| 1344 var_dividend_float64.Bind(LoadHeapNumberValue(dividend)); | 1334 var_dividend_float64.Bind(LoadHeapNumberValue(dividend)); |
| 1345 var_divisor_float64.Bind(SmiToFloat64(divisor)); | 1335 var_divisor_float64.Bind(SmiToFloat64(divisor)); |
| 1346 Goto(&do_fdiv); | 1336 Goto(&do_fdiv); |
| 1347 } | 1337 } |
| 1348 | 1338 |
| 1349 Bind(&divisor_is_not_smi); | 1339 Bind(&divisor_is_not_smi); |
| 1350 { | 1340 { |
| 1351 Node* divisor_map = LoadMap(divisor); | 1341 Node* divisor_map = LoadMap(divisor); |
| 1352 | 1342 |
| 1353 // Check if {divisor} is a HeapNumber. | 1343 // Check if {divisor} is a HeapNumber. |
| 1354 Label divisor_is_number(this), | 1344 Label divisor_is_number(this), |
| 1355 divisor_is_not_number(this, Label::kDeferred); | 1345 divisor_is_not_number(this, Label::kDeferred); |
| 1356 Branch(WordEqual(divisor_map, number_map), &divisor_is_number, | 1346 Branch(IsHeapNumberMap(divisor_map), &divisor_is_number, |
| 1357 &divisor_is_not_number); | 1347 &divisor_is_not_number); |
| 1358 | 1348 |
| 1359 Bind(&divisor_is_number); | 1349 Bind(&divisor_is_number); |
| 1360 { | 1350 { |
| 1361 // Both {dividend} and {divisor} are HeapNumbers. Load their values | 1351 // Both {dividend} and {divisor} are HeapNumbers. Load their values |
| 1362 // and divide them. | 1352 // and divide them. |
| 1363 var_dividend_float64.Bind(LoadHeapNumberValue(dividend)); | 1353 var_dividend_float64.Bind(LoadHeapNumberValue(dividend)); |
| 1364 var_divisor_float64.Bind(LoadHeapNumberValue(divisor)); | 1354 var_divisor_float64.Bind(LoadHeapNumberValue(divisor)); |
| 1365 Goto(&do_fdiv); | 1355 Goto(&do_fdiv); |
| 1366 } | 1356 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1402 Node* context = Parameter(2); | 1392 Node* context = Parameter(2); |
| 1403 | 1393 |
| 1404 Variable var_result(this, MachineRepresentation::kTagged); | 1394 Variable var_result(this, MachineRepresentation::kTagged); |
| 1405 Label return_result(this, &var_result); | 1395 Label return_result(this, &var_result); |
| 1406 | 1396 |
| 1407 // Shared entry point for floating point modulus. | 1397 // Shared entry point for floating point modulus. |
| 1408 Label do_fmod(this); | 1398 Label do_fmod(this); |
| 1409 Variable var_dividend_float64(this, MachineRepresentation::kFloat64), | 1399 Variable var_dividend_float64(this, MachineRepresentation::kFloat64), |
| 1410 var_divisor_float64(this, MachineRepresentation::kFloat64); | 1400 var_divisor_float64(this, MachineRepresentation::kFloat64); |
| 1411 | 1401 |
| 1412 Node* number_map = HeapNumberMapConstant(); | |
| 1413 | |
| 1414 // We might need to loop one or two times due to ToNumber conversions. | 1402 // We might need to loop one or two times due to ToNumber conversions. |
| 1415 Variable var_dividend(this, MachineRepresentation::kTagged), | 1403 Variable var_dividend(this, MachineRepresentation::kTagged), |
| 1416 var_divisor(this, MachineRepresentation::kTagged); | 1404 var_divisor(this, MachineRepresentation::kTagged); |
| 1417 Variable* loop_variables[] = {&var_dividend, &var_divisor}; | 1405 Variable* loop_variables[] = {&var_dividend, &var_divisor}; |
| 1418 Label loop(this, 2, loop_variables); | 1406 Label loop(this, 2, loop_variables); |
| 1419 var_dividend.Bind(left); | 1407 var_dividend.Bind(left); |
| 1420 var_divisor.Bind(right); | 1408 var_divisor.Bind(right); |
| 1421 Goto(&loop); | 1409 Goto(&loop); |
| 1422 Bind(&loop); | 1410 Bind(&loop); |
| 1423 { | 1411 { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1440 Goto(&return_result); | 1428 Goto(&return_result); |
| 1441 } | 1429 } |
| 1442 | 1430 |
| 1443 Bind(&divisor_is_not_smi); | 1431 Bind(&divisor_is_not_smi); |
| 1444 { | 1432 { |
| 1445 Node* divisor_map = LoadMap(divisor); | 1433 Node* divisor_map = LoadMap(divisor); |
| 1446 | 1434 |
| 1447 // Check if {divisor} is a HeapNumber. | 1435 // Check if {divisor} is a HeapNumber. |
| 1448 Label divisor_is_number(this), | 1436 Label divisor_is_number(this), |
| 1449 divisor_is_not_number(this, Label::kDeferred); | 1437 divisor_is_not_number(this, Label::kDeferred); |
| 1450 Branch(WordEqual(divisor_map, number_map), &divisor_is_number, | 1438 Branch(IsHeapNumberMap(divisor_map), &divisor_is_number, |
| 1451 &divisor_is_not_number); | 1439 &divisor_is_not_number); |
| 1452 | 1440 |
| 1453 Bind(&divisor_is_number); | 1441 Bind(&divisor_is_number); |
| 1454 { | 1442 { |
| 1455 // Convert {dividend} to a double and compute its modulus with the | 1443 // Convert {dividend} to a double and compute its modulus with the |
| 1456 // value of {dividend}. | 1444 // value of {dividend}. |
| 1457 var_dividend_float64.Bind(SmiToFloat64(dividend)); | 1445 var_dividend_float64.Bind(SmiToFloat64(dividend)); |
| 1458 var_divisor_float64.Bind(LoadHeapNumberValue(divisor)); | 1446 var_divisor_float64.Bind(LoadHeapNumberValue(divisor)); |
| 1459 Goto(&do_fmod); | 1447 Goto(&do_fmod); |
| 1460 } | 1448 } |
| 1461 | 1449 |
| 1462 Bind(&divisor_is_not_number); | 1450 Bind(&divisor_is_not_number); |
| 1463 { | 1451 { |
| 1464 // Convert {divisor} to a number and loop. | 1452 // Convert {divisor} to a number and loop. |
| 1465 Callable callable = CodeFactory::NonNumberToNumber(isolate()); | 1453 Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
| 1466 var_divisor.Bind(CallStub(callable, context, divisor)); | 1454 var_divisor.Bind(CallStub(callable, context, divisor)); |
| 1467 Goto(&loop); | 1455 Goto(&loop); |
| 1468 } | 1456 } |
| 1469 } | 1457 } |
| 1470 } | 1458 } |
| 1471 | 1459 |
| 1472 Bind(÷nd_is_not_smi); | 1460 Bind(÷nd_is_not_smi); |
| 1473 { | 1461 { |
| 1474 Node* dividend_map = LoadMap(dividend); | 1462 Node* dividend_map = LoadMap(dividend); |
| 1475 | 1463 |
| 1476 // Check if {dividend} is a HeapNumber. | 1464 // Check if {dividend} is a HeapNumber. |
| 1477 Label dividend_is_number(this), | 1465 Label dividend_is_number(this), |
| 1478 dividend_is_not_number(this, Label::kDeferred); | 1466 dividend_is_not_number(this, Label::kDeferred); |
| 1479 Branch(WordEqual(dividend_map, number_map), ÷nd_is_number, | 1467 Branch(IsHeapNumberMap(dividend_map), ÷nd_is_number, |
| 1480 ÷nd_is_not_number); | 1468 ÷nd_is_not_number); |
| 1481 | 1469 |
| 1482 Bind(÷nd_is_number); | 1470 Bind(÷nd_is_number); |
| 1483 { | 1471 { |
| 1484 // Check if {divisor} is a Smi. | 1472 // Check if {divisor} is a Smi. |
| 1485 Label divisor_is_smi(this), divisor_is_not_smi(this); | 1473 Label divisor_is_smi(this), divisor_is_not_smi(this); |
| 1486 Branch(TaggedIsSmi(divisor), &divisor_is_smi, &divisor_is_not_smi); | 1474 Branch(TaggedIsSmi(divisor), &divisor_is_smi, &divisor_is_not_smi); |
| 1487 | 1475 |
| 1488 Bind(&divisor_is_smi); | 1476 Bind(&divisor_is_smi); |
| 1489 { | 1477 { |
| 1490 // Convert {divisor} to a double and compute {dividend}'s modulus with | 1478 // Convert {divisor} to a double and compute {dividend}'s modulus with |
| 1491 // it. | 1479 // it. |
| 1492 var_dividend_float64.Bind(LoadHeapNumberValue(dividend)); | 1480 var_dividend_float64.Bind(LoadHeapNumberValue(dividend)); |
| 1493 var_divisor_float64.Bind(SmiToFloat64(divisor)); | 1481 var_divisor_float64.Bind(SmiToFloat64(divisor)); |
| 1494 Goto(&do_fmod); | 1482 Goto(&do_fmod); |
| 1495 } | 1483 } |
| 1496 | 1484 |
| 1497 Bind(&divisor_is_not_smi); | 1485 Bind(&divisor_is_not_smi); |
| 1498 { | 1486 { |
| 1499 Node* divisor_map = LoadMap(divisor); | 1487 Node* divisor_map = LoadMap(divisor); |
| 1500 | 1488 |
| 1501 // Check if {divisor} is a HeapNumber. | 1489 // Check if {divisor} is a HeapNumber. |
| 1502 Label divisor_is_number(this), | 1490 Label divisor_is_number(this), |
| 1503 divisor_is_not_number(this, Label::kDeferred); | 1491 divisor_is_not_number(this, Label::kDeferred); |
| 1504 Branch(WordEqual(divisor_map, number_map), &divisor_is_number, | 1492 Branch(IsHeapNumberMap(divisor_map), &divisor_is_number, |
| 1505 &divisor_is_not_number); | 1493 &divisor_is_not_number); |
| 1506 | 1494 |
| 1507 Bind(&divisor_is_number); | 1495 Bind(&divisor_is_number); |
| 1508 { | 1496 { |
| 1509 // Both {dividend} and {divisor} are HeapNumbers. Load their values | 1497 // Both {dividend} and {divisor} are HeapNumbers. Load their values |
| 1510 // and compute their modulus. | 1498 // and compute their modulus. |
| 1511 var_dividend_float64.Bind(LoadHeapNumberValue(dividend)); | 1499 var_dividend_float64.Bind(LoadHeapNumberValue(dividend)); |
| 1512 var_divisor_float64.Bind(LoadHeapNumberValue(divisor)); | 1500 var_divisor_float64.Bind(LoadHeapNumberValue(divisor)); |
| 1513 Goto(&do_fmod); | 1501 Goto(&do_fmod); |
| 1514 } | 1502 } |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1618 TF_BUILTIN(StrictNotEqual, CodeStubAssembler) { | 1606 TF_BUILTIN(StrictNotEqual, CodeStubAssembler) { |
| 1619 Node* lhs = Parameter(0); | 1607 Node* lhs = Parameter(0); |
| 1620 Node* rhs = Parameter(1); | 1608 Node* rhs = Parameter(1); |
| 1621 Node* context = Parameter(2); | 1609 Node* context = Parameter(2); |
| 1622 | 1610 |
| 1623 Return(StrictEqual(kNegateResult, lhs, rhs, context)); | 1611 Return(StrictEqual(kNegateResult, lhs, rhs, context)); |
| 1624 } | 1612 } |
| 1625 | 1613 |
| 1626 } // namespace internal | 1614 } // namespace internal |
| 1627 } // namespace v8 | 1615 } // namespace v8 |
| OLD | NEW |