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_MIPS | 5 #if V8_TARGET_ARCH_MIPS |
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 2113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2124 void Builtins::Generate_Apply(MacroAssembler* masm) { | 2124 void Builtins::Generate_Apply(MacroAssembler* masm) { |
2125 // ----------- S t a t e ------------- | 2125 // ----------- S t a t e ------------- |
2126 // -- a0 : argumentsList | 2126 // -- a0 : argumentsList |
2127 // -- a1 : target | 2127 // -- a1 : target |
2128 // -- a3 : new.target (checked to be constructor or undefined) | 2128 // -- a3 : new.target (checked to be constructor or undefined) |
2129 // -- sp[0] : thisArgument | 2129 // -- sp[0] : thisArgument |
2130 // ----------------------------------- | 2130 // ----------------------------------- |
2131 | 2131 |
2132 // Create the list of arguments from the array-like argumentsList. | 2132 // Create the list of arguments from the array-like argumentsList. |
2133 { | 2133 { |
2134 Label create_arguments, create_array, create_runtime, done_create; | 2134 Label create_arguments, create_array, create_holey_array, create_runtime, |
2135 done_create; | |
2135 __ JumpIfSmi(a0, &create_runtime); | 2136 __ JumpIfSmi(a0, &create_runtime); |
2136 | 2137 |
2137 // Load the map of argumentsList into a2. | 2138 // Load the map of argumentsList into a2. |
2138 __ lw(a2, FieldMemOperand(a0, HeapObject::kMapOffset)); | 2139 __ lw(a2, FieldMemOperand(a0, HeapObject::kMapOffset)); |
2139 | 2140 |
2140 // Load native context into t0. | 2141 // Load native context into t0. |
2141 __ lw(t0, NativeContextMemOperand()); | 2142 __ lw(t0, NativeContextMemOperand()); |
2142 | 2143 |
2143 // Check if argumentsList is an (unmodified) arguments object. | 2144 // Check if argumentsList is an (unmodified) arguments object. |
2144 __ lw(at, ContextMemOperand(t0, Context::SLOPPY_ARGUMENTS_MAP_INDEX)); | 2145 __ lw(at, ContextMemOperand(t0, Context::SLOPPY_ARGUMENTS_MAP_INDEX)); |
(...skipping 22 matching lines...) Expand all Loading... | |
2167 // Try to create the list from an arguments object. | 2168 // Try to create the list from an arguments object. |
2168 __ bind(&create_arguments); | 2169 __ bind(&create_arguments); |
2169 __ lw(a2, FieldMemOperand(a0, JSArgumentsObject::kLengthOffset)); | 2170 __ lw(a2, FieldMemOperand(a0, JSArgumentsObject::kLengthOffset)); |
2170 __ lw(t0, FieldMemOperand(a0, JSObject::kElementsOffset)); | 2171 __ lw(t0, FieldMemOperand(a0, JSObject::kElementsOffset)); |
2171 __ lw(at, FieldMemOperand(t0, FixedArray::kLengthOffset)); | 2172 __ lw(at, FieldMemOperand(t0, FixedArray::kLengthOffset)); |
2172 __ Branch(&create_runtime, ne, a2, Operand(at)); | 2173 __ Branch(&create_runtime, ne, a2, Operand(at)); |
2173 __ SmiUntag(a2); | 2174 __ SmiUntag(a2); |
2174 __ mov(a0, t0); | 2175 __ mov(a0, t0); |
2175 __ Branch(&done_create); | 2176 __ Branch(&done_create); |
2176 | 2177 |
2178 // For holey JSArrays we need to check that the array prototype chain | |
2179 // protector is intact and our prototype is the Array.prototype actually. | |
2180 __ bind(&create_holey_array); | |
Ilija.Pavlovic1
2016/12/02 10:32:52
Missing
__ lw(a2, FieldMemOperand(a0, HeapObject:
Marija Antic
2016/12/02 11:48:08
Value FieldMemOperand(a0, HeapObject::kMapOffset)
| |
2181 __ lw(a2, FieldMemOperand(a2, Map::kPrototypeOffset)); | |
2182 __ lw(at, ContextMemOperand(t0, Context::INITIAL_ARRAY_PROTOTYPE_INDEX)); | |
2183 __ Branch(&create_runtime, ne, a2, Operand(at)); | |
2184 __ LoadRoot(t0, Heap::kArrayProtectorRootIndex); | |
2185 __ lw(a2, FieldMemOperand(t0, PropertyCell::kValueOffset)); | |
Ilija.Pavlovic1
2016/12/02 10:32:52
Maybe to change into
__ LoadRoot(at, Heap::kArray
Marija Antic
2016/12/02 11:48:08
Done.
| |
2186 __ Branch(&create_runtime, ne, a2, | |
2187 Operand(Smi::FromInt(Isolate::kProtectorValid))); | |
2188 __ lw(a2, FieldMemOperand(a0, JSArray::kLengthOffset)); | |
Ilija.Pavlovic1
2016/12/02 10:32:52
Maybe to change into
__ lw(t0, FieldMemOperand(a0
Marija Antic
2016/12/02 11:48:07
Length should be in a2 after we are finished (line
| |
2189 __ lw(a0, FieldMemOperand(a0, JSArray::kElementsOffset)); | |
2190 __ SmiUntag(a2); | |
2191 __ Branch(&done_create); | |
2192 | |
2177 // Try to create the list from a JSArray object. | 2193 // Try to create the list from a JSArray object. |
2178 __ bind(&create_array); | 2194 __ bind(&create_array); |
2179 __ lw(a2, FieldMemOperand(a2, Map::kBitField2Offset)); | 2195 __ lw(a2, FieldMemOperand(a2, Map::kBitField2Offset)); |
2180 __ DecodeField<Map::ElementsKindBits>(a2); | 2196 __ DecodeField<Map::ElementsKindBits>(a2); |
2181 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); | 2197 STATIC_ASSERT(FAST_SMI_ELEMENTS == 0); |
2182 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); | 2198 STATIC_ASSERT(FAST_HOLEY_SMI_ELEMENTS == 1); |
2183 STATIC_ASSERT(FAST_ELEMENTS == 2); | 2199 STATIC_ASSERT(FAST_ELEMENTS == 2); |
2200 STATIC_ASSERT(FAST_HOLEY_ELEMENTS == 3); | |
2201 __ Branch(&create_holey_array, eq, a2, Operand(FAST_HOLEY_SMI_ELEMENTS)); | |
2202 __ Branch(&create_holey_array, eq, a2, Operand(FAST_HOLEY_ELEMENTS)); | |
2184 __ Branch(&create_runtime, hi, a2, Operand(FAST_ELEMENTS)); | 2203 __ Branch(&create_runtime, hi, a2, Operand(FAST_ELEMENTS)); |
2185 __ Branch(&create_runtime, eq, a2, Operand(FAST_HOLEY_SMI_ELEMENTS)); | |
2186 __ lw(a2, FieldMemOperand(a0, JSArray::kLengthOffset)); | 2204 __ lw(a2, FieldMemOperand(a0, JSArray::kLengthOffset)); |
2187 __ lw(a0, FieldMemOperand(a0, JSArray::kElementsOffset)); | 2205 __ lw(a0, FieldMemOperand(a0, JSArray::kElementsOffset)); |
2188 __ SmiUntag(a2); | 2206 __ SmiUntag(a2); |
2189 | 2207 |
2190 __ bind(&done_create); | 2208 __ bind(&done_create); |
2191 } | 2209 } |
2192 | 2210 |
2193 // Check for stack overflow. | 2211 // Check for stack overflow. |
2194 { | 2212 { |
2195 // Check the stack for overflow. We are not trying to catch interruptions | 2213 // Check the stack for overflow. We are not trying to catch interruptions |
(...skipping 14 matching lines...) Expand all Loading... | |
2210 // -- a1 : target | 2228 // -- a1 : target |
2211 // -- a0 : args (a FixedArray built from argumentsList) | 2229 // -- a0 : args (a FixedArray built from argumentsList) |
2212 // -- a2 : len (number of elements to push from args) | 2230 // -- a2 : len (number of elements to push from args) |
2213 // -- a3 : new.target (checked to be constructor or undefined) | 2231 // -- a3 : new.target (checked to be constructor or undefined) |
2214 // -- sp[0] : thisArgument | 2232 // -- sp[0] : thisArgument |
2215 // ----------------------------------- | 2233 // ----------------------------------- |
2216 | 2234 |
2217 // Push arguments onto the stack (thisArgument is already on the stack). | 2235 // Push arguments onto the stack (thisArgument is already on the stack). |
2218 { | 2236 { |
2219 __ mov(t0, zero_reg); | 2237 __ mov(t0, zero_reg); |
2220 Label done, loop; | 2238 Label done, push, loop; |
2239 __ LoadRoot(t1, Heap::kTheHoleValueRootIndex); | |
2221 __ bind(&loop); | 2240 __ bind(&loop); |
2222 __ Branch(&done, eq, t0, Operand(a2)); | 2241 __ Branch(&done, eq, t0, Operand(a2)); |
2223 __ Lsa(at, a0, t0, kPointerSizeLog2); | 2242 __ Lsa(at, a0, t0, kPointerSizeLog2); |
2224 __ lw(at, FieldMemOperand(at, FixedArray::kHeaderSize)); | 2243 __ lw(at, FieldMemOperand(at, FixedArray::kHeaderSize)); |
2244 __ Branch(&push, ne, t1, Operand(at)); | |
2245 __ LoadRoot(at, Heap::kUndefinedValueRootIndex); | |
2246 __ bind(&push); | |
2225 __ Push(at); | 2247 __ Push(at); |
2226 __ Addu(t0, t0, Operand(1)); | 2248 __ Addu(t0, t0, Operand(1)); |
2227 __ Branch(&loop); | 2249 __ Branch(&loop); |
2228 __ bind(&done); | 2250 __ bind(&done); |
2229 __ Move(a0, t0); | 2251 __ Move(a0, t0); |
2230 } | 2252 } |
2231 | 2253 |
2232 // Dispatch to Call or Construct depending on whether new.target is undefined. | 2254 // Dispatch to Call or Construct depending on whether new.target is undefined. |
2233 { | 2255 { |
2234 Label construct; | 2256 Label construct; |
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2944 __ break_(0xCC); | 2966 __ break_(0xCC); |
2945 } | 2967 } |
2946 } | 2968 } |
2947 | 2969 |
2948 #undef __ | 2970 #undef __ |
2949 | 2971 |
2950 } // namespace internal | 2972 } // namespace internal |
2951 } // namespace v8 | 2973 } // namespace v8 |
2952 | 2974 |
2953 #endif // V8_TARGET_ARCH_MIPS | 2975 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |