@@ -314,14 +314,11 @@ using Rtp = detail::bool_constant<Mode == rounding_mode::rtp>;
314
314
template <rounding_mode Mode>
315
315
using Rtn = detail::bool_constant<Mode == rounding_mode::rtn>;
316
316
317
- // convert signed and unsigned types with an equal size and diff names
317
+ // convert types with an equal size and diff names
318
318
template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT,
319
319
typename OpenCLR>
320
- detail::enable_if_t <!std::is_same<T, R>::value &&
321
- (is_sint_to_sint<T, R>::value ||
322
- is_uint_to_uint<T, R>::value) &&
323
- std::is_same<OpenCLT, OpenCLR>::value,
324
- R>
320
+ detail::enable_if_t <
321
+ !std::is_same<T, R>::value && std::is_same<OpenCLT, OpenCLR>::value, R>
325
322
convertImpl (T Value) {
326
323
return static_cast <R>(Value);
327
324
}
@@ -330,12 +327,11 @@ convertImpl(T Value) {
330
327
#define __SYCL_GENERATE_CONVERT_IMPL (DestType ) \
331
328
template <typename T, typename R, rounding_mode roundingMode, \
332
329
typename OpenCLT, typename OpenCLR> \
333
- detail::enable_if_t <!std::is_same <T, R>::value && \
334
- is_sint_to_sint<T, R >::value && \
330
+ detail::enable_if_t <is_sint_to_sint <T, R>::value && \
331
+ !std::is_same<OpenCLT, OpenCLR >::value && \
335
332
(std::is_same<OpenCLR, DestType>::value || \
336
333
std::is_same<OpenCLR, signed char >::value && \
337
- std::is_same<DestType, char >::value) && \
338
- !std::is_same<OpenCLT, OpenCLR>::value, \
334
+ std::is_same<DestType, char >::value), \
339
335
R> \
340
336
convertImpl (T Value) { \
341
337
OpenCLT OpValue = cl::sycl::detail::convertDataToType<T, OpenCLT>(Value); \
@@ -346,18 +342,16 @@ __SYCL_GENERATE_CONVERT_IMPL(char)
346
342
__SYCL_GENERATE_CONVERT_IMPL(short )
347
343
__SYCL_GENERATE_CONVERT_IMPL(int )
348
344
__SYCL_GENERATE_CONVERT_IMPL(long )
349
- __SYCL_GENERATE_CONVERT_IMPL(longlong)
350
345
351
346
#undef __SYCL_GENERATE_CONVERT_IMPL
352
347
353
348
// unsigned to unsigned
354
349
#define __SYCL_GENERATE_CONVERT_IMPL (DestType ) \
355
350
template <typename T, typename R, rounding_mode roundingMode, \
356
351
typename OpenCLT, typename OpenCLR> \
357
- detail::enable_if_t <!std::is_same<T, R>::value && \
358
- is_uint_to_uint<T, R>::value && \
359
- std::is_same<OpenCLR, DestType>::value && \
360
- !std::is_same<OpenCLT, OpenCLR>::value, \
352
+ detail::enable_if_t <is_uint_to_uint<T, R>::value && \
353
+ !std::is_same<OpenCLT, OpenCLR>::value && \
354
+ std::is_same<OpenCLR, DestType>::value, \
361
355
R> \
362
356
convertImpl (T Value) { \
363
357
OpenCLT OpValue = cl::sycl::detail::convertDataToType<T, OpenCLT>(Value); \
@@ -374,16 +368,23 @@ __SYCL_GENERATE_CONVERT_IMPL(ulong)
374
368
// unsigned to (from) signed
375
369
template <typename T, typename R, rounding_mode roundingMode, typename OpenCLT,
376
370
typename OpenCLR>
377
- detail::enable_if_t <is_sint_to_from_uint<T, R>::value, R> convertImpl (T Value) {
371
+ detail::enable_if_t <is_sint_to_from_uint<T, R>::value &&
372
+ is_standard_type<OpenCLT>::value &&
373
+ is_standard_type<OpenCLR>::value,
374
+ R>
375
+ convertImpl (T Value) {
378
376
return static_cast <R>(Value);
379
377
}
380
378
381
379
// sint to float
382
380
#define __SYCL_GENERATE_CONVERT_IMPL (SPIRVOp, DestType ) \
383
381
template <typename T, typename R, rounding_mode roundingMode, \
384
382
typename OpenCLT, typename OpenCLR> \
385
- detail::enable_if_t < \
386
- is_sint_to_float<T, R>::value && std::is_same<R, DestType>::value, R> \
383
+ detail::enable_if_t <is_sint_to_float<T, R>::value && \
384
+ (std::is_same<OpenCLR, DestType>::value || \
385
+ std::is_same<OpenCLR, _Float16>::value && \
386
+ std::is_same<DestType, half>::value), \
387
+ R> \
387
388
convertImpl (T Value) { \
388
389
OpenCLT OpValue = cl::sycl::detail::convertDataToType<T, OpenCLT>(Value); \
389
390
return __spirv_Convert##SPIRVOp##_R##DestType (OpValue); \
@@ -399,8 +400,11 @@ __SYCL_GENERATE_CONVERT_IMPL(SToF, double)
399
400
#define __SYCL_GENERATE_CONVERT_IMPL (SPIRVOp, DestType ) \
400
401
template <typename T, typename R, rounding_mode roundingMode, \
401
402
typename OpenCLT, typename OpenCLR> \
402
- detail::enable_if_t < \
403
- is_uint_to_float<T, R>::value && std::is_same<R, DestType>::value, R> \
403
+ detail::enable_if_t <is_uint_to_float<T, R>::value && \
404
+ (std::is_same<OpenCLR, DestType>::value || \
405
+ std::is_same<OpenCLR, _Float16>::value && \
406
+ std::is_same<DestType, half>::value), \
407
+ R> \
404
408
convertImpl (T Value) { \
405
409
OpenCLT OpValue = cl::sycl::detail::convertDataToType<T, OpenCLT>(Value); \
406
410
return __spirv_Convert##SPIRVOp##_R##DestType (OpValue); \
@@ -417,9 +421,11 @@ __SYCL_GENERATE_CONVERT_IMPL(UToF, double)
417
421
RoundingModeCondition) \
418
422
template <typename T, typename R, rounding_mode roundingMode, \
419
423
typename OpenCLT, typename OpenCLR> \
420
- detail::enable_if_t <!std::is_same<T, R>::value && \
421
- is_float_to_float<T, R>::value && \
422
- std::is_same<R, DestType>::value && \
424
+ detail::enable_if_t <is_float_to_float<T, R>::value && \
425
+ !std::is_same<OpenCLT, OpenCLR>::value && \
426
+ (std::is_same<OpenCLR, DestType>::value || \
427
+ std::is_same<OpenCLR, _Float16>::value && \
428
+ std::is_same<DestType, half>::value) && \
423
429
RoundingModeCondition<roundingMode>::value, \
424
430
R> \
425
431
convertImpl (T Value) { \
0 commit comments