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); |
} |