| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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_PPC | 5 #if V8_TARGET_ARCH_PPC |
| 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 2145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2156 void Builtins::Generate_Apply(MacroAssembler* masm) { | 2156 void Builtins::Generate_Apply(MacroAssembler* masm) { |
| 2157 // ----------- S t a t e ------------- | 2157 // ----------- S t a t e ------------- |
| 2158 // -- r3 : argumentsList | 2158 // -- r3 : argumentsList |
| 2159 // -- r4 : target | 2159 // -- r4 : target |
| 2160 // -- r6 : new.target (checked to be constructor or undefined) | 2160 // -- r6 : new.target (checked to be constructor or undefined) |
| 2161 // -- sp[0] : thisArgument | 2161 // -- sp[0] : thisArgument |
| 2162 // ----------------------------------- | 2162 // ----------------------------------- |
| 2163 | 2163 |
| 2164 // Create the list of arguments from the array-like argumentsList. | 2164 // Create the list of arguments from the array-like argumentsList. |
| 2165 { | 2165 { |
| 2166 Label create_arguments, create_array, create_runtime, done_create; | 2166 Label create_arguments, create_array, create_holey_array, create_runtime, |
| 2167 done_create; |
| 2167 __ JumpIfSmi(r3, &create_runtime); | 2168 __ JumpIfSmi(r3, &create_runtime); |
| 2168 | 2169 |
| 2169 // Load the map of argumentsList into r5. | 2170 // Load the map of argumentsList into r5. |
| 2170 __ LoadP(r5, FieldMemOperand(r3, HeapObject::kMapOffset)); | 2171 __ LoadP(r5, FieldMemOperand(r3, HeapObject::kMapOffset)); |
| 2171 | 2172 |
| 2172 // Load native context into r7. | 2173 // Load native context into r7. |
| 2173 __ LoadP(r7, NativeContextMemOperand()); | 2174 __ LoadP(r7, NativeContextMemOperand()); |
| 2174 | 2175 |
| 2175 // Check if argumentsList is an (unmodified) arguments object. | 2176 // Check if argumentsList is an (unmodified) arguments object. |
| 2176 __ LoadP(ip, ContextMemOperand(r7, Context::SLOPPY_ARGUMENTS_MAP_INDEX)); | 2177 __ LoadP(ip, ContextMemOperand(r7, Context::SLOPPY_ARGUMENTS_MAP_INDEX)); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2200 __ bind(&create_arguments); | 2201 __ bind(&create_arguments); |
| 2201 __ LoadP(r5, FieldMemOperand(r3, JSArgumentsObject::kLengthOffset)); | 2202 __ LoadP(r5, FieldMemOperand(r3, JSArgumentsObject::kLengthOffset)); |
| 2202 __ LoadP(r7, FieldMemOperand(r3, JSObject::kElementsOffset)); | 2203 __ LoadP(r7, FieldMemOperand(r3, JSObject::kElementsOffset)); |
| 2203 __ LoadP(ip, FieldMemOperand(r7, FixedArray::kLengthOffset)); | 2204 __ LoadP(ip, FieldMemOperand(r7, FixedArray::kLengthOffset)); |
| 2204 __ cmp(r5, ip); | 2205 __ cmp(r5, ip); |
| 2205 __ bne(&create_runtime); | 2206 __ bne(&create_runtime); |
| 2206 __ SmiUntag(r5); | 2207 __ SmiUntag(r5); |
| 2207 __ mr(r3, r7); | 2208 __ mr(r3, r7); |
| 2208 __ b(&done_create); | 2209 __ b(&done_create); |
| 2209 | 2210 |
| 2211 // For holey JSArrays we need to check that the array prototype chain |
| 2212 // protector is intact and our prototype is the Array.prototype actually. |
| 2213 __ bind(&create_holey_array); |
| 2214 __ LoadP(r5, FieldMemOperand(r5, Map::kPrototypeOffset)); |
| 2215 __ LoadP(r7, ContextMemOperand(r7, Context::INITIAL_ARRAY_PROTOTYPE_INDEX)); |
| 2216 __ cmp(r5, r7); |
| 2217 __ bne(&create_runtime); |
| 2218 __ LoadRoot(r7, Heap::kArrayProtectorRootIndex); |
| 2219 __ LoadP(r5, FieldMemOperand(r7, PropertyCell::kValueOffset)); |
| 2220 __ CmpSmiLiteral(r5, Smi::FromInt(Isolate::kProtectorValid), r0); |
| 2221 __ bne(&create_runtime); |
| 2222 __ LoadP(r5, FieldMemOperand(r3, JSArray::kLengthOffset)); |
| 2223 __ LoadP(r3, FieldMemOperand(r3, JSArray::kElementsOffset)); |
| 2224 __ SmiUntag(r5); |
| 2225 __ b(&done_create); |
| 2226 |
| 2210 // Try to create the list from a JSArray object. | 2227 // Try to create the list from a JSArray object. |
| 2228 // -- r5 and r7 must be preserved till bne create_holey_array. |
| 2211 __ bind(&create_array); | 2229 __ bind(&create_array); |
| 2212 __ lbz(r5, FieldMemOperand(r5, Map::kBitField2Offset)); | 2230 __ lbz(r8, FieldMemOperand(r5, Map::kBitField2Offset)); |
| 2213 __ DecodeField<Map::ElementsKindBits>(r5); | 2231 __ DecodeField<Map::ElementsKindBits>(r8); |
| 2214 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); | 2232 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); |
| 2215 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); | 2233 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); |
| 2216 STATIC_ASSERT(FAST_ELEMENTS == 2); | 2234 STATIC_ASSERT(FAST_ELEMENTS == 2); |
| 2217 __ cmpi(r5, Operand(FAST_ELEMENTS)); | 2235 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); |
| 2236 __ cmpi(r8, Operand(FAST_HOLEY_ELEMENTS)); |
| 2218 __ bgt(&create_runtime); | 2237 __ bgt(&create_runtime); |
| 2219 __ cmpi(r5, Operand(FAST_HOLEY_SMI_ELEMENTS)); | 2238 // Only FAST_XXX after this point, FAST_HOLEY_XXX are odd values. |
| 2220 __ beq(&create_runtime); | 2239 __ TestBit(r8, Map::kHasNonInstancePrototype, r0); |
| 2240 __ bne(&create_holey_array, cr0); |
| 2241 // FAST_SMI_ELEMENTS or FAST_ELEMENTS after this point. |
| 2221 __ LoadP(r5, FieldMemOperand(r3, JSArray::kLengthOffset)); | 2242 __ LoadP(r5, FieldMemOperand(r3, JSArray::kLengthOffset)); |
| 2222 __ LoadP(r3, FieldMemOperand(r3, JSArray::kElementsOffset)); | 2243 __ LoadP(r3, FieldMemOperand(r3, JSArray::kElementsOffset)); |
| 2223 __ SmiUntag(r5); | 2244 __ SmiUntag(r5); |
| 2224 | 2245 |
| 2225 __ bind(&done_create); | 2246 __ bind(&done_create); |
| 2226 } | 2247 } |
| 2227 | 2248 |
| 2228 // Check for stack overflow. | 2249 // Check for stack overflow. |
| 2229 { | 2250 { |
| 2230 // Check the stack for overflow. We are not trying to catch interruptions | 2251 // Check the stack for overflow. We are not trying to catch interruptions |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2245 // ----------- S t a t e ------------- | 2266 // ----------- S t a t e ------------- |
| 2246 // -- r4 : target | 2267 // -- r4 : target |
| 2247 // -- r3 : args (a FixedArray built from argumentsList) | 2268 // -- r3 : args (a FixedArray built from argumentsList) |
| 2248 // -- r5 : len (number of elements to push from args) | 2269 // -- r5 : len (number of elements to push from args) |
| 2249 // -- r6 : new.target (checked to be constructor or undefined) | 2270 // -- r6 : new.target (checked to be constructor or undefined) |
| 2250 // -- sp[0] : thisArgument | 2271 // -- sp[0] : thisArgument |
| 2251 // ----------------------------------- | 2272 // ----------------------------------- |
| 2252 | 2273 |
| 2253 // Push arguments onto the stack (thisArgument is already on the stack). | 2274 // Push arguments onto the stack (thisArgument is already on the stack). |
| 2254 { | 2275 { |
| 2255 Label loop, no_args; | 2276 __ LoadRoot(r9, Heap::kUndefinedValueRootIndex); |
| 2277 Label loop, no_args, skip; |
| 2256 __ cmpi(r5, Operand::Zero()); | 2278 __ cmpi(r5, Operand::Zero()); |
| 2257 __ beq(&no_args); | 2279 __ beq(&no_args); |
| 2258 __ addi(r3, r3, | 2280 __ addi(r3, r3, |
| 2259 Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize)); | 2281 Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize)); |
| 2260 __ mtctr(r5); | 2282 __ mtctr(r5); |
| 2261 __ bind(&loop); | 2283 __ bind(&loop); |
| 2262 __ LoadPU(r0, MemOperand(r3, kPointerSize)); | 2284 __ LoadPU(ip, MemOperand(r3, kPointerSize)); |
| 2263 __ push(r0); | 2285 __ CompareRoot(ip, Heap::kTheHoleValueRootIndex); |
| 2286 __ bne(&skip); |
| 2287 __ mr(ip, r9); |
| 2288 __ bind(&skip); |
| 2289 __ push(ip); |
| 2264 __ bdnz(&loop); | 2290 __ bdnz(&loop); |
| 2265 __ bind(&no_args); | 2291 __ bind(&no_args); |
| 2266 __ mr(r3, r5); | 2292 __ mr(r3, r5); |
| 2267 } | 2293 } |
| 2268 | 2294 |
| 2269 // Dispatch to Call or Construct depending on whether new.target is undefined. | 2295 // Dispatch to Call or Construct depending on whether new.target is undefined. |
| 2270 { | 2296 { |
| 2271 __ CompareRoot(r6, Heap::kUndefinedValueRootIndex); | 2297 __ CompareRoot(r6, Heap::kUndefinedValueRootIndex); |
| 2272 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET, eq); | 2298 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET, eq); |
| 2273 __ Jump(masm->isolate()->builtins()->Construct(), RelocInfo::CODE_TARGET); | 2299 __ Jump(masm->isolate()->builtins()->Construct(), RelocInfo::CODE_TARGET); |
| (...skipping 671 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2945 __ CallRuntime(Runtime::kThrowStackOverflow); | 2971 __ CallRuntime(Runtime::kThrowStackOverflow); |
| 2946 __ bkpt(0); | 2972 __ bkpt(0); |
| 2947 } | 2973 } |
| 2948 } | 2974 } |
| 2949 | 2975 |
| 2950 #undef __ | 2976 #undef __ |
| 2951 } // namespace internal | 2977 } // namespace internal |
| 2952 } // namespace v8 | 2978 } // namespace v8 |
| 2953 | 2979 |
| 2954 #endif // V8_TARGET_ARCH_PPC | 2980 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |