diff --git a/ftk/src/ftkmisc.cpp b/ftk/src/ftkmisc.cpp index a547b43..525d7c9 100644 --- a/ftk/src/ftkmisc.cpp +++ b/ftk/src/ftkmisc.cpp @@ -1251,6 +1251,10 @@ FLMINT32 FLMAPI f_atomicInc( return( i32Tmp + 1); } + #elif defined( FLM_PPC) && defined( FLM_GNUC) && defined( FLM_LINUX) + { + return( ppc_atomic_add( piTarget, 1)); + } #elif defined( FLM_UNIX) return( posix_atomic_add_32( piTarget, 1)); #else @@ -1300,6 +1304,10 @@ FLMINT32 FLMAPI f_atomicDec( return( i32Tmp - 1); } + #elif defined( FLM_PPC) && defined( FLM_GNUC) && defined( FLM_LINUX) + { + return( ppc_atomic_add( piTarget, -1)); + } #elif defined( FLM_UNIX) return( posix_atomic_add_32( piTarget, -1)); #else @@ -1373,6 +1381,10 @@ FLMINT32 FLMAPI f_atomicExchange( return( i32OldVal); } + #elif defined( FLM_PPC) && defined( FLM_GNUC) && defined( FLM_LINUX) + { + return( ppc_atomic_xchg( piTarget, i32NewVal)); + } #elif defined( FLM_UNIX) return( posix_atomic_xchg_32( piTarget, i32NewVal)); #else diff --git a/ftk/src/ftksys.h b/ftk/src/ftksys.h index 982a285..b4a3316 100644 --- a/ftk/src/ftksys.h +++ b/ftk/src/ftksys.h @@ -208,6 +208,24 @@ FLMINT32 iNewValue); #endif + /********************************************************************** + Desc: + **********************************************************************/ + #if defined( FLM_PPC) && defined( FLM_GNUC) && defined( FLM_LINUX) + extern "C" FLMATOMIC ppc_atomic_add( + FLMATOMIC * piTarget, + FLMINT32 iDelta); + #endif + + /********************************************************************** + Desc: + **********************************************************************/ + #if defined( FLM_PPC) && defined( FLM_GNUC) && defined( FLM_LINUX) + extern "C" FLMATOMIC ppc_atomic_xchg( + FLMATOMIC * piTarget, + FLMATOMIC iNewValue); + #endif + /********************************************************************** Desc: **********************************************************************/ diff --git a/ftk/src/ftkunix.cpp b/ftk/src/ftkunix.cpp index 3877ede..19ab517 100644 --- a/ftk/src/ftkunix.cpp +++ b/ftk/src/ftkunix.cpp @@ -1352,6 +1352,57 @@ void sparc_asm_code( void) } #endif +/**************************************************************************** +Desc: +****************************************************************************/ +#if defined( FLM_PPC) && defined( FLM_GNUC) && defined( FLM_LINUX) +FLMATOMIC ppc_atomic_add( + FLMATOMIC * piTarget, + FLMINT32 iDelta) +{ + long result; + + __asm__ __volatile__( + "sync\n" + "1:\n" + "lwarx %0, 0, %2\n" + "addc %0, %0, %3\n" + "stwcx. %0, 0, %2\n" + "bne- 1b\n" + "isync" + : "=&b" (result), "=m" (*piTarget) + : "b" (piTarget), "r" (iDelta) + : "cr0", "memory"); + + return( result); +} +#endif + +/**************************************************************************** +Desc: +****************************************************************************/ +#if defined( FLM_PPC) && defined( FLM_GNUC) && defined( FLM_LINUX) +FLMATOMIC ppc_atomic_xchg( + FLMATOMIC * piTarget, + FLMATOMIC iNewValue) +{ + long iOldVal; + + __asm__ __volatile__( + "sync\n" + "1:\n" + "lwarx %0, 0, %2\n" + "stwcx. %3, 0, %2\n" + "bne- 1b\n" + "isync" + : "=&b" (iOldVal), "=m" (*piTarget) + : "b" (piTarget), "r" (iNewValue) + : "cr0", "memory"); + + return( iOldVal); +} +#endif + /**************************************************************************** Desc: ****************************************************************************/