| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 Isolate* isolate, | 96 Isolate* isolate, |
| 97 CodeStubInterfaceDescriptor* descriptor) { | 97 CodeStubInterfaceDescriptor* descriptor) { |
| 98 static Register registers[] = { rax, rbx, rcx, rdx }; | 98 static Register registers[] = { rax, rbx, rcx, rdx }; |
| 99 descriptor->register_param_count_ = 4; | 99 descriptor->register_param_count_ = 4; |
| 100 descriptor->register_params_ = registers; | 100 descriptor->register_params_ = registers; |
| 101 descriptor->deoptimization_handler_ = | 101 descriptor->deoptimization_handler_ = |
| 102 Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry; | 102 Runtime::FunctionForId(Runtime::kCreateObjectLiteral)->entry; |
| 103 } | 103 } |
| 104 | 104 |
| 105 | 105 |
| 106 void CreateAllocationSiteStub::InitializeInterfaceDescriptor( | |
| 107 Isolate* isolate, | |
| 108 CodeStubInterfaceDescriptor* descriptor) { | |
| 109 static Register registers[] = { rbx, rdx }; | |
| 110 descriptor->register_param_count_ = 2; | |
| 111 descriptor->register_params_ = registers; | |
| 112 descriptor->deoptimization_handler_ = NULL; | |
| 113 } | |
| 114 | |
| 115 | |
| 116 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor( | 106 void KeyedLoadFastElementStub::InitializeInterfaceDescriptor( |
| 117 Isolate* isolate, | 107 Isolate* isolate, |
| 118 CodeStubInterfaceDescriptor* descriptor) { | 108 CodeStubInterfaceDescriptor* descriptor) { |
| 119 static Register registers[] = { rdx, rax }; | 109 static Register registers[] = { rdx, rax }; |
| 120 descriptor->register_param_count_ = 2; | 110 descriptor->register_param_count_ = 2; |
| 121 descriptor->register_params_ = registers; | 111 descriptor->register_params_ = registers; |
| 122 descriptor->deoptimization_handler_ = | 112 descriptor->deoptimization_handler_ = |
| 123 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); | 113 FUNCTION_ADDR(KeyedLoadIC_MissFromStubFailure); |
| 124 } | 114 } |
| 125 | 115 |
| (...skipping 2036 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2162 | 2152 |
| 2163 static void GenerateRecordCallTarget(MacroAssembler* masm) { | 2153 static void GenerateRecordCallTarget(MacroAssembler* masm) { |
| 2164 // Cache the called function in a feedback vector slot. Cache states | 2154 // Cache the called function in a feedback vector slot. Cache states |
| 2165 // are uninitialized, monomorphic (indicated by a JSFunction), and | 2155 // are uninitialized, monomorphic (indicated by a JSFunction), and |
| 2166 // megamorphic. | 2156 // megamorphic. |
| 2167 // rax : number of arguments to the construct function | 2157 // rax : number of arguments to the construct function |
| 2168 // rbx : Feedback vector | 2158 // rbx : Feedback vector |
| 2169 // rdx : slot in feedback vector (Smi) | 2159 // rdx : slot in feedback vector (Smi) |
| 2170 // rdi : the function to call | 2160 // rdi : the function to call |
| 2171 Isolate* isolate = masm->isolate(); | 2161 Isolate* isolate = masm->isolate(); |
| 2172 Label initialize, done, miss, megamorphic, not_array_function, | 2162 Label initialize, done, miss, megamorphic, not_array_function; |
| 2173 done_no_smi_convert; | |
| 2174 | 2163 |
| 2175 // Load the cache state into rcx. | 2164 // Load the cache state into rcx. |
| 2176 __ SmiToInteger32(rdx, rdx); | 2165 __ SmiToInteger32(rdx, rdx); |
| 2177 __ movp(rcx, FieldOperand(rbx, rdx, times_pointer_size, | 2166 __ movp(rcx, FieldOperand(rbx, rdx, times_pointer_size, |
| 2178 FixedArray::kHeaderSize)); | 2167 FixedArray::kHeaderSize)); |
| 2179 | 2168 |
| 2180 // A monomorphic cache hit or an already megamorphic state: invoke the | 2169 // A monomorphic cache hit or an already megamorphic state: invoke the |
| 2181 // function without changing the state. | 2170 // function without changing the state. |
| 2182 __ cmpq(rcx, rdi); | 2171 __ cmpq(rcx, rdi); |
| 2183 __ j(equal, &done); | 2172 __ j(equal, &done); |
| 2184 __ Cmp(rcx, TypeFeedbackInfo::MegamorphicSentinel(isolate)); | 2173 __ Cmp(rcx, TypeFeedbackInfo::MegamorphicSentinel(isolate)); |
| 2185 __ j(equal, &done); | 2174 __ j(equal, &done); |
| 2186 | 2175 |
| 2187 // If we came here, we need to see if we are the array function. | |
| 2188 // If we didn't have a matching function, and we didn't find the megamorph | |
| 2189 // sentinel, then we have in the slot either some other function or an | |
| 2190 // AllocationSite. Do a map check on the object in rcx. | |
| 2191 Handle<Map> allocation_site_map = | |
| 2192 masm->isolate()->factory()->allocation_site_map(); | |
| 2193 __ Cmp(FieldOperand(rcx, 0), allocation_site_map); | |
| 2194 __ j(not_equal, &miss); | |
| 2195 | |
| 2196 // Make sure the function is the Array() function | |
| 2197 __ LoadArrayFunction(rcx); | |
| 2198 __ cmpq(rdi, rcx); | |
| 2199 __ j(not_equal, &megamorphic); | |
| 2200 __ jmp(&done); | |
| 2201 | |
| 2202 __ bind(&miss); | 2176 __ bind(&miss); |
| 2203 | 2177 |
| 2204 // A monomorphic miss (i.e, here the cache is not uninitialized) goes | 2178 // A monomorphic miss (i.e, here the cache is not uninitialized) goes |
| 2205 // megamorphic. | 2179 // megamorphic. |
| 2206 __ Cmp(rcx, TypeFeedbackInfo::UninitializedSentinel(isolate)); | 2180 __ Cmp(rcx, TypeFeedbackInfo::UninitializedSentinel(isolate)); |
| 2207 __ j(equal, &initialize); | 2181 __ j(equal, &initialize); |
| 2208 // MegamorphicSentinel is an immortal immovable object (undefined) so no | 2182 // MegamorphicSentinel is an immortal immovable object (undefined) so no |
| 2209 // write-barrier is needed. | 2183 // write-barrier is needed. |
| 2210 __ bind(&megamorphic); | 2184 __ bind(&megamorphic); |
| 2211 __ Move(FieldOperand(rbx, rdx, times_pointer_size, FixedArray::kHeaderSize), | 2185 __ Move(FieldOperand(rbx, rdx, times_pointer_size, FixedArray::kHeaderSize), |
| 2212 TypeFeedbackInfo::MegamorphicSentinel(isolate)); | 2186 TypeFeedbackInfo::MegamorphicSentinel(isolate)); |
| 2213 __ jmp(&done); | 2187 __ jmp(&done); |
| 2214 | 2188 |
| 2215 // An uninitialized cache is patched with the function or sentinel to | 2189 // An uninitialized cache is patched with the function or sentinel to |
| 2216 // indicate the ElementsKind if function is the Array constructor. | 2190 // indicate the ElementsKind if function is the Array constructor. |
| 2217 __ bind(&initialize); | 2191 __ bind(&initialize); |
| 2218 // Make sure the function is the Array() function | |
| 2219 __ LoadArrayFunction(rcx); | |
| 2220 __ cmpq(rdi, rcx); | |
| 2221 __ j(not_equal, ¬_array_function); | |
| 2222 | |
| 2223 // The target function is the Array constructor, | |
| 2224 // Create an AllocationSite if we don't already have it, store it in the slot. | |
| 2225 { | |
| 2226 FrameScope scope(masm, StackFrame::INTERNAL); | |
| 2227 | |
| 2228 // Arguments register must be smi-tagged to call out. | |
| 2229 __ Integer32ToSmi(rax, rax); | |
| 2230 __ push(rax); | |
| 2231 __ push(rdi); | |
| 2232 __ Integer32ToSmi(rdx, rdx); | |
| 2233 __ push(rdx); | |
| 2234 __ push(rbx); | |
| 2235 | |
| 2236 CreateAllocationSiteStub create_stub; | |
| 2237 __ CallStub(&create_stub); | |
| 2238 | |
| 2239 __ pop(rbx); | |
| 2240 __ pop(rdx); | |
| 2241 __ pop(rdi); | |
| 2242 __ pop(rax); | |
| 2243 __ SmiToInteger32(rax, rax); | |
| 2244 } | |
| 2245 __ jmp(&done_no_smi_convert); | |
| 2246 | |
| 2247 __ bind(¬_array_function); | |
| 2248 __ movp(FieldOperand(rbx, rdx, times_pointer_size, FixedArray::kHeaderSize), | 2192 __ movp(FieldOperand(rbx, rdx, times_pointer_size, FixedArray::kHeaderSize), |
| 2249 rdi); | 2193 rdi); |
| 2250 | 2194 |
| 2251 // We won't need rdx or rbx anymore, just save rdi | 2195 // We won't need rdx or rbx anymore, just save rdi |
| 2252 __ push(rdi); | 2196 __ push(rdi); |
| 2253 __ push(rbx); | 2197 __ push(rbx); |
| 2254 __ push(rdx); | 2198 __ push(rdx); |
| 2255 __ RecordWriteArray(rbx, rdi, rdx, kDontSaveFPRegs, | 2199 __ RecordWriteArray(rbx, rdi, rdx, kDontSaveFPRegs, |
| 2256 EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); | 2200 EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); |
| 2257 __ pop(rdx); | 2201 __ pop(rdx); |
| 2258 __ pop(rbx); | 2202 __ pop(rbx); |
| 2259 __ pop(rdi); | 2203 __ pop(rdi); |
| 2260 | 2204 |
| 2261 __ bind(&done); | 2205 __ bind(&done); |
| 2262 __ Integer32ToSmi(rdx, rdx); | 2206 __ Integer32ToSmi(rdx, rdx); |
| 2263 | |
| 2264 __ bind(&done_no_smi_convert); | |
| 2265 } | 2207 } |
| 2266 | 2208 |
| 2267 | 2209 |
| 2268 void CallFunctionStub::Generate(MacroAssembler* masm) { | 2210 void CallFunctionStub::Generate(MacroAssembler* masm) { |
| 2269 // rbx : feedback vector | 2211 // rbx : feedback vector |
| 2270 // rdx : (only if rbx is not undefined) slot in feedback vector (Smi) | 2212 // rdx : (only if rbx is not undefined) slot in feedback vector (Smi) |
| 2271 // rdi : the function to call | 2213 // rdi : the function to call |
| 2272 Isolate* isolate = masm->isolate(); | 2214 Isolate* isolate = masm->isolate(); |
| 2273 Label slow, non_function, wrap, cont; | 2215 Label slow, non_function, wrap, cont; |
| 2274 StackArgumentsAccessor args(rsp, argc_); | 2216 StackArgumentsAccessor args(rsp, argc_); |
| 2275 | 2217 |
| 2276 if (NeedsChecks()) { | 2218 if (NeedsChecks()) { |
| 2277 // Check that the function really is a JavaScript function. | 2219 // Check that the function really is a JavaScript function. |
| 2278 __ JumpIfSmi(rdi, &non_function); | 2220 __ JumpIfSmi(rdi, &non_function); |
| 2279 | 2221 |
| 2280 // Goto slow case if we do not have a function. | 2222 // Goto slow case if we do not have a function. |
| 2281 __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); | 2223 __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); |
| 2282 __ j(not_equal, &slow); | 2224 __ j(not_equal, &slow); |
| 2283 | 2225 |
| 2284 if (RecordCallTarget()) { | 2226 if (RecordCallTarget()) { |
| 2285 GenerateRecordCallTarget(masm); | 2227 GenerateRecordCallTarget(masm); |
| 2228 // Type information was updated. Because we may call Array, which |
| 2229 // expects either undefined or an AllocationSite in ebx we need |
| 2230 // to set ebx to undefined. |
| 2231 __ Move(rbx, handle(isolate->heap()->undefined_value())); |
| 2286 } | 2232 } |
| 2287 } | 2233 } |
| 2288 | 2234 |
| 2289 // Fast-case: Just invoke the function. | 2235 // Fast-case: Just invoke the function. |
| 2290 ParameterCount actual(argc_); | 2236 ParameterCount actual(argc_); |
| 2291 | 2237 |
| 2292 if (CallAsMethod()) { | 2238 if (CallAsMethod()) { |
| 2293 if (NeedsChecks()) { | 2239 if (NeedsChecks()) { |
| 2294 // Do not transform the receiver for strict mode functions. | 2240 // Do not transform the receiver for strict mode functions. |
| 2295 __ movp(rcx, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); | 2241 __ movp(rcx, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2384 Label slow, non_function_call; | 2330 Label slow, non_function_call; |
| 2385 | 2331 |
| 2386 // Check that function is not a smi. | 2332 // Check that function is not a smi. |
| 2387 __ JumpIfSmi(rdi, &non_function_call); | 2333 __ JumpIfSmi(rdi, &non_function_call); |
| 2388 // Check that function is a JSFunction. | 2334 // Check that function is a JSFunction. |
| 2389 __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); | 2335 __ CmpObjectType(rdi, JS_FUNCTION_TYPE, rcx); |
| 2390 __ j(not_equal, &slow); | 2336 __ j(not_equal, &slow); |
| 2391 | 2337 |
| 2392 if (RecordCallTarget()) { | 2338 if (RecordCallTarget()) { |
| 2393 GenerateRecordCallTarget(masm); | 2339 GenerateRecordCallTarget(masm); |
| 2340 // Put the AllocationSite from the feedback vector into ebx. |
| 2341 // By adding kPointerSize we encode that we know the AllocationSite |
| 2342 // entry is at the feedback vector slot given by rdx + 1. |
| 2343 __ SmiToInteger32(rdx, rdx); |
| 2344 __ movp(rbx, FieldOperand(rbx, rdx, times_pointer_size, |
| 2345 FixedArray::kHeaderSize + kPointerSize)); |
| 2346 __ AssertUndefinedOrAllocationSite(rbx); |
| 2394 } | 2347 } |
| 2395 | 2348 |
| 2396 // Jump to the function-specific construct stub. | 2349 // Jump to the function-specific construct stub. |
| 2397 Register jmp_reg = rcx; | 2350 Register jmp_reg = rcx; |
| 2398 __ movp(jmp_reg, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); | 2351 __ movp(jmp_reg, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); |
| 2399 __ movp(jmp_reg, FieldOperand(jmp_reg, | 2352 __ movp(jmp_reg, FieldOperand(jmp_reg, |
| 2400 SharedFunctionInfo::kConstructStubOffset)); | 2353 SharedFunctionInfo::kConstructStubOffset)); |
| 2401 __ lea(jmp_reg, FieldOperand(jmp_reg, Code::kHeaderSize)); | 2354 __ lea(jmp_reg, FieldOperand(jmp_reg, Code::kHeaderSize)); |
| 2402 __ jmp(jmp_reg); | 2355 __ jmp(jmp_reg); |
| 2403 | 2356 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 2425 return false; | 2378 return false; |
| 2426 } | 2379 } |
| 2427 | 2380 |
| 2428 | 2381 |
| 2429 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { | 2382 void CodeStub::GenerateStubsAheadOfTime(Isolate* isolate) { |
| 2430 CEntryStub::GenerateAheadOfTime(isolate); | 2383 CEntryStub::GenerateAheadOfTime(isolate); |
| 2431 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); | 2384 StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(isolate); |
| 2432 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); | 2385 StubFailureTrampolineStub::GenerateAheadOfTime(isolate); |
| 2433 // It is important that the store buffer overflow stubs are generated first. | 2386 // It is important that the store buffer overflow stubs are generated first. |
| 2434 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 2387 ArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); |
| 2435 CreateAllocationSiteStub::GenerateAheadOfTime(isolate); | |
| 2436 BinaryOpICStub::GenerateAheadOfTime(isolate); | 2388 BinaryOpICStub::GenerateAheadOfTime(isolate); |
| 2437 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); | 2389 BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(isolate); |
| 2438 } | 2390 } |
| 2439 | 2391 |
| 2440 | 2392 |
| 2441 void CodeStub::GenerateFPStubs(Isolate* isolate) { | 2393 void CodeStub::GenerateFPStubs(Isolate* isolate) { |
| 2442 } | 2394 } |
| 2443 | 2395 |
| 2444 | 2396 |
| 2445 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) { | 2397 void CEntryStub::GenerateAheadOfTime(Isolate* isolate) { |
| (...skipping 2550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4996 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); | 4948 CreateArrayDispatch<ArrayNArgumentsConstructorStub>(masm, mode); |
| 4997 } else { | 4949 } else { |
| 4998 UNREACHABLE(); | 4950 UNREACHABLE(); |
| 4999 } | 4951 } |
| 5000 } | 4952 } |
| 5001 | 4953 |
| 5002 | 4954 |
| 5003 void ArrayConstructorStub::Generate(MacroAssembler* masm) { | 4955 void ArrayConstructorStub::Generate(MacroAssembler* masm) { |
| 5004 // ----------- S t a t e ------------- | 4956 // ----------- S t a t e ------------- |
| 5005 // -- rax : argc | 4957 // -- rax : argc |
| 5006 // -- rbx : feedback vector (fixed array or undefined) | 4958 // -- rbx : AllocationSite or undefined |
| 5007 // -- rdx : slot index (if ebx is fixed array) | |
| 5008 // -- rdi : constructor | 4959 // -- rdi : constructor |
| 5009 // -- rsp[0] : return address | 4960 // -- rsp[0] : return address |
| 5010 // -- rsp[8] : last argument | 4961 // -- rsp[8] : last argument |
| 5011 // ----------------------------------- | 4962 // ----------------------------------- |
| 5012 Handle<Object> undefined_sentinel( | 4963 Handle<Object> undefined_sentinel( |
| 5013 masm->isolate()->heap()->undefined_value(), | 4964 masm->isolate()->heap()->undefined_value(), |
| 5014 masm->isolate()); | 4965 masm->isolate()); |
| 5015 | 4966 |
| 5016 if (FLAG_debug_code) { | 4967 if (FLAG_debug_code) { |
| 5017 // The array construct code is only set for the global and natives | 4968 // The array construct code is only set for the global and natives |
| 5018 // builtin Array functions which always have maps. | 4969 // builtin Array functions which always have maps. |
| 5019 | 4970 |
| 5020 // Initial map for the builtin Array function should be a map. | 4971 // Initial map for the builtin Array function should be a map. |
| 5021 __ movp(rcx, FieldOperand(rdi, JSFunction::kPrototypeOrInitialMapOffset)); | 4972 __ movp(rcx, FieldOperand(rdi, JSFunction::kPrototypeOrInitialMapOffset)); |
| 5022 // Will both indicate a NULL and a Smi. | 4973 // Will both indicate a NULL and a Smi. |
| 5023 STATIC_ASSERT(kSmiTag == 0); | 4974 STATIC_ASSERT(kSmiTag == 0); |
| 5024 Condition not_smi = NegateCondition(masm->CheckSmi(rcx)); | 4975 Condition not_smi = NegateCondition(masm->CheckSmi(rcx)); |
| 5025 __ Check(not_smi, kUnexpectedInitialMapForArrayFunction); | 4976 __ Check(not_smi, kUnexpectedInitialMapForArrayFunction); |
| 5026 __ CmpObjectType(rcx, MAP_TYPE, rcx); | 4977 __ CmpObjectType(rcx, MAP_TYPE, rcx); |
| 5027 __ Check(equal, kUnexpectedInitialMapForArrayFunction); | 4978 __ Check(equal, kUnexpectedInitialMapForArrayFunction); |
| 5028 | 4979 |
| 5029 // We should either have undefined in rbx or a valid fixed array. | 4980 // We should either have undefined in rbx or a valid AllocationSite |
| 5030 Label okay_here; | 4981 __ AssertUndefinedOrAllocationSite(rbx); |
| 5031 Handle<Map> fixed_array_map = masm->isolate()->factory()->fixed_array_map(); | |
| 5032 __ Cmp(rbx, undefined_sentinel); | |
| 5033 __ j(equal, &okay_here); | |
| 5034 __ Cmp(FieldOperand(rbx, 0), fixed_array_map); | |
| 5035 __ Assert(equal, kExpectedFixedArrayInRegisterRbx); | |
| 5036 | |
| 5037 // rdx should be a smi if we don't have undefined in rbx. | |
| 5038 __ AssertSmi(rdx); | |
| 5039 | |
| 5040 __ bind(&okay_here); | |
| 5041 } | 4982 } |
| 5042 | 4983 |
| 5043 Label no_info; | 4984 Label no_info; |
| 5044 // If the feedback slot is undefined, or contains anything other than an | 4985 // If the feedback slot is undefined, or contains anything other than an |
| 5045 // AllocationSite, call an array constructor that doesn't use AllocationSites. | 4986 // AllocationSite, call an array constructor that doesn't use AllocationSites. |
| 5046 __ Cmp(rbx, undefined_sentinel); | 4987 __ Cmp(rbx, undefined_sentinel); |
| 5047 __ j(equal, &no_info); | 4988 __ j(equal, &no_info); |
| 5048 __ SmiToInteger32(rdx, rdx); | |
| 5049 __ movp(rbx, FieldOperand(rbx, rdx, times_pointer_size, | |
| 5050 FixedArray::kHeaderSize)); | |
| 5051 __ Integer32ToSmi(rdx, rdx); | |
| 5052 __ Cmp(FieldOperand(rbx, 0), | |
| 5053 masm->isolate()->factory()->allocation_site_map()); | |
| 5054 __ j(not_equal, &no_info); | |
| 5055 | 4989 |
| 5056 // Only look at the lower 16 bits of the transition info. | 4990 // Only look at the lower 16 bits of the transition info. |
| 5057 __ movp(rdx, FieldOperand(rbx, AllocationSite::kTransitionInfoOffset)); | 4991 __ movp(rdx, FieldOperand(rbx, AllocationSite::kTransitionInfoOffset)); |
| 5058 __ SmiToInteger32(rdx, rdx); | 4992 __ SmiToInteger32(rdx, rdx); |
| 5059 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); | 4993 STATIC_ASSERT(AllocationSite::ElementsKindBits::kShift == 0); |
| 5060 __ and_(rdx, Immediate(AllocationSite::ElementsKindBits::kMask)); | 4994 __ and_(rdx, Immediate(AllocationSite::ElementsKindBits::kMask)); |
| 5061 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); | 4995 GenerateDispatchToArrayStub(masm, DONT_OVERRIDE); |
| 5062 | 4996 |
| 5063 __ bind(&no_info); | 4997 __ bind(&no_info); |
| 5064 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); | 4998 GenerateDispatchToArrayStub(masm, DISABLE_ALLOCATION_SITES); |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5327 return_value_operand, | 5261 return_value_operand, |
| 5328 NULL); | 5262 NULL); |
| 5329 } | 5263 } |
| 5330 | 5264 |
| 5331 | 5265 |
| 5332 #undef __ | 5266 #undef __ |
| 5333 | 5267 |
| 5334 } } // namespace v8::internal | 5268 } } // namespace v8::internal |
| 5335 | 5269 |
| 5336 #endif // V8_TARGET_ARCH_X64 | 5270 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |