static inline int atomic_sub_and_test(int i, atomic_t *v)
{
- bool_t c;
-
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "lock; subl %2,%0"
- : "+m" (*(volatile int *)&v->counter), "=@ccz" (c)
- : "ir" (i) : "memory" );
-#else
- asm volatile ( "lock; subl %2,%0; setz %1"
- : "+m" (*(volatile int *)&v->counter), "=qm" (c)
- : "ir" (i) : "memory" );
-#endif
+ bool c;
+
+ asm volatile ( "lock; subl %[i], %[counter]\n\t"
+ ASM_FLAG_OUT(, "setz %[zf]\n\t")
+ : [counter] "+m" (*(volatile int *)&v->counter),
+ [zf] ASM_FLAG_OUT("=@ccz", "=qm") (c)
+ : [i] "ir" (i) : "memory" );
return c;
}
static inline int atomic_inc_and_test(atomic_t *v)
{
- bool_t c;
+ bool c;
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "lock; incl %0"
- : "+m" (*(volatile int *)&v->counter), "=@ccz" (c)
- :: "memory" );
-#else
- asm volatile ( "lock; incl %0; setz %1"
- : "+m" (*(volatile int *)&v->counter), "=qm" (c)
+ asm volatile ( "lock; incl %[counter]\n\t"
+ ASM_FLAG_OUT(, "setz %[zf]\n\t")
+ : [counter] "+m" (*(volatile int *)&v->counter),
+ [zf] ASM_FLAG_OUT("=@ccz", "=qm") (c)
:: "memory" );
-#endif
return c;
}
static inline int atomic_dec_and_test(atomic_t *v)
{
- bool_t c;
+ bool c;
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "lock; decl %0"
- : "+m" (*(volatile int *)&v->counter), "=@ccz" (c)
+ asm volatile ( "lock; decl %[counter]\n\t"
+ ASM_FLAG_OUT(, "setz %[zf]\n\t")
+ : [counter] "+m" (*(volatile int *)&v->counter),
+ [zf] ASM_FLAG_OUT("=@ccz", "=qm") (c)
:: "memory" );
-#else
- asm volatile ( "lock; decl %0; setz %1"
- : "+m" (*(volatile int *)&v->counter), "=qm" (c)
- :: "memory" );
-#endif
return c;
}
static inline int atomic_add_negative(int i, atomic_t *v)
{
- bool_t c;
-
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "lock; addl %2,%0"
- : "+m" (*(volatile int *)&v->counter), "=@ccs" (c)
- : "ir" (i) : "memory" );
-#else
- asm volatile ( "lock; addl %2,%0; sets %1"
- : "+m" (*(volatile int *)&v->counter), "=qm" (c)
- : "ir" (i) : "memory" );
-#endif
+ bool c;
+
+ asm volatile ( "lock; addl %[i], %[counter]\n\t"
+ ASM_FLAG_OUT(, "sets %[sf]\n\t")
+ : [counter] "+m" (*(volatile int *)&v->counter),
+ [sf] ASM_FLAG_OUT("=@ccs", "=qm") (c)
+ : [i] "ir" (i) : "memory" );
return c;
}
{
int oldbit;
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "lock; btsl %2,%1"
- : "=@ccc" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory" );
-#else
- asm volatile ( "lock; btsl %2,%1\n\tsbbl %0,%0"
- : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory" );
-#endif
+ asm volatile ( "lock; btsl %[nr], %[addr]\n\t"
+ ASM_FLAG_OUT(, "sbbl %[old], %[old]\n\t")
+ : [old] ASM_FLAG_OUT("=@ccc", "=r") (oldbit),
+ [addr] "+m" (ADDR) : [nr] "Ir" (nr) : "memory" );
return oldbit;
}
{
int oldbit;
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "btsl %2,%1"
- : "=@ccc" (oldbit), "+m" (*(int *)addr)
- : "Ir" (nr) : "memory" );
-#else
- asm volatile ( "btsl %2,%1\n\tsbbl %0,%0"
- : "=r" (oldbit), "+m" (*(int *)addr)
- : "Ir" (nr) : "memory" );
-#endif
+ asm volatile ( "btsl %[nr], %[addr]\n\t"
+ ASM_FLAG_OUT(, "sbbl %[old], %[old]\n\t")
+ : [old] ASM_FLAG_OUT("=@ccc", "=r") (oldbit),
+ [addr] "+m" (*(int *)addr) : [nr] "Ir" (nr) : "memory" );
return oldbit;
}
{
int oldbit;
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "lock; btrl %2,%1"
- : "=@ccc" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory" );
-#else
- asm volatile ( "lock; btrl %2,%1\n\tsbbl %0,%0"
- : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory" );
-#endif
+ asm volatile ( "lock; btrl %[nr], %[addr]\n\t"
+ ASM_FLAG_OUT(, "sbbl %[old], %[old]\n\t")
+ : [old] ASM_FLAG_OUT("=@ccc", "=r") (oldbit),
+ [addr] "+m" (ADDR) : [nr] "Ir" (nr) : "memory" );
return oldbit;
}
{
int oldbit;
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "btrl %2,%1"
- : "=@ccc" (oldbit), "+m" (*(int *)addr)
- : "Ir" (nr) : "memory" );
-#else
- asm volatile ( "btrl %2,%1\n\tsbbl %0,%0"
- : "=r" (oldbit), "+m" (*(int *)addr)
- : "Ir" (nr) : "memory" );
-#endif
+ asm volatile ( "btrl %[nr], %[addr]\n\t"
+ ASM_FLAG_OUT(, "sbbl %[old], %[old]\n\t")
+ : [old] ASM_FLAG_OUT("=@ccc", "=r") (oldbit),
+ [addr] "+m" (*(int *)addr) : [nr] "Ir" (nr) : "memory" );
return oldbit;
}
{
int oldbit;
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "btcl %2,%1"
- : "=@ccc" (oldbit), "+m" (*(int *)addr)
- : "Ir" (nr) : "memory" );
-#else
- asm volatile ( "btcl %2,%1\n\tsbbl %0,%0"
- : "=r" (oldbit), "+m" (*(int *)addr)
- : "Ir" (nr) : "memory" );
-#endif
+ asm volatile ( "btcl %[nr], %[addr]\n\t"
+ ASM_FLAG_OUT(, "sbbl %[old], %[old]\n\t")
+ : [old] ASM_FLAG_OUT("=@ccc", "=r") (oldbit),
+ [addr] "+m" (*(int *)addr) : [nr] "Ir" (nr) : "memory" );
return oldbit;
}
{
int oldbit;
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "lock; btcl %2,%1"
- : "=@ccc" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory" );
-#else
- asm volatile ( "lock; btcl %2,%1\n\tsbbl %0,%0"
- : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory" );
-#endif
+ asm volatile ( "lock; btcl %[nr], %[addr]\n\t"
+ ASM_FLAG_OUT(, "sbbl %[old], %[old]\n\t")
+ : [old] ASM_FLAG_OUT("=@ccc", "=r") (oldbit),
+ [addr] "+m" (ADDR) : [nr] "Ir" (nr) : "memory" );
return oldbit;
}
{
int oldbit;
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
- asm volatile ( "btl %2,%1"
- : "=@ccc" (oldbit)
- : "m" (CONST_ADDR), "Ir" (nr) : "memory" );
-#else
- asm volatile ( "btl %2,%1\n\tsbbl %0,%0"
- : "=r" (oldbit)
- : "m" (CONST_ADDR), "Ir" (nr) : "memory" );
-#endif
+ asm volatile ( "btl %[nr], %[addr]\n\t"
+ ASM_FLAG_OUT(, "sbbl %[old], %[old]\n\t")
+ : [old] ASM_FLAG_OUT("=@ccc", "=r") (oldbit)
+ : [addr] "m" (CONST_ADDR), [nr] "Ir" (nr) : "memory" );
return oldbit;
}