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 1029 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 // Shared entry point for floating point multiplication. | 1040 // Shared entry point for floating point multiplication. |
1041 Label do_fmul(assembler), if_lhsisnotnumber(assembler, Label::kDeferred), | 1041 Label do_fmul(assembler), if_lhsisnotnumber(assembler, Label::kDeferred), |
1042 check_rhsisoddball(assembler, Label::kDeferred), | 1042 check_rhsisoddball(assembler, Label::kDeferred), |
1043 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), | 1043 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), |
1044 call_multiply_stub(assembler), end(assembler); | 1044 call_multiply_stub(assembler), end(assembler); |
1045 Variable var_lhs_float64(assembler, MachineRepresentation::kFloat64), | 1045 Variable var_lhs_float64(assembler, MachineRepresentation::kFloat64), |
1046 var_rhs_float64(assembler, MachineRepresentation::kFloat64), | 1046 var_rhs_float64(assembler, MachineRepresentation::kFloat64), |
1047 var_result(assembler, MachineRepresentation::kTagged), | 1047 var_result(assembler, MachineRepresentation::kTagged), |
1048 var_type_feedback(assembler, MachineRepresentation::kWord32); | 1048 var_type_feedback(assembler, MachineRepresentation::kWord32); |
1049 | 1049 |
1050 Node* number_map = assembler->HeapNumberMapConstant(); | |
1051 | |
1052 Label lhs_is_smi(assembler), lhs_is_not_smi(assembler); | 1050 Label lhs_is_smi(assembler), lhs_is_not_smi(assembler); |
1053 assembler->Branch(assembler->TaggedIsSmi(lhs), &lhs_is_smi, &lhs_is_not_smi); | 1051 assembler->Branch(assembler->TaggedIsSmi(lhs), &lhs_is_smi, &lhs_is_not_smi); |
1054 | 1052 |
1055 assembler->Bind(&lhs_is_smi); | 1053 assembler->Bind(&lhs_is_smi); |
1056 { | 1054 { |
1057 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); | 1055 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); |
1058 assembler->Branch(assembler->TaggedIsSmi(rhs), &rhs_is_smi, | 1056 assembler->Branch(assembler->TaggedIsSmi(rhs), &rhs_is_smi, |
1059 &rhs_is_not_smi); | 1057 &rhs_is_not_smi); |
1060 | 1058 |
1061 assembler->Bind(&rhs_is_smi); | 1059 assembler->Bind(&rhs_is_smi); |
1062 { | 1060 { |
1063 // Both {lhs} and {rhs} are Smis. The result is not necessarily a smi, | 1061 // Both {lhs} and {rhs} are Smis. The result is not necessarily a smi, |
1064 // in case of overflow. | 1062 // in case of overflow. |
1065 var_result.Bind(assembler->SmiMul(lhs, rhs)); | 1063 var_result.Bind(assembler->SmiMul(lhs, rhs)); |
1066 var_type_feedback.Bind(assembler->Select( | 1064 var_type_feedback.Bind(assembler->Select( |
1067 assembler->TaggedIsSmi(var_result.value()), | 1065 assembler->TaggedIsSmi(var_result.value()), |
1068 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall), | 1066 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall), |
1069 assembler->Int32Constant(BinaryOperationFeedback::kNumber), | 1067 assembler->Int32Constant(BinaryOperationFeedback::kNumber), |
1070 MachineRepresentation::kWord32)); | 1068 MachineRepresentation::kWord32)); |
1071 assembler->Goto(&end); | 1069 assembler->Goto(&end); |
1072 } | 1070 } |
1073 | 1071 |
1074 assembler->Bind(&rhs_is_not_smi); | 1072 assembler->Bind(&rhs_is_not_smi); |
1075 { | 1073 { |
1076 Node* rhs_map = assembler->LoadMap(rhs); | 1074 Node* rhs_map = assembler->LoadMap(rhs); |
1077 | 1075 |
1078 // Check if {rhs} is a HeapNumber. | 1076 // Check if {rhs} is a HeapNumber. |
1079 assembler->GotoUnless(assembler->WordEqual(rhs_map, number_map), | 1077 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), |
1080 &check_rhsisoddball); | 1078 &check_rhsisoddball); |
1081 | 1079 |
1082 // Convert {lhs} to a double and multiply it with the value of {rhs}. | 1080 // Convert {lhs} to a double and multiply it with the value of {rhs}. |
1083 var_lhs_float64.Bind(assembler->SmiToFloat64(lhs)); | 1081 var_lhs_float64.Bind(assembler->SmiToFloat64(lhs)); |
1084 var_rhs_float64.Bind(assembler->LoadHeapNumberValue(rhs)); | 1082 var_rhs_float64.Bind(assembler->LoadHeapNumberValue(rhs)); |
1085 assembler->Goto(&do_fmul); | 1083 assembler->Goto(&do_fmul); |
1086 } | 1084 } |
1087 } | 1085 } |
1088 | 1086 |
1089 assembler->Bind(&lhs_is_not_smi); | 1087 assembler->Bind(&lhs_is_not_smi); |
1090 { | 1088 { |
1091 Node* lhs_map = assembler->LoadMap(lhs); | 1089 Node* lhs_map = assembler->LoadMap(lhs); |
1092 | 1090 |
1093 // Check if {lhs} is a HeapNumber. | 1091 // Check if {lhs} is a HeapNumber. |
1094 assembler->GotoUnless(assembler->WordEqual(lhs_map, number_map), | 1092 assembler->GotoUnless(assembler->IsHeapNumberMap(lhs_map), |
1095 &if_lhsisnotnumber); | 1093 &if_lhsisnotnumber); |
1096 | 1094 |
1097 // Check if {rhs} is a Smi. | 1095 // Check if {rhs} is a Smi. |
1098 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); | 1096 Label rhs_is_smi(assembler), rhs_is_not_smi(assembler); |
1099 assembler->Branch(assembler->TaggedIsSmi(rhs), &rhs_is_smi, | 1097 assembler->Branch(assembler->TaggedIsSmi(rhs), &rhs_is_smi, |
1100 &rhs_is_not_smi); | 1098 &rhs_is_not_smi); |
1101 | 1099 |
1102 assembler->Bind(&rhs_is_smi); | 1100 assembler->Bind(&rhs_is_smi); |
1103 { | 1101 { |
1104 // Convert {rhs} to a double and multiply it with the value of {lhs}. | 1102 // Convert {rhs} to a double and multiply it with the value of {lhs}. |
1105 var_lhs_float64.Bind(assembler->LoadHeapNumberValue(lhs)); | 1103 var_lhs_float64.Bind(assembler->LoadHeapNumberValue(lhs)); |
1106 var_rhs_float64.Bind(assembler->SmiToFloat64(rhs)); | 1104 var_rhs_float64.Bind(assembler->SmiToFloat64(rhs)); |
1107 assembler->Goto(&do_fmul); | 1105 assembler->Goto(&do_fmul); |
1108 } | 1106 } |
1109 | 1107 |
1110 assembler->Bind(&rhs_is_not_smi); | 1108 assembler->Bind(&rhs_is_not_smi); |
1111 { | 1109 { |
1112 Node* rhs_map = assembler->LoadMap(rhs); | 1110 Node* rhs_map = assembler->LoadMap(rhs); |
1113 | 1111 |
1114 // Check if {rhs} is a HeapNumber. | 1112 // Check if {rhs} is a HeapNumber. |
1115 assembler->GotoUnless(assembler->WordEqual(rhs_map, number_map), | 1113 assembler->GotoUnless(assembler->IsHeapNumberMap(rhs_map), |
1116 &check_rhsisoddball); | 1114 &check_rhsisoddball); |
1117 | 1115 |
1118 // Both {lhs} and {rhs} are HeapNumbers. Load their values and | 1116 // Both {lhs} and {rhs} are HeapNumbers. Load their values and |
1119 // multiply them. | 1117 // multiply them. |
1120 var_lhs_float64.Bind(assembler->LoadHeapNumberValue(lhs)); | 1118 var_lhs_float64.Bind(assembler->LoadHeapNumberValue(lhs)); |
1121 var_rhs_float64.Bind(assembler->LoadHeapNumberValue(rhs)); | 1119 var_rhs_float64.Bind(assembler->LoadHeapNumberValue(rhs)); |
1122 assembler->Goto(&do_fmul); | 1120 assembler->Goto(&do_fmul); |
1123 } | 1121 } |
1124 } | 1122 } |
1125 | 1123 |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1204 // Shared entry point for floating point division. | 1202 // Shared entry point for floating point division. |
1205 Label do_fdiv(assembler), dividend_is_not_number(assembler, Label::kDeferred), | 1203 Label do_fdiv(assembler), dividend_is_not_number(assembler, Label::kDeferred), |
1206 check_divisor_for_oddball(assembler, Label::kDeferred), | 1204 check_divisor_for_oddball(assembler, Label::kDeferred), |
1207 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), | 1205 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), |
1208 call_divide_stub(assembler), end(assembler); | 1206 call_divide_stub(assembler), end(assembler); |
1209 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), | 1207 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), |
1210 var_divisor_float64(assembler, MachineRepresentation::kFloat64), | 1208 var_divisor_float64(assembler, MachineRepresentation::kFloat64), |
1211 var_result(assembler, MachineRepresentation::kTagged), | 1209 var_result(assembler, MachineRepresentation::kTagged), |
1212 var_type_feedback(assembler, MachineRepresentation::kWord32); | 1210 var_type_feedback(assembler, MachineRepresentation::kWord32); |
1213 | 1211 |
1214 Node* number_map = assembler->HeapNumberMapConstant(); | |
1215 | |
1216 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); | 1212 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); |
1217 assembler->Branch(assembler->TaggedIsSmi(dividend), ÷nd_is_smi, | 1213 assembler->Branch(assembler->TaggedIsSmi(dividend), ÷nd_is_smi, |
1218 ÷nd_is_not_smi); | 1214 ÷nd_is_not_smi); |
1219 | 1215 |
1220 assembler->Bind(÷nd_is_smi); | 1216 assembler->Bind(÷nd_is_smi); |
1221 { | 1217 { |
1222 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 1218 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |
1223 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, | 1219 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, |
1224 &divisor_is_not_smi); | 1220 &divisor_is_not_smi); |
1225 | 1221 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1290 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); | 1286 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); |
1291 assembler->Goto(&do_fdiv); | 1287 assembler->Goto(&do_fdiv); |
1292 } | 1288 } |
1293 } | 1289 } |
1294 | 1290 |
1295 assembler->Bind(&divisor_is_not_smi); | 1291 assembler->Bind(&divisor_is_not_smi); |
1296 { | 1292 { |
1297 Node* divisor_map = assembler->LoadMap(divisor); | 1293 Node* divisor_map = assembler->LoadMap(divisor); |
1298 | 1294 |
1299 // Check if {divisor} is a HeapNumber. | 1295 // Check if {divisor} is a HeapNumber. |
1300 assembler->GotoUnless(assembler->WordEqual(divisor_map, number_map), | 1296 assembler->GotoUnless(assembler->IsHeapNumberMap(divisor_map), |
1301 &check_divisor_for_oddball); | 1297 &check_divisor_for_oddball); |
1302 | 1298 |
1303 // Convert {dividend} to a double and divide it with the value of | 1299 // Convert {dividend} to a double and divide it with the value of |
1304 // {divisor}. | 1300 // {divisor}. |
1305 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); | 1301 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); |
1306 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); | 1302 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); |
1307 assembler->Goto(&do_fdiv); | 1303 assembler->Goto(&do_fdiv); |
1308 } | 1304 } |
1309 | 1305 |
1310 assembler->Bind(÷nd_is_not_smi); | 1306 assembler->Bind(÷nd_is_not_smi); |
1311 { | 1307 { |
1312 Node* dividend_map = assembler->LoadMap(dividend); | 1308 Node* dividend_map = assembler->LoadMap(dividend); |
1313 | 1309 |
1314 // Check if {dividend} is a HeapNumber. | 1310 // Check if {dividend} is a HeapNumber. |
1315 assembler->GotoUnless(assembler->WordEqual(dividend_map, number_map), | 1311 assembler->GotoUnless(assembler->IsHeapNumberMap(dividend_map), |
1316 ÷nd_is_not_number); | 1312 ÷nd_is_not_number); |
1317 | 1313 |
1318 // Check if {divisor} is a Smi. | 1314 // Check if {divisor} is a Smi. |
1319 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 1315 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |
1320 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, | 1316 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, |
1321 &divisor_is_not_smi); | 1317 &divisor_is_not_smi); |
1322 | 1318 |
1323 assembler->Bind(&divisor_is_smi); | 1319 assembler->Bind(&divisor_is_smi); |
1324 { | 1320 { |
1325 // Convert {divisor} to a double and use it for a floating point | 1321 // Convert {divisor} to a double and use it for a floating point |
1326 // division. | 1322 // division. |
1327 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); | 1323 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); |
1328 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); | 1324 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); |
1329 assembler->Goto(&do_fdiv); | 1325 assembler->Goto(&do_fdiv); |
1330 } | 1326 } |
1331 | 1327 |
1332 assembler->Bind(&divisor_is_not_smi); | 1328 assembler->Bind(&divisor_is_not_smi); |
1333 { | 1329 { |
1334 Node* divisor_map = assembler->LoadMap(divisor); | 1330 Node* divisor_map = assembler->LoadMap(divisor); |
1335 | 1331 |
1336 // Check if {divisor} is a HeapNumber. | 1332 // Check if {divisor} is a HeapNumber. |
1337 assembler->GotoUnless(assembler->WordEqual(divisor_map, number_map), | 1333 assembler->GotoUnless(assembler->IsHeapNumberMap(divisor_map), |
1338 &check_divisor_for_oddball); | 1334 &check_divisor_for_oddball); |
1339 | 1335 |
1340 // Both {dividend} and {divisor} are HeapNumbers. Load their values | 1336 // Both {dividend} and {divisor} are HeapNumbers. Load their values |
1341 // and divide them. | 1337 // and divide them. |
1342 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); | 1338 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); |
1343 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); | 1339 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); |
1344 assembler->Goto(&do_fdiv); | 1340 assembler->Goto(&do_fdiv); |
1345 } | 1341 } |
1346 } | 1342 } |
1347 } | 1343 } |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1426 // Shared entry point for floating point division. | 1422 // Shared entry point for floating point division. |
1427 Label do_fmod(assembler), dividend_is_not_number(assembler, Label::kDeferred), | 1423 Label do_fmod(assembler), dividend_is_not_number(assembler, Label::kDeferred), |
1428 check_divisor_for_oddball(assembler, Label::kDeferred), | 1424 check_divisor_for_oddball(assembler, Label::kDeferred), |
1429 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), | 1425 call_with_oddball_feedback(assembler), call_with_any_feedback(assembler), |
1430 call_modulus_stub(assembler), end(assembler); | 1426 call_modulus_stub(assembler), end(assembler); |
1431 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), | 1427 Variable var_dividend_float64(assembler, MachineRepresentation::kFloat64), |
1432 var_divisor_float64(assembler, MachineRepresentation::kFloat64), | 1428 var_divisor_float64(assembler, MachineRepresentation::kFloat64), |
1433 var_result(assembler, MachineRepresentation::kTagged), | 1429 var_result(assembler, MachineRepresentation::kTagged), |
1434 var_type_feedback(assembler, MachineRepresentation::kWord32); | 1430 var_type_feedback(assembler, MachineRepresentation::kWord32); |
1435 | 1431 |
1436 Node* number_map = assembler->HeapNumberMapConstant(); | |
1437 | |
1438 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); | 1432 Label dividend_is_smi(assembler), dividend_is_not_smi(assembler); |
1439 assembler->Branch(assembler->TaggedIsSmi(dividend), ÷nd_is_smi, | 1433 assembler->Branch(assembler->TaggedIsSmi(dividend), ÷nd_is_smi, |
1440 ÷nd_is_not_smi); | 1434 ÷nd_is_not_smi); |
1441 | 1435 |
1442 assembler->Bind(÷nd_is_smi); | 1436 assembler->Bind(÷nd_is_smi); |
1443 { | 1437 { |
1444 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 1438 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |
1445 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, | 1439 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, |
1446 &divisor_is_not_smi); | 1440 &divisor_is_not_smi); |
1447 | 1441 |
1448 assembler->Bind(&divisor_is_smi); | 1442 assembler->Bind(&divisor_is_smi); |
1449 { | 1443 { |
1450 var_result.Bind(assembler->SmiMod(dividend, divisor)); | 1444 var_result.Bind(assembler->SmiMod(dividend, divisor)); |
1451 var_type_feedback.Bind(assembler->Select( | 1445 var_type_feedback.Bind(assembler->Select( |
1452 assembler->TaggedIsSmi(var_result.value()), | 1446 assembler->TaggedIsSmi(var_result.value()), |
1453 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall), | 1447 assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall), |
1454 assembler->Int32Constant(BinaryOperationFeedback::kNumber))); | 1448 assembler->Int32Constant(BinaryOperationFeedback::kNumber))); |
1455 assembler->Goto(&end); | 1449 assembler->Goto(&end); |
1456 } | 1450 } |
1457 | 1451 |
1458 assembler->Bind(&divisor_is_not_smi); | 1452 assembler->Bind(&divisor_is_not_smi); |
1459 { | 1453 { |
1460 Node* divisor_map = assembler->LoadMap(divisor); | 1454 Node* divisor_map = assembler->LoadMap(divisor); |
1461 | 1455 |
1462 // Check if {divisor} is a HeapNumber. | 1456 // Check if {divisor} is a HeapNumber. |
1463 assembler->GotoUnless(assembler->WordEqual(divisor_map, number_map), | 1457 assembler->GotoUnless(assembler->IsHeapNumberMap(divisor_map), |
1464 &check_divisor_for_oddball); | 1458 &check_divisor_for_oddball); |
1465 | 1459 |
1466 // Convert {dividend} to a double and divide it with the value of | 1460 // Convert {dividend} to a double and divide it with the value of |
1467 // {divisor}. | 1461 // {divisor}. |
1468 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); | 1462 var_dividend_float64.Bind(assembler->SmiToFloat64(dividend)); |
1469 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); | 1463 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); |
1470 assembler->Goto(&do_fmod); | 1464 assembler->Goto(&do_fmod); |
1471 } | 1465 } |
1472 } | 1466 } |
1473 | 1467 |
1474 assembler->Bind(÷nd_is_not_smi); | 1468 assembler->Bind(÷nd_is_not_smi); |
1475 { | 1469 { |
1476 Node* dividend_map = assembler->LoadMap(dividend); | 1470 Node* dividend_map = assembler->LoadMap(dividend); |
1477 | 1471 |
1478 // Check if {dividend} is a HeapNumber. | 1472 // Check if {dividend} is a HeapNumber. |
1479 assembler->GotoUnless(assembler->WordEqual(dividend_map, number_map), | 1473 assembler->GotoUnless(assembler->IsHeapNumberMap(dividend_map), |
1480 ÷nd_is_not_number); | 1474 ÷nd_is_not_number); |
1481 | 1475 |
1482 // Check if {divisor} is a Smi. | 1476 // Check if {divisor} is a Smi. |
1483 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); | 1477 Label divisor_is_smi(assembler), divisor_is_not_smi(assembler); |
1484 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, | 1478 assembler->Branch(assembler->TaggedIsSmi(divisor), &divisor_is_smi, |
1485 &divisor_is_not_smi); | 1479 &divisor_is_not_smi); |
1486 | 1480 |
1487 assembler->Bind(&divisor_is_smi); | 1481 assembler->Bind(&divisor_is_smi); |
1488 { | 1482 { |
1489 // Convert {divisor} to a double and use it for a floating point | 1483 // Convert {divisor} to a double and use it for a floating point |
1490 // division. | 1484 // division. |
1491 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); | 1485 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); |
1492 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); | 1486 var_divisor_float64.Bind(assembler->SmiToFloat64(divisor)); |
1493 assembler->Goto(&do_fmod); | 1487 assembler->Goto(&do_fmod); |
1494 } | 1488 } |
1495 | 1489 |
1496 assembler->Bind(&divisor_is_not_smi); | 1490 assembler->Bind(&divisor_is_not_smi); |
1497 { | 1491 { |
1498 Node* divisor_map = assembler->LoadMap(divisor); | 1492 Node* divisor_map = assembler->LoadMap(divisor); |
1499 | 1493 |
1500 // Check if {divisor} is a HeapNumber. | 1494 // Check if {divisor} is a HeapNumber. |
1501 assembler->GotoUnless(assembler->WordEqual(divisor_map, number_map), | 1495 assembler->GotoUnless(assembler->IsHeapNumberMap(divisor_map), |
1502 &check_divisor_for_oddball); | 1496 &check_divisor_for_oddball); |
1503 | 1497 |
1504 // Both {dividend} and {divisor} are HeapNumbers. Load their values | 1498 // Both {dividend} and {divisor} are HeapNumbers. Load their values |
1505 // and divide them. | 1499 // and divide them. |
1506 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); | 1500 var_dividend_float64.Bind(assembler->LoadHeapNumberValue(dividend)); |
1507 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); | 1501 var_divisor_float64.Bind(assembler->LoadHeapNumberValue(divisor)); |
1508 assembler->Goto(&do_fmod); | 1502 assembler->Goto(&do_fmod); |
1509 } | 1503 } |
1510 } | 1504 } |
1511 | 1505 |
(...skipping 1700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3212 } | 3206 } |
3213 | 3207 |
3214 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 3208 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) |
3215 : PlatformCodeStub(isolate) {} | 3209 : PlatformCodeStub(isolate) {} |
3216 | 3210 |
3217 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) | 3211 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) |
3218 : PlatformCodeStub(isolate) {} | 3212 : PlatformCodeStub(isolate) {} |
3219 | 3213 |
3220 } // namespace internal | 3214 } // namespace internal |
3221 } // namespace v8 | 3215 } // namespace v8 |
OLD | NEW |