[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