Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(346)

Side by Side Diff: src/base/atomicops_internals_ppc_gcc.h

Issue 422063005: Contribution of PowerPC port. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: re-upload - catch up to 8/19 level Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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
8 #ifndef V8_BASE_ATOMICOPS_INTERNALS_PPC_H_
9 #define V8_BASE_ATOMICOPS_INTERNALS_PPC_H_
10
11 namespace v8 {
12 namespace base {
13
14 inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr,
15 Atomic32 old_value,
16 Atomic32 new_value) {
17 return (__sync_val_compare_and_swap(ptr, old_value, new_value));
18 }
19
20 inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
21 Atomic32 new_value) {
22 Atomic32 old_value;
23 do {
24 old_value = *ptr;
25 } while (__sync_bool_compare_and_swap(ptr, old_value, new_value) == false);
26 return old_value;
27 }
28
29 inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr,
30 Atomic32 increment) {
31 return Barrier_AtomicIncrement(ptr, increment);
32 }
33
34 inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr,
35 Atomic32 increment) {
36 for (;;) {
37 Atomic32 old_value = *ptr;
38 Atomic32 new_value = old_value + increment;
39 if (__sync_bool_compare_and_swap(ptr, old_value, new_value)) {
40 return new_value;
41 // The exchange took place as expected.
42 }
43 // Otherwise, *ptr changed mid-loop and we need to retry.
44 }
45 }
46
47 inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr,
48 Atomic32 old_value, Atomic32 new_value) {
49 return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
50 }
51
52 inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr,
53 Atomic32 old_value, Atomic32 new_value) {
54 return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
55 }
56
57 inline void NoBarrier_Store(volatile Atomic8* ptr, Atomic8 value) {
58 *ptr = value;
59 }
60
61 inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) {
62 *ptr = value;
63 }
64
65 inline void MemoryBarrier() { __asm__ __volatile__("sync" : : : "memory"); }
66
67 inline void Acquire_Store(volatile Atomic32* ptr, Atomic32 value) {
68 *ptr = value;
69 MemoryBarrier();
70 }
71
72 inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) {
73 MemoryBarrier();
74 *ptr = value;
75 }
76
77 inline Atomic8 NoBarrier_Load(volatile const Atomic8* ptr) { return *ptr; }
78
79 inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { return *ptr; }
80
81 inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) {
82 Atomic32 value = *ptr;
83 MemoryBarrier();
84 return value;
85 }
86
87 inline Atomic32 Release_Load(volatile const Atomic32* ptr) {
88 MemoryBarrier();
89 return *ptr;
90 }
91
92 #ifdef V8_TARGET_ARCH_PPC64
93 inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
94 Atomic64 old_value,
95 Atomic64 new_value) {
96 return (__sync_val_compare_and_swap(ptr, old_value, new_value));
97 }
98
99 inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
100 Atomic64 new_value) {
101 Atomic64 old_value;
102 do {
103 old_value = *ptr;
104 } while (__sync_bool_compare_and_swap(ptr, old_value, new_value) == false);
105 return old_value;
106 }
107
108 inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr,
109 Atomic64 increment) {
110 return Barrier_AtomicIncrement(ptr, increment);
111 }
112
113 inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr,
114 Atomic64 increment) {
115 for (;;) {
116 Atomic64 old_value = *ptr;
117 Atomic64 new_value = old_value + increment;
118 if (__sync_bool_compare_and_swap(ptr, old_value, new_value)) {
119 return new_value;
120 // The exchange took place as expected.
121 }
122 // Otherwise, *ptr changed mid-loop and we need to retry.
123 }
124 }
125
126 inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr,
127 Atomic64 old_value, Atomic64 new_value) {
128 return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
129 }
130
131 inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr,
132 Atomic64 old_value, Atomic64 new_value) {
133 return NoBarrier_CompareAndSwap(ptr, old_value, new_value);
134 }
135
136 inline void NoBarrier_Store(volatile Atomic64* ptr, Atomic64 value) {
137 *ptr = value;
138 }
139
140 inline void Acquire_Store(volatile Atomic64* ptr, Atomic64 value) {
141 *ptr = value;
142 MemoryBarrier();
143 }
144
145 inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) {
146 MemoryBarrier();
147 *ptr = value;
148 }
149
150 inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { return *ptr; }
151
152 inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) {
153 Atomic64 value = *ptr;
154 MemoryBarrier();
155 return value;
156 }
157
158 inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
159 MemoryBarrier();
160 return *ptr;
161 }
162
163 #endif
164 }
165 } // namespace v8::base
166
167 #endif // V8_BASE_ATOMICOPS_INTERNALS_PPC_GCC_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698