| OLD | NEW |
| 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 8312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8323 | 8323 |
| 8324 | 8324 |
| 8325 bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr) { | 8325 bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr) { |
| 8326 if (!expr->target()->shared()->HasBuiltinFunctionId()) return false; | 8326 if (!expr->target()->shared()->HasBuiltinFunctionId()) return false; |
| 8327 BuiltinFunctionId id = expr->target()->shared()->builtin_function_id(); | 8327 BuiltinFunctionId id = expr->target()->shared()->builtin_function_id(); |
| 8328 switch (id) { | 8328 switch (id) { |
| 8329 case kMathExp: | 8329 case kMathExp: |
| 8330 if (!FLAG_fast_math) break; | 8330 if (!FLAG_fast_math) break; |
| 8331 // Fall through if FLAG_fast_math. | 8331 // Fall through if FLAG_fast_math. |
| 8332 case kMathRound: | 8332 case kMathRound: |
| 8333 case kMathFround: |
| 8333 case kMathFloor: | 8334 case kMathFloor: |
| 8334 // If round has seen minus zero, don't inline, since that assumes | |
| 8335 // returned value is an integer, which -0 definitely is not. | |
| 8336 if (expr->ShouldHandleMinusZeroResult()) { | |
| 8337 break; | |
| 8338 } | |
| 8339 case kMathFround: | |
| 8340 case kMathAbs: | 8335 case kMathAbs: |
| 8341 case kMathSqrt: | 8336 case kMathSqrt: |
| 8342 case kMathLog: | 8337 case kMathLog: |
| 8343 case kMathClz32: | 8338 case kMathClz32: |
| 8344 if (expr->arguments()->length() == 1) { | 8339 if (expr->arguments()->length() == 1) { |
| 8345 HValue* argument = Pop(); | 8340 HValue* argument = Pop(); |
| 8346 Drop(2); // Receiver and function. | 8341 Drop(2); // Receiver and function. |
| 8347 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id); | 8342 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id); |
| 8348 ast_context()->ReturnInstruction(op, expr->id()); | 8343 ast_context()->ReturnInstruction(op, expr->id()); |
| 8349 return true; | 8344 return true; |
| 8350 } | 8345 } |
| 8351 break; | 8346 break; |
| 8352 case kMathCeil: | |
| 8353 // If round/floor has seen minus zero, don't inline, since that assumes | |
| 8354 // returned value is an integer, which -0 definitely is not. | |
| 8355 if (expr->ShouldHandleMinusZeroResult()) { | |
| 8356 break; | |
| 8357 } | |
| 8358 if (expr->arguments()->length() == 1) { | |
| 8359 HValue* argument = Pop(); | |
| 8360 Drop(2); // Receiver and function. | |
| 8361 HValue* op = NULL; | |
| 8362 { | |
| 8363 NoObservableSideEffectsScope s(this); | |
| 8364 HValue* neg_arg = | |
| 8365 AddUncasted<HMul>(graph()->GetConstantMinus1(), argument); | |
| 8366 op = AddUncasted<HUnaryMathOperation>(neg_arg, kMathFloor); | |
| 8367 } | |
| 8368 HInstruction* neg_op = | |
| 8369 NewUncasted<HMul>(graph()->GetConstantMinus1(), op); | |
| 8370 ast_context()->ReturnInstruction(neg_op, expr->id()); | |
| 8371 return true; | |
| 8372 } | |
| 8373 break; | |
| 8374 case kMathImul: | 8347 case kMathImul: |
| 8375 if (expr->arguments()->length() == 2) { | 8348 if (expr->arguments()->length() == 2) { |
| 8376 HValue* right = Pop(); | 8349 HValue* right = Pop(); |
| 8377 HValue* left = Pop(); | 8350 HValue* left = Pop(); |
| 8378 Drop(2); // Receiver and function. | 8351 Drop(2); // Receiver and function. |
| 8379 HInstruction* op = | 8352 HInstruction* op = |
| 8380 HMul::NewImul(isolate(), zone(), context(), left, right); | 8353 HMul::NewImul(isolate(), zone(), context(), left, right); |
| 8381 ast_context()->ReturnInstruction(op, expr->id()); | 8354 ast_context()->ReturnInstruction(op, expr->id()); |
| 8382 return true; | 8355 return true; |
| 8383 } | 8356 } |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8457 Drop(2); // Receiver and function. | 8430 Drop(2); // Receiver and function. |
| 8458 HInstruction* result = NewUncasted<HStringCharFromCode>(argument); | 8431 HInstruction* result = NewUncasted<HStringCharFromCode>(argument); |
| 8459 ast_context()->ReturnInstruction(result, expr->id()); | 8432 ast_context()->ReturnInstruction(result, expr->id()); |
| 8460 return true; | 8433 return true; |
| 8461 } | 8434 } |
| 8462 break; | 8435 break; |
| 8463 case kMathExp: | 8436 case kMathExp: |
| 8464 if (!FLAG_fast_math) break; | 8437 if (!FLAG_fast_math) break; |
| 8465 // Fall through if FLAG_fast_math. | 8438 // Fall through if FLAG_fast_math. |
| 8466 case kMathRound: | 8439 case kMathRound: |
| 8440 case kMathFround: |
| 8467 case kMathFloor: | 8441 case kMathFloor: |
| 8468 // If round/floor has seen minus zero, don't inline, since that assumes | |
| 8469 // returned value is an integer, which -0 definitely is not. | |
| 8470 if (expr->ShouldHandleMinusZeroResult()) { | |
| 8471 break; | |
| 8472 } | |
| 8473 case kMathFround: | |
| 8474 case kMathAbs: | 8442 case kMathAbs: |
| 8475 case kMathSqrt: | 8443 case kMathSqrt: |
| 8476 case kMathLog: | 8444 case kMathLog: |
| 8477 case kMathClz32: | 8445 case kMathClz32: |
| 8478 if (argument_count == 2) { | 8446 if (argument_count == 2) { |
| 8479 HValue* argument = Pop(); | 8447 HValue* argument = Pop(); |
| 8480 Drop(2); // Receiver and function. | 8448 Drop(2); // Receiver and function. |
| 8481 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id); | 8449 HInstruction* op = NewUncasted<HUnaryMathOperation>(argument, id); |
| 8482 ast_context()->ReturnInstruction(op, expr->id()); | 8450 ast_context()->ReturnInstruction(op, expr->id()); |
| 8483 return true; | 8451 return true; |
| 8484 } | 8452 } |
| 8485 break; | 8453 break; |
| 8486 case kMathCeil: | |
| 8487 // If round/floor has seen minus zero, don't inline, since that assumes | |
| 8488 // returned value is an integer, which -0 definitely is not. | |
| 8489 if (expr->ShouldHandleMinusZeroResult()) { | |
| 8490 break; | |
| 8491 } | |
| 8492 if (argument_count == 2) { | |
| 8493 HValue* argument = Pop(); | |
| 8494 Drop(2); // Receiver and function. | |
| 8495 HValue* op = NULL; | |
| 8496 { | |
| 8497 NoObservableSideEffectsScope s(this); | |
| 8498 HValue* neg_arg = | |
| 8499 AddUncasted<HMul>(graph()->GetConstantMinus1(), argument); | |
| 8500 op = AddUncasted<HUnaryMathOperation>(neg_arg, kMathFloor); | |
| 8501 } | |
| 8502 HInstruction* neg_op = | |
| 8503 NewUncasted<HMul>(graph()->GetConstantMinus1(), op); | |
| 8504 ast_context()->ReturnInstruction(neg_op, expr->id()); | |
| 8505 return true; | |
| 8506 } | |
| 8507 break; | |
| 8508 case kMathPow: | 8454 case kMathPow: |
| 8509 if (argument_count == 3) { | 8455 if (argument_count == 3) { |
| 8510 HValue* right = Pop(); | 8456 HValue* right = Pop(); |
| 8511 HValue* left = Pop(); | 8457 HValue* left = Pop(); |
| 8512 Drop(2); // Receiver and function. | 8458 Drop(2); // Receiver and function. |
| 8513 HInstruction* result = NULL; | 8459 HInstruction* result = NULL; |
| 8514 // Use sqrt() if exponent is 0.5 or -0.5. | 8460 // Use sqrt() if exponent is 0.5 or -0.5. |
| 8515 if (right->IsConstant() && HConstant::cast(right)->HasDoubleValue()) { | 8461 if (right->IsConstant() && HConstant::cast(right)->HasDoubleValue()) { |
| 8516 double exponent = HConstant::cast(right)->DoubleValue(); | 8462 double exponent = HConstant::cast(right)->DoubleValue(); |
| 8517 if (exponent == 0.5) { | 8463 if (exponent == 0.5) { |
| (...skipping 3715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12233 | 12179 |
| 12234 void HOptimizedGraphBuilder::GenerateMathClz32(CallRuntime* call) { | 12180 void HOptimizedGraphBuilder::GenerateMathClz32(CallRuntime* call) { |
| 12235 DCHECK(call->arguments()->length() == 1); | 12181 DCHECK(call->arguments()->length() == 1); |
| 12236 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 12182 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 12237 HValue* value = Pop(); | 12183 HValue* value = Pop(); |
| 12238 HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathClz32); | 12184 HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathClz32); |
| 12239 return ast_context()->ReturnInstruction(result, call->id()); | 12185 return ast_context()->ReturnInstruction(result, call->id()); |
| 12240 } | 12186 } |
| 12241 | 12187 |
| 12242 | 12188 |
| 12189 void HOptimizedGraphBuilder::GenerateMathFloor(CallRuntime* call) { |
| 12190 DCHECK(call->arguments()->length() == 1); |
| 12191 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 12192 HValue* value = Pop(); |
| 12193 HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathFloor); |
| 12194 return ast_context()->ReturnInstruction(result, call->id()); |
| 12195 } |
| 12196 |
| 12197 |
| 12243 void HOptimizedGraphBuilder::GenerateMathLogRT(CallRuntime* call) { | 12198 void HOptimizedGraphBuilder::GenerateMathLogRT(CallRuntime* call) { |
| 12244 DCHECK(call->arguments()->length() == 1); | 12199 DCHECK(call->arguments()->length() == 1); |
| 12245 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 12200 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 12246 HValue* value = Pop(); | 12201 HValue* value = Pop(); |
| 12247 HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathLog); | 12202 HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathLog); |
| 12248 return ast_context()->ReturnInstruction(result, call->id()); | 12203 return ast_context()->ReturnInstruction(result, call->id()); |
| 12249 } | 12204 } |
| 12250 | 12205 |
| 12251 | 12206 |
| 12252 void HOptimizedGraphBuilder::GenerateMathSqrt(CallRuntime* call) { | 12207 void HOptimizedGraphBuilder::GenerateMathSqrt(CallRuntime* call) { |
| (...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13151 if (ShouldProduceTraceOutput()) { | 13106 if (ShouldProduceTraceOutput()) { |
| 13152 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13107 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13153 } | 13108 } |
| 13154 | 13109 |
| 13155 #ifdef DEBUG | 13110 #ifdef DEBUG |
| 13156 graph_->Verify(false); // No full verify. | 13111 graph_->Verify(false); // No full verify. |
| 13157 #endif | 13112 #endif |
| 13158 } | 13113 } |
| 13159 | 13114 |
| 13160 } } // namespace v8::internal | 13115 } } // namespace v8::internal |
| OLD | NEW |