|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/asm: Use ASM_FLAG_OUT() to simplify atomic and bitop stubs
bitops.h cannot include asm_defns.h, because the static inlines in cpumasks.h
result in forward declarations of the bitops.h contents. Move ASM_FLAG_OUT()
to a new asm/compiler.h to compensate.
While making changes, switch bool_t to bool and use named asm parameters.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
v2:
* Move ASM_FLAG_OUT() to xen/compiler.h rather than introducing
asm-x86/compiler.h
* Drop a lot of the commit message.
---
xen/include/asm-x86/asm_defns.h | 6 ---
xen/include/asm-x86/atomic.h | 64 ++++++++++++-------------------
xen/include/asm-x86/bitops.h | 85 ++++++++++++++---------------------------
xen/include/xen/compiler.h | 6 +++
4 files changed, 58 insertions(+), 103 deletions(-)
diff --git a/xen/include/asm-x86/asm_defns.h b/xen/include/asm-x86/asm_defns.h
index 220ae2e..f1c6fa1 100644
--- a/xen/include/asm-x86/asm_defns.h
+++ b/xen/include/asm-x86/asm_defns.h
@@ -413,10 +413,4 @@ static always_inline void stac(void)
#define REX64_PREFIX "rex64/"
#endif
-#ifdef __GCC_ASM_FLAG_OUTPUTS__
-# define ASM_FLAG_OUT(yes, no) yes
-#else
-# define ASM_FLAG_OUT(yes, no) no
-#endif
-
#endif /* __X86_ASM_DEFNS_H__ */
diff --git a/xen/include/asm-x86/atomic.h b/xen/include/asm-x86/atomic.h
index ef7e70b..d2a311c 100644
--- a/xen/include/asm-x86/atomic.h
+++ b/xen/include/asm-x86/atomic.h
@@ -133,17 +133,13 @@ static inline int atomic_sub_return(int i, atomic_t *v)
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;
}
@@ -163,17 +159,13 @@ static inline int atomic_inc_return(atomic_t *v)
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;
}
@@ -193,34 +185,26 @@ static inline int atomic_dec_return(atomic_t *v)
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;
}
diff --git a/xen/include/asm-x86/bitops.h b/xen/include/asm-x86/bitops.h
index 0f18645..440abb7 100644
--- a/xen/include/asm-x86/bitops.h
+++ b/xen/include/asm-x86/bitops.h
@@ -144,13 +144,10 @@ static inline int test_and_set_bit(int nr, volatile void
*addr)
{
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;
}
@@ -172,15 +169,10 @@ static inline int __test_and_set_bit(int nr, void *addr)
{
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;
}
@@ -201,13 +193,10 @@ static inline int test_and_clear_bit(int nr, volatile
void *addr)
{
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;
}
@@ -229,15 +218,10 @@ static inline int __test_and_clear_bit(int nr, void *addr)
{
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;
}
@@ -251,15 +235,10 @@ static inline int __test_and_change_bit(int nr, void
*addr)
{
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;
}
@@ -280,13 +259,10 @@ static inline int test_and_change_bit(int nr, volatile
void *addr)
{
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;
}
@@ -305,15 +281,10 @@ static inline int variable_test_bit(int nr, const
volatile void *addr)
{
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;
}
diff --git a/xen/include/xen/compiler.h b/xen/include/xen/compiler.h
index e800709..16aeeea 100644
--- a/xen/include/xen/compiler.h
+++ b/xen/include/xen/compiler.h
@@ -94,4 +94,10 @@
__asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
(typeof(ptr)) (__ptr + (off)); })
+#ifdef __GCC_ASM_FLAG_OUTPUTS__
+# define ASM_FLAG_OUT(yes, no) yes
+#else
+# define ASM_FLAG_OUT(yes, no) no
+#endif
+
#endif /* __LINUX_COMPILER_H */
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |