gallivm: Use nextafterf(0.5, 0.0) as rounding constant
authorMatt Turner <mattst88@gmail.com>
Wed, 21 Nov 2018 20:13:19 +0000 (12:13 -0800)
committerMatt Turner <mattst88@gmail.com>
Wed, 28 Nov 2018 19:22:47 +0000 (11:22 -0800)
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 <sroland@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_arit.c

index f348833206bcc3c1ef2637ba70635069b027e4ce..c050bfdb936dbd5b6495f6ae717e6fdaf900b788 100644 (file)
@@ -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;