| Index: src/arm/builtins-arm.cc
|
| diff --git a/src/arm/builtins-arm.cc b/src/arm/builtins-arm.cc
|
| index 660810ca56f3284f60436508f5c80979a68400a4..b269f248a76741dc8d1f27c5f6834785c26a0bda 100644
|
| --- a/src/arm/builtins-arm.cc
|
| +++ b/src/arm/builtins-arm.cc
|
| @@ -170,21 +170,20 @@ void Builtins::Generate_MathMaxMin(MacroAssembler* masm, MathMaxMinKind kind) {
|
| __ ldr(r2, MemOperand(sp, r0, LSL, kPointerSizeLog2));
|
|
|
| // Load the double value of the parameter into d2, maybe converting the
|
| - // parameter to a number first using the ToNumberStub if necessary.
|
| + // parameter to a number first using the ToNumber builtin if necessary.
|
| Label convert, convert_smi, convert_number, done_convert;
|
| __ bind(&convert);
|
| __ JumpIfSmi(r2, &convert_smi);
|
| __ ldr(r3, FieldMemOperand(r2, HeapObject::kMapOffset));
|
| __ JumpIfRoot(r3, Heap::kHeapNumberMapRootIndex, &convert_number);
|
| {
|
| - // Parameter is not a Number, use the ToNumberStub to convert it.
|
| + // Parameter is not a Number, use the ToNumber builtin to convert it.
|
| FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
|
| __ SmiTag(r0);
|
| __ SmiTag(r4);
|
| __ Push(r0, r1, r4);
|
| __ mov(r0, r2);
|
| - ToNumberStub stub(masm->isolate());
|
| - __ CallStub(&stub);
|
| + __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET);
|
| __ mov(r2, r0);
|
| __ Pop(r0, r1, r4);
|
| {
|
| @@ -259,8 +258,7 @@ void Builtins::Generate_NumberConstructor(MacroAssembler* masm) {
|
| }
|
|
|
| // 2a. Convert the first argument to a number.
|
| - ToNumberStub stub(masm->isolate());
|
| - __ TailCallStub(&stub);
|
| + __ Jump(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET);
|
|
|
| // 2b. No arguments, return +0.
|
| __ bind(&no_arguments);
|
| @@ -308,8 +306,7 @@ void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) {
|
| FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
|
| __ Push(r1, r3);
|
| __ Move(r0, r2);
|
| - ToNumberStub stub(masm->isolate());
|
| - __ CallStub(&stub);
|
| + __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET);
|
| __ Move(r2, r0);
|
| __ Pop(r1, r3);
|
| }
|
| @@ -2707,6 +2704,42 @@ void Builtins::Generate_StringToNumber(MacroAssembler* masm) {
|
| __ TailCallRuntime(Runtime::kStringToNumber);
|
| }
|
|
|
| +void Builtins::Generate_ToNumber(MacroAssembler* masm) {
|
| + // The ToNumber stub takes one argument in r0.
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + __ tst(r0, Operand(kSmiTagMask));
|
| + __ Ret(eq);
|
| +
|
| + __ CompareObjectType(r0, r1, r1, HEAP_NUMBER_TYPE);
|
| + // r0: receiver
|
| + // r1: receiver instance type
|
| + __ Ret(eq);
|
| +
|
| + __ Jump(masm->isolate()->builtins()->NonNumberToNumber(),
|
| + RelocInfo::CODE_TARGET);
|
| +}
|
| +
|
| +void Builtins::Generate_NonNumberToNumber(MacroAssembler* masm) {
|
| + // The NonNumberToNumber stub takes one argument in r0.
|
| + __ AssertNotNumber(r0);
|
| +
|
| + __ CompareObjectType(r0, r1, r1, FIRST_NONSTRING_TYPE);
|
| + // r0: receiver
|
| + // r1: receiver instance type
|
| + __ Jump(masm->isolate()->builtins()->StringToNumber(), RelocInfo::CODE_TARGET,
|
| + lo);
|
| +
|
| + Label not_oddball;
|
| + __ cmp(r1, Operand(ODDBALL_TYPE));
|
| + __ b(ne, ¬_oddball);
|
| + __ ldr(r0, FieldMemOperand(r0, Oddball::kToNumberOffset));
|
| + __ Ret();
|
| + __ bind(¬_oddball);
|
| +
|
| + __ Push(r0); // Push argument.
|
| + __ TailCallRuntime(Runtime::kToNumber);
|
| +}
|
| +
|
| void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- r0 : actual number of arguments
|
|
|