Fix implementation of generic atomic operations

Change-Id: Ie1ea5aacc561e2d6d40125d2952ed0e9116b7b0d
diff --git a/libc/private/bionic_atomic_gcc_builtin.h b/libc/private/bionic_atomic_gcc_builtin.h
index e7c5761..2919f7f 100644
--- a/libc/private/bionic_atomic_gcc_builtin.h
+++ b/libc/private/bionic_atomic_gcc_builtin.h
@@ -31,18 +31,17 @@
 __bionic_cmpxchg(int32_t old_value, int32_t new_value, volatile int32_t* ptr)
 {
     /* We must return 0 on success */
-    return __sync_bool_compare_and_swap(ptr, old_value, new_value) == 0;
+    return __sync_val_compare_and_swap(ptr, old_value, new_value) != old_value;
 }
 
 __ATOMIC_INLINE__ int32_t
 __bionic_swap(int32_t new_value, volatile int32_t* ptr)
 {
-    int32_t prev;
+    int32_t old_value;
     do {
-        prev = *ptr;
-        status = __sync_val_compare_and_swap(ptr, prev, new_value);
-    } while (status == 0);
-    return prev;
+        old_value = *ptr;
+    } while (__sync_val_compare_and_swap(ptr, old_value, new_value) != old_value);
+    return old_value;
 }
 
 __ATOMIC_INLINE__ int32_t