1ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
5ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// This file is an internal atomic implementation, use atomicops.h instead.
6ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
71e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#ifndef V8_BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_
81e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#define V8_BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_
9ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
10ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// AtomicWord is a synonym for intptr_t, and Atomic32 is a synonym for int32,
11ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// which in turn means int. On some LP32 platforms, intptr_t is an int, but
12ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// on others, it's a long. When AtomicWord and Atomic32 are based on different
13ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// fundamental types, their pointers are incompatible.
14ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org//
15ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// This file defines function overloads to allow both AtomicWord and Atomic32
16ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// data to be used with this interface.
17ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org//
18ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// On LP64 platforms, AtomicWord and Atomic64 are both always long,
19ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org// so this problem doesn't occur.
20ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
21ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org#if !defined(V8_HOST_ARCH_64_BIT)
22ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
23ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orgnamespace v8 {
241e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.orgnamespace base {
25ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
26ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr,
27ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                                           AtomicWord old_value,
28ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                                           AtomicWord new_value) {
29ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return NoBarrier_CompareAndSwap(
30ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value);
31ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
32ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
33ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr,
34ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                                           AtomicWord new_value) {
35ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return NoBarrier_AtomicExchange(
36ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile Atomic32*>(ptr), new_value);
37ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
38ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
39ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr,
40ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                                            AtomicWord increment) {
41ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return NoBarrier_AtomicIncrement(
42ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile Atomic32*>(ptr), increment);
43ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
44ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
45ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr,
46ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                                          AtomicWord increment) {
47ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return Barrier_AtomicIncrement(
48ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile Atomic32*>(ptr), increment);
49ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
50ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
51ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr,
52ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                                         AtomicWord old_value,
53ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                                         AtomicWord new_value) {
541e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return v8::base::Acquire_CompareAndSwap(
55ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value);
56ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
57ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
58ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr,
59ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                                         AtomicWord old_value,
60ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org                                         AtomicWord new_value) {
611e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return v8::base::Release_CompareAndSwap(
62ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile Atomic32*>(ptr), old_value, new_value);
63ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
64ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
65ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline void NoBarrier_Store(volatile AtomicWord *ptr, AtomicWord value) {
66ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  NoBarrier_Store(
67ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile Atomic32*>(ptr), value);
68ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
69ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
70ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline void Acquire_Store(volatile AtomicWord* ptr, AtomicWord value) {
711e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return v8::base::Acquire_Store(
72ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile Atomic32*>(ptr), value);
73ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
74ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
75ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) {
761e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return v8::base::Release_Store(
77ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile Atomic32*>(ptr), value);
78ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
79ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
80ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline AtomicWord NoBarrier_Load(volatile const AtomicWord *ptr) {
81ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org  return NoBarrier_Load(
82ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile const Atomic32*>(ptr));
83ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
84ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
85ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) {
861e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return v8::base::Acquire_Load(
87ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile const Atomic32*>(ptr));
88ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
89ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
90ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.orginline AtomicWord Release_Load(volatile const AtomicWord* ptr) {
911e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org  return v8::base::Release_Load(
92ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      reinterpret_cast<volatile const Atomic32*>(ptr));
93ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org}
94ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
951e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org} }  // namespace v8::base
96ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
97ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org#endif  // !defined(V8_HOST_ARCH_64_BIT)
98ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org
991e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#endif  // V8_BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_
100