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