blob: 5f0acdce0b004a824a4ee6d5ed68305a7eff0516 [file] [log] [blame]
/* { 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);
}