From: Matt Turner Date: Wed, 21 Nov 2018 20:13:19 +0000 (-0800) Subject: gallivm: Use nextafterf(0.5, 0.0) as rounding constant X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2d48d5116bfe589804e60bbb8fcb261b7b208949;p=mesa.git gallivm: Use nextafterf(0.5, 0.0) as rounding constant The common truncf(x + 0.5) fails for the floating-point value just less than 0.5 (nextafterf(0.5, 0.0)). nextafterf(0.5, 0.0) + 0.5, after rounding is 1.0, thus truncf does not produce the desired value. The solution is to add nextafterf(0.5, 0.0) instead of 0.5 before truncating. This works for all values. Reviewed-by: Roland Scheidegger --- diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c index f348833206b..c050bfdb936 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c @@ -2477,7 +2477,7 @@ lp_build_iround(struct lp_build_context *bld, else { LLVMValueRef half; - half = lp_build_const_vec(bld->gallivm, type, 0.5); + half = lp_build_const_vec(bld->gallivm, type, nextafterf(0.5, 0.0)); if (type.sign) { LLVMTypeRef vec_type = bld->vec_type;