diff options
Diffstat (limited to 'libc/sysdeps/linux/sparc')
| -rw-r--r-- | libc/sysdeps/linux/sparc/bits/fcntl.h | 38 | ||||
| -rw-r--r-- | libc/sysdeps/linux/sparc/bits/mathdef.h | 14 | ||||
| -rw-r--r-- | libc/sysdeps/linux/sparc/bits/mathinline.h | 97 | ||||
| -rw-r--r-- | libc/sysdeps/linux/sparc/bits/mman.h | 2 | ||||
| -rw-r--r-- | libc/sysdeps/linux/sparc/bits/stat.h | 33 | ||||
| -rw-r--r-- | libc/sysdeps/linux/sparc/bits/wordsize.h | 34 | 
6 files changed, 165 insertions, 53 deletions
| diff --git a/libc/sysdeps/linux/sparc/bits/fcntl.h b/libc/sysdeps/linux/sparc/bits/fcntl.h index b7f46e403..5314a5240 100644 --- a/libc/sysdeps/linux/sparc/bits/fcntl.h +++ b/libc/sysdeps/linux/sparc/bits/fcntl.h @@ -24,6 +24,9 @@  #include <sys/types.h>  #include <bits/wordsize.h> +#ifdef __USE_GNU +# include <bits/uio.h> +#endif  /* open/fcntl - O_SYNC is only implemented on blocks devices and on files     located on an ext2 file system */ @@ -199,16 +202,45 @@ struct flock64  # define POSIX_FADV_NOREUSE	5 /* Data will be accessed once.  */  #endif -/* Linux-specific operations for posix_fadvise.  */ +  #ifdef __USE_GNU -# define LINUX_FADV_ASYNC_WRITE	32 /* Start writeout on range.  */ -# define LINUX_FADV_WRITE_WAIT	33 /* Wait upon writeout to range.  */ +# define SYNC_FILE_RANGE_WAIT_BEFORE	1 /* Wait upon writeout of all pages +					     in the range before performing the +					     write.  */ +# define SYNC_FILE_RANGE_WRITE		2 /* Initiate writeout of all those +					     dirty pages in the range which are +					     not presently under writeback.  */ +# define SYNC_FILE_RANGE_WAIT_AFTER	4 /* Wait upon writeout of all pages in +					     the range after performing the +					     write.  */  #endif  __BEGIN_DECLS +#if 0 /*def __USE_GNU*/ +  /* Provide kernel hint to read ahead.  */  extern ssize_t readahead (int __fd, __off64_t __offset, size_t __count)      __THROW; + +/* Selective file content synch'ing.  */ +extern int sync_file_range (int __fd, __off64_t __from, __off64_t __to, +			    unsigned int __flags); + + +/* Splice address range into a pipe.  */ +extern int vmsplice (int __fdout, const struct iovec *__iov, size_t __count, +		     unsigned int __flags); + +/* Splice two files together.  */ +extern int splice (int __fdin, int __fdout, size_t __len, unsigned int __flags) +    __THROW; + +/* In-kernel implementation of tee for pipe buffers.  */ +extern int tee (int __fdin, int __fdout, size_t __len, unsigned int __flags) +    __THROW; + +#endif +  __END_DECLS diff --git a/libc/sysdeps/linux/sparc/bits/mathdef.h b/libc/sysdeps/linux/sparc/bits/mathdef.h index c292a4189..7f9bbee81 100644 --- a/libc/sysdeps/linux/sparc/bits/mathdef.h +++ b/libc/sysdeps/linux/sparc/bits/mathdef.h @@ -1,4 +1,5 @@ -/* Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1997, 1998, 1999, 2000, 2004, 2006 +   Free Software Foundation, Inc.     This file is part of the GNU C Library.     The GNU C Library is free software; you can redistribute it and/or @@ -35,18 +36,12 @@  typedef float float_t;  typedef double double_t; -/* Define `INFINITY' as value of type `float'.  */ -#   define INFINITY	HUGE_VALF -  #  else  /* For `gcc -traditional', `float' expressions are evaluated as `double'. */  typedef double float_t;  typedef double double_t; -/* Define `INFINITY' as value of type `float'.  */ -#   define INFINITY	HUGE_VALF -  #  endif  # else @@ -54,9 +49,6 @@ typedef double double_t;  typedef double float_t;  typedef double double_t; -/* Define `INFINITY' as value of type `float'.  */ -#  define INFINITY	HUGE_VALF -  # endif  /* The values returned by `ilogb' for 0 and NaN respectively.  */ @@ -72,6 +64,8 @@ typedef double double_t;     The disables the declaration of all the `long double' function     variants.  */  #  define __NO_LONG_DOUBLE_MATH	1 +# elif !defined __UCLIBC_HAS_LONG_DOUBLE_MATH__ +#  define __NO_LONG_DOUBLE_MATH	1  # endif  #endif diff --git a/libc/sysdeps/linux/sparc/bits/mathinline.h b/libc/sysdeps/linux/sparc/bits/mathinline.h index f4bb278ed..9dd784d12 100644 --- a/libc/sysdeps/linux/sparc/bits/mathinline.h +++ b/libc/sysdeps/linux/sparc/bits/mathinline.h @@ -1,5 +1,6 @@  /* Inline math functions for SPARC. -   Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. +   Copyright (C) 1999, 2000, 2001, 2002, 2004, 2006 +   Free Software Foundation, Inc.     This file is part of the GNU C Library.     Contributed by Jakub Jelinek <jakub@redhat.com>. @@ -26,27 +27,62 @@  #ifdef __GNUC__ -#ifdef __USE_ISOC99 +#if defined __USE_ISOC99 && !__GNUC_PREREQ (3, 0) +# undef isgreater +# undef isgreaterequal +# undef isless +# undef islessequal +# undef islessgreater +# undef isunordered  # if __WORDSIZE == 32 -#  define __unordered_cmp(x, y) \ +#  ifndef __NO_LONG_DOUBLE_MATH + +#   define __unordered_cmp(x, y) \ +  (__extension__							      \ +   ({ unsigned __r;							      \ +      if (sizeof (x) == 4 && sizeof (y) == 4)				      \ +	{								      \ +	  float __x = (x); float __y = (y);				      \ +	  __asm__ ("fcmps %1,%2; st %%fsr, %0" : "=m" (__r) : "f" (__x),      \ +		   "f" (__y) : "cc");					      \ +	}								      \ +      else if (sizeof (x) <= 8 && sizeof (y) <= 8)			      \ +	{								      \ +	  double __x = (x); double __y = (y);				      \ +	  __asm__ ("fcmpd\t%1,%2\n\tst\t%%fsr,%0" : "=m" (__r) : "f" (__x),   \ +		   "f" (__y) : "cc");					      \ +	}								      \ +      else								      \ +	{								      \ +	  long double __x = (x); long double __y = (y);			      \ +	  extern int _Q_cmp (const long double a, const long double b);	      \ +	  __r = _Q_cmp (__x, __y) << 10;				      \ +	}								      \ +      __r; })) + +#  else + +#   define __unordered_cmp(x, y) \    (__extension__							      \     ({ unsigned __r;							      \ -      if (sizeof(x) == 4 && sizeof(y) == 4)				      \ +      if (sizeof (x) == 4 && sizeof (y) == 4)				      \  	{								      \  	  float __x = (x); float __y = (y);				      \ -	  __asm__("fcmps %1,%2; st %%fsr, %0" : "=m" (__r) : "f" (__x),	      \ -		  "f" (__y) : "cc");					      \ +	  __asm__ ("fcmps %1,%2; st %%fsr, %0" : "=m" (__r) : "f" (__x),      \ +		   "f" (__y) : "cc");					      \  	}								      \        else								      \  	{								      \  	  double __x = (x); double __y = (y);				      \ -	  __asm__("fcmpd\t%1,%2\n\tst\t%%fsr,%0" : "=m" (__r) : "f" (__x),    \ -		  "f" (__y) : "cc");					      \ +	  __asm__ ("fcmpd\t%1,%2\n\tst\t%%fsr,%0" : "=m" (__r) : "f" (__x),   \ +		   "f" (__y) : "cc");					      \  	}								      \        __r; })) +#  endif +  #  define isgreater(x, y) ((__unordered_cmp (x, y) & (3 << 10)) == (2 << 10))  #  define isgreaterequal(x, y) ((__unordered_cmp (x, y) & (1 << 10)) == 0)  #  define isless(x, y) ((__unordered_cmp (x, y) & (3 << 10)) == (1 << 10)) @@ -59,22 +95,22 @@  #  define __unordered_v9cmp(x, y, op, qop) \    (__extension__							      \     ({ unsigned __r;						      	      \ -      if (sizeof(x) == 4 && sizeof(y) == 4)				      \ +      if (sizeof (x) == 4 && sizeof (y) == 4)				      \  	{								      \  	  float __x = (x); float __y = (y);				      \ -	  __asm__("fcmps\t%%fcc3,%1,%2\n\tmov" op "\t%%fcc3,1,%0"	      \ -		  : "=r" (__r) : "f" (__x), "f" (__y), "0" (0) : "cc");	      \ +	  __asm__ ("fcmps\t%%fcc3,%1,%2\n\tmov" op "\t%%fcc3,1,%0"	      \ +		   : "=r" (__r) : "f" (__x), "f" (__y), "0" (0) : "cc");      \  	}								      \ -      else if (sizeof(x) <= 8 && sizeof(y) <= 8)			      \ +      else if (sizeof (x) <= 8 && sizeof (y) <= 8)			      \  	{								      \  	  double __x = (x); double __y = (y);				      \ -	  __asm__("fcmpd\t%%fcc3,%1,%2\n\tmov" op "\t%%fcc3,1,%0"	      \ -		  : "=r" (__r) : "f" (__x), "f" (__y), "0" (0) : "cc");	      \ +	  __asm__ ("fcmpd\t%%fcc3,%1,%2\n\tmov" op "\t%%fcc3,1,%0"	      \ +		   : "=r" (__r) : "f" (__x), "f" (__y), "0" (0) : "cc");      \  	}								      \        else								      \  	{								      \  	  long double __x = (x); long double __y = (y);			      \ -	  extern int _Qp_cmp(const long double *a, const long double *b);     \ +	  extern int _Qp_cmp (const long double *a, const long double *b);    \  	  __r = qop;						      	      \  	}								      \        __r; })) @@ -121,11 +157,20 @@ __NTH (__signbit (double __x))    return __u.__i[0] < 0;  } +#    ifndef __NO_LONG_DOUBLE_MATH +__MATH_INLINE int +__NTH (__signbitl (long double __x)) +{ +  __extension__ union { long double __l; int __i[4]; } __u = { __l: __x }; +  return __u.__i[0] < 0; +} +#    else  __MATH_INLINE int  __NTH (__signbitl (long double __x))  {    return __signbit ((double)__x);  } +#    endif  #   else /* sparc64 */ @@ -147,7 +192,7 @@ __NTH (__signbitl (long double __x))  #  endif /* __USE_ISOC99 */ -#  ifndef __NO_MATH_INLINES +#  if !defined __NO_MATH_INLINES && !__GNUC_PREREQ (3, 2)  __MATH_INLINE double  __NTH (sqrt (double __x)) @@ -174,9 +219,16 @@ __NTH (sqrtl (long double __x))    _Qp_sqrt (&__r, &__x);    return __r;  } +#   elif !defined __NO_LONG_DOUBLE_MATH +__MATH_INLINE long double +sqrtl (long double __x) __THROW +{ +  extern long double _Q_sqrt (__const__ long double); +  return _Q_sqrt (__x); +}  #   endif /* sparc64 */ -#  endif /* !__NO_MATH_INLINES */ +#  endif /* !__NO_MATH_INLINES && !GCC 3.2+ */  /* This code is used internally in the GNU libc.  */  #  ifdef __LIBC_INTERNAL_MATH_INLINES @@ -205,6 +257,13 @@ __ieee754_sqrtl (long double __x)    _Qp_sqrt(&__r, &__x);    return __r;  } +#   elif !defined __NO_LONG_DOUBLE_MATH +__MATH_INLINE long double +__ieee754_sqrtl (long double __x) +{ +  extern long double _Q_sqrt (__const__ long double); +  return _Q_sqrt (__x); +}  #   endif /* sparc64 */  #  endif /* __LIBC_INTERNAL_MATH_INLINES */  # endif /* gcc 2.8+ */ @@ -217,14 +276,14 @@ __MATH_INLINE double __NTH (fdim (double __x, double __y));  __MATH_INLINE double  __NTH (fdim (double __x, double __y))  { -  return __x < __y ? 0 : __x - __y; +  return __x <= __y ? 0 : __x - __y;  }  __MATH_INLINE float __NTH (fdimf (float __x, float __y));  __MATH_INLINE float  __NTH (fdimf (float __x, float __y))  { -  return __x < __y ? 0 : __x - __y; +  return __x <= __y ? 0 : __x - __y;  }  #  endif /* !__NO_MATH_INLINES */ diff --git a/libc/sysdeps/linux/sparc/bits/mman.h b/libc/sysdeps/linux/sparc/bits/mman.h index 8de270f93..be2b7eb28 100644 --- a/libc/sysdeps/linux/sparc/bits/mman.h +++ b/libc/sysdeps/linux/sparc/bits/mman.h @@ -91,7 +91,7 @@  # define MADV_WILLNEED	 3	/* Will need these pages.  */  # define MADV_DONTNEED	 4	/* Don't need these pages.  */  # define MADV_FREE	 5	/* Content can be freed (Solaris).  */ -# define MADV_REMOVE	 6	/* Remove these pages and resources.  */ +# define MADV_REMOVE	 9	/* Remove these pages and resources.  */  # define MADV_DONTFORK	 10	/* Do not inherit across fork.  */  # define MADV_DOFORK	 11	/* Do inherit across fork.  */  #endif diff --git a/libc/sysdeps/linux/sparc/bits/stat.h b/libc/sysdeps/linux/sparc/bits/stat.h index cc454117b..8dcfacd66 100644 --- a/libc/sysdeps/linux/sparc/bits/stat.h +++ b/libc/sysdeps/linux/sparc/bits/stat.h @@ -1,4 +1,5 @@ -/* Copyright (C) 1992,95,96,97,98,99,2000,2001,2002 Free Software Foundation, Inc. +/* Copyright (C) 1992, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2006 +   Free Software Foundation, Inc.     This file is part of the GNU C Library.     The GNU C Library is free software; you can redistribute it and/or @@ -60,12 +61,27 @@ struct stat  #else      __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */  #endif +#if 0 /*def __USE_MISC*/ +    /* Nanosecond resolution timestamps are stored in a format +       equivalent to 'struct timespec'.  This is the type used +       whenever possible but the Unix namespace rules do not allow the +       identifier 'timespec' to appear in the <sys/stat.h> header. +       Therefore we have to handle the use of this header in strictly +       standard-compliant sources special.  */ +    struct timespec st_atim;		/* Time of last access.  */ +    struct timespec st_mtim;		/* Time of last modification.  */ +    struct timespec st_ctim;		/* Time of last status change.  */ +# define st_atime st_atim.tv_sec	/* Backward compatibility.  */ +# define st_mtime st_mtim.tv_sec +# define st_ctime st_ctim.tv_sec +#else      __time_t st_atime;			/* Time of last access.  */      unsigned long int st_atimensec;	/* Nscecs of last access.  */      __time_t st_mtime;			/* Time of last modification.  */      unsigned long int st_mtimensec;	/* Nsecs of last modification.  */      __time_t st_ctime;			/* Time of last status change.  */      unsigned long int st_ctimensec;	/* Nsecs of last status change.  */ +#endif      unsigned long int __unused4;      unsigned long int __unused5;    }; @@ -88,12 +104,27 @@ struct stat64      __blksize_t st_blksize;		/* Optimal block size for I/O.  */      __blkcnt64_t st_blocks;		/* Number 512-byte blocks allocated. */ +#if 0 /*def __USE_MISC*/ +    /* Nanosecond resolution timestamps are stored in a format +       equivalent to 'struct timespec'.  This is the type used +       whenever possible but the Unix namespace rules do not allow the +       identifier 'timespec' to appear in the <sys/stat.h> header. +       Therefore we have to handle the use of this header in strictly +       standard-compliant sources special.  */ +    struct timespec st_atim;		/* Time of last access.  */ +    struct timespec st_mtim;		/* Time of last modification.  */ +    struct timespec st_ctim;		/* Time of last status change.  */ +# define st_atime st_atim.tv_sec	/* Backward compatibility.  */ +# define st_mtime st_mtim.tv_sec +# define st_ctime st_ctim.tv_sec +#else      __time_t st_atime;			/* Time of last access.  */      unsigned long int st_atimensec;	/* Nscecs of last access.  */      __time_t st_mtime;			/* Time of last modification.  */      unsigned long int st_mtimensec;	/* Nsecs of last modification.  */      __time_t st_ctime;			/* Time of last status change.  */      unsigned long int st_ctimensec;	/* Nsecs of last status change.  */ +#endif      unsigned long int __unused4;      unsigned long int __unused5;    }; diff --git a/libc/sysdeps/linux/sparc/bits/wordsize.h b/libc/sysdeps/linux/sparc/bits/wordsize.h index cbe862f50..c0e600ed5 100644 --- a/libc/sysdeps/linux/sparc/bits/wordsize.h +++ b/libc/sysdeps/linux/sparc/bits/wordsize.h @@ -1,24 +1,20 @@ -/* Copyright (C) 1999 Free Software Foundation, Inc. -   This file is part of the GNU C Library. - -   The GNU C Library is free software; you can redistribute it and/or -   modify it under the terms of the GNU Lesser General Public -   License as published by the Free Software Foundation; either -   version 2.1 of the License, or (at your option) any later version. - -   The GNU C Library is distributed in the hope that it will be useful, -   but WITHOUT ANY WARRANTY; without even the implied warranty of -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU -   Lesser General Public License for more details. - -   You should have received a copy of the GNU Lesser General Public -   License along with the GNU C Library; if not, write to the Free -   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA -   02111-1307 USA.  */ +/* Determine the wordsize from the preprocessor defines.  */  #if defined __arch64__ || defined __sparcv9 -# define __WORDSIZE    64 +# define __WORDSIZE	64  #else -# define __WORDSIZE    32 +# define __WORDSIZE	32  #endif +#if 0 /* uClibc: done in mathdefs.h: !defined __NO_LONG_DOUBLE_MATH && !defined __LONG_DOUBLE_MATH_OPTIONAL*/ + +# if __WORDSIZE == 32 +/* Signal that in 32bit ABI we didn't used to have a `long double'. +   The changes all the `long double' function variants to be redirects +   to the double functions.  */ +#  define __LONG_DOUBLE_MATH_OPTIONAL   1 +#  ifndef __LONG_DOUBLE_128__ +#   define __NO_LONG_DOUBLE_MATH        1 +#  endif +# endif +#endif | 
