about summary refs log tree commit diff
path: root/nptl/sysdeps/i386
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-11-27 07:09:18 +0000
committerUlrich Drepper <drepper@redhat.com>2002-11-27 07:09:18 +0000
commit117c452c9845cc19e7d947844d09c6b45a3413b7 (patch)
tree29d99db3d8a78df1d314389f7b6d573abfff6d37 /nptl/sysdeps/i386
parent76a50749f7af5935ba3739e815aa6a16ae4440d1 (diff)
downloadglibc-117c452c9845cc19e7d947844d09c6b45a3413b7.tar.gz
glibc-117c452c9845cc19e7d947844d09c6b45a3413b7.tar.xz
glibc-117c452c9845cc19e7d947844d09c6b45a3413b7.zip
Update.
	* sysdeps/i386/tls.h (THREAD_GETMEM_NC): Change interface.  It now
	takes the array member name and the index as parameters.
	(THREAD_SETMEM_NC): Likewise.
	* pthread_getspecific.c: Use new THREAD_GETMEM_NC interface.
	* pthread_setspecific.c: Use new THREAD_GETMEM_NC and THREAD_SETMEM_NC
	interfaces.

	* sysdeps/i386/tls.h (THREAD_SETMEM): Use size of member element
	to decide which code to use.
	(THREAD_SETMEM_NC): Likewise.
Diffstat (limited to 'nptl/sysdeps/i386')
-rw-r--r--nptl/sysdeps/i386/tls.h54
1 files changed, 29 insertions, 25 deletions
diff --git a/nptl/sysdeps/i386/tls.h b/nptl/sysdeps/i386/tls.h
index 244a487bcb..4c3a73effc 100644
--- a/nptl/sysdeps/i386/tls.h
+++ b/nptl/sysdeps/i386/tls.h
@@ -1,4 +1,4 @@
-/* Definition for thread-local data handling.  linuxthreads/i386 version.
+/* Definition for thread-local data handling.  nptl/i386 version.
    Copyright (C) 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -253,16 +253,17 @@ union user_desc_init
 
 
 /* Same as THREAD_GETMEM, but the member offset can be non-constant.  */
-# define THREAD_GETMEM_NC(descr, member) \
-  ({ __typeof (descr->member) __value;					      \
+# define THREAD_GETMEM_NC(descr, member, idx) \
+  ({ __typeof (descr->member[0]) __value;				      \
      if (sizeof (__value) == 1)						      \
-       asm ("movb %%gs:(%2),%b0"					      \
+       asm ("movb %%gs:%P2(%3),%b0"					      \
 	    : "=q" (__value)						      \
-	    : "0" (0), "r" (offsetof (struct pthread, member)));	      \
+	    : "0" (0), "i" (offsetof (struct pthread, member[0])),	      \
+	      "r" (idx));						      \
      else if (sizeof (__value) == 4)					      \
-       asm ("movl %%gs:(%1),%0"						      \
+       asm ("movl %%gs:%P1(,%2,4),%0"					      \
 	    : "=r" (__value)						      \
-	    : "r" (offsetof (struct pthread, member)));			      \
+	    : "i" (offsetof (struct pthread, member[0])), "r" (idx));	      \
      else								      \
        {								      \
 	 if (sizeof (__value) != 8)					      \
@@ -270,32 +271,32 @@ union user_desc_init
 	      4 or 8.  */						      \
 	   abort ();							      \
 									      \
-	 asm ("movl %%gs:(%1),%%eax\n\t"				      \
-	      "movl %%gs:4(%1),%%edx"					      \
+	 asm ("movl %%gs:%P1(,%2,8),%%eax\n\t"				      \
+	      "movl %%gs:4+%P1(,%2,8),%%edx"				      \
 	      : "=&A" (__value)						      \
-	      : "r" (offsetof (struct pthread, member)));		      \
+	      : "i" (offsetof (struct pthread, member[0])), "r" (idx));	      \
        }								      \
      __value; })
 
 
 /* Same as THREAD_SETMEM, but the member offset can be non-constant.  */
 # define THREAD_SETMEM(descr, member, value) \
-  ({ if (sizeof (value) == 1)						      \
+  ({ if (sizeof (descr->member) == 1)					      \
        asm volatile ("movb %0,%%gs:%P1" :				      \
 		     : "iq" (value),					      \
 		       "i" (offsetof (struct pthread, member)));	      \
-     else if (sizeof (value) == 4)					      \
+     else if (sizeof (descr->member) == 4)				      \
        asm volatile ("movl %0,%%gs:%P1" :				      \
 		     : "ir" (value),					      \
 		       "i" (offsetof (struct pthread, member)));	      \
      else								      \
        {								      \
-	 if (sizeof (value) != 8)					      \
+	 if (sizeof (descr->member) != 8)				      \
 	   /* There should not be any value with a size other than 1,	      \
 	      4 or 8.  */						      \
 	   abort ();							      \
 									      \
-	 asm volatile ("movl %%eax,%%gs:%P1\n\n"			      \
+	 asm volatile ("movl %%eax,%%gs:%P1\n\t"			      \
 		       "movl %%edx,%%gs:%P2" :				      \
 		       : "A" (value),					      \
 			 "i" (offsetof (struct pthread, member)),	      \
@@ -304,26 +305,29 @@ union user_desc_init
 
 
 /* Set member of the thread descriptor directly.  */
-# define THREAD_SETMEM_NC(descr, member, value) \
-  ({ if (sizeof (value) == 1)						      \
-       asm volatile ("movb %0,%%gs:(%1)" :				      \
+# define THREAD_SETMEM_NC(descr, member, idx, value) \
+  ({ if (sizeof (descr->member[0]) == 1)				      \
+       asm volatile ("movb %0,%%gs:%P1(%2)" :				      \
 		     : "iq" (value),					      \
-		       "r" (offsetof (struct pthread, member)));	      \
-     else if (sizeof (value) == 4)					      \
-       asm volatile ("movl %0,%%gs:(%1)" :				      \
+		       "i" (offsetof (struct pthread, member)),		      \
+		       "r" (idx));					      \
+     else if (sizeof (descr->member[0]) == 4)				      \
+       asm volatile ("movl %0,%%gs:%P1(,%2,4)" :			      \
 		     : "ir" (value),					      \
-		       "r" (offsetof (struct pthread, member)));	      \
+		       "i" (offsetof (struct pthread, member)),		      \
+		       "r" (idx));					      \
      else								      \
        {								      \
-	 if (sizeof (value) != 8)					      \
+	 if (sizeof (descr->member[0]) != 8)				      \
 	   /* There should not be any value with a size other than 1,	      \
 	      4 or 8.  */						      \
 	   abort ();							      \
 									      \
-	 asm volatile ("movl %%eax,%%gs:(%1)\n\t"			      \
-		       "movl %%edx,%%gs:4(%1)" :			      \
+	 asm volatile ("movl %%eax,%%gs:%P1(,%2,8)\n\t"			      \
+		       "movl %%edx,%%gs:4+%P1(,%2,8)" :			      \
 		       : "A" (value),					      \
-			 "r" (offsetof (struct pthread, member)));	      \
+			 "i" (offsetof (struct pthread, member)),	      \
+			 "r" (idx));					      \
        }})