xref: /dpdk/lib/eal/x86/include/rte_prefetch.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
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