| 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 |