From e44642590550547675bffd37d395008eb978f119 Mon Sep 17 00:00:00 2001 From: Karel Gardas Date: Sun, 3 Jul 2011 23:24:14 +0200 Subject: 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 --- rts/OldARMAtomic.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 rts/OldARMAtomic.c (limited to 'rts/OldARMAtomic.c') 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 +#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) */ + -- cgit v1.2.1