diff options
author | Pedro Giffuni <pfg@apache.org> | 2011-10-27 17:54:01 +0000 |
---|---|---|
committer | Pedro Giffuni <pfg@apache.org> | 2011-10-27 17:54:01 +0000 |
commit | 98b2289ab92a5d747ac0779d20b5471d92bd4db5 (patch) | |
tree | 8ee8d26cca43c0500920f93673df96f2293b6e18 /sal/osl | |
parent | e2f9586831d00643f9cf8dfbeb55e0a91a84599e (diff) |
i117017 - ARM optimization for armv6/armv7
Diffstat (limited to 'sal/osl')
-rw-r--r-- | sal/osl/unx/interlck.c | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/sal/osl/unx/interlck.c b/sal/osl/unx/interlck.c index 0342cdd983b4..ad83d69b819a 100644 --- a/sal/osl/unx/interlck.c +++ b/sal/osl/unx/interlck.c @@ -134,6 +134,54 @@ oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* return nCount; } +#elif defined ( GCC ) && defined ( ARM ) + +/*****************************************************************************/ +/* osl_incrementInterlockedCount */ +/*****************************************************************************/ +oslInterlockedCount SAL_CALL osl_incrementInterlockedCount(oslInterlockedCount* pCount) +{ +#if defined( ARMV7 ) || defined( ARMV6 ) + register oslInterlockedCount nCount __asm__ ("r1"); + int nResult; + + __asm__ __volatile__ ( +"1: ldrex %0, [%3]\n" +" add %0, %0, #1\n" +" strex %1, %0, [%3]\n" +" teq %1, #0\n" +" bne 1b" + : "=&r" (nCount), "=&r" (nResult), "=m" (*pCount) + : "r" (pCount) + : "memory"); + + return nCount; +#else + return __sync_add_and_fetch( pCount, 1 ); +#endif +} + +oslInterlockedCount SAL_CALL osl_decrementInterlockedCount(oslInterlockedCount* pCount) +{ +#if defined( ARMV7 ) || defined( ARMV6 ) + register oslInterlockedCount nCount __asm__ ("r1"); + int nResult; + + __asm__ __volatile__ ( +"0: ldrex %0, [%3]\n" +" sub %0, %0, #1\n" +" strex %1, %0, [%3]\n" +" teq %1, #0\n" +" bne 0b" + : "=&r" (nCount), "=&r" (nResult), "=m" (*pCount) + : "r" (pCount) + : "memory"); + return nCount; +#else + return __sync_sub_and_fetch( pCount, 1 ); +#endif +} + #else /* use only if nothing else works, expensive due to single mutex for all reference counts */ |