132 HasDecorator<ds, MO_SEQ_CST>::value, T>::type |
132 HasDecorator<ds, MO_SEQ_CST>::value, T>::type |
133 RawAccessBarrier<decorators>::load_internal(void* addr) { |
133 RawAccessBarrier<decorators>::load_internal(void* addr) { |
134 if (support_IRIW_for_not_multiple_copy_atomic_cpu) { |
134 if (support_IRIW_for_not_multiple_copy_atomic_cpu) { |
135 OrderAccess::fence(); |
135 OrderAccess::fence(); |
136 } |
136 } |
137 return OrderAccess::load_acquire(reinterpret_cast<const volatile T*>(addr)); |
137 return Atomic::load_acquire(reinterpret_cast<const volatile T*>(addr)); |
138 } |
138 } |
139 |
139 |
140 template <DecoratorSet decorators> |
140 template <DecoratorSet decorators> |
141 template <DecoratorSet ds, typename T> |
141 template <DecoratorSet ds, typename T> |
142 inline typename EnableIf< |
142 inline typename EnableIf< |
143 HasDecorator<ds, MO_ACQUIRE>::value, T>::type |
143 HasDecorator<ds, MO_ACQUIRE>::value, T>::type |
144 RawAccessBarrier<decorators>::load_internal(void* addr) { |
144 RawAccessBarrier<decorators>::load_internal(void* addr) { |
145 return OrderAccess::load_acquire(reinterpret_cast<const volatile T*>(addr)); |
145 return Atomic::load_acquire(reinterpret_cast<const volatile T*>(addr)); |
146 } |
146 } |
147 |
147 |
148 template <DecoratorSet decorators> |
148 template <DecoratorSet decorators> |
149 template <DecoratorSet ds, typename T> |
149 template <DecoratorSet ds, typename T> |
150 inline typename EnableIf< |
150 inline typename EnableIf< |
156 template <DecoratorSet decorators> |
156 template <DecoratorSet decorators> |
157 template <DecoratorSet ds, typename T> |
157 template <DecoratorSet ds, typename T> |
158 inline typename EnableIf< |
158 inline typename EnableIf< |
159 HasDecorator<ds, MO_SEQ_CST>::value>::type |
159 HasDecorator<ds, MO_SEQ_CST>::value>::type |
160 RawAccessBarrier<decorators>::store_internal(void* addr, T value) { |
160 RawAccessBarrier<decorators>::store_internal(void* addr, T value) { |
161 OrderAccess::release_store_fence(reinterpret_cast<volatile T*>(addr), value); |
161 Atomic::release_store_fence(reinterpret_cast<volatile T*>(addr), value); |
162 } |
162 } |
163 |
163 |
164 template <DecoratorSet decorators> |
164 template <DecoratorSet decorators> |
165 template <DecoratorSet ds, typename T> |
165 template <DecoratorSet ds, typename T> |
166 inline typename EnableIf< |
166 inline typename EnableIf< |
167 HasDecorator<ds, MO_RELEASE>::value>::type |
167 HasDecorator<ds, MO_RELEASE>::value>::type |
168 RawAccessBarrier<decorators>::store_internal(void* addr, T value) { |
168 RawAccessBarrier<decorators>::store_internal(void* addr, T value) { |
169 OrderAccess::release_store(reinterpret_cast<volatile T*>(addr), value); |
169 Atomic::release_store(reinterpret_cast<volatile T*>(addr), value); |
170 } |
170 } |
171 |
171 |
172 template <DecoratorSet decorators> |
172 template <DecoratorSet decorators> |
173 template <DecoratorSet ds, typename T> |
173 template <DecoratorSet ds, typename T> |
174 inline typename EnableIf< |
174 inline typename EnableIf< |