Author: Fraser Cormack
Date: 2025-04-29T10:51:24+01:00
New Revision: 4609b6a3e76e604463bab2a303c6da737f303237

URL: 
https://github.com/llvm/llvm-project/commit/4609b6a3e76e604463bab2a303c6da737f303237
DIFF: 
https://github.com/llvm/llvm-project/commit/4609b6a3e76e604463bab2a303c6da737f303237.diff

LOG: [libclc] Move fmin & fmax to CLC library (#134218)

This is an alternative to #128506 which doesn't attempt to change the
codegen for fmin and fmax on their way to the CLC library.

The amdgcn and r600 custom definitions of fmin/fmax are now converted to
custom definitions of __clc_fmin and __clc_fmax.

For simplicity, the CLC library doesn't provide vector/scalar versions
of these builtins. The OpenCL layer wraps those up to the vector/vector
versions.

The only codegen change is that non-standard vector/scalar overloads of
fmin/fmax have been removed. We were currently (accidentally,
presumably) providing overloads with mixed elment types such as
fmin(double2, float), fmax(half4, double), etc. The only vector/scalar
overloads in the OpenCL spec are those with scalars of the same element
type as the vector in the first argument.

Added: 
    libclc/clc/include/clc/math/clc_fmax.h
    libclc/clc/include/clc/math/clc_fmin.h
    libclc/clc/include/clc/shared/binary_decl_with_scalar_second_arg.inc
    libclc/clc/include/clc/shared/binary_def_with_scalar_second_arg.inc
    libclc/clc/lib/amdgcn/math/clc_fmax.cl
    libclc/clc/lib/amdgcn/math/clc_fmin.cl
    libclc/clc/lib/generic/math/clc_fmax.cl
    libclc/clc/lib/generic/math/clc_fmin.cl
    libclc/clc/lib/r600/math/clc_fmax.cl
    libclc/clc/lib/r600/math/clc_fmin.cl

Modified: 
    libclc/amdgcn/lib/SOURCES
    libclc/clc/lib/amdgcn/SOURCES
    libclc/clc/lib/generic/SOURCES
    libclc/clc/lib/r600/SOURCES
    libclc/generic/lib/math/fmax.cl
    libclc/generic/lib/math/fmin.cl
    libclc/r600/lib/SOURCES

Removed: 
    libclc/amdgcn/lib/math/fmax.cl
    libclc/amdgcn/lib/math/fmin.cl
    libclc/r600/lib/math/fmax.cl
    libclc/r600/lib/math/fmin.cl


################################################################################
diff  --git a/libclc/amdgcn/lib/SOURCES b/libclc/amdgcn/lib/SOURCES
index 6c6e77db0d84b..213f62cc73a74 100644
--- a/libclc/amdgcn/lib/SOURCES
+++ b/libclc/amdgcn/lib/SOURCES
@@ -1,6 +1,4 @@
 cl_khr_int64_extended_atomics/minmax_helpers.ll
-math/fmax.cl
-math/fmin.cl
 mem_fence/fence.cl
 synchronization/barrier.cl
 workitem/get_global_offset.cl

diff  --git a/libclc/amdgcn/lib/math/fmax.cl b/libclc/amdgcn/lib/math/fmax.cl
deleted file mode 100644
index 8d3bf0495390f..0000000000000
--- a/libclc/amdgcn/lib/math/fmax.cl
+++ /dev/null
@@ -1,53 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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/clc.h>
-#include <clc/clcmacro.h>
-
-_CLC_DEF _CLC_OVERLOAD float fmax(float x, float y)
-{
-   /* fcanonicalize removes sNaNs and flushes denormals if not enabled.
-    * Otherwise fmax instruction flushes the values for comparison,
-    * but outputs original denormal */
-   x = __builtin_canonicalizef(x);
-   y = __builtin_canonicalizef(y);
-   return __builtin_fmaxf(x, y);
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, fmax, float, float)
-
-#ifdef cl_khr_fp64
-
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-_CLC_DEF _CLC_OVERLOAD double fmax(double x, double y)
-{
-   x = __builtin_canonicalize(x);
-   y = __builtin_canonicalize(y);
-   return __builtin_fmax(x, y);
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, fmax, double, double)
-
-#endif
-#ifdef cl_khr_fp16
-
-#pragma OPENCL EXTENSION cl_khr_fp16 : enable
-
-_CLC_DEF _CLC_OVERLOAD half fmax(half x, half y)
-{
-   if (isnan(x))
-      return y;
-   if (isnan(y))
-      return x;
-   return (y < x) ? x : y;
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, fmax, half, half)
-
-#endif
-
-#define __CLC_BODY <../../../generic/lib/math/fmax.inc>
-#include <clc/math/gentype.inc>

diff  --git a/libclc/amdgcn/lib/math/fmin.cl b/libclc/amdgcn/lib/math/fmin.cl
deleted file mode 100644
index 689401323105d..0000000000000
--- a/libclc/amdgcn/lib/math/fmin.cl
+++ /dev/null
@@ -1,53 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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/clc.h>
-#include <clc/clcmacro.h>
-
-_CLC_DEF _CLC_OVERLOAD float fmin(float x, float y)
-{
-   /* fcanonicalize removes sNaNs and flushes denormals if not enabled.
-    * Otherwise fmin instruction flushes the values for comparison,
-    * but outputs original denormal */
-   x = __builtin_canonicalizef(x);
-   y = __builtin_canonicalizef(y);
-   return __builtin_fminf(x, y);
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, fmin, float, float)
-
-#ifdef cl_khr_fp64
-
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-_CLC_DEF _CLC_OVERLOAD double fmin(double x, double y)
-{
-   x = __builtin_canonicalize(x);
-   y = __builtin_canonicalize(y);
-   return __builtin_fmin(x, y);
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, fmin, double, double)
-
-#endif
-#ifdef cl_khr_fp16
-
-#pragma OPENCL EXTENSION cl_khr_fp16 : enable
-
-_CLC_DEF _CLC_OVERLOAD half fmin(half x, half y)
-{
-   if (isnan(x))
-      return y;
-   if (isnan(y))
-      return x;
-   return (y < x) ? y : x;
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, fmin, half, half)
-
-#endif
-
-#define __CLC_BODY <../../../generic/lib/math/fmin.inc>
-#include <clc/math/gentype.inc>

diff  --git a/libclc/clc/include/clc/math/clc_fmax.h 
b/libclc/clc/include/clc/math/clc_fmax.h
new file mode 100644
index 0000000000000..cc50c165bff85
--- /dev/null
+++ b/libclc/clc/include/clc/math/clc_fmax.h
@@ -0,0 +1,20 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __CLC_MATH_CLC_FMAX_H__
+#define __CLC_MATH_CLC_FMAX_H__
+
+#define __CLC_FUNCTION __clc_fmax
+#define __CLC_BODY <clc/shared/binary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_BODY
+#undef __CLC_FUNCTION
+
+#endif // __CLC_MATH_CLC_FMAX_H__

diff  --git a/libclc/clc/include/clc/math/clc_fmin.h 
b/libclc/clc/include/clc/math/clc_fmin.h
new file mode 100644
index 0000000000000..b62a3e47b98c6
--- /dev/null
+++ b/libclc/clc/include/clc/math/clc_fmin.h
@@ -0,0 +1,20 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __CLC_MATH_CLC_FMIN_H__
+#define __CLC_MATH_CLC_FMIN_H__
+
+#define __CLC_FUNCTION __clc_fmin
+#define __CLC_BODY <clc/shared/binary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_BODY
+#undef __CLC_FUNCTION
+
+#endif // __CLC_MATH_CLC_FMIN_H__

diff  --git 
a/libclc/clc/include/clc/shared/binary_decl_with_scalar_second_arg.inc 
b/libclc/clc/include/clc/shared/binary_decl_with_scalar_second_arg.inc
new file mode 100644
index 0000000000000..6044902a5be7c
--- /dev/null
+++ b/libclc/clc/include/clc/shared/binary_decl_with_scalar_second_arg.inc
@@ -0,0 +1,15 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE x,
+                                                     __CLC_GENTYPE y);
+
+#ifndef __CLC_SCALAR
+_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE x,
+                                                     __CLC_SCALAR_GENTYPE y);
+#endif

diff  --git 
a/libclc/clc/include/clc/shared/binary_def_with_scalar_second_arg.inc 
b/libclc/clc/include/clc/shared/binary_def_with_scalar_second_arg.inc
new file mode 100644
index 0000000000000..49fa7d2ce36e9
--- /dev/null
+++ b/libclc/clc/include/clc/shared/binary_def_with_scalar_second_arg.inc
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// 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/utils.h>
+
+#ifndef __CLC_FUNCTION
+#define __CLC_FUNCTION(x) __CLC_CONCAT(__clc_, x)
+#endif
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE FUNCTION(__CLC_GENTYPE a,
+                                              __CLC_GENTYPE b) {
+  return __CLC_FUNCTION(FUNCTION)(a, b);
+}
+
+#ifndef __CLC_SCALAR
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE FUNCTION(__CLC_GENTYPE a,
+                                              __CLC_SCALAR_GENTYPE b) {
+  return __CLC_FUNCTION(FUNCTION)(a, (__CLC_GENTYPE)b);
+}
+#endif

diff  --git a/libclc/clc/lib/amdgcn/SOURCES b/libclc/clc/lib/amdgcn/SOURCES
index b85f80d3b29bb..3a48049271aff 100644
--- a/libclc/clc/lib/amdgcn/SOURCES
+++ b/libclc/clc/lib/amdgcn/SOURCES
@@ -1 +1,3 @@
+math/clc_fmax.cl
+math/clc_fmin.cl
 math/clc_ldexp_override.cl

