This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
[Bug libc/4040] New: sysdeps/i386/i486/bits/atomic.h has incorrect __asm constraints
- From: "tom at tommay dot net" <sourceware-bugzilla at sourceware dot org>
- To: glibc-bugs at sources dot redhat dot com
- Date: 14 Feb 2007 09:38:36 -0000
- Subject: [Bug libc/4040] New: sysdeps/i386/i486/bits/atomic.h has incorrect __asm constraints
- Reply-to: sourceware-bugzilla at sourceware dot org
sysdeps/i386/i486/bits/atomic.h revision 1.16 seems to have some incorrect __asm
constraints. For example, here it uses the constraint "=r" where it should use
the constraint "=q" since the operand is used as "%b0":
__asm __volatile ("xchgb %b0, %1" \
: "=r" (result), "=m" (*mem) \
: "0" (newvalue), "m" (*mem));
There are also some instances where the "b" and "w" modifiers seem to be applied
to the wrong operand, for example:
__asm __volatile (lock "orb %1, %b0" \
: "=m" (*mem) \
: "ir" (mask), "m" (*mem), \
"i" (offsetof (tcbhead_t, multiple_threads))); \
Should probably be using "orb %b1, %0".
Here's a patch. This would probably be better as an attachment, but I don't see
a way to attach it.
Index: sysdeps/i386/i486/bits/atomic.h
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/i386/i486/bits/atomic.h,v
retrieving revision 1.16
diff -u -r1.16 atomic.h
--- sysdeps/i386/i486/bits/atomic.h 13 Jan 2007 01:52:31 -0000 1.16
+++ sysdeps/i386/i486/bits/atomic.h 14 Feb 2007 08:36:51 -0000
@@ -199,7 +199,7 @@
({ __typeof (*mem) result; \
if (sizeof (*mem) == 1) \
__asm __volatile ("xchgb %b0, %1" \
- : "=r" (result), "=m" (*mem) \
+ : "=q" (result), "=m" (*mem) \
: "0" (newvalue), "m" (*mem)); \
else if (sizeof (*mem) == 2) \
__asm __volatile ("xchgw %w0, %1" \
@@ -222,7 +222,7 @@
__typeof (value) __addval = (value); \
if (sizeof (*mem) == 1) \
__asm __volatile (lock "xaddb %b0, %1" \
- : "=r" (__result), "=m" (*mem) \
+ : "=q" (__result), "=m" (*mem) \
: "0" (__addval), "m" (*mem), \
"i" (offsetof (tcbhead_t, multiple_threads))); \
else if (sizeof (*mem) == 2) \
@@ -272,7 +272,7 @@
else if (sizeof (*mem) == 1) \
__asm __volatile (lock "addb %b1, %0" \
: "=m" (*mem) \
- : "ir" (value), "m" (*mem), \
+ : "iq" (value), "m" (*mem), \
"i" (offsetof (tcbhead_t, multiple_threads))); \
else if (sizeof (*mem) == 2) \
__asm __volatile (lock "addw %w1, %0" \
@@ -464,7 +464,7 @@
if (sizeof (*mem) == 1) \
__asm __volatile (LOCK_PREFIX "orb %b2, %0" \
: "=m" (*mem) \
- : "m" (*mem), "ir" (1 << (bit))); \
+ : "m" (*mem), "iq" (1 << (bit))); \
else if (sizeof (*mem) == 2) \
__asm __volatile (LOCK_PREFIX "orw %w2, %0" \
: "=m" (*mem) \
@@ -503,11 +503,11 @@
#define atomic_and(mem, mask) \
do { \
if (sizeof (*mem) == 1) \
- __asm __volatile (LOCK_PREFIX "andb %1, %b0" \
+ __asm __volatile (LOCK_PREFIX "andb %b1, %0" \
: "=m" (*mem) \
- : "ir" (mask), "m" (*mem)); \
+ : "iq" (mask), "m" (*mem)); \
else if (sizeof (*mem) == 2) \
- __asm __volatile (LOCK_PREFIX "andw %1, %w0" \
+ __asm __volatile (LOCK_PREFIX "andw %w1, %0" \
: "=m" (*mem) \
: "ir" (mask), "m" (*mem)); \
else if (sizeof (*mem) == 4) \
@@ -522,12 +522,12 @@
#define __arch_or_body(lock, mem, mask) \
do { \
if (sizeof (*mem) == 1) \
- __asm __volatile (lock "orb %1, %b0" \
+ __asm __volatile (lock "orb %b1, %0" \
: "=m" (*mem) \
- : "ir" (mask), "m" (*mem), \
+ : "iq" (mask), "m" (*mem), \
"i" (offsetof (tcbhead_t, multiple_threads))); \
else if (sizeof (*mem) == 2) \
- __asm __volatile (lock "orw %1, %w0" \
+ __asm __volatile (lock "orw %w1, %0" \
: "=m" (*mem) \
: "ir" (mask), "m" (*mem), \
"i" (offsetof (tcbhead_t, multiple_threads))); \
--
Summary: sysdeps/i386/i486/bits/atomic.h has incorrect __asm
constraints
Product: glibc
Version: unspecified
Status: NEW
Severity: normal
Priority: P2
Component: libc
AssignedTo: drepper at redhat dot com
ReportedBy: tom at tommay dot net
CC: glibc-bugs at sources dot redhat dot com
GCC host triplet: i686-pc-linux-gnu
http://sourceware.org/bugzilla/show_bug.cgi?id=4040
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.