Use CC_SET(z)/CC_OUT(z) instead of explicit setz instruction.
Using these two defines, the compiler that supports generation of
condition code outputs from inline assembly flags generates e.g.:

  cmpxchg8b %fs:(%esi)
  jne    172255 <__kmalloc+0x65>

instead of

  cmpxchg8b %fs:(%esi)
  sete   %al
  test   %al,%al
  je     172255 <__kmalloc+0x65>

Note that older compilers now generate

  cmpxchg8b %fs:(%esi)
  sete   %cl
  test   %cl,%cl
  je     173a85 <__kmalloc+0x65>

since we have to mark that cmpxchg8b instruction outputs to %eax
register and this way clobbers the value in the register.

Signed-off-by: Uros Bizjak <ubiz...@gmail.com>
Cc: x...@kernel.org
---
 arch/x86/include/asm/percpu.h | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h
index a06b07399d17..e9202a0de8f0 100644
--- a/arch/x86/include/asm/percpu.h
+++ b/arch/x86/include/asm/percpu.h
@@ -450,9 +450,10 @@ do {                                                       
                \
        bool __ret;                                                     \
        typeof(pcp1) __o1 = (o1), __n1 = (n1);                          \
        typeof(pcp2) __o2 = (o2), __n2 = (n2);                          \
-       asm volatile("cmpxchg8b "__percpu_arg(1)"\n\tsetz %0\n\t"       \
-                   : "=a" (__ret), "+m" (pcp1), "+m" (pcp2), "+d" (__o2) \
-                   :  "b" (__n1), "c" (__n2), "a" (__o1));             \
+       asm volatile("cmpxchg8b "__percpu_arg(1)                        \
+                    CC_SET(z)                                          \
+                    : CC_OUT(z) (__ret), "+m" (pcp1), "+m" (pcp2), "+a" 
(__o1), "+d" (__o2) \
+                    : "b" (__n1), "c" (__n2));                         \
        __ret;                                                          \
 })
 
-- 
2.17.1

Reply via email to