diff  --git a/libclc/clc/lib/amdgcn/math/clc_fmax.cl 
b/libclc/clc/lib/amdgcn/math/clc_fmax.cl
new file mode 100644
index 0000000000000..20bdcadb9eabf
--- /dev/null
+++ b/libclc/clc/lib/amdgcn/math/clc_fmax.cl
@@ -0,0 +1,49 @@
+//===----------------------------------------------------------------------===//
+//
+// 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/clcmacro.h>
+#include <clc/internal/clc.h>
+#include <clc/relational/clc_isnan.h>
+
+_CLC_DEF _CLC_OVERLOAD float __clc_fmax(float x, float y) {
+  // fcanonicalize removes sNaNs and flushes denormals if not enabled. 
Otherwise
+  // fmax instruction flushes the values for comparison, but outputs original
+  // denormal
+  x = __builtin_canonicalizef(x);
+  y = __builtin_canonicalizef(y);
+  return __builtin_fmaxf(x, y);
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_fmax, float, float)
+
+#ifdef cl_khr_fp64
+
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+_CLC_DEF _CLC_OVERLOAD double __clc_fmax(double x, double y) {
+  x = __builtin_canonicalize(x);
+  y = __builtin_canonicalize(y);
+  return __builtin_fmax(x, y);
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_fmax, double,
+                      double)
+
+#endif
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEF _CLC_OVERLOAD half __clc_fmax(half x, half y) {
+  if (__clc_isnan(x))
+    return y;
+  if (__clc_isnan(y))
+    return x;
+  return (y < x) ? x : y;
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, __clc_fmax, half, half)
+
+#endif

