Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(304)

Side by Side Diff: src/builtins/mips64/builtins-mips64.cc

Issue 2634393002: [MIPS] Fix Apply builtin always taking the slow path. (Closed)
Patch Set: Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/builtins/mips/builtins-mips.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « src/builtins/mips/builtins-mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698