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