[stubs] Port ToString platform stub to TurboFan.

R=bmeurer@chromium.org
BUG=

Review-Url: https://codereview.chromium.org/2380973002
Cr-Commit-Position: refs/heads/master@{#39872}
This commit is contained in:
tebbi 2016-09-29 07:50:41 -07:00 committed by Commit bot
parent f4dfb6fbe1
commit 8c87212186
23 changed files with 82 additions and 335 deletions

View File

@ -2124,35 +2124,6 @@ void StringHelper::GenerateCopyCharacters(MacroAssembler* masm,
__ bind(&done);
}
void ToStringStub::Generate(MacroAssembler* masm) {
// The ToString stub takes one argument in r0.
Label is_number;
__ JumpIfSmi(r0, &is_number);
__ CompareObjectType(r0, r1, r1, FIRST_NONSTRING_TYPE);
// r0: receiver
// r1: receiver instance type
__ Ret(lo);
Label not_heap_number;
__ cmp(r1, Operand(HEAP_NUMBER_TYPE));
__ b(ne, &not_heap_number);
__ bind(&is_number);
NumberToStringStub stub(isolate());
__ TailCallStub(&stub);
__ bind(&not_heap_number);
Label not_oddball;
__ cmp(r1, Operand(ODDBALL_TYPE));
__ b(ne, &not_oddball);
__ ldr(r0, FieldMemOperand(r0, Oddball::kToStringOffset));
__ Ret();
__ bind(&not_oddball);
__ push(r0); // Push argument.
__ TailCallRuntime(Runtime::kToString);
}
void StringHelper::GenerateFlatOneByteStringEquals(
MacroAssembler* masm, Register left, Register right, Register scratch1,

View File

@ -2673,37 +2673,6 @@ void CompareICStub::GenerateMiss(MacroAssembler* masm) {
__ Jump(stub_entry);
}
void ToStringStub::Generate(MacroAssembler* masm) {
// The ToString stub takes one argument in x0.
Label is_number;
__ JumpIfSmi(x0, &is_number);
Label not_string;
__ JumpIfObjectType(x0, x1, x1, FIRST_NONSTRING_TYPE, &not_string, hs);
// x0: receiver
// x1: receiver instance type
__ Ret();
__ Bind(&not_string);
Label not_heap_number;
__ Cmp(x1, HEAP_NUMBER_TYPE);
__ B(ne, &not_heap_number);
__ Bind(&is_number);
NumberToStringStub stub(isolate());
__ TailCallStub(&stub);
__ Bind(&not_heap_number);
Label not_oddball;
__ Cmp(x1, ODDBALL_TYPE);
__ B(ne, &not_oddball);
__ Ldr(x0, FieldMemOperand(x0, Oddball::kToStringOffset));
__ Ret();
__ Bind(&not_oddball);
__ Push(x0); // Push argument.
__ TailCallRuntime(Runtime::kToString);
}
void StringHelper::GenerateFlatOneByteStringEquals(
MacroAssembler* masm, Register left, Register right, Register scratch1,

View File

@ -387,10 +387,9 @@ void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
__ bind(&to_string);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(r2);
__ EnterBuiltinFrame(cp, r1, r2);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ LeaveBuiltinFrame(cp, r1, r2);
__ SmiUntag(r2);
}
@ -449,12 +448,11 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
__ bind(&convert);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(r6);
__ EnterBuiltinFrame(cp, r1, r6);
__ Push(r3);
__ Move(r0, r2);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ Move(r2, r0);
__ Pop(r3);
__ LeaveBuiltinFrame(cp, r1, r6);

View File

@ -379,10 +379,9 @@ void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
__ Bind(&to_string);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(x2);
__ EnterBuiltinFrame(cp, x1, x2);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ LeaveBuiltinFrame(cp, x1, x2);
__ SmiUntag(x2);
}
@ -442,12 +441,11 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
__ Bind(&convert);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(x6);
__ EnterBuiltinFrame(cp, x1, x6);
__ Push(x3);
__ Move(x0, x2);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ Move(x2, x0);
__ Pop(x3);
__ LeaveBuiltinFrame(cp, x1, x6);

View File

@ -151,6 +151,63 @@ void Builtins::Generate_ToNumber(CodeStubAssembler* assembler) {
assembler->Return(assembler->ToNumber(context, input));
}
void Builtins::Generate_ToString(CodeStubAssembler* assembler) {
typedef CodeStubAssembler::Label Label;
typedef compiler::Node Node;
typedef TypeConversionDescriptor Descriptor;
Node* input = assembler->Parameter(Descriptor::kArgument);
Node* context = assembler->Parameter(Descriptor::kContext);
Label is_number(assembler);
Label runtime(assembler);
assembler->GotoIf(assembler->WordIsSmi(input), &is_number);
Node* input_map = assembler->LoadMap(input);
Node* input_instance_type = assembler->LoadMapInstanceType(input_map);
Label not_string(assembler);
assembler->GotoIf(
assembler->Int32GreaterThanOrEqual(
input_instance_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)),
&not_string);
assembler->Return(input);
Label not_heap_number(assembler);
assembler->Bind(&not_string);
{
assembler->GotoUnless(
assembler->WordEqual(input_map, assembler->HeapNumberMapConstant()),
&not_heap_number);
assembler->Goto(&is_number);
}
assembler->Bind(&is_number);
{
// TODO(tebbi): inline as soon as NumberToString is in the CodeStubAssembler
Callable callable = CodeFactory::NumberToString(assembler->isolate());
assembler->Return(assembler->CallStub(callable, context, input));
}
assembler->Bind(&not_heap_number);
{
assembler->GotoIf(
assembler->Word32NotEqual(input_instance_type,
assembler->Int32Constant(ODDBALL_TYPE)),
&runtime);
assembler->Return(
assembler->LoadObjectField(input, Oddball::kToStringOffset));
}
assembler->Bind(&runtime);
{
assembler->Return(
assembler->CallRuntime(Runtime::kToString, context, input));
}
}
Handle<Code> Builtins::OrdinaryToPrimitive(OrdinaryToPrimitiveHint hint) {
switch (hint) {
case OrdinaryToPrimitiveHint::kNumber:

View File

@ -171,6 +171,7 @@ namespace internal {
TFS(ToName, BUILTIN, kNoExtraICState, TypeConversion) \
TFS(NonNumberToNumber, BUILTIN, kNoExtraICState, TypeConversion) \
TFS(ToNumber, BUILTIN, kNoExtraICState, TypeConversion) \
TFS(ToString, BUILTIN, kNoExtraICState, TypeConversion) \
\
/* Handlers */ \
ASH(KeyedLoadIC_Megamorphic, KEYED_LOAD_IC, kNoExtraICState) \

View File

@ -2041,10 +2041,9 @@ void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
__ bind(&to_string);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(ebx);
__ EnterBuiltinFrame(esi, edi, ebx);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ LeaveBuiltinFrame(esi, edi, ebx);
__ SmiUntag(ebx);
}
@ -2108,11 +2107,10 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
__ bind(&convert);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(ebx);
__ EnterBuiltinFrame(esi, edi, ebx);
__ Push(edx);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ Pop(edx);
__ LeaveBuiltinFrame(esi, edi, ebx);
__ SmiUntag(ebx);

View File

@ -395,10 +395,9 @@ void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
__ bind(&to_string);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(t0);
__ EnterBuiltinFrame(cp, a1, t0);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ LeaveBuiltinFrame(cp, a1, t0);
__ SmiUntag(t0);
}
@ -459,11 +458,10 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
__ bind(&convert);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(t0);
__ EnterBuiltinFrame(cp, a1, t0);
__ Push(a3);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ Move(a0, v0);
__ Pop(a3);
__ LeaveBuiltinFrame(cp, a1, t0);

View File

@ -394,10 +394,9 @@ void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
__ bind(&to_string);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(t0);
__ EnterBuiltinFrame(cp, a1, t0);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ LeaveBuiltinFrame(cp, a1, t0);
__ SmiUntag(t0);
}
@ -458,11 +457,10 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
__ bind(&convert);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(t0);
__ EnterBuiltinFrame(cp, a1, t0);
__ Push(a3);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ Move(a0, v0);
__ Pop(a3);
__ LeaveBuiltinFrame(cp, a1, t0);

