17 INLINE
void AtomicAdjustI386Impl::
18 inc(TVOLATILE AtomicAdjustI386Impl::Integer &var) {
19 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
22 TVOLATILE Integer *var_ptr = &var;
25 lock inc dword ptr [edx];
27 #elif !defined(__EDG__) 29 __asm__ __volatile__(
"lock; incl %0" 39 INLINE
bool AtomicAdjustI386Impl::
40 dec(TVOLATILE AtomicAdjustI386Impl::Integer &var) {
41 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
45 TVOLATILE Integer *var_ptr = &var;
48 lock dec dword ptr [edx];
51 #elif !defined(__EDG__) 53 __asm__ __volatile__(
"lock; decl %0; sete %1" 54 :
"=m" (var),
"=qm" (c)
55 :
"m" (&var) :
"memory");
64 INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
65 add(TVOLATILE AtomicAdjustI386Impl::Integer &var, AtomicAdjustI386Impl::Integer delta) {
66 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
67 Integer orig_value = var;
68 Integer new_value = orig_value + delta;
69 while (compare_and_exchange(var, orig_value, new_value) != orig_value) {
71 new_value = orig_value + delta;
79 INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
80 set(TVOLATILE AtomicAdjustI386Impl::Integer &var,
81 AtomicAdjustI386Impl::Integer new_value) {
82 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
83 Integer orig_value = var;
94 INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
95 get(
const TVOLATILE AtomicAdjustI386Impl::Integer &var) {
96 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
103 INLINE AtomicAdjustI386Impl::Pointer AtomicAdjustI386Impl::
104 set_ptr(TVOLATILE AtomicAdjustI386Impl::Pointer &var,
105 AtomicAdjustI386Impl::Pointer new_value) {
106 assert((((
size_t)&var) & (
sizeof(Pointer) - 1)) == 0);
107 Pointer orig_value = var;
118 INLINE AtomicAdjustI386Impl::Pointer AtomicAdjustI386Impl::
119 get_ptr(
const TVOLATILE AtomicAdjustI386Impl::Pointer &var) {
120 assert((((
size_t)&var) & (
sizeof(Pointer) - 1)) == 0);
137 INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
138 compare_and_exchange(TVOLATILE AtomicAdjustI386Impl::Integer &mem,
139 AtomicAdjustI386Impl::Integer old_value,
140 AtomicAdjustI386Impl::Integer new_value) {
141 assert((((
size_t)&mem) & (
sizeof(Integer) - 1)) == 0);
145 TVOLATILE Integer *mem_ptr = &mem;
150 lock cmpxchg dword ptr [edx], ecx;
153 #elif !defined(__EDG__) 155 __asm__ __volatile__(
"lock; cmpxchgl %1,%2" 157 :
"r"(new_value),
"m"(mem),
"0"(old_value)
168 INLINE AtomicAdjustI386Impl::Pointer AtomicAdjustI386Impl::
169 compare_and_exchange_ptr(TVOLATILE AtomicAdjustI386Impl::Pointer &mem,
170 AtomicAdjustI386Impl::Pointer old_value,
171 AtomicAdjustI386Impl::Pointer new_value) {
172 assert((((
size_t)&mem) & (
sizeof(Pointer) - 1)) == 0);
176 TVOLATILE Pointer *mem_ptr = &mem;
181 lock cmpxchg dword ptr [edx], ecx;
184 #elif !defined(__EDG__) 186 __asm__ __volatile__(
"lock; cmpxchgl %1,%2" 188 :
"r"(new_value),
"m"(mem),
"0"(old_value)