|
10 | 10 |
|
11 | 11 | #include <sycl/detail/defines_elementary.hpp> // for __SYCL_ALWAYS_INLINE
|
12 | 12 | #include <sycl/detail/generic_type_traits.hpp> // for convertDataToType
|
| 13 | +#include <utility> |
13 | 14 |
|
14 | 15 | // TODO Decide whether to mark functions with this attribute.
|
15 | 16 | #define __NOEXC /*noexcept*/
|
|
43 | 44 | using Ret = sycl::detail::ConvertToOpenCLType_t<R>; \
|
44 | 45 | using Arg1 = sycl::detail::ConvertToOpenCLType_t<T1>; \
|
45 | 46 | __SYCL_EXTERN_IT1(Ret, prefix, call, Arg1); \
|
46 |
| - Arg1 arg1 = sycl::detail::convertDataToType<T1, Arg1>(t1); \ |
47 |
| - Ret ret = __SYCL_PPCAT(prefix, call)(arg1); \ |
48 |
| - return sycl::detail::convertDataToType<Ret, R>(ret); \ |
| 47 | + Arg1 arg1 = sycl::detail::convertDataToType<T1, Arg1>(std::move(t1)); \ |
| 48 | + Ret ret = __SYCL_PPCAT(prefix, call)(std::move(arg1)); \ |
| 49 | + return sycl::detail::convertDataToType<Ret, R>(std::move(ret)); \ |
49 | 50 | }
|
50 | 51 |
|
51 | 52 | #define __SYCL_MAKE_CALL_ARG2(call, prefix) \
|
|
55 | 56 | using Arg1 = sycl::detail::ConvertToOpenCLType_t<T1>; \
|
56 | 57 | using Arg2 = sycl::detail::ConvertToOpenCLType_t<T2>; \
|
57 | 58 | __SYCL_EXTERN_IT2(Ret, prefix, call, Arg1, Arg2); \
|
58 |
| - Arg1 arg1 = sycl::detail::convertDataToType<T1, Arg1>(t1); \ |
59 |
| - Arg2 arg2 = sycl::detail::convertDataToType<T2, Arg2>(t2); \ |
60 |
| - Ret ret = __SYCL_PPCAT(prefix, call)(arg1, arg2); \ |
61 |
| - return sycl::detail::convertDataToType<Ret, R>(ret); \ |
| 59 | + Arg1 arg1 = sycl::detail::convertDataToType<T1, Arg1>(std::move(t1)); \ |
| 60 | + Arg2 arg2 = sycl::detail::convertDataToType<T2, Arg2>(std::move(t2)); \ |
| 61 | + Ret ret = __SYCL_PPCAT(prefix, call)(std::move(arg1), std::move(arg2)); \ |
| 62 | + return sycl::detail::convertDataToType<Ret, R>(std::move(ret)); \ |
62 | 63 | }
|
63 | 64 |
|
64 | 65 | #define __SYCL_MAKE_CALL_ARG2_SAME(call, prefix) \
|
|
67 | 68 | using Ret = sycl::detail::ConvertToOpenCLType_t<R>; \
|
68 | 69 | using Arg = sycl::detail::ConvertToOpenCLType_t<T>; \
|
69 | 70 | __SYCL_EXTERN_IT2_SAME(Ret, prefix, call, Arg); \
|
70 |
| - Arg arg1 = sycl::detail::convertDataToType<T, Arg>(t1); \ |
71 |
| - Arg arg2 = sycl::detail::convertDataToType<T, Arg>(t2); \ |
72 |
| - Ret ret = __SYCL_PPCAT(prefix, call)(arg1, arg2); \ |
73 |
| - return sycl::detail::convertDataToType<Ret, R>(ret); \ |
| 71 | + Arg arg1 = sycl::detail::convertDataToType<T, Arg>(std::move(t1)); \ |
| 72 | + Arg arg2 = sycl::detail::convertDataToType<T, Arg>(std::move(t2)); \ |
| 73 | + Ret ret = __SYCL_PPCAT(prefix, call)(std::move(arg1), std::move(arg2)); \ |
| 74 | + return sycl::detail::convertDataToType<Ret, R>(std::move(ret)); \ |
74 | 75 | }
|
75 | 76 |
|
76 | 77 | #define __SYCL_MAKE_CALL_ARG2_SAME_RESULT(call, prefix) \
|
77 | 78 | template <typename T> \
|
78 | 79 | inline __SYCL_ALWAYS_INLINE T __invoke_##call(T v1, T v2) __NOEXC { \
|
79 | 80 | using Type = sycl::detail::ConvertToOpenCLType_t<T>; \
|
80 | 81 | __SYCL_EXTERN_IT2_SAME(Type, prefix, call, Type); \
|
81 |
| - Type arg1 = sycl::detail::convertDataToType<T, Type>(v1); \ |
82 |
| - Type arg2 = sycl::detail::convertDataToType<T, Type>(v2); \ |
83 |
| - Type ret = __SYCL_PPCAT(prefix, call)(arg1, arg2); \ |
84 |
| - return sycl::detail::convertDataToType<Type, T>(ret); \ |
| 82 | + Type arg1 = sycl::detail::convertDataToType<T, Type>(std::move(v1)); \ |
| 83 | + Type arg2 = sycl::detail::convertDataToType<T, Type>(std::move(v2)); \ |
| 84 | + Type ret = __SYCL_PPCAT(prefix, call)(std::move(arg1), std::move(arg2)); \ |
| 85 | + return sycl::detail::convertDataToType<Type, T>(std::move(ret)); \ |
85 | 86 | }
|
86 | 87 |
|
87 | 88 | #define __SYCL_MAKE_CALL_ARG3(call, prefix) \
|
|
92 | 93 | using Arg2 = sycl::detail::ConvertToOpenCLType_t<T2>; \
|
93 | 94 | using Arg3 = sycl::detail::ConvertToOpenCLType_t<T3>; \
|
94 | 95 | __SYCL_EXTERN_IT3(Ret, prefix, call, Arg1, Arg2, Arg3); \
|
95 |
| - Arg1 arg1 = sycl::detail::convertDataToType<T1, Arg1>(t1); \ |
96 |
| - Arg2 arg2 = sycl::detail::convertDataToType<T2, Arg2>(t2); \ |
97 |
| - Arg3 arg3 = sycl::detail::convertDataToType<T3, Arg3>(t3); \ |
98 |
| - Ret ret = __SYCL_PPCAT(prefix, call)(arg1, arg2, arg3); \ |
99 |
| - return sycl::detail::convertDataToType<Ret, R>(ret); \ |
| 96 | + Arg1 arg1 = sycl::detail::convertDataToType<T1, Arg1>(std::move(t1)); \ |
| 97 | + Arg2 arg2 = sycl::detail::convertDataToType<T2, Arg2>(std::move(t2)); \ |
| 98 | + Arg3 arg3 = sycl::detail::convertDataToType<T3, Arg3>(std::move(t3)); \ |
| 99 | + Ret ret = __SYCL_PPCAT(prefix, call)(std::move(arg1), std::move(arg2), \ |
| 100 | + std::move(arg3)); \ |
| 101 | + return sycl::detail::convertDataToType<Ret, R>(std::move(ret)); \ |
100 | 102 | }
|
101 | 103 |
|
102 | 104 | #ifndef __SYCL_DEVICE_ONLY__
|
|
0 commit comments