| 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/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 2098 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2109 void Builtins::Generate_Apply(MacroAssembler* masm) { | 2109 void Builtins::Generate_Apply(MacroAssembler* masm) { |
| 2110 // ----------- S t a t e ------------- | 2110 // ----------- S t a t e ------------- |
| 2111 // -- r0 : argumentsList | 2111 // -- r0 : argumentsList |
| 2112 // -- r1 : target | 2112 // -- r1 : target |
| 2113 // -- r3 : new.target (checked to be constructor or undefined) | 2113 // -- r3 : new.target (checked to be constructor or undefined) |
| 2114 // -- sp[0] : thisArgument | 2114 // -- sp[0] : thisArgument |
| 2115 // ----------------------------------- | 2115 // ----------------------------------- |
| 2116 | 2116 |
| 2117 // Create the list of arguments from the array-like argumentsList. | 2117 // Create the list of arguments from the array-like argumentsList. |
| 2118 { | 2118 { |
| 2119 Label create_arguments, create_array, create_runtime, done_create; | 2119 Label create_arguments, create_array, create_holey_array, create_runtime, |
| 2120 done_create; |
| 2120 __ JumpIfSmi(r0, &create_runtime); | 2121 __ JumpIfSmi(r0, &create_runtime); |
| 2121 | 2122 |
| 2122 // Load the map of argumentsList into r2. | 2123 // Load the map of argumentsList into r2. |
| 2123 __ ldr(r2, FieldMemOperand(r0, HeapObject::kMapOffset)); | 2124 __ ldr(r2, FieldMemOperand(r0, HeapObject::kMapOffset)); |
| 2124 | 2125 |
| 2125 // Load native context into r4. | 2126 // Load native context into r4. |
| 2126 __ ldr(r4, NativeContextMemOperand()); | 2127 __ ldr(r4, NativeContextMemOperand()); |
| 2127 | 2128 |
| 2128 // Check if argumentsList is an (unmodified) arguments object. | 2129 // Check if argumentsList is an (unmodified) arguments object. |
| 2129 __ ldr(ip, ContextMemOperand(r4, Context::SLOPPY_ARGUMENTS_MAP_INDEX)); | 2130 __ ldr(ip, ContextMemOperand(r4, Context::SLOPPY_ARGUMENTS_MAP_INDEX)); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2153 __ bind(&create_arguments); | 2154 __ bind(&create_arguments); |
| 2154 __ ldr(r2, FieldMemOperand(r0, JSArgumentsObject::kLengthOffset)); | 2155 __ ldr(r2, FieldMemOperand(r0, JSArgumentsObject::kLengthOffset)); |
| 2155 __ ldr(r4, FieldMemOperand(r0, JSObject::kElementsOffset)); | 2156 __ ldr(r4, FieldMemOperand(r0, JSObject::kElementsOffset)); |
| 2156 __ ldr(ip, FieldMemOperand(r4, FixedArray::kLengthOffset)); | 2157 __ ldr(ip, FieldMemOperand(r4, FixedArray::kLengthOffset)); |
| 2157 __ cmp(r2, ip); | 2158 __ cmp(r2, ip); |
| 2158 __ b(ne, &create_runtime); | 2159 __ b(ne, &create_runtime); |
| 2159 __ SmiUntag(r2); | 2160 __ SmiUntag(r2); |
| 2160 __ mov(r0, r4); | 2161 __ mov(r0, r4); |
| 2161 __ b(&done_create); | 2162 __ b(&done_create); |
| 2162 | 2163 |
| 2164 // For holey JSArrays we need to check that the array prototype chain |
| 2165 // protector is intact and our prototype is the Array.prototype actually. |
| 2166 __ bind(&create_holey_array); |
| 2167 __ ldr(r2, FieldMemOperand(r2, Map::kPrototypeOffset)); |
| 2168 __ ldr(r4, ContextMemOperand(r4, Context::INITIAL_ARRAY_PROTOTYPE_INDEX)); |
| 2169 __ cmp(r2, r4); |
| 2170 __ b(ne, &create_runtime); |
| 2171 __ LoadRoot(r4, Heap::kArrayProtectorRootIndex); |
| 2172 __ ldr(r2, FieldMemOperand(r4, PropertyCell::kValueOffset)); |
| 2173 __ cmp(r2, Operand(Smi::FromInt(Isolate::kProtectorValid))); |
| 2174 __ b(ne, &create_runtime); |
| 2175 __ ldr(r2, FieldMemOperand(r0, JSArray::kLengthOffset)); |
| 2176 __ ldr(r0, FieldMemOperand(r0, JSArray::kElementsOffset)); |
| 2177 __ SmiUntag(r2); |
| 2178 __ b(&done_create); |
| 2179 |
| 2163 // Try to create the list from a JSArray object. | 2180 // Try to create the list from a JSArray object. |
| 2181 // -- r2 and r4 must be preserved till bne create_holey_array. |
| 2164 __ bind(&create_array); | 2182 __ bind(&create_array); |
| 2165 __ ldr(r2, FieldMemOperand(r2, Map::kBitField2Offset)); | 2183 __ ldr(r5, FieldMemOperand(r2, Map::kBitField2Offset)); |
| 2166 __ DecodeField<Map::ElementsKindBits>(r2); | 2184 __ DecodeField<Map::ElementsKindBits>(r5); |
| 2167 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); | 2185 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); |
| 2168 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); | 2186 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); |
| 2169 STATIC_ASSERT(FAST_ELEMENTS == 2); | 2187 STATIC_ASSERT(FAST_ELEMENTS == 2); |
| 2170 __ cmp(r2, Operand(FAST_ELEMENTS)); | 2188 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); |
| 2189 __ cmp(r5, Operand(FAST_HOLEY_ELEMENTS)); |
| 2171 __ b(hi, &create_runtime); | 2190 __ b(hi, &create_runtime); |
| 2172 __ cmp(r2, Operand(FAST_HOLEY_SMI_ELEMENTS)); | 2191 // Only FAST_XXX after this point, FAST_HOLEY_XXX are odd values. |
| 2173 __ b(eq, &create_runtime); | 2192 __ tst(r5, Operand(1)); |
| 2193 __ b(ne, &create_holey_array); |
| 2194 // FAST_SMI_ELEMENTS or FAST_ELEMENTS after this point. |
| 2174 __ ldr(r2, FieldMemOperand(r0, JSArray::kLengthOffset)); | 2195 __ ldr(r2, FieldMemOperand(r0, JSArray::kLengthOffset)); |
| 2175 __ ldr(r0, FieldMemOperand(r0, JSArray::kElementsOffset)); | 2196 __ ldr(r0, FieldMemOperand(r0, JSArray::kElementsOffset)); |
| 2176 __ SmiUntag(r2); | 2197 __ SmiUntag(r2); |
| 2177 | 2198 |
| 2178 __ bind(&done_create); | 2199 __ bind(&done_create); |
| 2179 } | 2200 } |
| 2180 | 2201 |
| 2181 // Check for stack overflow. | 2202 // Check for stack overflow. |
| 2182 { | 2203 { |
| 2183 // Check the stack for overflow. We are not trying to catch interruptions | 2204 // Check the stack for overflow. We are not trying to catch interruptions |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2198 // -- r1 : target | 2219 // -- r1 : target |
| 2199 // -- r0 : args (a FixedArray built from argumentsList) | 2220 // -- r0 : args (a FixedArray built from argumentsList) |
| 2200 // -- r2 : len (number of elements to push from args) | 2221 // -- r2 : len (number of elements to push from args) |
| 2201 // -- r3 : new.target (checked to be constructor or undefined) | 2222 // -- r3 : new.target (checked to be constructor or undefined) |
| 2202 // -- sp[0] : thisArgument | 2223 // -- sp[0] : thisArgument |
| 2203 // ----------------------------------- | 2224 // ----------------------------------- |
| 2204 | 2225 |
| 2205 // Push arguments onto the stack (thisArgument is already on the stack). | 2226 // Push arguments onto the stack (thisArgument is already on the stack). |
| 2206 { | 2227 { |
| 2207 __ mov(r4, Operand(0)); | 2228 __ mov(r4, Operand(0)); |
| 2229 __ LoadRoot(r5, Heap::kTheHoleValueRootIndex); |
| 2230 __ LoadRoot(r6, Heap::kUndefinedValueRootIndex); |
| 2208 Label done, loop; | 2231 Label done, loop; |
| 2209 __ bind(&loop); | 2232 __ bind(&loop); |
| 2210 __ cmp(r4, r2); | 2233 __ cmp(r4, r2); |
| 2211 __ b(eq, &done); | 2234 __ b(eq, &done); |
| 2212 __ add(ip, r0, Operand(r4, LSL, kPointerSizeLog2)); | 2235 __ add(ip, r0, Operand(r4, LSL, kPointerSizeLog2)); |
| 2213 __ ldr(ip, FieldMemOperand(ip, FixedArray::kHeaderSize)); | 2236 __ ldr(ip, FieldMemOperand(ip, FixedArray::kHeaderSize)); |
| 2237 __ cmp(r5, ip); |
| 2238 __ mov(ip, r6, LeaveCC, eq); |
| 2214 __ Push(ip); | 2239 __ Push(ip); |
| 2215 __ add(r4, r4, Operand(1)); | 2240 __ add(r4, r4, Operand(1)); |
| 2216 __ b(&loop); | 2241 __ b(&loop); |
| 2217 __ bind(&done); | 2242 __ bind(&done); |
| 2218 __ Move(r0, r4); | 2243 __ Move(r0, r4); |
| 2219 } | 2244 } |
| 2220 | 2245 |
| 2221 // Dispatch to Call or Construct depending on whether new.target is undefined. | 2246 // Dispatch to Call or Construct depending on whether new.target is undefined. |
| 2222 { | 2247 { |
| 2223 __ CompareRoot(r3, Heap::kUndefinedValueRootIndex); | 2248 __ CompareRoot(r3, Heap::kUndefinedValueRootIndex); |
| (...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2868 __ bkpt(0); | 2893 __ bkpt(0); |
| 2869 } | 2894 } |
| 2870 } | 2895 } |
| 2871 | 2896 |
| 2872 #undef __ | 2897 #undef __ |
| 2873 | 2898 |
| 2874 } // namespace internal | 2899 } // namespace internal |
| 2875 } // namespace v8 | 2900 } // namespace v8 |
| 2876 | 2901 |
| 2877 #endif // V8_TARGET_ARCH_ARM | 2902 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |