diff --git a/util/math_reference.cpp b/util/math_reference.cpp index c7ea1006d..67b34ef12 100644 --- a/util/math_reference.cpp +++ b/util/math_reference.cpp @@ -203,7 +203,7 @@ T mad_sat_signed_long(T x, T y, T z) { if ((x > 0 && y > 0) || (x < 0 && y < 0)) if (mul > 0 && std::abs(mul) > std::abs(x) && std::abs(mul) > std::abs(y)) return add_sat(mul, z); - else if (z < 0 && mul - std::numeric_limits::min() < abs(z)) + else if (z < 0 && mul - std::numeric_limits::min() < std::abs(z)) return std::numeric_limits::max() + z; else return std::numeric_limits::max(); diff --git a/util/math_reference.h b/util/math_reference.h index 162ddc5e1..d24ab754b 100644 --- a/util/math_reference.h +++ b/util/math_reference.h @@ -285,10 +285,21 @@ sycl::marray select(sycl::marray a, sycl::marray b, /* absolute value */ template -T abs(T x) { - return x < 0 ? -x : x; +sycl_cts::resultRef abs(T x) { + using U = typename std::make_unsigned::type; + T result = x < 0 ? T(-U(x)) : x; + return result < 0 ? sycl_cts::resultRef(0, true) : result; +} +template +sycl_cts::resultRef> abs(sycl::vec a) { + return sycl_cts::math::run_func_on_vector_result_ref( + [](T x) { return abs(x); }, a); +} +template +sycl_cts::resultRef> abs(sycl::marray a) { + return sycl_cts::math::run_func_on_marray_result_ref( + [](T x) { return abs(x); }, a); } -MAKE_VEC_AND_MARRAY_VERSIONS(abs) /* absolute difference */ template