MIPS: [turbofan] Remove the no-context hack for JSToNumber.

Port d211608a3e

Original commit message:
The ToNumberStub is now able to handle all plain primitives (Numbers,
Booleans, Null, Undefined and Strings) without context access.

TEST=cctest,mjsunit,unittests
BUG=

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

Cr-Commit-Position: refs/heads/master@{#25824}
This commit is contained in:
balazs.kilvady 2014-12-15 08:01:52 -08:00 committed by Commit bot
parent ed6e1735b6
commit 9167c996d3
2 changed files with 60 additions and 14 deletions

View File

@ -3340,20 +3340,43 @@ void SubStringStub::Generate(MacroAssembler* masm) {
void ToNumberStub::Generate(MacroAssembler* masm) { void ToNumberStub::Generate(MacroAssembler* masm) {
// The ToNumber stub takes one argument in a0. // The ToNumber stub takes one argument in a0.
Label check_heap_number, call_builtin; Label not_smi;
__ JumpIfNotSmi(a0, &check_heap_number); __ JumpIfNotSmi(a0, &not_smi);
__ Ret(USE_DELAY_SLOT); __ Ret(USE_DELAY_SLOT);
__ mov(v0, a0); __ mov(v0, a0);
__ bind(&not_smi);
__ bind(&check_heap_number); Label not_heap_number;
__ lw(a1, FieldMemOperand(a0, HeapObject::kMapOffset)); __ lw(a1, FieldMemOperand(a0, HeapObject::kMapOffset));
__ LoadRoot(at, Heap::kHeapNumberMapRootIndex); __ lbu(a1, FieldMemOperand(a1, Map::kInstanceTypeOffset));
__ Branch(&call_builtin, ne, a1, Operand(at)); // a0: object
// a1: instance type.
__ Branch(&not_heap_number, ne, a1, Operand(HEAP_NUMBER_TYPE));
__ Ret(USE_DELAY_SLOT); __ Ret(USE_DELAY_SLOT);
__ mov(v0, a0); __ mov(v0, a0);
__ bind(&not_heap_number);
__ bind(&call_builtin); Label not_string, slow_string;
__ push(a0); __ Branch(&not_string, hs, a1, Operand(FIRST_NONSTRING_TYPE));
// Check if string has a cached array index.
__ lw(a2, FieldMemOperand(a0, String::kHashFieldOffset));
__ And(at, a2, Operand(String::kContainsCachedArrayIndexMask));
__ Branch(&slow_string, ne, at, Operand(zero_reg));
__ IndexFromHash(a2, a0);
__ Ret(USE_DELAY_SLOT);
__ mov(v0, a0);
__ bind(&slow_string);
__ push(a0); // Push argument.
__ TailCallRuntime(Runtime::kStringToNumber, 1, 1);
__ bind(&not_string);
Label not_oddball;
__ Branch(&not_oddball, ne, a1, Operand(ODDBALL_TYPE));
__ Ret(USE_DELAY_SLOT);
__ lw(v0, FieldMemOperand(a0, Oddball::kToNumberOffset));
__ bind(&not_oddball);
__ push(a0); // Push argument.
__ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION); __ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION);
} }

View File

@ -3379,20 +3379,43 @@ void SubStringStub::Generate(MacroAssembler* masm) {
void ToNumberStub::Generate(MacroAssembler* masm) { void ToNumberStub::Generate(MacroAssembler* masm) {
// The ToNumber stub takes one argument in a0. // The ToNumber stub takes one argument in a0.
Label check_heap_number, call_builtin; Label not_smi;
__ JumpIfNotSmi(a0, &check_heap_number); __ JumpIfNotSmi(a0, &not_smi);
__ Ret(USE_DELAY_SLOT); __ Ret(USE_DELAY_SLOT);
__ mov(v0, a0); __ mov(v0, a0);
__ bind(&not_smi);
__ bind(&check_heap_number); Label not_heap_number;
__ ld(a1, FieldMemOperand(a0, HeapObject::kMapOffset)); __ ld(a1, FieldMemOperand(a0, HeapObject::kMapOffset));
__ LoadRoot(at, Heap::kHeapNumberMapRootIndex); __ lbu(a1, FieldMemOperand(a1, Map::kInstanceTypeOffset));
__ Branch(&call_builtin, ne, a1, Operand(at)); // a0: object
// a1: instance type.
__ Branch(&not_heap_number, ne, a1, Operand(HEAP_NUMBER_TYPE));
__ Ret(USE_DELAY_SLOT); __ Ret(USE_DELAY_SLOT);
__ mov(v0, a0); __ mov(v0, a0);
__ bind(&not_heap_number);
__ bind(&call_builtin); Label not_string, slow_string;
__ push(a0); __ Branch(&not_string, hs, a1, Operand(FIRST_NONSTRING_TYPE));
// Check if string has a cached array index.
__ ld(a2, FieldMemOperand(a0, String::kHashFieldOffset));
__ And(at, a2, Operand(String::kContainsCachedArrayIndexMask));
__ Branch(&slow_string, ne, at, Operand(zero_reg));
__ IndexFromHash(a2, a0);
__ Ret(USE_DELAY_SLOT);
__ mov(v0, a0);
__ bind(&slow_string);
__ push(a0); // Push argument.
__ TailCallRuntime(Runtime::kStringToNumber, 1, 1);
__ bind(&not_string);
Label not_oddball;
__ Branch(&not_oddball, ne, a1, Operand(ODDBALL_TYPE));
__ Ret(USE_DELAY_SLOT);
__ ld(v0, FieldMemOperand(a0, Oddball::kToNumberOffset));
__ bind(&not_oddball);
__ push(a0); // Push argument.
__ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION); __ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION);
} }