OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/compiler/simplified-lowering.h" | 5 #include "src/compiler/simplified-lowering.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/address-map.h" | 9 #include "src/address-map.h" |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
(...skipping 1112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1123 | 1123 |
1124 if (hint == BinaryOperationHints::kSignedSmall || | 1124 if (hint == BinaryOperationHints::kSignedSmall || |
1125 hint == BinaryOperationHints::kSigned32) { | 1125 hint == BinaryOperationHints::kSigned32) { |
1126 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), | 1126 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |
1127 MachineRepresentation::kWord32, Type::Signed32()); | 1127 MachineRepresentation::kWord32, Type::Signed32()); |
1128 if (lower()) ChangeToInt32OverflowOp(node); | 1128 if (lower()) ChangeToInt32OverflowOp(node); |
1129 return; | 1129 return; |
1130 } | 1130 } |
1131 | 1131 |
1132 // default case => Float64Add/Sub | 1132 // default case => Float64Add/Sub |
1133 VisitBinop(node, UseInfo::CheckedNumberOrUndefinedAsFloat64(), | 1133 VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
1134 MachineRepresentation::kFloat64, Type::Number()); | 1134 MachineRepresentation::kFloat64, Type::Number()); |
1135 if (lower()) { | 1135 if (lower()) { |
1136 ChangeToPureOp(node, Float64Op(node)); | 1136 ChangeToPureOp(node, Float64Op(node)); |
1137 } | 1137 } |
1138 return; | 1138 return; |
1139 } | 1139 } |
1140 | 1140 |
1141 // Dispatching routine for visiting the node {node} with the usage {use}. | 1141 // Dispatching routine for visiting the node {node} with the usage {use}. |
1142 // Depending on the operator, propagate new usage info to the inputs. | 1142 // Depending on the operator, propagate new usage info to the inputs. |
1143 void VisitNode(Node* node, Truncation truncation, | 1143 void VisitNode(Node* node, Truncation truncation, |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1276 } | 1276 } |
1277 // Try to use type feedback. | 1277 // Try to use type feedback. |
1278 CompareOperationHints::Hint hint = CompareOperationHintOf(node->op()); | 1278 CompareOperationHints::Hint hint = CompareOperationHintOf(node->op()); |
1279 | 1279 |
1280 if (hint == CompareOperationHints::kSignedSmall) { | 1280 if (hint == CompareOperationHints::kSignedSmall) { |
1281 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), | 1281 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |
1282 MachineRepresentation::kBit); | 1282 MachineRepresentation::kBit); |
1283 if (lower()) ChangeToPureOp(node, Int32Op(node)); | 1283 if (lower()) ChangeToPureOp(node, Int32Op(node)); |
1284 return; | 1284 return; |
1285 } | 1285 } |
1286 DCHECK_EQ(CompareOperationHints::kNumber, hint); | 1286 DCHECK_EQ(CompareOperationHints::kNumberOrOddball, hint); |
1287 // default case => Float64 comparison | 1287 // default case => Float64 comparison |
1288 VisitBinop(node, UseInfo::CheckedNumberOrUndefinedAsFloat64(), | 1288 VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
1289 MachineRepresentation::kBit); | 1289 MachineRepresentation::kBit); |
1290 if (lower()) ChangeToPureOp(node, Float64Op(node)); | 1290 if (lower()) ChangeToPureOp(node, Float64Op(node)); |
1291 return; | 1291 return; |
1292 } | 1292 } |
1293 | 1293 |
1294 case IrOpcode::kNumberAdd: | 1294 case IrOpcode::kNumberAdd: |
1295 case IrOpcode::kNumberSubtract: { | 1295 case IrOpcode::kNumberSubtract: { |
1296 if (BothInputsAre(node, Type::Signed32()) && | 1296 if (BothInputsAre(node, Type::Signed32()) && |
1297 NodeProperties::GetType(node)->Is(Type::Signed32())) { | 1297 NodeProperties::GetType(node)->Is(Type::Signed32())) { |
1298 // int32 + int32 = int32 | 1298 // int32 + int32 = int32 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1331 return; | 1331 return; |
1332 } | 1332 } |
1333 // Number x Number => Float64Mul | 1333 // Number x Number => Float64Mul |
1334 if (BothInputsAre(node, Type::NumberOrUndefined())) { | 1334 if (BothInputsAre(node, Type::NumberOrUndefined())) { |
1335 VisitFloat64Binop(node); | 1335 VisitFloat64Binop(node); |
1336 if (lower()) ChangeToPureOp(node, Float64Op(node)); | 1336 if (lower()) ChangeToPureOp(node, Float64Op(node)); |
1337 return; | 1337 return; |
1338 } | 1338 } |
1339 // Checked float64 x float64 => float64 | 1339 // Checked float64 x float64 => float64 |
1340 DCHECK_EQ(IrOpcode::kSpeculativeNumberMultiply, node->opcode()); | 1340 DCHECK_EQ(IrOpcode::kSpeculativeNumberMultiply, node->opcode()); |
1341 VisitBinop(node, UseInfo::CheckedNumberOrUndefinedAsFloat64(), | 1341 VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
1342 MachineRepresentation::kFloat64, Type::Number()); | 1342 MachineRepresentation::kFloat64, Type::Number()); |
1343 if (lower()) ChangeToPureOp(node, Float64Op(node)); | 1343 if (lower()) ChangeToPureOp(node, Float64Op(node)); |
1344 return; | 1344 return; |
1345 } | 1345 } |
1346 case IrOpcode::kSpeculativeNumberDivide: { | 1346 case IrOpcode::kSpeculativeNumberDivide: { |
1347 if (BothInputsAreUnsigned32(node) && truncation.TruncatesToWord32()) { | 1347 if (BothInputsAreUnsigned32(node) && truncation.TruncatesToWord32()) { |
1348 // => unsigned Uint32Div | 1348 // => unsigned Uint32Div |
1349 VisitWord32TruncatingBinop(node); | 1349 VisitWord32TruncatingBinop(node); |
1350 if (lower()) DeferReplacement(node, lowering->Uint32Div(node)); | 1350 if (lower()) DeferReplacement(node, lowering->Uint32Div(node)); |
1351 return; | 1351 return; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1402 if (lower()) DeferReplacement(node, lowering->Int32Div(node)); | 1402 if (lower()) DeferReplacement(node, lowering->Int32Div(node)); |
1403 } else { | 1403 } else { |
1404 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), | 1404 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |
1405 MachineRepresentation::kWord32, Type::Signed32()); | 1405 MachineRepresentation::kWord32, Type::Signed32()); |
1406 if (lower()) ChangeToInt32OverflowOp(node); | 1406 if (lower()) ChangeToInt32OverflowOp(node); |
1407 } | 1407 } |
1408 return; | 1408 return; |
1409 } | 1409 } |
1410 | 1410 |
1411 // default case => Float64Div | 1411 // default case => Float64Div |
1412 VisitBinop(node, UseInfo::CheckedNumberOrUndefinedAsFloat64(), | 1412 VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
1413 MachineRepresentation::kFloat64, Type::Number()); | 1413 MachineRepresentation::kFloat64, Type::Number()); |
1414 if (lower()) ChangeToPureOp(node, Float64Op(node)); | 1414 if (lower()) ChangeToPureOp(node, Float64Op(node)); |
1415 return; | 1415 return; |
1416 } | 1416 } |
1417 case IrOpcode::kNumberDivide: { | 1417 case IrOpcode::kNumberDivide: { |
1418 if (BothInputsAreUnsigned32(node) && truncation.TruncatesToWord32()) { | 1418 if (BothInputsAreUnsigned32(node) && truncation.TruncatesToWord32()) { |
1419 // => unsigned Uint32Div | 1419 // => unsigned Uint32Div |
1420 VisitWord32TruncatingBinop(node); | 1420 VisitWord32TruncatingBinop(node); |
1421 if (lower()) DeferReplacement(node, lowering->Uint32Div(node)); | 1421 if (lower()) DeferReplacement(node, lowering->Uint32Div(node)); |
1422 return; | 1422 return; |
(...skipping 13 matching lines...) Expand all Loading... |
1436 } | 1436 } |
1437 } | 1437 } |
1438 // Number x Number => Float64Div | 1438 // Number x Number => Float64Div |
1439 if (BothInputsAre(node, Type::NumberOrUndefined())) { | 1439 if (BothInputsAre(node, Type::NumberOrUndefined())) { |
1440 VisitFloat64Binop(node); | 1440 VisitFloat64Binop(node); |
1441 if (lower()) ChangeToPureOp(node, Float64Op(node)); | 1441 if (lower()) ChangeToPureOp(node, Float64Op(node)); |
1442 return; | 1442 return; |
1443 } | 1443 } |
1444 // Checked float64 x float64 => float64 | 1444 // Checked float64 x float64 => float64 |
1445 DCHECK_EQ(IrOpcode::kSpeculativeNumberDivide, node->opcode()); | 1445 DCHECK_EQ(IrOpcode::kSpeculativeNumberDivide, node->opcode()); |
1446 VisitBinop(node, UseInfo::CheckedNumberOrUndefinedAsFloat64(), | 1446 VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
1447 MachineRepresentation::kFloat64, Type::Number()); | 1447 MachineRepresentation::kFloat64, Type::Number()); |
1448 if (lower()) ChangeToPureOp(node, Float64Op(node)); | 1448 if (lower()) ChangeToPureOp(node, Float64Op(node)); |
1449 return; | 1449 return; |
1450 } | 1450 } |
1451 case IrOpcode::kSpeculativeNumberModulus: { | 1451 case IrOpcode::kSpeculativeNumberModulus: { |
1452 if (BothInputsAreUnsigned32(node) && truncation.TruncatesToWord32()) { | 1452 if (BothInputsAreUnsigned32(node) && truncation.TruncatesToWord32()) { |
1453 // => unsigned Uint32Mod | 1453 // => unsigned Uint32Mod |
1454 VisitWord32TruncatingBinop(node); | 1454 VisitWord32TruncatingBinop(node); |
1455 if (lower()) DeferReplacement(node, lowering->Uint32Mod(node)); | 1455 if (lower()) DeferReplacement(node, lowering->Uint32Mod(node)); |
1456 return; | 1456 return; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1507 if (lower()) DeferReplacement(node, lowering->Int32Mod(node)); | 1507 if (lower()) DeferReplacement(node, lowering->Int32Mod(node)); |
1508 } else { | 1508 } else { |
1509 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), | 1509 VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |
1510 MachineRepresentation::kWord32, Type::Signed32()); | 1510 MachineRepresentation::kWord32, Type::Signed32()); |
1511 if (lower()) ChangeToInt32OverflowOp(node); | 1511 if (lower()) ChangeToInt32OverflowOp(node); |
1512 } | 1512 } |
1513 return; | 1513 return; |
1514 } | 1514 } |
1515 | 1515 |
1516 // default case => Float64Mod | 1516 // default case => Float64Mod |
1517 VisitBinop(node, UseInfo::CheckedNumberOrUndefinedAsFloat64(), | 1517 VisitBinop(node, UseInfo::CheckedNumberOrOddballAsFloat64(), |
1518 MachineRepresentation::kFloat64, Type::Number()); | 1518 MachineRepresentation::kFloat64, Type::Number()); |
1519 if (lower()) ChangeToPureOp(node, Float64Op(node)); | 1519 if (lower()) ChangeToPureOp(node, Float64Op(node)); |
1520 return; | 1520 return; |
1521 } | 1521 } |
1522 case IrOpcode::kNumberModulus: { | 1522 case IrOpcode::kNumberModulus: { |
1523 if (BothInputsAreUnsigned32(node) && truncation.TruncatesToWord32()) { | 1523 if (BothInputsAreUnsigned32(node) && truncation.TruncatesToWord32()) { |
1524 // => unsigned Uint32Mod | 1524 // => unsigned Uint32Mod |
1525 VisitWord32TruncatingBinop(node); | 1525 VisitWord32TruncatingBinop(node); |
1526 if (lower()) DeferReplacement(node, lowering->Uint32Mod(node)); | 1526 if (lower()) DeferReplacement(node, lowering->Uint32Mod(node)); |
1527 return; | 1527 return; |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1962 return; | 1962 return; |
1963 } | 1963 } |
1964 case IrOpcode::kPlainPrimitiveToNumber: { | 1964 case IrOpcode::kPlainPrimitiveToNumber: { |
1965 if (InputIs(node, Type::Boolean())) { | 1965 if (InputIs(node, Type::Boolean())) { |
1966 VisitUnop(node, UseInfo::Bool(), MachineRepresentation::kWord32); | 1966 VisitUnop(node, UseInfo::Bool(), MachineRepresentation::kWord32); |
1967 if (lower()) DeferReplacement(node, node->InputAt(0)); | 1967 if (lower()) DeferReplacement(node, node->InputAt(0)); |
1968 } else if (InputIs(node, Type::String())) { | 1968 } else if (InputIs(node, Type::String())) { |
1969 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); | 1969 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); |
1970 if (lower()) lowering->DoStringToNumber(node); | 1970 if (lower()) lowering->DoStringToNumber(node); |
1971 } else if (truncation.TruncatesToWord32()) { | 1971 } else if (truncation.TruncatesToWord32()) { |
1972 // TODO(jarin): Extend this to Number \/ Oddball | 1972 if (InputIs(node, Type::NumberOrOddball())) { |
1973 if (InputIs(node, Type::NumberOrUndefined())) { | |
1974 VisitUnop(node, UseInfo::TruncatingWord32(), | 1973 VisitUnop(node, UseInfo::TruncatingWord32(), |
1975 MachineRepresentation::kWord32); | 1974 MachineRepresentation::kWord32); |
1976 if (lower()) DeferReplacement(node, node->InputAt(0)); | 1975 if (lower()) DeferReplacement(node, node->InputAt(0)); |
1977 } else { | 1976 } else { |
1978 VisitUnop(node, UseInfo::AnyTagged(), | 1977 VisitUnop(node, UseInfo::AnyTagged(), |
1979 MachineRepresentation::kWord32); | 1978 MachineRepresentation::kWord32); |
1980 if (lower()) { | 1979 if (lower()) { |
1981 NodeProperties::ChangeOp(node, | 1980 NodeProperties::ChangeOp(node, |
1982 simplified()->PlainPrimitiveToWord32()); | 1981 simplified()->PlainPrimitiveToWord32()); |
1983 } | 1982 } |
1984 } | 1983 } |
1985 } else if (truncation.TruncatesToFloat64()) { | 1984 } else if (truncation.TruncatesToFloat64()) { |
1986 // TODO(jarin): Extend this to Number \/ Oddball | 1985 if (InputIs(node, Type::NumberOrOddball())) { |
1987 if (InputIs(node, Type::NumberOrUndefined())) { | |
1988 VisitUnop(node, UseInfo::TruncatingFloat64(), | 1986 VisitUnop(node, UseInfo::TruncatingFloat64(), |
1989 MachineRepresentation::kFloat64); | 1987 MachineRepresentation::kFloat64); |
1990 if (lower()) DeferReplacement(node, node->InputAt(0)); | 1988 if (lower()) DeferReplacement(node, node->InputAt(0)); |
1991 } else { | 1989 } else { |
1992 VisitUnop(node, UseInfo::AnyTagged(), | 1990 VisitUnop(node, UseInfo::AnyTagged(), |
1993 MachineRepresentation::kFloat64); | 1991 MachineRepresentation::kFloat64); |
1994 if (lower()) { | 1992 if (lower()) { |
1995 NodeProperties::ChangeOp(node, | 1993 NodeProperties::ChangeOp(node, |
1996 simplified()->PlainPrimitiveToFloat64()); | 1994 simplified()->PlainPrimitiveToFloat64()); |
1997 } | 1995 } |
(...skipping 1273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3271 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3269 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
3272 Operator::kNoProperties); | 3270 Operator::kNoProperties); |
3273 to_number_operator_.set(common()->Call(desc)); | 3271 to_number_operator_.set(common()->Call(desc)); |
3274 } | 3272 } |
3275 return to_number_operator_.get(); | 3273 return to_number_operator_.get(); |
3276 } | 3274 } |
3277 | 3275 |
3278 } // namespace compiler | 3276 } // namespace compiler |
3279 } // namespace internal | 3277 } // namespace internal |
3280 } // namespace v8 | 3278 } // namespace v8 |
OLD | NEW |