View File

@ -398,10 +398,9 @@ void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
__ bind(&to_string);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(r5);
__ EnterBuiltinFrame(cp, r4, r5);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ LeaveBuiltinFrame(cp, r4, r5);
__ SmiUntag(r5);
}
@ -462,12 +461,11 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
__ bind(&convert);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(r9);
__ EnterBuiltinFrame(cp, r4, r9);
__ Push(r6);
__ mr(r3, r5);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ mr(r5, r3);
__ Pop(r6);
__ LeaveBuiltinFrame(cp, r4, r9);

View File

@ -396,10 +396,9 @@ void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
__ bind(&to_string);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(r4);
__ EnterBuiltinFrame(cp, r3, r4);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ LeaveBuiltinFrame(cp, r3, r4);
__ SmiUntag(r4);
}
@ -459,12 +458,11 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
__ bind(&convert);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(r8);
__ EnterBuiltinFrame(cp, r3, r8);
__ Push(r5);
__ LoadRR(r2, r4);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ LoadRR(r4, r2);
__ Pop(r5);
__ LeaveBuiltinFrame(cp, r3, r8);

View File

@ -2004,9 +2004,8 @@ void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
__ bind(&to_string);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ EnterBuiltinFrame(rsi, rdi, r8);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ LeaveBuiltinFrame(rsi, rdi, r8);
}
__ jmp(&drop_frame_and_ret, Label::kNear);
@ -2073,11 +2072,10 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
__ bind(&convert);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ EnterBuiltinFrame(rsi, rdi, r8);
__ Push(rdx);
__ Move(rax, rbx);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ Move(rbx, rax);
__ Pop(rdx);
__ LeaveBuiltinFrame(rsi, rdi, r8);

