| 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_MIPS64 | 5 #if V8_TARGET_ARCH_MIPS64 | 
| 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 2144 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2155 | 2155 | 
| 2156     // Check if argumentsList is an (unmodified) arguments object. | 2156     // Check if argumentsList is an (unmodified) arguments object. | 
| 2157     __ ld(at, ContextMemOperand(native_context, | 2157     __ ld(at, ContextMemOperand(native_context, | 
| 2158                                 Context::SLOPPY_ARGUMENTS_MAP_INDEX)); | 2158                                 Context::SLOPPY_ARGUMENTS_MAP_INDEX)); | 
| 2159     __ Branch(&create_arguments, eq, arguments_list_map, Operand(at)); | 2159     __ Branch(&create_arguments, eq, arguments_list_map, Operand(at)); | 
| 2160     __ ld(at, ContextMemOperand(native_context, | 2160     __ ld(at, ContextMemOperand(native_context, | 
| 2161                                 Context::STRICT_ARGUMENTS_MAP_INDEX)); | 2161                                 Context::STRICT_ARGUMENTS_MAP_INDEX)); | 
| 2162     __ Branch(&create_arguments, eq, arguments_list_map, Operand(at)); | 2162     __ Branch(&create_arguments, eq, arguments_list_map, Operand(at)); | 
| 2163 | 2163 | 
| 2164     // Check if argumentsList is a fast JSArray. | 2164     // Check if argumentsList is a fast JSArray. | 
| 2165     __ ld(v0, FieldMemOperand(a2, HeapObject::kMapOffset)); | 2165     __ lbu(v0, FieldMemOperand(a2, Map::kInstanceTypeOffset)); | 
| 2166     __ lbu(v0, FieldMemOperand(v0, Map::kInstanceTypeOffset)); |  | 
| 2167     __ Branch(&create_array, eq, v0, Operand(JS_ARRAY_TYPE)); | 2166     __ Branch(&create_array, eq, v0, Operand(JS_ARRAY_TYPE)); | 
| 2168 | 2167 | 
| 2169     // Ask the runtime to create the list (actually a FixedArray). | 2168     // Ask the runtime to create the list (actually a FixedArray). | 
| 2170     __ bind(&create_runtime); | 2169     __ bind(&create_runtime); | 
| 2171     { | 2170     { | 
| 2172       FrameScope scope(masm, StackFrame::INTERNAL); | 2171       FrameScope scope(masm, StackFrame::INTERNAL); | 
| 2173       __ Push(target, new_target, arguments_list); | 2172       __ Push(target, new_target, arguments_list); | 
| 2174       __ CallRuntime(Runtime::kCreateListFromArrayLike); | 2173       __ CallRuntime(Runtime::kCreateListFromArrayLike); | 
| 2175       __ mov(arguments_list, v0); | 2174       __ mov(arguments_list, v0); | 
| 2176       __ Pop(target, new_target); | 2175       __ Pop(target, new_target); | 
| 2177       __ lw(len, UntagSmiFieldMemOperand(v0, FixedArray::kLengthOffset)); | 2176       __ lw(len, UntagSmiFieldMemOperand(v0, FixedArray::kLengthOffset)); | 
| 2178     } | 2177     } | 
| 2179     __ Branch(&done_create); | 2178     __ Branch(&done_create); | 
| 2180 | 2179 | 
| 2181     // Try to create the list from an arguments object. | 2180     // Try to create the list from an arguments object. | 
| 2182     __ bind(&create_arguments); | 2181     __ bind(&create_arguments); | 
| 2183     __ lw(len, UntagSmiFieldMemOperand(arguments_list, | 2182     __ lw(len, UntagSmiFieldMemOperand(arguments_list, | 
| 2184                                        JSArgumentsObject::kLengthOffset)); | 2183                                        JSArgumentsObject::kLengthOffset)); | 
| 2185     __ ld(a4, FieldMemOperand(arguments_list, JSObject::kElementsOffset)); | 2184     __ ld(a4, FieldMemOperand(arguments_list, JSObject::kElementsOffset)); | 
| 2186     __ lw(at, UntagSmiFieldMemOperand(a4, FixedArray::kLengthOffset)); | 2185     __ lw(at, UntagSmiFieldMemOperand(a4, FixedArray::kLengthOffset)); | 
| 2187     __ Branch(&create_runtime, ne, len, Operand(at)); | 2186     __ Branch(&create_runtime, ne, len, Operand(at)); | 
| 2188     __ mov(args, a4); | 2187     __ mov(args, a4); | 
| 2189 | 2188 | 
| 2190     __ Branch(&done_create); | 2189     __ Branch(&done_create); | 
| 2191 | 2190 | 
| 2192     // For holey JSArrays we need to check that the array prototype chain | 2191     // For holey JSArrays we need to check that the array prototype chain | 
| 2193     // protector is intact and our prototype is the Array.prototype actually. | 2192     // protector is intact and our prototype is the Array.prototype actually. | 
| 2194     __ bind(&create_holey_array); | 2193     __ bind(&create_holey_array); | 
| 2195     __ ld(a2, FieldMemOperand(a2, Map::kPrototypeOffset)); | 2194     __ ld(a2, FieldMemOperand(a2, Map::kPrototypeOffset)); | 
| 2196     __ ld(at, ContextMemOperand(t0, Context::INITIAL_ARRAY_PROTOTYPE_INDEX)); | 2195     __ ld(at, ContextMemOperand(native_context, | 
|  | 2196                                 Context::INITIAL_ARRAY_PROTOTYPE_INDEX)); | 
| 2197     __ Branch(&create_runtime, ne, a2, Operand(at)); | 2197     __ Branch(&create_runtime, ne, a2, Operand(at)); | 
| 2198     __ LoadRoot(at, Heap::kArrayProtectorRootIndex); | 2198     __ LoadRoot(at, Heap::kArrayProtectorRootIndex); | 
| 2199     __ lw(a2, UntagSmiFieldMemOperand(at, PropertyCell::kValueOffset)); | 2199     __ lw(a2, UntagSmiFieldMemOperand(at, PropertyCell::kValueOffset)); | 
| 2200     __ Branch(&create_runtime, ne, a2, | 2200     __ Branch(&create_runtime, ne, a2, | 
| 2201               Operand(Smi::FromInt(Isolate::kProtectorValid))); | 2201               Operand(Smi::FromInt(Isolate::kProtectorValid))); | 
| 2202     __ lw(a2, UntagSmiFieldMemOperand(a0, JSArray::kLengthOffset)); | 2202     __ lw(a2, UntagSmiFieldMemOperand(a0, JSArray::kLengthOffset)); | 
| 2203     __ ld(a0, FieldMemOperand(a0, JSArray::kElementsOffset)); | 2203     __ ld(a0, FieldMemOperand(a0, JSArray::kElementsOffset)); | 
| 2204     __ Branch(&done_create); | 2204     __ Branch(&done_create); | 
| 2205 | 2205 | 
| 2206     // Try to create the list from a JSArray object. | 2206     // Try to create the list from a JSArray object. | 
| 2207     __ bind(&create_array); | 2207     __ bind(&create_array); | 
| 2208     __ ld(a2, FieldMemOperand(a2, Map::kBitField2Offset)); | 2208     __ lbu(t1, FieldMemOperand(a2, Map::kBitField2Offset)); | 
| 2209     __ DecodeField<Map::ElementsKindBits>(a2); | 2209     __ DecodeField<Map::ElementsKindBits>(t1); | 
| 2210     STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); | 2210     STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); | 
| 2211     STATIC_ASSERT(FAST_ELEMENTS == 2); | 2211     STATIC_ASSERT(FAST_ELEMENTS == 2); | 
| 2212     STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); | 2212     STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); | 
| 2213     __ Branch(&create_holey_array, eq, a2, Operand(FAST_HOLEY_SMI_ELEMENTS)); | 2213     __ Branch(&create_holey_array, eq, t1, Operand(FAST_HOLEY_SMI_ELEMENTS)); | 
| 2214     __ Branch(&create_holey_array, eq, a2, Operand(FAST_HOLEY_ELEMENTS)); | 2214     __ Branch(&create_holey_array, eq, t1, Operand(FAST_HOLEY_ELEMENTS)); | 
| 2215     __ andi(a2, a2, uint16_t(~FAST_ELEMENTS));  // works if enum ElementsKind | 2215     __ Branch(&create_runtime, hi, t1, Operand(FAST_ELEMENTS)); | 
| 2216     // has less than 2^16 elements |  | 
| 2217     __ Branch(&create_runtime, ne, a2, Operand(int64_t(0))); |  | 
| 2218     __ lw(a2, UntagSmiFieldMemOperand(arguments_list, JSArray::kLengthOffset)); | 2216     __ lw(a2, UntagSmiFieldMemOperand(arguments_list, JSArray::kLengthOffset)); | 
| 2219     __ ld(a0, FieldMemOperand(arguments_list, JSArray::kElementsOffset)); | 2217     __ ld(a0, FieldMemOperand(arguments_list, JSArray::kElementsOffset)); | 
| 2220 | 2218 | 
| 2221     __ bind(&done_create); | 2219     __ bind(&done_create); | 
| 2222   } | 2220   } | 
| 2223 | 2221 | 
| 2224   // Check for stack overflow. | 2222   // Check for stack overflow. | 
| 2225   { | 2223   { | 
| 2226     // Check the stack for overflow. We are not trying to catch interruptions | 2224     // Check the stack for overflow. We are not trying to catch interruptions | 
| 2227     // (i.e. debug break and preemption) here, so check the "real stack limit". | 2225     // (i.e. debug break and preemption) here, so check the "real stack limit". | 
| (...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2988     __ break_(0xCC); | 2986     __ break_(0xCC); | 
| 2989   } | 2987   } | 
| 2990 } | 2988 } | 
| 2991 | 2989 | 
| 2992 #undef __ | 2990 #undef __ | 
| 2993 | 2991 | 
| 2994 }  // namespace internal | 2992 }  // namespace internal | 
| 2995 }  // namespace v8 | 2993 }  // namespace v8 | 
| 2996 | 2994 | 
| 2997 #endif  // V8_TARGET_ARCH_MIPS64 | 2995 #endif  // V8_TARGET_ARCH_MIPS64 | 
| OLD | NEW | 
|---|