| OLD | NEW |
| 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_ARM | 5 #if V8_TARGET_ARCH_ARM |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 1605 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 __ cmp(r6, Operand(Smi::FromInt(0))); | 1616 __ cmp(r6, Operand(Smi::FromInt(0))); |
| 1617 __ mov(r9, Operand::Zero(), LeaveCC, eq); | 1617 __ mov(r9, Operand::Zero(), LeaveCC, eq); |
| 1618 __ mov(r9, Operand(r6, LSL, 1), LeaveCC, ne); | 1618 __ mov(r9, Operand(r6, LSL, 1), LeaveCC, ne); |
| 1619 __ add(r9, r9, Operand(kParameterMapHeaderSize), LeaveCC, ne); | 1619 __ add(r9, r9, Operand(kParameterMapHeaderSize), LeaveCC, ne); |
| 1620 | 1620 |
| 1621 // 2. Backing store. | 1621 // 2. Backing store. |
| 1622 __ add(r9, r9, Operand(r5, LSL, 1)); | 1622 __ add(r9, r9, Operand(r5, LSL, 1)); |
| 1623 __ add(r9, r9, Operand(FixedArray::kHeaderSize)); | 1623 __ add(r9, r9, Operand(FixedArray::kHeaderSize)); |
| 1624 | 1624 |
| 1625 // 3. Arguments object. | 1625 // 3. Arguments object. |
| 1626 __ add(r9, r9, Operand(Heap::kSloppyArgumentsObjectSize)); | 1626 __ add(r9, r9, Operand(JSSloppyArgumentsObject::kSize)); |
| 1627 | 1627 |
| 1628 // Do the allocation of all three objects in one go. | 1628 // Do the allocation of all three objects in one go. |
| 1629 __ Allocate(r9, r0, r9, r4, &runtime, TAG_OBJECT); | 1629 __ Allocate(r9, r0, r9, r4, &runtime, TAG_OBJECT); |
| 1630 | 1630 |
| 1631 // r0 = address of new object(s) (tagged) | 1631 // r0 = address of new object(s) (tagged) |
| 1632 // r2 = argument count (smi-tagged) | 1632 // r2 = argument count (smi-tagged) |
| 1633 // Get the arguments boilerplate from the current native context into r4. | 1633 // Get the arguments boilerplate from the current native context into r4. |
| 1634 const int kNormalOffset = | 1634 const int kNormalOffset = |
| 1635 Context::SlotOffset(Context::SLOPPY_ARGUMENTS_MAP_INDEX); | 1635 Context::SlotOffset(Context::SLOPPY_ARGUMENTS_MAP_INDEX); |
| 1636 const int kAliasedOffset = | 1636 const int kAliasedOffset = |
| 1637 Context::SlotOffset(Context::FAST_ALIASED_ARGUMENTS_MAP_INDEX); | 1637 Context::SlotOffset(Context::FAST_ALIASED_ARGUMENTS_MAP_INDEX); |
| 1638 | 1638 |
| 1639 __ ldr(r4, NativeContextMemOperand()); | 1639 __ ldr(r4, NativeContextMemOperand()); |
| 1640 __ cmp(r6, Operand::Zero()); | 1640 __ cmp(r6, Operand::Zero()); |
| 1641 __ ldr(r4, MemOperand(r4, kNormalOffset), eq); | 1641 __ ldr(r4, MemOperand(r4, kNormalOffset), eq); |
| 1642 __ ldr(r4, MemOperand(r4, kAliasedOffset), ne); | 1642 __ ldr(r4, MemOperand(r4, kAliasedOffset), ne); |
| 1643 | 1643 |
| 1644 // r0 = address of new object (tagged) | 1644 // r0 = address of new object (tagged) |
| 1645 // r2 = argument count (smi-tagged) | 1645 // r2 = argument count (smi-tagged) |
| 1646 // r4 = address of arguments map (tagged) | 1646 // r4 = address of arguments map (tagged) |
| 1647 // r6 = mapped parameter count (tagged) | 1647 // r6 = mapped parameter count (tagged) |
| 1648 __ str(r4, FieldMemOperand(r0, JSObject::kMapOffset)); | 1648 __ str(r4, FieldMemOperand(r0, JSObject::kMapOffset)); |
| 1649 __ LoadRoot(r9, Heap::kEmptyFixedArrayRootIndex); | 1649 __ LoadRoot(r9, Heap::kEmptyFixedArrayRootIndex); |
| 1650 __ str(r9, FieldMemOperand(r0, JSObject::kPropertiesOffset)); | 1650 __ str(r9, FieldMemOperand(r0, JSObject::kPropertiesOffset)); |
| 1651 __ str(r9, FieldMemOperand(r0, JSObject::kElementsOffset)); | 1651 __ str(r9, FieldMemOperand(r0, JSObject::kElementsOffset)); |
| 1652 | 1652 |
| 1653 // Set up the callee in-object property. | 1653 // Set up the callee in-object property. |
| 1654 STATIC_ASSERT(Heap::kArgumentsCalleeIndex == 1); | |
| 1655 __ AssertNotSmi(r1); | 1654 __ AssertNotSmi(r1); |
| 1656 const int kCalleeOffset = JSObject::kHeaderSize + | 1655 __ str(r1, FieldMemOperand(r0, JSSloppyArgumentsObject::kCalleeOffset)); |
| 1657 Heap::kArgumentsCalleeIndex * kPointerSize; | |
| 1658 __ str(r1, FieldMemOperand(r0, kCalleeOffset)); | |
| 1659 | 1656 |
| 1660 // Use the length (smi tagged) and set that as an in-object property too. | 1657 // Use the length (smi tagged) and set that as an in-object property too. |
| 1661 __ AssertSmi(r5); | 1658 __ AssertSmi(r5); |
| 1662 STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0); | 1659 __ str(r5, FieldMemOperand(r0, JSSloppyArgumentsObject::kLengthOffset)); |
| 1663 const int kLengthOffset = JSObject::kHeaderSize + | |
| 1664 Heap::kArgumentsLengthIndex * kPointerSize; | |
| 1665 __ str(r5, FieldMemOperand(r0, kLengthOffset)); | |
| 1666 | 1660 |
| 1667 // Set up the elements pointer in the allocated arguments object. | 1661 // Set up the elements pointer in the allocated arguments object. |
| 1668 // If we allocated a parameter map, r4 will point there, otherwise | 1662 // If we allocated a parameter map, r4 will point there, otherwise |
| 1669 // it will point to the backing store. | 1663 // it will point to the backing store. |
| 1670 __ add(r4, r0, Operand(Heap::kSloppyArgumentsObjectSize)); | 1664 __ add(r4, r0, Operand(JSSloppyArgumentsObject::kSize)); |
| 1671 __ str(r4, FieldMemOperand(r0, JSObject::kElementsOffset)); | 1665 __ str(r4, FieldMemOperand(r0, JSObject::kElementsOffset)); |
| 1672 | 1666 |
| 1673 // r0 = address of new object (tagged) | 1667 // r0 = address of new object (tagged) |
| 1674 // r2 = argument count (tagged) | 1668 // r2 = argument count (tagged) |
| 1675 // r4 = address of parameter map or backing store (tagged) | 1669 // r4 = address of parameter map or backing store (tagged) |
| 1676 // r6 = mapped parameter count (tagged) | 1670 // r6 = mapped parameter count (tagged) |
| 1677 // Initialize parameter map. If there are no mapped arguments, we're done. | 1671 // Initialize parameter map. If there are no mapped arguments, we're done. |
| 1678 Label skip_parameter_map; | 1672 Label skip_parameter_map; |
| 1679 __ cmp(r6, Operand(Smi::FromInt(0))); | 1673 __ cmp(r6, Operand(Smi::FromInt(0))); |
| 1680 // Move backing store address to r1, because it is | 1674 // Move backing store address to r1, because it is |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1721 __ add(r0, r0, Operand(kParameterMapHeaderSize - kHeapObjectTag)); | 1715 __ add(r0, r0, Operand(kParameterMapHeaderSize - kHeapObjectTag)); |
| 1722 __ str(r9, MemOperand(r4, r0)); | 1716 __ str(r9, MemOperand(r4, r0)); |
| 1723 __ sub(r0, r0, Operand(kParameterMapHeaderSize - FixedArray::kHeaderSize)); | 1717 __ sub(r0, r0, Operand(kParameterMapHeaderSize - FixedArray::kHeaderSize)); |
| 1724 __ str(ip, MemOperand(r1, r0)); | 1718 __ str(ip, MemOperand(r1, r0)); |
| 1725 __ add(r9, r9, Operand(Smi::FromInt(1))); | 1719 __ add(r9, r9, Operand(Smi::FromInt(1))); |
| 1726 __ bind(¶meters_test); | 1720 __ bind(¶meters_test); |
| 1727 __ cmp(r5, Operand(Smi::FromInt(0))); | 1721 __ cmp(r5, Operand(Smi::FromInt(0))); |
| 1728 __ b(ne, ¶meters_loop); | 1722 __ b(ne, ¶meters_loop); |
| 1729 | 1723 |
| 1730 // Restore r0 = new object (tagged) and r5 = argument count (tagged). | 1724 // Restore r0 = new object (tagged) and r5 = argument count (tagged). |
| 1731 __ sub(r0, r4, Operand(Heap::kSloppyArgumentsObjectSize)); | 1725 __ sub(r0, r4, Operand(JSSloppyArgumentsObject::kSize)); |
| 1732 __ ldr(r5, FieldMemOperand(r0, kLengthOffset)); | 1726 __ ldr(r5, FieldMemOperand(r0, JSSloppyArgumentsObject::kLengthOffset)); |
| 1733 | 1727 |
| 1734 __ bind(&skip_parameter_map); | 1728 __ bind(&skip_parameter_map); |
| 1735 // r0 = address of new object (tagged) | 1729 // r0 = address of new object (tagged) |
| 1736 // r1 = address of backing store (tagged) | 1730 // r1 = address of backing store (tagged) |
| 1737 // r5 = argument count (tagged) | 1731 // r5 = argument count (tagged) |
| 1738 // r6 = mapped parameter count (tagged) | 1732 // r6 = mapped parameter count (tagged) |
| 1739 // r9 = scratch | 1733 // r9 = scratch |
| 1740 // Copy arguments header and remaining slots (if there are any). | 1734 // Copy arguments header and remaining slots (if there are any). |
| 1741 __ LoadRoot(r9, Heap::kFixedArrayMapRootIndex); | 1735 __ LoadRoot(r9, Heap::kFixedArrayMapRootIndex); |
| 1742 __ str(r9, FieldMemOperand(r1, FixedArray::kMapOffset)); | 1736 __ str(r9, FieldMemOperand(r1, FixedArray::kMapOffset)); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1785 | 1779 |
| 1786 // Perform tail call to the entry. | 1780 // Perform tail call to the entry. |
| 1787 __ TailCallRuntime(Runtime::kLoadElementWithInterceptor); | 1781 __ TailCallRuntime(Runtime::kLoadElementWithInterceptor); |
| 1788 | 1782 |
| 1789 __ bind(&slow); | 1783 __ bind(&slow); |
| 1790 PropertyAccessCompiler::TailCallBuiltin( | 1784 PropertyAccessCompiler::TailCallBuiltin( |
| 1791 masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC)); | 1785 masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC)); |
| 1792 } | 1786 } |
| 1793 | 1787 |
| 1794 | 1788 |
| 1795 void ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) { | |
| 1796 // r1 : function | |
| 1797 // r2 : number of parameters (tagged) | |
| 1798 // r3 : parameters pointer | |
| 1799 | |
| 1800 DCHECK(r1.is(ArgumentsAccessNewDescriptor::function())); | |
| 1801 DCHECK(r2.is(ArgumentsAccessNewDescriptor::parameter_count())); | |
| 1802 DCHECK(r3.is(ArgumentsAccessNewDescriptor::parameter_pointer())); | |
| 1803 | |
| 1804 // Check if the calling frame is an arguments adaptor frame. | |
| 1805 Label try_allocate, runtime; | |
| 1806 __ ldr(r4, MemOperand(fp, StandardFrameConstants::kCallerFPOffset)); | |
| 1807 __ ldr(r0, MemOperand(r4, StandardFrameConstants::kContextOffset)); | |
| 1808 __ cmp(r0, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); | |
| 1809 __ b(ne, &try_allocate); | |
| 1810 | |
| 1811 // Patch the arguments.length and the parameters pointer. | |
| 1812 __ ldr(r2, MemOperand(r4, ArgumentsAdaptorFrameConstants::kLengthOffset)); | |
| 1813 __ add(r4, r4, Operand::PointerOffsetFromSmiKey(r2)); | |
| 1814 __ add(r3, r4, Operand(StandardFrameConstants::kCallerSPOffset)); | |
| 1815 | |
| 1816 // Try the new space allocation. Start out with computing the size | |
| 1817 // of the arguments object and the elements array in words. | |
| 1818 Label add_arguments_object; | |
| 1819 __ bind(&try_allocate); | |
| 1820 __ SmiUntag(r9, r2, SetCC); | |
| 1821 __ b(eq, &add_arguments_object); | |
| 1822 __ add(r9, r9, Operand(FixedArray::kHeaderSize / kPointerSize)); | |
| 1823 __ bind(&add_arguments_object); | |
| 1824 __ add(r9, r9, Operand(Heap::kStrictArgumentsObjectSize / kPointerSize)); | |
| 1825 | |
| 1826 // Do the allocation of both objects in one go. | |
| 1827 __ Allocate(r9, r0, r4, r5, &runtime, | |
| 1828 static_cast<AllocationFlags>(TAG_OBJECT | SIZE_IN_WORDS)); | |
| 1829 | |
| 1830 // Get the arguments boilerplate from the current native context. | |
| 1831 __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, r4); | |
| 1832 | |
| 1833 __ str(r4, FieldMemOperand(r0, JSObject::kMapOffset)); | |
| 1834 __ LoadRoot(r5, Heap::kEmptyFixedArrayRootIndex); | |
| 1835 __ str(r5, FieldMemOperand(r0, JSObject::kPropertiesOffset)); | |
| 1836 __ str(r5, FieldMemOperand(r0, JSObject::kElementsOffset)); | |
| 1837 | |
| 1838 // Get the length (smi tagged) and set that as an in-object property too. | |
| 1839 STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0); | |
| 1840 __ AssertSmi(r2); | |
| 1841 __ str(r2, | |
| 1842 FieldMemOperand(r0, JSObject::kHeaderSize + | |
| 1843 Heap::kArgumentsLengthIndex * kPointerSize)); | |
| 1844 | |
| 1845 // If there are no actual arguments, we're done. | |
| 1846 Label done; | |
| 1847 __ cmp(r2, Operand::Zero()); | |
| 1848 __ b(eq, &done); | |
| 1849 | |
| 1850 // Set up the elements pointer in the allocated arguments object and | |
| 1851 // initialize the header in the elements fixed array. | |
| 1852 __ add(r4, r0, Operand(Heap::kStrictArgumentsObjectSize)); | |
| 1853 __ str(r4, FieldMemOperand(r0, JSObject::kElementsOffset)); | |
| 1854 __ LoadRoot(r5, Heap::kFixedArrayMapRootIndex); | |
| 1855 __ str(r5, FieldMemOperand(r4, FixedArray::kMapOffset)); | |
| 1856 __ str(r2, FieldMemOperand(r4, FixedArray::kLengthOffset)); | |
| 1857 __ SmiUntag(r2); | |
| 1858 | |
| 1859 // Copy the fixed array slots. | |
| 1860 Label loop; | |
| 1861 // Set up r4 to point to the first array slot. | |
| 1862 __ add(r4, r4, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); | |
| 1863 __ bind(&loop); | |
| 1864 // Pre-decrement r3 with kPointerSize on each iteration. | |
| 1865 // Pre-decrement in order to skip receiver. | |
| 1866 __ ldr(r5, MemOperand(r3, kPointerSize, NegPreIndex)); | |
| 1867 // Post-increment r4 with kPointerSize on each iteration. | |
| 1868 __ str(r5, MemOperand(r4, kPointerSize, PostIndex)); | |
| 1869 __ sub(r2, r2, Operand(1)); | |
| 1870 __ cmp(r2, Operand::Zero()); | |
| 1871 __ b(ne, &loop); | |
| 1872 | |
| 1873 // Return. | |
| 1874 __ bind(&done); | |
| 1875 __ Ret(); | |
| 1876 | |
| 1877 // Do the runtime call to allocate the arguments object. | |
| 1878 __ bind(&runtime); | |
| 1879 __ Push(r1, r3, r2); | |
| 1880 __ TailCallRuntime(Runtime::kNewStrictArguments); | |
| 1881 } | |
| 1882 | |
| 1883 | |
| 1884 void RegExpExecStub::Generate(MacroAssembler* masm) { | 1789 void RegExpExecStub::Generate(MacroAssembler* masm) { |
| 1885 // Just jump directly to runtime if native RegExp is not selected at compile | 1790 // Just jump directly to runtime if native RegExp is not selected at compile |
| 1886 // time or if regexp entry in generated code is turned off runtime switch or | 1791 // time or if regexp entry in generated code is turned off runtime switch or |
| 1887 // at compilation. | 1792 // at compilation. |
| 1888 #ifdef V8_INTERPRETED_REGEXP | 1793 #ifdef V8_INTERPRETED_REGEXP |
| 1889 __ TailCallRuntime(Runtime::kRegExpExec); | 1794 __ TailCallRuntime(Runtime::kRegExpExec); |
| 1890 #else // V8_INTERPRETED_REGEXP | 1795 #else // V8_INTERPRETED_REGEXP |
| 1891 | 1796 |
| 1892 // Stack frame on entry. | 1797 // Stack frame on entry. |
| 1893 // sp[0]: last_match_info (expected JSArray) | 1798 // sp[0]: last_match_info (expected JSArray) |
| (...skipping 3194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5088 __ Push(r0, r2, r1); | 4993 __ Push(r0, r2, r1); |
| 5089 __ CallRuntime(Runtime::kAllocateInNewSpace); | 4994 __ CallRuntime(Runtime::kAllocateInNewSpace); |
| 5090 __ mov(r3, r0); | 4995 __ mov(r3, r0); |
| 5091 __ Pop(r0, r2); | 4996 __ Pop(r0, r2); |
| 5092 } | 4997 } |
| 5093 __ jmp(&done_allocate); | 4998 __ jmp(&done_allocate); |
| 5094 } | 4999 } |
| 5095 } | 5000 } |
| 5096 | 5001 |
| 5097 | 5002 |
| 5003 void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) { |
| 5004 // ----------- S t a t e ------------- |
| 5005 // -- r1 : function |
| 5006 // -- cp : context |
| 5007 // -- fp : frame pointer |
| 5008 // -- lr : return address |
| 5009 // ----------------------------------- |
| 5010 __ AssertFunction(r1); |
| 5011 |
| 5012 // For Ignition we need to skip all possible handler/stub frames until |
| 5013 // we reach the JavaScript frame for the function (similar to what the |
| 5014 // runtime fallback implementation does). So make r2 point to that |
| 5015 // JavaScript frame. |
| 5016 { |
| 5017 Label loop, loop_entry; |
| 5018 __ mov(r2, fp); |
| 5019 __ b(&loop_entry); |
| 5020 __ bind(&loop); |
| 5021 __ ldr(r2, MemOperand(r2, StandardFrameConstants::kCallerFPOffset)); |
| 5022 __ bind(&loop_entry); |
| 5023 __ ldr(ip, MemOperand(r2, StandardFrameConstants::kMarkerOffset)); |
| 5024 __ cmp(ip, r1); |
| 5025 __ b(ne, &loop); |
| 5026 } |
| 5027 |
| 5028 // Check if we have an arguments adaptor frame below the function frame. |
| 5029 Label arguments_adaptor, arguments_done; |
| 5030 __ ldr(r3, MemOperand(r2, StandardFrameConstants::kCallerFPOffset)); |
| 5031 __ ldr(ip, MemOperand(r3, StandardFrameConstants::kContextOffset)); |
| 5032 __ cmp(ip, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); |
| 5033 __ b(eq, &arguments_adaptor); |
| 5034 { |
| 5035 __ ldr(r1, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); |
| 5036 __ ldr(r0, FieldMemOperand( |
| 5037 r1, SharedFunctionInfo::kFormalParameterCountOffset)); |
| 5038 __ add(r2, r2, Operand(r0, LSL, kPointerSizeLog2 - 1)); |
| 5039 __ add(r2, r2, |
| 5040 Operand(StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize)); |
| 5041 } |
| 5042 __ b(&arguments_done); |
| 5043 __ bind(&arguments_adaptor); |
| 5044 { |
| 5045 __ ldr(r0, MemOperand(r3, ArgumentsAdaptorFrameConstants::kLengthOffset)); |
| 5046 __ add(r2, r3, Operand(r0, LSL, kPointerSizeLog2 - 1)); |
| 5047 __ add(r2, r2, |
| 5048 Operand(StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize)); |
| 5049 } |
| 5050 __ bind(&arguments_done); |
| 5051 |
| 5052 // ----------- S t a t e ------------- |
| 5053 // -- cp : context |
| 5054 // -- r0 : number of rest parameters (tagged) |
| 5055 // -- r2 : pointer to first rest parameters |
| 5056 // -- lr : return address |
| 5057 // ----------------------------------- |
| 5058 |
| 5059 // Allocate space for the strict arguments object plus the backing store. |
| 5060 Label allocate, done_allocate; |
| 5061 __ mov(r1, Operand(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize)); |
| 5062 __ add(r1, r1, Operand(r0, LSL, kPointerSizeLog2 - 1)); |
| 5063 __ Allocate(r1, r3, r4, r5, &allocate, TAG_OBJECT); |
| 5064 __ bind(&done_allocate); |
| 5065 |
| 5066 // Setup the elements array in r3. |
| 5067 __ LoadRoot(r1, Heap::kFixedArrayMapRootIndex); |
| 5068 __ str(r1, FieldMemOperand(r3, FixedArray::kMapOffset)); |
| 5069 __ str(r0, FieldMemOperand(r3, FixedArray::kLengthOffset)); |
| 5070 __ add(r4, r3, Operand(FixedArray::kHeaderSize)); |
| 5071 { |
| 5072 Label loop, done_loop; |
| 5073 __ add(r1, r4, Operand(r0, LSL, kPointerSizeLog2 - 1)); |
| 5074 __ bind(&loop); |
| 5075 __ cmp(r4, r1); |
| 5076 __ b(eq, &done_loop); |
| 5077 __ ldr(ip, MemOperand(r2, 1 * kPointerSize, NegPostIndex)); |
| 5078 __ str(ip, FieldMemOperand(r4, 0 * kPointerSize)); |
| 5079 __ add(r4, r4, Operand(1 * kPointerSize)); |
| 5080 __ b(&loop); |
| 5081 __ bind(&done_loop); |
| 5082 } |
| 5083 |
| 5084 // Setup the strict arguments object in r4. |
| 5085 __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, r1); |
| 5086 __ str(r1, FieldMemOperand(r4, JSStrictArgumentsObject::kMapOffset)); |
| 5087 __ LoadRoot(r1, Heap::kEmptyFixedArrayRootIndex); |
| 5088 __ str(r1, FieldMemOperand(r4, JSStrictArgumentsObject::kPropertiesOffset)); |
| 5089 __ str(r3, FieldMemOperand(r4, JSStrictArgumentsObject::kElementsOffset)); |
| 5090 __ str(r0, FieldMemOperand(r4, JSStrictArgumentsObject::kLengthOffset)); |
| 5091 STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize); |
| 5092 __ mov(r0, r4); |
| 5093 __ Ret(); |
| 5094 |
| 5095 // Fall back to %AllocateInNewSpace. |
| 5096 __ bind(&allocate); |
| 5097 { |
| 5098 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
| 5099 __ SmiTag(r1); |
| 5100 __ Push(r0, r2, r1); |
| 5101 __ CallRuntime(Runtime::kAllocateInNewSpace); |
| 5102 __ mov(r3, r0); |
| 5103 __ Pop(r0, r2); |
| 5104 } |
| 5105 __ b(&done_allocate); |
| 5106 } |
| 5107 |
| 5108 |
| 5098 void LoadGlobalViaContextStub::Generate(MacroAssembler* masm) { | 5109 void LoadGlobalViaContextStub::Generate(MacroAssembler* masm) { |
| 5099 Register context = cp; | 5110 Register context = cp; |
| 5100 Register result = r0; | 5111 Register result = r0; |
| 5101 Register slot = r2; | 5112 Register slot = r2; |
| 5102 | 5113 |
| 5103 // Go up the context chain to the script context. | 5114 // Go up the context chain to the script context. |
| 5104 for (int i = 0; i < depth(); ++i) { | 5115 for (int i = 0; i < depth(); ++i) { |
| 5105 __ ldr(result, ContextMemOperand(context, Context::PREVIOUS_INDEX)); | 5116 __ ldr(result, ContextMemOperand(context, Context::PREVIOUS_INDEX)); |
| 5106 context = result; | 5117 context = result; |
| 5107 } | 5118 } |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5568 kStackUnwindSpace, NULL, return_value_operand, NULL); | 5579 kStackUnwindSpace, NULL, return_value_operand, NULL); |
| 5569 } | 5580 } |
| 5570 | 5581 |
| 5571 | 5582 |
| 5572 #undef __ | 5583 #undef __ |
| 5573 | 5584 |
| 5574 } // namespace internal | 5585 } // namespace internal |
| 5575 } // namespace v8 | 5586 } // namespace v8 |
| 5576 | 5587 |
| 5577 #endif // V8_TARGET_ARCH_ARM | 5588 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |