1b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Copyright 2010 the V8 project authors. All rights reserved. 2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without 3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are 4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met: 5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions of source code must retain the above copyright 7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// notice, this list of conditions and the following disclaimer. 8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions in binary form must reproduce the above 9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// copyright notice, this list of conditions and the following 10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// disclaimer in the documentation and/or other materials provided 11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// with the distribution. 12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Neither the name of Google Inc. nor the names of its 13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contributors may be used to endorse or promote products derived 14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// from this software without specific prior written permission. 15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// This file is an internal atomic implementation, use atomicops.h instead. 29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifndef V8_ATOMICOPS_INTERNALS_X86_MACOSX_H_ 31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define V8_ATOMICOPS_INTERNALS_X86_MACOSX_H_ 32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include <libkern/OSAtomic.h> 34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 { 36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal { 37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32 *ptr, 39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 old_value, 40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 new_value) { 41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 prev_value; 42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch do { 43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (OSAtomicCompareAndSwap32(old_value, new_value, 44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const_cast<Atomic32*>(ptr))) { 45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return old_value; 46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch prev_value = *ptr; 48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } while (prev_value == old_value); 49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return prev_value; 50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32 *ptr, 53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 new_value) { 54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 old_value; 55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch do { 56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch old_value = *ptr; 57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } while (!OSAtomicCompareAndSwap32(old_value, new_value, 58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const_cast<Atomic32*>(ptr))); 59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return old_value; 60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 62b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32 *ptr, 63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 increment) { 64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return OSAtomicAdd32(increment, const_cast<Atomic32*>(ptr)); 65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic32 Barrier_AtomicIncrement(volatile Atomic32 *ptr, 68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 increment) { 69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return OSAtomicAdd32Barrier(increment, const_cast<Atomic32*>(ptr)); 70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline void MemoryBarrier() { 73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch OSMemoryBarrier(); 74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 75b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic32 Acquire_CompareAndSwap(volatile Atomic32 *ptr, 77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 old_value, 78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 new_value) { 79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 prev_value; 80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch do { 81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (OSAtomicCompareAndSwap32Barrier(old_value, new_value, 82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const_cast<Atomic32*>(ptr))) { 83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return old_value; 84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch prev_value = *ptr; 86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } while (prev_value == old_value); 87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return prev_value; 88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic32 Release_CompareAndSwap(volatile Atomic32 *ptr, 91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 old_value, 92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 new_value) { 93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Acquire_CompareAndSwap(ptr, old_value, new_value); 94b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 95b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { 97b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch *ptr = value; 98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline void Acquire_Store(volatile Atomic32 *ptr, Atomic32 value) { 101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch *ptr = value; 102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch MemoryBarrier(); 103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline void Release_Store(volatile Atomic32 *ptr, Atomic32 value) { 106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch MemoryBarrier(); 107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch *ptr = value; 108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { 111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return *ptr; 112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic32 Acquire_Load(volatile const Atomic32 *ptr) { 115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic32 value = *ptr; 116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch MemoryBarrier(); 117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return value; 118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic32 Release_Load(volatile const Atomic32 *ptr) { 121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch MemoryBarrier(); 122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return *ptr; 123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef __LP64__ 126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 64-bit implementation on 64-bit platform 128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64 *ptr, 130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 old_value, 131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 new_value) { 132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 prev_value; 133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch do { 134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (OSAtomicCompareAndSwap64(old_value, new_value, 135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const_cast<Atomic64*>(ptr))) { 136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return old_value; 137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch prev_value = *ptr; 139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } while (prev_value == old_value); 140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return prev_value; 141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64 *ptr, 144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 new_value) { 145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 old_value; 146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch do { 147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch old_value = *ptr; 148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } while (!OSAtomicCompareAndSwap64(old_value, new_value, 149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const_cast<Atomic64*>(ptr))); 150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return old_value; 151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64 *ptr, 154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 increment) { 155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return OSAtomicAdd64(increment, const_cast<Atomic64*>(ptr)); 156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic64 Barrier_AtomicIncrement(volatile Atomic64 *ptr, 159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 increment) { 160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return OSAtomicAdd64Barrier(increment, const_cast<Atomic64*>(ptr)); 161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic64 Acquire_CompareAndSwap(volatile Atomic64 *ptr, 164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 old_value, 165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 new_value) { 166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 prev_value; 167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch do { 168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (OSAtomicCompareAndSwap64Barrier(old_value, new_value, 169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const_cast<Atomic64*>(ptr))) { 170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return old_value; 171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch prev_value = *ptr; 173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } while (prev_value == old_value); 174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return prev_value; 175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic64 Release_CompareAndSwap(volatile Atomic64 *ptr, 178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 old_value, 179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 new_value) { 180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The lib kern interface does not distinguish between 181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Acquire and Release memory barriers; they are equivalent. 182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Acquire_CompareAndSwap(ptr, old_value, new_value); 183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { 186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch *ptr = value; 187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline void Acquire_Store(volatile Atomic64 *ptr, Atomic64 value) { 190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch *ptr = value; 191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch MemoryBarrier(); 192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline void Release_Store(volatile Atomic64 *ptr, Atomic64 value) { 195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch MemoryBarrier(); 196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch *ptr = value; 197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { 200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return *ptr; 201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic64 Acquire_Load(volatile const Atomic64 *ptr) { 204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Atomic64 value = *ptr; 205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch MemoryBarrier(); 206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return value; 207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline Atomic64 Release_Load(volatile const Atomic64 *ptr) { 210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch MemoryBarrier(); 211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return *ptr; 212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif // defined(__LP64__) 215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// MacOS uses long for intptr_t, AtomicWord and Atomic32 are always different 217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// on the Mac, even when they are the same size. We need to explicitly cast 218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// from AtomicWord to Atomic32/64 to implement the AtomicWord interface. 219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef __LP64__ 220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define AtomicWordCastType Atomic64 221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#else 222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define AtomicWordCastType Atomic32 223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr, 226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AtomicWord old_value, 227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AtomicWord new_value) { 228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NoBarrier_CompareAndSwap( 229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile AtomicWordCastType*>(ptr), 230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch old_value, new_value); 231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr, 234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AtomicWord new_value) { 235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NoBarrier_AtomicExchange( 236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile AtomicWordCastType*>(ptr), new_value); 237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr, 240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AtomicWord increment) { 241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NoBarrier_AtomicIncrement( 242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile AtomicWordCastType*>(ptr), increment); 243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr, 246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AtomicWord increment) { 247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Barrier_AtomicIncrement( 248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile AtomicWordCastType*>(ptr), increment); 249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr, 252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AtomicWord old_value, 253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AtomicWord new_value) { 254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return v8::internal::Acquire_CompareAndSwap( 255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile AtomicWordCastType*>(ptr), 256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch old_value, new_value); 257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr, 260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AtomicWord old_value, 261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AtomicWord new_value) { 262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return v8::internal::Release_CompareAndSwap( 263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile AtomicWordCastType*>(ptr), 264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch old_value, new_value); 265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline void NoBarrier_Store(volatile AtomicWord *ptr, AtomicWord value) { 268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch NoBarrier_Store( 269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile AtomicWordCastType*>(ptr), value); 270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline void Acquire_Store(volatile AtomicWord* ptr, AtomicWord value) { 273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return v8::internal::Acquire_Store( 274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile AtomicWordCastType*>(ptr), value); 275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) { 278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return v8::internal::Release_Store( 279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile AtomicWordCastType*>(ptr), value); 280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline AtomicWord NoBarrier_Load(volatile const AtomicWord *ptr) { 283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NoBarrier_Load( 284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile const AtomicWordCastType*>(ptr)); 285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) { 288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return v8::internal::Acquire_Load( 289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile const AtomicWordCastType*>(ptr)); 290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochinline AtomicWord Release_Load(volatile const AtomicWord* ptr) { 293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return v8::internal::Release_Load( 294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch reinterpret_cast<volatile const AtomicWordCastType*>(ptr)); 295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef AtomicWordCastType 298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} } // namespace v8::internal 300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif // V8_ATOMICOPS_INTERNALS_X86_MACOSX_H_ 302