SOURCES: mono-alpha-atomic.patch (NEW) - 1st try
qboosh
qboosh at pld-linux.org
Sat Sep 3 12:56:12 CEST 2005
Author: qboosh Date: Sat Sep 3 10:56:12 2005 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- 1st try
---- Files affected:
SOURCES:
mono-alpha-atomic.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/mono-alpha-atomic.patch
diff -u /dev/null SOURCES/mono-alpha-atomic.patch:1.1
--- /dev/null Sat Sep 3 12:56:12 2005
+++ SOURCES/mono-alpha-atomic.patch Sat Sep 3 12:56:07 2005
@@ -0,0 +1,120 @@
+--- mono-1.1.8.3/mono/io-layer/atomic.h.orig 2005-05-30 22:19:57.000000000 +0200
++++ mono-1.1.8.3/mono/io-layer/atomic.h 2005-09-03 08:49:48.556163120 +0200
+@@ -689,6 +689,117 @@
+ return old;
+ }
+
++#elif defined(__alpha__)
++#define WAPI_ATOMIC_ASM
++
++static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,
++ gint32 exch, gint32 comp)
++{
++ gint32 old, temp, temp2;
++ long compq = comp, exchq = exch;
++
++ __asm__ __volatile__ (
++ "1: ldl_l %2, %0\n"
++ " mov %2, %1\n"
++ " cmpeq %2, %5, %3\n"
++ " cmovne %3, %4, %2\n"
++ " stl_c %2, %0\n"
++ " beq %2, 1b\n"
++ : "=m" (*dest), "=&r" (old), "=&r" (temp), "=&r" (temp2)
++ : "r" (exchq), "r" (compq), "m" (*dest));
++ return(old);
++}
++
++static inline gpointer InterlockedCompareExchangePointer(volatile gpointer *dest, gpointer exch, gpointer comp)
++{
++ gpointer old, temp, temp2;
++
++ __asm__ __volatile__ (
++ "1: ldq_l %2, %0\n"
++ " mov %2, %1\n"
++ " cmpeq %2, %5, %3\n"
++ " cmovne %3, %4, %2\n"
++ " stq_c %2, %0\n"
++ " beq %2, 1b\n"
++ : "=m" (*dest), "=&r" (old), "=&r" (temp), "=&r" (temp2)
++ : "r" (exch), "r" (comp), "m" (*dest));
++ return(old);
++}
++
++static inline gint32 InterlockedIncrement(volatile gint32 *val)
++{
++ gint32 temp, cur;
++
++ __asm__ __volatile__ (
++ "1: ldl_l %0, %1\n"
++ " addl %0, %3, %0\n"
++ " mov %0, %2\n"
++ " stl_c %0, %1\n"
++ " beq %0, 1b\n"
++ : "=&r" (temp), "=m" (*val), "=r" (cur)
++ : "Ir" (1), "m" (*val));
++ return(cur);
++}
++
++static inline gint32 InterlockedDecrement(volatile gint32 *val)
++{
++ gint32 temp, cur;
++
++ __asm__ __volatile__ (
++ "1: ldl_l %0, %1\n"
++ " addl %0, %3, %0\n"
++ " mov %0, %2\n"
++ " stl_c %0, %1\n"
++ " beq %0, 1b\n"
++ : "=&r" (temp), "=m" (*val), "=r" (cur)
++ : "Ir" (-1), "m" (*val));
++ return(cur);
++}
++
++static inline gint32 InterlockedExchange(volatile gint32 *val, gint32 new_val)
++{
++ gint32 ret, temp;
++
++ __asm__ __volatile__ (
++ "1: ldl_l %1, %0\n"
++ " mov %3, %2\n"
++ " stl_c %2, %0\n"
++ " beq %2, 1b\n"
++ : "=m" (*val), "=&r" (ret), "=&r" (temp)
++ : "r" (new_val), "m" (*val));
++ return(ret);
++}
++
++static inline gpointer InterlockedExchangePointer(volatile gpointer *val, gpointer new_val)
++{
++ gpointer ret, temp;
++
++ __asm__ __volatile__ (
++ "1: ldq_l %1, %0\n"
++ " mov %3, %2\n"
++ " stq_c %2, %0\n"
++ " beq %2, 1b\n"
++ : "=m" (*val), "=&r" (ret), "=&r" (temp)
++ : "r" (new_val), "m" (*val));
++ return(ret);
++}
++
++static inline gint32 InterlockedExchangeAdd(volatile gint32 *val, gint32 add)
++{
++ gint32 ret, temp;
++
++ __asm__ __volatile__ (
++ "1: ldl_l %2, %0\n"
++ " mov %2, %1\n"
++ " addl %2, %3, %2\n"
++ " stl_c %2, %0\n"
++ " beq %2, 1b\n"
++ : "=m" (*val), "=&r" (ret), "=&r" (temp)
++ : "r" (add), "m" (*val));
++
++ return(ret);
++}
++
+ #else
+
+ extern gint32 InterlockedCompareExchange(volatile gint32 *dest, gint32 exch, gint32 comp);
================================================================
More information about the pld-cvs-commit
mailing list