diff --git a/boehm-gc/ChangeLog b/boehm-gc/ChangeLog
index ba41a45dcf360a802f52e1415e90a5678caf0d97..1ddff1cf906be14696c7c39abac75ac32b3d5517 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 cc8b1476ddc2da6e56ab5b9751bc9168cea68e19..29035336f62a51ea792d831cfcde6b02b007b63e 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