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
