| 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 1142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1153 jsgraph_->isolate(), jsgraph_->zone(), callable.descriptor(), 0, | 1153 jsgraph_->isolate(), jsgraph_->zone(), callable.descriptor(), 0, |
| 1154 flags, properties); | 1154 flags, properties); |
| 1155 node->InsertInput(jsgraph_->zone(), 0, | 1155 node->InsertInput(jsgraph_->zone(), 0, |
| 1156 jsgraph_->HeapConstant(callable.code())); | 1156 jsgraph_->HeapConstant(callable.code())); |
| 1157 node->InsertInput(jsgraph_->zone(), 3, jsgraph_->NoContextConstant()); | 1157 node->InsertInput(jsgraph_->zone(), 3, jsgraph_->NoContextConstant()); |
| 1158 NodeProperties::ChangeOp(node, jsgraph_->common()->Call(desc)); | 1158 NodeProperties::ChangeOp(node, jsgraph_->common()->Call(desc)); |
| 1159 } | 1159 } |
| 1160 break; | 1160 break; |
| 1161 } | 1161 } |
| 1162 case IrOpcode::kStringLessThan: { | 1162 case IrOpcode::kStringLessThan: { |
| 1163 VisitBinop(node, UseInfo::AnyTagged(), NodeOutputInfo::Bool()); | 1163 VisitBinop(node, UseInfo::AnyTagged(), NodeOutputInfo::BoolTagged()); |
| 1164 if (lower()) lowering->DoStringLessThan(node); | 1164 if (lower()) { |
| 1165 // StringLessThan(x, y) => Call(StringLessThanStub, x, y, no-context) |
| 1166 Operator::Properties properties = node->op()->properties(); |
| 1167 Callable callable = CodeFactory::StringLessThan(jsgraph_->isolate()); |
| 1168 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; |
| 1169 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
| 1170 jsgraph_->isolate(), jsgraph_->zone(), callable.descriptor(), 0, |
| 1171 flags, properties); |
| 1172 node->InsertInput(jsgraph_->zone(), 0, |
| 1173 jsgraph_->HeapConstant(callable.code())); |
| 1174 node->InsertInput(jsgraph_->zone(), 3, jsgraph_->NoContextConstant()); |
| 1175 NodeProperties::ChangeOp(node, jsgraph_->common()->Call(desc)); |
| 1176 } |
| 1165 break; | 1177 break; |
| 1166 } | 1178 } |
| 1167 case IrOpcode::kStringLessThanOrEqual: { | 1179 case IrOpcode::kStringLessThanOrEqual: { |
| 1168 VisitBinop(node, UseInfo::AnyTagged(), NodeOutputInfo::Bool()); | 1180 VisitBinop(node, UseInfo::AnyTagged(), NodeOutputInfo::BoolTagged()); |
| 1169 if (lower()) lowering->DoStringLessThanOrEqual(node); | 1181 if (lower()) { |
| 1182 // StringLessThanOrEqual(x, y) |
| 1183 // => Call(StringLessThanOrEqualStub, x, y, no-context) |
| 1184 Operator::Properties properties = node->op()->properties(); |
| 1185 Callable callable = |
| 1186 CodeFactory::StringLessThanOrEqual(jsgraph_->isolate()); |
| 1187 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; |
| 1188 CallDescriptor* desc = Linkage::GetStubCallDescriptor( |
| 1189 jsgraph_->isolate(), jsgraph_->zone(), callable.descriptor(), 0, |
| 1190 flags, properties); |
| 1191 node->InsertInput(jsgraph_->zone(), 0, |
| 1192 jsgraph_->HeapConstant(callable.code())); |
| 1193 node->InsertInput(jsgraph_->zone(), 3, jsgraph_->NoContextConstant()); |
| 1194 NodeProperties::ChangeOp(node, jsgraph_->common()->Call(desc)); |
| 1195 } |
| 1170 break; | 1196 break; |
| 1171 } | 1197 } |
| 1172 case IrOpcode::kAllocate: { | 1198 case IrOpcode::kAllocate: { |
| 1173 ProcessInput(node, 0, UseInfo::AnyTagged()); | 1199 ProcessInput(node, 0, UseInfo::AnyTagged()); |
| 1174 ProcessRemainingInputs(node, 1); | 1200 ProcessRemainingInputs(node, 1); |
| 1175 SetOutput(node, NodeOutputInfo::AnyTagged()); | 1201 SetOutput(node, NodeOutputInfo::AnyTagged()); |
| 1176 break; | 1202 break; |
| 1177 } | 1203 } |
| 1178 case IrOpcode::kLoadField: { | 1204 case IrOpcode::kLoadField: { |
| 1179 FieldAccess access = FieldAccessOf(node->op()); | 1205 FieldAccess access = FieldAccessOf(node->op()); |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1603 } | 1629 } |
| 1604 | 1630 |
| 1605 | 1631 |
| 1606 void SimplifiedLowering::DoStoreBuffer(Node* node) { | 1632 void SimplifiedLowering::DoStoreBuffer(Node* node) { |
| 1607 DCHECK_EQ(IrOpcode::kStoreBuffer, node->opcode()); | 1633 DCHECK_EQ(IrOpcode::kStoreBuffer, node->opcode()); |
| 1608 MachineRepresentation const rep = | 1634 MachineRepresentation const rep = |
| 1609 BufferAccessOf(node->op()).machine_type().representation(); | 1635 BufferAccessOf(node->op()).machine_type().representation(); |
| 1610 NodeProperties::ChangeOp(node, machine()->CheckedStore(rep)); | 1636 NodeProperties::ChangeOp(node, machine()->CheckedStore(rep)); |
| 1611 } | 1637 } |
| 1612 | 1638 |
| 1613 | |
| 1614 Node* SimplifiedLowering::StringComparison(Node* node) { | |
| 1615 Operator::Properties properties = node->op()->properties(); | |
| 1616 Callable callable = CodeFactory::StringCompare(isolate()); | |
| 1617 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; | |
| 1618 CallDescriptor* desc = Linkage::GetStubCallDescriptor( | |
| 1619 isolate(), zone(), callable.descriptor(), 0, flags, properties); | |
| 1620 return graph()->NewNode( | |
| 1621 common()->Call(desc), jsgraph()->HeapConstant(callable.code()), | |
| 1622 NodeProperties::GetValueInput(node, 0), | |
| 1623 NodeProperties::GetValueInput(node, 1), jsgraph()->NoContextConstant(), | |
| 1624 NodeProperties::GetEffectInput(node), | |
| 1625 NodeProperties::GetControlInput(node)); | |
| 1626 } | |
| 1627 | |
| 1628 | |
| 1629 Node* SimplifiedLowering::Int32Div(Node* const node) { | 1639 Node* SimplifiedLowering::Int32Div(Node* const node) { |
| 1630 Int32BinopMatcher m(node); | 1640 Int32BinopMatcher m(node); |
| 1631 Node* const zero = jsgraph()->Int32Constant(0); | 1641 Node* const zero = jsgraph()->Int32Constant(0); |
| 1632 Node* const minus_one = jsgraph()->Int32Constant(-1); | 1642 Node* const minus_one = jsgraph()->Int32Constant(-1); |
| 1633 Node* const lhs = m.left().node(); | 1643 Node* const lhs = m.left().node(); |
| 1634 Node* const rhs = m.right().node(); | 1644 Node* const rhs = m.right().node(); |
| 1635 | 1645 |
| 1636 if (m.right().Is(-1)) { | 1646 if (m.right().Is(-1)) { |
| 1637 return graph()->NewNode(machine()->Int32Sub(), zero, lhs); | 1647 return graph()->NewNode(machine()->Int32Sub(), zero, lhs); |
| 1638 } else if (m.right().Is(0)) { | 1648 } else if (m.right().Is(0)) { |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1881 void SimplifiedLowering::DoShift(Node* node, Operator const* op, | 1891 void SimplifiedLowering::DoShift(Node* node, Operator const* op, |
| 1882 Type* rhs_type) { | 1892 Type* rhs_type) { |
| 1883 Node* const rhs = NodeProperties::GetValueInput(node, 1); | 1893 Node* const rhs = NodeProperties::GetValueInput(node, 1); |
| 1884 if (!rhs_type->Is(type_cache_.kZeroToThirtyOne)) { | 1894 if (!rhs_type->Is(type_cache_.kZeroToThirtyOne)) { |
| 1885 node->ReplaceInput(1, graph()->NewNode(machine()->Word32And(), rhs, | 1895 node->ReplaceInput(1, graph()->NewNode(machine()->Word32And(), rhs, |
| 1886 jsgraph()->Int32Constant(0x1f))); | 1896 jsgraph()->Int32Constant(0x1f))); |
| 1887 } | 1897 } |
| 1888 NodeProperties::ChangeOp(node, op); | 1898 NodeProperties::ChangeOp(node, op); |
| 1889 } | 1899 } |
| 1890 | 1900 |
| 1891 | |
| 1892 namespace { | |
| 1893 | |
| 1894 void ReplaceEffectUses(Node* node, Node* replacement) { | |
| 1895 // Requires distinguishing between value and effect edges. | |
| 1896 DCHECK(replacement->op()->EffectOutputCount() > 0); | |
| 1897 for (Edge edge : node->use_edges()) { | |
| 1898 if (NodeProperties::IsEffectEdge(edge)) { | |
| 1899 edge.UpdateTo(replacement); | |
| 1900 } else { | |
| 1901 DCHECK(NodeProperties::IsValueEdge(edge)); | |
| 1902 } | |
| 1903 } | |
| 1904 } | |
| 1905 | |
| 1906 } // namespace | |
| 1907 | |
| 1908 | |
| 1909 void SimplifiedLowering::DoStringLessThan(Node* node) { | |
| 1910 Node* comparison = StringComparison(node); | |
| 1911 ReplaceEffectUses(node, comparison); | |
| 1912 node->ReplaceInput(0, comparison); | |
| 1913 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); | |
| 1914 node->TrimInputCount(2); | |
| 1915 NodeProperties::ChangeOp(node, machine()->IntLessThan()); | |
| 1916 } | |
| 1917 | |
| 1918 | |
| 1919 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { | |
| 1920 Node* comparison = StringComparison(node); | |
| 1921 ReplaceEffectUses(node, comparison); | |
| 1922 node->ReplaceInput(0, comparison); | |
| 1923 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); | |
| 1924 node->TrimInputCount(2); | |
| 1925 NodeProperties::ChangeOp(node, machine()->IntLessThanOrEqual()); | |
| 1926 } | |
| 1927 | |
| 1928 } // namespace compiler | 1901 } // namespace compiler |
| 1929 } // namespace internal | 1902 } // namespace internal |
| 1930 } // namespace v8 | 1903 } // namespace v8 |
| OLD | NEW |