Commit ab7622a0 authored by chunyang.dai's avatar chunyang.dai Committed by Commit bot

X87: [turbofan] Remove the no-context hack for JSToNumber.

port d211608a

original commit message:
  [turbofan] Remove the no-context hack for JSToNumber.

  The ToNumberStub is now able to handle all plain primitives (Numbers,
  Booleans, Null, Undefined and Strings) without context access.

BUG=

Review URL: https://codereview.chromium.org/810683002

Cr-Commit-Position: refs/heads/master@{#25833}
parent 283175d9
...@@ -2917,18 +2917,45 @@ void SubStringStub::Generate(MacroAssembler* masm) { ...@@ -2917,18 +2917,45 @@ void SubStringStub::Generate(MacroAssembler* masm) {
void ToNumberStub::Generate(MacroAssembler* masm) { void ToNumberStub::Generate(MacroAssembler* masm) {
// The ToNumber stub takes one argument in eax. // The ToNumber stub takes one argument in eax.
Label check_heap_number, call_builtin; Label not_smi;
__ JumpIfNotSmi(eax, &check_heap_number, Label::kNear); __ JumpIfNotSmi(eax, &not_smi, Label::kNear);
__ Ret(); __ Ret();
__ bind(&not_smi);
__ bind(&check_heap_number); Label not_heap_number;
__ CompareMap(eax, masm->isolate()->factory()->heap_number_map()); __ CompareMap(eax, masm->isolate()->factory()->heap_number_map());
__ j(not_equal, &call_builtin, Label::kNear); __ j(not_equal, &not_heap_number, Label::kNear);
__ Ret(); __ Ret();
__ bind(&not_heap_number);
Label not_string, slow_string;
__ CmpObjectType(eax, FIRST_NONSTRING_TYPE, edi);
// eax: object
// edi: object map
__ j(above_equal, &not_string, Label::kNear);
// Check if string has a cached array index.
__ test(FieldOperand(eax, String::kHashFieldOffset),
Immediate(String::kContainsCachedArrayIndexMask));
__ j(not_zero, &slow_string, Label::kNear);
__ mov(eax, FieldOperand(eax, String::kHashFieldOffset));
__ IndexFromHash(eax, eax);
__ Ret();
__ bind(&slow_string);
__ pop(ecx); // Pop return address.
__ push(eax); // Push argument.
__ push(ecx); // Push return address.
__ TailCallRuntime(Runtime::kStringToNumber, 1, 1);
__ bind(&not_string);
__ bind(&call_builtin); Label not_oddball;
__ pop(ecx); // Pop return address. __ CmpInstanceType(edi, ODDBALL_TYPE);
__ push(eax); __ j(not_equal, &not_oddball, Label::kNear);
__ mov(eax, FieldOperand(eax, Oddball::kToNumberOffset));
__ Ret();
__ bind(&not_oddball);
__ pop(ecx); // Pop return address.
__ push(eax); // Push argument.
__ push(ecx); // Push return address. __ push(ecx); // Push return address.
__ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION); __ InvokeBuiltin(Builtins::TO_NUMBER, JUMP_FUNCTION);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment