Author: Matt Arsenault
Date: 2026-03-11T11:17:39+01:00
New Revision: 9aba26bf47544823357df6e95adbf09035cb4689

URL: 
https://github.com/llvm/llvm-project/commit/9aba26bf47544823357df6e95adbf09035cb4689
DIFF: 
https://github.com/llvm/llvm-project/commit/9aba26bf47544823357df6e95adbf09035cb4689.diff

LOG: libclc: Use frexp builtins to implement frexp for amdgpu (#185637)

This should really be the default implementation.

Added: 
    libclc/clc/lib/amdgpu/math/clc_frexp.cl
    libclc/clc/lib/generic/math/clc_frexp_builtin.inc

Modified: 
    libclc/clc/lib/amdgpu/CMakeLists.txt

Removed: 
    


################################################################################
diff  --git a/libclc/clc/lib/amdgpu/CMakeLists.txt 
b/libclc/clc/lib/amdgpu/CMakeLists.txt
index 8fd0d4667db53..9b6c9a231ade0 100644
--- a/libclc/clc/lib/amdgpu/CMakeLists.txt
+++ b/libclc/clc/lib/amdgpu/CMakeLists.txt
@@ -4,6 +4,7 @@ libclc_configure_source_list(CLC_AMDGPU_SOURCES
   math/clc_exp.cl
   math/clc_exp2.cl
   math/clc_exp10.cl
+  math/clc_frexp.cl
   math/clc_half_exp.cl
   math/clc_half_exp2.cl
   math/clc_half_exp10.cl

diff  --git a/libclc/clc/lib/amdgpu/math/clc_frexp.cl 
b/libclc/clc/lib/amdgpu/math/clc_frexp.cl
new file mode 100644
index 0000000000000..9234f84b274df
--- /dev/null
+++ b/libclc/clc/lib/amdgpu/math/clc_frexp.cl
@@ -0,0 +1,43 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include <clc/internal/clc.h>
+#include <clc/math/clc_frexp.h>
+
+#define __CLC_BODY <clc_frexp_builtin.inc>
+#define __CLC_ADDRESS_SPACE private
+#define __CLC_PRIVATE
+#include <clc/math/gentype.inc>
+#undef __CLC_ADDRESS_SPACE
+#undef __CLC_PRIVATE
+
+#define __CLC_BODY <clc_frexp_builtin.inc>
+#define __CLC_ADDRESS_SPACE global
+#include <clc/math/gentype.inc>
+#undef __CLC_ADDRESS_SPACE
+
+#define __CLC_BODY <clc_frexp_builtin.inc>
+#define __CLC_ADDRESS_SPACE local
+#include <clc/math/gentype.inc>
+#undef __CLC_ADDRESS_SPACE
+
+#if _CLC_DISTINCT_GENERIC_AS_SUPPORTED
+#define __CLC_BODY <clc_frexp_builtin.inc>
+#define __CLC_ADDRESS_SPACE generic
+#include <clc/math/gentype.inc>
+#undef __CLC_ADDRESS_SPACE
+#endif
+
+#define __CLC_FUNCTION __clc_frexp
+#define __CLC_ARG2_TYPE int
+#define __CLC_ADDRSPACE private
+#define __CLC_BODY <clc/shared/unary_def_with_ptr_scalarize.inc>
+#include <clc/math/gentype.inc>
+#undef __CLC_ADDRSPACE
+#undef __CLC_ARG2_TYPE
+#undef __CLC_FUNCTION

diff  --git a/libclc/clc/lib/generic/math/clc_frexp_builtin.inc 
b/libclc/clc/lib/generic/math/clc_frexp_builtin.inc
new file mode 100644
index 0000000000000..e4f763618f54e
--- /dev/null
+++ b/libclc/clc/lib/generic/math/clc_frexp_builtin.inc
@@ -0,0 +1,46 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#if defined(__CLC_PRIVATE) && defined(__CLC_SCALAR)
+
+#if __CLC_FPSIZE == 16
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_frexp(__CLC_GENTYPE x,
+                                                 private __CLC_INTN *ep) {
+  return __builtin_frexpf16(x, ep);
+}
+
+#elif __CLC_FPSIZE == 32
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_frexp(__CLC_GENTYPE x,
+                                                 private __CLC_INTN *ep) {
+  return __builtin_frexpf(x, ep);
+}
+
+#elif __CLC_FPSIZE == 64
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_frexp(__CLC_GENTYPE x,
+                                                 private __CLC_INTN *ep) {
+  return __builtin_frexp(x, ep);
+}
+
+#else
+#error "unhandled fpsize"
+#endif
+
+#elif !defined(__CLC_PRIVATE)
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE
+__clc_frexp(__CLC_GENTYPE x, __CLC_ADDRESS_SPACE __CLC_INTN *ep) {
+  __CLC_INTN e;
+  __CLC_GENTYPE result = __clc_frexp(x, &e);
+  *ep = e;
+  return result;
+}
+
+#endif


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

Reply via email to