| /* { 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; |
| }); |
| } |