[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