62 #ifndef __SYCL_DEVICE_ONLY__
66 #include <type_traits>
69 #if defined(__SYCL_DEVICE_ONLY__) && (defined(__SPIR__) || defined(__SPIRV__))
158 inline namespace _V1 {
159 #ifndef __SYCL_DEVICE_ONLY__
173 int VecSize,
typename NativeFromT,
typename NativeToT>
176 template <
typename T,
typename R>
178 std::bool_constant<is_sigeninteger_v<T> && is_sigeninteger_v<R>>;
180 template <
typename T,
typename R>
182 std::bool_constant<is_sugeninteger_v<T> && is_sugeninteger_v<R>>;
184 template <
typename T,
typename R>
186 (detail::is_sigeninteger_v<T> && detail::is_sugeninteger_v<R>) ||
187 (detail::is_sugeninteger_v<T> && detail::is_sigeninteger_v<R>)>;
189 template <
typename T,
typename R>
191 std::bool_constant<std::is_integral_v<T> && !std::is_unsigned_v<T> &&
194 template <
typename T,
typename R>
196 std::bool_constant<std::is_unsigned_v<T> &&
199 template <
typename T,
typename R>
203 template <
typename T,
typename R>
205 std::bool_constant<detail::is_floating_point<T>::value &&
206 std::is_unsigned_v<R>>;
208 template <
typename T,
typename R>
210 std::bool_constant<detail::is_floating_point<T>::value &&
211 std::is_integral_v<R> && !std::is_unsigned_v<R>>;
213 template <
typename T,
typename R>
215 std::bool_constant<detail::is_floating_point<T>::value &&
220 #ifndef __SYCL_DEVICE_ONLY__
221 template <
typename From,
typename To,
int VecSize,
222 typename Enable = std::enable_if_t<VecSize == 1>>
224 return static_cast<To
>(Value);
227 template <
typename From,
typename To,
int VecSize,
228 typename Enable = std::enable_if_t<VecSize == 1>>
230 return static_cast<To
>(Value);
233 template <
typename From,
typename To,
int VecSize,
234 typename Enable = std::enable_if_t<VecSize == 1>>
236 return static_cast<To
>(Value);
239 template <
typename From,
typename To,
int VecSize,
240 typename Enable = std::enable_if_t<VecSize == 1>>
242 return static_cast<To
>(Value);
245 template <
typename From,
typename To,
int VecSize,
246 typename Enable = std::enable_if_t<VecSize == 1>,
249 return static_cast<To
>(Value);
252 template <
typename From,
typename To,
int VecSize,
253 typename Enable = std::enable_if_t<VecSize == 1>,
256 switch (roundingMode) {
261 int OldRoundingDirection = std::fegetround();
262 int Err = std::fesetround(FE_TONEAREST);
265 "Unable to set rounding mode to FE_TONEAREST");
267 Err = std::fesetround(OldRoundingDirection);
270 "Unable to restore rounding mode.");
283 assert(
false &&
"Unsupported rounding mode!");
284 return static_cast<To
>(Value);
287 template <
typename From,
typename To,
int VecSize,
288 typename Enable = std::enable_if_t<VecSize == 1>,
291 return ConvertFToS<From, To, VecSize, Enable, roundingMode>(Value);
294 template <
typename NativeToT, sycl::rounding_mode RoundingMode>
297 float fval =
static_cast<float>(val);
299 if constexpr (std::is_same_v<NativeToT, float>)
303 return convertImpl<float, NativeToT, RoundingMode, 1, float, NativeToT>(
307 template <
typename NativeFromT, sycl::rounding_mode RoundingMode>
310 constexpr
int rm =
static_cast<int>(RoundingMode);
311 return sycl::ext::oneapi::detail::ConvertToBfloat16::
312 getBfloat16WithRoundingMode<NativeFromT, rm>(val);
321 template <rounding_mode Mode>
using AnyRM = std::bool_constant<true>;
323 template <rounding_mode Mode>
327 template <rounding_mode Mode>
328 using Rtz = std::bool_constant<Mode == rounding_mode::rtz>;
330 template <rounding_mode Mode>
331 using Rtp = std::bool_constant<Mode == rounding_mode::rtp>;
333 template <rounding_mode Mode>
334 using Rtn = std::bool_constant<Mode == rounding_mode::rtn>;
336 template <
int VecSize>
using IsScalar = std::bool_constant<VecSize == 1>;
338 template <
int ExpectedVecSize,
int ActualVecSize>
339 using IsVectorOf = std::bool_constant<ActualVecSize == ExpectedVecSize>;
344 template <
typename ExpectedType,
typename ActualType>
345 using IsExpectedIntType =
346 std::bool_constant<std::is_same_v<ExpectedType, ActualType> ||
347 (std::is_same_v<ExpectedType, sycl::opencl::cl_char> &&
348 std::is_same_v<ActualType, signed char>)>;
351 template <
typename ExpectedType,
typename ActualType,
int VecSize,
353 template <sycl::rounding_mode>
typename RoundingModeCondition,
355 struct enable_if_to_int_scalar
356 : std::enable_if<IsExpectedIntType<ExpectedType, ActualType>::value &&
357 IsScalar<VecSize>::value &&
358 RoundingModeCondition<RoundingMode>::value,
361 template <
typename ExpectedType,
typename ActualType,
int VecSize,
363 template <sycl::rounding_mode>
typename RoundingModeCondition = AnyRM,
365 using enable_if_to_int_scalar_t =
366 typename enable_if_to_int_scalar<ExpectedType, ActualType, VecSize,
367 ReturnType, RoundingModeCondition,
370 template <
typename ExpectedType,
typename ActualType,
int ExpectedVecSize,
371 int ActualVecSize,
typename ReturnType,
372 template <sycl::rounding_mode>
typename RoundingModeCondition,
374 struct enable_if_to_int_vector
375 : std::enable_if<IsExpectedIntType<ExpectedType, ActualType>::value &&
376 IsVectorOf<ExpectedVecSize, ActualVecSize>::value &&
377 RoundingModeCondition<RoundingMode>::value,
380 template <
typename ExpectedType,
typename ActualType,
int ExpectedVecSize,
381 int ActualVecSize,
typename ReturnType,
382 template <sycl::rounding_mode>
typename RoundingModeCondition = AnyRM,
384 using enable_if_to_int_vector_t =
385 typename enable_if_to_int_vector<ExpectedType, ActualType, ExpectedVecSize,
386 ActualVecSize, ReturnType,
387 RoundingModeCondition, RoundingMode>::type;
390 #define __SYCL_SCALAR_INT_INT_CONVERT(Op, DestType) \
391 template <typename From, typename To, int VecSize, typename Enable> \
392 enable_if_to_int_scalar_t<sycl::opencl::cl_##DestType, Enable, VecSize, To> \
393 Op##Convert(From value) { \
394 return __spirv_##Op##Convert_R##DestType(value); \
397 #define __SYCL_VECTOR_INT_INT_CONVERT(Op, N, DestType) \
398 template <typename From, typename To, int VecSize, typename Enable> \
399 enable_if_to_int_vector_t<sycl::opencl::cl_##DestType, Enable, N, VecSize, \
401 Op##Convert(From value) { \
402 return __spirv_##Op##Convert_R##DestType##N(value); \
405 #define __SYCL_INT_INT_CONVERT(Op, DestType) \
406 __SYCL_SCALAR_INT_INT_CONVERT(Op, DestType) \
407 __SYCL_VECTOR_INT_INT_CONVERT(Op, 2, DestType) \
408 __SYCL_VECTOR_INT_INT_CONVERT(Op, 3, DestType) \
409 __SYCL_VECTOR_INT_INT_CONVERT(Op, 4, DestType) \
410 __SYCL_VECTOR_INT_INT_CONVERT(Op, 8, DestType) \
411 __SYCL_VECTOR_INT_INT_CONVERT(Op, 16, DestType)
413 __SYCL_INT_INT_CONVERT(S,
char)
414 __SYCL_INT_INT_CONVERT(S,
short)
415 __SYCL_INT_INT_CONVERT(S,
int)
416 __SYCL_INT_INT_CONVERT(S,
long)
418 __SYCL_INT_INT_CONVERT(U,
uchar)
419 __SYCL_INT_INT_CONVERT(U,
ushort)
420 __SYCL_INT_INT_CONVERT(U,
uint)
421 __SYCL_INT_INT_CONVERT(U, ulong)
423 #undef __SYCL_SCALAR_INT_INT_CONVERT
424 #undef __SYCL_VECTOR_INT_INT_CONVERT
425 #undef __SYCL_INT_INT_CONVERT
428 #define __SYCL_SCALAR_FLOAT_INT_CONVERT(Op, DestType, RoundingMode, \
429 RoundingModeCondition) \
430 template <typename From, typename To, int VecSize, typename Enable, \
431 sycl::rounding_mode RM> \
432 enable_if_to_int_scalar_t<sycl::opencl::cl_##DestType, Enable, VecSize, To, \
433 RoundingModeCondition, RM> \
434 Convert##Op(From Value) { \
435 return __spirv_Convert##Op##_R##DestType##_##RoundingMode(Value); \
438 #define __SYCL_VECTOR_FLOAT_INT_CONVERT(Op, N, DestType, RoundingMode, \
439 RoundingModeCondition) \
440 template <typename From, typename To, int VecSize, typename Enable, \
441 sycl::rounding_mode RM> \
442 enable_if_to_int_vector_t<sycl::opencl::cl_##DestType, Enable, N, VecSize, \
443 To, RoundingModeCondition, RM> \
444 Convert##Op(From Value) { \
445 return __spirv_Convert##Op##_R##DestType##N##_##RoundingMode(Value); \
448 #define __SYCL_FLOAT_INT_CONVERT(Op, DestType, RoundingMode, \
449 RoundingModeCondition) \
450 __SYCL_SCALAR_FLOAT_INT_CONVERT(Op, DestType, RoundingMode, \
451 RoundingModeCondition) \
452 __SYCL_VECTOR_FLOAT_INT_CONVERT(Op, 2, DestType, RoundingMode, \
453 RoundingModeCondition) \
454 __SYCL_VECTOR_FLOAT_INT_CONVERT(Op, 3, DestType, RoundingMode, \
455 RoundingModeCondition) \
456 __SYCL_VECTOR_FLOAT_INT_CONVERT(Op, 4, DestType, RoundingMode, \
457 RoundingModeCondition) \
458 __SYCL_VECTOR_FLOAT_INT_CONVERT(Op, 8, DestType, RoundingMode, \
459 RoundingModeCondition) \
460 __SYCL_VECTOR_FLOAT_INT_CONVERT(Op, 16, DestType, RoundingMode, \
461 RoundingModeCondition)
463 #define __SYCL_FLOAT_INT_CONVERT_FOR_TYPE(Op, DestType) \
464 __SYCL_FLOAT_INT_CONVERT(Op, DestType, rte, RteOrAutomatic) \
465 __SYCL_FLOAT_INT_CONVERT(Op, DestType, rtz, Rtz) \
466 __SYCL_FLOAT_INT_CONVERT(Op, DestType, rtp, Rtp) \
467 __SYCL_FLOAT_INT_CONVERT(Op, DestType, rtn, Rtn)
469 __SYCL_FLOAT_INT_CONVERT_FOR_TYPE(FToS,
char)
470 __SYCL_FLOAT_INT_CONVERT_FOR_TYPE(FToS,
short)
471 __SYCL_FLOAT_INT_CONVERT_FOR_TYPE(FToS,
int)
472 __SYCL_FLOAT_INT_CONVERT_FOR_TYPE(FToS,
long)
474 __SYCL_FLOAT_INT_CONVERT_FOR_TYPE(FToU,
uchar)
475 __SYCL_FLOAT_INT_CONVERT_FOR_TYPE(FToU,
ushort)
476 __SYCL_FLOAT_INT_CONVERT_FOR_TYPE(FToU,
uint)
477 __SYCL_FLOAT_INT_CONVERT_FOR_TYPE(FToU, ulong)
479 #undef __SYCL_SCALAR_FLOAT_INT_CONVERT
480 #undef __SYCL_VECTOR_FLOAT_INT_CONVERT
481 #undef __SYCL_FLOAT_INT_CONVERT
482 #undef __SYCL_FLOAT_INT_CONVERT_FOR_TYPE
485 template <
typename ExpectedType,
typename ActualType>
486 using IsExpectedFloatType =
487 std::bool_constant<std::is_same_v<ExpectedType, ActualType> ||
488 (std::is_same_v<ExpectedType, sycl::opencl::cl_half> &&
489 std::is_same_v<ActualType, _Float16>)>;
491 template <
typename ExpectedType,
typename ActualType,
int VecSize,
493 template <sycl::rounding_mode>
typename RoundingModeCondition,
495 struct enable_if_to_float_scalar
496 : std::enable_if<IsExpectedFloatType<ExpectedType, ActualType>::value &&
497 IsScalar<VecSize>::value &&
498 RoundingModeCondition<RoundingMode>::value,
501 template <
typename ExpectedType,
typename ActualType,
int VecSize,
503 template <sycl::rounding_mode>
typename RoundingModeCondition = AnyRM,
505 using enable_if_to_float_scalar_t =
506 typename enable_if_to_float_scalar<ExpectedType, ActualType, VecSize,
507 ReturnType, RoundingModeCondition,
510 template <
typename ExpectedType,
typename ActualType,
int ExpectedVecSize,
511 int ActualVecSize,
typename ReturnType,
512 template <sycl::rounding_mode>
typename RoundingModeCondition,
514 struct enable_if_to_float_vector
515 : std::enable_if<IsExpectedFloatType<ExpectedType, ActualType>::value &&
516 IsVectorOf<ExpectedVecSize, ActualVecSize>::value &&
517 RoundingModeCondition<RoundingMode>::value,
520 template <
typename ExpectedType,
typename ActualType,
int ExpectedVecSize,
521 int ActualVecSize,
typename ReturnType,
522 template <sycl::rounding_mode>
typename RoundingModeCondition = AnyRM,
524 using enable_if_to_float_vector_t =
typename enable_if_to_float_vector<
525 ExpectedType, ActualType, ExpectedVecSize, ActualVecSize, ReturnType,
526 RoundingModeCondition, RoundingMode>::type;
529 #define __SYCL_SCALAR_INT_FLOAT_CONVERT(Op, DestType) \
530 template <typename From, typename To, int VecSize, typename Enable> \
531 enable_if_to_float_scalar_t<sycl::opencl::cl_##DestType, Enable, VecSize, \
533 Convert##Op(From value) { \
534 return __spirv_Convert##Op##_R##DestType(value); \
537 #define __SYCL_VECTOR_INT_FLOAT_CONVERT(Op, N, DestType) \
538 template <typename From, typename To, int VecSize, typename Enable> \
539 enable_if_to_float_vector_t<sycl::opencl::cl_##DestType, Enable, N, VecSize, \
541 Convert##Op(From value) { \
542 return __spirv_Convert##Op##_R##DestType##N(value); \
545 #define __SYCL_INT_FLOAT_CONVERT(Op, DestType) \
546 __SYCL_SCALAR_INT_FLOAT_CONVERT(Op, DestType) \
547 __SYCL_VECTOR_INT_FLOAT_CONVERT(Op, 2, DestType) \
548 __SYCL_VECTOR_INT_FLOAT_CONVERT(Op, 3, DestType) \
549 __SYCL_VECTOR_INT_FLOAT_CONVERT(Op, 4, DestType) \
550 __SYCL_VECTOR_INT_FLOAT_CONVERT(Op, 8, DestType) \
551 __SYCL_VECTOR_INT_FLOAT_CONVERT(Op, 16, DestType)
553 __SYCL_INT_FLOAT_CONVERT(SToF,
half)
554 __SYCL_INT_FLOAT_CONVERT(SToF,
float)
555 __SYCL_INT_FLOAT_CONVERT(SToF,
double)
557 __SYCL_INT_FLOAT_CONVERT(UToF,
half)
558 __SYCL_INT_FLOAT_CONVERT(UToF,
float)
559 __SYCL_INT_FLOAT_CONVERT(UToF,
double)
561 #undef __SYCL_SCALAR_INT_FLOAT_CONVERT
562 #undef __SYCL_VECTOR_INT_FLOAT_CONVERT
563 #undef __SYCL_INT_FLOAT_CONVERT
566 #define __SYCL_SCALAR_FLOAT_FLOAT_CONVERT(DestType, RoundingMode, \
567 RoundingModeCondition) \
568 template <typename From, typename To, int VecSize, typename Enable, \
569 sycl::rounding_mode RM> \
570 enable_if_to_float_scalar_t<sycl::opencl::cl_##DestType, Enable, VecSize, \
571 To, RoundingModeCondition, RM> \
572 FConvert(From Value) { \
573 return __spirv_FConvert_R##DestType##_##RoundingMode(Value); \
576 #define __SYCL_VECTOR_FLOAT_FLOAT_CONVERT(N, DestType, RoundingMode, \
577 RoundingModeCondition) \
578 template <typename From, typename To, int VecSize, typename Enable, \
579 sycl::rounding_mode RM> \
580 enable_if_to_float_vector_t<sycl::opencl::cl_##DestType, Enable, N, VecSize, \
581 To, RoundingModeCondition, RM> \
582 FConvert(From Value) { \
583 return __spirv_FConvert_R##DestType##N##_##RoundingMode(Value); \
586 #define __SYCL_FLOAT_FLOAT_CONVERT(DestType, RoundingMode, \
587 RoundingModeCondition) \
588 __SYCL_SCALAR_FLOAT_FLOAT_CONVERT(DestType, RoundingMode, \
589 RoundingModeCondition) \
590 __SYCL_VECTOR_FLOAT_FLOAT_CONVERT(2, DestType, RoundingMode, \
591 RoundingModeCondition) \
592 __SYCL_VECTOR_FLOAT_FLOAT_CONVERT(3, DestType, RoundingMode, \
593 RoundingModeCondition) \
594 __SYCL_VECTOR_FLOAT_FLOAT_CONVERT(4, DestType, RoundingMode, \
595 RoundingModeCondition) \
596 __SYCL_VECTOR_FLOAT_FLOAT_CONVERT(8, DestType, RoundingMode, \
597 RoundingModeCondition) \
598 __SYCL_VECTOR_FLOAT_FLOAT_CONVERT(16, DestType, RoundingMode, \
599 RoundingModeCondition)
601 #define __SYCL_FLOAT_FLOAT_CONVERT_FOR_TYPE(DestType) \
602 __SYCL_FLOAT_FLOAT_CONVERT(DestType, rte, RteOrAutomatic) \
603 __SYCL_FLOAT_FLOAT_CONVERT(DestType, rtz, Rtz) \
604 __SYCL_FLOAT_FLOAT_CONVERT(DestType, rtp, Rtp) \
605 __SYCL_FLOAT_FLOAT_CONVERT(DestType, rtn, Rtn)
607 __SYCL_FLOAT_FLOAT_CONVERT_FOR_TYPE(
half)
608 __SYCL_FLOAT_FLOAT_CONVERT_FOR_TYPE(
float)
609 __SYCL_FLOAT_FLOAT_CONVERT_FOR_TYPE(
double)
611 #undef __SYCL_SCALAR_FLOAT_FLOAT_CONVERT
612 #undef __SYCL_VECTOR_FLOAT_FLOAT_CONVERT
613 #undef __SYCL_FLOAT_FLOAT_CONVERT
614 #undef __SYCL_FLOAT_FLOAT_CONVERT_FOR_TYPE
616 template <
typename NativeBFT,
typename NativeFloatT,
int VecSize>
617 inline NativeFloatT ConvertBF16ToFVec(NativeBFT
vec) {
622 constexpr
int AdjustedSize = (VecSize == 3) ? 4 : VecSize;
623 float dst[AdjustedSize];
624 sycl::ext::oneapi::detail::BF16VecToFloatVec<VecSize>(src, dst);
626 return sycl::bit_cast<NativeFloatT>(dst);
629 template <
typename NativeFloatT,
typename NativeBFT,
int VecSize>
630 inline NativeBFT ConvertFToBF16Vec(NativeFloatT
vec) {
631 float *src = sycl::bit_cast<float *>(&
vec);
635 constexpr
int AdjustedSize = (VecSize == 3) ? 4 : VecSize;
638 sycl::ext::oneapi::detail::FloatVecToBF16Vec<VecSize>(src, dst);
639 return sycl::bit_cast<NativeBFT>(dst);
643 #if defined(__SPIR__) || defined(__SPIRV__)
644 #define EXPAND_BF16_ROUNDING_MODE(type, type_str, rmode, rmode_str) \
645 template <typename NativeToT, sycl::rounding_mode RoundingMode> \
646 std::enable_if_t<(std::is_same_v<NativeToT, type> && RoundingMode == rmode), \
648 ConvertFromBF16Scalar(uint16_t val) { \
649 return __imf_bfloat162##type_str##_##rmode_str(val); \
651 template <typename NativeFromT, sycl::rounding_mode RoundingMode> \
653 (std::is_same_v<NativeFromT, type> && RoundingMode == rmode), uint16_t> \
654 ConvertToBF16Scalar(NativeFromT val) { \
655 return __imf_##type_str##2bfloat16_##rmode_str(val); \
661 #define EXPAND_BF16_ROUNDING_MODE(type, type_str, rmode, rmode_str) \
662 template <typename NativeToT, sycl::rounding_mode RoundingMode> \
663 std::enable_if_t<(std::is_same_v<NativeToT, type> && RoundingMode == rmode), \
665 ConvertFromBF16Scalar(uint16_t val) { \
666 bfloat16 bfval = sycl::bit_cast<bfloat16>(val); \
667 float fval = static_cast<float>(bfval); \
668 return convertImpl<fval, NativeToT, RoundingMode, 1, float, NativeToT>( \
671 template <typename NativeFromT, sycl::rounding_mode RoundingMode> \
673 (std::is_same_v<NativeFromT, type> && RoundingMode == rmode), uint16_t> \
674 ConvertToBF16Scalar(NativeFromT val) { \
675 constexpr int rm = static_cast<int>(RoundingMode); \
676 bfloat16 bfval = sycl::ext::oneapi::detail::ConvertToBfloat16:: \
677 getBfloat16WithRoundingMode<NativeFromT, rm>(val); \
678 return sycl::bit_cast<uint16_t>(bfval); \
682 #define EXPAND_BF16_TYPE(type, type_str) \
683 EXPAND_BF16_ROUNDING_MODE(type, type_str, sycl::rounding_mode::automatic, \
685 EXPAND_BF16_ROUNDING_MODE(type, type_str, sycl::rounding_mode::rte, rn) \
686 EXPAND_BF16_ROUNDING_MODE(type, type_str, sycl::rounding_mode::rtp, ru) \
687 EXPAND_BF16_ROUNDING_MODE(type, type_str, sycl::rounding_mode::rtn, rd) \
688 EXPAND_BF16_ROUNDING_MODE(type, type_str, sycl::rounding_mode::rtz, rz)
691 EXPAND_BF16_TYPE(
int,
int)
693 EXPAND_BF16_TYPE(
short,
short)
694 EXPAND_BF16_TYPE(
long, ll)
695 EXPAND_BF16_TYPE(
unsigned long long, ull)
697 #undef EXPAND_BF16_TYPE
698 #undef EXPAND_BF16_ROUNDING_MODE
702 template <
typename NativeToT, sycl::rounding_mode RoundingMode>
703 std::enable_if_t<std::is_same_v<NativeToT, float>, NativeToT>
705 bfloat16 bfval = sycl::bit_cast<bfloat16>(val);
706 return static_cast<float>(bfval);
709 template <
typename NativeFromT, sycl::rounding_mode RoundingMode>
710 std::enable_if_t<std::is_same_v<NativeFromT, double>, uint16_t>
712 #if defined(__SPIR__) || defined(__SPIRV__)
715 constexpr
int rm =
static_cast<int>(RoundingMode);
718 NativeFromT, rm>(val);
719 return sycl::bit_cast<uint16_t>(bfval);
723 template <
typename NativeFromT, sycl::rounding_mode RoundingMode>
724 std::enable_if_t<std::is_same_v<NativeFromT, float>, uint16_t>
727 #if defined(__SPIR__) || defined(__SPIRV__)
738 static_assert(
false,
"Invalid rounding mode.");
740 constexpr
int rm =
static_cast<int>(RoundingMode);
744 return sycl::bit_cast<uint16_t>(bfval);
751 template <
typename ToT,
typename NativeFromT,
typename NativeToT,
754 #ifdef __SYCL_DEVICE_ONLY__
756 if constexpr (std::is_same_v<ToT, float> && VecSize > 1)
757 return ConvertBF16ToFVec<NativeFromT, NativeToT, VecSize>(val);
761 if constexpr (VecSize > 1) {
763 for (
int i = 0; i < VecSize; i++) {
764 retval[i] = ConvertFromBF16Scalar<ToT, RoundingMode>(val[i]);
770 return ConvertFromBF16Scalar<NativeToT, RoundingMode>(val);
774 template <
typename FromT,
typename NativeFromT,
typename NativeToT,
777 #ifdef __SYCL_DEVICE_ONLY__
779 if constexpr (std::is_same_v<FromT, float> && VecSize > 1 &&
782 return ConvertFToBF16Vec<NativeFromT, NativeToT, VecSize>(val);
786 if constexpr (VecSize > 1) {
788 for (
int i = 0; i < VecSize; i++) {
789 retval[i] = ConvertToBF16Scalar<FromT, RoundingMode>(val[i]);
795 return ConvertToBF16Scalar<NativeFromT, RoundingMode>(val);
819 int VecSize,
typename NativeFromT,
typename NativeToT>
821 static_assert(!std::is_same_v<FromT, ToT>);
822 static_assert(!std::is_same_v<NativeFromT, NativeToT>);
825 return SConvert<NativeFromT, NativeToT, VecSize, ElemTy>(Value);
827 return UConvert<NativeFromT, NativeToT, VecSize, ElemTy>(Value);
829 return ConvertSToF<NativeFromT, NativeToT, VecSize, ElemTy>(Value);
831 return ConvertUToF<NativeFromT, NativeToT, VecSize, ElemTy>(Value);
833 return FConvert<NativeFromT, NativeToT, VecSize, ElemTy, RoundingMode>(
836 else if constexpr (std::is_same_v<FromT, bfloat16>)
837 return ConvertFromBF16<ToT, NativeFromT, NativeToT, RoundingMode, VecSize>(
840 else if constexpr (std::is_same_v<ToT, bfloat16>)
841 return ConvertToBF16<FromT, NativeFromT, NativeToT, RoundingMode, VecSize>(
844 return ConvertFToS<NativeFromT, NativeToT, VecSize, ElemTy, RoundingMode>(
847 return ConvertFToU<NativeFromT, NativeToT, VecSize, ElemTy, RoundingMode>(
851 "Unexpected conversion type");
852 static_assert(VecSize == 1,
"Conversion between signed and unsigned data "
853 "types is only available for scalars");
860 return static_cast<NativeToT
>(Value);
864 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
866 int VecSize,
typename NativeFromT,
typename NativeToT>
868 return convertImpl<FromT, ToT, RoundingMode, VecSize, NativeFromT, NativeToT>(
static bfloat16 getBfloat16WithRoundingMode(const Ty &a)
#define __DPCPP_SYCL_EXTERNAL
uint16_t __imf_short_as_bfloat16(short)
unsigned long long __imf_bfloat162ull_rz(uint16_t)
unsigned short __imf_bfloat162ushort_rz(uint16_t)
uint16_t __imf_float2bfloat16_rd(float)
uint16_t __imf_ull2bfloat16_rz(unsigned long long)
uint16_t __imf_ushort2bfloat16_rz(unsigned short)
short __imf_bfloat162short_rn(uint16_t)
uint16_t __imf_int2bfloat16_ru(int)
uint16_t __imf_ushort2bfloat16_rn(unsigned short)
uint16_t __imf_ll2bfloat16_rd(long long)
unsigned int __imf_bfloat162uint_ru(uint16_t)
uint16_t __imf_float2bfloat16(float)
uint16_t __imf_short2bfloat16_rd(short)
unsigned long long __imf_bfloat162ull_rn(uint16_t)
long long __imf_bfloat162ll_rz(uint16_t)
uint16_t __imf_int2bfloat16_rd(int)
uint16_t __imf_uint2bfloat16_rd(unsigned int)
uint16_t __imf_float2bfloat16_ru(float)
int __imf_bfloat162int_ru(uint16_t)
unsigned int __imf_bfloat162uint_rn(uint16_t)
long long __imf_bfloat162ll_rn(uint16_t)
uint16_t __imf_ushort2bfloat16_ru(unsigned short)
int __imf_bfloat162int_rz(uint16_t)
unsigned long long __imf_bfloat162ull_ru(uint16_t)
unsigned short __imf_bfloat162ushort_rn(uint16_t)
uint16_t __imf_float2bfloat16_rn(float)
uint16_t __imf_ll2bfloat16_rn(long long)
uint16_t __imf_ll2bfloat16_rz(long long)
int __imf_bfloat162int_rd(uint16_t)
unsigned short __imf_bfloat162ushort_ru(uint16_t)
unsigned int __imf_bfloat162uint_rd(uint16_t)
uint16_t __imf_int2bfloat16_rn(int)
uint16_t __imf_float2bfloat16_rz(float)
uint16_t __imf_ull2bfloat16_rd(unsigned long long)
short __imf_bfloat162short_ru(uint16_t)
uint16_t __imf_short2bfloat16_ru(short)
uint16_t __imf_int2bfloat16_rz(int)
uint16_t __imf_ull2bfloat16_ru(unsigned long long)
float __imf_bfloat162float(uint16_t)
int __imf_bfloat162int_rn(uint16_t)
uint16_t __imf_ull2bfloat16_rn(unsigned long long)
uint16_t __imf_double2bfloat16(double)
uint16_t __imf_ushort_as_bfloat16(unsigned short)
uint16_t __imf_uint2bfloat16_ru(unsigned int)
uint16_t __imf_short2bfloat16_rn(short)
long long __imf_bfloat162ll_ru(uint16_t)
uint16_t __imf_ll2bfloat16_ru(long long)
short __imf_bfloat162short_rd(uint16_t)
unsigned int __imf_bfloat162uint_rz(uint16_t)
short __imf_bfloat16_as_short(uint16_t)
unsigned short __imf_bfloat16_as_ushort(uint16_t)
long long __imf_bfloat162ll_rd(uint16_t)
uint16_t __imf_uint2bfloat16_rn(unsigned int)
unsigned short __imf_bfloat162ushort_rd(uint16_t)
uint16_t __imf_uint2bfloat16_rz(unsigned int)
uint16_t __imf_ushort2bfloat16_rd(unsigned short)
uint16_t __imf_short2bfloat16_rz(short)
short __imf_bfloat162short_rz(uint16_t)
unsigned long long __imf_bfloat162ull_rd(uint16_t)
To ConvertUToF(From Value)
std::bool_constant<(detail::is_sigeninteger_v< T > &&detail::is_sugeninteger_v< R >)||(detail::is_sugeninteger_v< T > &&detail::is_sigeninteger_v< R >)> is_sint_to_from_uint
std::bool_constant< is_sigeninteger_v< T > &&is_sigeninteger_v< R > > is_sint_to_sint
std::bool_constant< detail::is_floating_point< T >::value &&std::is_integral_v< R > &&!std::is_unsigned_v< R > > is_float_to_sint
std::bool_constant< std::is_integral_v< T > &&!std::is_unsigned_v< T > &&detail::is_floating_point< R >::value > is_sint_to_float
NativeToT ConvertFromBF16Scalar(bfloat16 val)
NativeToT convertImpl(NativeFromT)
Entry point helper for all kinds of converts between scalars and vectors, it dispatches to a right fu...
std::bool_constant< std::is_unsigned_v< T > &&detail::is_floating_point< R >::value > is_uint_to_float
std::bool_constant< is_sugeninteger_v< T > &&is_sugeninteger_v< R > > is_uint_to_uint
To ConvertSToF(From Value)
auto ConvertImpl(std::byte val)
NativeToT ConvertToBF16(NativeFromT val)
To ConvertFToU(From Value)
bfloat16 ConvertToBF16Scalar(NativeFromT val)
std::bool_constant< detail::is_floating_point< T >::value &&std::is_unsigned_v< R > > is_float_to_uint
To ConvertFToS(From Value)
NativeToT ConvertFromBF16(NativeFromT val)
sycl::ext::oneapi::bfloat16 bfloat16
decltype(convertToOpenCLType(std::declval< T >())) ConvertToOpenCLType_t
std::bool_constant< std::is_integral_v< T > &&detail::is_floating_point< R >::value > is_int_to_float
std::bool_constant< detail::is_floating_point< T >::value &&detail::is_floating_point< R >::value > is_float_to_float
std::error_code make_error_code(sycl::errc E) noexcept
Constructs an error code using e and sycl_category()
sycl::detail::half_impl::half half