Commit 12ac11e9 authored by mbrandy's avatar mbrandy Committed by Commit bot

PPC: [stubs] Introduce ToNameStub to implement %_ToName.

Port a0878333

Original commit message:
    We already had hand-written optimized code for %_ToName in fullcodegen,
    but the optimizing compilers always went to the runtime for %_ToName,
    which is pretty bad for many of our builtins. So this CL moves the
    existing native code to a ToNameStub (similar to the existing
    ToStringStub), and uses the ToNameStub consistently in all compilers to
    actually implement %_ToName.

R=bmeurer@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com
BUG=

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

Cr-Commit-Position: refs/heads/master@{#33476}
parent 433e8848
......@@ -3528,26 +3528,6 @@ void FullCodeGenerator::EmitToInteger(CallRuntime* expr) {
}
void FullCodeGenerator::EmitToName(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
DCHECK_EQ(1, args->length());
// Load the argument into r3 and convert it.
VisitForAccumulatorValue(args->at(0));
Label convert, done_convert;
__ JumpIfSmi(r3, &convert);
STATIC_ASSERT(FIRST_NAME_TYPE == FIRST_TYPE);
__ CompareObjectType(r3, r4, r4, LAST_NAME_TYPE);
__ ble(&done_convert);
__ bind(&convert);
__ Push(r3);
__ CallRuntime(Runtime::kToName);
__ bind(&done_convert);
context()->Plug(r3);
}
void FullCodeGenerator::EmitStringCharFromCode(CallRuntime* expr) {
ZoneList<Expression*>* args = expr->arguments();
DCHECK(args->length() == 1);
......
......@@ -3232,6 +3232,37 @@ void ToStringStub::Generate(MacroAssembler* masm) {
}
void ToNameStub::Generate(MacroAssembler* masm) {
// The ToName stub takes one argument in r3.
Label is_number;
__ JumpIfSmi(r3, &is_number);
STATIC_ASSERT(FIRST_NAME_TYPE == FIRST_TYPE);
__ CompareObjectType(r3, r4, r4, LAST_NAME_TYPE);
// r3: receiver
// r4: receiver instance type
__ Ret(le);
Label not_heap_number;
__ cmpi(r4, Operand(HEAP_NUMBER_TYPE));
__ bne(&not_heap_number);
__ bind(&is_number);
NumberToStringStub stub(isolate());
__ TailCallStub(&stub);
__ bind(&not_heap_number);
Label not_oddball;
__ cmpi(r4, Operand(ODDBALL_TYPE));
__ bne(&not_oddball);
__ LoadP(r3, FieldMemOperand(r3, Oddball::kToStringOffset));
__ Ret();
__ bind(&not_oddball);
__ push(r3); // Push argument.
__ TailCallRuntime(Runtime::kToName);
}
void StringHelper::GenerateFlatOneByteStringEquals(MacroAssembler* masm,
Register left,
Register right,
......
......@@ -112,6 +112,10 @@ const Register ToLengthDescriptor::ReceiverRegister() { return r3; }
const Register ToStringDescriptor::ReceiverRegister() { return r3; }
// static
const Register ToNameDescriptor::ReceiverRegister() { return r3; }
// static
const Register ToObjectDescriptor::ReceiverRegister() { return r3; }
......
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