Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Side by Side Diff: src/x64/builtins-x64.cc

Issue 2051113002: [stubs] ToNumberStub --> ToNumber builtin. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix full-code on non-x64 platforms Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ppc/code-stubs-ppc.cc ('k') | src/x64/code-stubs-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_X64 5 #if V8_TARGET_ARCH_X64
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/codegen.h" 8 #include "src/codegen.h"
9 #include "src/deoptimizer.h" 9 #include "src/deoptimizer.h"
10 #include "src/full-codegen/full-codegen.h" 10 #include "src/full-codegen/full-codegen.h"
(...skipping 1645 matching lines...) Expand 10 before | Expand all | Expand 10 after
1656 __ bind(&loop); 1656 __ bind(&loop);
1657 { 1657 {
1658 // Check if all parameters done. 1658 // Check if all parameters done.
1659 __ testp(rcx, rcx); 1659 __ testp(rcx, rcx);
1660 __ j(zero, &done_loop); 1660 __ j(zero, &done_loop);
1661 1661
1662 // Load the next parameter tagged value into rbx. 1662 // Load the next parameter tagged value into rbx.
1663 __ movp(rbx, Operand(rsp, rcx, times_pointer_size, 0)); 1663 __ movp(rbx, Operand(rsp, rcx, times_pointer_size, 0));
1664 1664
1665 // Load the double value of the parameter into xmm1, maybe converting the 1665 // Load the double value of the parameter into xmm1, maybe converting the
1666 // parameter to a number first using the ToNumberStub if necessary. 1666 // parameter to a number first using the ToNumber builtin if necessary.
1667 Label convert, convert_smi, convert_number, done_convert; 1667 Label convert, convert_smi, convert_number, done_convert;
1668 __ bind(&convert); 1668 __ bind(&convert);
1669 __ JumpIfSmi(rbx, &convert_smi); 1669 __ JumpIfSmi(rbx, &convert_smi);
1670 __ JumpIfRoot(FieldOperand(rbx, HeapObject::kMapOffset), 1670 __ JumpIfRoot(FieldOperand(rbx, HeapObject::kMapOffset),
1671 Heap::kHeapNumberMapRootIndex, &convert_number); 1671 Heap::kHeapNumberMapRootIndex, &convert_number);
1672 { 1672 {
1673 // Parameter is not a Number, use the ToNumberStub to convert it. 1673 // Parameter is not a Number, use the ToNumber builtin to convert it.
1674 FrameScope scope(masm, StackFrame::INTERNAL); 1674 FrameScope scope(masm, StackFrame::INTERNAL);
1675 __ Integer32ToSmi(rax, rax); 1675 __ Integer32ToSmi(rax, rax);
1676 __ Integer32ToSmi(rcx, rcx); 1676 __ Integer32ToSmi(rcx, rcx);
1677 __ Push(rax); 1677 __ Push(rax);
1678 __ Push(rcx); 1678 __ Push(rcx);
1679 __ Push(rdx); 1679 __ Push(rdx);
1680 __ movp(rax, rbx); 1680 __ movp(rax, rbx);
1681 ToNumberStub stub(masm->isolate()); 1681 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET);
1682 __ CallStub(&stub);
1683 __ movp(rbx, rax); 1682 __ movp(rbx, rax);
1684 __ Pop(rdx); 1683 __ Pop(rdx);
1685 __ Pop(rcx); 1684 __ Pop(rcx);
1686 __ Pop(rax); 1685 __ Pop(rax);
1687 { 1686 {
1688 // Restore the double accumulator value (xmm0). 1687 // Restore the double accumulator value (xmm0).
1689 Label restore_smi, done_restore; 1688 Label restore_smi, done_restore;
1690 __ JumpIfSmi(rdx, &restore_smi, Label::kNear); 1689 __ JumpIfSmi(rdx, &restore_smi, Label::kNear);
1691 __ Movsd(xmm0, FieldOperand(rdx, HeapNumber::kValueOffset)); 1690 __ Movsd(xmm0, FieldOperand(rdx, HeapNumber::kValueOffset));
1692 __ jmp(&done_restore, Label::kNear); 1691 __ jmp(&done_restore, Label::kNear);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 __ testp(rax, rax); 1761 __ testp(rax, rax);
1763 __ j(zero, &no_arguments, Label::kNear); 1762 __ j(zero, &no_arguments, Label::kNear);
1764 __ movp(rbx, args.GetArgumentOperand(1)); 1763 __ movp(rbx, args.GetArgumentOperand(1));
1765 __ PopReturnAddressTo(rcx); 1764 __ PopReturnAddressTo(rcx);
1766 __ leap(rsp, Operand(rsp, rax, times_pointer_size, kPointerSize)); 1765 __ leap(rsp, Operand(rsp, rax, times_pointer_size, kPointerSize));
1767 __ PushReturnAddressFrom(rcx); 1766 __ PushReturnAddressFrom(rcx);
1768 __ movp(rax, rbx); 1767 __ movp(rax, rbx);
1769 } 1768 }
1770 1769
1771 // 2a. Convert the first argument to a number. 1770 // 2a. Convert the first argument to a number.
1772 ToNumberStub stub(masm->isolate()); 1771 __ Jump(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET);
1773 __ TailCallStub(&stub);
1774 1772
1775 // 2b. No arguments, return +0 (already in rax). 1773 // 2b. No arguments, return +0 (already in rax).
1776 __ bind(&no_arguments); 1774 __ bind(&no_arguments);
1777 __ ret(1 * kPointerSize); 1775 __ ret(1 * kPointerSize);
1778 } 1776 }
1779 1777
1780 1778
1781 // static 1779 // static
1782 void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) { 1780 void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) {
1783 // ----------- S t a t e ------------- 1781 // ----------- S t a t e -------------
(...skipping 30 matching lines...) Expand all
1814 Label done_convert; 1812 Label done_convert;
1815 __ JumpIfSmi(rbx, &done_convert); 1813 __ JumpIfSmi(rbx, &done_convert);
1816 __ CompareRoot(FieldOperand(rbx, HeapObject::kMapOffset), 1814 __ CompareRoot(FieldOperand(rbx, HeapObject::kMapOffset),
1817 Heap::kHeapNumberMapRootIndex); 1815 Heap::kHeapNumberMapRootIndex);
1818 __ j(equal, &done_convert); 1816 __ j(equal, &done_convert);
1819 { 1817 {
1820 FrameScope scope(masm, StackFrame::INTERNAL); 1818 FrameScope scope(masm, StackFrame::INTERNAL);
1821 __ Push(rdx); 1819 __ Push(rdx);
1822 __ Push(rdi); 1820 __ Push(rdi);
1823 __ Move(rax, rbx); 1821 __ Move(rax, rbx);
1824 ToNumberStub stub(masm->isolate()); 1822 __ Call(masm->isolate()->builtins()->ToNumber(), RelocInfo::CODE_TARGET);
1825 __ CallStub(&stub);
1826 __ Move(rbx, rax); 1823 __ Move(rbx, rax);
1827 __ Pop(rdi); 1824 __ Pop(rdi);
1828 __ Pop(rdx); 1825 __ Pop(rdx);
1829 } 1826 }
1830 __ bind(&done_convert); 1827 __ bind(&done_convert);
1831 } 1828 }
1832 1829
1833 // 4. Check if new target and constructor differ. 1830 // 4. Check if new target and constructor differ.
1834 Label new_object; 1831 Label new_object;
1835 __ cmpp(rdx, rdi); 1832 __ cmpp(rdx, rdi);
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
2089 __ IndexFromHash(rax, rax); 2086 __ IndexFromHash(rax, rax);
2090 __ Ret(); 2087 __ Ret();
2091 2088
2092 __ bind(&runtime); 2089 __ bind(&runtime);
2093 __ PopReturnAddressTo(rcx); // Pop return address. 2090 __ PopReturnAddressTo(rcx); // Pop return address.
2094 __ Push(rax); // Push argument. 2091 __ Push(rax); // Push argument.
2095 __ PushReturnAddressFrom(rcx); // Push return address. 2092 __ PushReturnAddressFrom(rcx); // Push return address.
2096 __ TailCallRuntime(Runtime::kStringToNumber); 2093 __ TailCallRuntime(Runtime::kStringToNumber);
2097 } 2094 }
2098 2095
2096 // static
2097 void Builtins::Generate_ToNumber(MacroAssembler* masm) {
2098 // The ToNumber stub takes one argument in rax.
2099 Label not_smi;
2100 __ JumpIfNotSmi(rax, &not_smi, Label::kNear);
2101 __ Ret();
2102 __ bind(&not_smi);
2103
2104 Label not_heap_number;
2105 __ CompareRoot(FieldOperand(rax, HeapObject::kMapOffset),
2106 Heap::kHeapNumberMapRootIndex);
2107 __ j(not_equal, &not_heap_number, Label::kNear);
2108 __ Ret();
2109 __ bind(&not_heap_number);
2110
2111 __ Jump(masm->isolate()->builtins()->NonNumberToNumber(),
2112 RelocInfo::CODE_TARGET);
2113 }
2114
2115 // static
2116 void Builtins::Generate_NonNumberToNumber(MacroAssembler* masm) {
2117 // The NonNumberToNumber stub takes one argument in rax.
2118 __ AssertNotNumber(rax);
2119
2120 Label not_string;
2121 __ CmpObjectType(rax, FIRST_NONSTRING_TYPE, rdi);
2122 // rax: object
2123 // rdi: object map
2124 __ j(above_equal, &not_string, Label::kNear);
2125 __ Jump(masm->isolate()->builtins()->StringToNumber(),
2126 RelocInfo::CODE_TARGET);
2127 __ bind(&not_string);
2128
2129 Label not_oddball;
2130 __ CmpInstanceType(rdi, ODDBALL_TYPE);
2131 __ j(not_equal, &not_oddball, Label::kNear);
2132 __ movp(rax, FieldOperand(rax, Oddball::kToNumberOffset));
2133 __ Ret();
2134 __ bind(&not_oddball);
2135
2136 __ PopReturnAddressTo(rcx); // Pop return address.
2137 __ Push(rax); // Push argument.
2138 __ PushReturnAddressFrom(rcx); // Push return address.
2139 __ TailCallRuntime(Runtime::kToNumber);
2140 }
2141
2099 void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { 2142 void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
2100 // ----------- S t a t e ------------- 2143 // ----------- S t a t e -------------
2101 // -- rax : actual number of arguments 2144 // -- rax : actual number of arguments
2102 // -- rbx : expected number of arguments 2145 // -- rbx : expected number of arguments
2103 // -- rdx : new target (passed through to callee) 2146 // -- rdx : new target (passed through to callee)
2104 // -- rdi : function (passed through to callee) 2147 // -- rdi : function (passed through to callee)
2105 // ----------------------------------- 2148 // -----------------------------------
2106 2149
2107 Label invoke, dont_adapt_arguments, stack_overflow; 2150 Label invoke, dont_adapt_arguments, stack_overflow;
2108 Counters* counters = masm->isolate()->counters(); 2151 Counters* counters = masm->isolate()->counters();
(...skipping 872 matching lines...) Expand 10 before | Expand all | Expand 10 after
2981 __ ret(0); 3024 __ ret(0);
2982 } 3025 }
2983 3026
2984 3027
2985 #undef __ 3028 #undef __
2986 3029
2987 } // namespace internal 3030 } // namespace internal
2988 } // namespace v8 3031 } // namespace v8
2989 3032
2990 #endif // V8_TARGET_ARCH_X64 3033 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/ppc/code-stubs-ppc.cc ('k') | src/x64/code-stubs-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698