raw/ioat: fix issue with icc build
Checks
Commit Message
When using _mm_set_epi64() rather than _mm_set_epi64x() intrinsic, ICC
tries to use the x87 floating point registers, leading to warnings about
not properly clearing value when switching between x87 and SSE/AVX modes.
error #13203: No EMMS instruction before call to function
Fix this by using the set64x() intrinsic.
Fixes: 0a92e63fc4cd ("raw/ioat: add local API to perform copies")
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
drivers/raw/ioat/rte_ioat_rawdev.h | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
Comments
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Bruce Richardson
> Sent: Friday, July 5, 2019 12:54 PM
> To: dev@dpdk.org
> Cc: Richardson, Bruce <bruce.richardson@intel.com>
> Subject: [dpdk-dev] [PATCH] raw/ioat: fix issue with icc build
>
> When using _mm_set_epi64() rather than _mm_set_epi64x() intrinsic, ICC
> tries to use the x87 floating point registers, leading to warnings about
> not properly clearing value when switching between x87 and SSE/AVX modes.
>
> error #13203: No EMMS instruction before call to function
>
> Fix this by using the set64x() intrinsic.
>
> Fixes: 0a92e63fc4cd ("raw/ioat: add local API to perform copies")
>
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
New code compiles fine here with Gcc and Clang;
Acked-by: Harry van Haaren <harry.van.haaren@intel.com>
On 05-Jul-19 12:54 PM, Bruce Richardson wrote:
> When using _mm_set_epi64() rather than _mm_set_epi64x() intrinsic, ICC
> tries to use the x87 floating point registers, leading to warnings about
> not properly clearing value when switching between x87 and SSE/AVX modes.
>
> error #13203: No EMMS instruction before call to function
>
> Fix this by using the set64x() intrinsic.
>
> Fixes: 0a92e63fc4cd ("raw/ioat: add local API to perform copies")
>
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
Tested-by: Anatoly Burakov <anatoly.burakov@intel.com>
05/07/2019 14:33, Burakov, Anatoly:
> On 05-Jul-19 12:54 PM, Bruce Richardson wrote:
> > When using _mm_set_epi64() rather than _mm_set_epi64x() intrinsic, ICC
> > tries to use the x87 floating point registers, leading to warnings about
> > not properly clearing value when switching between x87 and SSE/AVX modes.
> >
> > error #13203: No EMMS instruction before call to function
> >
> > Fix this by using the set64x() intrinsic.
> >
> > Fixes: 0a92e63fc4cd ("raw/ioat: add local API to perform copies")
> >
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
>
> Tested-by: Anatoly Burakov <anatoly.burakov@intel.com>
Applied, thanks
@@ -124,8 +124,7 @@ rte_ioat_enqueue_copy(int dev_id, phys_addr_t src, phys_addr_t dst,
desc->src_addr = src;
desc->dest_addr = dst;
- ioat->hdls[write] = _mm_set_epi64((__m64)((uint64_t)dst_hdl),
- (__m64)((uint64_t)src_hdl));
+ ioat->hdls[write] = _mm_set_epi64x((int64_t)dst_hdl, (int64_t)src_hdl);
rte_prefetch0(&ioat->desc_ring[ioat->next_write & mask]);
ioat->enqueued++;