__asm__ __volatile__ ("lock; cmpxchgl %2, %1"
: "=a" (result), "=m" (*p)
- : "r" (newval), "m" (*p), "0" (oldval));
+ : "r" (newval), "m" (*p), "0" (oldval)
+ : "cc");
return result;
}
*/
inline void Atomic::instruction_barrier(void)
{
- // Nothing.
+ // We need the "memory" constraint here because compare_and_swap does not
+ // have it.
+ __asm__ __volatile__ ("" : : : "memory");
}
#endif // _MD_ATOMIC_HPP
__asm__ __volatile__ ("lock; cmpxchgl %2, %1"
: "=a" (result), "=m" (*p)
- : "r" (newval), "m" (*p), "0" (oldval));
+ : "r" (newval), "m" (*p), "0" (oldval)
+ : "cc");
return result;
}
__asm__ __volatile__ ("lock; cmpxchgq %2, %1"
: "=a" (result), "=m" (*p)
- : "r" (newval), "m" (*p), "0" (oldval));
+ : "r" (newval), "m" (*p), "0" (oldval)
+ : "cc");
return result;
}
*/
inline void Atomic::instruction_barrier(void)
{
- // Nothing.
+ // We need the "memory" constraint here because compare_and_swap does not
+ // have it.
+ __asm__ __volatile__ ("" : : : "memory");
}
#endif // _MD_ATOMIC_HPP