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

Side by Side Diff: src/ic/ic.cc

Issue 1053143005: Collect type feedback on result of Math.[round|ceil|floor] (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: MIPS port Created 5 years, 7 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/ia32/macro-assembler-ia32.cc ('k') | src/math.js » ('j') | 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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/arguments.h" 9 #include "src/arguments.h"
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 2205 matching lines...) Expand 10 before | Expand all | Expand 10 after
2216 } 2216 }
2217 2217
2218 2218
2219 bool CallIC::DoCustomHandler(Handle<Object> function, 2219 bool CallIC::DoCustomHandler(Handle<Object> function,
2220 const CallICState& callic_state) { 2220 const CallICState& callic_state) {
2221 DCHECK(FLAG_use_ic && function->IsJSFunction()); 2221 DCHECK(FLAG_use_ic && function->IsJSFunction());
2222 2222
2223 // Are we the array function? 2223 // Are we the array function?
2224 Handle<JSFunction> array_function = 2224 Handle<JSFunction> array_function =
2225 Handle<JSFunction>(isolate()->native_context()->array_function()); 2225 Handle<JSFunction>(isolate()->native_context()->array_function());
2226 CallICNexus* nexus = casted_nexus<CallICNexus>();
2226 if (array_function.is_identical_to(Handle<JSFunction>::cast(function))) { 2227 if (array_function.is_identical_to(Handle<JSFunction>::cast(function))) {
2227 // Alter the slot. 2228 // Alter the slot.
2228 CallICNexus* nexus = casted_nexus<CallICNexus>();
2229 nexus->ConfigureMonomorphicArray(); 2229 nexus->ConfigureMonomorphicArray();
2230 2230
2231 // Vector-based ICs have a different calling convention in optimized code 2231 // Vector-based ICs have a different calling convention in optimized code
2232 // than full code so the correct stub has to be chosen. 2232 // than full code so the correct stub has to be chosen.
2233 if (AddressIsOptimizedCode()) { 2233 if (AddressIsOptimizedCode()) {
2234 CallIC_ArrayStub stub(isolate(), callic_state); 2234 CallIC_ArrayStub stub(isolate(), callic_state);
2235 set_target(*stub.GetCode()); 2235 set_target(*stub.GetCode());
2236 } else { 2236 } else {
2237 CallIC_ArrayTrampolineStub stub(isolate(), callic_state); 2237 CallIC_ArrayTrampolineStub stub(isolate(), callic_state);
2238 set_target(*stub.GetCode()); 2238 set_target(*stub.GetCode());
2239 } 2239 }
2240 2240
2241 Handle<String> name; 2241 Handle<String> name;
2242 if (array_function->shared()->name()->IsString()) { 2242 if (array_function->shared()->name()->IsString()) {
2243 name = Handle<String>(String::cast(array_function->shared()->name()), 2243 name = Handle<String>(String::cast(array_function->shared()->name()),
2244 isolate()); 2244 isolate());
2245 } 2245 }
2246 TRACE_IC("CallIC", name); 2246 TRACE_IC("CallIC", name);
2247 OnTypeFeedbackChanged(isolate(), get_host(), nexus->vector(), state(), 2247 OnTypeFeedbackChanged(isolate(), get_host(), nexus->vector(), state(),
2248 MONOMORPHIC); 2248 MONOMORPHIC);
2249 return true; 2249 return true;
2250 } else {
2251 Handle<JSFunction> maybe_builtin(Handle<JSFunction>::cast(function));
2252 if (maybe_builtin->shared()->HasBuiltinFunctionId()) {
2253 BuiltinFunctionId id = maybe_builtin->shared()->builtin_function_id();
2254 switch (id) {
2255 case kMathRound: {
2256 nexus->ConfigureMonomorphicMathFunction(maybe_builtin);
2257 if (AddressIsOptimizedCode()) {
2258 CallIC_RoundStub stub(isolate(), callic_state);
2259 set_target(*stub.GetCode());
2260 } else {
2261 CallIC_RoundTrampolineStub stub(isolate(), callic_state);
2262 set_target(*stub.GetCode());
2263 }
2264 return true;
2265 }
2266 case kMathFloor:
2267 nexus->ConfigureMonomorphicMathFunction(maybe_builtin);
2268 if (AddressIsOptimizedCode()) {
2269 CallIC_FloorStub stub(isolate(), callic_state);
2270 set_target(*stub.GetCode());
2271 } else {
2272 CallIC_FloorTrampolineStub stub(isolate(), callic_state);
2273 set_target(*stub.GetCode());
2274 }
2275 return true;
2276 break;
2277 case kMathCeil:
2278 nexus->ConfigureMonomorphicMathFunction(maybe_builtin);
2279 if (AddressIsOptimizedCode()) {
2280 CallIC_CeilStub stub(isolate(), callic_state);
2281 set_target(*stub.GetCode());
2282 } else {
2283 CallIC_CeilTrampolineStub stub(isolate(), callic_state);
2284 set_target(*stub.GetCode());
2285 }
2286 return true;
2287 break;
2288 default:
2289 break;
2290 }
2291 }
2250 } 2292 }
2251 return false; 2293 return false;
2252 } 2294 }
2253 2295
2254 2296
2255 void CallIC::PatchMegamorphic(Handle<Object> function) { 2297 void CallIC::PatchMegamorphic(Handle<Object> function) {
2256 CallICState callic_state(target()->extra_ic_state()); 2298 CallICState callic_state(target()->extra_ic_state());
2257 2299
2258 // We are going generic. 2300 // We are going generic.
2259 CallICNexus* nexus = casted_nexus<CallICNexus>(); 2301 CallICNexus* nexus = casted_nexus<CallICNexus>();
(...skipping 791 matching lines...) Expand 10 before | Expand all | Expand 10 after
3051 static const Address IC_utilities[] = { 3093 static const Address IC_utilities[] = {
3052 #define ADDR(name) FUNCTION_ADDR(name), 3094 #define ADDR(name) FUNCTION_ADDR(name),
3053 IC_UTIL_LIST(ADDR) NULL 3095 IC_UTIL_LIST(ADDR) NULL
3054 #undef ADDR 3096 #undef ADDR
3055 }; 3097 };
3056 3098
3057 3099
3058 Address IC::AddressFromUtilityId(IC::UtilityId id) { return IC_utilities[id]; } 3100 Address IC::AddressFromUtilityId(IC::UtilityId id) { return IC_utilities[id]; }
3059 } 3101 }
3060 } // namespace v8::internal 3102 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/ia32/macro-assembler-ia32.cc ('k') | src/math.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698