This is the mail archive of the glibc-bugs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug libc/4040] New: sysdeps/i386/i486/bits/atomic.h has incorrect __asm constraints


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]