Commit 69e8bb43 authored by mbrandy's avatar mbrandy Committed by Commit bot

PPC: [stubs] Split ToNumberStub into reusable subparts.

Port b7aa4c3a

Original commit message:
    Split ToNumberStub into the entry ToNumberStub, and two new stubs,
    StringToNumberStub and NonNumberToNumberStub, which can be used when we
    already know something about the input (i.e. in various branches of the
    code stubs, or in TurboFan graphs).

    Also introduce an appropriate StringToNumber simplified operator for
    TurboFan, that is pure and is lowered to an invocation of the newly
    added StringToNumberStub.

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

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

Cr-Commit-Position: refs/heads/master@{#34998}
parent 46471067
......@@ -2699,29 +2699,28 @@ void SubStringStub::Generate(MacroAssembler* masm) {
void ToNumberStub::Generate(MacroAssembler* masm) {
// The ToNumber stub takes one argument in r3.
Label not_smi;
__ JumpIfNotSmi(r3, &not_smi);
__ blr();
__ bind(&not_smi);
STATIC_ASSERT(kSmiTag == 0);
__ TestIfSmi(r3, r0);
__ Ret(eq, cr0);
__ CompareObjectType(r3, r4, r4, HEAP_NUMBER_TYPE);
// r3: receiver
// r4: receiver instance type
__ Ret(eq);
Label not_string, slow_string;
__ cmpli(r4, Operand(FIRST_NONSTRING_TYPE));
__ bge(&not_string);
// Check if string has a cached array index.
__ lwz(r5, FieldMemOperand(r3, String::kHashFieldOffset));
__ And(r0, r5, Operand(String::kContainsCachedArrayIndexMask), SetRC);
__ bne(&slow_string, cr0);
__ IndexFromHash(r5, r3);
__ blr();
__ bind(&slow_string);
__ push(r3); // Push argument.
__ TailCallRuntime(Runtime::kStringToNumber);
__ bind(&not_string);
NonNumberToNumberStub stub(masm->isolate());
__ TailCallStub(&stub);
}
void NonNumberToNumberStub::Generate(MacroAssembler* masm) {
// The NonNumberToNumber stub takes one argument in r3.
__ AssertNotNumber(r3);
__ CompareObjectType(r3, r4, r4, FIRST_NONSTRING_TYPE);
// r3: receiver
// r4: receiver instance type
StringToNumberStub stub(masm->isolate());
__ TailCallStub(&stub, lt);
Label not_oddball;
__ cmpi(r4, Operand(ODDBALL_TYPE));
......@@ -2734,6 +2733,22 @@ void ToNumberStub::Generate(MacroAssembler* masm) {
__ TailCallRuntime(Runtime::kToNumber);
}
void StringToNumberStub::Generate(MacroAssembler* masm) {
// The StringToNumber stub takes one argument in r3.
__ AssertString(r3);
// Check if string has a cached array index.
Label runtime;
__ lwz(r5, FieldMemOperand(r3, String::kHashFieldOffset));
__ And(r0, r5, Operand(String::kContainsCachedArrayIndexMask), SetRC);
__ bne(&runtime, cr0);
__ IndexFromHash(r5, r3);
__ blr();
__ bind(&runtime);
__ push(r3); // Push argument.
__ TailCallRuntime(Runtime::kStringToNumber);
}
void ToLengthStub::Generate(MacroAssembler* masm) {
// The ToLength stub takes one argument in r3.
......
......@@ -2909,6 +2909,17 @@ void MacroAssembler::JumpIfEitherSmi(Register reg1, Register reg2,
JumpIfSmi(reg2, on_either_smi);
}
void MacroAssembler::AssertNotNumber(Register object) {
if (emit_debug_code()) {
STATIC_ASSERT(kSmiTag == 0);
TestIfSmi(object, r0);
Check(ne, kOperandIsANumber, cr0);
push(object);
CompareObjectType(object, object, object, HEAP_NUMBER_TYPE);
pop(object);
Check(ne, kOperandIsANumber);
}
}
void MacroAssembler::AssertNotSmi(Register object) {
if (emit_debug_code()) {
......
......@@ -1332,6 +1332,9 @@ class MacroAssembler : public Assembler {
// Jump if either of the registers contain a smi.
void JumpIfEitherSmi(Register reg1, Register reg2, Label* on_either_smi);
// Abort execution if argument is a number, enabled via --debug-code.
void AssertNotNumber(Register object);
// Abort execution if argument is a smi, enabled via --debug-code.
void AssertNotSmi(Register object);
void AssertSmi(Register object);
......
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