[PATCH v7 06/14] eal: use prefetch intrinsics

Konstantin Ananyev konstantin.v.ananyev at yandex.ru
Mon May 1 14:57:12 CEST 2023


> nline assembly is not supported for MSVC x64 instead use _mm_prefetch
> and _mm_cldemote intrinsics.
> 
> Signed-off-by: Tyler Retzlaff <roretzla at linux.microsoft.com>
> Acked-by: Bruce Richardson <bruce.richardson at intel.com>
> Acked-by: Morten Brørup <mb at smartsharesystems.com>
> ---
>  lib/eal/x86/include/rte_prefetch.h | 25 +++++++++++++++++++++----
>  1 file changed, 21 insertions(+), 4 deletions(-)
> 
> diff --git a/lib/eal/x86/include/rte_prefetch.h b/lib/eal/x86/include/rte_prefetch.h
> index 7fd01c4..239e611 100644
> --- a/lib/eal/x86/include/rte_prefetch.h
> +++ b/lib/eal/x86/include/rte_prefetch.h
> @@ -9,30 +9,38 @@
>  extern "C" {
>  #endif
>  
> +#include <emmintrin.h>
> +
>  #include <rte_compat.h>
>  #include <rte_common.h>
>  #include "generic/rte_prefetch.h"
>  
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Wcast-qual"
> +
>  static inline void rte_prefetch0(const volatile void *p)
>  {
> -	asm volatile ("prefetcht0 %[p]" : : [p] "m" (*(const volatile char *)p));
> +	_mm_prefetch((const void *)p, _MM_HINT_T0);
>  }
>  
>  static inline void rte_prefetch1(const volatile void *p)
>  {
> -	asm volatile ("prefetcht1 %[p]" : : [p] "m" (*(const volatile char *)p));
> +	_mm_prefetch((const void *)p, _MM_HINT_T1);
>  }
>  
>  static inline void rte_prefetch2(const volatile void *p)
>  {
> -	asm volatile ("prefetcht2 %[p]" : : [p] "m" (*(const volatile char *)p));
> +	_mm_prefetch((const void *)p, _MM_HINT_T2);
>  }
>  
>  static inline void rte_prefetch_non_temporal(const volatile void *p)
>  {
> -	asm volatile ("prefetchnta %[p]" : : [p] "m" (*(const volatile char *)p));
> +	_mm_prefetch((const void *)p, _MM_HINT_NTA);
>  }
>  
> +#pragma GCC diagnostic pop
> +
> +#ifndef RTE_TOOLCHAIN_MSVC
>  /*
>   * We use raw byte codes for now as only the newest compiler
>   * versions support this instruction natively.
> @@ -43,6 +51,15 @@ static inline void rte_prefetch_non_temporal(const volatile void *p)
>  {
>  	asm volatile(".byte 0x0f, 0x1c, 0x06" :: "S" (p));
>  }
> +#else
> +__rte_experimental
> +static inline void
> +rte_cldemote(const volatile void *p)
> +{
> +	_mm_cldemote(p);
> +}
> +#endif
> +
>  
>  #ifdef __cplusplus
>  }
> -- 

Acked-by: Konstantin Ananyev <konstantin.v.ananyev at yandex.ru>

> 1.8.3.1



More information about the dev mailing list