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

Side by Side Diff: src/hydrogen.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: Tweaks 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
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/hydrogen.h" 5 #include "src/hydrogen.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/v8.h" 9 #include "src/v8.h"
10 10
(...skipping 8199 matching lines...) Expand 10 before | Expand all | Expand 10 after
8210 8210
8211 8211
8212 bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr) { 8212 bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr) {
8213 if (!expr->target()->shared()->HasBuiltinFunctionId()) return false; 8213 if (!expr->target()->shared()->HasBuiltinFunctionId()) return false;
8214 BuiltinFunctionId id = expr->target()->shared()->builtin_function_id(); 8214 BuiltinFunctionId id = expr->target()->shared()->builtin_function_id();
8215 switch (id) { 8215 switch (id) {
8216 case kMathExp: 8216 case kMathExp:
8217 if (!FLAG_fast_math) break; 8217 if (!FLAG_fast_math) break;
8218 // Fall through if FLAG_fast_math. 8218 // Fall through if FLAG_fast_math.
8219 case kMathRound: 8219 case kMathRound:
8220 case kMathFloor:
8221 // If round has seen minus zero, don't inline, since that assumes
8222 // returned value is an integer, which -0 definitely is not.
8223 if (expr->ShouldHandleMinusZeroResult()) {
8224 break;
8225 }
8220 case kMathFround: 8226 case kMathFround:
8221 case kMathFloor:
8222 case kMathAbs: 8227 case kMathAbs:
8223 case kMathSqrt: 8228 case kMathSqrt:
8224 case kMathLog: 8229 case kMathLog:
8225 case kMathClz32: 8230 case kMathClz32:
8226 if (expr->arguments()->length() == 1) { 8231 if (expr->arguments()->length() == 1) {
8227 HValue* argument = Pop(); 8232 HValue* argument = Pop();
8228 Drop(2); // Receiver and function. 8233 Drop(2); // Receiver and function.
8229 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id); 8234 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id);
8230 ast_context()->ReturnInstruction(op, expr->id()); 8235 ast_context()->ReturnInstruction(op, expr->id());
8231 return true; 8236 return true;
8232 } 8237 }
8233 break; 8238 break;
8239 case kMathCeil:
8240 // If round/floor has seen minus zero, don't inline, since that assumes
8241 // returned value is an integer, which -0 definitely is not.
8242 if (expr->ShouldHandleMinusZeroResult()) {
8243 break;
8244 }
8245 if (expr->arguments()->length() == 1) {
8246 HValue* argument = Pop();
8247 Drop(2); // Receiver and function.
8248 HValue* neg_arg =
8249 AddUncasted<HMul>(graph()->GetConstantMinus1(), argument);
8250 HValue* op = AddUncasted<HUnaryMathOperation>(neg_arg, kMathFloor);
8251 HInstruction* neg_op =
8252 NewUncasted<HMul>(graph()->GetConstantMinus1(), op);
8253 ast_context()->ReturnInstruction(neg_op, expr->id());
8254 return true;
8255 }
8256 break;
8234 case kMathImul: 8257 case kMathImul:
8235 if (expr->arguments()->length() == 2) { 8258 if (expr->arguments()->length() == 2) {
8236 HValue* right = Pop(); 8259 HValue* right = Pop();
8237 HValue* left = Pop(); 8260 HValue* left = Pop();
8238 Drop(2); // Receiver and function. 8261 Drop(2); // Receiver and function.
8239 HInstruction* op = 8262 HInstruction* op =
8240 HMul::NewImul(isolate(), zone(), context(), left, right); 8263 HMul::NewImul(isolate(), zone(), context(), left, right);
8241 ast_context()->ReturnInstruction(op, expr->id()); 8264 ast_context()->ReturnInstruction(op, expr->id());
8242 return true; 8265 return true;
8243 } 8266 }
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
8317 Drop(2); // Receiver and function. 8340 Drop(2); // Receiver and function.
8318 HInstruction* result = NewUncasted<HStringCharFromCode>(argument); 8341 HInstruction* result = NewUncasted<HStringCharFromCode>(argument);
8319 ast_context()->ReturnInstruction(result, expr->id()); 8342 ast_context()->ReturnInstruction(result, expr->id());
8320 return true; 8343 return true;
8321 } 8344 }
8322 break; 8345 break;
8323 case kMathExp: 8346 case kMathExp:
8324 if (!FLAG_fast_math) break; 8347 if (!FLAG_fast_math) break;
8325 // Fall through if FLAG_fast_math. 8348 // Fall through if FLAG_fast_math.
8326 case kMathRound: 8349 case kMathRound:
8350 case kMathFloor:
8351 // If round/floor has seen minus zero, don't inline, since that assumes
8352 // returned value is an integer, which -0 definitely is not.
8353 if (expr->ShouldHandleMinusZeroResult()) {
8354 break;
8355 }
8327 case kMathFround: 8356 case kMathFround:
8328 case kMathFloor:
8329 case kMathAbs: 8357 case kMathAbs:
8330 case kMathSqrt: 8358 case kMathSqrt:
8331 case kMathLog: 8359 case kMathLog:
8332 case kMathClz32: 8360 case kMathClz32:
8333 if (argument_count == 2) { 8361 if (argument_count == 2) {
8334 HValue* argument = Pop(); 8362 HValue* argument = Pop();
8335 Drop(2); // Receiver and function. 8363 Drop(2); // Receiver and function.
8336 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id); 8364 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id);
8337 ast_context()->ReturnInstruction(op, expr->id()); 8365 ast_context()->ReturnInstruction(op, expr->id());
8338 return true; 8366 return true;
8339 } 8367 }
8340 break; 8368 break;
8369 case kMathCeil:
8370 // If round/floor has seen minus zero, don't inline, since that assumes
8371 // returned value is an integer, which -0 definitely is not.
8372 if (expr->ShouldHandleMinusZeroResult()) {
8373 break;
8374 }
8375 if (argument_count == 2) {
8376 HValue* argument = Pop();
8377 Drop(2); // Receiver and function.
8378 HValue* neg_arg =
8379 AddUncasted<HMul>(graph()->GetConstantMinus1(), argument);
8380 HValue* op = AddUncasted<HUnaryMathOperation>(neg_arg, kMathFloor);
8381 HInstruction* neg_op =
8382 NewUncasted<HMul>(graph()->GetConstantMinus1(), op);
8383 ast_context()->ReturnInstruction(neg_op, expr->id());
8384 return true;
8385 }
8386 break;
8341 case kMathPow: 8387 case kMathPow:
8342 if (argument_count == 3) { 8388 if (argument_count == 3) {
8343 HValue* right = Pop(); 8389 HValue* right = Pop();
8344 HValue* left = Pop(); 8390 HValue* left = Pop();
8345 Drop(2); // Receiver and function. 8391 Drop(2); // Receiver and function.
8346 HInstruction* result = NULL; 8392 HInstruction* result = NULL;
8347 // Use sqrt() if exponent is 0.5 or -0.5. 8393 // Use sqrt() if exponent is 0.5 or -0.5.
8348 if (right->IsConstant() && HConstant::cast(right)->HasDoubleValue()) { 8394 if (right->IsConstant() && HConstant::cast(right)->HasDoubleValue()) {
8349 double exponent = HConstant::cast(right)->DoubleValue(); 8395 double exponent = HConstant::cast(right)->DoubleValue();
8350 if (exponent == 0.5) { 8396 if (exponent == 0.5) {
(...skipping 3716 matching lines...) Expand 10 before | Expand all | Expand 10 after
12067 12113
12068 void HOptimizedGraphBuilder::GenerateMathClz32(CallRuntime* call) { 12114 void HOptimizedGraphBuilder::GenerateMathClz32(CallRuntime* call) {
12069 DCHECK(call->arguments()->length() == 1); 12115 DCHECK(call->arguments()->length() == 1);
12070 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); 12116 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
12071 HValue* value = Pop(); 12117 HValue* value = Pop();
12072 HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathClz32); 12118 HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathClz32);
12073 return ast_context()->ReturnInstruction(result, call->id()); 12119 return ast_context()->ReturnInstruction(result, call->id());
12074 } 12120 }
12075 12121
12076 12122
12077 void HOptimizedGraphBuilder::GenerateMathFloor(CallRuntime* call) {
12078 DCHECK(call->arguments()->length() == 1);
12079 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
12080 HValue* value = Pop();
12081 HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathFloor);
12082 return ast_context()->ReturnInstruction(result, call->id());
12083 }
12084
12085
12086 void HOptimizedGraphBuilder::GenerateMathLogRT(CallRuntime* call) { 12123 void HOptimizedGraphBuilder::GenerateMathLogRT(CallRuntime* call) {
12087 DCHECK(call->arguments()->length() == 1); 12124 DCHECK(call->arguments()->length() == 1);
12088 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); 12125 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
12089 HValue* value = Pop(); 12126 HValue* value = Pop();
12090 HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathLog); 12127 HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathLog);
12091 return ast_context()->ReturnInstruction(result, call->id()); 12128 return ast_context()->ReturnInstruction(result, call->id());
12092 } 12129 }
12093 12130
12094 12131
12095 void HOptimizedGraphBuilder::GenerateMathSqrt(CallRuntime* call) { 12132 void HOptimizedGraphBuilder::GenerateMathSqrt(CallRuntime* call) {
(...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after
12994 if (ShouldProduceTraceOutput()) { 13031 if (ShouldProduceTraceOutput()) {
12995 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13032 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
12996 } 13033 }
12997 13034
12998 #ifdef DEBUG 13035 #ifdef DEBUG
12999 graph_->Verify(false); // No full verify. 13036 graph_->Verify(false); // No full verify.
13000 #endif 13037 #endif
13001 } 13038 }
13002 13039
13003 } } // namespace v8::internal 13040 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | src/ia32/code-stubs-ia32.cc » ('j') | src/ia32/code-stubs-ia32.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698