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