[libclc] 3a7051d - libclc: Fix FP_ILOGBNAN definition

Tom Stellard via cfe-commits cfe-commits at lists.llvm.org
Mon Aug 17 13:47:37 PDT 2020


Author: Boris Brezillon
Date: 2020-08-17T13:45:43-07:00
New Revision: 3a7051d9c28e3dd6da5048d91b74fad830728e93

URL: https://github.com/llvm/llvm-project/commit/3a7051d9c28e3dd6da5048d91b74fad830728e93
DIFF: https://github.com/llvm/llvm-project/commit/3a7051d9c28e3dd6da5048d91b74fad830728e93.diff

LOG: libclc: Fix FP_ILOGBNAN definition

Fix FP_ILOGBNAN definition to match the opencl-c-base.h one and
guarantee that FP_ILOGBNAN and FP_ILOGB0 are different. Doing that
implies fixing ilogb() implementation to return the right value.

Signed-off-by: Boris Brezillon <boris.brezillon at collabora.com>

Reviewed By: jvesely

Differential Revision: https://reviews.llvm.org/D83473

Added: 
    

Modified: 
    libclc/generic/include/clc/float/definitions.h
    libclc/generic/lib/math/ilogb.cl

Removed: 
    


################################################################################
diff  --git a/libclc/generic/include/clc/float/definitions.h b/libclc/generic/include/clc/float/definitions.h
index 43335a787403..62501230c92d 100644
--- a/libclc/generic/include/clc/float/definitions.h
+++ b/libclc/generic/include/clc/float/definitions.h
@@ -15,7 +15,7 @@
 #define FLT_EPSILON     0x1.0p-23f
 
 #define FP_ILOGB0 (-2147483647 - 1)
-#define FP_ILOGBNAN (-2147483647 - 1)
+#define FP_ILOGBNAN 2147483647
 
 #define M_E_F           0x1.5bf0a8p+1f
 #define M_LOG2E_F       0x1.715476p+0f

diff  --git a/libclc/generic/lib/math/ilogb.cl b/libclc/generic/lib/math/ilogb.cl
index 7ab7899e0c59..050239c9c1ff 100644
--- a/libclc/generic/lib/math/ilogb.cl
+++ b/libclc/generic/lib/math/ilogb.cl
@@ -31,7 +31,15 @@ _CLC_OVERLOAD _CLC_DEF int ilogb(float x) {
     int rs = -118 - (int) clz(ux & MANTBITS_SP32);
     int r = (int) (ax >> EXPSHIFTBITS_SP32) - EXPBIAS_SP32;
     r = ax < 0x00800000U ? rs : r;
-    r = ax > EXPBITS_SP32 | ax == 0 ? 0x80000000 : r;
+    r = ax == 0 ? FP_ILOGB0 : r;
+
+    // We could merge those 2 tests and have:
+    //
+    //    r = ax >= EXPBITS_SP32 ? 0x7fffffff : r
+    //
+    // since FP_ILOGBNAN is set to INT_MAX, but it's clearer this way and
+    // FP_ILOGBNAN can change without requiring changes to ilogb() code.
+    r = ax > EXPBITS_SP32 ? FP_ILOGBNAN : r;
     r = ax == EXPBITS_SP32 ? 0x7fffffff : r;
     return r;
 }
@@ -47,7 +55,15 @@ _CLC_OVERLOAD _CLC_DEF int ilogb(double x) {
     int r = (int) (ax >> EXPSHIFTBITS_DP64) - EXPBIAS_DP64;
     int rs = -1011 - (int) clz(ax & MANTBITS_DP64);
     r = ax < 0x0010000000000000UL ? rs : r;
-    r = ax > 0x7ff0000000000000UL | ax == 0UL ? 0x80000000 : r;
+    r = ax == 0UL ? FP_ILOGB0 : r;
+
+    // We could merge those 2 tests and have:
+    //
+    //    r = ax >= 0x7ff0000000000000UL ? 0x7fffffff : r
+    //
+    // since FP_ILOGBNAN is set to INT_MAX, but it's clearer this way and
+    // FP_ILOGBNAN can change without requiring changes to ilogb() code.
+    r = ax > 0x7ff0000000000000UL ? FP_ILOGBNAN : r;
     r = ax == 0x7ff0000000000000UL ? 0x7fffffff : r;
     return r;
 }


        


More information about the cfe-commits mailing list