https://github.com/arsenm created 
https://github.com/llvm/llvm-project/pull/186973

This will enable use with vector types

>From 3c5d2444165f1c470298d3be16dec0c59253dd4e Mon Sep 17 00:00:00 2001
From: Matt Arsenault <[email protected]>
Date: Mon, 16 Mar 2026 22:42:37 +0100
Subject: [PATCH] libclc: Use struct for ep pair

This will enable use with vector types
---
 libclc/clc/include/clc/math/clc_ep_decl.inc | 10 ++--
 libclc/clc/lib/generic/math/clc_ep.cl       | 17 -------
 libclc/clc/lib/generic/math/clc_ep.inc      | 56 ++++++++++++++++++---
 libclc/clc/lib/generic/math/clc_log_base.h  |  5 +-
 4 files changed, 58 insertions(+), 30 deletions(-)

diff --git a/libclc/clc/include/clc/math/clc_ep_decl.inc 
b/libclc/clc/include/clc/math/clc_ep_decl.inc
index d29cfdc6346ba..eb4946da066b7 100644
--- a/libclc/clc/include/clc/math/clc_ep_decl.inc
+++ b/libclc/clc/include/clc/math/clc_ep_decl.inc
@@ -6,12 +6,16 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#ifdef __CLC_SCALAR
+typedef struct __CLC_XCONCAT(__clc_ep_pair_, __CLC_GENTYPE) {
+  __CLC_GENTYPE lo, hi;
+} __CLC_XCONCAT(__clc_ep_pair_, __CLC_GENTYPE);
 
-#define __CLC_EP_PAIR __CLC_XCONCAT(__CLC_GENTYPE, 2)
+#define __CLC_EP_PAIR __CLC_XCONCAT(__clc_ep_pair_, __CLC_GENTYPE)
 
 _CLC_DECL _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR __clc_ep_absv(__CLC_EP_PAIR 
a);
 
+_CLC_DECL _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR __clc_ep_neg(__CLC_EP_PAIR a);
+
 _CLC_DECL _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR
 __clc_ep_conditional_sign_match(__CLC_EP_PAIR a, __CLC_EP_PAIR b);
 
@@ -127,5 +131,3 @@ _CLC_DECL _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR 
__clc_ep_sqr(__CLC_EP_PAIR a);
 _CLC_DECL _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR __clc_ep_sqrt(__CLC_GENTYPE 
a);
 
 _CLC_DECL _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR __clc_ep_sqrt(__CLC_EP_PAIR 
a);
-
-#endif
diff --git a/libclc/clc/lib/generic/math/clc_ep.cl 
b/libclc/clc/lib/generic/math/clc_ep.cl
index f0e3020f65f6f..c8852a8b5c202 100644
--- a/libclc/clc/lib/generic/math/clc_ep.cl
+++ b/libclc/clc/lib/generic/math/clc_ep.cl
@@ -16,22 +16,5 @@
 #include "clc/relational/clc_isinf.h"
 #include "clc/relational/clc_signbit.h"
 
-#ifdef cl_khr_fp16
-_CLC_DEF _CLC_OVERLOAD _CLC_CONST static half ep_high_fp_bits(half x) {
-  return __clc_as_half((ushort)(__clc_as_ushort(x) & (ushort)0xffc0U));
-}
-#endif
-
-_CLC_DEF _CLC_OVERLOAD _CLC_CONST static float ep_high_fp_bits(float x) {
-  return __clc_as_float(__clc_as_uint(x) & 0xfffff000U);
-}
-
-#ifdef cl_khr_fp64
-
-_CLC_DEF _CLC_OVERLOAD _CLC_CONST static double ep_high_fp_bits(double x) {
-  return __clc_as_double(__clc_as_ulong(x) & 0xfffffffff8000000UL);
-}
-#endif
-
 #define __CLC_BODY <clc_ep.inc>
 #include <clc/math/gentype.inc>
diff --git a/libclc/clc/lib/generic/math/clc_ep.inc 
b/libclc/clc/lib/generic/math/clc_ep.inc
index 38fa513c46aac..466e7dffadc00 100644
--- a/libclc/clc/lib/generic/math/clc_ep.inc
+++ b/libclc/clc/lib/generic/math/clc_ep.inc
@@ -6,8 +6,6 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#ifdef __CLC_SCALAR
-
 #if __CLC_FPSIZE == 16
 #define __CLC_EP_USE_FMA true
 #elif __CLC_FPSIZE == 32
@@ -27,24 +25,69 @@
 
 #pragma OPENCL FP_CONTRACT OFF
 
