15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2003, 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)// Author: Lei Zhang, Sasha Levitskiy 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is an internal atomic implementation, use base/atomicops.h instead. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LinuxKernelCmpxchg and Barrier_AtomicIncrement are from Google Gears. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_ATOMICOPS_INTERNALS_ARM_GENERIC_H_ 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_ATOMICOPS_INTERNALS_ARM_GENERIC_H_ 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h> 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32_t Atomic32; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace subtle { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64_t Atomic64; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 0xffff0fc0 is the hard coded address of a function provided by 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the kernel which implements an atomic compare-exchange. On older 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ARM architecture revisions (pre-v6) this may be implemented using 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a syscall. This address is stable, and in active use (hard coded) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by at least glibc-2.7 and the Android C library. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pLinuxKernelCmpxchg has both acquire and release barrier sematincs. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef Atomic32 (*LinuxKernelCmpxchgFunc)(Atomic32 old_value, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) volatile Atomic32* ptr); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LinuxKernelCmpxchgFunc pLinuxKernelCmpxchg ATTRIBUTE_WEAK = 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (LinuxKernelCmpxchgFunc) 0xffff0fc0; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*LinuxKernelMemoryBarrierFunc)(void); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LinuxKernelMemoryBarrierFunc pLinuxKernelMemoryBarrier ATTRIBUTE_WEAK = 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (LinuxKernelMemoryBarrierFunc) 0xffff0fa0; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 old_value, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 prev_value = *ptr; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pLinuxKernelCmpxchg(old_value, new_value, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<Atomic32*>(ptr))) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return old_value; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev_value = *ptr; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (prev_value == old_value); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return prev_value; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 old_value; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_value = *ptr; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (pLinuxKernelCmpxchg(old_value, new_value, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<Atomic32*>(ptr))); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return old_value; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 increment) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (;;) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Atomic exchange the old value with an incremented one. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 old_value = *ptr; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value = old_value + increment; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pLinuxKernelCmpxchg(old_value, new_value, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_cast<Atomic32*>(ptr)) == 0) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The exchange took place as expected. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_value; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, *ptr changed mid-loop and we need to retry. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 increment) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Barrier_AtomicIncrement(ptr, increment); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 old_value, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NoBarrier_CompareAndSwap(ptr, old_value, new_value); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 old_value, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 new_value) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NoBarrier_CompareAndSwap(ptr, old_value, new_value); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ptr = value; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void MemoryBarrier() { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pLinuxKernelMemoryBarrier(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ptr = value; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryBarrier(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryBarrier(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *ptr = value; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *ptr; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic32 value = *ptr; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryBarrier(); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic32 Release_Load(volatile const Atomic32* ptr) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MemoryBarrier(); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *ptr; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 64-bit versions are not implemented yet. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void NotImplementedFatalError(const char *function_name) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fprintf(stderr, "64-bit %s() not implemented on this platform\n", 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function_name); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) abort(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 old_value, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 new_value) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("NoBarrier_CompareAndSwap"); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 new_value) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("NoBarrier_AtomicExchange"); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 increment) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("NoBarrier_AtomicIncrement"); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 increment) { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("Barrier_AtomicIncrement"); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("NoBarrier_Store"); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("Acquire_Store64"); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("Release_Store"); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("NoBarrier_Load"); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("Atomic64 Acquire_Load"); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Release_Load(volatile const Atomic64* ptr) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("Atomic64 Release_Load"); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 old_value, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 new_value) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("Atomic64 Acquire_CompareAndSwap"); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 old_value, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Atomic64 new_value) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotImplementedFatalError("Atomic64 Release_CompareAndSwap"); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base::subtle 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace base 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_ATOMICOPS_INTERNALS_ARM_GENERIC_H_ 236