70 |
} |
} |
71 |
} |
} |
72 |
|
|
73 |
template<typename T> class atomic { |
template<typename T> class atomic; |
74 |
|
template<> class atomic<int> { // int is the only implemented type |
75 |
public: |
public: |
76 |
atomic() { } |
atomic() { } |
77 |
atomic(T m) : f(m) { } |
explicit atomic(int m) : f(m) { } |
78 |
T load(memory_order order = memory_order_seq_cst) const volatile { |
int load(memory_order order = memory_order_seq_cst) const volatile { |
79 |
T m; |
int m; |
80 |
switch (order) { |
switch (order) { |
81 |
case memory_order_relaxed: |
case memory_order_relaxed: |
82 |
m = f; |
m = f; |
91 |
#ifdef _ARCH_PPC |
#ifdef _ARCH_PPC |
92 |
// PPC load-acquire: artificial dependency + isync |
// PPC load-acquire: artificial dependency + isync |
93 |
asm volatile( |
asm volatile( |
|
#ifdef _ARCH_PPC64 |
|
|
"ld %0,%1\n\t" |
|
|
#else |
|
94 |
"lwz%U1%X1 %0,%1\n\t" |
"lwz%U1%X1 %0,%1\n\t" |
|
#endif |
|
95 |
"cmpw %0,%0\n\t" |
"cmpw %0,%0\n\t" |
96 |
"bne- 1f\n\t" |
"bne- 1f\n\t" |
97 |
"1: isync" |
"1: isync" |
98 |
: "=r" (m) |
: "=r" (m) |
99 |
: "m" (f) |
: "m" (f) |
100 |
: "memory", "cc"); |
: "memory", "cr0"); |
101 |
#else |
#else |
102 |
m = f; |
m = f; |
103 |
asm volatile("" : : : "memory"); |
asm volatile("" : : : "memory"); |
107 |
return m; |
return m; |
108 |
} |
} |
109 |
|
|
110 |
void store(T m, memory_order order = memory_order_seq_cst) volatile { |
void store(int m, memory_order order = memory_order_seq_cst) volatile { |
111 |
switch (order) { |
switch (order) { |
112 |
case memory_order_relaxed: |
case memory_order_relaxed: |
113 |
f = m; |
f = m; |
116 |
case memory_order_release: |
case memory_order_release: |
117 |
atomic_thread_fence(memory_order_release); |
atomic_thread_fence(memory_order_release); |
118 |
f = m; |
f = m; |
|
asm volatile("" : : : "memory"); |
|
119 |
break; |
break; |
120 |
|
|
121 |
case memory_order_seq_cst: |
case memory_order_seq_cst: |
127 |
} |
} |
128 |
} |
} |
129 |
private: |
private: |
130 |
T f; |
int f; |
131 |
|
atomic(const atomic&); // not allowed |
132 |
|
atomic& operator=(const atomic&); // not allowed |
133 |
}; |
}; |
134 |
} |
} |
135 |
#endif |
#endif |