Author: Matt Arsenault
Date: 2026-03-12T06:50:02Z
New Revision: 5365c57e14ca7dd109814fe684b31dec19364f98

URL: 
https://github.com/llvm/llvm-project/commit/5365c57e14ca7dd109814fe684b31dec19364f98
DIFF: 
https://github.com/llvm/llvm-project/commit/5365c57e14ca7dd109814fe684b31dec19364f98.diff

LOG: libclc: Update ilogb implementation (#185877)

This was originally ported from rocm device libs in
d6d0454231ac489c50465d608ddf3f5d900e1535. Update for
more recent changes that were made there. This avoids
bithacking and improves value tracking. This also allows
using a common code path for all types.

Added: 
    

Modified: 
    libclc/clc/lib/generic/math/clc_hypot.cl
    libclc/clc/lib/generic/math/clc_ilogb.cl
    libclc/clc/lib/generic/math/clc_ilogb.inc

Removed: 
    


################################################################################
diff  --git a/libclc/clc/lib/generic/math/clc_hypot.cl 
b/libclc/clc/lib/generic/math/clc_hypot.cl
index 7b5a5a7027da0..bac8339ee2822 100644
--- a/libclc/clc/lib/generic/math/clc_hypot.cl
+++ b/libclc/clc/lib/generic/math/clc_hypot.cl
@@ -11,7 +11,7 @@
 #include "clc/internal/clc.h"
 #include "clc/math/clc_fabs.h"
 #include "clc/math/clc_fmax.h"
-#include "clc/math/clc_frexp.h"
+#include "clc/math/clc_frexp_exp.h"
 #include "clc/math/clc_ldexp.h"
 #include "clc/math/clc_mad.h"
 #include "clc/math/clc_sqrt_fast.h"

diff  --git a/libclc/clc/lib/generic/math/clc_ilogb.cl 
b/libclc/clc/lib/generic/math/clc_ilogb.cl
index 1ccc5754ca7f7..e96e547d2b6a1 100644
--- a/libclc/clc/lib/generic/math/clc_ilogb.cl
+++ b/libclc/clc/lib/generic/math/clc_ilogb.cl
@@ -6,11 +6,15 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#include <clc/clc_convert.h>
-#include <clc/float/definitions.h>
-#include <clc/integer/clc_clz.h>
-#include <clc/internal/clc.h>
-#include <clc/math/math.h>
+#include "clc/clc_convert.h"
+#include "clc/float/definitions.h"
+#include "clc/integer/clc_clz.h"
+#include "clc/internal/clc.h"
+#include "clc/math/clc_frexp_exp.h"
+#include "clc/math/math.h"
+#include "clc/relational/clc_isinf.h"
+#include "clc/relational/clc_isnan.h"
+#include "clc/relational/clc_select.h"
 
 #define __CLC_BODY <clc_ilogb.inc>
 #include <clc/math/gentype.inc>

diff  --git a/libclc/clc/lib/generic/math/clc_ilogb.inc 
b/libclc/clc/lib/generic/math/clc_ilogb.inc
index acbc70a9d1be2..4880af58a9794 100644
--- a/libclc/clc/lib/generic/math/clc_ilogb.inc
+++ b/libclc/clc/lib/generic/math/clc_ilogb.inc
@@ -6,76 +6,14 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#if __CLC_FPSIZE == 32
+_CLC_OVERLOAD _CLC_CONST _CLC_DEF __CLC_INTN __clc_ilogb(__CLC_GENTYPE x) {
+  __CLC_INTN r = __clc_frexp_exp(x) - 1;
 
-_CLC_OVERLOAD _CLC_DEF __CLC_INTN __clc_ilogb(__CLC_GENTYPE x) {
-  __CLC_UINTN ux = __CLC_AS_UINTN(x);
-  __CLC_UINTN ax = ux & EXSIGNBIT_SP32;
-  __CLC_INTN rs = (__CLC_INTN)LOG_MAGIC_NUM_SP32 -
-                  __CLC_AS_INTN(__clc_clz(ux & MANTBITS_SP32));
-  __CLC_INTN r = __CLC_AS_INTN(ax >> EXPSHIFTBITS_SP32) - EXPBIAS_SP32;
-  r = ax < 0x00800000U ? rs : r;
-  r = ax == 0 ? FP_ILOGB0 : r;
+  r = __clc_select(r, (__CLC_INTN)FP_ILOGBNAN,
+                   __CLC_CONVERT_UINTN(__clc_isnan(x)));
+  r = __clc_select(r, (__CLC_INTN)INT_MAX, 
__CLC_CONVERT_UINTN(__clc_isinf(x)));
+  r = __clc_select(r, (__CLC_INTN)FP_ILOGB0,
+                   __CLC_CONVERT_UINTN(x == __CLC_FP_LIT(0.0)));
 
-  // 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 __clc_ilogb() code.
-  r = ax > EXPBITS_SP32 ? FP_ILOGBNAN : r;
-  r = ax == EXPBITS_SP32 ? 0x7fffffff : r;
   return r;
 }
-
-#endif
-
-#if __CLC_FPSIZE == 64
-
-_CLC_OVERLOAD _CLC_DEF __CLC_INTN __clc_ilogb(__CLC_GENTYPE x) {
-  __CLC_ULONGN ux = __CLC_AS_ULONGN(x);
-  __CLC_ULONGN ax = ux & ~SIGNBIT_DP64;
-  __CLC_INTN rs = (__CLC_INTN)LOG_MAGIC_NUM_DP64 -
-                  __CLC_CONVERT_INTN(__clc_clz(ax & MANTBITS_DP64));
-  __CLC_INTN r = __CLC_CONVERT_INTN(ax >> EXPSHIFTBITS_DP64) - EXPBIAS_DP64;
-  r = __CLC_CONVERT_INTN(ax < 0x0010000000000000UL) ? rs : r;
-  r = __CLC_CONVERT_INTN(ax == 0UL) ? (__CLC_INTN)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 __clc_ilogb() code.
-  r = __CLC_CONVERT_INTN(ax > 0x7ff0000000000000UL) ? FP_ILOGBNAN : r;
-  r = __CLC_CONVERT_INTN(ax == 0x7ff0000000000000UL) ? 0x7fffffff : r;
-  return r;
-}
-
-#endif
-
-#if __CLC_FPSIZE == 16
-
-_CLC_OVERLOAD _CLC_DEF __CLC_INTN __clc_ilogb(__CLC_GENTYPE x) {
-  __CLC_USHORTN ux = __CLC_AS_USHORTN(x);
-  __CLC_USHORTN ax = ux & (__CLC_USHORTN)EXSIGNBIT_FP16;
-  __CLC_USHORTN mantx = ux & (__CLC_USHORTN)MANTBITS_FP16;
-  __CLC_INTN rs =
-      (__CLC_INTN)LOG_MAGIC_NUM_FP16 - __CLC_CONVERT_INTN(__clc_clz(mantx));
-  __CLC_INTN r =
-      __CLC_CONVERT_INTN(ax >> (__CLC_USHORTN)EXPSHIFTBITS_FP16) - 
EXPBIAS_FP16;
-  r = __CLC_CONVERT_INTN(ax < (__CLC_USHORTN)0x0400U) ? rs : r;
-  r = __CLC_CONVERT_INTN(ax == (__CLC_USHORTN)0) ? (__CLC_INTN)FP_ILOGB0 : r;
-
-  // We could merge those 2 tests and have:
-  //
-  //    r = ax >= EXPBITS_FP16 ? 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 __clc_ilogb() code.
-  r = __CLC_CONVERT_INTN(ax > (__CLC_USHORTN)EXPBITS_FP16) ? FP_ILOGBNAN : r;
-  r = __CLC_CONVERT_INTN(ax == (__CLC_USHORTN)EXPBITS_FP16) ? 0x7fffffff : r;
-  return r;
-}
-
-#endif


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to