View File

@ -2058,10 +2058,9 @@ void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
__ bind(&to_string);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(ebx);
__ EnterBuiltinFrame(esi, edi, ebx);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ LeaveBuiltinFrame(esi, edi, ebx);
__ SmiUntag(ebx);
}
@ -2125,11 +2124,10 @@ void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
__ bind(&convert);
{
FrameScope scope(masm, StackFrame::MANUAL);
ToStringStub stub(masm->isolate());
__ SmiTag(ebx);
__ EnterBuiltinFrame(esi, edi, ebx);
__ Push(edx);
__ CallStub(&stub);
__ Call(masm->isolate()->builtins()->ToString(), RelocInfo::CODE_TARGET);
__ Pop(edx);
__ LeaveBuiltinFrame(esi, edi, ebx);
__ SmiUntag(ebx);

View File

@ -191,8 +191,8 @@ Callable CodeFactory::StringToNumber(Isolate* isolate) {
// static
Callable CodeFactory::ToString(Isolate* isolate) {
ToStringStub stub(isolate);
return make_callable(stub);
return Callable(isolate->builtins()->ToString(),
TypeConversionDescriptor(isolate));
}
// static

View File

@ -7,6 +7,7 @@
#include <memory>
#include "src/bailout-reason.h"
#include "src/code-factory.h"
#include "src/crankshaft/hydrogen.h"
#include "src/crankshaft/lithium.h"
#include "src/field-index.h"
@ -1042,10 +1043,10 @@ HValue* CodeStubGraphBuilderBase::BuildToString(HValue* input, bool convert) {
}
if_inputisprimitive.End();
// Convert the primitive to a string value.
ToStringStub stub(isolate());
HValue* values[] = {context(), Pop()};
Push(AddUncasted<HCallWithDescriptor>(Add<HConstant>(stub.GetCode()), 0,
stub.GetCallInterfaceDescriptor(),
Callable toString = CodeFactory::ToString(isolate());
Push(AddUncasted<HCallWithDescriptor>(Add<HConstant>(toString.code()), 0,
toString.descriptor(),
ArrayVector(values)));
}
if_inputisstring.End();

View File

@ -43,7 +43,6 @@ class ObjectLiteral;
V(StoreBufferOverflow) \
V(StoreElement) \
V(SubString) \
V(ToString) \
V(StoreIC) \
V(KeyedStoreIC) \
V(KeyedLoadIC) \
@ -3114,14 +3113,6 @@ class SubStringStub : public TurboFanCodeStub {
DEFINE_CODE_STUB(SubString, TurboFanCodeStub);
};
class ToStringStub final : public PlatformCodeStub {
public:
explicit ToStringStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
DEFINE_CALL_INTERFACE_DESCRIPTOR(TypeConversion);
DEFINE_PLATFORM_CODE_STUB(ToString, PlatformCodeStub);
};
class ToObjectStub final : public TurboFanCodeStub {
public:
explicit ToObjectStub(Isolate* isolate) : TurboFanCodeStub(isolate) {}

View File

@ -2065,40 +2065,6 @@ void StringHelper::GenerateCopyCharacters(MacroAssembler* masm,
__ bind(&done);
}
void ToStringStub::Generate(MacroAssembler* masm) {
// The ToString stub takes one argument in eax.
Label is_number;
__ JumpIfSmi(eax, &is_number, Label::kNear);
Label not_string;
__ CmpObjectType(eax, FIRST_NONSTRING_TYPE, edi);
// eax: receiver
// edi: receiver map
__ j(above_equal, &not_string, Label::kNear);
__ Ret();
__ bind(&not_string);
Label not_heap_number;
__ CompareMap(eax, masm->isolate()->factory()->heap_number_map());
__ j(not_equal, &not_heap_number, Label::kNear);
__ bind(&is_number);
NumberToStringStub stub(isolate());
__ TailCallStub(&stub);
__ bind(&not_heap_number);
Label not_oddball;
__ CmpInstanceType(edi, ODDBALL_TYPE);
__ j(not_equal, &not_oddball, Label::kNear);
__ mov(eax, FieldOperand(eax, Oddball::kToStringOffset));
__ Ret();
__ bind(&not_oddball);
__ pop(ecx); // Pop return address.
__ push(eax); // Push argument.
__ push(ecx); // Push return address.
__ TailCallRuntime(Runtime::kToString);
}
void StringHelper::GenerateFlatOneByteStringEquals(MacroAssembler* masm,
Register left,

View File

@ -2268,37 +2268,6 @@ void StringHelper::GenerateCopyCharacters(MacroAssembler* masm,
__ bind(&done);
}
void ToStringStub::Generate(MacroAssembler* masm) {
// The ToString stub takes on argument in a0.
Label is_number;
__ JumpIfSmi(a0, &is_number);
Label not_string;
__ GetObjectType(a0, a1, a1);
// a0: receiver
// a1: receiver instance type
__ Branch(&not_string, ge, a1, Operand(FIRST_NONSTRING_TYPE));
__ Ret(USE_DELAY_SLOT);
__ mov(v0, a0);
__ bind(&not_string);
Label not_heap_number;
__ Branch(&not_heap_number, ne, a1, Operand(HEAP_NUMBER_TYPE));
__ bind(&is_number);
NumberToStringStub stub(isolate());
__ TailCallStub(&stub);
__ bind(&not_heap_number);
Label not_oddball;
__ Branch(&not_oddball, ne, a1, Operand(ODDBALL_TYPE));
__ Ret(USE_DELAY_SLOT);
__ lw(v0, FieldMemOperand(a0, Oddball::kToStringOffset));
__ bind(&not_oddball);
__ push(a0); // Push argument.
__ TailCallRuntime(Runtime::kToString);
}
void StringHelper::GenerateFlatOneByteStringEquals(
MacroAssembler* masm, Register left, Register right, Register scratch1,

View File

@ -2271,37 +2271,6 @@ void StringHelper::GenerateCopyCharacters(MacroAssembler* masm,
__ bind(&done);
}
void ToStringStub::Generate(MacroAssembler* masm) {
// The ToString stub takes on argument in a0.
Label is_number;
__ JumpIfSmi(a0, &is_number);
Label not_string;
__ GetObjectType(a0, a1, a1);
// a0: receiver
// a1: receiver instance type
__ Branch(&not_string, ge, a1, Operand(FIRST_NONSTRING_TYPE));
__ Ret(USE_DELAY_SLOT);
__ mov(v0, a0);
__ bind(&not_string);
Label not_heap_number;
__ Branch(&not_heap_number, ne, a1, Operand(HEAP_NUMBER_TYPE));
__ bind(&is_number);
NumberToStringStub stub(isolate());
__ TailCallStub(&stub);
__ bind(&not_heap_number);
Label not_oddball;
__ Branch(&not_oddball, ne, a1, Operand(ODDBALL_TYPE));
__ Ret(USE_DELAY_SLOT);
__ ld(v0, FieldMemOperand(a0, Oddball::kToStringOffset));
__ bind(&not_oddball);
__ push(a0); // Push argument.
__ TailCallRuntime(Runtime::kToString);
}
void StringHelper::GenerateFlatOneByteStringEquals(
MacroAssembler* masm, Register left, Register right, Register scratch1,

View File

@ -2207,35 +2207,6 @@ void StringHelper::GenerateCopyCharacters(MacroAssembler* masm, Register dest,
__ bind(&done);
}
void ToStringStub::Generate(MacroAssembler* masm) {
// The ToString stub takes one argument in r3.
Label is_number;
__ JumpIfSmi(r3, &is_number);
__ CompareObjectType(r3, r4, r4, FIRST_NONSTRING_TYPE);
// r3: receiver
// r4: receiver instance type
__ Ret(lt);
Label not_heap_number;
__ cmpi(r4, Operand(HEAP_NUMBER_TYPE));
__ bne(&not_heap_number);
__ bind(&is_number);
NumberToStringStub stub(isolate());
__ TailCallStub(&stub);
__ bind(&not_heap_number);
Label not_oddball;
__ cmpi(r4, Operand(ODDBALL_TYPE));
__ bne(&not_oddball);
__ LoadP(r3, FieldMemOperand(r3, Oddball::kToStringOffset));
__ Ret();
__ bind(&not_oddball);
__ push(r3); // Push argument.
__ TailCallRuntime(Runtime::kToString);
}
void StringHelper::GenerateFlatOneByteStringEquals(MacroAssembler* masm,
Register left,

View File

@ -2202,38 +2202,6 @@ void StringHelper::GenerateCopyCharacters(MacroAssembler* masm, Register dest,
__ bind(&done);
}
void ToStringStub::Generate(MacroAssembler* masm) {
// The ToString stub takes one argument in r2.
Label done;
Label is_number;
__ JumpIfSmi(r2, &is_number);
__ CompareObjectType(r2, r3, r3, FIRST_NONSTRING_TYPE);
// r2: receiver
// r3: receiver instance type
__ blt(&done);
Label not_heap_number;
__ CmpP(r3, Operand(HEAP_NUMBER_TYPE));
__ bne(&not_heap_number);
__ bind(&is_number);
NumberToStringStub stub(isolate());
__ TailCallStub(&stub);
__ bind(&not_heap_number);
Label not_oddball;
__ CmpP(r3, Operand(ODDBALL_TYPE));
__ bne(&not_oddball);
__ LoadP(r2, FieldMemOperand(r2, Oddball::kToStringOffset));
__ Ret();
__ bind(&not_oddball);
__ push(r2); // Push argument.
__ TailCallRuntime(Runtime::kToString);
__ bind(&done);
__ Ret();
}
void StringHelper::GenerateFlatOneByteStringEquals(MacroAssembler* masm,
Register left,

View File

@ -2011,40 +2011,6 @@ void StringHelper::GenerateCopyCharacters(MacroAssembler* masm,
__ bind(&done);
}
void ToStringStub::Generate(MacroAssembler* masm) {
// The ToString stub takes one argument in rax.
Label is_number;
__ JumpIfSmi(rax, &is_number, Label::kNear);
Label not_string;
__ CmpObjectType(rax, FIRST_NONSTRING_TYPE, rdi);
// rax: receiver
// rdi: receiver map
__ j(above_equal, &not_string, Label::kNear);
__ Ret();
__ bind(&not_string);
Label not_heap_number;
__ CompareRoot(rdi, Heap::kHeapNumberMapRootIndex);
__ j(not_equal, &not_heap_number, Label::kNear);
__ bind(&is_number);
NumberToStringStub stub(isolate());
__ TailCallStub(&stub);
__ bind(&not_heap_number);
Label not_oddball;
__ CmpInstanceType(rdi, ODDBALL_TYPE);
__ j(not_equal, &not_oddball, Label::kNear);
__ movp(rax, FieldOperand(rax, Oddball::kToStringOffset));
__ Ret();
__ bind(&not_oddball);
__ PopReturnAddressTo(rcx); // Pop return address.
__ Push(rax); // Push argument.
__ PushReturnAddressFrom(rcx); // Push return address.
__ TailCallRuntime(Runtime::kToString);
}
void StringHelper::GenerateFlatOneByteStringEquals(MacroAssembler* masm,
Register left,

View File

@ -1907,40 +1907,6 @@ void StringHelper::GenerateCopyCharacters(MacroAssembler* masm,
__ bind(&done);
}
void ToStringStub::Generate(MacroAssembler* masm) {
// The ToString stub takes one argument in eax.
Label is_number;
__ JumpIfSmi(eax, &is_number, Label::kNear);
Label not_string;
__ CmpObjectType(eax, FIRST_NONSTRING_TYPE, edi);
// eax: receiver
// edi: receiver map
__ j(above_equal, &not_string, Label::kNear);
__ Ret();
__ bind(&not_string);
Label not_heap_number;
__ CompareMap(eax, masm->isolate()->factory()->heap_number_map());
__ j(not_equal, &not_heap_number, Label::kNear);
__ bind(&is_number);
NumberToStringStub stub(isolate());
__ TailCallStub(&stub);
__ bind(&not_heap_number);
Label not_oddball;
__ CmpInstanceType(edi, ODDBALL_TYPE);
__ j(not_equal, &not_oddball, Label::kNear);
__ mov(eax, FieldOperand(eax, Oddball::kToStringOffset));
__ Ret();
__ bind(&not_oddball);
__ pop(ecx); // Pop return address.
__ push(eax); // Push argument.
__ push(ecx); // Push return address.
__ TailCallRuntime(Runtime::kToString);
}
void StringHelper::GenerateFlatOneByteStringEquals(MacroAssembler* masm,
Register left,