| 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 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 } | 769 } |
| 770 SetOutput(node, output, restriction_type); | 770 SetOutput(node, output, restriction_type); |
| 771 } | 771 } |
| 772 | 772 |
| 773 // Helper for binops of the I x I -> O variety. | 773 // Helper for binops of the I x I -> O variety. |
| 774 void VisitBinop(Node* node, UseInfo input_use, MachineRepresentation output, | 774 void VisitBinop(Node* node, UseInfo input_use, MachineRepresentation output, |
| 775 Type* restriction_type = Type::Any()) { | 775 Type* restriction_type = Type::Any()) { |
| 776 VisitBinop(node, input_use, input_use, output, restriction_type); | 776 VisitBinop(node, input_use, input_use, output, restriction_type); |
| 777 } | 777 } |
| 778 | 778 |
| 779 void VisitSpeculativeInt32Binop(Node* node) { |
| 780 DCHECK_EQ(2, node->op()->ValueInputCount()); |
| 781 if (BothInputsAre(node, Type::NumberOrOddball())) { |
| 782 return VisitBinop(node, UseInfo::TruncatingWord32(), |
| 783 MachineRepresentation::kWord32); |
| 784 } |
| 785 BinaryOperationHints::Hint hint = BinaryOperationHintOf(node->op()); |
| 786 if (hint == BinaryOperationHints::kSignedSmall || |
| 787 hint == BinaryOperationHints::kSigned32) { |
| 788 return VisitBinop(node, UseInfo::CheckedSigned32AsWord32(), |
| 789 MachineRepresentation::kWord32); |
| 790 } |
| 791 DCHECK_EQ(BinaryOperationHints::kNumberOrOddball, hint); |
| 792 VisitBinop(node, UseInfo::CheckedNumberOrOddballAsWord32(), |
| 793 MachineRepresentation::kWord32, Type::Signed32()); |
| 794 } |
| 795 |
| 779 // Helper for unops of the I -> O variety. | 796 // Helper for unops of the I -> O variety. |
| 780 void VisitUnop(Node* node, UseInfo input_use, MachineRepresentation output) { | 797 void VisitUnop(Node* node, UseInfo input_use, MachineRepresentation output) { |
| 781 DCHECK_EQ(1, node->op()->ValueInputCount()); | 798 DCHECK_EQ(1, node->op()->ValueInputCount()); |
| 782 ProcessInput(node, 0, input_use); | 799 ProcessInput(node, 0, input_use); |
| 783 ProcessRemainingInputs(node, 1); | 800 ProcessRemainingInputs(node, 1); |
| 784 SetOutput(node, output); | 801 SetOutput(node, output); |
| 785 } | 802 } |
| 786 | 803 |
| 787 // Helper for leaf nodes. | 804 // Helper for leaf nodes. |
| 788 void VisitLeaf(Node* node, MachineRepresentation output) { | 805 void VisitLeaf(Node* node, MachineRepresentation output) { |
| (...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1659 if (lower()) ChangeToPureOp(node, Float64Op(node)); | 1676 if (lower()) ChangeToPureOp(node, Float64Op(node)); |
| 1660 return; | 1677 return; |
| 1661 } | 1678 } |
| 1662 case IrOpcode::kNumberBitwiseOr: | 1679 case IrOpcode::kNumberBitwiseOr: |
| 1663 case IrOpcode::kNumberBitwiseXor: | 1680 case IrOpcode::kNumberBitwiseXor: |
| 1664 case IrOpcode::kNumberBitwiseAnd: { | 1681 case IrOpcode::kNumberBitwiseAnd: { |
| 1665 VisitInt32Binop(node); | 1682 VisitInt32Binop(node); |
| 1666 if (lower()) NodeProperties::ChangeOp(node, Int32Op(node)); | 1683 if (lower()) NodeProperties::ChangeOp(node, Int32Op(node)); |
| 1667 return; | 1684 return; |
| 1668 } | 1685 } |
| 1686 case IrOpcode::kSpeculativeNumberBitwiseOr: |
| 1687 case IrOpcode::kSpeculativeNumberBitwiseXor: |
| 1688 case IrOpcode::kSpeculativeNumberBitwiseAnd: |
| 1689 VisitSpeculativeInt32Binop(node); |
| 1690 if (lower()) { |
| 1691 ChangeToPureOp(node, Int32Op(node)); |
| 1692 } |
| 1693 return; |
| 1669 case IrOpcode::kNumberShiftLeft: { | 1694 case IrOpcode::kNumberShiftLeft: { |
| 1670 Type* rhs_type = GetUpperBound(node->InputAt(1)); | 1695 Type* rhs_type = GetUpperBound(node->InputAt(1)); |
| 1671 VisitBinop(node, UseInfo::TruncatingWord32(), | 1696 VisitBinop(node, UseInfo::TruncatingWord32(), |
| 1672 UseInfo::TruncatingWord32(), MachineRepresentation::kWord32); | 1697 UseInfo::TruncatingWord32(), MachineRepresentation::kWord32); |
| 1673 if (lower()) { | 1698 if (lower()) { |
| 1674 lowering->DoShift(node, lowering->machine()->Word32Shl(), rhs_type); | 1699 lowering->DoShift(node, lowering->machine()->Word32Shl(), rhs_type); |
| 1675 } | 1700 } |
| 1676 return; | 1701 return; |
| 1677 } | 1702 } |
| 1678 case IrOpcode::kSpeculativeNumberShiftLeft: { | 1703 case IrOpcode::kSpeculativeNumberShiftLeft: { |
| (...skipping 1938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3617 isolate(), graph()->zone(), callable.descriptor(), 0, flags, | 3642 isolate(), graph()->zone(), callable.descriptor(), 0, flags, |
| 3618 Operator::kNoProperties); | 3643 Operator::kNoProperties); |
| 3619 to_number_operator_.set(common()->Call(desc)); | 3644 to_number_operator_.set(common()->Call(desc)); |
| 3620 } | 3645 } |
| 3621 return to_number_operator_.get(); | 3646 return to_number_operator_.get(); |
| 3622 } | 3647 } |
| 3623 | 3648 |
| 3624 } // namespace compiler | 3649 } // namespace compiler |
| 3625 } // namespace internal | 3650 } // namespace internal |
| 3626 } // namespace v8 | 3651 } // namespace v8 |
| OLD | NEW |