@@ -15338,11 +15338,16 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
1533815338 case Builtin::BI__builtin_fmaxl:
1533915339 case Builtin::BI__builtin_fmaxf16:
1534015340 case Builtin::BI__builtin_fmaxf128: {
15341+ // TODO: Handle sNaN.
1534115342 APFloat RHS(0.);
1534215343 if (!EvaluateFloat(E->getArg(0), Result, Info) ||
1534315344 !EvaluateFloat(E->getArg(1), RHS, Info))
1534415345 return false;
15345- Result = maxnum(Result, RHS);
15346+ // When comparing zeroes, return +0.0 if one of the zeroes is positive.
15347+ if (Result.isZero() && RHS.isZero() && Result.isNegative())
15348+ Result = RHS;
15349+ else if (Result.isNaN() || RHS > Result)
15350+ Result = RHS;
1534615351 return true;
1534715352 }
1534815353
@@ -15351,11 +15356,16 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) {
1535115356 case Builtin::BI__builtin_fminl:
1535215357 case Builtin::BI__builtin_fminf16:
1535315358 case Builtin::BI__builtin_fminf128: {
15359+ // TODO: Handle sNaN.
1535415360 APFloat RHS(0.);
1535515361 if (!EvaluateFloat(E->getArg(0), Result, Info) ||
1535615362 !EvaluateFloat(E->getArg(1), RHS, Info))
1535715363 return false;
15358- Result = minnum(Result, RHS);
15364+ // When comparing zeroes, return -0.0 if one of the zeroes is negative.
15365+ if (Result.isZero() && RHS.isZero() && RHS.isNegative())
15366+ Result = RHS;
15367+ else if (Result.isNaN() || RHS < Result)
15368+ Result = RHS;
1535915369 return true;
1536015370 }
1536115371
0 commit comments