17INLINE
void AtomicAdjustI386Impl::
18inc(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"
39INLINE
bool AtomicAdjustI386Impl::
40dec(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");
64INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
65add(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;
79INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
80set(TVOLATILE AtomicAdjustI386Impl::Integer &var,
81 AtomicAdjustI386Impl::Integer new_value) {
82 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
83 Integer orig_value = var;
94INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
95get(
const TVOLATILE AtomicAdjustI386Impl::Integer &var) {
96 assert((((
size_t)&var) & (
sizeof(Integer) - 1)) == 0);
103INLINE AtomicAdjustI386Impl::Pointer AtomicAdjustI386Impl::
104set_ptr(TVOLATILE AtomicAdjustI386Impl::Pointer &var,
105 AtomicAdjustI386Impl::Pointer new_value) {
106 assert((((
size_t)&var) & (
sizeof(Pointer) - 1)) == 0);
107 Pointer orig_value = var;
118INLINE AtomicAdjustI386Impl::Pointer AtomicAdjustI386Impl::
119get_ptr(
const TVOLATILE AtomicAdjustI386Impl::Pointer &var) {
120 assert((((
size_t)&var) & (
sizeof(Pointer) - 1)) == 0);
137INLINE AtomicAdjustI386Impl::Integer AtomicAdjustI386Impl::
138compare_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)
168INLINE AtomicAdjustI386Impl::Pointer AtomicAdjustI386Impl::
169compare_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)