diff  --git a/libclc/clc/lib/amdgcn/math/clc_fmin.cl 
b/libclc/clc/lib/amdgcn/math/clc_fmin.cl
new file mode 100644
index 0000000000000..a5f66dfefa900
--- /dev/null
+++ b/libclc/clc/lib/amdgcn/math/clc_fmin.cl
@@ -0,0 +1,50 @@
+//===----------------------------------------------------------------------===//
+//
+// 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/clcmacro.h>
+#include <clc/internal/clc.h>
+#include <clc/relational/clc_isnan.h>
+
+_CLC_DEF _CLC_OVERLOAD float __clc_fmin(float x, float y) {
+  // fcanonicalize removes sNaNs and flushes denormals if not enabled. 
Otherwise
+  // fmin instruction flushes the values for comparison, but outputs original
+  // denormal
+  x = __builtin_canonicalizef(x);
+  y = __builtin_canonicalizef(y);
+  return __builtin_fminf(x, y);
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_fmin, float, float)
+
+#ifdef cl_khr_fp64
+
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+_CLC_DEF _CLC_OVERLOAD double __clc_fmin(double x, double y) {
+  x = __builtin_canonicalize(x);
+  y = __builtin_canonicalize(y);
+  return __builtin_fmin(x, y);
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_fmin, double,
+                      double)
+
+#endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEF _CLC_OVERLOAD half __clc_fmin(half x, half y) {
+  if (__clc_isnan(x))
+    return y;
+  if (__clc_isnan(y))
+    return x;
+  return (y < x) ? y : x;
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, __clc_fmin, half, half)
+
+#endif

diff  --git a/libclc/clc/lib/generic/SOURCES b/libclc/clc/lib/generic/SOURCES
index 1e73627c3a270..4c81a152290a9 100644
--- a/libclc/clc/lib/generic/SOURCES
+++ b/libclc/clc/lib/generic/SOURCES
@@ -42,8 +42,10 @@ math/clc_expm1.cl
 math/clc_exp_helper.cl
 math/clc_fabs.cl
 math/clc_fma.cl
-math/clc_fmod.cl
+math/clc_fmax.cl
+math/clc_fmin.cl
 math/clc_floor.cl
+math/clc_fmod.cl
 math/clc_frexp.cl
 math/clc_hypot.cl
 math/clc_ldexp.cl

diff  --git a/libclc/clc/lib/generic/math/clc_fmax.cl 
b/libclc/clc/lib/generic/math/clc_fmax.cl
new file mode 100644
index 0000000000000..8ee369f57d38b
--- /dev/null
+++ b/libclc/clc/lib/generic/math/clc_fmax.cl
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// 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/clcmacro.h>
+#include <clc/internal/clc.h>
+#include <clc/relational/clc_isnan.h>
+
+_CLC_DEFINE_BINARY_BUILTIN(float, __clc_fmax, __builtin_fmaxf, float, float);
+
+#ifdef cl_khr_fp64
+
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+_CLC_DEFINE_BINARY_BUILTIN(double, __clc_fmax, __builtin_fmax, double, double);
+
+#endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEF _CLC_OVERLOAD half __clc_fmax(half x, half y) {
+  if (__clc_isnan(x))
+    return y;
+  if (__clc_isnan(y))
+    return x;
+  return (x < y) ? y : x;
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, __clc_fmax, half, half)
+
+#endif

diff  --git a/libclc/clc/lib/generic/math/clc_fmin.cl 
b/libclc/clc/lib/generic/math/clc_fmin.cl
new file mode 100644
index 0000000000000..2f307274b9be5
--- /dev/null
+++ b/libclc/clc/lib/generic/math/clc_fmin.cl
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// 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/clcmacro.h>
+#include <clc/internal/clc.h>
+#include <clc/relational/clc_isnan.h>
+
+_CLC_DEFINE_BINARY_BUILTIN(float, __clc_fmin, __builtin_fminf, float, float);
+
+#ifdef cl_khr_fp64
+
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+_CLC_DEFINE_BINARY_BUILTIN(double, __clc_fmin, __builtin_fmin, double, double);
+
+#endif
+
+#ifdef cl_khr_fp16
+
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+
+_CLC_DEF _CLC_OVERLOAD half __clc_fmin(half x, half y) {
+  if (__clc_isnan(x))
+    return y;
+  if (__clc_isnan(y))
+    return x;
+  return (y < x) ? y : x;
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, __clc_fmin, half, half)
+
+#endif

diff  --git a/libclc/clc/lib/r600/SOURCES b/libclc/clc/lib/r600/SOURCES
index 8d5caf167aa4e..75d32f4f535bc 100644
--- a/libclc/clc/lib/r600/SOURCES
+++ b/libclc/clc/lib/r600/SOURCES
@@ -1,2 +1,4 @@
+math/clc_fmax.cl
+math/clc_fmin.cl
 math/clc_native_rsqrt.cl
 math/clc_rsqrt_override.cl

