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

Side by Side Diff: base/atomicops_internals_mips_gcc.h

Issue 872393003: MIPS: remove immediate constraint within CompareAndSwap. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This file is an internal atomic implementation, use base/atomicops.h instead. 5 // This file is an internal atomic implementation, use base/atomicops.h instead.
6 // 6 //
7 // LinuxKernelCmpxchg and Barrier_AtomicIncrement are from Google Gears. 7 // LinuxKernelCmpxchg and Barrier_AtomicIncrement are from Google Gears.
8 8
9 #ifndef BASE_ATOMICOPS_INTERNALS_MIPS_GCC_H_ 9 #ifndef BASE_ATOMICOPS_INTERNALS_MIPS_GCC_H_
10 #define BASE_ATOMICOPS_INTERNALS_MIPS_GCC_H_ 10 #define BASE_ATOMICOPS_INTERNALS_MIPS_GCC_H_
(...skipping 20 matching lines...) Expand all
31 "1:\n" 31 "1:\n"
32 "ll %0, %5\n" // prev = *ptr 32 "ll %0, %5\n" // prev = *ptr
33 "bne %0, %3, 2f\n" // if (prev != old_value) goto 2 33 "bne %0, %3, 2f\n" // if (prev != old_value) goto 2
34 "move %2, %4\n" // tmp = new_value 34 "move %2, %4\n" // tmp = new_value
35 "sc %2, %1\n" // *ptr = tmp (with atomic check) 35 "sc %2, %1\n" // *ptr = tmp (with atomic check)
36 "beqz %2, 1b\n" // start again on atomic error 36 "beqz %2, 1b\n" // start again on atomic error
37 "nop\n" // delay slot nop 37 "nop\n" // delay slot nop
38 "2:\n" 38 "2:\n"
39 ".set pop\n" 39 ".set pop\n"
40 : "=&r" (prev), "=m" (*ptr), "=&r" (tmp) 40 : "=&r" (prev), "=m" (*ptr), "=&r" (tmp)
41 : "Ir" (old_value), "r" (new_value), "m" (*ptr) 41 : "r" (old_value), "r" (new_value), "m" (*ptr)
42 : "memory"); 42 : "memory");
43 return prev; 43 return prev;
44 } 44 }
45 45
46 // Atomically store new_value into *ptr, returning the previous value held in 46 // Atomically store new_value into *ptr, returning the previous value held in
47 // *ptr. This routine implies no memory barriers. 47 // *ptr. This routine implies no memory barriers.
48 inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, 48 inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr,
49 Atomic32 new_value) { 49 Atomic32 new_value) {
50 Atomic32 temp, old; 50 Atomic32 temp, old;
51 __asm__ __volatile__(".set push\n" 51 __asm__ __volatile__(".set push\n"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 "1:\n" 160 "1:\n"
161 "lld %0, %5\n" // prev = *ptr 161 "lld %0, %5\n" // prev = *ptr
162 "bne %0, %3, 2f\n" // if (prev != old_value) goto 2 162 "bne %0, %3, 2f\n" // if (prev != old_value) goto 2
163 "move %2, %4\n" // tmp = new_value 163 "move %2, %4\n" // tmp = new_value
164 "scd %2, %1\n" // *ptr = tmp (with atomic check) 164 "scd %2, %1\n" // *ptr = tmp (with atomic check)
165 "beqz %2, 1b\n" // start again on atomic error 165 "beqz %2, 1b\n" // start again on atomic error
166 "nop\n" // delay slot nop 166 "nop\n" // delay slot nop
167 "2:\n" 167 "2:\n"
168 ".set pop\n" 168 ".set pop\n"
169 : "=&r" (prev), "=m" (*ptr), "=&r" (tmp) 169 : "=&r" (prev), "=m" (*ptr), "=&r" (tmp)
170 : "Ir" (old_value), "r" (new_value), "m" (*ptr) 170 : "r" (old_value), "r" (new_value), "m" (*ptr)
171 : "memory"); 171 : "memory");
172 return prev; 172 return prev;
173 } 173 }
174 174
175 // Atomically store new_value into *ptr, returning the previous value held in 175 // Atomically store new_value into *ptr, returning the previous value held in
176 // *ptr. This routine implies no memory barriers. 176 // *ptr. This routine implies no memory barriers.
177 inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, 177 inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr,
178 Atomic64 new_value) { 178 Atomic64 new_value) {
179 Atomic64 temp, old; 179 Atomic64 temp, old;
180 __asm__ __volatile__(".set push\n" 180 __asm__ __volatile__(".set push\n"
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 inline Atomic64 Release_Load(volatile const Atomic64* ptr) { 271 inline Atomic64 Release_Load(volatile const Atomic64* ptr) {
272 MemoryBarrier(); 272 MemoryBarrier();
273 return *ptr; 273 return *ptr;
274 } 274 }
275 #endif 275 #endif
276 276
277 } // namespace base::subtle 277 } // namespace base::subtle
278 } // namespace base 278 } // namespace base
279 279
280 #endif // BASE_ATOMICOPS_INTERNALS_MIPS_GCC_H_ 280 #endif // BASE_ATOMICOPS_INTERNALS_MIPS_GCC_H_
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698