1 /* { dg-do compile } */
2 /* { dg-options "-O2 -march=z196 -mzarch" } */
3
4 typedef struct
5 {
6 int counter;
7 } atomic_t;
8
9 static inline __attribute__ ((__gnu_inline__)) int
__atomic_add(int val,int * ptr)10 __atomic_add (int val, int *ptr)
11 {
12 int old;
13 asm volatile("laa %[old],%[val],%[ptr]\n"
14 : [old] "=d" (old), [ptr] "+Q"(*ptr)
15 : [val] "d" (val)
16 : "cc", "memory");
17 return old;
18 }
19
20 static inline __attribute__ ((__gnu_inline__)) void
__atomic_add_const(int val,int * ptr)21 __atomic_add_const (int val, int *ptr)
22 {
23 asm volatile("asi %[ptr],%[val]\n"
24 : [ptr] "+Q" (*ptr)
25 : [val] "i" (val)
26 : "cc", "memory");
27 }
28
29 static inline __attribute__ ((__gnu_inline__)) void
atomic_add(int i,atomic_t * v)30 atomic_add (int i, atomic_t *v)
31 {
32 if (__builtin_constant_p (i) && (i > -129) && (i < 128))
33 {
34 __atomic_add_const (i, &v->counter);
35 return;
36 }
37 __atomic_add (i, &v->counter);
38 }
39
40 static atomic_t num_active_cpus = { (0) };
41
42 void
ledtrig_cpu(_Bool is_active)43 ledtrig_cpu (_Bool is_active)
44 {
45 atomic_add (is_active ? 1 : -1, &num_active_cpus);
46 }
47