| Index: src/arm/code-stubs-arm.cc
|
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc
|
| index 730677d62b1a4bb095a8dbc05773341f4a1cbcea..812032457ed37d18cbc89e4fceea84e0d42a7cbe 100644
|
| --- a/src/arm/code-stubs-arm.cc
|
| +++ b/src/arm/code-stubs-arm.cc
|
| @@ -1369,7 +1369,7 @@ void NumberToStringStub::GenerateLookupNumberStringCache(MacroAssembler* masm,
|
| scratch1,
|
| Heap::kHeapNumberMapRootIndex,
|
| not_found,
|
| - true);
|
| + DONT_DO_SMI_CHECK);
|
|
|
| STATIC_ASSERT(8 == kDoubleSize);
|
| __ add(scratch1,
|
| @@ -3021,7 +3021,7 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) {
|
| r1,
|
| Heap::kHeapNumberMapRootIndex,
|
| &calculate,
|
| - true);
|
| + DONT_DO_SMI_CHECK);
|
| // Input is a HeapNumber. Load it to a double register and store the
|
| // low and high words into r2, r3.
|
| __ vldr(d0, FieldMemOperand(r0, HeapNumber::kValueOffset));
|
| @@ -3564,11 +3564,20 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
|
|
|
| #ifdef ENABLE_LOGGING_AND_PROFILING
|
| // If this is the outermost JS call, set js_entry_sp value.
|
| + Label non_outermost_js;
|
| ExternalReference js_entry_sp(Isolate::k_js_entry_sp_address, isolate);
|
| __ mov(r5, Operand(ExternalReference(js_entry_sp)));
|
| __ ldr(r6, MemOperand(r5));
|
| - __ cmp(r6, Operand(0, RelocInfo::NONE));
|
| - __ str(fp, MemOperand(r5), eq);
|
| + __ cmp(r6, Operand(0));
|
| + __ b(ne, &non_outermost_js);
|
| + __ str(fp, MemOperand(r5));
|
| + __ mov(ip, Operand(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)));
|
| + Label cont;
|
| + __ b(&cont);
|
| + __ bind(&non_outermost_js);
|
| + __ mov(ip, Operand(Smi::FromInt(StackFrame::INNER_JSENTRY_FRAME)));
|
| + __ bind(&cont);
|
| + __ push(ip);
|
| #endif
|
|
|
| // Call a faked try-block that does the invoke.
|
| @@ -3626,27 +3635,22 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
|
| __ mov(lr, Operand(pc));
|
| masm->add(pc, ip, Operand(Code::kHeaderSize - kHeapObjectTag));
|
|
|
| - // Unlink this frame from the handler chain. When reading the
|
| - // address of the next handler, there is no need to use the address
|
| - // displacement since the current stack pointer (sp) points directly
|
| - // to the stack handler.
|
| - __ ldr(r3, MemOperand(sp, StackHandlerConstants::kNextOffset));
|
| - __ mov(ip, Operand(ExternalReference(Isolate::k_handler_address, isolate)));
|
| - __ str(r3, MemOperand(ip));
|
| - // No need to restore registers
|
| - __ add(sp, sp, Operand(StackHandlerConstants::kSize));
|
| + // Unlink this frame from the handler chain.
|
| + __ PopTryHandler();
|
|
|
| + __ bind(&exit); // r0 holds result
|
| #ifdef ENABLE_LOGGING_AND_PROFILING
|
| - // If current FP value is the same as js_entry_sp value, it means that
|
| - // the current function is the outermost.
|
| + // Check if the current stack frame is marked as the outermost JS frame.
|
| + Label non_outermost_js_2;
|
| + __ pop(r5);
|
| + __ cmp(r5, Operand(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)));
|
| + __ b(ne, &non_outermost_js_2);
|
| + __ mov(r6, Operand(0));
|
| __ mov(r5, Operand(ExternalReference(js_entry_sp)));
|
| - __ ldr(r6, MemOperand(r5));
|
| - __ cmp(fp, Operand(r6));
|
| - __ mov(r6, Operand(0, RelocInfo::NONE), LeaveCC, eq);
|
| - __ str(r6, MemOperand(r5), eq);
|
| + __ str(r6, MemOperand(r5));
|
| + __ bind(&non_outermost_js_2);
|
| #endif
|
|
|
| - __ bind(&exit); // r0 holds result
|
| // Restore the top frame descriptors from the stack.
|
| __ pop(r3);
|
| __ mov(ip,
|
| @@ -4689,7 +4693,7 @@ void StringCharCodeAtGenerator::GenerateSlow(
|
| scratch_,
|
| Heap::kHeapNumberMapRootIndex,
|
| index_not_number_,
|
| - true);
|
| + DONT_DO_SMI_CHECK);
|
| call_helper.BeforeCall(masm);
|
| __ Push(object_, index_);
|
| __ push(index_); // Consumed by runtime conversion function.
|
|
|