--- ./libatomic_ops/src/atomic_ops/sysdeps/gcc/powerpc.h.orig	2016-05-24 22:01:55 +0200
+++ ./libatomic_ops/src/atomic_ops/sysdeps/gcc/powerpc.h	2016-09-02 13:16:37 +0200
@@ -72,8 +72,13 @@
    __asm__ __volatile__ (
     "ld%U1%X1 %0,%1\n"
     "cmpw %0,%0\n"
-    "bne- 1f\n"
-    "1: isync\n"
+#if defined (_AIX)
+        "bne- $+4\n"
+        "isync\n"
+#else
+        "bne- 1f\n"
+        "1: isync\n"
+#endif
     : "=r" (result)
     : "m"(*addr) : "memory", "cr0");
 #else
@@ -83,8 +88,13 @@
   __asm__ __volatile__ (
     "lwz%U1%X1 %0,%1\n"
     "cmpw %0,%0\n"
-    "bne- 1f\n"
-    "1: isync\n"
+#if defined (_AIX)
+        "bne- $+4\n"
+        "isync\n"
+#else
+        "bne- 1f\n"
+        "1: isync\n"
+#endif
     : "=r" (result)
     : "m"(*addr) : "memory", "cc");
 #endif
@@ -114,12 +124,21 @@
   unsigned long temp = 1; /* locked value */
 
   __asm__ __volatile__(
+#if defined (_AIX)
+	       "ldarx %0,0,%1\n"   /* load and reserve               */
+	       "cmpdi %0, 0\n"       /* if load is                     */
+	       "bne $+12\n"            /*   non-zero, return already set */
+	       "stdcx. %2,0,%1\n"    /* else store conditional         */
+	       "bne- $-16\n"           /* retry if lost reservation      */
+	       "\n"                /* oldval is zero if we set       */
+#else
                "1:ldarx %0,0,%1\n"   /* load and reserve               */
                "cmpdi %0, 0\n"       /* if load is                     */
                "bne 2f\n"            /*   non-zero, return already set */
                "stdcx. %2,0,%1\n"    /* else store conditional         */
                "bne- 1b\n"           /* retry if lost reservation      */
                "2:\n"                /* oldval is zero if we set       */
+#endif
               : "=&r"(oldval)
               : "r"(addr), "r"(temp)
               : "memory", "cr0");
@@ -128,12 +147,21 @@
   int temp = 1; /* locked value */
 
   __asm__ __volatile__(
+#if defined (_AIX)
+               "lwarx %0,0,%1\n"   /* load and reserve               */
+               "cmpwi %0, 0\n"       /* if load is                     */
+               "bne $+12\n"            /*   non-zero, return already set */
+               "stwcx. %2,0,%1\n"    /* else store conditional         */
+               "bne- $-16\n"           /* retry if lost reservation      */
+               "\n"                /* oldval is zero if we set       */
+#else
                "1:lwarx %0,0,%1\n"   /* load and reserve               */
                "cmpwi %0, 0\n"       /* if load is                     */
                "bne 2f\n"            /*   non-zero, return already set */
                "stwcx. %2,0,%1\n"    /* else store conditional         */
                "bne- 1b\n"           /* retry if lost reservation      */
                "2:\n"                /* oldval is zero if we set       */
+#endif
               : "=&r"(oldval)
               : "r"(addr), "r"(temp)
               : "memory", "cr0");
@@ -177,6 +205,15 @@
     int result = 0;
 #   if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__)
       __asm__ __volatile__(
+#if defined (_AIX)
+        "ldarx %0,0,%2\n"     /* load and reserve             */
+        "cmpd %0, %4\n"         /* if load is not equal to      */
+        "bne $+16\n"              /*   old, fail                  */
+        "stdcx. %3,0,%2\n"      /* else store conditional       */
+        "bne- $-16\n"             /* retry if lost reservation    */
+        "li %1,1\n"             /* result = 1;                  */
+        "\n"
+#else
         "1:ldarx %0,0,%2\n"     /* load and reserve             */
         "cmpd %0, %4\n"         /* if load is not equal to      */
         "bne 2f\n"              /*   old, fail                  */
@@ -184,11 +221,21 @@
         "bne- 1b\n"             /* retry if lost reservation    */
         "li %1,1\n"             /* result = 1;                  */
         "2:\n"
+#endif
         : "=&r"(oldval), "=&r"(result)
         : "r"(addr), "r"(new_val), "r"(old), "1"(result)
         : "memory", "cr0");
 #   else
       __asm__ __volatile__(
+#if defined (_AIX)
+        "lwarx %0,0,%2\n"     /* load and reserve             */
+        "cmpw %0, %4\n"         /* if load is not equal to      */
+        "bne $+16\n"              /*   old, fail                  */
+        "stwcx. %3,0,%2\n"      /* else store conditional       */
+        "bne- $-16\n"             /* retry if lost reservation    */
+        "li %1,1\n"             /* result = 1;                  */
+        "\n"
+#else
         "1:lwarx %0,0,%2\n"     /* load and reserve             */
         "cmpw %0, %4\n"         /* if load is not equal to      */
         "bne 2f\n"              /*   old, fail                  */
@@ -196,6 +243,7 @@
         "bne- 1b\n"             /* retry if lost reservation    */
         "li %1,1\n"             /* result = 1;                  */
         "2:\n"
+#endif
         : "=&r"(oldval), "=&r"(result)
         : "r"(addr), "r"(new_val), "r"(old), "1"(result)
         : "memory", "cr0");
