21 INLINE
void AtomicAdjustI386Impl::
22 inc(TVOLATILE AtomicAdjustI386Impl::Integer &var) {
23 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
26 TVOLATILE Integer *var_ptr = &var;
29 lock inc dword ptr [edx];
31 #elif !defined(__EDG__) 33 __asm__ __volatile__(
"lock; incl %0" 46 INLINE
bool AtomicAdjustI386Impl::
47 dec(TVOLATILE AtomicAdjustI386Impl::Integer &var) {
48 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
52 TVOLATILE Integer *var_ptr = &var;
55 lock dec dword ptr [edx];
58 #elif !defined(__EDG__) 60 __asm__ __volatile__(
"lock; decl %0; sete %1" 61 :
"=m" (var),
"=qm" (c)
62 :
"m" (&var) :
"memory");
73 INLINE
void AtomicAdjustI386Impl::
74 add(TVOLATILE AtomicAdjustI386Impl::Integer &var, AtomicAdjustI386Impl::Integer delta) {
75 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
76 Integer orig_value = var;
77 while (compare_and_exchange(var, orig_value, orig_value + delta) != orig_value) {
88 INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
89 set(TVOLATILE AtomicAdjustI386Impl::Integer &var,
90 AtomicAdjustI386Impl::Integer new_value) {
91 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
92 Integer orig_value = var;
106 INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
107 get(
const TVOLATILE AtomicAdjustI386Impl::Integer &var) {
108 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
118 INLINE AtomicAdjustI386Impl::Pointer AtomicAdjustI386Impl::
119 set_ptr(TVOLATILE AtomicAdjustI386Impl::Pointer &var,
120 AtomicAdjustI386Impl::Pointer new_value) {
121 assert((((
size_t)&var) & (
sizeof(Pointer) - 1)) == 0);
122 Pointer orig_value = var;
136 INLINE AtomicAdjustI386Impl::Pointer AtomicAdjustI386Impl::
137 get_ptr(
const TVOLATILE AtomicAdjustI386Impl::Pointer &var) {
138 assert((((
size_t)&var) & (
sizeof(Pointer) - 1)) == 0);
161 INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
162 compare_and_exchange(TVOLATILE AtomicAdjustI386Impl::Integer &mem,
163 AtomicAdjustI386Impl::Integer old_value,
164 AtomicAdjustI386Impl::Integer new_value) {
165 assert((((
size_t)&mem) & (
sizeof(Integer) - 1)) == 0);
169 TVOLATILE Integer *mem_ptr = &mem;
174 lock cmpxchg dword ptr [edx], ecx;
177 #elif !defined(__EDG__) 179 __asm__ __volatile__(
"lock; cmpxchgl %1,%2" 181 :
"r"(new_value),
"m"(mem),
"0"(old_value)
194 INLINE AtomicAdjustI386Impl::Pointer AtomicAdjustI386Impl::
195 compare_and_exchange_ptr(TVOLATILE AtomicAdjustI386Impl::Pointer &mem,
196 AtomicAdjustI386Impl::Pointer old_value,
197 AtomicAdjustI386Impl::Pointer new_value) {
198 assert((((
size_t)&mem) & (
sizeof(Pointer) - 1)) == 0);
202 TVOLATILE Pointer *mem_ptr = &mem;
207 lock cmpxchg dword ptr [edx], ecx;
210 #elif !defined(__EDG__) 212 __asm__ __volatile__(
"lock; cmpxchgl %1,%2" 214 :
"r"(new_value),
"m"(mem),
"0"(old_value)