FTK change. Added native Linux atomic ops on PPC.

git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@753 0109f412-320b-0410-ab79-c3e0c5ffbbe6
This commit is contained in:
ahodgkinson
2006-08-08 23:12:02 +00:00
parent 1996f05292
commit 65ec01a749
3 changed files with 81 additions and 0 deletions

View File

@@ -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

View File

@@ -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:
**********************************************************************/

View File

@@ -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:
****************************************************************************/