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

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

Issue 1467923004: PPC: Make arguments adaptor not clobber new.target. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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_PPC 5 #if V8_TARGET_ARCH_PPC
6 6
7 #include "src/codegen.h" 7 #include "src/codegen.h"
8 #include "src/debug/debug.h" 8 #include "src/debug/debug.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 1410 matching lines...) Expand 10 before | Expand all | Expand 10 after
1421 Generate_ConstructHelper(masm); 1421 Generate_ConstructHelper(masm);
1422 } 1422 }
1423 1423
1424 1424
1425 static void ArgumentAdaptorStackCheck(MacroAssembler* masm, 1425 static void ArgumentAdaptorStackCheck(MacroAssembler* masm,
1426 Label* stack_overflow) { 1426 Label* stack_overflow) {
1427 // ----------- S t a t e ------------- 1427 // ----------- S t a t e -------------
1428 // -- r3 : actual number of arguments 1428 // -- r3 : actual number of arguments
1429 // -- r4 : function (passed through to callee) 1429 // -- r4 : function (passed through to callee)
1430 // -- r5 : expected number of arguments 1430 // -- r5 : expected number of arguments
1431 // -- r6 : new target (passed through to callee)
1431 // ----------------------------------- 1432 // -----------------------------------
1432 // Check the stack for overflow. We are not trying to catch 1433 // Check the stack for overflow. We are not trying to catch
1433 // interruptions (e.g. debug break and preemption) here, so the "real stack 1434 // interruptions (e.g. debug break and preemption) here, so the "real stack
1434 // limit" is checked. 1435 // limit" is checked.
1435 __ LoadRoot(r8, Heap::kRealStackLimitRootIndex); 1436 __ LoadRoot(r8, Heap::kRealStackLimitRootIndex);
1436 // Make r8 the space we have left. The stack might already be overflowed 1437 // Make r8 the space we have left. The stack might already be overflowed
1437 // here which will cause r8 to become negative. 1438 // here which will cause r8 to become negative.
1438 __ sub(r8, sp, r8); 1439 __ sub(r8, sp, r8);
1439 // Check if the arguments will overflow the stack. 1440 // Check if the arguments will overflow the stack.
1440 __ ShiftLeftImm(r0, r5, Operand(kPointerSizeLog2)); 1441 __ ShiftLeftImm(r0, r5, Operand(kPointerSizeLog2));
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
1710 __ CallRuntime(Runtime::kThrowCalledNonCallable, 1); 1711 __ CallRuntime(Runtime::kThrowCalledNonCallable, 1);
1711 } 1712 }
1712 } 1713 }
1713 1714
1714 1715
1715 void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { 1716 void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) {
1716 // ----------- S t a t e ------------- 1717 // ----------- S t a t e -------------
1717 // -- r3 : actual number of arguments 1718 // -- r3 : actual number of arguments
1718 // -- r4 : function (passed through to callee) 1719 // -- r4 : function (passed through to callee)
1719 // -- r5 : expected number of arguments 1720 // -- r5 : expected number of arguments
1721 // -- r6 : new target (passed through to callee)
1720 // ----------------------------------- 1722 // -----------------------------------
1721 1723
1722 Label stack_overflow; 1724 Label invoke, dont_adapt_arguments, stack_overflow;
1723 ArgumentAdaptorStackCheck(masm, &stack_overflow);
1724 Label invoke, dont_adapt_arguments;
1725 1725
1726 Label enough, too_few; 1726 Label enough, too_few;
1727 __ LoadP(ip, FieldMemOperand(r4, JSFunction::kCodeEntryOffset)); 1727 __ LoadP(ip, FieldMemOperand(r4, JSFunction::kCodeEntryOffset));
1728 __ cmp(r3, r5); 1728 __ cmp(r3, r5);
1729 __ blt(&too_few); 1729 __ blt(&too_few);
1730 __ cmpi(r5, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel)); 1730 __ cmpi(r5, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
1731 __ beq(&dont_adapt_arguments); 1731 __ beq(&dont_adapt_arguments);
1732 1732
1733 { // Enough parameters: actual >= expected 1733 { // Enough parameters: actual >= expected
1734 __ bind(&enough); 1734 __ bind(&enough);
1735 EnterArgumentsAdaptorFrame(masm); 1735 EnterArgumentsAdaptorFrame(masm);
1736 ArgumentAdaptorStackCheck(masm, &stack_overflow);
1736 1737
1737 // Calculate copy start address into r3 and copy end address into r6. 1738 // Calculate copy start address into r3 and copy end address into r7.
1738 // r3: actual number of arguments as a smi 1739 // r3: actual number of arguments as a smi
1739 // r4: function 1740 // r4: function
1740 // r5: expected number of arguments 1741 // r5: expected number of arguments
1742 // r6: new target (passed through to callee)
1741 // ip: code entry to call 1743 // ip: code entry to call
1742 __ SmiToPtrArrayOffset(r3, r3); 1744 __ SmiToPtrArrayOffset(r3, r3);
1743 __ add(r3, r3, fp); 1745 __ add(r3, r3, fp);
1744 // adjust for return address and receiver 1746 // adjust for return address and receiver
1745 __ addi(r3, r3, Operand(2 * kPointerSize)); 1747 __ addi(r3, r3, Operand(2 * kPointerSize));
1746 __ ShiftLeftImm(r6, r5, Operand(kPointerSizeLog2)); 1748 __ ShiftLeftImm(r7, r5, Operand(kPointerSizeLog2));
1747 __ sub(r6, r3, r6); 1749 __ sub(r7, r3, r7);
1748 1750
1749 // Copy the arguments (including the receiver) to the new stack frame. 1751 // Copy the arguments (including the receiver) to the new stack frame.
1750 // r3: copy start address 1752 // r3: copy start address
1751 // r4: function 1753 // r4: function
1752 // r5: expected number of arguments 1754 // r5: expected number of arguments
1753 // r6: copy end address 1755 // r6: new target (passed through to callee)
1756 // r7: copy end address
1754 // ip: code entry to call 1757 // ip: code entry to call
1755 1758
1756 Label copy; 1759 Label copy;
1757 __ bind(&copy); 1760 __ bind(&copy);
1758 __ LoadP(r0, MemOperand(r3, 0)); 1761 __ LoadP(r0, MemOperand(r3, 0));
1759 __ push(r0); 1762 __ push(r0);
1760 __ cmp(r3, r6); // Compare before moving to next argument. 1763 __ cmp(r3, r7); // Compare before moving to next argument.
1761 __ subi(r3, r3, Operand(kPointerSize)); 1764 __ subi(r3, r3, Operand(kPointerSize));
1762 __ bne(&copy); 1765 __ bne(&copy);
1763 1766
1764 __ b(&invoke); 1767 __ b(&invoke);
1765 } 1768 }
1766 1769
1767 { // Too few parameters: Actual < expected 1770 { // Too few parameters: Actual < expected
1768 __ bind(&too_few); 1771 __ bind(&too_few);
1769 1772
1770 // If the function is strong we need to throw an error. 1773 // If the function is strong we need to throw an error.
(...skipping 15 matching lines...) Expand all
1786 __ bge(&no_strong_error); 1789 __ bge(&no_strong_error);
1787 1790
1788 { 1791 {
1789 FrameScope frame(masm, StackFrame::MANUAL); 1792 FrameScope frame(masm, StackFrame::MANUAL);
1790 EnterArgumentsAdaptorFrame(masm); 1793 EnterArgumentsAdaptorFrame(masm);
1791 __ CallRuntime(Runtime::kThrowStrongModeTooFewArguments, 0); 1794 __ CallRuntime(Runtime::kThrowStrongModeTooFewArguments, 0);
1792 } 1795 }
1793 1796
1794 __ bind(&no_strong_error); 1797 __ bind(&no_strong_error);
1795 EnterArgumentsAdaptorFrame(masm); 1798 EnterArgumentsAdaptorFrame(masm);
1799 ArgumentAdaptorStackCheck(masm, &stack_overflow);
1796 1800
1797 // Calculate copy start address into r0 and copy end address is fp. 1801 // Calculate copy start address into r0 and copy end address is fp.
1798 // r3: actual number of arguments as a smi 1802 // r3: actual number of arguments as a smi
1799 // r4: function 1803 // r4: function
1800 // r5: expected number of arguments 1804 // r5: expected number of arguments
1805 // r6: new target (passed through to callee)
1801 // ip: code entry to call 1806 // ip: code entry to call
1802 __ SmiToPtrArrayOffset(r3, r3); 1807 __ SmiToPtrArrayOffset(r3, r3);
1803 __ add(r3, r3, fp); 1808 __ add(r3, r3, fp);
1804 1809
1805 // Copy the arguments (including the receiver) to the new stack frame. 1810 // Copy the arguments (including the receiver) to the new stack frame.
1806 // r3: copy start address 1811 // r3: copy start address
1807 // r4: function 1812 // r4: function
1808 // r5: expected number of arguments 1813 // r5: expected number of arguments
1814 // r6: new target (passed through to callee)
1809 // ip: code entry to call 1815 // ip: code entry to call
1810 Label copy; 1816 Label copy;
1811 __ bind(&copy); 1817 __ bind(&copy);
1812 // Adjust load for return address and receiver. 1818 // Adjust load for return address and receiver.
1813 __ LoadP(r0, MemOperand(r3, 2 * kPointerSize)); 1819 __ LoadP(r0, MemOperand(r3, 2 * kPointerSize));
1814 __ push(r0); 1820 __ push(r0);
1815 __ cmp(r3, fp); // Compare before moving to next argument. 1821 __ cmp(r3, fp); // Compare before moving to next argument.
1816 __ subi(r3, r3, Operand(kPointerSize)); 1822 __ subi(r3, r3, Operand(kPointerSize));
1817 __ bne(&copy); 1823 __ bne(&copy);
1818 1824
1819 // Fill the remaining expected arguments with undefined. 1825 // Fill the remaining expected arguments with undefined.
1820 // r4: function 1826 // r4: function
1821 // r5: expected number of arguments 1827 // r5: expected number of arguments
1828 // r6: new target (passed through to callee)
1822 // ip: code entry to call 1829 // ip: code entry to call
1823 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex); 1830 __ LoadRoot(r0, Heap::kUndefinedValueRootIndex);
1824 __ ShiftLeftImm(r6, r5, Operand(kPointerSizeLog2)); 1831 __ ShiftLeftImm(r7, r5, Operand(kPointerSizeLog2));
1825 __ sub(r6, fp, r6); 1832 __ sub(r7, fp, r7);
1826 // Adjust for frame. 1833 // Adjust for frame.
1827 __ subi(r6, r6, Operand(StandardFrameConstants::kFixedFrameSizeFromFp + 1834 __ subi(r7, r7, Operand(StandardFrameConstants::kFixedFrameSizeFromFp +
1828 2 * kPointerSize)); 1835 2 * kPointerSize));
1829 1836
1830 Label fill; 1837 Label fill;
1831 __ bind(&fill); 1838 __ bind(&fill);
1832 __ push(r0); 1839 __ push(r0);
1833 __ cmp(sp, r6); 1840 __ cmp(sp, r7);
1834 __ bne(&fill); 1841 __ bne(&fill);
1835 } 1842 }
1836 1843
1837 // Call the entry point. 1844 // Call the entry point.
1838 __ bind(&invoke); 1845 __ bind(&invoke);
1839 __ mr(r3, r5); 1846 __ mr(r3, r5);
1840 // r3 : expected number of arguments 1847 // r3 : expected number of arguments
1841 // r4 : function (passed through to callee) 1848 // r4 : function (passed through to callee)
1849 // r6 : new target (passed through to callee)
1842 __ CallJSEntry(ip); 1850 __ CallJSEntry(ip);
1843 1851
1844 // Store offset of return address for deoptimizer. 1852 // Store offset of return address for deoptimizer.
1845 masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset()); 1853 masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset());
1846 1854
1847 // Exit frame and return. 1855 // Exit frame and return.
1848 LeaveArgumentsAdaptorFrame(masm); 1856 LeaveArgumentsAdaptorFrame(masm);
1849 __ blr(); 1857 __ blr();
1850 1858
1851 1859
1852 // ------------------------------------------- 1860 // -------------------------------------------
1853 // Dont adapt arguments. 1861 // Dont adapt arguments.
1854 // ------------------------------------------- 1862 // -------------------------------------------
1855 __ bind(&dont_adapt_arguments); 1863 __ bind(&dont_adapt_arguments);
1856 __ JumpToJSEntry(ip); 1864 __ JumpToJSEntry(ip);
1857 1865
1858 __ bind(&stack_overflow); 1866 __ bind(&stack_overflow);
1859 { 1867 {
1860 FrameScope frame(masm, StackFrame::MANUAL); 1868 FrameScope frame(masm, StackFrame::MANUAL);
1861 EnterArgumentsAdaptorFrame(masm);
1862 __ CallRuntime(Runtime::kThrowStackOverflow, 0); 1869 __ CallRuntime(Runtime::kThrowStackOverflow, 0);
1863 __ bkpt(0); 1870 __ bkpt(0);
1864 } 1871 }
1865 } 1872 }
1866 1873
1867 1874
1868 #undef __ 1875 #undef __
1869 } // namespace internal 1876 } // namespace internal
1870 } // namespace v8 1877 } // namespace v8
1871 1878
1872 #endif // V8_TARGET_ARCH_PPC 1879 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698