@@ -240,23 +288,41 @@
   AO_t fetched_val;
 # if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__)
     __asm__ __volatile__(
+#if defined (_AIX)
+      "ldarx %0,0,%1\n"       /* load and reserve             */
+      "cmpd %0, %3\n"           /* if load is not equal to      */
+      "bne $+12\n"                /*   old_val, fail              */
+      "stdcx. %2,0,%1\n"        /* else store conditional       */
+      "bne- $-16\n"               /* retry if lost reservation    */
+      "\n"
+#else
       "1:ldarx %0,0,%1\n"       /* load and reserve             */
       "cmpd %0, %3\n"           /* if load is not equal to      */
       "bne 2f\n"                /*   old_val, fail              */
       "stdcx. %2,0,%1\n"        /* else store conditional       */
       "bne- 1b\n"               /* retry if lost reservation    */
       "2:\n"
+#endif
       : "=&r"(fetched_val)
       : "r"(addr), "r"(new_val), "r"(old_val)
       : "memory", "cr0");
 # else
     __asm__ __volatile__(
+#if defined (_AIX)
+      "lwarx %0,0,%1\n"       /* load and reserve             */
+      "cmpw %0, %3\n"           /* if load is not equal to      */
+      "bne $+12\n"                /*   old_val, fail              */
+      "stwcx. %2,0,%1\n"        /* else store conditional       */
+      "bne- $-16\n"               /* retry if lost reservation    */
+      "\n"
+#else
       "1:lwarx %0,0,%1\n"       /* load and reserve             */
       "cmpw %0, %3\n"           /* if load is not equal to      */
       "bne 2f\n"                /*   old_val, fail              */
       "stwcx. %2,0,%1\n"        /* else store conditional       */
       "bne- 1b\n"               /* retry if lost reservation    */
       "2:\n"
+#endif
       : "=&r"(fetched_val)
       : "r"(addr), "r"(new_val), "r"(old_val)
       : "memory", "cr0");
@@ -303,19 +369,33 @@
   AO_t newval;
 #if defined(__powerpc64__) || defined(__ppc64__) || defined(__64BIT__)
   __asm__ __volatile__(
+#if defined (_AIX)
+	       "ldarx %0,0,%2\n"   /* load and reserve                */
+	       "add %1,%0,%3\n"      /* increment                       */
+	       "stdcx. %1,0,%2\n"    /* store conditional               */
+               "bne- $-12\n"           /* retry if lost reservation       */
+#else
                "1:ldarx %0,0,%2\n"   /* load and reserve                */
                "add %1,%0,%3\n"      /* increment                       */
                "stdcx. %1,0,%2\n"    /* store conditional               */
                "bne- 1b\n"           /* retry if lost reservation       */
+#endif
               : "=&r"(oldval), "=&r"(newval)
               : "r"(addr), "r"(incr)
               : "memory", "cr0");
 #else
   __asm__ __volatile__(
+#if defined (_AIX)
+               "lwarx %0,0,%2\n"   /* load and reserve                */
+               "add %1,%0,%3\n"      /* increment                       */
+               "stwcx. %1,0,%2\n"    /* store conditional               */
+               "bne- $-12\n"           /* retry if lost reservation       */
+#else
                "1:lwarx %0,0,%2\n"   /* load and reserve                */
                "add %1,%0,%3\n"      /* increment                       */
                "stwcx. %1,0,%2\n"    /* store conditional               */
                "bne- 1b\n"           /* retry if lost reservation       */
+#endif
               : "=&r"(oldval), "=&r"(newval)
               : "r"(addr), "r"(incr)
               : "memory", "cr0");
