diff options
Diffstat (limited to 'ghc/includes/SMP.h')
-rw-r--r-- | ghc/includes/SMP.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/ghc/includes/SMP.h b/ghc/includes/SMP.h index e3916bcd7a..cc959413d6 100644 --- a/ghc/includes/SMP.h +++ b/ghc/includes/SMP.h @@ -26,6 +26,9 @@ /* * XCHG - the atomic exchange instruction. Used for locking closures * during updates (see LOCK_CLOSURE below) and the MVar primops. + * + * NB: the xchg instruction is implicitly locked, so we do not need + * a lock prefix here. */ INLINE_HEADER StgWord xchg(StgPtr p, StgWord w) @@ -40,6 +43,20 @@ xchg(StgPtr p, StgWord w) return result; } +/* + * CMPXCHG - the single-word atomic compare-and-exchange instruction. Used + * in the STM implementation. + */ +INLINE_HEADER StgWord +cas(StgVolatilePtr p, StgWord o, StgWord n) +{ + __asm__ __volatile__ ( + "lock cmpxchg %3,%1" + :"=a"(o), "=m" (*(volatile unsigned int *)p) + :"0" (o), "r" (n)); + return o; +} + INLINE_HEADER StgInfoTable * lockClosure(StgClosure *p) { |