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 |