18 #define __MAKE_1V(Fun, Call, N, Ret, Arg1) \
19 __SYCL_EXPORT sycl::vec<Ret, N> Fun __NOEXC(sycl::vec<Arg1, N> x) { \
20 sycl::vec<Ret, N> r; \
21 detail::helper<N - 1>().run_1v( \
22 r, [](Arg1 x) { return cl::__host_std::Call(x); }, x); \
26 #define __MAKE_1V_2V(Fun, Call, N, Ret, Arg1, Arg2) \
27 __SYCL_EXPORT sycl::vec<Ret, N> Fun __NOEXC(sycl::vec<Arg1, N> x, \
28 sycl::vec<Arg2, N> y) { \
29 sycl::vec<Ret, N> r; \
30 detail::helper<N - 1>().run_1v_2v( \
31 r, [](Arg1 x, Arg2 y) { return cl::__host_std::Call(x, y); }, x, y); \
35 #define __MAKE_1V_2V_RS(Fun, Call, N, Ret, Arg1, Arg2) \
36 __SYCL_EXPORT Ret Fun __NOEXC(sycl::vec<Arg1, N> x, sycl::vec<Arg2, N> y) { \
38 detail::helper<N - 1>().run_1v_2v_rs( \
40 [](Ret &r, Arg1 x, Arg2 y) { return cl::__host_std::Call(r, x, y); }, \
45 #define __MAKE_1V_RS(Fun, Call, N, Ret, Arg1) \
46 __SYCL_EXPORT Ret Fun __NOEXC(sycl::vec<Arg1, N> x) { \
48 detail::helper<N - 1>().run_1v_rs( \
49 r, [](Ret &r, Arg1 x) { return cl::__host_std::Call(r, x); }, x); \
53 #define __MAKE_1V_2V_3V(Fun, Call, N, Ret, Arg1, Arg2, Arg3) \
54 __SYCL_EXPORT sycl::vec<Ret, N> Fun __NOEXC( \
55 sycl::vec<Arg1, N> x, sycl::vec<Arg2, N> y, sycl::vec<Arg3, N> z) { \
56 sycl::vec<Ret, N> r; \
57 detail::helper<N - 1>().run_1v_2v_3v( \
59 [](Arg1 x, Arg2 y, Arg3 z) { return cl::__host_std::Call(x, y, z); }, \
64 #define __MAKE_1V_2S_3S(Fun, N, Ret, Arg1, Arg2, Arg3) \
65 __SYCL_EXPORT sycl::vec<Ret, N> Fun __NOEXC(sycl::vec<Arg1, N> x, Arg2 y, \
67 sycl::vec<Ret, N> r; \
68 detail::helper<N - 1>().run_1v_2s_3s( \
70 [](Arg1 x, Arg2 y, Arg3 z) { return cl::__host_std::Fun(x, y, z); }, \
75 #define __MAKE_1V_2S(Fun, N, Ret, Arg1, Arg2) \
76 __SYCL_EXPORT sycl::vec<Ret, N> Fun __NOEXC(sycl::vec<Arg1, N> x, Arg2 y) { \
77 sycl::vec<Ret, N> r; \
78 detail::helper<N - 1>().run_1v_2s( \
79 r, [](Arg1 x, Arg2 y) { return cl::__host_std::Fun(x, y); }, x, y); \
83 #define __MAKE_SR_1V_AND(Fun, Call, N, Ret, Arg1) \
84 __SYCL_EXPORT Ret Fun __NOEXC(sycl::vec<Arg1, N> x) { \
86 detail::helper<N - 1>().run_1v_sr_and( \
87 r, [](Arg1 x) { return cl::__host_std::Call(x); }, x); \
91 #define __MAKE_SR_1V_OR(Fun, Call, N, Ret, Arg1) \
92 __SYCL_EXPORT Ret Fun __NOEXC(sycl::vec<Arg1, N> x) { \
94 detail::helper<N - 1>().run_1v_sr_or( \
95 r, [](Arg1 x) { return cl::__host_std::Call(x); }, x); \
99 #define __MAKE_1V_2P(Fun, N, Ret, Arg1, Arg2) \
100 __SYCL_EXPORT sycl::vec<Ret, N> Fun __NOEXC(sycl::vec<Arg1, N> x, \
101 sycl::vec<Arg2, N> *y) { \
102 sycl::vec<Ret, N> r; \
103 detail::helper<N - 1>().run_1v_2p( \
104 r, [](Arg1 x, Arg2 *y) { return cl::__host_std::Fun(x, y); }, x, y); \
108 #define __MAKE_1V_2V_3P(Fun, N, Ret, Arg1, Arg2, Arg3) \
109 __SYCL_EXPORT sycl::vec<Ret, N> Fun __NOEXC( \
110 sycl::vec<Arg1, N> x, sycl::vec<Arg2, N> y, sycl::vec<Arg3, N> *z) { \
111 sycl::vec<Ret, N> r; \
112 detail::helper<N - 1>().run_1v_2v_3p( \
114 [](Arg1 x, Arg2 y, Arg3 *z) { return cl::__host_std::Fun(x, y, z); }, \
119 #define MAKE_1V(Fun, Ret, Arg1) MAKE_1V_FUNC(Fun, Fun, Ret, Arg1)
121 #define MAKE_1V_FUNC(Fun, Call, Ret, Arg1) \
122 __MAKE_1V(Fun, Call, 1, Ret, Arg1) \
123 __MAKE_1V(Fun, Call, 2, Ret, Arg1) \
124 __MAKE_1V(Fun, Call, 3, Ret, Arg1) \
125 __MAKE_1V(Fun, Call, 4, Ret, Arg1) \
126 __MAKE_1V(Fun, Call, 8, Ret, Arg1) \
127 __MAKE_1V(Fun, Call, 16, Ret, Arg1)
129 #define MAKE_1V_2V(Fun, Ret, Arg1, Arg2) \
130 MAKE_1V_2V_FUNC(Fun, Fun, Ret, Arg1, Arg2)
132 #define MAKE_1V_2V_FUNC(Fun, Call, Ret, Arg1, Arg2) \
133 __MAKE_1V_2V(Fun, Call, 1, Ret, Arg1, Arg2) \
134 __MAKE_1V_2V(Fun, Call, 2, Ret, Arg1, Arg2) \
135 __MAKE_1V_2V(Fun, Call, 3, Ret, Arg1, Arg2) \
136 __MAKE_1V_2V(Fun, Call, 4, Ret, Arg1, Arg2) \
137 __MAKE_1V_2V(Fun, Call, 8, Ret, Arg1, Arg2) \
138 __MAKE_1V_2V(Fun, Call, 16, Ret, Arg1, Arg2)
140 #define MAKE_1V_2V_3V(Fun, Ret, Arg1, Arg2, Arg3) \
141 MAKE_1V_2V_3V_FUNC(Fun, Fun, Ret, Arg1, Arg2, Arg3)
143 #define MAKE_1V_2V_3V_FUNC(Fun, Call, Ret, Arg1, Arg2, Arg3) \
144 __MAKE_1V_2V_3V(Fun, Call, 1, Ret, Arg1, Arg2, Arg3) \
145 __MAKE_1V_2V_3V(Fun, Call, 2, Ret, Arg1, Arg2, Arg3) \
146 __MAKE_1V_2V_3V(Fun, Call, 3, Ret, Arg1, Arg2, Arg3) \
147 __MAKE_1V_2V_3V(Fun, Call, 4, Ret, Arg1, Arg2, Arg3) \
148 __MAKE_1V_2V_3V(Fun, Call, 8, Ret, Arg1, Arg2, Arg3) \
149 __MAKE_1V_2V_3V(Fun, Call, 16, Ret, Arg1, Arg2, Arg3)
151 #define MAKE_SC_1V_2V_3V(Fun, Ret, Arg1, Arg2, Arg3) \
152 MAKE_SC_3ARG(Fun, Ret, Arg1, Arg2, Arg3) \
153 MAKE_1V_2V_3V_FUNC(Fun, Fun, Ret, Arg1, Arg2, Arg3)
155 #define MAKE_SC_FSC_1V_2V_3V_FV(FunSc, FunV, Ret, Arg1, Arg2, Arg3) \
156 MAKE_SC_3ARG(FunSc, Ret, Arg1, Arg2, Arg3) \
157 MAKE_1V_2V_3V_FUNC(FunSc, FunV, Ret, Arg1, Arg2, Arg3)
159 #define MAKE_SC_3ARG(Fun, Ret, Arg1, Arg2, Arg3) \
160 __SYCL_EXPORT Ret Fun __NOEXC(Arg1 x, Arg2 y, Arg3 z) { \
161 return (Ret)__##Fun(x, y, z); \
164 #define MAKE_1V_2S(Fun, Ret, Arg1, Arg2) \
165 __MAKE_1V_2S(Fun, 1, Ret, Arg1, Arg2) \
166 __MAKE_1V_2S(Fun, 2, Ret, Arg1, Arg2) \
167 __MAKE_1V_2S(Fun, 3, Ret, Arg1, Arg2) \
168 __MAKE_1V_2S(Fun, 4, Ret, Arg1, Arg2) \
169 __MAKE_1V_2S(Fun, 8, Ret, Arg1, Arg2) \
170 __MAKE_1V_2S(Fun, 16, Ret, Arg1, Arg2)
172 #define MAKE_1V_2S_3S(Fun, Ret, Arg1, Arg2, Arg3) \
173 __MAKE_1V_2S_3S(Fun, 1, Ret, Arg1, Arg2, Arg3) \
174 __MAKE_1V_2S_3S(Fun, 2, Ret, Arg1, Arg2, Arg3) \
175 __MAKE_1V_2S_3S(Fun, 3, Ret, Arg1, Arg2, Arg3) \
176 __MAKE_1V_2S_3S(Fun, 4, Ret, Arg1, Arg2, Arg3) \
177 __MAKE_1V_2S_3S(Fun, 8, Ret, Arg1, Arg2, Arg3) \
178 __MAKE_1V_2S_3S(Fun, 16, Ret, Arg1, Arg2, Arg3)
180 #define MAKE_SR_1V_AND(Fun, Call, Ret, Arg1) \
181 __MAKE_SR_1V_AND(Fun, Call, 1, Ret, Arg1) \
182 __MAKE_SR_1V_AND(Fun, Call, 2, Ret, Arg1) \
183 __MAKE_SR_1V_AND(Fun, Call, 3, Ret, Arg1) \
184 __MAKE_SR_1V_AND(Fun, Call, 4, Ret, Arg1) \
185 __MAKE_SR_1V_AND(Fun, Call, 8, Ret, Arg1) \
186 __MAKE_SR_1V_AND(Fun, Call, 16, Ret, Arg1)
188 #define MAKE_SR_1V_OR(Fun, Call, Ret, Arg1) \
189 __MAKE_SR_1V_OR(Fun, Call, 1, Ret, Arg1) \
190 __MAKE_SR_1V_OR(Fun, Call, 2, Ret, Arg1) \
191 __MAKE_SR_1V_OR(Fun, Call, 3, Ret, Arg1) \
192 __MAKE_SR_1V_OR(Fun, Call, 4, Ret, Arg1) \
193 __MAKE_SR_1V_OR(Fun, Call, 8, Ret, Arg1) \
194 __MAKE_SR_1V_OR(Fun, Call, 16, Ret, Arg1)
196 #define MAKE_1V_2P(Fun, Ret, Arg1, Arg2) \
197 __MAKE_1V_2P(Fun, 1, Ret, Arg1, Arg2) \
198 __MAKE_1V_2P(Fun, 2, Ret, Arg1, Arg2) \
199 __MAKE_1V_2P(Fun, 3, Ret, Arg1, Arg2) \
200 __MAKE_1V_2P(Fun, 4, Ret, Arg1, Arg2) \
201 __MAKE_1V_2P(Fun, 8, Ret, Arg1, Arg2) \
202 __MAKE_1V_2P(Fun, 16, Ret, Arg1, Arg2)
204 #define MAKE_GEO_1V_2V_RS(Fun, Call, Ret, Arg1, Arg2) \
205 __MAKE_1V_2V_RS(Fun, Call, 1, Ret, Arg1, Arg2) \
206 __MAKE_1V_2V_RS(Fun, Call, 2, Ret, Arg1, Arg2) \
207 __MAKE_1V_2V_RS(Fun, Call, 3, Ret, Arg1, Arg2) \
208 __MAKE_1V_2V_RS(Fun, Call, 4, Ret, Arg1, Arg2) \
209 __MAKE_1V_2V_RS(Fun, Call, 8, Ret, Arg1, Arg2) \
210 __MAKE_1V_2V_RS(Fun, Call, 16, Ret, Arg1, Arg2)
212 #define MAKE_1V_2V_3P(Fun, Ret, Arg1, Arg2, Arg3) \
213 __MAKE_1V_2V_3P(Fun, 1, Ret, Arg1, Arg2, Arg3) \
214 __MAKE_1V_2V_3P(Fun, 2, Ret, Arg1, Arg2, Arg3) \
215 __MAKE_1V_2V_3P(Fun, 3, Ret, Arg1, Arg2, Arg3) \
216 __MAKE_1V_2V_3P(Fun, 4, Ret, Arg1, Arg2, Arg3) \
217 __MAKE_1V_2V_3P(Fun, 8, Ret, Arg1, Arg2, Arg3) \
218 __MAKE_1V_2V_3P(Fun, 16, Ret, Arg1, Arg2, Arg3)
221 namespace __host_std {
225 template <
typename Res,
typename Op,
typename T1>
226 inline void run_1v(Res &r, Op op, T1 x) {
227 helper<N - 1>().run_1v(r, op, x);
228 r.template swizzle<N>() = op(x.template swizzle<N>());
231 template <
typename Res,
typename Op,
typename T1,
typename T2>
233 helper<N - 1>().run_1v_2v(r, op, x, y);
234 r.template swizzle<N>() =
235 op(x.template swizzle<N>(), y.template swizzle<N>());
238 template <
typename Res,
typename Op,
typename T1,
typename T2>
240 helper<N - 1>().run_1v_2s(r, op, x, y);
241 r.template swizzle<N>() = op(x.template swizzle<N>(), y);
244 template <
typename Res,
typename Op,
typename T1,
typename T2,
typename T3>
246 helper<N - 1>().run_1v_2s_3s(r, op, x, y, z);
247 r.template swizzle<N>() = op(x.template swizzle<N>(), y, z);
250 template <
typename Res,
typename Op,
typename T1,
typename T2>
252 helper<N - 1>().run_1v_2v_rs(r, op, x, y);
253 op(r, x.template swizzle<N>(), y.template swizzle<N>());
256 template <
typename Res,
typename Op,
typename T1>
258 helper<N - 1>().run_1v_rs(r, op, x);
259 op(r, x.template swizzle<N>());
262 template <
typename Res,
typename Op,
typename T1,
typename T2>
264 helper<N - 1>().run_1v_2p(r, op, x, y);
266 typename std::remove_pointer<T2>::type::element_type temp;
267 r.template swizzle<N>() = op(x.template swizzle<N>(), &temp);
268 y->template swizzle<N>() = temp;
271 template <
typename Res,
typename Op,
typename T1,
typename T2,
typename T3>
273 helper<N - 1>().run_1v_2v_3p(r, op, x, y, z);
275 typename std::remove_pointer<T3>::type::element_type temp;
276 r.template swizzle<N>() =
277 op(x.template swizzle<N>(), y.template swizzle<N>(), &temp);
278 z->template swizzle<N>() = temp;
281 template <
typename Res,
typename Op,
typename T1,
typename T2,
typename T3>
283 helper<N - 1>().run_1v_2v_3v(r, op, x, y, z);
284 r.template swizzle<N>() =
285 op(x.template swizzle<N>(), y.template swizzle<N>(),
286 z.template swizzle<N>());
289 template <
typename Res,
typename Op,
typename T1>
291 helper<N - 1>().run_1v_sr_or(r, op, x);
292 r = (op(x.template swizzle<N>()) || r);
295 template <
typename Res,
typename Op,
typename T1>
297 helper<N - 1>().run_1v_sr_and(r, op, x);
298 r = (op(x.template swizzle<N>()) && r);
303 template <
typename Res,
typename Op,
typename T1>
304 inline void run_1v(Res &r, Op op, T1 x) {
305 r.template swizzle<0>() = op(x.template swizzle<0>());
308 template <
typename Res,
typename Op,
typename T1,
typename T2>
310 r.template swizzle<0>() =
311 op(x.template swizzle<0>(), y.template swizzle<0>());
314 template <
typename Res,
typename Op,
typename T1,
typename T2>
316 r.template swizzle<0>() = op(x.template swizzle<0>(), y);
319 template <
typename Res,
typename Op,
typename T1,
typename T2,
typename T3>
321 r.template swizzle<0>() = op(x.template swizzle<0>(), y, z);
324 template <
typename Res,
typename Op,
typename T1,
typename T2>
326 op(r, x.template swizzle<0>(), y.template swizzle<0>());
329 template <
typename Res,
typename Op,
typename T1>
331 op(r, x.template swizzle<0>());
334 template <
typename Res,
typename Op,
typename T1,
typename T2>
337 typename std::remove_pointer<T2>::type::element_type temp;
338 r.template swizzle<0>() = op(x.template swizzle<0>(), &temp);
339 y->template swizzle<0>() = temp;
342 template <
typename Res,
typename Op,
typename T1,
typename T2,
typename T3>
345 typename std::remove_pointer<T3>::type::element_type temp;
346 r.template swizzle<0>() =
347 op(x.template swizzle<0>(), y.template swizzle<0>(), &temp);
348 z->template swizzle<0>() = temp;
351 template <
typename Res,
typename Op,
typename T1,
typename T2,
typename T3>
353 r.template swizzle<0>() =
354 op(x.template swizzle<0>(), y.template swizzle<0>(),
355 z.template swizzle<0>());
358 template <
typename Res,
typename Op,
typename T1>
360 r = op(x.template swizzle<0>());
363 template <
typename Res,
typename Op,
typename T1>
365 r = op(x.template swizzle<0>());