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/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
720 if (lower()) DeferReplacement(node, node->InputAt(0)); | 720 if (lower()) DeferReplacement(node, node->InputAt(0)); |
721 } else if ((in & kTypeMask) == kTypeInt32 || | 721 } else if ((in & kTypeMask) == kTypeInt32 || |
722 (in & kRepMask) == kRepWord32) { | 722 (in & kRepMask) == kRepWord32) { |
723 // Just change representation if necessary. | 723 // Just change representation if necessary. |
724 VisitUnop(node, kTypeInt32 | kRepWord32, kTypeInt32 | kRepWord32); | 724 VisitUnop(node, kTypeInt32 | kRepWord32, kTypeInt32 | kRepWord32); |
725 if (lower()) DeferReplacement(node, node->InputAt(0)); | 725 if (lower()) DeferReplacement(node, node->InputAt(0)); |
726 } else { | 726 } else { |
727 // Require the input in float64 format and perform truncation. | 727 // Require the input in float64 format and perform truncation. |
728 // TODO(turbofan): avoid a truncation with a smi check. | 728 // TODO(turbofan): avoid a truncation with a smi check. |
729 VisitUnop(node, kTypeInt32 | kRepFloat64, kTypeInt32 | kRepWord32); | 729 VisitUnop(node, kTypeInt32 | kRepFloat64, kTypeInt32 | kRepWord32); |
730 if (lower()) | 730 if (lower()) { |
731 node->set_op(lowering->machine()->TruncateFloat64ToInt32()); | 731 node->set_op(lowering->machine()->TruncateFloat64ToInt32( |
| 732 TruncationMode::kJavaScript)); |
| 733 } |
732 } | 734 } |
733 break; | 735 break; |
734 } | 736 } |
735 case IrOpcode::kNumberToUint32: { | 737 case IrOpcode::kNumberToUint32: { |
736 MachineTypeUnion use_rep = use & kRepMask; | 738 MachineTypeUnion use_rep = use & kRepMask; |
737 Node* input = node->InputAt(0); | 739 Node* input = node->InputAt(0); |
738 Type* in_upper = NodeProperties::GetBounds(input).upper; | 740 Type* in_upper = NodeProperties::GetBounds(input).upper; |
739 MachineTypeUnion in = GetInfo(input)->output; | 741 MachineTypeUnion in = GetInfo(input)->output; |
740 if (in_upper->Is(Type::Unsigned32())) { | 742 if (in_upper->Is(Type::Unsigned32())) { |
741 // If the input has type uint32, pass through representation. | 743 // If the input has type uint32, pass through representation. |
742 VisitUnop(node, kTypeUint32 | use_rep, kTypeUint32 | use_rep); | 744 VisitUnop(node, kTypeUint32 | use_rep, kTypeUint32 | use_rep); |
743 if (lower()) DeferReplacement(node, node->InputAt(0)); | 745 if (lower()) DeferReplacement(node, node->InputAt(0)); |
744 } else if ((in & kTypeMask) == kTypeInt32 || | 746 } else if ((in & kTypeMask) == kTypeInt32 || |
745 in_upper->Is(Type::Signed32())) { | 747 in_upper->Is(Type::Signed32())) { |
746 // Just change representation if necessary. | 748 // Just change representation if necessary. |
747 VisitUnop(node, kTypeInt32 | kRepWord32, kTypeUint32 | kRepWord32); | 749 VisitUnop(node, kTypeInt32 | kRepWord32, kTypeUint32 | kRepWord32); |
748 if (lower()) DeferReplacement(node, node->InputAt(0)); | 750 if (lower()) DeferReplacement(node, node->InputAt(0)); |
749 } else if ((in & kTypeMask) == kTypeUint32 || | 751 } else if ((in & kTypeMask) == kTypeUint32 || |
750 (in & kRepMask) == kRepWord32) { | 752 (in & kRepMask) == kRepWord32) { |
751 // Just change representation if necessary. | 753 // Just change representation if necessary. |
752 VisitUnop(node, kTypeUint32 | kRepWord32, kTypeUint32 | kRepWord32); | 754 VisitUnop(node, kTypeUint32 | kRepWord32, kTypeUint32 | kRepWord32); |
753 if (lower()) DeferReplacement(node, node->InputAt(0)); | 755 if (lower()) DeferReplacement(node, node->InputAt(0)); |
754 } else { | 756 } else { |
755 // Require the input in float64 format and perform truncation. | 757 // Require the input in float64 format and perform truncation. |
756 // TODO(turbofan): avoid a truncation with a smi check. | 758 // TODO(turbofan): avoid a truncation with a smi check. |
757 VisitUnop(node, kTypeUint32 | kRepFloat64, kTypeUint32 | kRepWord32); | 759 VisitUnop(node, kTypeUint32 | kRepFloat64, kTypeUint32 | kRepWord32); |
758 if (lower()) | 760 if (lower()) { |
759 node->set_op(lowering->machine()->TruncateFloat64ToInt32()); | 761 node->set_op(lowering->machine()->TruncateFloat64ToInt32( |
| 762 TruncationMode::kJavaScript)); |
| 763 } |
760 } | 764 } |
761 break; | 765 break; |
762 } | 766 } |
763 case IrOpcode::kPlainPrimitiveToNumber: { | 767 case IrOpcode::kPlainPrimitiveToNumber: { |
764 VisitUnop(node, kMachAnyTagged, kTypeNumber | kRepTagged); | 768 VisitUnop(node, kMachAnyTagged, kTypeNumber | kRepTagged); |
765 if (lower()) { | 769 if (lower()) { |
766 // PlainPrimitiveToNumber(x) => Call(ToNumberStub, x, no-context) | 770 // PlainPrimitiveToNumber(x) => Call(ToNumberStub, x, no-context) |
767 Operator::Properties properties = node->op()->properties(); | 771 Operator::Properties properties = node->op()->properties(); |
768 Callable callable = CodeFactory::ToNumber(jsgraph_->isolate()); | 772 Callable callable = CodeFactory::ToNumber(jsgraph_->isolate()); |
769 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; | 773 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1001 | 1005 |
1002 case IrOpcode::kChangeInt32ToInt64: | 1006 case IrOpcode::kChangeInt32ToInt64: |
1003 return VisitUnop(node, kTypeInt32 | kRepWord32, | 1007 return VisitUnop(node, kTypeInt32 | kRepWord32, |
1004 kTypeInt32 | kRepWord64); | 1008 kTypeInt32 | kRepWord64); |
1005 case IrOpcode::kChangeUint32ToUint64: | 1009 case IrOpcode::kChangeUint32ToUint64: |
1006 return VisitUnop(node, kTypeUint32 | kRepWord32, | 1010 return VisitUnop(node, kTypeUint32 | kRepWord32, |
1007 kTypeUint32 | kRepWord64); | 1011 kTypeUint32 | kRepWord64); |
1008 case IrOpcode::kTruncateFloat64ToFloat32: | 1012 case IrOpcode::kTruncateFloat64ToFloat32: |
1009 return VisitUnop(node, kTypeNumber | kRepFloat64, | 1013 return VisitUnop(node, kTypeNumber | kRepFloat64, |
1010 kTypeNumber | kRepFloat32); | 1014 kTypeNumber | kRepFloat32); |
| 1015 case IrOpcode::kTruncateFloat64ToInt32: |
| 1016 return VisitUnop(node, kTypeNumber | kRepFloat64, |
| 1017 kTypeInt32 | kRepWord32); |
1011 case IrOpcode::kTruncateInt64ToInt32: | 1018 case IrOpcode::kTruncateInt64ToInt32: |
1012 // TODO(titzer): Is kTypeInt32 correct here? | 1019 // TODO(titzer): Is kTypeInt32 correct here? |
1013 return VisitUnop(node, kTypeInt32 | kRepWord64, | 1020 return VisitUnop(node, kTypeInt32 | kRepWord64, |
1014 kTypeInt32 | kRepWord32); | 1021 kTypeInt32 | kRepWord32); |
1015 | 1022 |
1016 case IrOpcode::kChangeFloat32ToFloat64: | 1023 case IrOpcode::kChangeFloat32ToFloat64: |
1017 return VisitUnop(node, kTypeNumber | kRepFloat32, | 1024 return VisitUnop(node, kTypeNumber | kRepFloat32, |
1018 kTypeNumber | kRepFloat64); | 1025 kTypeNumber | kRepFloat64); |
1019 case IrOpcode::kChangeInt32ToFloat64: | 1026 case IrOpcode::kChangeInt32ToFloat64: |
1020 return VisitUnop(node, kTypeInt32 | kRepWord32, | 1027 return VisitUnop(node, kTypeInt32 | kRepWord32, |
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1626 | 1633 |
1627 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { | 1634 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { |
1628 node->set_op(machine()->IntLessThanOrEqual()); | 1635 node->set_op(machine()->IntLessThanOrEqual()); |
1629 node->ReplaceInput(0, StringComparison(node, true)); | 1636 node->ReplaceInput(0, StringComparison(node, true)); |
1630 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); | 1637 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); |
1631 } | 1638 } |
1632 | 1639 |
1633 } // namespace compiler | 1640 } // namespace compiler |
1634 } // namespace internal | 1641 } // namespace internal |
1635 } // namespace v8 | 1642 } // namespace v8 |
OLD | NEW |