Fix atomic ops inline x86 inline assembly for older 32bit gccs.
authorAndres Freund <andres@anarazel.de>
Fri, 26 Sep 2014 00:44:44 +0000 (02:44 +0200)
committerAndres Freund <andres@anarazel.de>
Fri, 26 Sep 2014 00:44:44 +0000 (02:44 +0200)
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

index b2127add36cab19c52e48024815601418020bedd..11a891c865d6426d4a71a7b7113e88d5e29d848b 100644 (file)
@@ -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;