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