x86: atomic64: Improve cmpxchg8b()
[safe/jmp/linux-2.6] / arch / x86 / lib / atomic64_32.c
index afa5d44..5fc1e2c 100644 (file)
@@ -6,19 +6,14 @@
 
 static inline u64 cmpxchg8b(u64 *ptr, u64 old, u64 new)
 {
-       asm volatile(
-
-               LOCK_PREFIX "cmpxchg8b (%[ptr])\n"
-
-                    :          "=A" (old)
-
-                    : [ptr]    "D" (ptr),
-                               "A" (old),
-                               "b" (ll_low(new)),
-                               "c" (ll_high(new))
-
-                    : "memory");
+       u32 low = new;
+       u32 high = new >> 32;
 
+       asm volatile(
+               LOCK_PREFIX "cmpxchg8b %1\n"
+                    : "+A" (old), "+m" (*ptr)
+                    :  "b" (low),  "c" (high)
+                    );
        return old;
 }