}
-Node* SimplifiedLowering::StringComparison(Node* node, bool requires_ordering) {
- Runtime::FunctionId f =
- requires_ordering ? Runtime::kStringCompare : Runtime::kStringEquals;
- ExternalReference ref(f, jsgraph()->isolate());
- Operator::Properties props = node->op()->properties();
- // TODO(mstarzinger): We should call StringCompareStub here instead, once an
- // interface descriptor is available for it.
- CallDescriptor* desc = Linkage::GetRuntimeCallDescriptor(zone(), f, 2, props);
- return graph()->NewNode(common()->Call(desc),
- jsgraph()->CEntryStubConstant(1),
- NodeProperties::GetValueInput(node, 0),
- NodeProperties::GetValueInput(node, 1),
- jsgraph()->ExternalConstant(ref),
- jsgraph()->Int32Constant(2),
- jsgraph()->NoContextConstant());
+Node* SimplifiedLowering::StringComparison(Node* node) {
+ Operator::Properties properties = node->op()->properties();
+ Callable callable = CodeFactory::StringCompare(isolate());
+ CallDescriptor::Flags flags = CallDescriptor::kNoFlags;
+ CallDescriptor* desc = Linkage::GetStubCallDescriptor(
+ isolate(), zone(), callable.descriptor(), 0, flags, properties);
+ return graph()->NewNode(
+ common()->Call(desc), jsgraph()->HeapConstant(callable.code()),
+ NodeProperties::GetValueInput(node, 0),
+ NodeProperties::GetValueInput(node, 1), jsgraph()->NoContextConstant());
}
void SimplifiedLowering::DoStringEqual(Node* node) {
node->set_op(machine()->WordEqual());
- node->ReplaceInput(0, StringComparison(node, false));
+ node->ReplaceInput(0, StringComparison(node));
node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL));
}
void SimplifiedLowering::DoStringLessThan(Node* node) {
node->set_op(machine()->IntLessThan());
- node->ReplaceInput(0, StringComparison(node, true));
+ node->ReplaceInput(0, StringComparison(node));
node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL));
}
void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) {
node->set_op(machine()->IntLessThanOrEqual());
- node->ReplaceInput(0, StringComparison(node, true));
+ node->ReplaceInput(0, StringComparison(node));
node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL));
}
Node* Untag(Node* node);
Node* OffsetMinusTagConstant(int32_t offset);
Node* ComputeIndex(const ElementAccess& access, Node* const key);
- Node* StringComparison(Node* node, bool requires_ordering);
+ Node* StringComparison(Node* node);
Node* Int32Div(Node* const node);
Node* Int32Mod(Node* const node);
Node* Uint32Div(Node* const node);
friend class RepresentationSelector;
+ Isolate* isolate() { return jsgraph_->isolate(); }
Zone* zone() { return jsgraph_->zone(); }
JSGraph* jsgraph() { return jsgraph_; }
Graph* graph() { return jsgraph()->graph(); }