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