diff  --git a/libclc/clc/lib/r600/math/clc_fmax.cl 
b/libclc/clc/lib/r600/math/clc_fmax.cl
new file mode 100644
index 0000000000000..7e9c6df789eda
--- /dev/null
+++ b/libclc/clc/lib/r600/math/clc_fmax.cl
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// 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/clcmacro.h>
+#include <clc/internal/clc.h>
+#include <clc/math/math.h>
+
+_CLC_DEF _CLC_OVERLOAD float __clc_fmax(float x, float y) {
+  // Flush denormals if not enabled. Otherwise fmax instruction flushes the
+  // values for comparison, but outputs original denormal
+  x = __clc_flush_denormal_if_not_supported(x);
+  y = __clc_flush_denormal_if_not_supported(y);
+  return __builtin_fmaxf(x, y);
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_fmax, float, float)
+
+#ifdef cl_khr_fp64
+
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+_CLC_DEF _CLC_OVERLOAD double __clc_fmax(double x, double y) {
+  return __builtin_fmax(x, y);
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_fmax, double,
+                      double)
+
+#endif

diff  --git a/libclc/clc/lib/r600/math/clc_fmin.cl 
b/libclc/clc/lib/r600/math/clc_fmin.cl
new file mode 100644
index 0000000000000..cbcf849f7b7e8
--- /dev/null
+++ b/libclc/clc/lib/r600/math/clc_fmin.cl
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// 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/clcmacro.h>
+#include <clc/internal/clc.h>
+#include <clc/math/math.h>
+
+_CLC_DEF _CLC_OVERLOAD float __clc_fmin(float x, float y) {
+  // fcanonicalize removes sNaNs and flushes denormals if not enabled. 
Otherwise
+  // fmin instruction flushes the values for comparison, but outputs original
+  // denormal
+  x = __clc_flush_denormal_if_not_supported(x);
+  y = __clc_flush_denormal_if_not_supported(y);
+  return __builtin_fminf(x, y);
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_fmin, float, float)
+
+#ifdef cl_khr_fp64
+
+#pragma OPENCL EXTENSION cl_khr_fp64 : enable
+
+_CLC_DEF _CLC_OVERLOAD double __clc_fmin(double x, double y) {
+  return __builtin_fmin(x, y);
+}
+_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_fmin, double,
+                      double)
+
+#endif

diff  --git a/libclc/generic/lib/math/fmax.cl b/libclc/generic/lib/math/fmax.cl
index 1a4afcb1c98cb..6ad5901eab739 100644
--- a/libclc/generic/lib/math/fmax.cl
+++ b/libclc/generic/lib/math/fmax.cl
@@ -7,33 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include <clc/clc.h>
-#include <clc/clcmacro.h>
+#include <clc/math/clc_fmax.h>
 
-_CLC_DEFINE_BINARY_BUILTIN(float, fmax, __builtin_fmaxf, float, float);
-
-#ifdef cl_khr_fp64
-
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-_CLC_DEFINE_BINARY_BUILTIN(double, fmax, __builtin_fmax, double, double);
-
-#endif
-
-#ifdef cl_khr_fp16
-
-#pragma OPENCL EXTENSION cl_khr_fp16 : enable
-
-_CLC_DEF _CLC_OVERLOAD half fmax(half x, half y)
-{
-   if (isnan(x))
-      return y;
-   if (isnan(y))
-      return x;
-   return (x < y) ? y : x;
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, fmax, half, half)
-
-#endif
-
-#define __CLC_BODY <fmax.inc>
+#define FUNCTION fmax
+#define __CLC_BODY <clc/shared/binary_def_with_scalar_second_arg.inc>
 #include <clc/math/gentype.inc>

diff  --git a/libclc/generic/lib/math/fmin.cl b/libclc/generic/lib/math/fmin.cl
index c0d3dbf820dcd..bb42a2a6d647d 100644
--- a/libclc/generic/lib/math/fmin.cl
+++ b/libclc/generic/lib/math/fmin.cl
@@ -7,32 +7,8 @@
 
