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); |
+ 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))); |