| Index: src/mips64/code-stubs-mips64.cc
|
| diff --git a/src/mips64/code-stubs-mips64.cc b/src/mips64/code-stubs-mips64.cc
|
| index 76a469a516b7a9ec7eaa2c793a8ea0b0ed8eee24..6bbd1a3183a21baba02a4e177e5798b4a3cd95be 100644
|
| --- a/src/mips64/code-stubs-mips64.cc
|
| +++ b/src/mips64/code-stubs-mips64.cc
|
| @@ -3379,20 +3379,43 @@ void SubStringStub::Generate(MacroAssembler* masm) {
|
|
|
| void ToNumberStub::Generate(MacroAssembler* masm) {
|
| // The ToNumber stub takes one argument in a0.
|
| - Label check_heap_number, call_builtin;
|
| - __ JumpIfNotSmi(a0, &check_heap_number);
|
| + Label not_smi;
|
| + __ JumpIfNotSmi(a0, ¬_smi);
|
| __ Ret(USE_DELAY_SLOT);
|
| __ mov(v0, a0);
|
| + __ bind(¬_smi);
|
|
|
| - __ bind(&check_heap_number);
|
| + Label not_heap_number;
|
| __ ld(a1, FieldMemOperand(a0, HeapObject::kMapOffset));
|
| - __ LoadRoot(at, Heap::kHeapNumberMapRootIndex);
|
| - __ Branch(&call_builtin, ne, a1, Operand(at));
|
| + __ lbu(a1, FieldMemOperand(a1, Map::kInstanceTypeOffset));
|
| + // a0: object
|
| + // a1: instance type.
|
| + __ Branch(¬_heap_number, ne, a1, Operand(HEAP_NUMBER_TYPE));
|
| + __ Ret(USE_DELAY_SLOT);
|
| + __ mov(v0, a0);
|
| + __ bind(¬_heap_number);
|
| +
|
| + Label not_string, slow_string;
|
| + __ Branch(¬_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(¬_string);
|
| +
|
| + Label not_oddball;
|
| + __ Branch(¬_oddball, ne, a1, Operand(ODDBALL_TYPE));
|
| + __ Ret(USE_DELAY_SLOT);
|
| + __ ld(v0, FieldMemOperand(a0, Oddball::kToNumberOffset));
|
| + __ bind(¬_oddball);
|
|
|
| - __ bind(&call_builtin);
|
| - __ push(a0);
|
| + __ push(a0); // Push argument.
|
| __ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION);
|
| }
|
|
|
|
|