318 T cmp_val, 319 atomic_memory_order unused) const { 320 STATIC_ASSERT(8 == sizeof(T)); 321 T old; 322 323 __asm__ __volatile__ ( 324 " CSG %[old],%[upd],%[mem] \n\t" // Try to xchg upd with mem. 325 // outputs 326 : [old] "=&d" (old) // Write-only, prev value irrelevant. 327 , [mem] "+Q" (*dest) // Read/write, memory to be updated atomically. 328 // inputs 329 : [upd] "d" (xchg_val) 330 , "0" (cmp_val) // Read-only, initial value for [old] (operand #0). 331 // clobbered 332 : "cc", "memory" 333 ); 334 335 return old; 336 } 337 338 #endif // OS_CPU_LINUX_S390_ATOMIC_LINUX_S390_HPP | 318 T cmp_val, 319 atomic_memory_order unused) const { 320 STATIC_ASSERT(8 == sizeof(T)); 321 T old; 322 323 __asm__ __volatile__ ( 324 " CSG %[old],%[upd],%[mem] \n\t" // Try to xchg upd with mem. 325 // outputs 326 : [old] "=&d" (old) // Write-only, prev value irrelevant. 327 , [mem] "+Q" (*dest) // Read/write, memory to be updated atomically. 328 // inputs 329 : [upd] "d" (xchg_val) 330 , "0" (cmp_val) // Read-only, initial value for [old] (operand #0). 331 // clobbered 332 : "cc", "memory" 333 ); 334 335 return old; 336 } 337 338 template<size_t byte_size> 339 struct Atomic::PlatformOrderedLoad<byte_size, X_ACQUIRE> 340 { 341 template <typename T> 342 T operator()(const volatile T* p) const { T t = *p; OrderAccess::acquire(); return t; } 343 }; 344 345 #endif // OS_CPU_LINUX_S390_ATOMIC_LINUX_S390_HPP |