Merge "Remove android_atomic_cas64 use."
diff --git a/base/atomicops_internals_arm64_gcc.h b/base/atomicops_internals_arm64_gcc.h
index e832b29..c3806a9 100644
--- a/base/atomicops_internals_arm64_gcc.h
+++ b/base/atomicops_internals_arm64_gcc.h
@@ -10,11 +10,16 @@
 #define BASE_ATOMICOPS_INTERNALS_ARM64_GCC_H_
 #pragma once
 
+#include <stdatomic.h>
+
 namespace base {
 namespace subtle {
 
 #include <cutils/atomic-arm64.h>
 
+// TODO: Convert the rest of these to C++11 (or C11) atomics.
+// Or, even better, convert the clients.
+
 inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
                                          Atomic32 old_value,
                                          Atomic32 new_value) {
@@ -29,18 +34,16 @@
   return prev_value;
 }
 
+typedef volatile _Atomic(Atomic64)* atomic64_ptr_t;
+
 inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
                                          Atomic64 old_value,
                                          Atomic64 new_value) {
-  Atomic64 prev_value = *ptr;
-  do {
-    if (!android_atomic_cas64(old_value, new_value,
-                             const_cast<Atomic64*>(ptr))) {
-      return old_value;
-    }
-    prev_value = *ptr;
-  } while (prev_value == old_value);
-  return prev_value;
+  Atomic64 old = old_value;
+  atomic_compare_exchange_strong_explicit(
+                reinterpret_cast<atomic64_ptr_t>(ptr),
+                &old, new_value, memory_order_relaxed, memory_order_relaxed);
+  return old;  // possibly replaced by CAS
 }
 
 inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,