/* { dg-do compile } */ /* { dg-options "-O2 -march=z196 -mzarch" } */ typedef struct { int counter; } atomic_t; static inline __attribute__ ((__gnu_inline__)) int __atomic_add (int val, int *ptr) { int old; asm volatile("laa %[old],%[val],%[ptr]\n" : [old] "=d" (old), [ptr] "+Q"(*ptr) : [val] "d" (val) : "cc", "memory"); return old; } static inline __attribute__ ((__gnu_inline__)) void __atomic_add_const (int val, int *ptr) { asm volatile("asi %[ptr],%[val]\n" : [ptr] "+Q" (*ptr) : [val] "i" (val) : "cc", "memory"); } static inline __attribute__ ((__gnu_inline__)) void atomic_add (int i, atomic_t *v) { if (__builtin_constant_p (i) && (i > -129) && (i < 128)) { __atomic_add_const (i, &v->counter); return; } __atomic_add (i, &v->counter); } static atomic_t num_active_cpus = { (0) }; void ledtrig_cpu (_Bool is_active) { atomic_add (is_active ? 1 : -1, &num_active_cpus); }