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

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

Issue 2550503003: MIPS: Port '[x86] Also deal with holey arrays in the Apply builtin.' (Closed)
Patch Set: Created 4 years 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
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 2126 matching lines...) Expand 10 before | Expand all | Expand 10 after
2137 2137
2138 Register arguments_list = a0; 2138 Register arguments_list = a0;
2139 Register target = a1; 2139 Register target = a1;
2140 Register new_target = a3; 2140 Register new_target = a3;
2141 2141
2142 Register args = a0; 2142 Register args = a0;
2143 Register len = a2; 2143 Register len = a2;
2144 2144
2145 // Create the list of arguments from the array-like argumentsList. 2145 // Create the list of arguments from the array-like argumentsList.
2146 { 2146 {
2147 Label create_arguments, create_array, create_runtime, done_create; 2147 Label create_arguments, create_array, create_holey_array, create_runtime,
2148 done_create;
2148 __ JumpIfSmi(arguments_list, &create_runtime); 2149 __ JumpIfSmi(arguments_list, &create_runtime);
2149 2150
2150 // Load the map of argumentsList into a2. 2151 // Load the map of argumentsList into a2.
2151 Register arguments_list_map = a2; 2152 Register arguments_list_map = a2;
2152 __ ld(arguments_list_map, 2153 __ ld(arguments_list_map,
2153 FieldMemOperand(arguments_list, HeapObject::kMapOffset)); 2154 FieldMemOperand(arguments_list, HeapObject::kMapOffset));
2154 2155
2155 // Load native context into a4. 2156 // Load native context into a4.
2156 Register native_context = a4; 2157 Register native_context = a4;
2157 __ ld(native_context, NativeContextMemOperand()); 2158 __ ld(native_context, NativeContextMemOperand());
(...skipping 27 matching lines...) Expand all
2185 __ bind(&create_arguments); 2186 __ bind(&create_arguments);
2186 __ lw(len, UntagSmiFieldMemOperand(arguments_list, 2187 __ lw(len, UntagSmiFieldMemOperand(arguments_list,
2187 JSArgumentsObject::kLengthOffset)); 2188 JSArgumentsObject::kLengthOffset));
2188 __ ld(a4, FieldMemOperand(arguments_list, JSObject::kElementsOffset)); 2189 __ ld(a4, FieldMemOperand(arguments_list, JSObject::kElementsOffset));
2189 __ lw(at, UntagSmiFieldMemOperand(a4, FixedArray::kLengthOffset)); 2190 __ lw(at, UntagSmiFieldMemOperand(a4, FixedArray::kLengthOffset));
2190 __ Branch(&create_runtime, ne, len, Operand(at)); 2191 __ Branch(&create_runtime, ne, len, Operand(at));
2191 __ mov(args, a4); 2192 __ mov(args, a4);
2192 2193
2193 __ Branch(&done_create); 2194 __ Branch(&done_create);
2194 2195
2196 // For holey JSArrays we need to check that the array prototype chain
2197 // protector is intact and our prototype is the Array.prototype actually.
2198 __ bind(&create_holey_array);
2199 __ ld(a2, FieldMemOperand(a2, Map::kPrototypeOffset));
2200 __ ld(at, ContextMemOperand(t0, Context::INITIAL_ARRAY_PROTOTYPE_INDEX));
2201 __ Branch(&create_runtime, ne, a2, Operand(at));
2202 __ LoadRoot(t0, Heap::kArrayProtectorRootIndex);
2203 __ lw(a2, UntagSmiFieldMemOperand(t0, PropertyCell::kValueOffset));
2204 __ Branch(&create_runtime, ne, a2,
2205 Operand(Smi::FromInt(Isolate::kProtectorValid)));
2206 __ lw(a2, UntagSmiFieldMemOperand(a0, JSArray::kLengthOffset));
2207 __ ld(a0, FieldMemOperand(a0, JSArray::kElementsOffset));
2208 __ Branch(&done_create);
2209
2195 // Try to create the list from a JSArray object. 2210 // Try to create the list from a JSArray object.
2196 __ bind(&create_array); 2211 __ bind(&create_array);
2197 __ ld(a2, FieldMemOperand(a2, Map::kBitField2Offset)); 2212 __ ld(a2, FieldMemOperand(a2, Map::kBitField2Offset));
2198 __ DecodeField<Map::ElementsKindBits>(a2); 2213 __ DecodeField<Map::ElementsKindBits>(a2);
2199 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); 2214 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0);
2200 STATIC_ASSERT(FAST_ELEMENTS == 2); 2215 STATIC_ASSERT(FAST_ELEMENTS == 2);
2216 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3);
2217 __ Branch(&create_holey_array, eq, a2, Operand(FAST_HOLEY_SMI_ELEMENTS));
2218 __ Branch(&create_holey_array, eq, a2, Operand(FAST_HOLEY_ELEMENTS));
2201 __ andi(a2, a2, uint16_t(~FAST_ELEMENTS)); // works if enum ElementsKind 2219 __ andi(a2, a2, uint16_t(~FAST_ELEMENTS)); // works if enum ElementsKind
2202 // has less than 2^16 elements 2220 // has less than 2^16 elements
2203 __ Branch(&create_runtime, ne, a2, Operand(int64_t(0))); 2221 __ Branch(&create_runtime, ne, a2, Operand(int64_t(0)));
2204 __ lw(a2, UntagSmiFieldMemOperand(arguments_list, JSArray::kLengthOffset)); 2222 __ lw(a2, UntagSmiFieldMemOperand(arguments_list, JSArray::kLengthOffset));
2205 __ ld(a0, FieldMemOperand(arguments_list, JSArray::kElementsOffset)); 2223 __ ld(a0, FieldMemOperand(arguments_list, JSArray::kElementsOffset));
2206 2224
2207 __ bind(&done_create); 2225 __ bind(&done_create);
2208 } 2226 }
2209 2227
2210 // Check for stack overflow. 2228 // Check for stack overflow.
(...skipping 15 matching lines...) Expand all
2226 // ----------- S t a t e ------------- 2244 // ----------- S t a t e -------------
2227 // -- a1 : target 2245 // -- a1 : target
2228 // -- a0 : args (a FixedArray built from argumentsList) 2246 // -- a0 : args (a FixedArray built from argumentsList)
2229 // -- a2 : len (number of elements to push from args) 2247 // -- a2 : len (number of elements to push from args)
2230 // -- a3 : new.target (checked to be constructor or undefined) 2248 // -- a3 : new.target (checked to be constructor or undefined)
2231 // -- sp[0] : thisArgument 2249 // -- sp[0] : thisArgument
2232 // ----------------------------------- 2250 // -----------------------------------
2233 2251
2234 // Push arguments onto the stack (thisArgument is already on the stack). 2252 // Push arguments onto the stack (thisArgument is already on the stack).
2235 { 2253 {
2236 Label done, loop; 2254 Label done, push, loop;
2237 Register src = a4; 2255 Register src = a4;
2238 Register scratch = len; 2256 Register scratch = len;
2239 2257
2240 __ daddiu(src, args, FixedArray::kHeaderSize - kHeapObjectTag); 2258 __ daddiu(src, args, FixedArray::kHeaderSize - kHeapObjectTag);
2241 __ Branch(&done, eq, len, Operand(zero_reg), i::USE_DELAY_SLOT); 2259 __ Branch(&done, eq, len, Operand(zero_reg), i::USE_DELAY_SLOT);
2242 __ mov(a0, len); // The 'len' argument for Call() or Construct(). 2260 __ mov(a0, len); // The 'len' argument for Call() or Construct().
2243 __ dsll(scratch, len, kPointerSizeLog2); 2261 __ dsll(scratch, len, kPointerSizeLog2);
2244 __ Dsubu(scratch, sp, Operand(scratch)); 2262 __ Dsubu(scratch, sp, Operand(scratch));
2263 __ LoadRoot(t1, Heap::kTheHoleValueRootIndex);
2245 __ bind(&loop); 2264 __ bind(&loop);
2246 __ ld(a5, MemOperand(src)); 2265 __ ld(a5, MemOperand(src));
2266 __ Branch(&push, ne, a5, Operand(t1));
2267 __ LoadRoot(a5, Heap::kUndefinedValueRootIndex);
2268 __ bind(&push);
2247 __ daddiu(src, src, kPointerSize); 2269 __ daddiu(src, src, kPointerSize);
2248 __ Push(a5); 2270 __ Push(a5);
2249 __ Branch(&loop, ne, scratch, Operand(sp)); 2271 __ Branch(&loop, ne, scratch, Operand(sp));
2250 __ bind(&done); 2272 __ bind(&done);
2251 } 2273 }
2252 2274
2253 // ----------- S t a t e ------------- 2275 // ----------- S t a t e -------------
2254 // -- a0 : argument count (len) 2276 // -- a0 : argument count (len)
2255 // -- a1 : target 2277 // -- a1 : target
2256 // -- a3 : new.target (checked to be constructor or undefinded) 2278 // -- a3 : new.target (checked to be constructor or undefinded)
(...skipping 713 matching lines...) Expand 10 before | Expand all | Expand 10 after
2970 __ break_(0xCC); 2992 __ break_(0xCC);
2971 } 2993 }
2972 } 2994 }
2973 2995
2974 #undef __ 2996 #undef __
2975 2997
2976 } // namespace internal 2998 } // namespace internal
2977 } // namespace v8 2999 } // namespace v8
2978 3000
2979 #endif // V8_TARGET_ARCH_MIPS64 3001 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« src/builtins/mips/builtins-mips.cc ('K') | « src/builtins/mips/builtins-mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698