Skip to content

Commit 3c95fc4

Browse files
authored
[SYCL] Make SYCL geometrical marray functions overloads instead of templates (#10048)
It was decided to change all built-in functions from templates to overloads. This patch changes marray part of "4.17.8. Geometric functions". Non-marray part: #10014 Spec: KhronosGroup/SYCL-Docs#428
1 parent 2ab99aa commit 3c95fc4

File tree

1 file changed

+97
-51
lines changed

1 file changed

+97
-51
lines changed

sycl/include/sycl/builtins.hpp

Lines changed: 97 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ template <class T, int N> marray<T, N> to_marray(vec<T, N> x) {
4848
namespace __sycl_std = __host_std;
4949
#endif
5050

51+
#define __SYCL_COMMA ,
52+
5153
#define __SYCL_DEF_BUILTIN_VEC(TYPE) \
5254
__SYCL_BUILTIN_DEF(TYPE##2) \
5355
__SYCL_BUILTIN_DEF(TYPE##3) \
@@ -64,6 +66,15 @@ namespace __sycl_std = __host_std;
6466
__SYCL_BUILTIN_DEF(TYPE##3) \
6567
__SYCL_BUILTIN_DEF(TYPE##4)
6668

69+
#define __SYCL_DEF_BUILTIN_GEOMARRAY(TYPE) \
70+
__SYCL_BUILTIN_DEF(marray<TYPE __SYCL_COMMA 2>) \
71+
__SYCL_BUILTIN_DEF(marray<TYPE __SYCL_COMMA 3>) \
72+
__SYCL_BUILTIN_DEF(marray<TYPE __SYCL_COMMA 4>)
73+
74+
#define __SYCL_DEF_BUILTIN_GEOCROSSMARRAY(TYPE) \
75+
__SYCL_BUILTIN_DEF(marray<TYPE __SYCL_COMMA 3>) \
76+
__SYCL_BUILTIN_DEF(marray<TYPE __SYCL_COMMA 4>)
77+
6778
#define __SYCL_DEF_BUILTIN_MARRAY(TYPE)
6879

6980
#define __SYCL_DEF_BUILTIN_CHAR_SCALAR __SYCL_BUILTIN_DEF(char)
@@ -259,6 +270,9 @@ namespace __sycl_std = __host_std;
259270
#define __SYCL_DEF_BUILTIN_FLOAT_SCALAR __SYCL_BUILTIN_DEF(float)
260271
#define __SYCL_DEF_BUILTIN_FLOAT_VEC __SYCL_DEF_BUILTIN_VEC(float)
261272
#define __SYCL_DEF_BUILTIN_FLOAT_GEOVEC __SYCL_DEF_BUILTIN_GEOVEC(float)
273+
#define __SYCL_DEF_BUILTIN_FLOAT_GEOCROSSMARRAY \
274+
__SYCL_DEF_BUILTIN_GEOCROSSMARRAY(float)
275+
#define __SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY __SYCL_DEF_BUILTIN_GEOMARRAY(float)
262276
#define __SYCL_DEF_BUILTIN_FLOAT_GEOCROSSVEC \
263277
__SYCL_DEF_BUILTIN_GEOCROSSVEC(float)
264278
#define __SYCL_DEF_BUILTIN_FLOAT_MARRAY __SYCL_DEF_BUILTIN_MARRAY(float)
@@ -275,6 +289,9 @@ namespace __sycl_std = __host_std;
275289
#define __SYCL_DEF_BUILTIN_DOUBLE_SCALAR __SYCL_BUILTIN_DEF(double)
276290
#define __SYCL_DEF_BUILTIN_DOUBLE_VEC __SYCL_DEF_BUILTIN_VEC(double)
277291
#define __SYCL_DEF_BUILTIN_DOUBLE_GEOVEC __SYCL_DEF_BUILTIN_GEOVEC(double)
292+
#define __SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSMARRAY \
293+
__SYCL_DEF_BUILTIN_GEOCROSSMARRAY(double)
294+
#define __SYCL_DEF_BUILTIN_DOUBLE_GEOMARRAY __SYCL_DEF_BUILTIN_GEOMARRAY(double)
278295
#define __SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSVEC \
279296
__SYCL_DEF_BUILTIN_GEOCROSSVEC(double)
280297
#define __SYCL_DEF_BUILTIN_DOUBLE_MARRAY __SYCL_DEF_BUILTIN_MARRAY(double)
@@ -291,6 +308,9 @@ namespace __sycl_std = __host_std;
291308
#define __SYCL_DEF_BUILTIN_HALF_SCALAR __SYCL_BUILTIN_DEF(half)
292309
#define __SYCL_DEF_BUILTIN_HALF_VEC __SYCL_DEF_BUILTIN_VEC(half)
293310
#define __SYCL_DEF_BUILTIN_HALF_GEOVEC __SYCL_DEF_BUILTIN_GEOVEC(half)
311+
#define __SYCL_DEF_BUILTIN_HALF_GEOCROSSMARRAY \
312+
__SYCL_DEF_BUILTIN_GEOCROSSMARRAY(half)
313+
#define __SYCL_DEF_BUILTIN_HALF_GEOMARRAY __SYCL_DEF_BUILTIN_GEOMARRAY(half)
294314
#define __SYCL_DEF_BUILTIN_HALF_GEOCROSSVEC __SYCL_DEF_BUILTIN_GEOCROSSVEC(half)
295315
#define __SYCL_DEF_BUILTIN_HALF_MARRAY __SYCL_DEF_BUILTIN_MARRAY(half)
296316
#define __SYCL_DEF_BUILTIN_HALFN \
@@ -323,6 +343,17 @@ namespace __sycl_std = __host_std;
323343
__SYCL_DEF_BUILTIN_GENGEOFLOATD \
324344
__SYCL_DEF_BUILTIN_GENGEOFLOATH
325345

346+
#define __SYCL_DEF_BUILTIN_GENGEOCROSSMARRAY \
347+
__SYCL_DEF_BUILTIN_FLOAT_GEOCROSSMARRAY \
348+
__SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSMARRAY \
349+
__SYCL_DEF_BUILTIN_HALF_GEOCROSSMARRAY
350+
351+
#define __SYCL_DEF_BUILTIN_GENGEOMARRAY \
352+
__SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY \
353+
__SYCL_DEF_BUILTIN_DOUBLE_GEOMARRAY \
354+
__SYCL_DEF_BUILTIN_HALF_GEOMARRAY
355+
356+
// TODO: Replace with overloads.
326357
#define __SYCL_DEF_BUILTIN_VGENGEOCROSSFLOAT \
327358
__SYCL_DEF_BUILTIN_FLOAT_GEOCROSSVEC \
328359
__SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSVEC \
@@ -2063,67 +2094,81 @@ __SYCL_DEF_BUILTIN_GENGEOFLOATF
20632094

20642095
// marray geometric functions
20652096

2066-
#define __SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL(NAME, ...) \
2067-
vec<detail::marray_element_t<T>, T::size()> result_v; \
2068-
result_v = NAME(__VA_ARGS__); \
2069-
return detail::to_marray(result_v);
2070-
2071-
template <typename T>
2072-
std::enable_if_t<detail::is_gencrossmarray<T>::value, T> cross(T p0,
2073-
T p1) __NOEXC {
2074-
__SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL(cross, detail::to_vec(p0),
2075-
detail::to_vec(p1))
2076-
}
2097+
// cross
2098+
#define __SYCL_BUILTIN_DEF(TYPE) \
2099+
inline TYPE cross(TYPE p0, TYPE p1) __NOEXC { \
2100+
return detail::to_marray(cross(detail::to_vec(p0), detail::to_vec(p1))); \
2101+
}
2102+
__SYCL_DEF_BUILTIN_GENGEOCROSSMARRAY
2103+
#undef __SYCL_BUILTIN_DEF
20772104

2078-
template <typename T>
2079-
std::enable_if_t<detail::is_gengeomarray<T>::value, T> normalize(T p) __NOEXC {
2080-
__SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL(normalize, detail::to_vec(p))
2081-
}
2105+
#undef __SYCL_DEF_BUILTIN_GENGEOCROSSMARRAY
2106+
#undef __SYCL_DEF_BUILTIN_HALF_GEOCROSSMARRAY
2107+
#undef __SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSMARRAY
2108+
#undef __SYCL_DEF_BUILTIN_FLOAT_GEOCROSSMARRAY
2109+
#undef __SYCL_DEF_BUILTIN_GEOCROSSMARRAY
20822110

2083-
template <typename T>
2084-
std::enable_if_t<detail::is_gengeomarrayfloat<T>::value, T>
2085-
fast_normalize(T p) __NOEXC {
2086-
__SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL(fast_normalize,
2087-
detail::to_vec(p))
2088-
}
2111+
// dot
2112+
#define __SYCL_BUILTIN_DEF(TYPE) \
2113+
inline TYPE::value_type dot(TYPE p0, TYPE p1) __NOEXC { \
2114+
return dot(detail::to_vec(p0), detail::to_vec(p1)); \
2115+
}
2116+
__SYCL_DEF_BUILTIN_GENGEOMARRAY
2117+
#undef __SYCL_BUILTIN_DEF
20892118

2090-
#undef __SYCL_MARRAY_GEOMETRIC_FUNCTION_OVERLOAD_IMPL
2119+
// distance
2120+
#define __SYCL_BUILTIN_DEF(TYPE) \
2121+
inline TYPE::value_type distance(TYPE p0, TYPE p1) __NOEXC { \
2122+
return distance(detail::to_vec(p0), detail::to_vec(p1)); \
2123+
}
2124+
__SYCL_DEF_BUILTIN_GENGEOMARRAY
2125+
#undef __SYCL_BUILTIN_DEF
20912126

2092-
#define __SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD(NAME) \
2093-
template <typename T> \
2094-
std::enable_if_t<detail::is_gengeomarray<T>::value, \
2095-
detail::marray_element_t<T>> \
2096-
NAME(T p0, T p1) __NOEXC { \
2097-
return NAME(detail::to_vec(p0), detail::to_vec(p1)); \
2127+
// length
2128+
#define __SYCL_BUILTIN_DEF(TYPE) \
2129+
inline TYPE::value_type length(TYPE p) __NOEXC { \
2130+
return length(detail::to_vec(p)); \
20982131
}
2132+
__SYCL_DEF_BUILTIN_GENGEOMARRAY
2133+
#undef __SYCL_BUILTIN_DEF
20992134

2100-
// clang-format off
2101-
__SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD(dot)
2102-
__SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD(distance)
2103-
// clang-format on
2135+
// normalize
2136+
#define __SYCL_BUILTIN_DEF(TYPE) \
2137+
inline TYPE normalize(TYPE p) __NOEXC { \
2138+
return detail::to_marray(normalize(detail::to_vec(p))); \
2139+
}
2140+
__SYCL_DEF_BUILTIN_GENGEOMARRAY
2141+
#undef __SYCL_BUILTIN_DEF
21042142

2105-
#undef __SYCL_MARRAY_GEOMETRIC_FUNCTION_IS_GENGEOMARRAY_BINOP_OVERLOAD
2143+
// fast_distance
2144+
#define __SYCL_BUILTIN_DEF(TYPE) \
2145+
inline float fast_distance(TYPE p0, TYPE p1) __NOEXC { \
2146+
return fast_distance(detail::to_vec(p0), detail::to_vec(p1)); \
2147+
}
2148+
__SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY
2149+
#undef __SYCL_BUILTIN_DEF
21062150

2107-
template <typename T>
2108-
std::enable_if_t<detail::is_gengeomarray<T>::value, detail::marray_element_t<T>>
2109-
length(T p) __NOEXC {
2110-
return __sycl_std::__invoke_length<detail::marray_element_t<T>>(
2111-
detail::to_vec(p));
2112-
}
2151+
// fast_normalize
2152+
#define __SYCL_BUILTIN_DEF(TYPE) \
2153+
inline TYPE fast_normalize(TYPE p) __NOEXC { \
2154+
return detail::to_marray(fast_normalize(detail::to_vec(p))); \
2155+
}
2156+
__SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY
2157+
#undef __SYCL_BUILTIN_DEF
21132158

2114-
template <typename T>
2115-
std::enable_if_t<detail::is_gengeomarrayfloat<T>::value,
2116-
detail::marray_element_t<T>>
2117-
fast_distance(T p0, T p1) __NOEXC {
2118-
return fast_distance(detail::to_vec(p0), detail::to_vec(p1));
2119-
}
2159+
// fast_length
2160+
#define __SYCL_BUILTIN_DEF(TYPE) \
2161+
inline float fast_length(TYPE p) __NOEXC { \
2162+
return fast_length(detail::to_vec(p)); \
2163+
}
2164+
__SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY
2165+
#undef __SYCL_BUILTIN_DEF
21202166

2121-
template <typename T>
2122-
std::enable_if_t<detail::is_gengeomarrayfloat<T>::value,
2123-
detail::marray_element_t<T>>
2124-
fast_length(T p) __NOEXC {
2125-
return fast_length(detail::to_vec(p));
2126-
}
2167+
#undef __SYCL_DEF_BUILTIN_GENGEOMARRAY
2168+
#undef __SYCL_DEF_BUILTIN_HALF_GEOMARRAY
2169+
#undef __SYCL_DEF_BUILTIN_DOUBLE_GEOMARRAY
2170+
#undef __SYCL_DEF_BUILTIN_FLOAT_GEOMARRAY
2171+
#undef __SYCL_DEF_BUILTIN_GEOMARRAY
21272172

21282173
/* SYCL 1.2.1 ---- 4.13.7 Relational functions. -----------------------------*/
21292174
/* SYCL 2020 ---- 4.17.9 Relational functions. -----------------------------*/
@@ -2924,6 +2969,7 @@ std::enable_if_t<detail::is_svgenfloatf<T>::value, T> tan(T x) __NOEXC {
29242969
#undef __SYCL_DEF_BUILTIN_FAST_MATH_GENFLOAT
29252970
#undef __SYCL_DEF_BUILTIN_SGENTYPE
29262971
#undef __SYCL_DEF_BUILTIN_GENTYPE
2972+
#undef __SYCL_COMMA
29272973
} // __SYCL_INLINE_VER_NAMESPACE(_V1)
29282974
} // namespace sycl
29292975

0 commit comments

Comments
 (0)