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
      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
      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
      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
      43  ledtrig_cpu (_Bool is_active)
      44  {
      45    atomic_add (is_active ? 1 : -1, &num_active_cpus);
      46  }