| 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 1745 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1756 MachineRepresentation::kFloat64); | 1756 MachineRepresentation::kFloat64); |
| 1757 if (lower()) DeferReplacement(node, lowering->Float64Floor(node)); | 1757 if (lower()) DeferReplacement(node, lowering->Float64Floor(node)); |
| 1758 return; | 1758 return; |
| 1759 } | 1759 } |
| 1760 case IrOpcode::kNumberFround: { | 1760 case IrOpcode::kNumberFround: { |
| 1761 VisitUnop(node, UseInfo::TruncatingFloat64(), | 1761 VisitUnop(node, UseInfo::TruncatingFloat64(), |
| 1762 MachineRepresentation::kFloat32); | 1762 MachineRepresentation::kFloat32); |
| 1763 if (lower()) NodeProperties::ChangeOp(node, Float64Op(node)); | 1763 if (lower()) NodeProperties::ChangeOp(node, Float64Op(node)); |
| 1764 return; | 1764 return; |
| 1765 } | 1765 } |
| 1766 case IrOpcode::kNumberMax: { |
| 1767 // TODO(turbofan): We should consider feedback types here as well. |
| 1768 if (BothInputsAreUnsigned32(node)) { |
| 1769 VisitUint32Binop(node); |
| 1770 if (lower()) { |
| 1771 lowering->DoMax(node, lowering->machine()->Uint32LessThan(), |
| 1772 MachineRepresentation::kWord32); |
| 1773 } |
| 1774 } else if (BothInputsAreSigned32(node)) { |
| 1775 VisitInt32Binop(node); |
| 1776 if (lower()) { |
| 1777 lowering->DoMax(node, lowering->machine()->Int32LessThan(), |
| 1778 MachineRepresentation::kWord32); |
| 1779 } |
| 1780 } else if (BothInputsAre(node, Type::PlainNumber())) { |
| 1781 VisitFloat64Binop(node); |
| 1782 if (lower()) { |
| 1783 lowering->DoMax(node, lowering->machine()->Float64LessThan(), |
| 1784 MachineRepresentation::kFloat64); |
| 1785 } |
| 1786 } else { |
| 1787 VisitFloat64Binop(node); |
| 1788 if (lower()) NodeProperties::ChangeOp(node, Float64Op(node)); |
| 1789 } |
| 1790 return; |
| 1791 } |
| 1792 case IrOpcode::kNumberMin: { |
| 1793 // TODO(turbofan): We should consider feedback types here as well. |
| 1794 if (BothInputsAreUnsigned32(node)) { |
| 1795 VisitUint32Binop(node); |
| 1796 if (lower()) { |
| 1797 lowering->DoMin(node, lowering->machine()->Uint32LessThan(), |
| 1798 MachineRepresentation::kWord32); |
| 1799 } |
| 1800 } else if (BothInputsAreSigned32(node)) { |
| 1801 VisitInt32Binop(node); |
| 1802 if (lower()) { |
| 1803 lowering->DoMin(node, lowering->machine()->Int32LessThan(), |
| 1804 MachineRepresentation::kWord32); |
| 1805 } |
| 1806 } else if (BothInputsAre(node, Type::PlainNumber())) { |
| 1807 VisitFloat64Binop(node); |
| 1808 if (lower()) { |
| 1809 lowering->DoMin(node, lowering->machine()->Float64LessThan(), |
| 1810 MachineRepresentation::kFloat64); |
| 1811 } |
| 1812 } else { |
| 1813 VisitFloat64Binop(node); |
| 1814 if (lower()) NodeProperties::ChangeOp(node, Float64Op(node)); |
| 1815 } |
| 1816 return; |
| 1817 } |
| 1766 case IrOpcode::kNumberAtan2: | 1818 case IrOpcode::kNumberAtan2: |
| 1767 case IrOpcode::kNumberPow: { | 1819 case IrOpcode::kNumberPow: { |
| 1768 VisitBinop(node, UseInfo::TruncatingFloat64(), | 1820 VisitBinop(node, UseInfo::TruncatingFloat64(), |
| 1769 MachineRepresentation::kFloat64); | 1821 MachineRepresentation::kFloat64); |
| 1770 if (lower()) NodeProperties::ChangeOp(node, Float64Op(node)); | 1822 if (lower()) NodeProperties::ChangeOp(node, Float64Op(node)); |
| 1771 return; | 1823 return; |
| 1772 } | 1824 } |
| 1773 case IrOpcode::kNumberAcos: | 1825 case IrOpcode::kNumberAcos: |
| 1774 case IrOpcode::kNumberAcosh: | 1826 case IrOpcode::kNumberAcosh: |
| 1775 case IrOpcode::kNumberAsin: | 1827 case IrOpcode::kNumberAsin: |
| (...skipping 1610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3386 true0 = graph()->NewNode(phi_op, true1, false1, if_true0); | 3438 true0 = graph()->NewNode(phi_op, true1, false1, if_true0); |
| 3387 } | 3439 } |
| 3388 | 3440 |
| 3389 Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0); | 3441 Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0); |
| 3390 Node* false0 = zero; | 3442 Node* false0 = zero; |
| 3391 | 3443 |
| 3392 Node* merge0 = graph()->NewNode(merge_op, if_true0, if_false0); | 3444 Node* merge0 = graph()->NewNode(merge_op, if_true0, if_false0); |
| 3393 return graph()->NewNode(phi_op, true0, false0, merge0); | 3445 return graph()->NewNode(phi_op, true0, false0, merge0); |
| 3394 } | 3446 } |
| 3395 | 3447 |
| 3448 void SimplifiedLowering::DoMax(Node* node, Operator const* op, |
| 3449 MachineRepresentation rep) { |
| 3450 Node* const lhs = node->InputAt(0); |
| 3451 Node* const rhs = node->InputAt(1); |
| 3452 |
| 3453 node->ReplaceInput(0, graph()->NewNode(op, lhs, rhs)); |
| 3454 DCHECK_EQ(rhs, node->InputAt(1)); |
| 3455 node->AppendInput(graph()->zone(), lhs); |
| 3456 NodeProperties::ChangeOp(node, common()->Select(rep)); |
| 3457 } |
| 3458 |
| 3459 void SimplifiedLowering::DoMin(Node* node, Operator const* op, |
| 3460 MachineRepresentation rep) { |
| 3461 Node* const lhs = node->InputAt(0); |
| 3462 Node* const rhs = node->InputAt(1); |
| 3463 |
| 3464 node->InsertInput(graph()->zone(), 0, graph()->NewNode(op, lhs, rhs)); |
| 3465 DCHECK_EQ(lhs, node->InputAt(1)); |
| 3466 DCHECK_EQ(rhs, node->InputAt(2)); |
| 3467 NodeProperties::ChangeOp(node, common()->Select(rep)); |
| 3468 } |
| 3396 | 3469 |
| 3397 void SimplifiedLowering::DoShift(Node* node, Operator const* op, | 3470 void SimplifiedLowering::DoShift(Node* node, Operator const* op, |
| 3398 Type* rhs_type) { | 3471 Type* rhs_type) { |
| 3399 Node* const rhs = NodeProperties::GetValueInput(node, 1); | 3472 Node* const rhs = NodeProperties::GetValueInput(node, 1); |
| 3400 if (!rhs_type->Is(type_cache_.kZeroToThirtyOne)) { | 3473 if (!rhs_type->Is(type_cache_.kZeroToThirtyOne)) { |
| 3401 node->ReplaceInput(1, graph()->NewNode(machine()->Word32And(), rhs, | 3474 node->ReplaceInput(1, graph()->NewNode(machine()->Word32And(), rhs, |
| 3402 jsgraph()->Int32Constant(0x1f))); | 3475 jsgraph()->Int32Constant(0x1f))); |
| 3403 } | 3476 } |
| 3404 DCHECK(op->HasProperty(Operator::kPure)); | 3477 DCHECK(op->HasProperty(Operator::kPure)); |
| 3405 ChangeToPureOp(node, op); | 3478 ChangeToPureOp(node, op); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 3434 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3507 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
| 3435 Operator::kNoProperties); | 3508 Operator::kNoProperties); |
| 3436 to_number_operator_.set(common()->Call(desc)); | 3509 to_number_operator_.set(common()->Call(desc)); |
| 3437 } | 3510 } |
| 3438 return to_number_operator_.get(); | 3511 return to_number_operator_.get(); |
| 3439 } | 3512 } |
| 3440 | 3513 |
| 3441 } // namespace compiler | 3514 } // namespace compiler |
| 3442 } // namespace internal | 3515 } // namespace internal |
| 3443 } // namespace v8 | 3516 } // namespace v8 |
| OLD | NEW |