Nugget
arch_arm_memory_barrier.h
1 // Copyright (c) Electronic Arts Inc. All rights reserved.
4 
5 
6 #ifndef EASTL_ATOMIC_INTERNAL_ARCH_ARM_MEMORY_BARRIER_H
7 #define EASTL_ATOMIC_INTERNAL_ARCH_ARM_MEMORY_BARRIER_H
8 
9 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
10  #pragma once
11 #endif
12 
13 
14 #if defined(EA_COMPILER_MSVC) && !defined(EA_COMPILER_CLANG_CL)
15 
16  #if defined(EA_PROCESSOR_ARM32)
17 
18  #define EASTL_ARM_DMB_ISH _ARM_BARRIER_ISH
19 
20  #define EASTL_ARM_DMB_ISHST _ARM_BARRIER_ISHST
21 
22  #define EASTL_ARM_DMB_ISHLD _ARM_BARRIER_ISH
23 
24  #elif defined(EA_PROCESSOR_ARM64)
25 
26  #define EASTL_ARM_DMB_ISH _ARM64_BARRIER_ISH
27 
28  #define EASTL_ARM_DMB_ISHST _ARM64_BARRIER_ISHST
29 
30  #define EASTL_ARM_DMB_ISHLD _ARM64_BARRIER_ISHLD
31 
32  #endif
33 
34 
43  #define EASTL_ARCH_ATOMIC_ARM_EMIT_DMB(option) \
44  EASTL_ATOMIC_COMPILER_BARRIER(); \
45  __dmb(option); \
46  EASTL_ATOMIC_COMPILER_BARRIER()
47 
48 
49 #elif defined(EA_COMPILER_GNUC) || defined(__clang__)
50 
51  #define EASTL_ARM_DMB_ISH ish
52 
53  #define EASTL_ARM_DMB_ISHST ishst
54 
55  #if defined(EA_PROCESSOR_ARM32)
56 
57  #define EASTL_ARM_DMB_ISHLD ish
58 
59  #elif defined(EA_PROCESSOR_ARM64)
60 
61  #define EASTL_ARM_DMB_ISHLD ishld
62 
63  #endif
64 
65 
66  #define EASTL_ARCH_ATOMIC_ARM_EMIT_DMB(option) \
67  __asm__ __volatile__ ("dmb " EA_STRINGIFY(option) ::: "memory")
68 
69 
70 #endif
71 
72 
74 //
75 // void EASTL_ARCH_ATOMIC_CPU_MB()
76 //
77 #define EASTL_ARCH_ATOMIC_CPU_MB() \
78  EASTL_ARCH_ATOMIC_ARM_EMIT_DMB(EASTL_ARM_DMB_ISH)
79 
80 
82 //
83 // void EASTL_ARCH_ATOMIC_CPU_WMB()
84 //
85 #define EASTL_ARCH_ATOMIC_CPU_WMB() \
86  EASTL_ARCH_ATOMIC_ARM_EMIT_DMB(EASTL_ARM_DMB_ISHST)
87 
88 
90 //
91 // void EASTL_ARCH_ATOMIC_CPU_RMB()
92 //
93 #define EASTL_ARCH_ATOMIC_CPU_RMB() \
94  EASTL_ARCH_ATOMIC_ARM_EMIT_DMB(EASTL_ARM_DMB_ISHLD)
95 
96 
97 #endif /* EASTL_ATOMIC_INTERNAL_ARCH_ARM_MEMORY_BARRIER_H */