| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1543 } else { | 1543 } else { |
| 1544 Label call_builtin; | 1544 Label call_builtin; |
| 1545 | 1545 |
| 1546 Register elements = r3; | 1546 Register elements = r3; |
| 1547 Register end_elements = r5; | 1547 Register end_elements = r5; |
| 1548 | 1548 |
| 1549 // Get the elements array of the object. | 1549 // Get the elements array of the object. |
| 1550 __ ldr(elements, FieldMemOperand(receiver, JSArray::kElementsOffset)); | 1550 __ ldr(elements, FieldMemOperand(receiver, JSArray::kElementsOffset)); |
| 1551 | 1551 |
| 1552 // Check that the elements are in fast mode and writable. | 1552 // Check that the elements are in fast mode and writable. |
| 1553 __ CheckMap(elements, r0, | 1553 __ CheckMap(elements, |
| 1554 Heap::kFixedArrayMapRootIndex, &call_builtin, true); | 1554 r0, |
| 1555 Heap::kFixedArrayMapRootIndex, |
| 1556 &call_builtin, |
| 1557 DONT_DO_SMI_CHECK); |
| 1555 | 1558 |
| 1556 if (argc == 1) { // Otherwise fall through to call the builtin. | 1559 if (argc == 1) { // Otherwise fall through to call the builtin. |
| 1557 Label exit, with_write_barrier, attempt_to_grow_elements; | 1560 Label exit, with_write_barrier, attempt_to_grow_elements; |
| 1558 | 1561 |
| 1559 // Get the array's length into r0 and calculate new length. | 1562 // Get the array's length into r0 and calculate new length. |
| 1560 __ ldr(r0, FieldMemOperand(receiver, JSArray::kLengthOffset)); | 1563 __ ldr(r0, FieldMemOperand(receiver, JSArray::kLengthOffset)); |
| 1561 STATIC_ASSERT(kSmiTagSize == 1); | 1564 STATIC_ASSERT(kSmiTagSize == 1); |
| 1562 STATIC_ASSERT(kSmiTag == 0); | 1565 STATIC_ASSERT(kSmiTag == 0); |
| 1563 __ add(r0, r0, Operand(Smi::FromInt(argc))); | 1566 __ add(r0, r0, Operand(Smi::FromInt(argc))); |
| 1564 | 1567 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1693 __ JumpIfSmi(receiver, &miss); | 1696 __ JumpIfSmi(receiver, &miss); |
| 1694 | 1697 |
| 1695 // Check that the maps haven't changed. | 1698 // Check that the maps haven't changed. |
| 1696 CheckPrototypes(JSObject::cast(object), | 1699 CheckPrototypes(JSObject::cast(object), |
| 1697 receiver, holder, elements, r4, r0, name, &miss); | 1700 receiver, holder, elements, r4, r0, name, &miss); |
| 1698 | 1701 |
| 1699 // Get the elements array of the object. | 1702 // Get the elements array of the object. |
| 1700 __ ldr(elements, FieldMemOperand(receiver, JSArray::kElementsOffset)); | 1703 __ ldr(elements, FieldMemOperand(receiver, JSArray::kElementsOffset)); |
| 1701 | 1704 |
| 1702 // Check that the elements are in fast mode and writable. | 1705 // Check that the elements are in fast mode and writable. |
| 1703 __ CheckMap(elements, r0, Heap::kFixedArrayMapRootIndex, &call_builtin, true); | 1706 __ CheckMap(elements, |
| 1707 r0, |
| 1708 Heap::kFixedArrayMapRootIndex, |
| 1709 &call_builtin, |
| 1710 DONT_DO_SMI_CHECK); |
| 1704 | 1711 |
| 1705 // Get the array's length into r4 and calculate new length. | 1712 // Get the array's length into r4 and calculate new length. |
| 1706 __ ldr(r4, FieldMemOperand(receiver, JSArray::kLengthOffset)); | 1713 __ ldr(r4, FieldMemOperand(receiver, JSArray::kLengthOffset)); |
| 1707 __ sub(r4, r4, Operand(Smi::FromInt(1)), SetCC); | 1714 __ sub(r4, r4, Operand(Smi::FromInt(1)), SetCC); |
| 1708 __ b(lt, &return_undefined); | 1715 __ b(lt, &return_undefined); |
| 1709 | 1716 |
| 1710 // Get the last element. | 1717 // Get the last element. |
| 1711 __ LoadRoot(r6, Heap::kTheHoleValueRootIndex); | 1718 __ LoadRoot(r6, Heap::kTheHoleValueRootIndex); |
| 1712 STATIC_ASSERT(kSmiTagSize == 1); | 1719 STATIC_ASSERT(kSmiTagSize == 1); |
| 1713 STATIC_ASSERT(kSmiTag == 0); | 1720 STATIC_ASSERT(kSmiTag == 0); |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2035 | 2042 |
| 2036 // Load the (only) argument into r0. | 2043 // Load the (only) argument into r0. |
| 2037 __ ldr(r0, MemOperand(sp, 0 * kPointerSize)); | 2044 __ ldr(r0, MemOperand(sp, 0 * kPointerSize)); |
| 2038 | 2045 |
| 2039 // If the argument is a smi, just return. | 2046 // If the argument is a smi, just return. |
| 2040 STATIC_ASSERT(kSmiTag == 0); | 2047 STATIC_ASSERT(kSmiTag == 0); |
| 2041 __ tst(r0, Operand(kSmiTagMask)); | 2048 __ tst(r0, Operand(kSmiTagMask)); |
| 2042 __ Drop(argc + 1, eq); | 2049 __ Drop(argc + 1, eq); |
| 2043 __ Ret(eq); | 2050 __ Ret(eq); |
| 2044 | 2051 |
| 2045 __ CheckMap(r0, r1, Heap::kHeapNumberMapRootIndex, &slow, true); | 2052 __ CheckMap(r0, r1, Heap::kHeapNumberMapRootIndex, &slow, DONT_DO_SMI_CHECK); |
| 2046 | 2053 |
| 2047 Label wont_fit_smi, no_vfp_exception, restore_fpscr_and_return; | 2054 Label wont_fit_smi, no_vfp_exception, restore_fpscr_and_return; |
| 2048 | 2055 |
| 2049 // If vfp3 is enabled, we use the fpu rounding with the RM (round towards | 2056 // If vfp3 is enabled, we use the fpu rounding with the RM (round towards |
| 2050 // minus infinity) mode. | 2057 // minus infinity) mode. |
| 2051 | 2058 |
| 2052 // Load the HeapNumber value. | 2059 // Load the HeapNumber value. |
| 2053 // We will need access to the value in the core registers, so we load it | 2060 // We will need access to the value in the core registers, so we load it |
| 2054 // with ldrd and move it to the fpu. It also spares a sub instruction for | 2061 // with ldrd and move it to the fpu. It also spares a sub instruction for |
| 2055 // updating the HeapNumber value address, as vldr expects a multiple | 2062 // updating the HeapNumber value address, as vldr expects a multiple |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2196 Label slow; | 2203 Label slow; |
| 2197 __ b(mi, &slow); | 2204 __ b(mi, &slow); |
| 2198 | 2205 |
| 2199 // Smi case done. | 2206 // Smi case done. |
| 2200 __ Drop(argc + 1); | 2207 __ Drop(argc + 1); |
| 2201 __ Ret(); | 2208 __ Ret(); |
| 2202 | 2209 |
| 2203 // Check if the argument is a heap number and load its exponent and | 2210 // Check if the argument is a heap number and load its exponent and |
| 2204 // sign. | 2211 // sign. |
| 2205 __ bind(¬_smi); | 2212 __ bind(¬_smi); |
| 2206 __ CheckMap(r0, r1, Heap::kHeapNumberMapRootIndex, &slow, true); | 2213 __ CheckMap(r0, r1, Heap::kHeapNumberMapRootIndex, &slow, DONT_DO_SMI_CHECK); |
| 2207 __ ldr(r1, FieldMemOperand(r0, HeapNumber::kExponentOffset)); | 2214 __ ldr(r1, FieldMemOperand(r0, HeapNumber::kExponentOffset)); |
| 2208 | 2215 |
| 2209 // Check the sign of the argument. If the argument is positive, | 2216 // Check the sign of the argument. If the argument is positive, |
| 2210 // just return it. | 2217 // just return it. |
| 2211 Label negative_sign; | 2218 Label negative_sign; |
| 2212 __ tst(r1, Operand(HeapNumber::kSignMask)); | 2219 __ tst(r1, Operand(HeapNumber::kSignMask)); |
| 2213 __ b(ne, &negative_sign); | 2220 __ b(ne, &negative_sign); |
| 2214 __ Drop(argc + 1); | 2221 __ Drop(argc + 1); |
| 2215 __ Ret(); | 2222 __ Ret(); |
| 2216 | 2223 |
| (...skipping 1837 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4054 | 4061 |
| 4055 return GetCode(flags); | 4062 return GetCode(flags); |
| 4056 } | 4063 } |
| 4057 | 4064 |
| 4058 | 4065 |
| 4059 #undef __ | 4066 #undef __ |
| 4060 | 4067 |
| 4061 } } // namespace v8::internal | 4068 } } // namespace v8::internal |
| 4062 | 4069 |
| 4063 #endif // V8_TARGET_ARCH_ARM | 4070 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |