@@ -240,7 +240,7 @@ using is_float_to_float =
240
240
std::integral_constant<bool , detail::is_floating_point<T>::value &&
241
241
detail::is_floating_point<R>::value>;
242
242
243
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT>
243
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR >
244
244
detail::enable_if_t <std::is_same<T, R>::value, R> convertImpl (T Value) {
245
245
return Value;
246
246
}
@@ -249,7 +249,7 @@ detail::enable_if_t<std::is_same<T, R>::value, R> convertImpl(T Value) {
249
249
250
250
// Note for float to half conversions, static_cast calls the conversion operator
251
251
// implemented for host that takes care of the precision requirements.
252
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT>
252
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR >
253
253
detail::enable_if_t <!std::is_same<T, R>::value &&
254
254
(is_int_to_int<T, R>::value ||
255
255
is_int_to_float<T, R>::value ||
@@ -260,7 +260,7 @@ convertImpl(T Value) {
260
260
}
261
261
262
262
// float to int
263
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT>
263
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR >
264
264
detail::enable_if_t <is_float_to_int<T, R>::value, R> convertImpl (T Value) {
265
265
switch (roundingMode) {
266
266
// Round to nearest even is default rounding mode for floating-point types
@@ -308,28 +308,23 @@ template <rounding_mode Mode>
308
308
using Rtn = detail::bool_constant<Mode == rounding_mode::rtn>;
309
309
310
310
// convert signed and unsigned types with an equal size and diff names
311
- #define __SYCL_GENERATE_CONVERT_IMPL () \
312
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT> \
313
- detail::enable_if_t < \
314
- !std::is_same<T, R>::value && (is_sint_to_sint<T, R>::value || \
315
- is_uint_to_uint<T, R>::value) && \
316
- std::is_same<OpenCLT, R>::value, \
317
- R> \
318
- convertImpl (T Value) { \
319
- return static_cast <R>(Value); \
311
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR>
312
+ detail::enable_if_t <
313
+ !std::is_same<T, R>::value && (is_sint_to_sint<T, R>::value ||
314
+ is_uint_to_uint<T, R>::value) &&
315
+ std::is_same<OpenCLT, OpenCLR>::value,
316
+ R>
317
+ convertImpl (T Value) {
318
+ return static_cast <R>(Value);
320
319
}
321
320
322
- __SYCL_GENERATE_CONVERT_IMPL ()
323
-
324
- #undef __SYCL_GENERATE_CONVERT_IMPL
325
-
326
321
// signed to signed
327
322
#define __SYCL_GENERATE_CONVERT_IMPL (DestType ) \
328
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT> \
323
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR > \
329
324
detail::enable_if_t < \
330
325
!std::is_same<T, R>::value && is_sint_to_sint<T, R>::value && \
331
- std::is_same<R , DestType>::value && \
332
- !std::is_same<OpenCLT, R >::value, \
326
+ std::is_same<OpenCLR , DestType>::value && \
327
+ !std::is_same<OpenCLT, OpenCLR >::value, \
333
328
R> \
334
329
convertImpl (T Value) { \
335
330
OpenCLT OpValue = cl::sycl::detail::convertDataToType<T, OpenCLT>(Value); \
@@ -345,11 +340,11 @@ __SYCL_GENERATE_CONVERT_IMPL(long)
345
340
346
341
// unsigned to unsigned
347
342
#define __SYCL_GENERATE_CONVERT_IMPL (DestType ) \
348
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT> \
343
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR > \
349
344
detail::enable_if_t < \
350
345
!std::is_same<T, R>::value && is_uint_to_uint<T, R>::value && \
351
- std::is_same<R , DestType>::value && \
352
- !std::is_same<OpenCLT, R >::value, \
346
+ std::is_same<OpenCLR , DestType>::value && \
347
+ !std::is_same<OpenCLT, OpenCLR >::value, \
353
348
R> \
354
349
convertImpl (T Value) { \
355
350
OpenCLT OpValue = cl::sycl::detail::convertDataToType<T, OpenCLT>(Value); \
@@ -364,14 +359,14 @@ __SYCL_GENERATE_CONVERT_IMPL(ulong)
364
359
#undef __SYCL_GENERATE_CONVERT_IMPL
365
360
366
361
// unsigned to (from) signed
367
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT>
362
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR >
368
363
detail::enable_if_t <is_sint_to_from_uint<T, R>::value, R> convertImpl (T Value) {
369
364
return static_cast <R>(Value);
370
365
}
371
366
372
367
// sint to float
373
368
#define __SYCL_GENERATE_CONVERT_IMPL (SPIRVOp, DestType ) \
374
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT> \
369
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR > \
375
370
detail::enable_if_t < \
376
371
is_sint_to_float<T, R>::value && std::is_same<R, DestType>::value, R> \
377
372
convertImpl (T Value) { \
@@ -387,7 +382,7 @@ __SYCL_GENERATE_CONVERT_IMPL(SToF, double)
387
382
388
383
// uint to float
389
384
#define __SYCL_GENERATE_CONVERT_IMPL (SPIRVOp, DestType ) \
390
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT> \
385
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR > \
391
386
detail::enable_if_t < \
392
387
is_uint_to_float<T, R>::value && std::is_same<R, DestType>::value, R> \
393
388
convertImpl (T Value) { \
@@ -404,7 +399,7 @@ __SYCL_GENERATE_CONVERT_IMPL(UToF, double)
404
399
// float to float
405
400
#define __SYCL_GENERATE_CONVERT_IMPL (DestType, RoundingMode, \
406
401
RoundingModeCondition) \
407
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT> \
402
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR > \
408
403
detail::enable_if_t <!std::is_same<T, R>::value && \
409
404
is_float_to_float<T, R>::value && \
410
405
std::is_same<R, DestType>::value && \
@@ -432,9 +427,9 @@ __SYCL_GENERATE_CONVERT_IMPL_FOR_ROUNDING_MODE(rtn, Rtn)
432
427
// float to int
433
428
#define __SYCL_GENERATE_CONVERT_IMPL (SPIRVOp, DestType, RoundingMode, \
434
429
RoundingModeCondition) \
435
- template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT> \
430
+ template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT, typename OpenCLR > \
436
431
detail::enable_if_t <is_float_to_int<T, R>::value && \
437
- std::is_same<R , DestType>::value && \
432
+ std::is_same<OpenCLR , DestType>::value && \
438
433
RoundingModeCondition<roundingMode>::value, \
439
434
R> \
440
435
convertImpl (T Value) { \
@@ -776,9 +771,10 @@ template <typename Type, int NumElements> class vec {
776
771
" Unsupported convertT" );
777
772
vec<convertT, NumElements> Result;
778
773
using OpenCLT = detail::ConvertToOpenCLType_t<DataT>;
774
+ using OpenCLR = detail::ConvertToOpenCLType_t<convertT>;
779
775
for (size_t I = 0 ; I < NumElements; ++I) {
780
776
Result.setValue (
781
- I, detail::convertImpl<DataT, convertT, roundingMode, OpenCLT>(getValue (I)));
777
+ I, detail::convertImpl<DataT, convertT, roundingMode, OpenCLT, OpenCLR >(getValue (I)));
782
778
}
783
779
return Result;
784
780
}
0 commit comments