diff --git a/sycl/include/sycl/ext/intel/esimd/detail/math_intrin.hpp b/sycl/include/sycl/ext/intel/esimd/detail/math_intrin.hpp index 616d38b4225f2..e5ab223511ede 100644 --- a/sycl/include/sycl/ext/intel/esimd/detail/math_intrin.hpp +++ b/sycl/include/sycl/ext/intel/esimd/detail/math_intrin.hpp @@ -102,6 +102,11 @@ extern __DPCPP_SYCL_EXTERNAL __ESIMD_raw_vec_t(T, N) __spirv_ocl_fmax(__ESIMD_raw_vec_t(T, N), __ESIMD_raw_vec_t(T, N)) __ESIMD_INTRIN_END; +template extern __DPCPP_SYCL_EXTERNAL T __spirv_ocl_rsqrt(T); +template +extern __DPCPP_SYCL_EXTERNAL __ESIMD_raw_vec_t(T, N) + __spirv_ocl_rsqrt(__ESIMD_raw_vec_t(T, N)) __ESIMD_INTRIN_END; + // saturation intrinsics template __ESIMD_INTRIN __ESIMD_raw_vec_t(T0, SZ) diff --git a/sycl/include/sycl/ext/intel/esimd/math.hpp b/sycl/include/sycl/ext/intel/esimd/math.hpp index 5a1006896ae80..077db690ba70f 100644 --- a/sycl/include/sycl/ext/intel/esimd/math.hpp +++ b/sycl/include/sycl/ext/intel/esimd/math.hpp @@ -456,20 +456,24 @@ __ESIMD_UNARY_INTRINSIC_DEF(__ESIMD_EMATH_SPIRV_COND, cos, cos) template __ESIMD_API std::enable_if_t, simd> rsqrt(simd src, Sat sat = {}) { + __ESIMD_DNS::vector_type_t<__ESIMD_DNS::__raw_t, N> res = + __spirv_ocl_rsqrt<__ESIMD_DNS::__raw_t, N>(src.data()); if constexpr (std::is_same_v) - return inv(sqrt(src)); + return res; else - return esimd::saturate(inv(sqrt(src))); + return esimd::saturate(simd(res)); } /** Scalar version. */ template __ESIMD_API std::enable_if_t, double> rsqrt(T src, Sat sat = {}) { + __ESIMD_DNS::__raw_t res = + __spirv_ocl_rsqrt<__ESIMD_DNS::__raw_t>(src); if constexpr (std::is_same_v) - return inv(sqrt(src)); + return res; else - return esimd::saturate(inv(sqrt(src))); + return esimd::saturate(simd(res))[0]; } #undef __ESIMD_UNARY_INTRINSIC_DEF diff --git a/sycl/test/check_device_code/esimd/rsqrt_double.cpp b/sycl/test/check_device_code/esimd/rsqrt_double.cpp new file mode 100644 index 0000000000000..594b88bed41fa --- /dev/null +++ b/sycl/test/check_device_code/esimd/rsqrt_double.cpp @@ -0,0 +1,13 @@ +// RUN: %clangxx -fsycl -fsycl-device-only -S -emit-llvm %s -o - | \ +// RUN: FileCheck %s --implicit-check-not=recip + +// This test checks that all we use SPIR-V rsqrt for doubles. + +#include +#include + +SYCL_ESIMD_KERNEL SYCL_EXTERNAL void kernel() { + __ESIMD_NS::simd v(0, 1); + v = __ESIMD_NS::rsqrt(v); + // CHECK: __spirv_ocl_rsqrt +}