summaryrefslogtreecommitdiff
path: root/rts/OldARMAtomic.c
diff options
context:
space:
mode:
authorKarel Gardas <karel.gardas@centrum.cz>2011-07-03 23:24:14 +0200
committerManuel M T Chakravarty <chak@cse.unsw.edu.au>2011-08-10 22:03:41 +1000
commite44642590550547675bffd37d395008eb978f119 (patch)
treeedd3171ac470abf15cc2ad19df5876134f99c32f /rts/OldARMAtomic.c
parentf0191c559d683b5bac12243c0db3b780b684799e (diff)
downloadhaskell-e44642590550547675bffd37d395008eb978f119.tar.gz
Stephen Blackheath's GHC/ARM registerised port
This is the Stephen Blackheath's GHC/ARM registerised port which is using modified version of LLVM and which provides basic registerised build functionality
Diffstat (limited to 'rts/OldARMAtomic.c')
-rw-r--r--rts/OldARMAtomic.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/rts/OldARMAtomic.c b/rts/OldARMAtomic.c
new file mode 100644
index 0000000000..2a3c6c6655
--- /dev/null
+++ b/rts/OldARMAtomic.c
@@ -0,0 +1,47 @@
+#include "PosixSource.h"
+#include "Stg.h"
+
+#if defined(HAVE_SCHED_H)
+#include <sched.h>
+#endif
+
+#if defined(THREADED_RTS)
+
+#if arm_HOST_ARCH && defined(PRE_ARMv6)
+
+static volatile int atomic_spin = 0;
+
+static int arm_atomic_spin_trylock (void)
+{
+ int result;
+
+ asm volatile (
+ "swp %0, %1, [%2]\n"
+ : "=&r,&r" (result)
+ : "r,0" (1), "r,r" (&atomic_spin)
+ : "memory");
+ if (result == 0)
+ return 0;
+ else
+ return -1;
+}
+
+void arm_atomic_spin_lock()
+{
+ while (arm_atomic_spin_trylock())
+#if defined(HAVE_SCHED_H)
+ sched_yield();
+#else
+ ; // inefficient on non-POSIX.
+#endif
+}
+
+void arm_atomic_spin_unlock()
+{
+ atomic_spin = 0;
+}
+
+#endif /* arm_HOST_ARCH && defined(PRE_ARMv6) */
+
+#endif /* defined(THREADED_RTS) */
+