blob: fa507395ec7a9b9d8e93689271a5f13b536e15b0 [file] [log] [blame]
/* { dg-do assemble { target x86_64-*-* } } */
/* { dg-require-effective-target lp64 } */
/* Adapted from Linux x86: page_ref_dec_and_test.c (GPL-2.0). */
typedef _Bool bool;
typedef struct {
int counter;
} atomic_t;
bool
arch_atomic_dec_and_test(atomic_t *v) {
return ({
bool c;
asm volatile(".pushsection .smp_locks,\"a\"\n"
".balign 4\n"
".long 671f - .\n"
".popsection\n"
"671:"
"\n\tlock; "
"decl"
" "
"%[var]"
"\n\t/* output condition code "
"e"
"*/\n"
: [ var ] "+m"(v->counter), "=@cc"
"e"(c)
:
: "memory");
c;
});
}