diff --git a/ChangeLog b/ChangeLog index e3521d7bd..aa4655f2e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-05-25 Richard Frith-Macdonald + + * Source/NSObject.m: + Attempt fix for atomic assembler on x86 (bug #33392) + 2011-05-24 David Chisnall * Source/NSBundle.m @@ -6,12 +11,12 @@ * Source/NSZone.m * Source/NSObject.m * Source/NSAutoreleasePool.m - First pass at supporting fully Apple-compatible GC in -base. Code sitting + First pass at supporting fully Apple-compatible GC in -base. + Code sitting on top of -base should not require modifying (in theory, at least, and unless it does the sort of evil tricks that LanguageKit does for performance). - 2011-05-24 Richard Frith-Macdonald * Source/NSAutoreleasePool.m: diff --git a/Source/NSObject.m b/Source/NSObject.m index 4dd7a1bae..60b5fb0ed 100644 --- a/Source/NSObject.m +++ b/Source/NSObject.m @@ -226,22 +226,28 @@ typedef int32_t volatile *gsatomic_t; #define GSATOMICREAD(X) (*(X)) -static __inline__ int +int GSAtomicIncrement(gsatomic_t X) { - __asm__ __volatile__ ( - "lock addl $1, %0" - :"=m" (*X)); - return *X; + int32_t tmp = 1; + __asm__ __volatile__ ( + "lock xaddl %0, %1" + :"=r" (tmp), "=m" (*X) + :"r" (tmp), "m" (*X) + :"memory" ); + return tmp; } -static __inline__ int +int GSAtomicDecrement(gsatomic_t X) { - __asm__ __volatile__ ( - "lock subl $1, %0" - :"=m" (*X)); - return *X; + int32_t tmp = -1; + __asm__ __volatile__ ( + "lock xaddl %0, %1" + :"=r" (tmp), "=m" (*X) + :"r" (tmp), "m" (*X) + :"memory" ); + return tmp; } #elif defined(__PPC__) || defined(__POWERPC__)