< prev index next >

src/os_cpu/linux_ppc/vm/atomic_linux_ppc.hpp

Print this page

        

@@ -287,20 +287,27 @@
 inline void* Atomic::xchg_ptr(void* exchange_value, volatile void* dest) {
   return (void*)xchg_ptr((intptr_t)exchange_value, (volatile intptr_t*)dest);
 }
 
 inline void cmpxchg_pre_membar(cmpxchg_memory_order order) {
-  if (order != memory_order_relaxed) {
+  if (order == memory_order_release) {
+    __asm__ __volatile__ (
+      /* release */
+      strasm_lwsync
+      );
+  } else if (order != memory_order_relaxed) {
     __asm__ __volatile__ (
       /* fence */
       strasm_sync
       );
   }
 }
 
 inline void cmpxchg_post_membar(cmpxchg_memory_order order) {
-  if (order != memory_order_relaxed) {
+  if (order == memory_order_release) {
+    // no post membar
+  } else if (order == memory_order_conservative) {
     __asm__ __volatile__ (
       /* fence */
       strasm_sync
       );
   }
< prev index next >