about summary refs log tree commit diff
path: root/sysdeps/x86_64/nptl
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2021-03-16 07:41:46 -0700
committerH.J. Lu <hjl.tools@gmail.com>2021-04-01 07:00:22 -0700
commitb1ec623ed50bb8c7b9b6333fa350c3866dbde87f (patch)
treecc3823d84b34ab9b997c3feac0a906b598cae115 /sysdeps/x86_64/nptl
parent5ccea9a011c010448999a71d2be1cd1906d7c9f5 (diff)
downloadglibc-b1ec623ed50bb8c7b9b6333fa350c3866dbde87f.tar.gz
glibc-b1ec623ed50bb8c7b9b6333fa350c3866dbde87f.tar.xz
glibc-b1ec623ed50bb8c7b9b6333fa350c3866dbde87f.zip
x86_64: Correct THREAD_SETMEM/THREAD_SETMEM_NC for movq [BZ #27591]
config/i386/constraints.md in GCC has

(define_constraint "e"
  "32-bit signed integer constant, or a symbolic reference known
   to fit that range (for immediate operands in sign-extending x86-64
   instructions)."
  (match_operand 0 "x86_64_immediate_operand"))

Since movq takes a signed 32-bit immediate or a register source operand,
use "er", instead of "nr"/"ir", constraint for 32-bit signed integer
constant or register on movq.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'sysdeps/x86_64/nptl')
-rw-r--r--sysdeps/x86_64/nptl/tls.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/sysdeps/x86_64/nptl/tls.h b/sysdeps/x86_64/nptl/tls.h
index 20f0958780..a78c4f4d01 100644
--- a/sysdeps/x86_64/nptl/tls.h
+++ b/sysdeps/x86_64/nptl/tls.h
@@ -271,8 +271,11 @@ _Static_assert (offsetof (tcbhead_t, __glibc_unused2) == 0x80,
 		       "i" (offsetof (struct pthread, member)));	      \
      else /* 8 */							      \
        {								      \
+	 /* Since movq takes a signed 32-bit immediate or a register source   \
+	    operand, use "er" constraint for 32-bit signed integer constant   \
+	    or register.  */						      \
 	 asm volatile ("movq %q0,%%fs:%P1" :				      \
-		       : IMM_MODE ((uint64_t) cast_to_integer (value)),	      \
+		       : "er" ((uint64_t) cast_to_integer (value)),	      \
 			 "i" (offsetof (struct pthread, member)));	      \
        }})
 
@@ -296,8 +299,11 @@ _Static_assert (offsetof (tcbhead_t, __glibc_unused2) == 0x80,
 		       "r" (idx));					      \
      else /* 8 */							      \
        {								      \
+	 /* Since movq takes a signed 32-bit immediate or a register source   \
+	    operand, use "er" constraint for 32-bit signed integer constant   \
+	    or register.  */						      \
 	 asm volatile ("movq %q0,%%fs:%P1(,%q2,8)" :			      \
-		       : IMM_MODE ((uint64_t) cast_to_integer (value)),	      \
+		       : "er" ((uint64_t) cast_to_integer (value)),	      \
 			 "i" (offsetof (struct pthread, member[0])),	      \
 			 "r" (idx));					      \
        }})