Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index 937f5b086b41029a1e4c70130ae3953cca3d1fe8..5f6e86bb28c0933b618153a726b70562ff0daf2c 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -8330,8 +8330,13 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr) { |
| if (!FLAG_fast_math) break; |
| // Fall through if FLAG_fast_math. |
| case kMathRound: |
| - case kMathFround: |
| case kMathFloor: |
| + // If round has seen minus zero, don't inline, since that assumes |
| + // returned value is an integer, which -0 definitely is not. |
| + if (expr->ShouldHandleMinusZeroResult()) { |
| + break; |
| + } |
| + case kMathFround: |
| case kMathAbs: |
| case kMathSqrt: |
| case kMathLog: |
| @@ -8344,6 +8349,28 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr) { |
| return true; |
| } |
| break; |
| + case kMathCeil: |
| + // If round/floor has seen minus zero, don't inline, since that assumes |
| + // returned value is an integer, which -0 definitely is not. |
| + if (expr->ShouldHandleMinusZeroResult()) { |
| + break; |
| + } |
| + if (expr->arguments()->length() == 1) { |
| + HValue* argument = Pop(); |
| + Drop(2); // Receiver and function. |
| + HValue* op = NULL; |
| + { |
| + NoObservableSideEffectsScope s(this); |
| + HValue* neg_arg = |
| + AddUncasted<HMul>(graph()->GetConstantMinus1(), argument); |
| + op = AddUncasted<HUnaryMathOperation>(neg_arg, kMathFloor); |
| + } |
| + HInstruction* neg_op = |
| + NewUncasted<HMul>(graph()->GetConstantMinus1(), op); |
| + ast_context()->ReturnInstruction(neg_op, expr->id()); |
| + return true; |
| + } |
| + break; |
| case kMathImul: |
| if (expr->arguments()->length() == 2) { |
| HValue* right = Pop(); |
| @@ -8437,8 +8464,13 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( |
| if (!FLAG_fast_math) break; |
| // Fall through if FLAG_fast_math. |
| case kMathRound: |
| - case kMathFround: |
| case kMathFloor: |
| + // If round/floor has seen minus zero, don't inline, since that assumes |
| + // returned value is an integer, which -0 definitely is not. |
| + if (expr->ShouldHandleMinusZeroResult()) { |
| + break; |
| + } |
| + case kMathFround: |
| case kMathAbs: |
| case kMathSqrt: |
| case kMathLog: |
| @@ -8451,6 +8483,28 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( |
| return true; |
| } |
| break; |
| + case kMathCeil: |
| + // If round/floor has seen minus zero, don't inline, since that assumes |
| + // returned value is an integer, which -0 definitely is not. |
| + if (expr->ShouldHandleMinusZeroResult()) { |
| + break; |
| + } |
| + if (argument_count == 2) { |
| + HValue* argument = Pop(); |
| + Drop(2); // Receiver and function. |
| + HValue* op = NULL; |
| + { |
| + NoObservableSideEffectsScope s(this); |
|
mvstanton
2015/05/04 09:41:22
Why does this have to be in a NoObservableSideEffe
danno
2015/05/04 14:31:56
Otherwise there are missing simulates after the fo
|
| + HValue* neg_arg = |
| + AddUncasted<HMul>(graph()->GetConstantMinus1(), argument); |
| + op = AddUncasted<HUnaryMathOperation>(neg_arg, kMathFloor); |
| + } |
| + HInstruction* neg_op = |
| + NewUncasted<HMul>(graph()->GetConstantMinus1(), op); |
| + ast_context()->ReturnInstruction(neg_op, expr->id()); |
| + return true; |
| + } |
| + break; |
| case kMathPow: |
| if (argument_count == 3) { |
| HValue* right = Pop(); |
| @@ -12186,15 +12240,6 @@ void HOptimizedGraphBuilder::GenerateMathClz32(CallRuntime* call) { |
| } |
| -void HOptimizedGraphBuilder::GenerateMathFloor(CallRuntime* call) { |
| - DCHECK(call->arguments()->length() == 1); |
| - CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| - HValue* value = Pop(); |
| - HInstruction* result = NewUncasted<HUnaryMathOperation>(value, kMathFloor); |
| - return ast_context()->ReturnInstruction(result, call->id()); |
| -} |
| - |
| - |
| void HOptimizedGraphBuilder::GenerateMathLogRT(CallRuntime* call) { |
| DCHECK(call->arguments()->length() == 1); |
| CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |