From f18cad944911f05ad2e876af67362e28584b3c61 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Fri, 26 Sep 2014 02:44:44 +0200 Subject: [PATCH] Fix atomic ops inline x86 inline assembly for older 32bit gccs. Some x86 32bit versions of gcc apparently generate references to the nonexistant %sil register when using when using the r input constraint, but not with the =q constraint. The latter restricts allocations to a/b/c/d which should all work. --- src/include/port/atomics/arch-x86.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/include/port/atomics/arch-x86.h b/src/include/port/atomics/arch-x86.h index b2127add36..11a891c865 100644 --- a/src/include/port/atomics/arch-x86.h +++ b/src/include/port/atomics/arch-x86.h @@ -175,7 +175,7 @@ pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, " lock \n" " cmpxchgl %4,%5 \n" " setz %2 \n" -: "=a" (*expected), "=m"(ptr->value), "=r" (ret) +: "=a" (*expected), "=m"(ptr->value), "=q" (ret) : "a" (*expected), "r" (newval), "m"(ptr->value) : "memory", "cc"); return (bool) ret; @@ -212,7 +212,7 @@ pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, " lock \n" " cmpxchgq %4,%5 \n" " setz %2 \n" -: "=a" (*expected), "=m"(ptr->value), "=r" (ret) +: "=a" (*expected), "=m"(ptr->value), "=q" (ret) : "a" (*expected), "r" (newval), "m"(ptr->value) : "memory", "cc"); return (bool) ret;