[PATCH] atomic operations for ppc

Ingvar Hagelund ingvar at redpill-linpro.com
Tue Mar 13 14:52:30 PDT 2012

This patch should, if it is correct, add the functions atomic_add_uint32 and atomic_sub_uint32 that are missing on some platforms, at least RHEL5/ppc[64]. With this patch, jemalloc may be updated to 2.2.x also in the EPEL5 repositories.

The code was borrowed from the Boost library, see http://www.boost.org/doc/libs/1_49_0/boost/interprocess/detail/atomic.hpp . The Boost library is under the Boost license, which is quite BSD-like, but the license should probably be checked out for compatibility. See http://www.boost.org/LICENSE_1_0.txt 

Since I actually know nothing about ppc assembler myself, and have never used the Boost library, I should thank Federico G. Schwindt for valuable input on the patch.

Jason, could you produce a test case that confirms that the patch works?

Best regards,
Ingvar Hagelund

--- ../jemalloc-2.2.5.orig/include/jemalloc/internal/atomic.h   2011-11-15 02:18:06.000000000 +0100
+++ include/jemalloc/internal/atomic.h  2012-03-09 08:44:45.930652898 +0100
@@ -160,6 +160,33 @@

        return (x);
+#elif (defined(__ppc__) || defined(__PPC__))
+// Code shamelessly stolen from the boost library
+// Please do a license check before distributing
+atomic_add_uint32(uint32_t *p, uint32_t x)
+       uint32_t prev, temp;
+       asm volatile ("0:\n\t"                 // retry local label     
+               "lwarx  %0,0,%2\n\t"       // load prev and reserve 
+               "add    %1,%0,%3\n\t"      // temp = prev + x 
+               "stwcx. %1,0,%2\n\t"       // conditionally store   
+               "bne-   0b"                // start over if we lost
+                                          // the reservation
+               //XXX find a cleaner way to define the temp         
+               //it's not an output
+               : "=&r" (prev), "=&r" (temp)        // output, temp 
+               : "b" (p), "r" (x)                  // inputs       
+               : "memory", "cc");                  // clobbered    
+       return temp;
+atomic_sub_uint32(uint32_t *p, uint32_t x)
+       return atomic_add_uint32(p, -x);
 #  error "Missing implementation for 32-bit atomic operations"

More information about the jemalloc-discuss mailing list