62 // Release and acquire are empty on z/Architecture, but potential
63 // optimizations of gcc must be forbidden by OrderAccess::release and
64 // OrderAccess::acquire.
65 #define inlasm_zarch_release() inlasm_compiler_barrier()
66 #define inlasm_zarch_acquire() inlasm_compiler_barrier()
67 #define inlasm_zarch_fence() inlasm_zarch_sync()
68
69 inline void OrderAccess::loadload() { inlasm_compiler_barrier(); }
70 inline void OrderAccess::storestore() { inlasm_compiler_barrier(); }
71 inline void OrderAccess::loadstore() { inlasm_compiler_barrier(); }
72 inline void OrderAccess::storeload() { inlasm_zarch_sync(); }
73
74 inline void OrderAccess::acquire() { inlasm_zarch_acquire(); }
75 inline void OrderAccess::release() { inlasm_zarch_release(); }
76 inline void OrderAccess::fence() { inlasm_zarch_sync(); }
77
78 template<size_t byte_size>
79 struct OrderAccess::PlatformOrderedLoad<byte_size, X_ACQUIRE>
80 {
81 template <typename T>
82 T operator()(const volatile T* p) const { register T t = *p; inlasm_zarch_acquire(); return t; }
83 };
84
85 #undef inlasm_compiler_barrier
86 #undef inlasm_zarch_sync
87 #undef inlasm_zarch_release
88 #undef inlasm_zarch_acquire
89 #undef inlasm_zarch_fence
90
91 #endif // OS_CPU_LINUX_S390_VM_ORDERACCESS_LINUX_S390_HPP
|
62 // Release and acquire are empty on z/Architecture, but potential
63 // optimizations of gcc must be forbidden by OrderAccess::release and
64 // OrderAccess::acquire.
65 #define inlasm_zarch_release() inlasm_compiler_barrier()
66 #define inlasm_zarch_acquire() inlasm_compiler_barrier()
67 #define inlasm_zarch_fence() inlasm_zarch_sync()
68
69 inline void OrderAccess::loadload() { inlasm_compiler_barrier(); }
70 inline void OrderAccess::storestore() { inlasm_compiler_barrier(); }
71 inline void OrderAccess::loadstore() { inlasm_compiler_barrier(); }
72 inline void OrderAccess::storeload() { inlasm_zarch_sync(); }
73
74 inline void OrderAccess::acquire() { inlasm_zarch_acquire(); }
75 inline void OrderAccess::release() { inlasm_zarch_release(); }
76 inline void OrderAccess::fence() { inlasm_zarch_sync(); }
77
78 template<size_t byte_size>
79 struct OrderAccess::PlatformOrderedLoad<byte_size, X_ACQUIRE>
80 {
81 template <typename T>
82 T operator()(const volatile T* p) const { T t = *p; inlasm_zarch_acquire(); return t; }
83 };
84
85 #undef inlasm_compiler_barrier
86 #undef inlasm_zarch_sync
87 #undef inlasm_zarch_release
88 #undef inlasm_zarch_acquire
89 #undef inlasm_zarch_fence
90
91 #endif // OS_CPU_LINUX_S390_VM_ORDERACCESS_LINUX_S390_HPP
|