aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@cygnus.com>1999-08-04 03:26:15 +0000
committerTom Tromey <tromey@gcc.gnu.org>1999-08-04 03:26:15 +0000
commitfa94e3a95d755ca73fca584afaff820566f6a980 (patch)
tree48fbfdc7d7a95b3d57c29b83bd75b07238e29d85
parent02edc62b779ef9997410f1c1bffcbe8137fa6c44 (diff)
downloadgcc-fa94e3a95d755ca73fca584afaff820566f6a980.zip
gcc-fa94e3a95d755ca73fca584afaff820566f6a980.tar.gz
gcc-fa94e3a95d755ca73fca584afaff820566f6a980.tar.bz2
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
-rw-r--r--boehm-gc/ChangeLog5
-rw-r--r--boehm-gc/gc_priv.h23
2 files changed, 28 insertions, 0 deletions
diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index ba41a45..1ddff1c 100644
--- a/boehm-gc/ChangeLog
+++ b/boehm-gc/ChangeLog
@@ -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.
diff --git a/boehm-gc/gc_priv.h b/boehm-gc/gc_priv.h
index cc8b147..2903533 100644
--- a/boehm-gc/gc_priv.h
+++ b/boehm-gc/gc_priv.h
@@ -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