38 #ifndef INCLUDED_NV_SPECULATION_BARRIER_H
39 #define INCLUDED_NV_SPECULATION_BARRIER_H
55 #define NV_SPECULATION_BARRIER_VERSION 2
67 #if defined(_M_IX86) || defined(__i386__) || defined(__i386) \
68 || defined(__x86_64) || defined(AMD64) || defined(_M_AMD64)
70 #define NV_SPECULATION_BARRIER_x86
72 #elif defined(macintosh) || defined(__APPLE__) \
73 || defined(__powerpc) || defined(__powerpc__) || defined(__powerpc64__) \
74 || defined(__POWERPC__) || defined(__ppc) || defined(__ppc__) \
75 || defined(__ppc64__) || defined(__PPC__) \
76 || defined(__PPC64__) || defined(_ARCH_PPC) || defined(_ARCH_PPC64)
78 #define NV_SPECULATION_BARRIER_PPC
80 #elif (defined(__GNUC__) && defined(__thumb__)) \
81 || (defined(__ARMCC_VERSION) && defined(__thumb__)) \
82 || (defined(__ghs__) && defined(__THUMB__))
84 #define NV_SPECULATION_BARRIER_ARM_COMMON
85 #define NV_SPEC_BARRIER_CSDB ".inst.w 0xf3af8014\n"
87 #elif (defined(__GNUC__) && defined(__arm__)) \
88 || (defined(__ARMCC_VERSION) && defined(__arm__)) \
89 || (defined(__ghs__) && defined(__ARM__))
91 #define NV_SPECULATION_BARRIER_ARM_COMMON
92 #define NV_SPEC_BARRIER_CSDB ".inst 0xe320f014\n"
94 #elif (defined(__GNUC__) && defined(__aarch64__)) \
95 || (defined(__ARMCC_VERSION) && defined(__aarch64__)) \
96 || (defined(__ghs__) && defined(__ARM64__))
98 #define NV_SPECULATION_BARRIER_ARM_COMMON
99 #define NV_SPEC_BARRIER_CSDB "HINT #20\n"
102 #error "Unknown compiler/chip family"
135 #if defined(NV_SPECULATION_BARRIER_x86)
138 #define speculation_barrier() nv_speculation_barrier()
140 static inline void nv_speculation_barrier(
void)
143 #if defined(_MSC_VER) && !defined(__clang__)
147 #if defined(__GNUC__) || defined(__clang__)
148 __asm__ __volatile__ (
"lfence" : : :
"memory");
153 #elif defined(NV_SPECULATION_BARRIER_PPC)
155 static inline void nv_speculation_barrier(
void)
157 asm volatile(
"ori 31,31,0");
160 #elif defined(NV_SPECULATION_BARRIER_ARM_COMMON)
163 static inline void nv_speculation_barrier(
void)
228 #if defined(NV_SPECULATION_BARRIER_x86)
231 #if defined(__GNUC__) || defined(__clang__)
233 static inline unsigned long nv_array_index_no_speculate(
unsigned long index,
242 :
"=r"(mask) :
"r"(index),
"r"(count) :
"cc"
245 return (index & mask);
248 static inline unsigned int nv_array_index_no_speculate_u32(
unsigned int index,
257 :
"=r"(mask) :
"r"(index),
"r"(count) :
"cc"
260 return (index & mask);
266 #elif defined(NV_SPECULATION_BARRIER_ARM_COMMON)
267 static inline unsigned long nv_array_index_no_speculate(
unsigned long index,
274 "CMP %[ind], %[cnt] \n"
275 "SBC %[res], %[cnt], %[cnt] \n"
277 : [res]
"=r" (mask) : [ind]
"r" (index), [cnt]
"r" (count):
"cc"
280 return (index & mask);
283 static inline unsigned int nv_array_index_no_speculate_u32(
unsigned int index,
290 "CMP %w[ind], %w[cnt] \n"
291 "SBC %w[res], %w[cnt], %w[cnt] \n"
293 : [res]
"=r" (mask) : [ind]
"r" (index), [cnt]
"r" (count):
"cc"
296 return (index & mask);
303 #endif // INCLUDED_NV_SPECULATION_BARRIER_H