[llvm-branch-commits] [libclc] libclc: Update logb implementation (PR #185881)

Matt Arsenault via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Mar 11 23:40:47 PDT 2026


https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/185881

>From bdd23ca064480b5dd3cf04a42c2c5f4431de8bdd Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Wed, 11 Mar 2026 14:37:09 +0100
Subject: [PATCH] libclc: Update logb implementation

Similar to the previous logb change, use a common
bithacking free implementation.
---
 libclc/clc/lib/generic/math/clc_logb.cl  | 14 ++++---
 libclc/clc/lib/generic/math/clc_logb.inc | 48 ++++--------------------
 2 files changed, 16 insertions(+), 46 deletions(-)

diff --git a/libclc/clc/lib/generic/math/clc_logb.cl b/libclc/clc/lib/generic/math/clc_logb.cl
index 879676eedff15..d966cca483875 100644
--- a/libclc/clc/lib/generic/math/clc_logb.cl
+++ b/libclc/clc/lib/generic/math/clc_logb.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_fabs.h"
+#include "clc/math/clc_frexp_exp.h"
+#include "clc/math/math.h"
+#include "clc/relational/clc_isfinite.h"
+#include "clc/relational/clc_select.h"
 
 #define __CLC_BODY <clc_logb.inc>
 #include <clc/math/gentype.inc>
diff --git a/libclc/clc/lib/generic/math/clc_logb.inc b/libclc/clc/lib/generic/math/clc_logb.inc
index dde394886de27..1f88e6a4eae4b 100644
--- a/libclc/clc/lib/generic/math/clc_logb.inc
+++ b/libclc/clc/lib/generic/math/clc_logb.inc
@@ -6,49 +6,15 @@
 //
 //===----------------------------------------------------------------------===//
 
-#if __CLC_FPSIZE == 32
+_CLC_OVERLOAD _CLC_CONST _CLC_DEF __CLC_GENTYPE __clc_logb(__CLC_GENTYPE x) {
+  __CLC_GENTYPE ret = __CLC_CONVERT_GENTYPE(__clc_frexp_exp(x) - (__CLC_INTN)1);
 
-_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_logb(__CLC_GENTYPE x) {
-  __CLC_INTN ax = __CLC_AS_INTN(x) & EXSIGNBIT_SP32;
-  __CLC_GENTYPE s = __CLC_CONVERT_GENTYPE(LOG_MAGIC_NUM_SP32 - __clc_clz(ax));
-  __CLC_GENTYPE r =
-      __CLC_CONVERT_GENTYPE((ax >> EXPSHIFTBITS_SP32) - EXPBIAS_SP32);
-  r = ax >= PINFBITPATT_SP32 ? __CLC_AS_GENTYPE(ax) : r;
-  r = ax < 0x00800000 ? s : r;
-  r = ax == 0 ? __CLC_AS_GENTYPE((__CLC_INTN)NINFBITPATT_SP32) : r;
-  return r;
-}
-
-#endif
-
-#if __CLC_FPSIZE == 64
+  __CLC_GENTYPE ax = __clc_fabs(x);
 
-_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_logb(__CLC_GENTYPE x) {
-  __CLC_LONGN ax = __CLC_AS_LONGN(x) & EXSIGNBIT_DP64;
-  __CLC_GENTYPE s = __CLC_CONVERT_GENTYPE(LOG_MAGIC_NUM_DP64 - __clc_clz(ax));
-  __CLC_GENTYPE r =
-      __CLC_CONVERT_GENTYPE((ax >> EXPSHIFTBITS_DP64) - EXPBIAS_DP64);
-  r = ax >= PINFBITPATT_DP64 ? __CLC_AS_GENTYPE(ax) : r;
-  r = ax < 0x0010000000000000L ? s : r;
-  r = ax == 0L ? __CLC_AS_GENTYPE((__CLC_LONGN)NINFBITPATT_DP64) : r;
-  return r;
-}
-
-#endif
+  ret = __clc_select(ax, ret, __CLC_CONVERT_U_GENTYPE(__clc_isfinite(ax)));
 
-#if __CLC_FPSIZE == 16
+  ret = __clc_select(ret, -__CLC_GENTYPE_INF,
+                     __CLC_CONVERT_U_GENTYPE(x == __CLC_FP_LIT(0.0)));
 
-_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_logb(__CLC_GENTYPE x) {
-  __CLC_SHORTN ax = __CLC_AS_SHORTN(x) & (__CLC_SHORTN)EXSIGNBIT_FP16;
-  __CLC_GENTYPE s = __CLC_CONVERT_GENTYPE((__CLC_SHORTN)LOG_MAGIC_NUM_FP16 -
-                                          (__CLC_SHORTN)__clc_clz(ax));
-  __CLC_GENTYPE r = __CLC_CONVERT_GENTYPE(
-      (ax >> (__CLC_SHORTN)EXPSHIFTBITS_FP16) - (__CLC_SHORTN)EXPBIAS_FP16);
-  r = ax >= (__CLC_SHORTN)PINFBITPATT_FP16 ? __CLC_AS_GENTYPE(ax) : r;
-  r = ax < (__CLC_SHORTN)0x0400 ? s : r;
-  r = ax == (__CLC_SHORTN)0 ? __CLC_AS_GENTYPE((__CLC_SHORTN)NINFBITPATT_FP16)
-                            : r;
-  return r;
+  return ret;
 }
-
-#endif



More information about the llvm-branch-commits mailing list