[helix-maintainers] Bug#337867: FTBFS (alpha): Bad inline assembly
Falk Hueffner
falk at debian.org
Mon Nov 7 00:23:02 UTC 2005
tags 337867 + patch
thanks
Hi,
here's a patch, but I haven't tested it yet.
--- common/include/atomicbase.h~ 2004-12-22 21:00:41.000000000 +0100
+++ common/include/atomicbase.h 2005-11-07 01:12:23.000000000 +0100
@@ -852,7 +852,7 @@
* know whether you need to retry or not.
*
*/
-#elif defined (__alpha)
+#elif defined (__alpha) && defined (__DECC)
#include <c_asm.h>
@@ -971,6 +971,101 @@
#define HXAtomicSubUINT32(p,n) HXAtomicSubRetUINT32((p),(n))
+#elif defined (__alpha) && defined (__GNUC__)
+
+/* Add n and return new value */
+inline INT32
+HXAtomicAddRetINT32(INT32* pNum, INT32 n)
+{
+ INT32 tmp, ret;
+ asm volatile(
+ "1: ldl_l %[ret], %[val] \n"
+ " addl %[ret], %[inc], %[tmp] \n"
+ " addl %[ret], %[inc], %[ret] \n"
+ " stl_c %[tmp], %[val] \n"
+ " beq %[tmp], 2f \n"
+ ".subsection 2 \n"
+ "2: br 1b \n"
+ ".previous"
+ : [ret] "=&r" (ret),
+ [tmp] "=&r" (tmp),
+ [val] "=m" (*pNum)
+ : [inc] "Ir" (n), "m" (*pNum));
+ return ret;
+}
+
+/* Subtract n and return new value */
+inline INT32
+HXAtomicSubRetINT32(INT32* pNum, INT32 n)
+{
+ INT32 tmp, ret;
+ asm volatile(
+ "1: ldl_l %[ret], %[val] \n"
+ " subl %[ret], %[inc], %[tmp] \n"
+ " subl %[ret], %[inc], %[ret] \n"
+ " stl_c %[tmp], %[val] \n"
+ " beq %[tmp], 2f \n"
+ ".subsection 2 \n"
+ "2: br 1b \n"
+ ".previous"
+ : [ret] "=&r" (ret),
+ [tmp] "=&r" (tmp),
+ [val] "=m" (*pNum)
+ : [inc] "Ir" (n), "m" (*pNum));
+ return ret;
+}
+
+/* Increment by 1 and return new value */
+inline INT32
+HXAtomicIncRetINT32(INT32* pNum)
+{
+ return HXAtomicAddRetINT32(pNum, 1);
+}
+
+/* Decrement by 1 and return new value */
+inline INT32
+HXAtomicDecRetINT32(INT32* pNum)
+{
+ return HXAtomicSubRetINT32(pNum, 1);
+}
+
+/* Increment by 1 and return new value */
+inline UINT32
+HXAtomicIncRetUINT32(UINT32* pNum)
+{
+ return HXAtomicIncRetINT32((INT32*) pNum);
+}
+
+/* Decrement by 1 and return new value */
+inline UINT32
+HXAtomicDecRetUINT32(UINT32* pNum)
+{
+ return HXAtomicDecRetINT32((INT32*) pNum);
+}
+
+/* Add n and return new value */
+inline UINT32
+HXAtomicAddRetUINT32(UINT32* pNum, UINT32 n)
+{
+ return HXAtomicAddRetINT32((INT32*) pNum, n);
+}
+
+/* Subtract n and return new value */
+inline UINT32
+HXAtomicSubRetUINT32(UINT32* pNum, UINT32 n)
+{
+ return HXAtomicSubRetINT32((INT32*) pNum, n);
+}
+
+#define HXAtomicIncINT32(p) HXAtomicIncRetINT32((p))
+#define HXAtomicDecINT32(p) HXAtomicDecRetINT32((p))
+#define HXAtomicAddINT32(p,n) HXAtomicAddRetINT32((p),(n))
+#define HXAtomicSubINT32(p,n) HXAtomicSubRetINT32((p),(n))
+
+#define HXAtomicIncUINT32(p) HXAtomicIncRetUINT32((p))
+#define HXAtomicDecUINT32(p) HXAtomicDecRetUINT32((p))
+#define HXAtomicAddUINT32(p,n) HXAtomicAddRetUINT32((p),(n))
+#define HXAtomicSubUINT32(p,n) HXAtomicSubRetUINT32((p),(n))
/***********************************************************************
* AIX / PowerPC (Native compiler)
--
Falk
More information about the helix-maintainers
mailing list