//===----------------------------------------------------------------------===//
 
 #include <clc/clc.h>
-#include <clc/clcmacro.h>
+#include <clc/math/clc_fmin.h>
 
-_CLC_DEFINE_BINARY_BUILTIN(float, fmin, __builtin_fminf, float, float);
-
-#ifdef cl_khr_fp64
-
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-_CLC_DEFINE_BINARY_BUILTIN(double, fmin, __builtin_fmin, double, double);
-
-#endif
-#ifdef cl_khr_fp16
-
-#pragma OPENCL EXTENSION cl_khr_fp16 : enable
-
-_CLC_DEF _CLC_OVERLOAD half fmin(half x, half y)
-{
-   if (isnan(x))
-      return y;
-   if (isnan(y))
-      return x;
-   return (y < x) ? y : x;
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, fmin, half, half)
-
-#endif
-
-#define __CLC_BODY <fmin.inc>
+#define FUNCTION fmin
+#define __CLC_BODY <clc/shared/binary_def_with_scalar_second_arg.inc>
 #include <clc/math/gentype.inc>

diff  --git a/libclc/r600/lib/SOURCES b/libclc/r600/lib/SOURCES
index 4342ac38201c1..c4561274d8b2d 100644
--- a/libclc/r600/lib/SOURCES
+++ b/libclc/r600/lib/SOURCES
@@ -1,5 +1,3 @@
-math/fmax.cl
-math/fmin.cl
 synchronization/barrier.cl
 workitem/get_global_offset.cl
 workitem/get_group_id.cl

diff  --git a/libclc/r600/lib/math/fmax.cl b/libclc/r600/lib/math/fmax.cl
deleted file mode 100644
index 68c0925900e8a..0000000000000
--- a/libclc/r600/lib/math/fmax.cl
+++ /dev/null
@@ -1,36 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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/clc.h>
-#include <clc/clcmacro.h>
-#include <clc/math/math.h>
-
-_CLC_DEF _CLC_OVERLOAD float fmax(float x, float y)
-{
-   /* Flush denormals if not enabled. Otherwise fmax instruction flushes
-    * the values for comparison, but outputs original denormal */
-   x = __clc_flush_denormal_if_not_supported(x);
-   y = __clc_flush_denormal_if_not_supported(y);
-   return __builtin_fmaxf(x, y);
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, fmax, float, float)
-
-#ifdef cl_khr_fp64
-
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-_CLC_DEF _CLC_OVERLOAD double fmax(double x, double y)
-{
-   return __builtin_fmax(x, y);
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, fmax, double, double)
-
-#endif
-
-#define __CLC_BODY <../../../generic/lib/math/fmax.inc>
-#include <clc/math/gentype.inc>

diff  --git a/libclc/r600/lib/math/fmin.cl b/libclc/r600/lib/math/fmin.cl
deleted file mode 100644
index 343bce143380f..0000000000000
--- a/libclc/r600/lib/math/fmin.cl
+++ /dev/null
@@ -1,37 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// 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/clc.h>
-#include <clc/clcmacro.h>
-#include <clc/math/math.h>
-
-_CLC_DEF _CLC_OVERLOAD float fmin(float x, float y)
-{
-   /* fcanonicalize removes sNaNs and flushes denormals if not enabled.
-    * Otherwise fmin instruction flushes the values for comparison,
-    * but outputs original denormal */
-   x = __clc_flush_denormal_if_not_supported(x);
-   y = __clc_flush_denormal_if_not_supported(y);
-   return __builtin_fminf(x, y);
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, fmin, float, float)
-
-#ifdef cl_khr_fp64
-
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-_CLC_DEF _CLC_OVERLOAD double fmin(double x, double y)
-{
-   return __builtin_fmin(x, y);
-}
-_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, fmin, double, double)
-
-#endif
-
-#define __CLC_BODY <../../../generic/lib/math/fmin.inc>
-#include <clc/math/gentype.inc>


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to