199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 299a2dd95SBruce Richardson * Copyright(c) 2010-2015 Intel Corporation 399a2dd95SBruce Richardson */ 499a2dd95SBruce Richardson 599a2dd95SBruce Richardson #ifndef _RTE_PREFETCH_X86_64_H_ 699a2dd95SBruce Richardson #define _RTE_PREFETCH_X86_64_H_ 799a2dd95SBruce Richardson 828a5e0b9STyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 928a5e0b9STyler Retzlaff #include <emmintrin.h> 1028a5e0b9STyler Retzlaff #endif 1128a5e0b9STyler Retzlaff 121094dd94SDavid Marchand #include <rte_compat.h> 1399a2dd95SBruce Richardson #include <rte_common.h> 1499a2dd95SBruce Richardson #include "generic/rte_prefetch.h" 1599a2dd95SBruce Richardson 16*719834a6SMattias Rönnblom #ifdef __cplusplus 17*719834a6SMattias Rönnblom extern "C" { 18*719834a6SMattias Rönnblom #endif 19*719834a6SMattias Rönnblom 2099a2dd95SBruce Richardson static inline void rte_prefetch0(const volatile void *p) 2199a2dd95SBruce Richardson { 2228a5e0b9STyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 2310664ac6STyler Retzlaff _mm_prefetch((const char *)(uintptr_t)p, _MM_HINT_T0); 2428a5e0b9STyler Retzlaff #else 2599a2dd95SBruce Richardson asm volatile ("prefetcht0 %[p]" : : [p] "m" (*(const volatile char *)p)); 2628a5e0b9STyler Retzlaff #endif 2799a2dd95SBruce Richardson } 2899a2dd95SBruce Richardson 2999a2dd95SBruce Richardson static inline void rte_prefetch1(const volatile void *p) 3099a2dd95SBruce Richardson { 3128a5e0b9STyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 3210664ac6STyler Retzlaff _mm_prefetch((const char *)(uintptr_t)p, _MM_HINT_T1); 3328a5e0b9STyler Retzlaff #else 3499a2dd95SBruce Richardson asm volatile ("prefetcht1 %[p]" : : [p] "m" (*(const volatile char *)p)); 3528a5e0b9STyler Retzlaff #endif 3699a2dd95SBruce Richardson } 3799a2dd95SBruce Richardson 3899a2dd95SBruce Richardson static inline void rte_prefetch2(const volatile void *p) 3999a2dd95SBruce Richardson { 4028a5e0b9STyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 4110664ac6STyler Retzlaff _mm_prefetch((const char *)(uintptr_t)p, _MM_HINT_T2); 4228a5e0b9STyler Retzlaff #else 4399a2dd95SBruce Richardson asm volatile ("prefetcht2 %[p]" : : [p] "m" (*(const volatile char *)p)); 4428a5e0b9STyler Retzlaff #endif 4599a2dd95SBruce Richardson } 4699a2dd95SBruce Richardson 4799a2dd95SBruce Richardson static inline void rte_prefetch_non_temporal(const volatile void *p) 4899a2dd95SBruce Richardson { 4928a5e0b9STyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 5010664ac6STyler Retzlaff _mm_prefetch((const char *)(uintptr_t)p, _MM_HINT_NTA); 5128a5e0b9STyler Retzlaff #else 5299a2dd95SBruce Richardson asm volatile ("prefetchnta %[p]" : : [p] "m" (*(const volatile char *)p)); 5328a5e0b9STyler Retzlaff #endif 5499a2dd95SBruce Richardson } 5599a2dd95SBruce Richardson 5699a2dd95SBruce Richardson __rte_experimental 5799a2dd95SBruce Richardson static inline void 5899a2dd95SBruce Richardson rte_cldemote(const volatile void *p) 5999a2dd95SBruce Richardson { 6028a5e0b9STyler Retzlaff #ifdef RTE_TOOLCHAIN_MSVC 6110664ac6STyler Retzlaff _mm_cldemote((const void *)(uintptr_t)p); 6228a5e0b9STyler Retzlaff #else 6328a5e0b9STyler Retzlaff /* 6428a5e0b9STyler Retzlaff * We use raw byte codes for now as only the newest compiler 6528a5e0b9STyler Retzlaff * versions support this instruction natively. 6628a5e0b9STyler Retzlaff */ 6799a2dd95SBruce Richardson asm volatile(".byte 0x0f, 0x1c, 0x06" :: "S" (p)); 6828a5e0b9STyler Retzlaff #endif 6999a2dd95SBruce Richardson } 7099a2dd95SBruce Richardson 7199a2dd95SBruce Richardson #ifdef __cplusplus 7299a2dd95SBruce Richardson } 7399a2dd95SBruce Richardson #endif 7499a2dd95SBruce Richardson 7599a2dd95SBruce Richardson #endif /* _RTE_PREFETCH_X86_64_H_ */ 76