Nugget
arch_x86_memory_barrier.h
1 // Copyright (c) Electronic Arts Inc. All rights reserved.
4 
5 
6 #ifndef EASTL_ATOMIC_INTERNAL_ARCH_X86_MEMORY_BARRIER_H
7 #define EASTL_ATOMIC_INTERNAL_ARCH_X86_MEMORY_BARRIER_H
8 
9 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
10  #pragma once
11 #endif
12 
13 
14 
16 //
17 // void EASTL_ARCH_ATOMIC_CPU_MB()
18 //
19 #if defined(EA_COMPILER_MSVC)
20 
28  #if 1
29 
30  // 4459 : declaration of 'identifier' hides global declaration
31  // 4456 : declaration of 'identifier' hides previous local declaration
32  #define EASTL_ARCH_ATOMIC_CPU_MB() \
33  { \
34  EA_DISABLE_VC_WARNING(4459 4456); \
35  volatile long _; \
36  _InterlockedExchangeAdd(&_, 0); \
37  EA_RESTORE_VC_WARNING(); \
38  }
39 
40  #else
41 
42  #define EASTL_ARCH_ATOMIC_CPU_MB() \
43  EASTL_ATOMIC_COMPILER_BARRIER(); \
44  _mm_mfence(); \
45  EASTL_ATOMIC_COMPILER_BARRIER()
46 
47  #endif
48 
49 #elif defined(__clang__) || defined(EA_COMPILER_GNUC)
50 
67  #if defined(EA_PROCESSOR_X86)
68 
69  #define EASTL_ARCH_ATOMIC_CPU_MB() \
70  __asm__ __volatile__ ("lock; addl $0, -4(%%esp)" ::: "memory", "cc")
71 
72  #elif defined(EA_PROCESSOR_X86_64)
73 
74  #define EASTL_ARCH_ATOMIC_CPU_MB() \
75  __asm__ __volatile__ ("lock; addl $0, -8(%%rsp)" ::: "memory", "cc")
76 
77  #else
78 
79  #define EASTL_ARCH_ATOMIC_CPU_MB() \
80  __asm__ __volatile__ ("mfence" ::: "memory")
81 
82  #endif
83 
84 
85 #endif
86 
87 
89 //
90 // void EASTL_ARCH_ATOMIC_CPU_WMB()
91 //
92 #define EASTL_ARCH_ATOMIC_CPU_WMB() \
93  EASTL_ATOMIC_COMPILER_BARRIER()
94 
95 
97 //
98 // void EASTL_ARCH_ATOMIC_CPU_RMB()
99 //
100 #define EASTL_ARCH_ATOMIC_CPU_RMB() \
101  EASTL_ATOMIC_COMPILER_BARRIER()
102 
103 
104 #endif /* EASTL_ATOMIC_INTERNAL_ARCH_X86_MEMORY_BARRIER_H */