| 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 #include <limits.h> // For LONG_MIN, LONG_MAX. | 5 #include <limits.h> // For LONG_MIN, LONG_MAX. |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #if V8_TARGET_ARCH_ARM | 9 #if V8_TARGET_ARCH_ARM |
| 10 | 10 |
| (...skipping 1674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1685 cmp(result, ip); | 1685 cmp(result, ip); |
| 1686 Check(eq, kUnexpectedAllocationTop); | 1686 Check(eq, kUnexpectedAllocationTop); |
| 1687 } | 1687 } |
| 1688 // Load allocation limit into ip. Result already contains allocation top. | 1688 // Load allocation limit into ip. Result already contains allocation top. |
| 1689 ldr(ip, MemOperand(topaddr, limit - top)); | 1689 ldr(ip, MemOperand(topaddr, limit - top)); |
| 1690 } | 1690 } |
| 1691 | 1691 |
| 1692 if ((flags & DOUBLE_ALIGNMENT) != 0) { | 1692 if ((flags & DOUBLE_ALIGNMENT) != 0) { |
| 1693 // Align the next allocation. Storing the filler map without checking top is | 1693 // Align the next allocation. Storing the filler map without checking top is |
| 1694 // safe in new-space because the limit of the heap is aligned there. | 1694 // safe in new-space because the limit of the heap is aligned there. |
| 1695 DCHECK((flags & PRETENURE_OLD_POINTER_SPACE) == 0); |
| 1695 STATIC_ASSERT(kPointerAlignment * 2 == kDoubleAlignment); | 1696 STATIC_ASSERT(kPointerAlignment * 2 == kDoubleAlignment); |
| 1696 and_(scratch2, result, Operand(kDoubleAlignmentMask), SetCC); | 1697 and_(scratch2, result, Operand(kDoubleAlignmentMask), SetCC); |
| 1697 Label aligned; | 1698 Label aligned; |
| 1698 b(eq, &aligned); | 1699 b(eq, &aligned); |
| 1699 if ((flags & PRETENURE) != 0) { | 1700 if ((flags & PRETENURE_OLD_DATA_SPACE) != 0) { |
| 1700 cmp(result, Operand(ip)); | 1701 cmp(result, Operand(ip)); |
| 1701 b(hs, gc_required); | 1702 b(hs, gc_required); |
| 1702 } | 1703 } |
| 1703 mov(scratch2, Operand(isolate()->factory()->one_pointer_filler_map())); | 1704 mov(scratch2, Operand(isolate()->factory()->one_pointer_filler_map())); |
| 1704 str(scratch2, MemOperand(result, kDoubleSize / 2, PostIndex)); | 1705 str(scratch2, MemOperand(result, kDoubleSize / 2, PostIndex)); |
| 1705 bind(&aligned); | 1706 bind(&aligned); |
| 1706 } | 1707 } |
| 1707 | 1708 |
| 1708 // Calculate new top and bail out if new space is exhausted. Use result | 1709 // Calculate new top and bail out if new space is exhausted. Use result |
| 1709 // to calculate the new top. We must preserve the ip register at this | 1710 // to calculate the new top. We must preserve the ip register at this |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1798 cmp(result, ip); | 1799 cmp(result, ip); |
| 1799 Check(eq, kUnexpectedAllocationTop); | 1800 Check(eq, kUnexpectedAllocationTop); |
| 1800 } | 1801 } |
| 1801 // Load allocation limit into ip. Result already contains allocation top. | 1802 // Load allocation limit into ip. Result already contains allocation top. |
| 1802 ldr(ip, MemOperand(topaddr, limit - top)); | 1803 ldr(ip, MemOperand(topaddr, limit - top)); |
| 1803 } | 1804 } |
| 1804 | 1805 |
| 1805 if ((flags & DOUBLE_ALIGNMENT) != 0) { | 1806 if ((flags & DOUBLE_ALIGNMENT) != 0) { |
| 1806 // Align the next allocation. Storing the filler map without checking top is | 1807 // Align the next allocation. Storing the filler map without checking top is |
| 1807 // safe in new-space because the limit of the heap is aligned there. | 1808 // safe in new-space because the limit of the heap is aligned there. |
| 1809 DCHECK((flags & PRETENURE_OLD_POINTER_SPACE) == 0); |
| 1808 DCHECK(kPointerAlignment * 2 == kDoubleAlignment); | 1810 DCHECK(kPointerAlignment * 2 == kDoubleAlignment); |
| 1809 and_(scratch2, result, Operand(kDoubleAlignmentMask), SetCC); | 1811 and_(scratch2, result, Operand(kDoubleAlignmentMask), SetCC); |
| 1810 Label aligned; | 1812 Label aligned; |
| 1811 b(eq, &aligned); | 1813 b(eq, &aligned); |
| 1812 if ((flags & PRETENURE) != 0) { | 1814 if ((flags & PRETENURE_OLD_DATA_SPACE) != 0) { |
| 1813 cmp(result, Operand(ip)); | 1815 cmp(result, Operand(ip)); |
| 1814 b(hs, gc_required); | 1816 b(hs, gc_required); |
| 1815 } | 1817 } |
| 1816 mov(scratch2, Operand(isolate()->factory()->one_pointer_filler_map())); | 1818 mov(scratch2, Operand(isolate()->factory()->one_pointer_filler_map())); |
| 1817 str(scratch2, MemOperand(result, kDoubleSize / 2, PostIndex)); | 1819 str(scratch2, MemOperand(result, kDoubleSize / 2, PostIndex)); |
| 1818 bind(&aligned); | 1820 bind(&aligned); |
| 1819 } | 1821 } |
| 1820 | 1822 |
| 1821 // Calculate new top and bail out if new space is exhausted. Use result | 1823 // Calculate new top and bail out if new space is exhausted. Use result |
| 1822 // to calculate the new top. Object size may be in words so a shift is | 1824 // to calculate the new top. Object size may be in words so a shift is |
| (...skipping 2066 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3889 } | 3891 } |
| 3890 } | 3892 } |
| 3891 if (mag.shift > 0) mov(result, Operand(result, ASR, mag.shift)); | 3893 if (mag.shift > 0) mov(result, Operand(result, ASR, mag.shift)); |
| 3892 add(result, result, Operand(dividend, LSR, 31)); | 3894 add(result, result, Operand(dividend, LSR, 31)); |
| 3893 } | 3895 } |
| 3894 | 3896 |
| 3895 } // namespace internal | 3897 } // namespace internal |
| 3896 } // namespace v8 | 3898 } // namespace v8 |
| 3897 | 3899 |
| 3898 #endif // V8_TARGET_ARCH_ARM | 3900 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |