summaryrefslogtreecommitdiff
path: root/sal/osl
diff options
context:
space:
mode:
authorPedro Giffuni <pfg@apache.org>2011-10-27 17:54:01 +0000
committerPedro Giffuni <pfg@apache.org>2011-10-27 17:54:01 +0000
commit98b2289ab92a5d747ac0779d20b5471d92bd4db5 (patch)
tree8ee8d26cca43c0500920f93673df96f2293b6e18 /sal/osl
parente2f9586831d00643f9cf8dfbeb55e0a91a84599e (diff)
i117017 - ARM optimization for armv6/armv7
Diffstat (limited to 'sal/osl')
-rw-r--r--sal/osl/unx/interlck.c48
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 */