gc_priv.h (GC_test_and_set): Implementation for Linux PPC from Franz Sirl <Franz.Sirl-kernel@lauterbach.com>.

* gc_priv.h (GC_test_and_set): Implementation for Linux PPC from
	Franz Sirl <Franz.Sirl-kernel@lauterbach.com>.

From-SVN: r28480
This commit is contained in:
Tom Tromey 1999-08-04 03:26:15 +00:00 committed by Tom Tromey
parent 02edc62b77
commit fa94e3a95d
2 changed files with 28 additions and 0 deletions

View File

@ -1,3 +1,8 @@
1999-08-03 Tom Tromey <tromey@cygnus.com>
* gc_priv.h (GC_test_and_set): Implementation for Linux PPC from
Franz Sirl <Franz.Sirl-kernel@lauterbach.com>.
1999-08-02 Tom Tromey <tromey@cygnus.com>
* aclocal.m4, configure: Rebuilt for new libtool.

View File

@ -465,6 +465,29 @@ void GC_print_callers (/* struct callinfo info[NFRAMES] */);
__asm__ __volatile__("mb": : :"memory");
*(addr) = 0;
}
# elif defined(__powerpc__)
inline static int GC_test_and_set(volatile unsigned int *addr) {
int ret, oldval=0, newval=1;
__asm__ __volatile__("sync" : : : "memory");
__asm__ __volatile__(
"0: lwarx %0,0,%1 ;"
" xor. %0,%3,%0;"
" bne 1f;"
" stwcx. %2,0,%1;"
" bne- 0b;"
"1: "
: "=&r"(ret)
: "r"(addr), "r"(newval), "r"(oldval)
: "cr0", "memory");
__asm__ __volatile__("sync" : : : "memory");
return ret == 0;
}
inline static void GC_clear(volatile unsigned int *addr) {
__asm__ __volatile__("sync": : :"memory");
*(addr) = 0;
}
# else
-- > Need implementation of GC_test_and_set()
# endif