From 9b72f14cedbae1e9f18f4f109da215f7c9953e44 Mon Sep 17 00:00:00 2001 From: "bmeurer@chromium.org" Date: Thu, 6 Nov 2014 12:01:41 +0000 Subject: [PATCH] Turn ToNumberStub into a PlatformCodeStub again. The HydrogenCodeStub is too expensive and there's no easy way to reduce this cost, so turning it into a PlatformCodeStub solves that problem until we can use TurboFan for code stubs. TEST=mjsunit R=mvstanton@chromium.org Review URL: https://codereview.chromium.org/683913008 Cr-Commit-Position: refs/heads/master@{#25187} git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25187 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/code-stubs-arm.cc | 18 ++++++++++++++++++ src/arm64/code-stubs-arm64.cc | 16 ++++++++++++++++ src/code-stubs-hydrogen.cc | 31 ------------------------------- src/code-stubs.cc | 3 --- src/code-stubs.h | 20 ++++++++++---------- src/ia32/code-stubs-ia32.cc | 19 +++++++++++++++++++ src/x64/code-stubs-x64.cc | 20 ++++++++++++++++++++ 7 files changed, 83 insertions(+), 44 deletions(-) diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc index a5a34a4..a0e7e4a 100644 --- a/src/arm/code-stubs-arm.cc +++ b/src/arm/code-stubs-arm.cc @@ -3187,6 +3187,24 @@ void SubStringStub::Generate(MacroAssembler* masm) { } +void ToNumberStub::Generate(MacroAssembler* masm) { + // The ToNumber stub takes one argument in r0. + Label check_heap_number, call_builtin; + __ JumpIfNotSmi(r0, &check_heap_number); + __ Ret(); + + __ bind(&check_heap_number); + __ ldr(r1, FieldMemOperand(r0, HeapObject::kMapOffset)); + __ CompareRoot(r1, Heap::kHeapNumberMapRootIndex); + __ b(ne, &call_builtin); + __ Ret(); + + __ bind(&call_builtin); + __ push(r0); + __ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION); +} + + void StringHelper::GenerateFlatOneByteStringEquals( MacroAssembler* masm, Register left, Register right, Register scratch1, Register scratch2, Register scratch3) { diff --git a/src/arm64/code-stubs-arm64.cc b/src/arm64/code-stubs-arm64.cc index bdcd08a..6583775 100644 --- a/src/arm64/code-stubs-arm64.cc +++ b/src/arm64/code-stubs-arm64.cc @@ -3833,6 +3833,22 @@ void SubStringStub::Generate(MacroAssembler* masm) { } +void ToNumberStub::Generate(MacroAssembler* masm) { + // The ToNumber stub takes one argument in x0. + Label check_heap_number, call_builtin; + __ JumpIfNotSmi(x0, &check_heap_number); + __ Ret(); + + __ bind(&check_heap_number); + __ JumpIfNotHeapNumber(x0, &call_builtin); + __ Ret(); + + __ bind(&call_builtin); + __ push(x0); + __ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION); +} + + void StringHelper::GenerateFlatOneByteStringEquals( MacroAssembler* masm, Register left, Register right, Register scratch1, Register scratch2, Register scratch3) { diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc index 5579e05..dc527d7 100644 --- a/src/code-stubs-hydrogen.cc +++ b/src/code-stubs-hydrogen.cc @@ -284,37 +284,6 @@ static Handle DoGenerateCode(Stub* stub) { template <> -HValue* CodeStubGraphBuilder::BuildCodeStub() { - HValue* value = GetParameter(0); - - // Check if the parameter is already a SMI or heap number. - IfBuilder if_number(this); - if_number.If(value); - if_number.OrIf(value, isolate()->factory()->heap_number_map()); - if_number.Then(); - - // Return the number. - Push(value); - - if_number.Else(); - - // Convert the parameter to number using the builtin. - HValue* function = AddLoadJSBuiltin(Builtins::TO_NUMBER); - Add(value); - Push(Add(function, 1)); - - if_number.End(); - - return Pop(); -} - - -Handle ToNumberStub::GenerateCode() { - return DoGenerateCode(this); -} - - -template <> HValue* CodeStubGraphBuilder::BuildCodeStub() { info()->MarkAsSavesCallerDoubles(); HValue* number = GetParameter(NumberToStringStub::kNumber); diff --git a/src/code-stubs.cc b/src/code-stubs.cc index 552b7eb..7442f3e 100644 --- a/src/code-stubs.cc +++ b/src/code-stubs.cc @@ -654,9 +654,6 @@ void FastNewClosureStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { void FastNewContextStub::InitializeDescriptor(CodeStubDescriptor* d) {} -void ToNumberStub::InitializeDescriptor(CodeStubDescriptor* d) {} - - void NumberToStringStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { NumberToStringDescriptor call_descriptor(isolate()); descriptor->Initialize( diff --git a/src/code-stubs.h b/src/code-stubs.h index 6921883..06eff69 100644 --- a/src/code-stubs.h +++ b/src/code-stubs.h @@ -50,6 +50,7 @@ namespace internal { V(StringCompare) \ V(StubFailureTrampoline) \ V(SubString) \ + V(ToNumber) \ /* HydrogenCodeStubs */ \ V(AllocateHeapNumber) \ V(ArrayNArgumentsConstructor) \ @@ -77,7 +78,6 @@ namespace internal { V(StoreFastElement) \ V(StringAdd) \ V(ToBoolean) \ - V(ToNumber) \ V(TransitionElementsKind) \ V(VectorKeyedLoad) \ V(VectorLoad) \ @@ -545,15 +545,6 @@ class NopRuntimeCallHelper : public RuntimeCallHelper { }; -class ToNumberStub: public HydrogenCodeStub { - public: - explicit ToNumberStub(Isolate* isolate) : HydrogenCodeStub(isolate) { } - - DEFINE_CALL_INTERFACE_DESCRIPTOR(ToNumber); - DEFINE_HYDROGEN_CODE_STUB(ToNumber, HydrogenCodeStub); -}; - - class NumberToStringStub FINAL : public HydrogenCodeStub { public: explicit NumberToStringStub(Isolate* isolate) : HydrogenCodeStub(isolate) {} @@ -2537,6 +2528,15 @@ class SubStringStub : public PlatformCodeStub { }; +class ToNumberStub FINAL : public PlatformCodeStub { + public: + explicit ToNumberStub(Isolate* isolate) : PlatformCodeStub(isolate) {} + + DEFINE_CALL_INTERFACE_DESCRIPTOR(ToNumber); + DEFINE_PLATFORM_CODE_STUB(ToNumber, PlatformCodeStub); +}; + + class StringCompareStub : public PlatformCodeStub { public: explicit StringCompareStub(Isolate* isolate) : PlatformCodeStub(isolate) {} diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc index 6434833..caef04c 100644 --- a/src/ia32/code-stubs-ia32.cc +++ b/src/ia32/code-stubs-ia32.cc @@ -3173,6 +3173,25 @@ void SubStringStub::Generate(MacroAssembler* masm) { } +void ToNumberStub::Generate(MacroAssembler* masm) { + // The ToNumber stub takes one argument in eax. + Label check_heap_number, call_builtin; + __ JumpIfNotSmi(eax, &check_heap_number, Label::kNear); + __ Ret(); + + __ bind(&check_heap_number); + __ CompareMap(eax, masm->isolate()->factory()->heap_number_map()); + __ j(not_equal, &call_builtin, Label::kNear); + __ Ret(); + + __ bind(&call_builtin); + __ pop(ecx); // Pop return address. + __ push(eax); + __ push(ecx); // Push return address. + __ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION); +} + + void StringHelper::GenerateFlatOneByteStringEquals(MacroAssembler* masm, Register left, Register right, diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc index 01bddaf..5ea5f72 100644 --- a/src/x64/code-stubs-x64.cc +++ b/src/x64/code-stubs-x64.cc @@ -3122,6 +3122,26 @@ void SubStringStub::Generate(MacroAssembler* masm) { } +void ToNumberStub::Generate(MacroAssembler* masm) { + // The ToNumber stub takes one argument in rax. + Label check_heap_number, call_builtin; + __ JumpIfNotSmi(rax, &check_heap_number, Label::kNear); + __ Ret(); + + __ bind(&check_heap_number); + __ CompareRoot(FieldOperand(rax, HeapObject::kMapOffset), + Heap::kHeapNumberMapRootIndex); + __ j(not_equal, &call_builtin, Label::kNear); + __ Ret(); + + __ bind(&call_builtin); + __ popq(rcx); // Pop return address. + __ pushq(rax); + __ pushq(rcx); // Push return address. + __ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION); +} + + void StringHelper::GenerateFlatOneByteStringEquals(MacroAssembler* masm, Register left, Register right, -- 2.7.4