@@ -39,7 +39,10 @@ namespace esimd {
39
39
// / @param src the input vector.
40
40
// / @return vector of elements converted to \p T0 with saturation.
41
41
template <typename T0, typename T1, int SZ>
42
- __ESIMD_API simd<T0, SZ> saturate (simd<T1, SZ> src) {
42
+ __ESIMD_API std::enable_if_t <!detail::is_generic_floating_point_v<T0> ||
43
+ std::is_same_v<T1, T0>,
44
+ simd<T0, SZ>>
45
+ saturate (simd<T1, SZ> src) {
43
46
if constexpr (detail::is_generic_floating_point_v<T0>)
44
47
return __esimd_sat<T0, T1, SZ>(src.data ());
45
48
else if constexpr (detail::is_generic_floating_point_v<T1>) {
@@ -54,9 +57,9 @@ __ESIMD_API simd<T0, SZ> saturate(simd<T1, SZ> src) {
54
57
return __esimd_ustrunc_sat<T0, T1, SZ>(src.data ());
55
58
} else {
56
59
if constexpr (std::is_signed<T1>::value)
57
- return __esimd_sutrunc_sat<T0, T1, SZ>(src.data ());
58
- else
59
60
return __esimd_sstrunc_sat<T0, T1, SZ>(src.data ());
61
+ else
62
+ return __esimd_sutrunc_sat<T0, T1, SZ>(src.data ());
60
63
}
61
64
}
62
65
@@ -1723,7 +1726,12 @@ ESIMD_NODEBUG ESIMD_INLINE T exp(T src0) {
1723
1726
simd<float , SZ> Result = __esimd_##name<SZ>(src0.data ()); \
1724
1727
if (flag != saturation_on) \
1725
1728
return Result; \
1726
- return esimd::saturate<T>(Result); \
1729
+ if constexpr (!std::is_same_v<float , T>) { \
1730
+ auto RawRes = esimd::saturate<float >(Result).data (); \
1731
+ return detail::convert_vector<T, float , SZ>(std::move (RawRes)); \
1732
+ } else { \
1733
+ return esimd::saturate<T>(Result); \
1734
+ } \
1727
1735
} \
1728
1736
template <typename T> \
1729
1737
__ESIMD_API T name (float src0, int flag = saturation_off) { \
0 commit comments