1// Copyright 2012 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// This file is an internal atomic implementation, use atomicops.h instead. 6 7#ifndef V8_BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ 8#define V8_BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ 9 10namespace v8 { 11namespace base { 12 13inline void MemoryBarrier() { __sync_synchronize(); } 14 15inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, 16 Atomic32 old_value, 17 Atomic32 new_value) { 18 return __sync_val_compare_and_swap(ptr, old_value, new_value); 19} 20 21inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, 22 Atomic32 new_value) { 23 return __sync_lock_test_and_set(ptr, new_value); 24} 25 26inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, 27 Atomic32 increment) { 28 return __sync_add_and_fetch(ptr, increment); 29} 30 31inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, 32 Atomic32 increment) { 33 return __sync_add_and_fetch(ptr, increment); 34} 35 36inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, 37 Atomic32 old_value, Atomic32 new_value) { 38 return __sync_val_compare_and_swap(ptr, old_value, new_value); 39} 40 41inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, 42 Atomic32 old_value, Atomic32 new_value) { 43 return __sync_val_compare_and_swap(ptr, old_value, new_value); 44} 45 46inline void NoBarrier_Store(volatile Atomic8* ptr, Atomic8 value) { 47 __sync_lock_test_and_set(ptr, value); 48} 49 50inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { 51 __sync_lock_test_and_set(ptr, value); 52} 53 54inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) { 55 __sync_lock_test_and_set(ptr, value); 56} 57 58inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { 59 __sync_lock_test_and_set(ptr, value); 60} 61 62inline Atomic8 NoBarrier_Load(volatile const Atomic8* ptr) { 63 return __sync_add_and_fetch(ptr, 0); 64} 65 66inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { 67 return __sync_add_and_fetch(ptr, 0); 68} 69 70inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { 71 return __sync_add_and_fetch(ptr, 0); 72} 73 74inline Atomic32 Release_Load(volatile const Atomic32* ptr) { 75 return __sync_add_and_fetch(ptr, 0); 76} 77 78// 64-bit versions of the operations. 79// See the 32-bit versions for comments. 80 81inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, 82 Atomic64 old_value, 83 Atomic64 new_value) { 84 return __sync_val_compare_and_swap(ptr, old_value, new_value); 85} 86 87inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, 88 Atomic64 new_value) { 89 return __sync_lock_test_and_set(ptr, new_value); 90} 91 92inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, 93 Atomic64 increment) { 94 return __sync_add_and_fetch(ptr, increment); 95} 96 97inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, 98 Atomic64 increment) { 99 return __sync_add_and_fetch(ptr, increment); 100} 101 102inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, 103 Atomic64 old_value, Atomic64 new_value) { 104 return __sync_val_compare_and_swap(ptr, old_value, new_value); 105} 106 107inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, 108 Atomic64 old_value, Atomic64 new_value) { 109 return __sync_val_compare_and_swap(ptr, old_value, new_value); 110} 111 112inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) { 113 __sync_lock_test_and_set(ptr, value); 114} 115 116inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) { 117 __sync_lock_test_and_set(ptr, value); 118} 119 120inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { 121 __sync_lock_test_and_set(ptr, value); 122} 123 124inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { 125 return __sync_add_and_fetch(ptr, 0); 126} 127 128inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { 129 return __sync_add_and_fetch(ptr, 0); 130} 131 132inline Atomic64 Release_Load(volatile const Atomic64* ptr) { 133 return __sync_add_and_fetch(ptr, 0); 134} 135} // namespace base 136} // namespace v8 137 138#endif // V8_BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ 139