[libclc] [libclc] Move (fast) length & distance to CLC library (PR #139701)
Fraser Cormack via cfe-commits
cfe-commits at lists.llvm.org
Tue May 13 03:20:00 PDT 2025
https://github.com/frasercrmck created https://github.com/llvm/llvm-project/pull/139701
This commit also refactors how geometric builtins are defined and declared, by sharing more helpers. It also removes an unnecessary gentype-like helper in favour of the more complete math/gentype.inc.
There are no changes to the IR for any of these four builtins.
The 'normalize' builtin will follow in a subsequent commit because it would involve the addition of missing halfn-type overloads for completeness.
>From 0b08b0e3fe0befc2c10b66bd4c8efdab0f805e1a Mon Sep 17 00:00:00 2001
From: Fraser Cormack <fraser at codeplay.com>
Date: Mon, 14 Apr 2025 10:06:08 +0100
Subject: [PATCH] [libclc] Move (fast) length & distance to CLC library
This commit also refactors how geometric builtins are defined and
declared, by sharing more helpers. It also removes an unnecessary
gentype-like helper in favour of the more complete math/gentype.inc.
There are no changes to the IR for any of these four builtins.
The 'normalize' builtin will follow in a subsequent commit because it
would involve the addition of missing halfn-type overloads for
completeness.
---
.../clc/include/clc/geometric/binary_decl.inc | 16 +++
.../clc/include/clc/geometric/binary_def.inc | 24 ++++
.../clc/include/clc/geometric/clc_distance.h | 19 ++++
libclc/clc/include/clc/geometric/clc_dot.h | 8 +-
.../include/clc/geometric/clc_fast_distance.h | 21 ++++
.../include/clc/geometric/clc_fast_length.h | 21 ++++
.../include/clc/geometric/clc_length.h} | 12 +-
libclc/clc/include/clc/geometric/floatn.inc | 98 ----------------
.../clc/include/clc/geometric/unary_decl.inc | 21 ++++
.../clc/include/clc/geometric/unary_def.inc | 29 +++++
libclc/clc/lib/generic/SOURCES | 4 +
.../generic/geometric/clc_distance.cl} | 6 +-
.../lib/generic/geometric/clc_distance.inc} | 10 +-
.../generic/geometric/clc_fast_distance.cl} | 7 +-
.../generic/geometric/clc_fast_distance.inc} | 10 +-
.../lib/generic/geometric/clc_fast_length.cl | 28 +++++
.../lib/generic/geometric/clc_length.cl} | 9 +-
.../clc/lib/generic/geometric/clc_length.inc | 60 ++++++++++
.../generic/include/clc/geometric/distance.h | 8 +-
libclc/generic/include/clc/geometric/dot.h | 8 +-
.../include/clc/geometric/fast_distance.h | 8 +-
.../include/clc/geometric/fast_length.h | 8 +-
.../include/clc/geometric/fast_length.inc | 9 --
.../include/clc/geometric/fast_normalize.h | 10 +-
.../include/clc/geometric/fast_normalize.inc | 9 --
libclc/generic/include/clc/geometric/length.h | 8 +-
.../generic/include/clc/geometric/length.inc | 9 --
.../generic/include/clc/geometric/normalize.h | 10 +-
.../include/clc/geometric/normalize.inc | 9 --
libclc/generic/lib/geometric/distance.cl | 6 +-
libclc/generic/lib/geometric/fast_distance.cl | 7 +-
libclc/generic/lib/geometric/fast_length.cl | 20 +---
.../generic/lib/geometric/fast_normalize.cl | 2 +-
.../generic/lib/geometric/fast_normalize.inc | 10 +-
libclc/generic/lib/geometric/length.cl | 105 +-----------------
35 files changed, 365 insertions(+), 284 deletions(-)
create mode 100644 libclc/clc/include/clc/geometric/binary_decl.inc
create mode 100644 libclc/clc/include/clc/geometric/binary_def.inc
create mode 100644 libclc/clc/include/clc/geometric/clc_distance.h
create mode 100644 libclc/clc/include/clc/geometric/clc_fast_distance.h
create mode 100644 libclc/clc/include/clc/geometric/clc_fast_length.h
rename libclc/{generic/include/clc/geometric/dot.inc => clc/include/clc/geometric/clc_length.h} (58%)
delete mode 100644 libclc/clc/include/clc/geometric/floatn.inc
create mode 100644 libclc/clc/include/clc/geometric/unary_decl.inc
create mode 100644 libclc/clc/include/clc/geometric/unary_def.inc
rename libclc/clc/{include/clc/geometric/clc_dot.inc => lib/generic/geometric/clc_distance.cl} (72%)
rename libclc/{generic/lib/geometric/fast_distance.inc => clc/lib/generic/geometric/clc_distance.inc} (52%)
rename libclc/{generic/include/clc/geometric/fast_distance.inc => clc/lib/generic/geometric/clc_fast_distance.cl} (68%)
rename libclc/{generic/lib/geometric/distance.inc => clc/lib/generic/geometric/clc_fast_distance.inc} (56%)
create mode 100644 libclc/clc/lib/generic/geometric/clc_fast_length.cl
rename libclc/{generic/include/clc/geometric/distance.inc => clc/lib/generic/geometric/clc_length.cl} (61%)
create mode 100644 libclc/clc/lib/generic/geometric/clc_length.inc
delete mode 100644 libclc/generic/include/clc/geometric/fast_length.inc
delete mode 100644 libclc/generic/include/clc/geometric/fast_normalize.inc
delete mode 100644 libclc/generic/include/clc/geometric/length.inc
delete mode 100644 libclc/generic/include/clc/geometric/normalize.inc
diff --git a/libclc/clc/include/clc/geometric/binary_decl.inc b/libclc/clc/include/clc/geometric/binary_decl.inc
new file mode 100644
index 0000000000000..3f3aafdeae6c3
--- /dev/null
+++ b/libclc/clc/include/clc/geometric/binary_decl.inc
@@ -0,0 +1,16 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// Geometric functions are only defined for scalar, vec2, vec3 and vec4
+#if (__CLC_VECSIZE_OR_1 == 1 || __CLC_VECSIZE_OR_1 == 2 || \
+ __CLC_VECSIZE_OR_1 == 3 || __CLC_VECSIZE_OR_1 == 4)
+
+_CLC_OVERLOAD _CLC_DECL __CLC_SCALAR_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE a,
+ __CLC_GENTYPE b);
+
+#endif
diff --git a/libclc/clc/include/clc/geometric/binary_def.inc b/libclc/clc/include/clc/geometric/binary_def.inc
new file mode 100644
index 0000000000000..8fc875a052210
--- /dev/null
+++ b/libclc/clc/include/clc/geometric/binary_def.inc
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+
+// Geometric functions are only defined for scalar, vec2, vec3 and vec4
+#if (__CLC_VECSIZE_OR_1 == 1 || __CLC_VECSIZE_OR_1 == 2 || \
+ __CLC_VECSIZE_OR_1 == 3 || __CLC_VECSIZE_OR_1 == 4)
+
+_CLC_OVERLOAD _CLC_DEF __CLC_SCALAR_GENTYPE FUNCTION(__CLC_GENTYPE a,
+ __CLC_GENTYPE b) {
+ return __CLC_FUNCTION(FUNCTION)(a, b);
+}
+
+#endif
diff --git a/libclc/clc/include/clc/geometric/clc_distance.h b/libclc/clc/include/clc/geometric/clc_distance.h
new file mode 100644
index 0000000000000..1acea411a08b6
--- /dev/null
+++ b/libclc/clc/include/clc/geometric/clc_distance.h
@@ -0,0 +1,19 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_GEOMETRIC_CLC_DISTANCE_H__
+#define __CLC_GEOMETRIC_CLC_DISTANCE_H__
+
+#define __CLC_FUNCTION __clc_distance
+#define __CLC_BODY <clc/geometric/binary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_FUNCTION
+
+#endif // __CLC_GEOMETRIC_CLC_DISTANCE_H__
diff --git a/libclc/clc/include/clc/geometric/clc_dot.h b/libclc/clc/include/clc/geometric/clc_dot.h
index 7ef9ccab3771e..a5a97d1bdd2bc 100644
--- a/libclc/clc/include/clc/geometric/clc_dot.h
+++ b/libclc/clc/include/clc/geometric/clc_dot.h
@@ -9,7 +9,11 @@
#ifndef __CLC_GEOMETRIC_CLC_DOT_H__
#define __CLC_GEOMETRIC_CLC_DOT_H__
-#define __CLC_BODY <clc/geometric/clc_dot.inc>
-#include <clc/geometric/floatn.inc>
+#define __CLC_FUNCTION __clc_dot
+#define __CLC_BODY <clc/geometric/binary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_FUNCTION
#endif // __CLC_GEOMETRIC_CLC_DOT_H__
diff --git a/libclc/clc/include/clc/geometric/clc_fast_distance.h b/libclc/clc/include/clc/geometric/clc_fast_distance.h
new file mode 100644
index 0000000000000..489bea4299516
--- /dev/null
+++ b/libclc/clc/include/clc/geometric/clc_fast_distance.h
@@ -0,0 +1,21 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_GEOMETRIC_CLC_FAST_DISTANCE_H__
+#define __CLC_GEOMETRIC_CLC_FAST_DISTANCE_H__
+
+#define __FLOAT_ONLY
+#define __CLC_FUNCTION __clc_fast_distance
+#define __CLC_BODY <clc/geometric/binary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __FLOAT_ONLY
+#undef __CLC_FUNCTION
+
+#endif // __CLC_GEOMETRIC_CLC_FAST_DISTANCE_H__
diff --git a/libclc/clc/include/clc/geometric/clc_fast_length.h b/libclc/clc/include/clc/geometric/clc_fast_length.h
new file mode 100644
index 0000000000000..40552634fff94
--- /dev/null
+++ b/libclc/clc/include/clc/geometric/clc_fast_length.h
@@ -0,0 +1,21 @@
+//===----------------------------------------------------------------------===//
+//
+// 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_GEOMETRIC_CLC_FAST_LENGTH_H__
+#define __CLC_GEOMETRIC_CLC_FAST_LENGTH_H__
+
+#define __FLOAT_ONLY
+#define __CLC_FUNCTION __clc_fast_length
+#define __CLC_BODY <clc/geometric/unary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __FLOAT_ONLY
+#undef __CLC_FUNCTION
+
+#endif // __CLC_GEOMETRIC_CLC_FAST_LENGTH_H__
diff --git a/libclc/generic/include/clc/geometric/dot.inc b/libclc/clc/include/clc/geometric/clc_length.h
similarity index 58%
rename from libclc/generic/include/clc/geometric/dot.inc
rename to libclc/clc/include/clc/geometric/clc_length.h
index de3882b2f50db..f8ce12db07871 100644
--- a/libclc/generic/include/clc/geometric/dot.inc
+++ b/libclc/clc/include/clc/geometric/clc_length.h
@@ -6,4 +6,14 @@
//
//===----------------------------------------------------------------------===//
-_CLC_OVERLOAD _CLC_DECL __CLC_FLOAT dot(__CLC_FLOATN p0, __CLC_FLOATN p1);
+#ifndef __CLC_GEOMETRIC_CLC_LENGTH_H__
+#define __CLC_GEOMETRIC_CLC_LENGTH_H__
+
+#define __CLC_FUNCTION __clc_length
+#define __CLC_BODY <clc/geometric/unary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_FUNCTION
+
+#endif // __CLC_GEOMETRIC_CLC_LENGTH_H__
diff --git a/libclc/clc/include/clc/geometric/floatn.inc b/libclc/clc/include/clc/geometric/floatn.inc
deleted file mode 100644
index cc7ee248efd4d..0000000000000
--- a/libclc/clc/include/clc/geometric/floatn.inc
+++ /dev/null
@@ -1,98 +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/clcfunc.h>
-#include <clc/clctypes.h>
-
-#define __CLC_FLOAT float
-#define __CLC_FPSIZE 32
-
-#define __CLC_FLOATN float
-#define __CLC_SCALAR
-#include __CLC_BODY
-#undef __CLC_FLOATN
-#undef __CLC_SCALAR
-
-#define __CLC_FLOATN float2
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN float3
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN float4
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#undef __CLC_FLOAT
-#undef __CLC_FPSIZE
-
-#ifndef __FLOAT_ONLY
-#ifdef cl_khr_fp64
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-#define __CLC_FLOAT double
-#define __CLC_FPSIZE 64
-
-#define __CLC_FLOATN double
-#define __CLC_SCALAR
-#include __CLC_BODY
-#undef __CLC_FLOATN
-#undef __CLC_SCALAR
-
-#define __CLC_FLOATN double2
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN double3
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN double4
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#undef __CLC_FLOAT
-#undef __CLC_FPSIZE
-
-#endif
-#endif
-
-#ifndef __FLOAT_ONLY
-#ifdef cl_khr_fp16
-#pragma OPENCL EXTENSION cl_khr_fp16 : enable
-
-#define __CLC_FLOAT half
-#define __CLC_FPSIZE 16
-
-#define __CLC_FLOATN half
-#define __CLC_SCALAR
-#include __CLC_BODY
-#undef __CLC_FLOATN
-#undef __CLC_SCALAR
-
-#define __CLC_FLOATN half2
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN half3
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#define __CLC_FLOATN half4
-#include __CLC_BODY
-#undef __CLC_FLOATN
-
-#undef __CLC_FLOAT
-#undef __CLC_FPSIZE
-
-#endif
-#endif
-
-#undef __CLC_BODY
diff --git a/libclc/clc/include/clc/geometric/unary_decl.inc b/libclc/clc/include/clc/geometric/unary_decl.inc
new file mode 100644
index 0000000000000..6da16d2e8abf8
--- /dev/null
+++ b/libclc/clc/include/clc/geometric/unary_decl.inc
@@ -0,0 +1,21 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+// Geometric functions are only defined for scalar, vec2, vec3 and vec4
+#if (__CLC_VECSIZE_OR_1 == 1 || __CLC_VECSIZE_OR_1 == 2 || \
+ __CLC_VECSIZE_OR_1 == 3 || __CLC_VECSIZE_OR_1 == 4)
+
+_CLC_OVERLOAD _CLC_DECL
+#ifdef __CLC_GEOMETRIC_RET_GENTYPE
+ __CLC_GENTYPE
+#else
+ __CLC_SCALAR_GENTYPE
+#endif
+ __CLC_FUNCTION(__CLC_GENTYPE a);
+
+#endif
diff --git a/libclc/clc/include/clc/geometric/unary_def.inc b/libclc/clc/include/clc/geometric/unary_def.inc
new file mode 100644
index 0000000000000..5bedefb662765
--- /dev/null
+++ b/libclc/clc/include/clc/geometric/unary_def.inc
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// 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
+
+// Geometric functions are only defined for scalar, vec2, vec3 and vec4
+#if (__CLC_VECSIZE_OR_1 == 1 || __CLC_VECSIZE_OR_1 == 2 || \
+ __CLC_VECSIZE_OR_1 == 3 || __CLC_VECSIZE_OR_1 == 4)
+
+_CLC_OVERLOAD _CLC_DEF
+#ifdef __CLC_GEOMETRIC_RET_GENTYPE
+ __CLC_GENTYPE
+#else
+ __CLC_SCALAR_GENTYPE
+#endif
+ FUNCTION(__CLC_GENTYPE a) {
+ return __CLC_FUNCTION(FUNCTION)(a);
+}
+
+#endif
diff --git a/libclc/clc/lib/generic/SOURCES b/libclc/clc/lib/generic/SOURCES
index 2fffc5bbe7afd..16f1c0fc6998e 100644
--- a/libclc/clc/lib/generic/SOURCES
+++ b/libclc/clc/lib/generic/SOURCES
@@ -2,7 +2,11 @@ common/clc_degrees.cl
common/clc_radians.cl
common/clc_sign.cl
common/clc_smoothstep.cl
+geometric/clc_distance.cl
geometric/clc_dot.cl
+geometric/clc_fast_distance.cl
+geometric/clc_fast_length.cl
+geometric/clc_length.cl
integer/clc_abs.cl
integer/clc_abs_diff.cl
integer/clc_add_sat.cl
diff --git a/libclc/clc/include/clc/geometric/clc_dot.inc b/libclc/clc/lib/generic/geometric/clc_distance.cl
similarity index 72%
rename from libclc/clc/include/clc/geometric/clc_dot.inc
rename to libclc/clc/lib/generic/geometric/clc_distance.cl
index 8636f687ec7cb..54bd437fe2268 100644
--- a/libclc/clc/include/clc/geometric/clc_dot.inc
+++ b/libclc/clc/lib/generic/geometric/clc_distance.cl
@@ -6,4 +6,8 @@
//
//===----------------------------------------------------------------------===//
-_CLC_OVERLOAD _CLC_DECL __CLC_FLOAT __clc_dot(__CLC_FLOATN p0, __CLC_FLOATN p1);
+#include <clc/internal/clc.h>
+#include <clc/geometric/clc_length.h>
+
+#define __CLC_BODY <clc_distance.inc>
+#include <clc/math/gentype.inc>
diff --git a/libclc/generic/lib/geometric/fast_distance.inc b/libclc/clc/lib/generic/geometric/clc_distance.inc
similarity index 52%
rename from libclc/generic/lib/geometric/fast_distance.inc
rename to libclc/clc/lib/generic/geometric/clc_distance.inc
index c7c4f0d442263..89f74a6233afd 100644
--- a/libclc/generic/lib/geometric/fast_distance.inc
+++ b/libclc/clc/lib/generic/geometric/clc_distance.inc
@@ -6,6 +6,12 @@
//
//===----------------------------------------------------------------------===//
-_CLC_OVERLOAD _CLC_DEF __CLC_FLOAT fast_distance(__CLC_FLOATN p0, __CLC_FLOATN p1) {
- return fast_length(p0 - p1);
+#if (__CLC_VECSIZE_OR_1 == 1 || __CLC_VECSIZE_OR_1 == 2 || \
+ __CLC_VECSIZE_OR_1 == 3 || __CLC_VECSIZE_OR_1 == 4)
+
+_CLC_OVERLOAD _CLC_DEF __CLC_SCALAR_GENTYPE __clc_distance(__CLC_GENTYPE p0,
+ __CLC_GENTYPE p1) {
+ return __clc_length(p0 - p1);
}
+
+#endif
diff --git a/libclc/generic/include/clc/geometric/fast_distance.inc b/libclc/clc/lib/generic/geometric/clc_fast_distance.cl
similarity index 68%
rename from libclc/generic/include/clc/geometric/fast_distance.inc
rename to libclc/clc/lib/generic/geometric/clc_fast_distance.cl
index 118fb5c1e65a3..bf74f93c535bc 100644
--- a/libclc/generic/include/clc/geometric/fast_distance.inc
+++ b/libclc/clc/lib/generic/geometric/clc_fast_distance.cl
@@ -6,4 +6,9 @@
//
//===----------------------------------------------------------------------===//
-_CLC_OVERLOAD _CLC_DECL __CLC_FLOAT fast_distance(__CLC_FLOATN p0, __CLC_FLOATN p1);
+#include <clc/internal/clc.h>
+#include <clc/geometric/clc_fast_length.h>
+
+#define __FLOAT_ONLY
+#define __CLC_BODY <clc_fast_distance.inc>
+#include <clc/math/gentype.inc>
diff --git a/libclc/generic/lib/geometric/distance.inc b/libclc/clc/lib/generic/geometric/clc_fast_distance.inc
similarity index 56%
rename from libclc/generic/lib/geometric/distance.inc
rename to libclc/clc/lib/generic/geometric/clc_fast_distance.inc
index a65ad896fdd08..68f71d8bb3a7c 100644
--- a/libclc/generic/lib/geometric/distance.inc
+++ b/libclc/clc/lib/generic/geometric/clc_fast_distance.inc
@@ -6,6 +6,12 @@
//
//===----------------------------------------------------------------------===//
-_CLC_OVERLOAD _CLC_DEF __CLC_FLOAT distance(__CLC_FLOATN p0, __CLC_FLOATN p1) {
- return length(p0 - p1);
+#if (__CLC_VECSIZE_OR_1 == 1 || __CLC_VECSIZE_OR_1 == 2 || \
+ __CLC_VECSIZE_OR_1 == 3 || __CLC_VECSIZE_OR_1 == 4)
+
+_CLC_OVERLOAD _CLC_DEF __CLC_SCALAR_GENTYPE
+__clc_fast_distance(__CLC_GENTYPE p0, __CLC_GENTYPE p1) {
+ return __clc_fast_length(p0 - p1);
}
+
+#endif
diff --git a/libclc/clc/lib/generic/geometric/clc_fast_length.cl b/libclc/clc/lib/generic/geometric/clc_fast_length.cl
new file mode 100644
index 0000000000000..ce6ec5283e524
--- /dev/null
+++ b/libclc/clc/lib/generic/geometric/clc_fast_length.cl
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// 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/geometric/clc_dot.h>
+#include <clc/internal/clc.h>
+#include <clc/math/clc_fabs.h>
+#include <clc/math/clc_half_sqrt.h>
+
+_CLC_OVERLOAD _CLC_DEF float __clc_fast_length(float p) {
+ return __clc_fabs(p);
+}
+
+_CLC_OVERLOAD _CLC_DEF float __clc_fast_length(float2 p) {
+ return __clc_half_sqrt(__clc_dot(p, p));
+}
+
+_CLC_OVERLOAD _CLC_DEF float __clc_fast_length(float3 p) {
+ return __clc_half_sqrt(__clc_dot(p, p));
+}
+
+_CLC_OVERLOAD _CLC_DEF float __clc_fast_length(float4 p) {
+ return __clc_half_sqrt(__clc_dot(p, p));
+}
diff --git a/libclc/generic/include/clc/geometric/distance.inc b/libclc/clc/lib/generic/geometric/clc_length.cl
similarity index 61%
rename from libclc/generic/include/clc/geometric/distance.inc
rename to libclc/clc/lib/generic/geometric/clc_length.cl
index 713586079796e..d9a9166b92ae7 100644
--- a/libclc/generic/include/clc/geometric/distance.inc
+++ b/libclc/clc/lib/generic/geometric/clc_length.cl
@@ -6,4 +6,11 @@
//
//===----------------------------------------------------------------------===//
-_CLC_OVERLOAD _CLC_DECL __CLC_FLOAT distance(__CLC_FLOATN p0, __CLC_FLOATN p1);
+#include <clc/float/definitions.h>
+#include <clc/geometric/clc_dot.h>
+#include <clc/internal/clc.h>
+#include <clc/math/clc_fabs.h>
+#include <clc/math/clc_sqrt.h>
+
+#define __CLC_BODY <clc_length.inc>
+#include <clc/math/gentype.inc>
diff --git a/libclc/clc/lib/generic/geometric/clc_length.inc b/libclc/clc/lib/generic/geometric/clc_length.inc
new file mode 100644
index 0000000000000..f8d611c778aae
--- /dev/null
+++ b/libclc/clc/lib/generic/geometric/clc_length.inc
@@ -0,0 +1,60 @@
+//===----------------------------------------------------------------------===//
+//
+// 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 __CLC_VECSIZE_OR_1 == 1
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE __clc_length(__CLC_GENTYPE p) {
+ return __clc_fabs(p);
+}
+
+#elif (__CLC_VECSIZE_OR_1 == 2 || __CLC_VECSIZE_OR_1 == 3 || \
+ __CLC_VECSIZE_OR_1 == 4)
+
+#if __CLC_FPSIZE == 32
+#define __CLC_GENTYPE_MIN FLT_MIN
+#define __CLC_GENTYPE_MIN_SCALE_UP 0x1.0p+86F
+#define __CLC_GENTYPE_MIN_SCALE_DOWN 0x1.0p-86F
+#define __CLC_GENTYPE_INF_SCALE_UP 0x1.0p+65F
+#define __CLC_GENTYPE_INF_SCALE_DOWN 0x1.0p-65F
+#elif __CLC_FPSIZE == 64
+#define __CLC_GENTYPE_MIN DBL_MIN
+#define __CLC_GENTYPE_MIN_SCALE_UP 0x1.0p+563
+#define __CLC_GENTYPE_MIN_SCALE_DOWN 0x1.0p-563
+#define __CLC_GENTYPE_INF_SCALE_UP 0x1.0p+513
+#define __CLC_GENTYPE_INF_SCALE_DOWN 0x1.0p-513
+#elif __CLC_FPSIZE == 16
+#define __CLC_GENTYPE_MIN HALF_MIN
+#define __CLC_GENTYPE_MIN_SCALE_UP 0x1.0p+12H
+#define __CLC_GENTYPE_MIN_SCALE_DOWN 0x1.0p-12H
+#define __CLC_GENTYPE_INF_SCALE_UP 0x1.0p+7H
+#define __CLC_GENTYPE_INF_SCALE_DOWN 0x1.0p-7H
+#else
+#error "Unsupported FP size"
+#endif
+
+_CLC_OVERLOAD _CLC_DEF __CLC_SCALAR_GENTYPE __clc_length(__CLC_GENTYPE p) {
+ __CLC_SCALAR_GENTYPE l2 = __clc_dot(p, p);
+
+ if (l2 < __CLC_GENTYPE_MIN) {
+ p *= __CLC_GENTYPE_MIN_SCALE_UP;
+ return __clc_sqrt(__clc_dot(p, p)) * __CLC_GENTYPE_MIN_SCALE_DOWN;
+ } else if (l2 == INFINITY) {
+ p *= __CLC_GENTYPE_INF_SCALE_DOWN;
+ return __clc_sqrt(__clc_dot(p, p)) * __CLC_GENTYPE_INF_SCALE_UP;
+ }
+
+ return __clc_sqrt(l2);
+}
+
+#undef __CLC_GENTYPE_INF_SCALE_DOWN
+#undef __CLC_GENTYPE_INF_SCALE_UP
+#undef __CLC_GENTYPE_MIN_SCALE_DOWN
+#undef __CLC_GENTYPE_MIN_SCALE_UP
+#undef __CLC_GENTYPE_MIN
+
+#endif
diff --git a/libclc/generic/include/clc/geometric/distance.h b/libclc/generic/include/clc/geometric/distance.h
index 5101ee76ee878..28ec8274302ef 100644
--- a/libclc/generic/include/clc/geometric/distance.h
+++ b/libclc/generic/include/clc/geometric/distance.h
@@ -6,5 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#define __CLC_BODY <clc/geometric/distance.inc>
-#include <clc/geometric/floatn.inc>
+#define __CLC_FUNCTION distance
+#define __CLC_BODY <clc/geometric/binary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_FUNCTION
diff --git a/libclc/generic/include/clc/geometric/dot.h b/libclc/generic/include/clc/geometric/dot.h
index 95141d0d97dab..92d5b56d2e067 100644
--- a/libclc/generic/include/clc/geometric/dot.h
+++ b/libclc/generic/include/clc/geometric/dot.h
@@ -6,5 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#define __CLC_BODY <clc/geometric/dot.inc>
-#include <clc/geometric/floatn.inc>
+#define __CLC_FUNCTION dot
+#define __CLC_BODY <clc/geometric/binary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_FUNCTION
diff --git a/libclc/generic/include/clc/geometric/fast_distance.h b/libclc/generic/include/clc/geometric/fast_distance.h
index c9ac8eb47a14c..ef401fdf7289f 100644
--- a/libclc/generic/include/clc/geometric/fast_distance.h
+++ b/libclc/generic/include/clc/geometric/fast_distance.h
@@ -6,7 +6,11 @@
//
//===----------------------------------------------------------------------===//
-#define __CLC_BODY <clc/geometric/fast_distance.inc>
#define __FLOAT_ONLY
-#include <clc/geometric/floatn.inc>
+#define __CLC_FUNCTION fast_distance
+#define __CLC_BODY <clc/geometric/binary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
#undef __FLOAT_ONLY
+#undef __CLC_FUNCTION
diff --git a/libclc/generic/include/clc/geometric/fast_length.h b/libclc/generic/include/clc/geometric/fast_length.h
index df658929999a8..b6fba6a8ca30c 100644
--- a/libclc/generic/include/clc/geometric/fast_length.h
+++ b/libclc/generic/include/clc/geometric/fast_length.h
@@ -6,7 +6,11 @@
//
//===----------------------------------------------------------------------===//
-#define __CLC_BODY <clc/geometric/fast_length.inc>
#define __FLOAT_ONLY
-#include <clc/geometric/floatn.inc>
+#define __CLC_FUNCTION fast_length
+#define __CLC_BODY <clc/geometric/unary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
#undef __FLOAT_ONLY
+#undef __CLC_FUNCTION
diff --git a/libclc/generic/include/clc/geometric/fast_length.inc b/libclc/generic/include/clc/geometric/fast_length.inc
deleted file mode 100644
index beb4b2fe75b86..0000000000000
--- a/libclc/generic/include/clc/geometric/fast_length.inc
+++ /dev/null
@@ -1,9 +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
-//
-//===----------------------------------------------------------------------===//
-
-_CLC_OVERLOAD _CLC_DECL __CLC_FLOAT fast_length(__CLC_FLOATN p0);
diff --git a/libclc/generic/include/clc/geometric/fast_normalize.h b/libclc/generic/include/clc/geometric/fast_normalize.h
index a249ca3d01b8c..1af81c66973b7 100644
--- a/libclc/generic/include/clc/geometric/fast_normalize.h
+++ b/libclc/generic/include/clc/geometric/fast_normalize.h
@@ -6,7 +6,13 @@
//
//===----------------------------------------------------------------------===//
-#define __CLC_BODY <clc/geometric/fast_normalize.inc>
#define __FLOAT_ONLY
-#include <clc/geometric/floatn.inc>
+#define __CLC_FUNCTION fast_normalize
+#define __CLC_GEOMETRIC_RET_GENTYPE
+#define __CLC_BODY <clc/geometric/unary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_FUNCTION
+#undef __CLC_GEOMETRIC_RET_GENTYPE
#undef __FLOAT_ONLY
diff --git a/libclc/generic/include/clc/geometric/fast_normalize.inc b/libclc/generic/include/clc/geometric/fast_normalize.inc
deleted file mode 100644
index b0f4111937ad0..0000000000000
--- a/libclc/generic/include/clc/geometric/fast_normalize.inc
+++ /dev/null
@@ -1,9 +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
-//
-//===----------------------------------------------------------------------===//
-
-_CLC_OVERLOAD _CLC_DECL __CLC_FLOATN fast_normalize(__CLC_FLOATN p);
diff --git a/libclc/generic/include/clc/geometric/length.h b/libclc/generic/include/clc/geometric/length.h
index 2ee860fd2aa64..2105a8f8cece0 100644
--- a/libclc/generic/include/clc/geometric/length.h
+++ b/libclc/generic/include/clc/geometric/length.h
@@ -6,5 +6,9 @@
//
//===----------------------------------------------------------------------===//
-#define __CLC_BODY <clc/geometric/length.inc>
-#include <clc/geometric/floatn.inc>
+#define __CLC_FUNCTION length
+#define __CLC_BODY <clc/geometric/unary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_FUNCTION
diff --git a/libclc/generic/include/clc/geometric/length.inc b/libclc/generic/include/clc/geometric/length.inc
deleted file mode 100644
index 5b563fd343d98..0000000000000
--- a/libclc/generic/include/clc/geometric/length.inc
+++ /dev/null
@@ -1,9 +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
-//
-//===----------------------------------------------------------------------===//
-
-_CLC_OVERLOAD _CLC_DECL __CLC_FLOAT length(__CLC_FLOATN p0);
diff --git a/libclc/generic/include/clc/geometric/normalize.h b/libclc/generic/include/clc/geometric/normalize.h
index c9a499bb31e7e..a15b7003329b5 100644
--- a/libclc/generic/include/clc/geometric/normalize.h
+++ b/libclc/generic/include/clc/geometric/normalize.h
@@ -6,5 +6,11 @@
//
//===----------------------------------------------------------------------===//
-#define __CLC_BODY <clc/geometric/normalize.inc>
-#include <clc/geometric/floatn.inc>
+#define __CLC_FUNCTION normalize
+#define __CLC_GEOMETRIC_RET_GENTYPE
+#define __CLC_BODY <clc/geometric/unary_decl.inc>
+
+#include <clc/math/gentype.inc>
+
+#undef __CLC_GEOMETRIC_RET_GENTYPE
+#undef __CLC_FUNCTION
diff --git a/libclc/generic/include/clc/geometric/normalize.inc b/libclc/generic/include/clc/geometric/normalize.inc
deleted file mode 100644
index a592d8a721cd4..0000000000000
--- a/libclc/generic/include/clc/geometric/normalize.inc
+++ /dev/null
@@ -1,9 +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
-//
-//===----------------------------------------------------------------------===//
-
-_CLC_OVERLOAD _CLC_DECL __CLC_FLOATN normalize(__CLC_FLOATN p);
diff --git a/libclc/generic/lib/geometric/distance.cl b/libclc/generic/lib/geometric/distance.cl
index 2101e5071fbad..2416ad1352aaf 100644
--- a/libclc/generic/lib/geometric/distance.cl
+++ b/libclc/generic/lib/geometric/distance.cl
@@ -7,6 +7,8 @@
//===----------------------------------------------------------------------===//
#include <clc/clc.h>
+#include <clc/geometric/clc_distance.h>
-#define __CLC_BODY <distance.inc>
-#include <clc/geometric/floatn.inc>
+#define FUNCTION distance
+#define __CLC_BODY <clc/geometric/binary_def.inc>
+#include <clc/math/gentype.inc>
diff --git a/libclc/generic/lib/geometric/fast_distance.cl b/libclc/generic/lib/geometric/fast_distance.cl
index 5c1cedf95f1d4..589c79496506e 100644
--- a/libclc/generic/lib/geometric/fast_distance.cl
+++ b/libclc/generic/lib/geometric/fast_distance.cl
@@ -7,8 +7,9 @@
//===----------------------------------------------------------------------===//
#include <clc/clc.h>
+#include <clc/geometric/clc_fast_distance.h>
-#define __CLC_BODY <fast_distance.inc>
#define __FLOAT_ONLY
-#include <clc/geometric/floatn.inc>
-#undef __FLOAT_ONLY
+#define FUNCTION fast_distance
+#define __CLC_BODY <clc/geometric/binary_def.inc>
+#include <clc/math/gentype.inc>
diff --git a/libclc/generic/lib/geometric/fast_length.cl b/libclc/generic/lib/geometric/fast_length.cl
index 53a1a1e84a8d1..11e8172998053 100644
--- a/libclc/generic/lib/geometric/fast_length.cl
+++ b/libclc/generic/lib/geometric/fast_length.cl
@@ -7,19 +7,9 @@
//===----------------------------------------------------------------------===//
#include <clc/clc.h>
+#include <clc/geometric/clc_fast_length.h>
-_CLC_OVERLOAD _CLC_DEF float fast_length(float p) {
- return fabs(p);
-}
-
-_CLC_OVERLOAD _CLC_DEF float fast_length(float2 p) {
- return half_sqrt(dot(p, p));
-}
-
-_CLC_OVERLOAD _CLC_DEF float fast_length(float3 p) {
- return half_sqrt(dot(p, p));
-}
-
-_CLC_OVERLOAD _CLC_DEF float fast_length(float4 p) {
- return half_sqrt(dot(p, p));
-}
+#define __FLOAT_ONLY
+#define FUNCTION fast_length
+#define __CLC_BODY <clc/geometric/unary_def.inc>
+#include <clc/math/gentype.inc>
diff --git a/libclc/generic/lib/geometric/fast_normalize.cl b/libclc/generic/lib/geometric/fast_normalize.cl
index fddcd3f8f5e42..585400d2200fd 100644
--- a/libclc/generic/lib/geometric/fast_normalize.cl
+++ b/libclc/generic/lib/geometric/fast_normalize.cl
@@ -14,5 +14,5 @@ _CLC_OVERLOAD _CLC_DEF float fast_normalize(float p) {
#define __CLC_BODY <fast_normalize.inc>
#define __FLOAT_ONLY
-#include <clc/geometric/floatn.inc>
+#include <clc/math/gentype.inc>
#undef __FLOAT_ONLY
diff --git a/libclc/generic/lib/geometric/fast_normalize.inc b/libclc/generic/lib/geometric/fast_normalize.inc
index f4f8c9f1f5c92..ec1be94efc279 100644
--- a/libclc/generic/lib/geometric/fast_normalize.inc
+++ b/libclc/generic/lib/geometric/fast_normalize.inc
@@ -6,11 +6,13 @@
//
//===----------------------------------------------------------------------===//
-#ifndef __CLC_SCALAR
-
+// Geometric functions are only defined for scalar, vec2, vec3 and vec4
// Only handle vector implementations
-_CLC_OVERLOAD _CLC_DEF __CLC_FLOATN fast_normalize(__CLC_FLOATN p) {
- __CLC_FLOAT l2 = dot(p, p);
+#if (__CLC_VECSIZE_OR_1 == 2 || __CLC_VECSIZE_OR_1 == 3 || \
+ __CLC_VECSIZE_OR_1 == 4)
+
+_CLC_OVERLOAD _CLC_DEF __CLC_GENTYPE fast_normalize(__CLC_GENTYPE p) {
+ __CLC_SCALAR_GENTYPE l2 = dot(p, p);
return l2 == 0.0f ? p : p * half_rsqrt(l2);
}
diff --git a/libclc/generic/lib/geometric/length.cl b/libclc/generic/lib/geometric/length.cl
index 93db505b740cd..3a4e286e9a0fb 100644
--- a/libclc/generic/lib/geometric/length.cl
+++ b/libclc/generic/lib/geometric/length.cl
@@ -7,105 +7,8 @@
//===----------------------------------------------------------------------===//
#include <clc/clc.h>
+#include <clc/geometric/clc_length.h>
-_CLC_OVERLOAD _CLC_DEF float length(float p) {
- return fabs(p);
-}
-
-#define V_FLENGTH(p) \
- float l2 = dot(p, p); \
- \
- if (l2 < FLT_MIN) { \
- p *= 0x1.0p+86F; \
- return sqrt(dot(p, p)) * 0x1.0p-86F; \
- } else if (l2 == INFINITY) { \
- p *= 0x1.0p-65F; \
- return sqrt(dot(p, p)) * 0x1.0p+65F; \
- } \
- \
- return sqrt(l2);
-
-_CLC_OVERLOAD _CLC_DEF float length(float2 p) {
- V_FLENGTH(p);
-}
-
-_CLC_OVERLOAD _CLC_DEF float length(float3 p) {
- V_FLENGTH(p);
-}
-
-_CLC_OVERLOAD _CLC_DEF float length(float4 p) {
- V_FLENGTH(p);
-}
-
-#ifdef cl_khr_fp64
-#pragma OPENCL EXTENSION cl_khr_fp64 : enable
-
-_CLC_OVERLOAD _CLC_DEF double length(double p){
- return fabs(p);
-}
-
-#define V_DLENGTH(p) \
- double l2 = dot(p, p); \
- \
- if (l2 < DBL_MIN) { \
- p *= 0x1.0p+563; \
- return sqrt(dot(p, p)) * 0x1.0p-563; \
- } else if (l2 == INFINITY) { \
- p *= 0x1.0p-513; \
- return sqrt(dot(p, p)) * 0x1.0p+513; \
- } \
- \
- return sqrt(l2);
-
-_CLC_OVERLOAD _CLC_DEF double length(double2 p) {
- V_DLENGTH(p);
-}
-
-_CLC_OVERLOAD _CLC_DEF double length(double3 p) {
- V_DLENGTH(p);
-}
-
-_CLC_OVERLOAD _CLC_DEF double length(double4 p) {
- V_DLENGTH(p);
-}
-
-#endif
-
-#ifdef cl_khr_fp16
-#pragma OPENCL EXTENSION cl_khr_fp16 : enable
-
-_CLC_OVERLOAD _CLC_DEF half length(half p){
- return fabs(p);
-}
-
-// Only available in CLC1.2
-#ifndef HALF_MIN
-#define HALF_MIN 0x1.0p-14h
-#endif
-
-#define V_HLENGTH(p) \
- half l2 = dot(p, p); \
- \
- if (l2 < HALF_MIN) { \
- p *= 0x1.0p+12h; \
- return sqrt(dot(p, p)) * 0x1.0p-12h; \
- } else if (l2 == INFINITY) { \
- p *= 0x1.0p-7h; \
- return sqrt(dot(p, p)) * 0x1.0p+7h; \
- } \
- \
- return sqrt(l2);
-
-_CLC_OVERLOAD _CLC_DEF half length(half2 p) {
- V_HLENGTH(p);
-}
-
-_CLC_OVERLOAD _CLC_DEF half length(half3 p) {
- V_HLENGTH(p);
-}
-
-_CLC_OVERLOAD _CLC_DEF half length(half4 p) {
- V_HLENGTH(p);
-}
-
-#endif
+#define FUNCTION length
+#define __CLC_BODY <clc/geometric/unary_def.inc>
+#include <clc/math/gentype.inc>
More information about the cfe-commits
mailing list