x86/asm: Use CC_SET/CC_OUT in percpu_cmpxchg8b_double
Subsystems (2)
PATCH 1/1 x86/asm: Use CC_SET/CC_OUT in percpu_cmpxchg8b_double
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 <[email protected]>
--- arch/x86/include/asm/percpu.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
arch/x86/include/asm/percpu.h +4 -3
@@ -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; \ })
Signature · 1 line
2.17.1