Skip to content

Commit 49bbcbf

Browse files
[SYCL] Make SYCL geometrical functions overloads instead of templates (#10014)
It was decided to change all built-in functions from templates to overloads. This patch changes non-marray part of "4.17.8. Geometric functions". Marray part: #10048 Spec: KhronosGroup/SYCL-Docs#428 --------- Co-authored-by: Steffen Larsen <[email protected]>
1 parent e860b14 commit 49bbcbf

File tree

1 file changed

+102
-119
lines changed

1 file changed

+102
-119
lines changed

sycl/include/sycl/builtins.hpp

Lines changed: 102 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ namespace __sycl_std = __host_std;
6060
__SYCL_BUILTIN_DEF(TYPE##3) \
6161
__SYCL_BUILTIN_DEF(TYPE##4)
6262

63+
#define __SYCL_DEF_BUILTIN_GEOCROSSVEC(TYPE) \
64+
__SYCL_BUILTIN_DEF(TYPE##3) \
65+
__SYCL_BUILTIN_DEF(TYPE##4)
66+
6367
#define __SYCL_DEF_BUILTIN_MARRAY(TYPE)
6468

6569
#define __SYCL_DEF_BUILTIN_CHAR_SCALAR __SYCL_BUILTIN_DEF(char)
@@ -255,6 +259,8 @@ namespace __sycl_std = __host_std;
255259
#define __SYCL_DEF_BUILTIN_FLOAT_SCALAR __SYCL_BUILTIN_DEF(float)
256260
#define __SYCL_DEF_BUILTIN_FLOAT_VEC __SYCL_DEF_BUILTIN_VEC(float)
257261
#define __SYCL_DEF_BUILTIN_FLOAT_GEOVEC __SYCL_DEF_BUILTIN_GEOVEC(float)
262+
#define __SYCL_DEF_BUILTIN_FLOAT_GEOCROSSVEC \
263+
__SYCL_DEF_BUILTIN_GEOCROSSVEC(float)
258264
#define __SYCL_DEF_BUILTIN_FLOAT_MARRAY __SYCL_DEF_BUILTIN_MARRAY(float)
259265
#define __SYCL_DEF_BUILTIN_FLOATN \
260266
__SYCL_DEF_BUILTIN_FLOAT_VEC \
@@ -269,6 +275,8 @@ namespace __sycl_std = __host_std;
269275
#define __SYCL_DEF_BUILTIN_DOUBLE_SCALAR __SYCL_BUILTIN_DEF(double)
270276
#define __SYCL_DEF_BUILTIN_DOUBLE_VEC __SYCL_DEF_BUILTIN_VEC(double)
271277
#define __SYCL_DEF_BUILTIN_DOUBLE_GEOVEC __SYCL_DEF_BUILTIN_GEOVEC(double)
278+
#define __SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSVEC \
279+
__SYCL_DEF_BUILTIN_GEOCROSSVEC(double)
272280
#define __SYCL_DEF_BUILTIN_DOUBLE_MARRAY __SYCL_DEF_BUILTIN_MARRAY(double)
273281
#define __SYCL_DEF_BUILTIN_DOUBLEN \
274282
__SYCL_DEF_BUILTIN_DOUBLE_VEC \
@@ -283,6 +291,7 @@ namespace __sycl_std = __host_std;
283291
#define __SYCL_DEF_BUILTIN_HALF_SCALAR __SYCL_BUILTIN_DEF(half)
284292
#define __SYCL_DEF_BUILTIN_HALF_VEC __SYCL_DEF_BUILTIN_VEC(half)
285293
#define __SYCL_DEF_BUILTIN_HALF_GEOVEC __SYCL_DEF_BUILTIN_GEOVEC(half)
294+
#define __SYCL_DEF_BUILTIN_HALF_GEOCROSSVEC __SYCL_DEF_BUILTIN_GEOCROSSVEC(half)
286295
#define __SYCL_DEF_BUILTIN_HALF_MARRAY __SYCL_DEF_BUILTIN_MARRAY(half)
287296
#define __SYCL_DEF_BUILTIN_HALFN \
288297
__SYCL_DEF_BUILTIN_HALF_VEC \
@@ -314,8 +323,17 @@ namespace __sycl_std = __host_std;
314323
__SYCL_DEF_BUILTIN_GENGEOFLOATD \
315324
__SYCL_DEF_BUILTIN_GENGEOFLOATH
316325

317-
// TODO: Replace with overloads.
326+
#define __SYCL_DEF_BUILTIN_VGENGEOCROSSFLOAT \
327+
__SYCL_DEF_BUILTIN_FLOAT_GEOCROSSVEC \
328+
__SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSVEC \
329+
__SYCL_DEF_BUILTIN_HALF_GEOCROSSVEC
330+
331+
#define __SYCL_DEF_BUILTIN_VGENGEOFLOAT \
332+
__SYCL_DEF_BUILTIN_FLOAT_GEOVEC \
333+
__SYCL_DEF_BUILTIN_DOUBLE_GEOVEC \
334+
__SYCL_DEF_BUILTIN_HALF_GEOVEC
318335

336+
// TODO: Replace with overloads.
319337
#ifdef __FAST_MATH__
320338
#define __FAST_MATH_GENFLOAT(T) \
321339
(detail::is_svgenfloatd<T>::value || detail::is_svgenfloath<T>::value)
@@ -1942,141 +1960,106 @@ __SYCL_MARRAY_INTEGER_FUNCTION_UPSAMPLE_IU_OVERLOAD(upsample, 32bit)
19421960
// double4 cross (double4 p0, double4 p1)
19431961
// half3 cross (half3 p0, half3 p1)
19441962
// half4 cross (half4 p0, half4 p1)
1945-
template <typename T>
1946-
std::enable_if_t<detail::is_gencross<T>::value, T> cross(T p0, T p1) __NOEXC {
1947-
return __sycl_std::__invoke_cross<T>(p0, p1);
1948-
}
1963+
#define __SYCL_BUILTIN_DEF(TYPE) \
1964+
inline TYPE cross(TYPE p0, TYPE p1) __NOEXC { \
1965+
return __sycl_std::__invoke_cross<TYPE>(p0, p1); \
1966+
}
1967+
__SYCL_DEF_BUILTIN_VGENGEOCROSSFLOAT
1968+
#undef __SYCL_BUILTIN_DEF
1969+
#undef __SYCL_DEF_BUILTIN_VGENGEOCROSSFLOAT
1970+
#undef __SYCL_DEF_BUILTIN_HALF_GEOCROSSVEC
1971+
#undef __SYCL_DEF_BUILTIN_DOUBLE_GEOCROSSVEC
1972+
#undef __SYCL_DEF_BUILTIN_FLOAT_GEOCROSSVEC
1973+
#undef __SYCL_DEF_BUILTIN_GEOCROSSVEC
19491974

19501975
// float dot (float p0, float p1)
19511976
// double dot (double p0, double p1)
19521977
// half dot (half p0, half p1)
1953-
template <typename T>
1954-
std::enable_if_t<detail::is_sgenfloat<T>::value, T> dot(T p0, T p1) __NOEXC {
1955-
return p0 * p1;
1956-
}
1957-
1978+
#define __SYCL_BUILTIN_DEF(TYPE) \
1979+
inline TYPE dot(TYPE p0, TYPE p1) __NOEXC { return p0 * p1; }
1980+
__SYCL_DEF_BUILTIN_SGENFLOAT
1981+
#undef __SYCL_BUILTIN_DEF
19581982
// float dot (vgengeofloat p0, vgengeofloat p1)
1959-
template <typename T>
1960-
std::enable_if_t<detail::is_vgengeofloat<T>::value, float> dot(T p0,
1961-
T p1) __NOEXC {
1962-
return __sycl_std::__invoke_Dot<float>(p0, p1);
1963-
}
1964-
19651983
// double dot (vgengeodouble p0, vgengeodouble p1)
1966-
template <typename T>
1967-
std::enable_if_t<detail::is_vgengeodouble<T>::value, double> dot(T p0,
1968-
T p1) __NOEXC {
1969-
return __sycl_std::__invoke_Dot<double>(p0, p1);
1970-
}
1971-
19721984
// half dot (vgengeohalf p0, vgengeohalf p1)
1973-
template <typename T>
1974-
std::enable_if_t<detail::is_vgengeohalf<T>::value, half> dot(T p0,
1975-
T p1) __NOEXC {
1976-
return __sycl_std::__invoke_Dot<half>(p0, p1);
1977-
}
1978-
1979-
// float distance (gengeofloat p0, gengeofloat p1)
1980-
template <typename T,
1981-
typename = std::enable_if_t<detail::is_gengeofloat<T>::value, T>>
1982-
float distance(T p0, T p1) __NOEXC {
1983-
return __sycl_std::__invoke_distance<float>(p0, p1);
1984-
}
1985-
1986-
// double distance (gengeodouble p0, gengeodouble p1)
1987-
template <typename T,
1988-
typename = std::enable_if_t<detail::is_gengeodouble<T>::value, T>>
1989-
double distance(T p0, T p1) __NOEXC {
1990-
return __sycl_std::__invoke_distance<double>(p0, p1);
1991-
}
1992-
1993-
// half distance (gengeohalf p0, gengeohalf p1)
1994-
template <typename T,
1995-
typename = std::enable_if_t<detail::is_gengeohalf<T>::value, T>>
1996-
half distance(T p0, T p1) __NOEXC {
1997-
return __sycl_std::__invoke_distance<half>(p0, p1);
1998-
}
1999-
2000-
// float length (gengeofloat p)
2001-
template <typename T,
2002-
typename = std::enable_if_t<detail::is_gengeofloat<T>::value, T>>
2003-
float length(T p) __NOEXC {
2004-
return __sycl_std::__invoke_length<float>(p);
2005-
}
2006-
2007-
// double length (gengeodouble p)
2008-
template <typename T,
2009-
typename = std::enable_if_t<detail::is_gengeodouble<T>::value, T>>
2010-
double length(T p) __NOEXC {
2011-
return __sycl_std::__invoke_length<double>(p);
2012-
}
2013-
2014-
// half length (gengeohalf p)
2015-
template <typename T,
2016-
typename = std::enable_if_t<detail::is_gengeohalf<T>::value, T>>
2017-
half length(T p) __NOEXC {
2018-
return __sycl_std::__invoke_length<half>(p);
2019-
}
1985+
#define __SYCL_BUILTIN_DEF(TYPE) \
1986+
inline TYPE::element_type dot(TYPE p0, TYPE p1) __NOEXC { \
1987+
return __sycl_std::__invoke_Dot<TYPE::element_type>(p0, p1); \
1988+
}
1989+
__SYCL_DEF_BUILTIN_VGENGEOFLOAT
1990+
#undef __SYCL_BUILTIN_DEF
1991+
1992+
// float distance (float p0, float p1)
1993+
// double distance (double p0, double p1)
1994+
// half distance (half p0, half p1)
1995+
#define __SYCL_BUILTIN_DEF(TYPE) \
1996+
inline TYPE distance(TYPE p0, TYPE p1) __NOEXC { \
1997+
return __sycl_std::__invoke_distance<TYPE>(p0, p1); \
1998+
}
1999+
__SYCL_DEF_BUILTIN_SGENFLOAT
2000+
#undef __SYCL_BUILTIN_DEF
2001+
// float distance (vgengeofloat p0, vgengeofloat p1)
2002+
// double distance (vgengeodouble p0, vgengeodouble p1)
2003+
// half distance (vgengeohalf p0, vgengeohalf p1)
2004+
#define __SYCL_BUILTIN_DEF(TYPE) \
2005+
inline TYPE::element_type distance(TYPE p0, TYPE p1) __NOEXC { \
2006+
return __sycl_std::__invoke_distance<TYPE::element_type>(p0, p1); \
2007+
}
2008+
__SYCL_DEF_BUILTIN_VGENGEOFLOAT
2009+
#undef __SYCL_BUILTIN_DEF
2010+
2011+
// float length (float p0, float p1)
2012+
// double length (double p0, double p1)
2013+
// half length (half p0, half p1)
2014+
#define __SYCL_BUILTIN_DEF(TYPE) \
2015+
inline TYPE length(TYPE p) __NOEXC { \
2016+
return __sycl_std::__invoke_length<TYPE>(p); \
2017+
}
2018+
__SYCL_DEF_BUILTIN_SGENFLOAT
2019+
#undef __SYCL_BUILTIN_DEF
2020+
// float length (vgengeofloat p0, vgengeofloat p1)
2021+
// double length (vgengeodouble p0, vgengeodouble p1)
2022+
// half length (vgengeohalf p0, vgengeohalf p1)
2023+
#define __SYCL_BUILTIN_DEF(TYPE) \
2024+
inline TYPE::element_type length(TYPE p) __NOEXC { \
2025+
return __sycl_std::__invoke_length<TYPE::element_type>(p); \
2026+
}
2027+
__SYCL_DEF_BUILTIN_VGENGEOFLOAT
2028+
#undef __SYCL_BUILTIN_DEF
20202029

20212030
// gengeofloat normalize (gengeofloat p)
2022-
template <typename T>
2023-
std::enable_if_t<detail::is_gengeofloat<T>::value, T> normalize(T p) __NOEXC {
2024-
return __sycl_std::__invoke_normalize<T>(p);
2025-
}
2026-
20272031
// gengeodouble normalize (gengeodouble p)
2028-
template <typename T>
2029-
std::enable_if_t<detail::is_gengeodouble<T>::value, T> normalize(T p) __NOEXC {
2030-
return __sycl_std::__invoke_normalize<T>(p);
2031-
}
2032-
20332032
// gengeohalf normalize (gengeohalf p)
2034-
template <typename T>
2035-
std::enable_if_t<detail::is_gengeohalf<T>::value, T> normalize(T p) __NOEXC {
2036-
return __sycl_std::__invoke_normalize<T>(p);
2037-
}
2033+
#define __SYCL_BUILTIN_DEF(TYPE) \
2034+
inline TYPE normalize(TYPE p) __NOEXC { \
2035+
return __sycl_std::__invoke_normalize<TYPE>(p); \
2036+
}
2037+
__SYCL_DEF_BUILTIN_GENGEOFLOAT
2038+
#undef __SYCL_BUILTIN_DEF
20382039

20392040
// float fast_distance (gengeofloat p0, gengeofloat p1)
2040-
template <typename T,
2041-
typename = std::enable_if_t<detail::is_gengeofloat<T>::value, T>>
2042-
float fast_distance(T p0, T p1) __NOEXC {
2043-
return __sycl_std::__invoke_fast_distance<float>(p0, p1);
2044-
}
2045-
2046-
// double fast_distance (gengeodouble p0, gengeodouble p1)
2047-
template <typename T,
2048-
typename = std::enable_if_t<detail::is_gengeodouble<T>::value, T>>
2049-
double fast_distance(T p0, T p1) __NOEXC {
2050-
return __sycl_std::__invoke_fast_distance<double>(p0, p1);
2051-
}
2041+
#define __SYCL_BUILTIN_DEF(TYPE) \
2042+
inline float fast_distance(TYPE p0, TYPE p1) __NOEXC { \
2043+
return __sycl_std::__invoke_fast_distance<float>(p0, p1); \
2044+
}
2045+
__SYCL_DEF_BUILTIN_GENGEOFLOATF
2046+
#undef __SYCL_BUILTIN_DEF
20522047

20532048
// float fast_length (gengeofloat p)
2054-
template <typename T,
2055-
typename = std::enable_if_t<detail::is_gengeofloat<T>::value, T>>
2056-
float fast_length(T p) __NOEXC {
2057-
return __sycl_std::__invoke_fast_length<float>(p);
2058-
}
2059-
2060-
// double fast_length (gengeodouble p)
2061-
template <typename T,
2062-
typename = std::enable_if_t<detail::is_gengeodouble<T>::value, T>>
2063-
double fast_length(T p) __NOEXC {
2064-
return __sycl_std::__invoke_fast_length<double>(p);
2065-
}
2049+
#define __SYCL_BUILTIN_DEF(TYPE) \
2050+
inline float fast_length(TYPE p) __NOEXC { \
2051+
return __sycl_std::__invoke_fast_length<float>(p); \
2052+
}
2053+
__SYCL_DEF_BUILTIN_GENGEOFLOATF
2054+
#undef __SYCL_BUILTIN_DEF
20662055

20672056
// gengeofloat fast_normalize (gengeofloat p)
2068-
template <typename T>
2069-
std::enable_if_t<detail::is_gengeofloat<T>::value, T>
2070-
fast_normalize(T p) __NOEXC {
2071-
return __sycl_std::__invoke_fast_normalize<T>(p);
2072-
}
2073-
2074-
// gengeodouble fast_normalize (gengeodouble p)
2075-
template <typename T>
2076-
std::enable_if_t<detail::is_gengeodouble<T>::value, T>
2077-
fast_normalize(T p) __NOEXC {
2078-
return __sycl_std::__invoke_fast_normalize<T>(p);
2079-
}
2057+
#define __SYCL_BUILTIN_DEF(TYPE) \
2058+
inline TYPE fast_normalize(TYPE p) __NOEXC { \
2059+
return __sycl_std::__invoke_fast_normalize<TYPE>(p); \
2060+
}
2061+
__SYCL_DEF_BUILTIN_GENGEOFLOATF
2062+
#undef __SYCL_BUILTIN_DEF
20802063

20812064
// marray geometric functions
20822065

0 commit comments

Comments
 (0)