Lower simplified StringEqual to runtime call.

R=titzer@chromium.org
TEST=cctest/test-simplified-lowering/LowerStringOps_to_call_and_wordeq

Review URL: https://codereview.chromium.org/531763002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23616 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 59ba3244
......@@ -506,7 +506,7 @@ class RepresentationSelector {
}
case IrOpcode::kStringEqual: {
VisitBinop(node, kMachAnyTagged, kRepBit);
// TODO(titzer): lower StringEqual to stub/runtime call.
if (lower()) lowering->DoStringEqual(node);
break;
}
case IrOpcode::kStringLessThan: {
......@@ -826,7 +826,7 @@ void SimplifiedLowering::DoStringAdd(Node* node) {
CodeStubInterfaceDescriptor* d = stub.GetInterfaceDescriptor();
CallDescriptor::Flags flags = CallDescriptor::kNoFlags;
CallDescriptor* desc = Linkage::GetStubCallDescriptor(d, 0, flags, zone());
node->set_op(jsgraph()->common()->Call(desc));
node->set_op(common()->Call(desc));
node->InsertInput(zone(), 0, jsgraph()->HeapConstant(stub.GetCode()));
node->AppendInput(zone(), jsgraph()->UndefinedConstant());
node->AppendInput(zone(), graph()->start());
......@@ -834,6 +834,27 @@ void SimplifiedLowering::DoStringAdd(Node* node) {
}
void SimplifiedLowering::DoStringEqual(Node* node) {
CEntryStub stub(zone()->isolate(), 1);
ExternalReference ref(Runtime::kStringEquals, zone()->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(
Runtime::kStringEquals, 2, props, zone());
Node* call = graph()->NewNode(common()->Call(desc),
jsgraph()->HeapConstant(stub.GetCode()),
NodeProperties::GetValueInput(node, 0),
NodeProperties::GetValueInput(node, 1),
jsgraph()->ExternalConstant(ref),
jsgraph()->Int32Constant(2),
jsgraph()->UndefinedConstant());
node->set_op(machine()->WordEqual());
node->ReplaceInput(0, call);
node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL));
}
} // namespace compiler
} // namespace internal
} // namespace v8
......@@ -28,6 +28,7 @@ class SimplifiedLowering {
void DoLoadElement(Node* node);
void DoStoreElement(Node* node);
void DoStringAdd(Node* node);
void DoStringEqual(Node* node);
private:
JSGraph* jsgraph_;
......
......@@ -1051,13 +1051,14 @@ TEST(LowerReferenceEqual_to_wordeq) {
}
TEST(LowerStringOps_to_calls) {
TEST(LowerStringOps_to_call_and_wordeq) {
TestingGraph t(Type::String(), Type::String());
IrOpcode::Value opcode =
static_cast<IrOpcode::Value>(t.machine()->WordEqual()->opcode());
t.CheckLoweringBinop(opcode, t.simplified()->StringEqual());
if (false) { // TODO(titzer): lower StringOps to stub/runtime calls
t.CheckLoweringBinop(IrOpcode::kCall, t.simplified()->StringEqual());
t.CheckLoweringBinop(IrOpcode::kCall, t.simplified()->StringLessThan());
t.CheckLoweringBinop(IrOpcode::kCall,
t.simplified()->StringLessThanOrEqual());
t.CheckLoweringBinop(opcode, t.simplified()->StringLessThan());
t.CheckLoweringBinop(opcode, t.simplified()->StringLessThanOrEqual());
}
t.CheckLoweringBinop(IrOpcode::kCall, t.simplified()->StringAdd());
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment