Commit-ID:  ba741e356c49bfce0adcfa851080666870867f6b
Gitweb:     http://git.kernel.org/tip/ba741e356c49bfce0adcfa851080666870867f6b
Author:     H. Peter Anvin <h...@zytor.com>
AuthorDate: Wed, 8 Jun 2016 12:38:41 -0700
Committer:  H. Peter Anvin <h...@linux.intel.com>
CommitDate: Wed, 8 Jun 2016 12:41:20 -0700

x86, asm: change GEN_*_RMWcc() to use CC_SET()/CC_OUT()

Change the GEN_*_RMWcc() macros to use the CC_SET()/CC_OUT() macros
defined in <asm/asm.h>, and disable the use of asm goto if
__GCC_ASM_FLAG_OUTPUTS__ is enabled.  This allows gcc to receive the
flags output directly in gcc 6+.

Signed-off-by: H. Peter Anvin <h...@zytor.com>
Link: 
http://lkml.kernel.org/r/1465414726-197858-6-git-send-email-...@linux.intel.com
Reviewed-by: Andy Lutomirski <l...@kernel.org>
Reviewed-by: Borislav Petkov <b...@suse.de>
Acked-by: Peter Zijlstra (Intel) <pet...@infradead.org>
---
 arch/x86/include/asm/rmwcc.h | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/arch/x86/include/asm/rmwcc.h b/arch/x86/include/asm/rmwcc.h
index e3264c4..661dd30 100644
--- a/arch/x86/include/asm/rmwcc.h
+++ b/arch/x86/include/asm/rmwcc.h
@@ -1,7 +1,9 @@
 #ifndef _ASM_X86_RMWcc
 #define _ASM_X86_RMWcc
 
-#ifdef CC_HAVE_ASM_GOTO
+#if !defined(__GCC_ASM_FLAG_OUTPUTS__) && defined(CC_HAVE_ASM_GOTO)
+
+/* Use asm goto */
 
 #define __GEN_RMWcc(fullop, var, cc, ...)                              \
 do {                                                                   \
@@ -19,13 +21,15 @@ cc_label:                                                   
        \
 #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc)                 \
        __GEN_RMWcc(op " %1, " arg0, var, cc, vcon (val))
 
-#else /* !CC_HAVE_ASM_GOTO */
+#else /* defined(__GCC_ASM_FLAG_OUTPUTS__) || !defined(CC_HAVE_ASM_GOTO) */
+
+/* Use flags output or a set instruction */
 
 #define __GEN_RMWcc(fullop, var, cc, ...)                              \
 do {                                                                   \
        bool c;                                                         \
-       asm volatile (fullop "; set" #cc " %1"                          \
-                       : "+m" (var), "=qm" (c)                         \
+       asm volatile (fullop ";" CC_SET(cc)                             \
+                       : "+m" (var), CC_OUT(cc) (c)                    \
                        : __VA_ARGS__ : "memory");                      \
        return c;                                                       \
 } while (0)
@@ -36,6 +40,6 @@ do {                                                          
        \
 #define GEN_BINARY_RMWcc(op, var, vcon, val, arg0, cc)                 \
        __GEN_RMWcc(op " %2, " arg0, var, cc, vcon (val))
 
-#endif /* CC_HAVE_ASM_GOTO */
+#endif /* defined(__GCC_ASM_FLAG_OUTPUTS__) || !defined(CC_HAVE_ASM_GOTO) */
 
 #endif /* _ASM_X86_RMWcc */

Reply via email to