aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLai Wei-Chih <Robert.Lai@mediatek.com>2013-07-31 18:52:30 +0800
committerLai Wei-Chih <Robert.Lai@mediatek.com>2013-07-31 19:02:11 +0800
commit066cd5e4615399f4a70b9abaea699f1b62f394b5 (patch)
tree371192a8cb86d41a19037af48eed2afaff3ead77
parent6b032de90cac8b6d3b20ac2310b5aa1e6f2617a1 (diff)
downloadcompiler-rt-066cd5e4615399f4a70b9abaea699f1b62f394b5.tar.gz
Implement __sync_lock_test_and_set_4.
Change-Id: Ib986df235bd8695ee206880c2c51e33a424912db
-rw-r--r--lib/atomic-arm.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/lib/atomic-arm.c b/lib/atomic-arm.c
index ad82824d4..13d3b539d 100644
--- a/lib/atomic-arm.c
+++ b/lib/atomic-arm.c
@@ -311,6 +311,18 @@ uint32_t __sync_val_compare_and_swap_4 (volatile int32_t *ptr, int32_t oldval, i
return android_atomic_cas_val(oldval, newval, ptr);
}
+uint32_t __sync_lock_test_and_set_4 (volatile uint32_t *ptr, uint32_t val)
+{
+ uint32_t status, prev;
+ android_memory_barrier();
+ do {
+ prev = *ptr;
+ status = android_atomic_cas_bool(prev, val, ptr);
+ } while (__builtin_expect(status != 0, 0));
+
+ return prev;
+}
+
/* __sync_op_and_fetch functions */
int32_t __sync_add_and_fetch_4(volatile int32_t *ptr, int32_t val)