浏览代码

- compilation fix for gcc < 2.9 (workaround for unsuported contraint)

Andrei Pelinescu-Onciul 18 年之前
父节点
当前提交
f62d0dc154
共有 2 个文件被更改,包括 35 次插入1 次删除
  1. 14 1
      atomic/atomic_alpha.h
  2. 21 0
      atomic/atomic_x86.h

+ 14 - 1
atomic/atomic_alpha.h

@@ -117,6 +117,19 @@
 	}
 	}
 
 
 
 
+#if defined __GNUC__ &&  __GNUC__ < 3 && __GNUC_MINOR__ < 9
+#define ATOMIC_FUNC_DECL01_1(NAME, OP, P_TYPE, RET_TYPE, RET_EXPR) \
+	inline static RET_TYPE atomic_##NAME##_##P_TYPE (volatile P_TYPE *var, \
+														P_TYPE v ) \
+	{ \
+		P_TYPE ret; \
+		asm volatile( \
+			ATOMIC_ASM_OP01_##P_TYPE(OP) \
+			: "=&r"(ret), "=r"(v), "=m"(*var), "0"(v)  : "m"(*var) \
+			); \
+		return RET_EXPR; \
+	}
+#else
 /* input in %0, and %1 (param), output in %1,  %0 goes in ret */
 /* input in %0, and %1 (param), output in %1,  %0 goes in ret */
 #define ATOMIC_FUNC_DECL01_1(NAME, OP, P_TYPE, RET_TYPE, RET_EXPR) \
 #define ATOMIC_FUNC_DECL01_1(NAME, OP, P_TYPE, RET_TYPE, RET_EXPR) \
 	inline static RET_TYPE atomic_##NAME##_##P_TYPE (volatile P_TYPE *var, \
 	inline static RET_TYPE atomic_##NAME##_##P_TYPE (volatile P_TYPE *var, \
@@ -129,7 +142,7 @@
 			); \
 			); \
 		return RET_EXPR; \
 		return RET_EXPR; \
 	}
 	}
-
+#endif /* gcc && gcc version < 2.9 */
 
 
 /* input in %0, output in %1, %0 goes in ret */
 /* input in %0, output in %1, %0 goes in ret */
 #define ATOMIC_FUNC_DECL0_1(NAME, OP, P_TYPE, RET_TYPE, RET_EXPR) \
 #define ATOMIC_FUNC_DECL0_1(NAME, OP, P_TYPE, RET_TYPE, RET_EXPR) \

+ 21 - 0
atomic/atomic_x86.h

@@ -129,6 +129,18 @@
 				); \
 				); \
 	}
 	}
 
 
+#if defined __GNUC__ &&  __GNUC__ < 3 && __GNUC_MINOR__ < 9
+/* gcc version < 2.9 */
+#define ATOMIC_FUNC_XCHG(NAME, OP, TYPE) \
+	inline static TYPE atomic_##NAME##_##TYPE(volatile TYPE* var, TYPE v) \
+{ \
+	asm volatile( \
+			OP " \n\t" \
+			: "=q"(v), "=m"(*var) :"m"(*var), "0"(v) : "memory" \
+			); \
+	return v; \
+}
+#else
 #define ATOMIC_FUNC_XCHG(NAME, OP, TYPE) \
 #define ATOMIC_FUNC_XCHG(NAME, OP, TYPE) \
 	inline static TYPE atomic_##NAME##_##TYPE(volatile TYPE* var, TYPE v) \
 	inline static TYPE atomic_##NAME##_##TYPE(volatile TYPE* var, TYPE v) \
 { \
 { \
@@ -138,6 +150,7 @@
 			); \
 			); \
 	return v; \
 	return v; \
 }
 }
+#endif /* gcc & gcc version < 2.9 */
 
 
 /* returns a value, 1 param */
 /* returns a value, 1 param */
 #define ATOMIC_FUNC_TEST(NAME, OP, P_TYPE, RET_TYPE) \
 #define ATOMIC_FUNC_TEST(NAME, OP, P_TYPE, RET_TYPE) \
@@ -218,7 +231,11 @@ inline static void mb_atomic_set_int(volatile int* v, int i)
 {
 {
 	asm volatile(
 	asm volatile(
 			"xchgl %1, %0 \n\t"
 			"xchgl %1, %0 \n\t"
+#if defined __GNUC__ &&  __GNUC__ < 3 && __GNUC_MINOR__ < 9
+			: "=q"(i), "=m"(*v) : "m"(*v), "0"(i) : "memory" 
+#else
 			: "+q"(i), "=m"(*v) : "m"(*v) : "memory" 
 			: "+q"(i), "=m"(*v) : "m"(*v) : "memory" 
+#endif
 			);
 			);
 }
 }
 
 
@@ -231,7 +248,11 @@ inline static void mb_atomic_set_long(volatile long* v, long l)
 #else
 #else
 			"xchgl %1, %0 \n\t"
 			"xchgl %1, %0 \n\t"
 #endif
 #endif
+#if defined __GNUC__ &&  __GNUC__ < 3 && __GNUC_MINOR__ < 9
+			: "=q"(l), "=m"(*v) : "m"(*v), "0"(l) : "memory" 
+#else
 			: "+q"(l), "=m"(*v) : "m"(*v) : "memory" 
 			: "+q"(l), "=m"(*v) : "m"(*v) : "memory" 
+#endif
 			);
 			);
 }
 }