+#if __CLC_FPSIZE == 16
+_CLC_DEF _CLC_OVERLOAD _CLC_CONST static __CLC_GENTYPE
+ep_high_fp_bits(__CLC_GENTYPE x) {
+  return __CLC_AS_GENTYPE(__CLC_CONVERT_U_GENTYPE(
+      (__CLC_AS_U_GENTYPE(x) & (__CLC_U_GENTYPE)0xffc0U)));
+}
+
+#elif __CLC_FPSIZE == 32
+
+_CLC_DEF _CLC_OVERLOAD _CLC_CONST static __CLC_GENTYPE
+ep_high_fp_bits(__CLC_GENTYPE x) {
+  return __CLC_AS_GENTYPE(__CLC_AS_U_GENTYPE(x) & 0xfffff000U);
+}
+
+#elif __CLC_FPSIZE == 64
+
+_CLC_DEF _CLC_OVERLOAD _CLC_CONST static __CLC_GENTYPE
+ep_high_fp_bits(__CLC_GENTYPE x) {
+  return __CLC_AS_GENTYPE(__CLC_AS_U_GENTYPE(x) & 0xfffffffff8000000UL);
+}
+
+#endif
+
+typedef struct __CLC_XCONCAT(__clc_ep_int_pair_, __CLC_GENTYPE) {
+  __CLC_INTN lo, hi;
+} __CLC_XCONCAT(__clc_ep_int_pair_, __CLC_GENTYPE);
+
+#define __CLC_EP_INT_PAIR __CLC_XCONCAT(__clc_ep_int_pair_, __CLC_GENTYPE)
+
 _CLC_OVERLOAD
-static bool samesign(__CLC_GENTYPE x, __CLC_GENTYPE y) {
+static __CLC_S_GENTYPE samesign(__CLC_GENTYPE x, __CLC_GENTYPE y) {
   return __clc_signbit(x) == __clc_signbit(y);
 }
 
 _CLC_DEF
 _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR __clc_ep_absv(__CLC_EP_PAIR a) {
-  return __clc_signbit(a.hi) ? -a : a;
+  __CLC_EP_PAIR ret;
+  __CLC_EP_PAIR neg_a = __clc_ep_neg(a);
+  ret.lo = __clc_signbit(a.hi) ? neg_a.lo : a.lo;
+  ret.hi = __clc_signbit(a.hi) ? neg_a.hi : a.hi;
+  return ret;
+}
+
+_CLC_DEF
+_CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR __clc_ep_neg(__CLC_EP_PAIR a) {
+  a.lo = -a.lo;
+  a.hi = -a.hi;
+  return a;
 }
 
 _CLC_DEF _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR
 __clc_ep_conditional_sign_match(__CLC_EP_PAIR a, __CLC_EP_PAIR b) {
-  return samesign(a.hi, b.hi) ? a : -a;
+  __CLC_S_GENTYPE ss = samesign(a.hi, b.hi);
+  __CLC_EP_PAIR neg_a = __clc_ep_neg(a);
+
+  __CLC_EP_PAIR ret = {ss ? a.lo : neg_a.lo, ss ? a.hi : neg_a.hi};
+  return ret;
 }
 
 _CLC_DEF _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR
 __clc_ep_make_pair(__CLC_GENTYPE a, __CLC_GENTYPE b) {
-  return (__CLC_EP_PAIR)(b, a);
+  __CLC_EP_PAIR ret = {b, a};
+  return ret;
 }
 
 _CLC_DEF _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR
@@ -388,4 +431,3 @@ _CLC_DEF _CLC_OVERLOAD _CLC_CONST __CLC_EP_PAIR 
__clc_ep_sqrt(__CLC_EP_PAIR a) {
 }
 
 #undef __CLC_EP_USE_FMA
-#endif
diff --git a/libclc/clc/lib/generic/math/clc_log_base.h 
b/libclc/clc/lib/generic/math/clc_log_base.h
index e7879c9dccedb..51c92fafdad2c 100644
--- a/libclc/clc/lib/generic/math/clc_log_base.h
+++ b/libclc/clc/lib/generic/math/clc_log_base.h
@@ -193,13 +193,14 @@ __clc_log(double a)
   m = __clc_ldexp(m, b);
   int e = a_exp - b;
 
-  double2 x = __clc_ep_div(m - 1.0, __clc_ep_fast_add(1.0, m));
+  __clc_ep_pair_double x = __clc_ep_div(m - 1.0, __clc_ep_fast_add(1.0, m));
   double s = x.hi * x.hi;
   double p = __clc_mad(s, __clc_mad(s, __clc_mad(s,
              __clc_mad(s, __clc_mad(s, __clc_mad(s, 0x1.3ab76bf559e2bp-3, 
0x1.385386b47b09ap-3),
                0x1.7474dd7f4df2ep-3), 0x1.c71c016291751p-3),
                0x1.249249b27acf1p-2), 0x1.99999998ef7b6p-2), 
0x1.5555555555780p-1);
-  double2 r = __clc_ep_fast_add(__clc_ep_ldexp(x, 1), s * x.hi * p);
+  __clc_ep_pair_double r =
+      __clc_ep_fast_add(__clc_ep_ldexp(x, 1), s * x.hi * p);
 
 #if defined COMPILING_LOG2
   r = __clc_ep_add(

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

Reply via email to