15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Copyright (c) 2008, Google Inc.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * modification, are permitted provided that the following conditions are
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * met:
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in the documentation and/or other materials provided with the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distribution.
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * this software without specific prior written permission.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ---
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation of atomic operations for ppc-linux.  This file should not
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be included directly.  Clients should instead include
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "base/atomicops.h".
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_ATOMICOPS_INTERNALS_LINUXPPC_H_
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_ATOMICOPS_INTERNALS_LINUXPPC_H_
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32_t Atomic32;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __PPC64__
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_HAS_ATOMIC64 1
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace subtle {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void _sync(void) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __asm__ __volatile__("sync": : : "memory");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void _lwsync(void) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gcc defines __NO_LWSYNC__ when appropriate; see
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //    http://gcc.gnu.org/ml/gcc-patches/2006-11/msg01238.html
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __NO_LWSYNC__
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __asm__ __volatile__("msync": : : "memory");
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __asm__ __volatile__("lwsync": : : "memory");
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void _isync(void) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __asm__ __volatile__("isync": : : "memory");
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline Atomic32 OSAtomicAdd32(Atomic32 amount, Atomic32 *value) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic32 t;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __asm__ __volatile__(
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"1:		lwarx   %0,0,%3\n\
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		add     %0,%2,%0\n\
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stwcx.  %0,0,%3 \n\
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bne-    1b"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		: "=&r" (t), "+m" (*value)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		: "r" (amount), "r" (value)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                : "cc");
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return t;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline Atomic32 OSAtomicAdd32Barrier(Atomic32 amount, Atomic32 *value) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic32 t;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _lwsync();
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  t = OSAtomicAdd32(amount, value);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is based on the code snippet in the architecture manual (Vol
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2, Appendix B).  It's a little tricky: correctness depends on the
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fact that the code right before this (in OSAtomicAdd32) has a
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // conditional branch with a data dependency on the update.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, we'd have to use sync.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _isync();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return t;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool OSAtomicCompareAndSwap32(Atomic32 old_value,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            Atomic32 new_value,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            Atomic32 *value) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic32 prev;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __asm__ __volatile__(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"1:		lwarx   %0,0,%2\n\
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cmpw    0,%0,%3\n\
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bne-    2f\n\
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stwcx.  %4,0,%2\n\
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bne-    1b\n\
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)2:"
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                : "=&r" (prev), "+m" (*value)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                : "r" (value), "r" (old_value), "r" (new_value)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                : "cc");
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prev == old_value;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline Atomic32 OSAtomicCompareAndSwap32Acquire(Atomic32 old_value,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       Atomic32 new_value,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       Atomic32 *value) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic32 t;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  t = OSAtomicCompareAndSwap32(old_value, new_value, value);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is based on the code snippet in the architecture manual (Vol
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2, Appendix B).  It's a little tricky: correctness depends on the
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fact that the code right before this (in
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OSAtomicCompareAndSwap32) has a conditional branch with a data
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dependency on the update.  Otherwise, we'd have to use sync.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _isync();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return t;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline Atomic32 OSAtomicCompareAndSwap32Release(Atomic32 old_value,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       Atomic32 new_value,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       Atomic32 *value) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _lwsync();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OSAtomicCompareAndSwap32(old_value, new_value, value);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64_t Atomic64;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MemoryBarrier() {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This can't be _lwsync(); we need to order the immediately
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preceding stores against any load that may follow, but lwsync
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't guarantee that.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _sync();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 32-bit Versions.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32 *ptr,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Atomic32 old_value,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Atomic32 new_value) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic32 prev_value;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (OSAtomicCompareAndSwap32(old_value, new_value,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const_cast<Atomic32*>(ptr))) {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return old_value;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev_value = *ptr;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (prev_value == old_value);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prev_value;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32 *ptr,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Atomic32 new_value) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic32 old_value;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_value = *ptr;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (!OSAtomicCompareAndSwap32(old_value, new_value,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const_cast<Atomic32*>(ptr)));
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return old_value;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32 *ptr,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          Atomic32 increment) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OSAtomicAdd32(increment, const_cast<Atomic32*>(ptr));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32 *ptr,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        Atomic32 increment) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OSAtomicAdd32Barrier(increment, const_cast<Atomic32*>(ptr));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32 *ptr,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic32 old_value,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic32 new_value) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic32 prev_value;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (OSAtomicCompareAndSwap32Acquire(old_value, new_value,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const_cast<Atomic32*>(ptr))) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return old_value;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev_value = *ptr;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (prev_value == old_value);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prev_value;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Release_CompareAndSwap(volatile Atomic32 *ptr,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic32 old_value,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic32 new_value) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic32 prev_value;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (OSAtomicCompareAndSwap32Release(old_value, new_value,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const_cast<Atomic32*>(ptr))) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return old_value;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev_value = *ptr;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (prev_value == old_value);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prev_value;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __PPC64__
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 64-bit Versions.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline Atomic64 OSAtomicAdd64(Atomic64 amount, Atomic64 *value) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic64 t;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __asm__ __volatile__(
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"1:		ldarx   %0,0,%3\n\
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		add     %0,%2,%0\n\
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stdcx.  %0,0,%3 \n\
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bne-    1b"
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		: "=&r" (t), "+m" (*value)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		: "r" (amount), "r" (value)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                : "cc");
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return t;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline Atomic64 OSAtomicAdd64Barrier(Atomic64 amount, Atomic64 *value) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic64 t;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _lwsync();
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  t = OSAtomicAdd64(amount, value);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is based on the code snippet in the architecture manual (Vol
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2, Appendix B).  It's a little tricky: correctness depends on the
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fact that the code right before this (in OSAtomicAdd64) has a
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // conditional branch with a data dependency on the update.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Otherwise, we'd have to use sync.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _isync();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return t;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool OSAtomicCompareAndSwap64(Atomic64 old_value,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            Atomic64 new_value,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            Atomic64 *value) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic64 prev;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  __asm__ __volatile__(
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"1:		ldarx   %0,0,%2\n\
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		cmpw    0,%0,%3\n\
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bne-    2f\n\
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		stdcx.  %4,0,%2\n\
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		bne-    1b\n\
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)2:"
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                : "=&r" (prev), "+m" (*value)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                : "r" (value), "r" (old_value), "r" (new_value)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                : "cc");
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prev == old_value;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline Atomic64 OSAtomicCompareAndSwap64Acquire(Atomic64 old_value,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       Atomic64 new_value,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       Atomic64 *value) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic64 t;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  t = OSAtomicCompareAndSwap64(old_value, new_value, value);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is based on the code snippet in the architecture manual (Vol
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2, Appendix B).  It's a little tricky: correctness depends on the
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // fact that the code right before this (in
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OSAtomicCompareAndSwap64) has a conditional branch with a data
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dependency on the update.  Otherwise, we'd have to use sync.
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _isync();
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return t;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline Atomic64 OSAtomicCompareAndSwap64Release(Atomic64 old_value,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       Atomic64 new_value,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                       Atomic64 *value) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _lwsync();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OSAtomicCompareAndSwap64(old_value, new_value, value);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64 *ptr,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Atomic64 old_value,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Atomic64 new_value) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic64 prev_value;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (OSAtomicCompareAndSwap64(old_value, new_value,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const_cast<Atomic64*>(ptr))) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return old_value;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev_value = *ptr;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (prev_value == old_value);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prev_value;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64 *ptr,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         Atomic64 new_value) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic64 old_value;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    old_value = *ptr;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (!OSAtomicCompareAndSwap64(old_value, new_value,
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const_cast<Atomic64*>(ptr)));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return old_value;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64 *ptr,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          Atomic64 increment) {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OSAtomicAdd64(increment, const_cast<Atomic64*>(ptr));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64 *ptr,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        Atomic64 increment) {
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return OSAtomicAdd64Barrier(increment, const_cast<Atomic64*>(ptr));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64 *ptr,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic64 old_value,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic64 new_value) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic64 prev_value;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (OSAtomicCompareAndSwap64Acquire(old_value, new_value,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const_cast<Atomic64*>(ptr))) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return old_value;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev_value = *ptr;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (prev_value == old_value);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prev_value;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Release_CompareAndSwap(volatile Atomic64 *ptr,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic64 old_value,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       Atomic64 new_value) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic64 prev_value;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  do {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (OSAtomicCompareAndSwap64Release(old_value, new_value,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const_cast<Atomic64*>(ptr))) {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return old_value;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev_value = *ptr;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } while (prev_value == old_value);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prev_value;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void NoBarrier_Store(volatile Atomic32 *ptr, Atomic32 value) {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *ptr = value;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(volatile Atomic32 *ptr, Atomic32 value) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *ptr = value;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This can't be _lwsync(); we need to order the immediately
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preceding stores against any load that may follow, but lwsync
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't guarantee that.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _sync();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(volatile Atomic32 *ptr, Atomic32 value) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _lwsync();
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *ptr = value;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_Load(volatile const Atomic32 *ptr) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *ptr;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Acquire_Load(volatile const Atomic32 *ptr) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic32 value = *ptr;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _lwsync();
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Release_Load(volatile const Atomic32 *ptr) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This can't be _lwsync(); we need to order the immediately
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preceding stores against any load that may follow, but lwsync
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't guarantee that.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _sync();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *ptr;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __PPC64__
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 64-bit Versions.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void NoBarrier_Store(volatile Atomic64 *ptr, Atomic64 value) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *ptr = value;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(volatile Atomic64 *ptr, Atomic64 value) {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *ptr = value;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This can't be _lwsync(); we need to order the immediately
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preceding stores against any load that may follow, but lwsync
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't guarantee that.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _sync();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(volatile Atomic64 *ptr, Atomic64 value) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _lwsync();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *ptr = value;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_Load(volatile const Atomic64 *ptr) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *ptr;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Acquire_Load(volatile const Atomic64 *ptr) {
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Atomic64 value = *ptr;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _lwsync();
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return value;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Release_Load(volatile const Atomic64 *ptr) {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This can't be _lwsync(); we need to order the immediately
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preceding stores against any load that may follow, but lwsync
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // doesn't guarantee that.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _sync();
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return *ptr;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}   // namespace base::subtle
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}   // namespace base
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_ATOMICOPS_INTERNALS_LINUXPPC_H_
417