diff --git a/sycl/include/sycl/ext/intel/experimental/esimd/math.hpp b/sycl/include/sycl/ext/intel/experimental/esimd/math.hpp index ce3054dd88672..ee188fa671faf 100644 --- a/sycl/include/sycl/ext/intel/experimental/esimd/math.hpp +++ b/sycl/include/sycl/ext/intel/experimental/esimd/math.hpp @@ -1371,22 +1371,25 @@ template <> ESIMD_INLINE float atan2(float y, float x) { template ESIMD_INLINE __ESIMD_NS::simd fmod(__ESIMD_NS::simd y, __ESIMD_NS::simd x) { - __ESIMD_NS::simd v_quot; - __ESIMD_NS::simd fmod; + __ESIMD_NS::simd abs_x = __ESIMD_NS::abs(x); + __ESIMD_NS::simd abs_y = __ESIMD_NS::abs(y); + auto fmod_sign_mask = (y.template bit_cast_view()) & 0x80000000; - v_quot = convert(y / x); - fmod = y - x * convert(v_quot); - return fmod; + __ESIMD_NS::simd reminder = + abs_y - abs_x * __ESIMD_NS::trunc(abs_y / abs_x); + + abs_x.merge(0.0, reminder >= 0); + __ESIMD_NS::simd fmod = reminder + abs_x; + __ESIMD_NS::simd fmod_abs = __ESIMD_NS::abs(fmod); + + auto fmod_bits = + (fmod_abs.template bit_cast_view()) | fmod_sign_mask; + return fmod_bits.template bit_cast_view(); } -// For Scalar Input +// For Scalar Input template <> ESIMD_INLINE float fmod(float y, float x) { - int v_quot; - __ESIMD_NS::simd fmod; - - v_quot = (int)(y / x); - fmod = y - x * v_quot; - return fmod[0]; + return fmod(__ESIMD_NS::simd(y), __ESIMD_NS::simd(x))[0]; } // sin_emu - EU emulation for sin(x)