Use __ASSEMBLER__ test macro not ASSEMBLER.
[kopensolaris-gnu/glibc.git] / linuxthreads / sysdeps / i386 / pt-machine.h
index c2a7d08..919eda2 100644 (file)
@@ -1,6 +1,6 @@
 /* Machine-dependent pthreads configuration and inline functions.
    i386 version.
-   Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+   Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Richard Henderson <rth@tamu.edu>.
 
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#ifndef _PT_MACHINE_H
+#define _PT_MACHINE_H  1
+
+#ifndef __ASSEMBLER__
+#ifndef PT_EI
+# define PT_EI extern inline
+#endif
+
+extern long int testandset (int *spinlock);
+extern int __compare_and_swap (long int *p, long int oldval, long int newval);
+
+/* Get some notion of the current stack.  Need not be exactly the top
+   of the stack, just something somewhere in the current frame.  */
+#define CURRENT_STACK_FRAME  __builtin_frame_address (0)
+
 
 /* Spinlock implementation; required.  */
-extern inline int
+PT_EI long int
 testandset (int *spinlock)
 {
-  int ret;
+  long int ret;
 
-  __asm__ __volatile__("xchgl %0, %1"
-       : "=r"(ret), "=m"(*spinlock)
-       : "0"(1), "m"(*spinlock));
+  __asm__ __volatile__(
+       "xchgl %0, %1"
+       : "=r"(ret), "=m"(*spinlock)
+       : "0"(1), "m"(*spinlock)
+       : "memory");
 
   return ret;
 }
 
 
-/* Get some notion of the current stack.  Need not be exactly the top
-   of the stack, just something somewhere in the current frame.  */
-#define CURRENT_STACK_FRAME  stack_pointer
-register char * stack_pointer __asm__ ("%esp");
-
-
 /* Compare-and-swap for semaphores.
    Available on the 486 and above, but not on the 386.
    We test dynamically whether it's available or not. */
 
 #define HAS_COMPARE_AND_SWAP
-#ifndef __i686__
-# define TEST_FOR_COMPARE_AND_SWAP
-#endif
+#define TEST_FOR_COMPARE_AND_SWAP
 
-extern inline int
+PT_EI int
 __compare_and_swap (long int *p, long int oldval, long int newval)
 {
   char ret;
@@ -57,12 +66,13 @@ __compare_and_swap (long int *p, long int oldval, long int newval)
 
   __asm__ __volatile__ ("lock; cmpxchgl %3, %1; sete %0"
                        : "=q" (ret), "=m" (*p), "=a" (readval)
-                       : "r" (newval), "m" (*p), "a" (oldval));
+                       : "r" (newval), "m" (*p), "a" (oldval)
+                       : "memory");
   return ret;
 }
 
 
-extern inline int
+PT_EI int
 get_eflags (void)
 {
   int res;
@@ -71,14 +81,14 @@ get_eflags (void)
 }
 
 
-extern inline void
+PT_EI void
 set_eflags (int newflags)
 {
   __asm__ __volatile__ ("pushl %0; popfl" : : "r" (newflags) : "cc");
 }
 
 
-extern inline int
+PT_EI int
 compare_and_swap_is_available (void)
 {
   int oldflags = get_eflags ();
@@ -93,3 +103,6 @@ compare_and_swap_is_available (void)
      Otherwise, it's a 486 or above and it has cmpxchg.  */
   return changed != 0;
 }
+#endif /* __ASSEMBLER__ */
+
+#endif /* pt-machine.h */