From a334319f6530564d22e775935d9c91663623a1b4 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Wed, 22 Dec 2004 20:10:10 +0000 Subject: (CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4. --- sysdeps/s390/Dist | 3 + sysdeps/s390/Implies | 1 - sysdeps/s390/bits/link.h | 120 +-------- sysdeps/s390/bits/linkmap.h | 13 - sysdeps/s390/bits/mathdef.h | 38 --- sysdeps/s390/bits/setjmp.h | 45 ++-- sysdeps/s390/bits/string.h | 14 +- sysdeps/s390/fpu/bits/mathinline.h | 26 -- sysdeps/s390/fpu/e_sqrtl.c | 30 --- sysdeps/s390/fpu/feholdexcpt.c | 3 +- sysdeps/s390/fpu/fesetround.c | 3 +- sysdeps/s390/fpu/libm-test-ulps | 474 +++-------------------------------- sysdeps/s390/jmpbuf-offsets.h | 29 --- sysdeps/s390/jmpbuf-unwind.h | 55 ---- sysdeps/s390/ldbl2mpn.c | 101 ++++++++ sysdeps/s390/libc-tls.c | 4 +- sysdeps/s390/s390-32/Dist | 1 + sysdeps/s390/s390-32/__longjmp.c | 36 +-- sysdeps/s390/s390-32/backtrace.c | 5 +- sysdeps/s390/s390-32/bits/wordsize.h | 11 - sysdeps/s390/s390-32/dl-machine.h | 151 +++++++++-- sysdeps/s390/s390-32/dl-trampoline.S | 134 ---------- sysdeps/s390/s390-32/elf/setjmp.S | 17 +- sysdeps/s390/s390-32/elf/start.S | 9 +- sysdeps/s390/s390-32/s390-mcount.S | 2 +- sysdeps/s390/s390-32/setjmp.S | 17 +- sysdeps/s390/s390-64/Dist | 1 + sysdeps/s390/s390-64/__longjmp.c | 41 +-- sysdeps/s390/s390-64/backtrace.c | 5 +- sysdeps/s390/s390-64/bcopy.S | 14 +- sysdeps/s390/s390-64/bits/wordsize.h | 11 - sysdeps/s390/s390-64/dl-machine.h | 137 ++++++++-- sysdeps/s390/s390-64/dl-trampoline.S | 128 ---------- sysdeps/s390/s390-64/elf/setjmp.S | 17 +- sysdeps/s390/s390-64/elf/start.S | 6 +- sysdeps/s390/s390-64/s390x-mcount.S | 2 +- sysdeps/s390/s390-64/setjmp.S | 19 +- 37 files changed, 494 insertions(+), 1229 deletions(-) create mode 100644 sysdeps/s390/Dist delete mode 100644 sysdeps/s390/bits/linkmap.h delete mode 100644 sysdeps/s390/bits/mathdef.h delete mode 100644 sysdeps/s390/fpu/e_sqrtl.c delete mode 100644 sysdeps/s390/jmpbuf-offsets.h delete mode 100644 sysdeps/s390/jmpbuf-unwind.h create mode 100644 sysdeps/s390/ldbl2mpn.c create mode 100644 sysdeps/s390/s390-32/Dist delete mode 100644 sysdeps/s390/s390-32/dl-trampoline.S create mode 100644 sysdeps/s390/s390-64/Dist delete mode 100644 sysdeps/s390/s390-64/dl-trampoline.S (limited to 'sysdeps/s390') diff --git a/sysdeps/s390/Dist b/sysdeps/s390/Dist new file mode 100644 index 0000000000..10a95f596b --- /dev/null +++ b/sysdeps/s390/Dist @@ -0,0 +1,3 @@ +machine-gmon.h +bits/link.h +fpu/fenv_libc.h diff --git a/sysdeps/s390/Implies b/sysdeps/s390/Implies index 1945b1f4bb..5b29b26128 100644 --- a/sysdeps/s390/Implies +++ b/sysdeps/s390/Implies @@ -1,3 +1,2 @@ -ieee754/ldbl-128 ieee754/dbl-64 ieee754/flt-32 diff --git a/sysdeps/s390/bits/link.h b/sysdeps/s390/bits/link.h index 70f0043820..fc1fba363a 100644 --- a/sysdeps/s390/bits/link.h +++ b/sysdeps/s390/bits/link.h @@ -1,111 +1,13 @@ -/* Copyright (C) 2005 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. */ - -#ifndef _LINK_H -# error "Never include directly; use instead." -#endif - - -#if __ELF_NATIVE_CLASS == 32 - -/* Registers for entry into PLT on s390-32. */ -typedef struct La_s390_32_regs -{ - uint32_t lr_r2; - uint32_t lr_r3; - uint32_t lr_r4; - uint32_t lr_r5; - uint32_t lr_r6; - double lr_fp0; - double lr_fp2; -} La_s390_32_regs; - -/* Return values for calls from PLT on s390-32. */ -typedef struct La_s390_32_retval -{ - uint32_t lrv_r2; - uint32_t lrv_r3; - double lrv_fp0; -} La_s390_32_retval; - - -__BEGIN_DECLS - -extern Elf32_Addr la_s390_32_gnu_pltenter (Elf32_Sym *__sym, - unsigned int __ndx, - uintptr_t *__refcook, - uintptr_t *__defcook, - La_s390_32_regs *__regs, - unsigned int *__flags, - const char *__symname, - long int *__framesizep); -extern unsigned int la_s390_32_gnu_pltexit (Elf32_Sym *__sym, - unsigned int __ndx, - uintptr_t *__refcook, - uintptr_t *__defcook, - const La_s390_32_regs *__inregs, - La_s390_32_retval *__outregs, - const char *symname); - -__END_DECLS - +#if __WORDSIZE == 64 +struct link_map_machine + { + Elf64_Addr plt; /* Address of .plt + 0x2e */ + Elf64_Addr gotplt; /* Address of .got + 0x18 */ + }; #else - -/* Registers for entry into PLT on s390-64. */ -typedef struct La_s390_64_regs -{ - uint64_t lr_r2; - uint64_t lr_r3; - uint64_t lr_r4; - uint64_t lr_r5; - uint64_t lr_r6; - double lr_fp0; - double lr_fp2; - double lr_fp4; - double lr_fp6; -} La_s390_64_regs; - -/* Return values for calls from PLT on s390-64. */ -typedef struct La_s390_64_retval -{ - uint64_t lrv_r2; - double lrv_fp0; -} La_s390_64_retval; - - -__BEGIN_DECLS - -extern Elf64_Addr la_s390_64_gnu_pltenter (Elf64_Sym *__sym, - unsigned int __ndx, - uintptr_t *__refcook, - uintptr_t *__defcook, - La_s390_64_regs *__regs, - unsigned int *__flags, - const char *__symname, - long int *__framesizep); -extern unsigned int la_s390_64_gnu_pltexit (Elf64_Sym *__sym, - unsigned int __ndx, - uintptr_t *__refcook, - uintptr_t *__defcook, - const La_s390_64_regs *__inregs, - La_s390_64_retval *__outregs, - const char *symname); - -__END_DECLS - +struct link_map_machine + { + Elf32_Addr plt; /* Address of .plt + 0x2c */ + Elf32_Addr gotplt; /* Address of .got + 0x0c */ + }; #endif diff --git a/sysdeps/s390/bits/linkmap.h b/sysdeps/s390/bits/linkmap.h deleted file mode 100644 index fc1fba363a..0000000000 --- a/sysdeps/s390/bits/linkmap.h +++ /dev/null @@ -1,13 +0,0 @@ -#if __WORDSIZE == 64 -struct link_map_machine - { - Elf64_Addr plt; /* Address of .plt + 0x2e */ - Elf64_Addr gotplt; /* Address of .got + 0x18 */ - }; -#else -struct link_map_machine - { - Elf32_Addr plt; /* Address of .plt + 0x2c */ - Elf32_Addr gotplt; /* Address of .got + 0x0c */ - }; -#endif diff --git a/sysdeps/s390/bits/mathdef.h b/sysdeps/s390/bits/mathdef.h deleted file mode 100644 index 4dcb612c33..0000000000 --- a/sysdeps/s390/bits/mathdef.h +++ /dev/null @@ -1,38 +0,0 @@ -/* 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 - 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. */ - -#if !defined _MATH_H && !defined _COMPLEX_H -# error "Never use directly; include instead" -#endif - -#if defined __USE_ISOC99 && defined _MATH_H && !defined _MATH_H_MATHDEF -# define _MATH_H_MATHDEF 1 - -/* Normally, there is no long double type and the `float' and `double' - expressions are evaluated as `double'. */ -typedef double float_t; /* `float' expressions are evaluated as - `double'. */ -typedef double double_t; /* `double' expressions are evaluated as - `double'. */ - -/* The values returned by `ilogb' for 0 and NaN respectively. */ -# define FP_ILOGB0 (-2147483647) -# define FP_ILOGBNAN 2147483647 - -#endif /* ISO C99 */ diff --git a/sysdeps/s390/bits/setjmp.h b/sysdeps/s390/bits/setjmp.h index 5588c03301..35bc9a53f3 100644 --- a/sysdeps/s390/bits/setjmp.h +++ b/sysdeps/s390/bits/setjmp.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000,2001,2002,2005,2006 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2002 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 @@ -21,28 +21,39 @@ #ifndef __S390_SETJMP_H__ #define __S390_SETJMP_H__ -#if !defined _SETJMP_H && !defined _PTHREAD_H -# error "Never include directly; use instead." -#endif - #include +#define __JB_GPR6 0 +#define __JB_GPR7 1 +#define __JB_GPR8 2 +#define __JB_GPR9 3 +#define __JB_GPR10 4 +#define __JB_GPR11 5 +#define __JB_GPR12 6 +#define __JB_GPR13 7 +#define __JB_GPR14 8 +#define __JB_GPR15 9 + #ifndef _ASM -typedef struct __s390_jmp_buf -{ - /* We save registers 6-15. */ - long int __gregs[10]; - -# if __WORDSIZE == 64 - /* We save fpu registers 1, 3, 5 and 7. */ - long __fpregs[8]; -# else - /* We save fpu registers 4 and 6. */ - long __fpregs[4]; -# endif +typedef struct { + /* We save registers 6-15. */ + long int __gregs[10]; + +#if __WORDSIZE == 64 + /* We save fpu registers 1, 3, 5 and 7. */ + long __fpregs[8]; +#else + /* We save fpu registers 4 and 6. */ + long __fpregs[4]; +#endif } __jmp_buf[1]; #endif +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#define _JMPBUF_UNWINDS(jmpbuf, address) \ + ((void *) (address) < (void *) (jmpbuf)->__gregs[__JB_GPR15]) + #endif /* __S390_SETJMP_H__ */ diff --git a/sysdeps/s390/bits/string.h b/sysdeps/s390/bits/string.h index d83df39bb2..7134827eb0 100644 --- a/sysdeps/s390/bits/string.h +++ b/sysdeps/s390/bits/string.h @@ -51,7 +51,7 @@ strlen (__const char *__str) "0: srst %0,%1\n" " jo 0b\n" : "+&a" (__ptr), "+&a" (__tmp) : - : "cc", "memory", "0" ); + : "cc", "0" ); return (size_t) (__ptr - __str); } #endif @@ -105,7 +105,7 @@ strncpy (char *__dest, __const char *__src, size_t __n) #endif "4:" : "+&a" (__ptr), "+&a" (__n) : "a" (__diff) - : "cc", "memory", "0" ); + : "cc", "0" ); } return __ret; } @@ -134,7 +134,7 @@ strcat(char *__dest, const char *__src) "0: mvst %0,%1\n" " jo 0b" : "+&a" (__ptr), "+&a" (__src) : - : "cc", "memory", "0" ); + : "cc", "0" ); return __ret; } #endif @@ -157,7 +157,7 @@ strncat (char *__dest, __const char *__src, size_t __n) "0: srst %0,%1\n" " jo 0b\n" : "+&a" (__ptr), "+&a" (__tmp) : - : "cc", "memory", "0" ); + : "cc", "0" ); __diff = (size_t) (__ptr - __src); __tmp = (char *) __src; @@ -175,7 +175,7 @@ strncat (char *__dest, __const char *__src, size_t __n) " stc 0,1(%2,%0)\n" "2:" : "+&a" (__tmp), "+&a" (__n) : "a" (__diff) - : "cc", "memory", "0" ); + : "cc", "0" ); } return __ret; @@ -200,7 +200,7 @@ memchr (__const void *__str, int __c, size_t __n) " la %0,0\n" "1:" : "+&a" (__ptr), "+&a" (__tmp) : "d" (__c) - : "cc", "memory", "0" ); + : "cc", "0" ); return __ptr; } #endif @@ -222,7 +222,7 @@ strcmp (__const char *__s1, __const char *__s2) " ipm %0\n" " srl %0,28" : "=d" (__ret), "+&a" (__p1), "+&a" (__p2) : - : "cc", "memory", "0" ); + : "cc", "0" ); __ret = (__ret == 0) ? 0 : (__ret == 1) ? -1 : 1; return __ret; } diff --git a/sysdeps/s390/fpu/bits/mathinline.h b/sysdeps/s390/fpu/bits/mathinline.h index 5c6b83ad06..381f2e0bcb 100644 --- a/sysdeps/s390/fpu/bits/mathinline.h +++ b/sysdeps/s390/fpu/bits/mathinline.h @@ -47,21 +47,6 @@ __NTH (__signbit (double __x)) return __u.__i < 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 - #endif /* C99 */ /* This code is used internally in the GNU libc. */ @@ -85,17 +70,6 @@ __NTH (__ieee754_sqrtf (float x)) return res; } -# if !defined __NO_LONG_DOUBLE_MATH -__MATH_INLINE long double -__NTH (sqrtl (long double __x)) -{ - long double res; - - asm ( "sqxbr %0,%1" : "=f" (res) : "f" (__x) ); - return res; -} -# endif /* !__NO_LONG_DOUBLE_MATH */ - #endif /* __LIBC_INTERNAL_MATH_INLINES */ #endif /* __NO_MATH_INLINES */ diff --git a/sysdeps/s390/fpu/e_sqrtl.c b/sysdeps/s390/fpu/e_sqrtl.c deleted file mode 100644 index e1daac1974..0000000000 --- a/sysdeps/s390/fpu/e_sqrtl.c +++ /dev/null @@ -1,30 +0,0 @@ -/* Square root. S/390 FPU version. - Copyright (C) 2004, 2006 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). - 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. */ - -#include - -long double -__ieee754_sqrtl (long double x) -{ - long double res; - - asm ( "sqxbr %0,%1" : "=f" (res) : "f" (x) ); - return res; -} diff --git a/sysdeps/s390/fpu/feholdexcpt.c b/sysdeps/s390/fpu/feholdexcpt.c index dee44dcee3..7fd7ea53ca 100644 --- a/sysdeps/s390/fpu/feholdexcpt.c +++ b/sysdeps/s390/fpu/feholdexcpt.c @@ -1,5 +1,5 @@ /* Store current floating-point environment and clear exceptions. - Copyright (C) 2000, 2005 Free Software Foundation, Inc. + Copyright (C) 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com). @@ -32,4 +32,3 @@ int feholdexcept (fenv_t *envp) _FPU_SETCW ((envp->fpc & ~(FE_ALL_EXCEPT << FPC_EXCEPTION_MASK_SHIFT))); return 0; } -libm_hidden_def (feholdexcept) diff --git a/sysdeps/s390/fpu/fesetround.c b/sysdeps/s390/fpu/fesetround.c index d99f1db181..5f510fe0ad 100644 --- a/sysdeps/s390/fpu/fesetround.c +++ b/sysdeps/s390/fpu/fesetround.c @@ -1,5 +1,5 @@ /* Set current rounding direction. - Copyright (C) 2000, 2005 Free Software Foundation, Inc. + Copyright (C) 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Denis Joseph Barrow (djbarrow@de.ibm.com). @@ -35,4 +35,3 @@ fesetround (int round) return 0; } -libm_hidden_def (fesetround) diff --git a/sysdeps/s390/fpu/libm-test-ulps b/sysdeps/s390/fpu/libm-test-ulps index 989722e651..cfade822a3 100644 --- a/sysdeps/s390/fpu/libm-test-ulps +++ b/sysdeps/s390/fpu/libm-test-ulps @@ -1,48 +1,35 @@ # Begin of automatic generation # atan2 -Test "atan2 (-0.00756827042671106339, -.001792735857538728036) == -1.80338464113663849327153994379639112": -ildouble: 1 -ldouble: 1 Test "atan2 (-0.75, -1.0) == -2.49809154479650885165983415456218025": -float: 1 -ifloat: 1 -ildouble: 1 -ldouble: 1 +float: 3 +ifloat: 3 Test "atan2 (0.75, -1.0) == 2.49809154479650885165983415456218025": -float: 1 -ifloat: 1 -ildouble: 1 -ldouble: 1 +float: 3 +ifloat: 3 Test "atan2 (1.390625, 0.9296875) == 0.981498387184244311516296577615519772": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 +Test "atan2 (-0.00756827042671106339, -.001792735857538728036) == -1.80338464113663849327153994379639112": +float: 6 +ifloat: 6 # atanh Test "atanh (0.75) == 0.972955074527656652552676371721589865": float: 1 ifloat: 1 -# cacos -Test "Imaginary part of: cacos (0.75 + 1.25 i) == 1.11752014915610270578240049553777969 - 1.13239363160530819522266333696834467 i": -ildouble: 1 -ldouble: 1 - # cacosh -Test "Real part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i": +Test "Real part of: cacosh (-2 - 3 i) == -1.9833870299165354323470769028940395 + 2.1414491111159960199416055713254211 i": double: 1 float: 7 idouble: 1 ifloat: 7 -Test "Imaginary part of: cacosh (-2 - 3 i) == 1.9833870299165354323470769028940395 - 2.1414491111159960199416055713254211 i": +Test "Imaginary part of: cacosh (-2 - 3 i) == -1.9833870299165354323470769028940395 + 2.1414491111159960199416055713254211 i": double: 1 float: 3 idouble: 1 ifloat: 3 -ildouble: 1 -ldouble: 1 # casin Test "Real part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i": @@ -50,9 +37,6 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -Test "Imaginary part of: casin (0.75 + 1.25 i) == 0.453276177638793913448921196101971749 + 1.13239363160530819522266333696834467 i": -ildouble: 1 -ldouble: 1 # casinh Test "Real part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i": @@ -60,27 +44,19 @@ double: 5 float: 1 idouble: 5 ifloat: 1 -ildouble: 4 -ldouble: 4 Test "Imaginary part of: casinh (-2 - 3 i) == -1.9686379257930962917886650952454982 - 0.96465850440760279204541105949953237 i": double: 3 float: 6 idouble: 3 ifloat: 6 -ildouble: 2 -ldouble: 2 Test "Real part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "Imaginary part of: casinh (0.75 + 1.25 i) == 1.03171853444778027336364058631006594 + 0.911738290968487636358489564316731207 i": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 # catan Test "Real part of: catan (-2 - 3 i) == -1.4099210495965755225306193844604208 - 0.22907268296853876629588180294200276 i": @@ -94,9 +70,6 @@ ifloat: 1 Test "Real part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i": float: 4 ifloat: 4 -Test "Imaginary part of: catan (0.75 + 1.25 i) == 1.10714871779409050301706546017853704 + 0.549306144334054845697622618461262852 i": -ildouble: 1 -ldouble: 1 # catanh Test "Real part of: catanh (-2 - 3 i) == -0.14694666622552975204743278515471595 - 1.3389725222944935611241935759091443 i": @@ -108,18 +81,11 @@ ifloat: 4 Test "Real part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i": double: 1 idouble: 1 -ildouble: 1 -ldouble: 1 Test "Imaginary part of: catanh (0.75 + 1.25 i) == 0.261492138795671927078652057366532140 + 0.996825126463918666098902241310446708 i": float: 6 ifloat: 6 -ildouble: 1 -ldouble: 1 # cbrt -Test "cbrt (-0.001) == -0.1": -ildouble: 1 -ldouble: 1 Test "cbrt (-27.0) == -3.0": double: 1 idouble: 1 @@ -131,14 +97,9 @@ double: 1 idouble: 1 # ccos -Test "Real part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": -ildouble: 1 -ldouble: 1 Test "Imaginary part of: ccos (-2 - 3 i) == -4.18962569096880723013255501961597373 - 9.10922789375533659797919726277886212 i": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "Real part of: ccos (0.75 + 1.25 i) == 1.38173873063425888530729933139078645 - 1.09193013555397466170919531722024128 i": double: 1 float: 1 @@ -152,13 +113,9 @@ ifloat: 1 Test "Real part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "Imaginary part of: ccosh (-2 - 3 i) == -3.72454550491532256547397070325597253 + 0.511822569987384608834463849801875634 i": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "Real part of: ccosh (0.75 + 1.25 i) == 0.408242591877968807788852146397499084 + 0.780365930845853240391326216300863152 i": double: 1 float: 1 @@ -169,20 +126,12 @@ float: 1 ifloat: 1 # cexp -Test "Real part of: cexp (-2.0 - 3.0 i) == -0.13398091492954261346140525546115575 - 0.019098516261135196432576240858800925 i": -ildouble: 1 -ldouble: 1 Test "Imaginary part of: cexp (-2.0 - 3.0 i) == -0.13398091492954261346140525546115575 - 0.019098516261135196432576240858800925 i": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "Real part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": float: 1 ifloat: 1 -Test "Imaginary part of: cexp (0.75 + 1.25 i) == 0.667537446429131586942201977015932112 + 2.00900045494094876258347228145863909 i": -ildouble: 1 -ldouble: 1 # clog Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680267437207826593 - 2.1587989303424641704769327722648368 i": @@ -191,98 +140,57 @@ ifloat: 3 Test "Real part of: clog (0.75 + 1.25 i) == 0.376885901188190075998919126749298416 + 1.03037682652431246378774332703115153 i": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 # clog10 Test "Imaginary part of: clog10 (-0 + inf i) == inf + pi/2*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 -Test "Real part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": -ildouble: 1 -ldouble: 1 Test "Imaginary part of: clog10 (-2 - 3 i) == 0.556971676153418384603252578971164214 - 0.937554462986374708541507952140189646 i": double: 1 float: 5 idouble: 1 ifloat: 5 -ildouble: 1 -ldouble: 1 Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (-3 - inf i) == inf - pi/2*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (-inf + 0 i) == inf + pi*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (-inf + 1 i) == inf + pi*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 -Test "Imaginary part of: clog10 (-inf + inf i) == inf + 3/4 pi*log10(e) i": -double: 1 -idouble: 1 Test "Imaginary part of: clog10 (-inf - 0 i) == inf - pi*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (-inf - 1 i) == inf - pi*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (0 + inf i) == inf + pi/2*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (0 - inf i) == inf - pi/2*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Real part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i": float: 1 ifloat: 1 -Test "Imaginary part of: clog10 (0.75 + 1.25 i) == 0.163679467193165171449476605077428975 + 0.447486970040493067069984724340855636 i": -ildouble: 1 -ldouble: 1 Test "Imaginary part of: clog10 (3 + inf i) == inf + pi/2*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (3 - inf i) == inf - pi/2*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (inf + inf i) == inf + pi/4*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 Test "Imaginary part of: clog10 (inf - inf i) == inf - pi/4*log10(e) i": -double: 1 float: 1 -idouble: 1 ifloat: 1 # cos @@ -291,15 +199,11 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "cos (M_PI_6l * 4.0) == -0.5": double: 2 float: 1 idouble: 2 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "cos (pi/2) == 0": double: 1 float: 1 @@ -318,31 +222,16 @@ double: 1 float: 4 idouble: 1 ifloat: 4 -ildouble: 4 -ldouble: 4 -Test "Real part of: cpow (0.75 + 1.25 i, 1.0 + 0.0 i) == 0.75 + 1.25 i": -ildouble: 2 -ldouble: 2 -Test "Imaginary part of: cpow (0.75 + 1.25 i, 1.0 + 0.0 i) == 0.75 + 1.25 i": -ildouble: 1 -ldouble: 1 Test "Real part of: cpow (0.75 + 1.25 i, 1.0 + 1.0 i) == 0.0846958290317209430433805274189191353 + 0.513285749182902449043287190519090481 i": double: 2 float: 3 idouble: 2 ifloat: 3 -ildouble: 10 -ldouble: 10 -Test "Real part of: cpow (2 + 0 i, 10 + 0 i) == 1024.0 + 0.0 i": -ildouble: 2 -ldouble: 2 Test "Real part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i": double: 1 float: 4 idouble: 1 ifloat: 4 -ildouble: 3 -ldouble: 3 Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i": float: 2 ifloat: 2 @@ -351,21 +240,8 @@ double: 2 float: 2 idouble: 2 ifloat: 2 -ildouble: 1 -ldouble: 1 - -# csin -Test "Imaginary part of: csin (-2 - 3 i) == -9.15449914691142957346729954460983256 + 4.16890695996656435075481305885375484 i": -ildouble: 1 -ldouble: 1 -Test "Real part of: csin (0.75 + 1.25 i) == 1.28722291002649188575873510790565441 + 1.17210635989270256101081285116138863 i": -ildouble: 1 -ldouble: 1 # csinh -Test "Real part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": -ildouble: 1 -ldouble: 1 Test "Imaginary part of: csinh (-2 - 3 i) == 3.59056458998577995201256544779481679 - 0.530921086248519805267040090660676560 i": double: 1 idouble: 1 @@ -380,31 +256,17 @@ ifloat: 1 Test "Real part of: csqrt (-2 + 3 i) == 0.89597747612983812471573375529004348 + 1.6741492280355400404480393008490519 i": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "Real part of: csqrt (-2 - 3 i) == 0.89597747612983812471573375529004348 - 1.6741492280355400404480393008490519 i": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 -Test "Imaginary part of: csqrt (0.75 + 1.25 i) == 1.05065169626078392338656675760808326 + 0.594868882070379067881984030639932657 i": -ildouble: 1 -ldouble: 1 # ctan Test "Real part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": double: 1 idouble: 1 -ildouble: 1 -ldouble: 1 -Test "Imaginary part of: ctan (-2 - 3 i) == 0.376402564150424829275122113032269084e-2 - 1.00323862735360980144635859782192726 i": -ildouble: 1 -ldouble: 1 Test "Imaginary part of: ctan (0.75 + 1.25 i) == 0.160807785916206426725166058173438663 + 0.975363285031235646193581759755216379 i": double: 1 idouble: 1 -ildouble: 2 -ldouble: 2 # ctanh Test "Real part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": @@ -412,11 +274,6 @@ double: 1 float: 2 idouble: 1 ifloat: 2 -ildouble: 1 -ldouble: 1 -Test "Imaginary part of: ctanh (-2 - 3 i) == -0.965385879022133124278480269394560686 + 0.988437503832249372031403430350121098e-2 i": -ildouble: 1 -ldouble: 1 Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i": float: 1 ifloat: 1 @@ -436,9 +293,6 @@ ifloat: 1 Test "erfc (2.0) == 0.00467773498104726583793074363274707139": double: 1 idouble: 1 -Test "erfc (27.0) == 0.523704892378925568501606768284954709e-318": -ildouble: 1 -ldouble: 1 Test "erfc (4.125) == 0.542340079956506600531223408575531062e-8": double: 1 idouble: 1 @@ -459,30 +313,14 @@ double: 6 float: 2 idouble: 6 ifloat: 2 -ildouble: 1 -ldouble: 1 - -# exp2 -Test "exp2 (10) == 1024": -ildouble: 2 -ldouble: 2 # expm1 Test "expm1 (0.75) == 1.11700001661267466854536981983709561": double: 1 idouble: 1 Test "expm1 (1) == M_El - 1.0": -double: 1 float: 1 -idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 - -# gamma -Test "gamma (-0.5) == log(2*sqrt(pi))": -ildouble: 1 -ldouble: 1 # hypot Test "hypot (-0.7, -12.4) == 12.419742348374220601176836866763271": @@ -513,139 +351,89 @@ ifloat: 1 # j0 Test "j0 (-4.0) == -3.9714980986384737228659076845169804197562E-1": double: 1 -float: 2 +float: 1 idouble: 1 -ifloat: 2 +ifloat: 1 Test "j0 (0.75) == 0.864242275166648623555731103820923211": float: 1 ifloat: 1 Test "j0 (10.0) == -0.245935764451348335197760862485328754": -double: 3 +double: 2 float: 1 -idouble: 3 +idouble: 2 ifloat: 1 -ildouble: 2 -ldouble: 2 Test "j0 (2.0) == 0.223890779141235668051827454649948626": float: 2 ifloat: 2 -ildouble: 2 -ldouble: 2 Test "j0 (4.0) == -3.9714980986384737228659076845169804197562E-1": double: 1 -float: 2 +float: 1 idouble: 1 -ifloat: 2 +ifloat: 1 Test "j0 (8.0) == 0.171650807137553906090869407851972001": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 # j1 -Test "j1 (-1.0) == -0.440050585744933515959682203718914913": -ildouble: 1 -ldouble: 1 -Test "j1 (0.75) == 0.349243602174862192523281016426251335": -ildouble: 1 -ldouble: 1 -Test "j1 (1.0) == 0.440050585744933515959682203718914913": -ildouble: 1 -ldouble: 1 Test "j1 (10.0) == 0.0434727461688614366697487680258592883": float: 2 ifloat: 2 -ildouble: 2 -ldouble: 2 Test "j1 (2.0) == 0.576724807756873387202448242269137087": double: 1 idouble: 1 Test "j1 (8.0) == 0.234636346853914624381276651590454612": double: 1 idouble: 1 -ildouble: 4 -ldouble: 4 # jn Test "jn (0, -4.0) == -3.9714980986384737228659076845169804197562E-1": double: 1 -float: 2 +float: 1 idouble: 1 -ifloat: 2 +ifloat: 1 Test "jn (0, 0.75) == 0.864242275166648623555731103820923211": float: 1 ifloat: 1 Test "jn (0, 10.0) == -0.245935764451348335197760862485328754": -double: 3 +double: 2 float: 1 -idouble: 3 +idouble: 2 ifloat: 1 -ildouble: 2 -ldouble: 2 Test "jn (0, 2.0) == 0.223890779141235668051827454649948626": float: 2 ifloat: 2 -ildouble: 2 -ldouble: 2 Test "jn (0, 4.0) == -3.9714980986384737228659076845169804197562E-1": double: 1 -float: 2 +float: 1 idouble: 1 -ifloat: 2 +ifloat: 1 Test "jn (0, 8.0) == 0.171650807137553906090869407851972001": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 -Test "jn (1, -1.0) == -0.440050585744933515959682203718914913": -ildouble: 1 -ldouble: 1 -Test "jn (1, 0.75) == 0.349243602174862192523281016426251335": -ildouble: 1 -ldouble: 1 -Test "jn (1, 1.0) == 0.440050585744933515959682203718914913": -ildouble: 1 -ldouble: 1 Test "jn (1, 10.0) == 0.0434727461688614366697487680258592883": float: 2 ifloat: 2 -ildouble: 2 -ldouble: 2 Test "jn (1, 2.0) == 0.576724807756873387202448242269137087": double: 1 idouble: 1 Test "jn (1, 8.0) == 0.234636346853914624381276651590454612": double: 1 idouble: 1 -ildouble: 4 -ldouble: 4 -Test "jn (10, -1.0) == 0.263061512368745320699785368779050294e-9": -ildouble: 1 -ldouble: 1 Test "jn (10, 0.125) == 0.250543369809369890173993791865771547e-18": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "jn (10, 0.75) == 0.149621713117596814698712483621682835e-10": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 -Test "jn (10, 1.0) == 0.263061512368745320699785368779050294e-9": -ildouble: 1 -ldouble: 1 Test "jn (10, 10.0) == 0.207486106633358857697278723518753428": double: 4 float: 3 idouble: 4 ifloat: 3 -ildouble: 2 -ldouble: 2 Test "jn (10, 2.0) == 0.251538628271673670963516093751820639e-6": float: 4 ifloat: 4 @@ -661,11 +449,9 @@ idouble: 1 ifloat: 1 Test "jn (3, 10.0) == 0.0583793793051868123429354784103409563": double: 3 -float: 2 +float: 1 idouble: 3 -ifloat: 2 -ildouble: 2 -ldouble: 2 +ifloat: 1 Test "jn (3, 2.0) == 0.128943249474402051098793332969239835": double: 1 float: 2 @@ -673,23 +459,16 @@ idouble: 1 ifloat: 2 # lgamma -Test "lgamma (-0.5) == log(2*sqrt(pi))": -ildouble: 1 -ldouble: 1 Test "lgamma (0.7) == 0.260867246531666514385732417016759578": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "lgamma (1.2) == -0.853740900033158497197028392998854470e-1": double: 1 float: 2 idouble: 1 ifloat: 2 -ildouble: 1 -ldouble: 1 # log10 Test "log10 (0.75) == -0.124938736608299953132449886193870744": @@ -700,34 +479,23 @@ ifloat: 2 Test "log10 (e) == log10(e)": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 # log1p Test "log1p (-0.25) == -0.287682072451780927439219005993827432": float: 1 ifloat: 1 -# log2 -Test "log2 (0.75) == -.415037499278843818546261056052183492": -ildouble: 1 -ldouble: 1 - # sincos Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.86602540378443864676372317075293616 in sin_res": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res": double: 1 float: 1 @@ -737,38 +505,17 @@ Test "sincos (pi/6, &sin_res, &cos_res) puts 0.866025403784438646763723170752936 float: 1 ifloat: 1 -# sqrt -Test "sqrt (2) == M_SQRT2l": -ildouble: 1 -ldouble: 1 - # tan Test "tan (pi/4) == 1": double: 1 idouble: 1 -# tanh -Test "tanh (-0.75) == -0.635148952387287319214434357312496495": -ildouble: 1 -ldouble: 1 -Test "tanh (-1.0) == -0.7615941559557648881194582826047935904": -ildouble: 1 -ldouble: 1 -Test "tanh (0.75) == 0.635148952387287319214434357312496495": -ildouble: 1 -ldouble: 1 -Test "tanh (1.0) == 0.7615941559557648881194582826047935904": -ildouble: 1 -ldouble: 1 - # tgamma Test "tgamma (-0.5) == -2 sqrt (pi)": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "tgamma (0.5) == sqrt (pi)": float: 1 ifloat: 1 @@ -777,9 +524,6 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -Test "tgamma (4) == 6": -ildouble: 1 -ldouble: 1 # y0 Test "y0 (1.0) == 0.0882569642156769579829267660235151628": @@ -797,8 +541,6 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 3 -ldouble: 3 Test "y0 (2.0) == 0.510375672649745119596606592727157873": double: 1 idouble: 1 @@ -807,23 +549,16 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 3 -ldouble: 3 # y1 Test "y1 (0.125) == -5.19993611253477499595928744876579921": double: 1 idouble: 1 -Test "y1 (0.75) == -1.03759455076928541973767132140642198": -ildouble: 1 -ldouble: 1 Test "y1 (1.5) == -0.412308626973911295952829820633445323": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "y1 (10.0) == 0.249015424206953883923283474663222803": double: 3 float: 1 @@ -834,15 +569,11 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "y1 (8.0) == -0.158060461731247494255555266187483550": double: 1 float: 2 idouble: 1 ifloat: 2 -ildouble: 1 -ldouble: 1 # yn Test "yn (0, 1.0) == 0.0882569642156769579829267660235151628": @@ -860,8 +591,6 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 3 -ldouble: 3 Test "yn (0, 2.0) == 0.510375672649745119596606592727157873": double: 1 idouble: 1 @@ -870,21 +599,14 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 3 -ldouble: 3 Test "yn (1, 0.125) == -5.19993611253477499595928744876579921": double: 1 idouble: 1 -Test "yn (1, 0.75) == -1.03759455076928541973767132140642198": -ildouble: 1 -ldouble: 1 Test "yn (1, 1.5) == -0.412308626973911295952829820633445323": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "yn (1, 10.0) == 0.249015424206953883923283474663222803": double: 3 float: 1 @@ -895,48 +617,34 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "yn (1, 8.0) == -0.158060461731247494255555266187483550": double: 1 float: 2 idouble: 1 ifloat: 2 -ildouble: 1 -ldouble: 1 Test "yn (10, 0.125) == -127057845771019398.252538486899753195": double: 1 idouble: 1 -ildouble: 2 -ldouble: 2 Test "yn (10, 0.75) == -2133501638.90573424452445412893839236": double: 1 float: 2 idouble: 1 ifloat: 2 -ildouble: 5 -ldouble: 5 Test "yn (10, 1.0) == -121618014.278689189288130426667971145": double: 1 float: 2 idouble: 1 ifloat: 2 -ildouble: 1 -ldouble: 1 Test "yn (10, 10.0) == -0.359814152183402722051986577343560609": double: 2 -float: 2 +float: 1 idouble: 2 -ifloat: 2 -ildouble: 2 -ldouble: 2 +ifloat: 1 Test "yn (10, 2.0) == -129184.542208039282635913145923304214": double: 3 float: 1 idouble: 3 ifloat: 1 -ildouble: 2 -ldouble: 2 Test "yn (3, 0.125) == -2612.69757350066712600220955744091741": double: 1 idouble: 1 @@ -945,34 +653,24 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 2 -ldouble: 2 Test "yn (3, 10.0) == -0.251362657183837329779204747654240998": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Test "yn (3, 2.0) == -1.12778377684042778608158395773179238": double: 1 idouble: 1 # Maximal error of functions: Function: "atan2": -float: 1 -ifloat: 1 -ildouble: 1 -ldouble: 1 +float: 6 +ifloat: 6 Function: "atanh": float: 1 ifloat: 1 -Function: Imaginary part of "cacos": -ildouble: 1 -ldouble: 1 - Function: Real part of "cacosh": double: 1 float: 7 @@ -984,8 +682,6 @@ double: 1 float: 3 idouble: 1 ifloat: 3 -ildouble: 1 -ldouble: 1 Function: Real part of "casin": double: 1 @@ -993,25 +689,17 @@ float: 1 idouble: 1 ifloat: 1 -Function: Imaginary part of "casin": -ildouble: 1 -ldouble: 1 - Function: Real part of "casinh": double: 5 float: 1 idouble: 5 ifloat: 1 -ildouble: 4 -ldouble: 4 Function: Imaginary part of "casinh": double: 3 float: 6 idouble: 3 ifloat: 6 -ildouble: 2 -ldouble: 2 Function: Real part of "catan": float: 4 @@ -1022,72 +710,50 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Real part of "catanh": double: 4 idouble: 4 -ildouble: 1 -ldouble: 1 Function: Imaginary part of "catanh": float: 6 ifloat: 6 -ildouble: 1 -ldouble: 1 Function: "cbrt": double: 1 idouble: 1 -ildouble: 1 -ldouble: 1 Function: Real part of "ccos": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Imaginary part of "ccos": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Real part of "ccosh": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Imaginary part of "ccosh": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Real part of "cexp": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Imaginary part of "cexp": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Real part of "clog": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Imaginary part of "clog": float: 3 @@ -1096,54 +762,34 @@ ifloat: 3 Function: Real part of "clog10": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Imaginary part of "clog10": double: 1 float: 5 idouble: 1 ifloat: 5 -ildouble: 1 -ldouble: 1 Function: "cos": double: 2 float: 1 idouble: 2 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Real part of "cpow": double: 2 float: 4 idouble: 2 ifloat: 4 -ildouble: 10 -ldouble: 10 Function: Imaginary part of "cpow": double: 2 float: 2 idouble: 2 ifloat: 2 -ildouble: 1 -ldouble: 1 - -Function: Real part of "csin": -ildouble: 1 -ldouble: 1 - -Function: Imaginary part of "csin": -ildouble: 1 -ldouble: 1 Function: Real part of "csinh": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: Imaginary part of "csinh": double: 1 @@ -1154,38 +800,24 @@ ifloat: 1 Function: Real part of "csqrt": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 - -Function: Imaginary part of "csqrt": -ildouble: 1 -ldouble: 1 Function: Real part of "ctan": double: 1 idouble: 1 -ildouble: 1 -ldouble: 1 Function: Imaginary part of "ctan": double: 1 idouble: 1 -ildouble: 2 -ldouble: 2 Function: Real part of "ctanh": double: 1 float: 2 idouble: 1 ifloat: 2 -ildouble: 1 -ldouble: 1 Function: Imaginary part of "ctanh": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: "erf": double: 1 @@ -1196,137 +828,89 @@ double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: "exp10": double: 6 float: 2 idouble: 6 ifloat: 2 -ildouble: 1 -ldouble: 1 - -Function: "exp2": -ildouble: 2 -ldouble: 2 Function: "expm1": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 - -Function: "gamma": -ildouble: 1 -ldouble: 1 Function: "hypot": float: 1 ifloat: 1 Function: "j0": -double: 3 +double: 2 float: 2 -idouble: 3 +idouble: 2 ifloat: 2 -ildouble: 2 -ldouble: 2 Function: "j1": double: 1 float: 2 idouble: 1 ifloat: 2 -ildouble: 4 -ldouble: 4 Function: "jn": double: 4 float: 4 idouble: 4 ifloat: 4 -ildouble: 4 -ldouble: 4 Function: "lgamma": double: 1 float: 2 idouble: 1 ifloat: 2 -ildouble: 1 -ldouble: 1 Function: "log10": double: 1 float: 2 idouble: 1 ifloat: 2 -ildouble: 1 -ldouble: 1 Function: "log1p": float: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 - -Function: "log2": -ildouble: 1 -ldouble: 1 Function: "sincos": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 - -Function: "sqrt": -ildouble: 1 -ldouble: 1 Function: "tan": double: 1 idouble: 1 -Function: "tanh": -ildouble: 1 -ldouble: 1 - Function: "tgamma": double: 1 float: 1 idouble: 1 ifloat: 1 -ildouble: 1 -ldouble: 1 Function: "y0": double: 2 float: 1 idouble: 2 ifloat: 1 -ildouble: 3 -ldouble: 3 Function: "y1": double: 3 float: 2 idouble: 3 ifloat: 2 -ildouble: 1 -ldouble: 1 Function: "yn": double: 3 float: 2 idouble: 3 ifloat: 2 -ildouble: 5 -ldouble: 5 # end of automatic generation diff --git a/sysdeps/s390/jmpbuf-offsets.h b/sysdeps/s390/jmpbuf-offsets.h deleted file mode 100644 index d99fc92a27..0000000000 --- a/sysdeps/s390/jmpbuf-offsets.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Private macros for accessing __jmp_buf contents. S/390 version. - Copyright (C) 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 - 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. */ - -#define __JB_GPR6 0 -#define __JB_GPR7 1 -#define __JB_GPR8 2 -#define __JB_GPR9 3 -#define __JB_GPR10 4 -#define __JB_GPR11 5 -#define __JB_GPR12 6 -#define __JB_GPR13 7 -#define __JB_GPR14 8 -#define __JB_GPR15 9 diff --git a/sysdeps/s390/jmpbuf-unwind.h b/sysdeps/s390/jmpbuf-unwind.h deleted file mode 100644 index c1a670fc7d..0000000000 --- a/sysdeps/s390/jmpbuf-unwind.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek , 2003. - - 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. */ - -#include -#include -#include -#include -#include -#include - - -/* Test if longjmp to JMPBUF would unwind the frame - containing a local variable at ADDRESS. */ -#define _JMPBUF_UNWINDS(jmpbuf, address, demangle) \ - ((void *) (address) < (void *) demangle ((jmpbuf)->__gregs[__JB_GPR15])) - - -/* On s390{,x}, CFA is always 96 (resp. 160) bytes above actual - %r15. */ -#define _JMPBUF_CFA_UNWINDS_ADJ(_jmpbuf, _context, _adj) \ - _JMPBUF_UNWINDS_ADJ (_jmpbuf, \ - (void *) (_Unwind_GetCFA (_context) \ - - 32 - 2 * __WORDSIZE), _adj) - -static inline uintptr_t __attribute__ ((unused)) -_jmpbuf_sp (__jmp_buf regs) -{ - uintptr_t sp = regs[0].__gregs[__JB_GPR15]; -#ifdef PTR_DEMANGLE - PTR_DEMANGLE (sp); -#endif - return sp; -} - -#define _JMPBUF_UNWINDS_ADJ(_jmpbuf, _address, _adj) \ - ((uintptr_t) (_address) - (_adj) < _jmpbuf_sp (_jmpbuf) - (_adj)) - -/* We use the normal longjmp for unwinding. */ -#define __libc_unwind_longjmp(buf, val) __libc_longjmp (buf, val) diff --git a/sysdeps/s390/ldbl2mpn.c b/sysdeps/s390/ldbl2mpn.c new file mode 100644 index 0000000000..1dac461aef --- /dev/null +++ b/sysdeps/s390/ldbl2mpn.c @@ -0,0 +1,101 @@ +/* Copyright (C) 1995, 1996, 1997 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. */ + +#include "gmp.h" +#include "gmp-impl.h" +#include "longlong.h" +#include "ieee754.h" +#include +#include + +/* Convert a `long double' in IEEE854 standard double-precision format to a + multi-precision integer representing the significand scaled up by its + number of bits (64 for long double) and an integral power of two + (MPN frexpl). */ + +mp_size_t +__mpn_extract_long_double (mp_ptr res_ptr, mp_size_t size, + int *expt, int *is_neg, + long double value) +{ + union ieee854_long_double u; + u.d = value; + + *is_neg = u.ieee.negative; + *expt = (int) u.ieee.exponent - IEEE854_LONG_DOUBLE_BIAS; + +#if BITS_PER_MP_LIMB == 32 + res_ptr[0] = u.ieee.mantissa1; /* Low-order 32 bits of fraction. */ + res_ptr[1] = u.ieee.mantissa0; /* High-order 32 bits. */ + #define N 2 +#elif BITS_PER_MP_LIMB == 64 + /* Hopefully the compiler will combine the two bitfield extracts + and this composition into just the original quadword extract. */ + res_ptr[0] = ((unsigned long int) u.ieee.mantissa0 << 32) | u.ieee.mantissa1; + #define N 1 +#else + #error "mp_limb size " BITS_PER_MP_LIMB "not accounted for" +#endif + + if (u.ieee.exponent == 0) + { + /* A biased exponent of zero is a special case. + Either it is a zero or it is a denormal number. */ + if (res_ptr[0] == 0 && res_ptr[N - 1] == 0) /* Assumes N<=2. */ + /* It's zero. */ + *expt = 0; + else + { + /* It is a denormal number, meaning it has no implicit leading + one bit, and its exponent is in fact the format minimum. */ + int cnt; + + /* One problem with Intel's 80-bit format is that the explicit + leading one in the normalized representation has to be zero + for denormalized number. If it is one, the number is according + to Intel's specification an invalid number. We make the + representation unique by explicitly clearing this bit. */ + res_ptr[N - 1] &= ~(1L << ((LDBL_MANT_DIG - 1) % BITS_PER_MP_LIMB)); + + if (res_ptr[N - 1] != 0) + { + count_leading_zeros (cnt, res_ptr[N - 1]); + if (cnt != 0) + { +#if N == 2 + res_ptr[N - 1] = res_ptr[N - 1] << cnt + | (res_ptr[0] >> (BITS_PER_MP_LIMB - cnt)); + res_ptr[0] <<= cnt; +#else + res_ptr[N - 1] <<= cnt; +#endif + } + *expt = LDBL_MIN_EXP - 1 - cnt; + } + else + { + count_leading_zeros (cnt, res_ptr[0]); + res_ptr[N - 1] = res_ptr[0] << cnt; + res_ptr[0] = 0; + *expt = LDBL_MIN_EXP - 1 - BITS_PER_MP_LIMB - cnt; + } + } + } + + return N; +} diff --git a/sysdeps/s390/libc-tls.c b/sysdeps/s390/libc-tls.c index f177f436e9..7362dbf8f8 100644 --- a/sysdeps/s390/libc-tls.c +++ b/sysdeps/s390/libc-tls.c @@ -1,5 +1,5 @@ /* Thread-local storage handling in the ELF dynamic linker. S390 version. - Copyright (C) 2003, 2005 Free Software Foundation, Inc. + Copyright (C) 2003 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 @@ -18,7 +18,7 @@ 02111-1307 USA. */ #include -#include +#include #if USE_TLS diff --git a/sysdeps/s390/s390-32/Dist b/sysdeps/s390/s390-32/Dist new file mode 100644 index 0000000000..1cd482830a --- /dev/null +++ b/sysdeps/s390/s390-32/Dist @@ -0,0 +1 @@ +s390-mcount.S diff --git a/sysdeps/s390/s390-32/__longjmp.c b/sysdeps/s390/s390-32/__longjmp.c index c47ebbc52a..c1b977cd49 100644 --- a/sysdeps/s390/s390-32/__longjmp.c +++ b/sysdeps/s390/s390-32/__longjmp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2001, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). @@ -29,32 +29,14 @@ void __longjmp (__jmp_buf env, int val) { - register int r2 __asm ("%r2") = val == 0 ? 1 : val; -#ifdef PTR_DEMANGLE - register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD (); - register void *r1 __asm ("%r1") = (void *) env; -#endif - /* Restore registers and jump back. */ - asm volatile ("ld %%f6,48(%1)\n\t" - "ld %%f4,40(%1)\n\t" -#ifdef PTR_DEMANGLE - "lm %%r6,%%r13,0(%1)\n\t" - "lm %%r4,%%r5,32(%1)\n\t" - "xr %%r4,%2\n\t" - "xr %%r5,%2\n\t" - "lr %%r15,%%r5\n\t" - "br %%r4" -#else - "lm %%r6,%%r15,0(%1)\n\t" - "br %%r14" -#endif - : : "r" (r2), -#ifdef PTR_DEMANGLE - "r" (r1), "r" (r3) -#else - "a" (env) -#endif - ); + /* Restore registers and jump back. */ + asm volatile ("lr %%r2,%0\n\t" /* PUT val in grp 2. */ + "ld %%f6,48(%1)\n\t" + "ld %%f4,40(%1)\n\t" + "lm %%r6,%%r15,0(%1)\n\t" + "br %%r14" + : : "r" (val == 0 ? 1 : val), + "a" (env) : "2" ); /* Avoid `volatile function does return' warnings. */ for (;;); diff --git a/sysdeps/s390/s390-32/backtrace.c b/sysdeps/s390/s390-32/backtrace.c index 6adc3bc3d1..7a632572b5 100644 --- a/sysdeps/s390/s390-32/backtrace.c +++ b/sysdeps/s390/s390-32/backtrace.c @@ -1,6 +1,6 @@ /* Return backtrace of current program state. - Copyright (C) 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky . + Copyright (C) 2000, 2001, 2003, 2004 Free Software Foundation, Inc. + Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -142,4 +142,3 @@ __backtrace (void **array, int size) } weak_alias (__backtrace, backtrace) -libc_hidden_def (__backtrace) diff --git a/sysdeps/s390/s390-32/bits/wordsize.h b/sysdeps/s390/s390-32/bits/wordsize.h index b41661217f..4f50d8586c 100644 --- a/sysdeps/s390/s390-32/bits/wordsize.h +++ b/sysdeps/s390/s390-32/bits/wordsize.h @@ -5,14 +5,3 @@ #else # define __WORDSIZE 32 #endif - -#if !defined __NO_LONG_DOUBLE_MATH && !defined __LONG_DOUBLE_MATH_OPTIONAL - -/* Signal that 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 diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h index 8bbf858fbf..52922a813b 100644 --- a/sysdeps/s390/s390-32/dl-machine.h +++ b/sysdeps/s390/s390-32/dl-machine.h @@ -1,6 +1,5 @@ /* Machine-dependent ELF dynamic relocation inline functions. S390 Version. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 - Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Carl Pederson & Martin Schwidefsky. This file is part of the GNU C Library. @@ -22,6 +21,7 @@ #ifndef dl_machine_h #define dl_machine_h + #define ELF_MACHINE_NAME "s390" #include @@ -112,8 +112,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) { got[2] = (Elf32_Addr) &_dl_runtime_profile; - if (GLRO(dl_profile) != NULL - && _dl_name_match_p (GLRO(dl_profile), l)) + if (_dl_name_match_p (GLRO(dl_profile), l)) /* This is the object we are looking for. Say that we really want profiling and the timers are started. */ GL(dl_profile_map) = l; @@ -127,6 +126,124 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) return lazy; } +/* This code is used in dl-runtime.c to call the `fixup' function + and then redirect to the address it returns. */ + +/* s390: + Arguments are in register. + r2 - r7 holds the original parameters for the function call, fixup + and trampoline code use r0-r5 and r14-15. For the correct function + call r2-r5 and r14-15 must be restored. + Arguments from the PLT are stored at 24(r15) and 28(r15) + and must be moved to r2 and r3 for the fixup call (see elf32-s390.c + in the binutils for the PLT code). + Fixup function address in r2. +*/ +#ifndef PROF +#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ + asm ( "\ + .text\n\ + .globl _dl_runtime_resolve\n\ + .type _dl_runtime_resolve, @function\n\ + .align 16\n\ + " CFI_STARTPROC "\n\ +_dl_runtime_resolve:\n\ + # save registers\n\ + stm 2,5,32(15)\n\ + st 14,48(15)\n\ + lr 0,15\n\ + ahi 15,-96\n\ + " CFI_ADJUST_CFA_OFFSET(96)"\n\ + st 0,0(15)\n\ + # load args saved by PLT\n\ + lm 2,3,120(15)\n\ + basr 1,0\n\ +0: ahi 1,1f-0b\n\ + l 14,0(1)\n\ + bas 14,0(14,1) # call fixup\n\ + lr 1,2 # function addr returned in r2\n\ + # restore registers\n\ + ahi 15,96\n\ + " CFI_ADJUST_CFA_OFFSET(-96)" \n\ + l 14,48(15)\n\ + lm 2,5,32(15)\n\ + br 1\n\ +1: .long fixup-1b\n\ + " CFI_ENDPROC "\n\ + .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ +\n\ + .globl _dl_runtime_profile\n\ + .type _dl_runtime_profile, @function\n\ + .align 16\n\ + " CFI_STARTPROC "\n\ +_dl_runtime_profile:\n\ + # save registers\n\ + stm 2,5,32(15)\n\ + st 14,48(15)\n\ + lr 0,15\n\ + ahi 15,-96\n\ + " CFI_ADJUST_CFA_OFFSET(96)"\n\ + st 0,0(15)\n\ + # load args saved by PLT\n\ + lm 2,3,120(15)\n\ + # load return address as third parameter\n\ + lr 4,14\n\ + basr 1,0\n\ +0: ahi 1,1f-0b\n\ + l 14,0(1)\n\ + bas 14,0(14,1) # call fixup\n\ + lr 1,2 # function addr returned in r2\n\ + # restore registers\n\ + ahi 15,96\n\ + " CFI_ADJUST_CFA_OFFSET(-96)" \n\ + l 14,48(15)\n\ + lm 2,5,32(15)\n\ + br 1\n\ +1: .long profile_fixup-1b\n\ + " CFI_ENDPROC "\n\ + .size _dl_runtime_profile, .-_dl_runtime_profile\n\ +"); +#else +#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ + asm ( "\ + .text\n\ + .globl _dl_runtime_resolve\n\ + .globl _dl_runtime_profile\n\ + .type _dl_runtime_resolve, @function\n\ + .type _dl_runtime_profile, @function\n\ + .align 16\n\ + " CFI_STARTPROC "\n\ +_dl_runtime_resolve:\n\ +_dl_runtime_profile:\n\ + # save registers\n\ + stm 2,5,32(15)\n\ + st 14,48(15)\n\ + lr 0,15\n\ + ahi 15,-96\n\ + " CFI_ADJUST_CFA_OFFSET(96)"\n\ + st 0,0(15)\n\ + # load args saved by PLT\n\ + lm 2,3,120(15)\n\ + # load return address as third parameter\n\ + lr 4,14\n\ + basr 1,0\n\ +0: ahi 1,1f-0b\n\ + l 14,0(1)\n\ + bas 14,0(14,1) # call fixup\n\ + lr 1,2 # function addr returned in r2\n\ + # restore registers\n\ + ahi 15,96\n\ + " CFI_ADJUST_CFA_OFFSET(-96)" \n\ + l 14,48(15)\n\ + lm 2,5,32(15)\n\ + br 1\n\ +1: .long fixup-1b\n\ + " CFI_ENDPROC "\n\ + .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ + .size _dl_runtime_profile, .-_dl_runtime_profile\n\ +"); +#endif + /* Mask identifying addresses reserved for the user program, where the dynamic linker should not map anything. */ #define ELF_MACHINE_USER_ADDRESS_MASK 0xf8000000UL @@ -258,20 +375,15 @@ elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc, return value; } -/* Names of the architecture-specific auditing callback functions. */ -#define ARCH_LA_PLTENTER s390_32_gnu_pltenter -#define ARCH_LA_PLTEXIT s390_32_gnu_pltexit - #endif /* !dl_machine_h */ -#ifdef RESOLVE_MAP +#ifdef RESOLVE /* Perform the relocation specified by RELOC and SYM (which is fully resolved). MAP is the object containing the reloc. */ -auto inline void -__attribute__ ((always_inline)) +static inline void elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, const Elf32_Sym *sym, const struct r_found_version *version, void *const reloc_addr_arg) @@ -305,8 +417,17 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, #ifndef RESOLVE_CONFLICT_FIND_MAP const Elf32_Sym *const refsym = sym; #endif +#if defined USE_TLS && !defined RTLD_BOOTSTRAP struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type); Elf32_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value; +#else + Elf32_Addr value = RESOLVE (&sym, version, r_type); + +# ifndef RTLD_BOOTSTRAP + if (sym) +# endif + value += sym->st_value; +#endif /* use TLS and !RTLD_BOOTSTRAP */ switch (r_type) { @@ -418,8 +539,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, } } -auto inline void -__attribute__ ((always_inline)) +static inline void elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, void *const reloc_addr_arg) { @@ -427,8 +547,7 @@ elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, *reloc_addr = l_addr + reloc->r_addend; } -auto inline void -__attribute__ ((always_inline)) +static inline void elf_machine_lazy_rel (struct link_map *map, Elf32_Addr l_addr, const Elf32_Rela *reloc) { @@ -448,4 +567,4 @@ elf_machine_lazy_rel (struct link_map *map, _dl_reloc_bad_type (map, r_type, 1); } -#endif /* RESOLVE_MAP */ +#endif /* RESOLVE */ diff --git a/sysdeps/s390/s390-32/dl-trampoline.S b/sysdeps/s390/s390-32/dl-trampoline.S deleted file mode 100644 index fbbbc189db..0000000000 --- a/sysdeps/s390/s390-32/dl-trampoline.S +++ /dev/null @@ -1,134 +0,0 @@ -/* PLT trampolines. s390 version. - Copyright (C) 2005 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. */ - -/* This code is used in dl-runtime.c to call the `fixup' function - and then redirect to the address it returns. */ - -/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile - * with the following linkage: - * r2 - r6 : parameter registers - * f0, f2 : floating point parameter registers - * 24(r15), 28(r15) : PLT arguments PLT1, PLT2 - * 96(r15) : additional stack parameters - * The normal clobber rules for function calls apply: - * r0 - r5 : call clobbered - * r6 - r13 : call saved - * r14 : return address (call clobbered) - * r15 : stack pointer (call saved) - * f4, f6 : call saved - * f0 - f3, f5, f7 - f15 : call clobbered - */ - -#include - - .text - .globl _dl_runtime_resolve - .type _dl_runtime_resolve, @function - cfi_startproc - .align 16 -_dl_runtime_resolve: - stm %r2,%r5,32(%r15) # save registers - st %r14,8(%r15) - lr %r0,%r15 # create stack frame - ahi %r15,-96 - cfi_adjust_cfa_offset (96) - st 0,0(%r15) - lm %r2,%r3,120(%r15) # load args saved by PLT - basr %r1,0 -0: l %r14,1f-0b(%r1) - bas %r14,0(%r14,%r1) # call resolver - lr %r1,%r2 # function addr returned in r2 - ahi %r15,96 # remove stack frame - cfi_adjust_cfa_offset (-96) - l %r14,8(15) # restore registers - lm %r2,%r5,32(%r15) - br %r1 -1: .long _dl_fixup - 0b - cfi_endproc - .size _dl_runtime_resolve, .-_dl_runtime_resolve - - -#ifndef PROF - .globl _dl_runtime_profile - .type _dl_runtime_profile, @function - cfi_startproc - .align 16 -_dl_runtime_profile: - stm %r2,%r6,32(%r15) # save registers - std %f0,56(%r15) - std %f2,64(%r15) - st %r6,8(%r15) - st %r12,12(%r15) - st %r14,16(%r15) - lr %r12,%r15 # create stack frame - cfi_def_cfa_register (12) - ahi %r15,-96 - st %r12,0(%r15) - lm %r2,%r3,24(%r12) # load arguments saved by PLT - lr %r4,%r14 # return address as third parameter - basr %r1,0 -0: l %r14,6f-0b(%r1) - la %r5,32(%r12) # pointer to struct La_s390_32_regs - la %r6,20(%r12) # long int * framesize - bas %r14,0(%r14,%r1) # call resolver - lr %r1,%r2 # function addr returned in r2 - icm %r0,15,20(%r12) # load & test framesize - jnm 2f - lm %r2,%r6,32(%r12) - ld %f0,56(%r12) - ld %f2,64(%r12) - basr %r14,%r1 # call resolved function -1: lr %r15,%r12 # remove stack frame - cfi_def_cfa_register (15) - l %r14,16(%r15) # restore registers - l %r12,12(%r15) - l %r6,8(%r15) - br %r14 - cfi_def_cfa_register (12) -2: jz 4f # framesize == 0 ? - ahi %r0,7 # align framesize to 8 - lhi %r2,-8 - nr %r0,%r2 - slr %r15,%r0 # make room for framesize bytes - st %r12,0(%r15) - la %r2,96(%r15) - la %r3,96(%r12) - srl %r0,3 -3: mvc 0(8,%r2),0(%r3) # copy additional parameters - la %r2,8(%r2) - la %r3,8(%r3) - brct %r0,3b -4: lm %r2,%r6,32(%r12) # load register parameters - ld %f0,56(%r12) - ld %f2,64(%r12) - basr %r14,%r1 # call resolved function - stm %r2,%r3,72(%r12) - std %f0,80(%r12) - lm %r2,%r3,24(%r12) # load arguments saved by PLT - basr %r1,0 -5: l %r14,7f-5b(%r1) - la %r4,32(%r12) # pointer to struct La_s390_32_regs - la %r5,72(%r12) # pointer to struct La_s390_32_retval - basr %r14,%r1 # call _dl_call_pltexit - j 1b -6: .long _dl_profile_fixup - 0b -7: .long _dl_call_pltexit - 5b - cfi_endproc - .size _dl_runtime_profile, .-_dl_runtime_profile -#endif diff --git a/sysdeps/s390/s390-32/elf/setjmp.S b/sysdeps/s390/s390-32/elf/setjmp.S index ed28008a56..0d1fa8e41d 100644 --- a/sysdeps/s390/s390-32/elf/setjmp.S +++ b/sysdeps/s390/s390-32/elf/setjmp.S @@ -1,5 +1,5 @@ /* setjmp for s390, ELF version. - Copyright (C) 2000, 2002, 2005 Free Software Foundation, Inc. + Copyright (C) 2000, 2002 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -46,23 +46,10 @@ END (__setjmp) ENTRY(__sigsetjmp) .Linternal_sigsetjmp: -#ifdef PTR_MANGLE - stm %r6,%r13,0(%r2) /* store registers in jmp_buf */ - lr %r4,%r14 - lr %r5,%r15 - PTR_MANGLE (%r4, %r1) - PTR_MANGLE2 (%r5, %r1) - stm %r4,%r5,32(%r2) -#else stm %r6,%r15,0(%r2) /* store registers in jmp_buf */ -#endif std %f4,40(%r2) std %f6,48(%r2) -#if defined NOT_IN_libc && defined IS_IN_rtld - /* In ld.so we never save the signal mask. */ - lhi %r2,0 - br %r14 -#elif defined PIC +#ifdef PIC /* We cannot use the PLT, because it requires that %r12 be set, but we can't save and restore our caller's value. Instead, we do an indirect jump through the GOT. */ diff --git a/sysdeps/s390/s390-32/elf/start.S b/sysdeps/s390/s390-32/elf/start.S index f7290106ce..a09acb5d89 100644 --- a/sysdeps/s390/s390-32/elf/start.S +++ b/sysdeps/s390/s390-32/elf/start.S @@ -1,6 +1,5 @@ /* Startup code compliant to the ELF s390 ABI. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 - Free Software Foundation, Inc. + Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -89,9 +88,9 @@ _start: l %r12,.L5-.Llit(%r13) # load .got pointer la %r6,0(%r13,%r6) la %r5,0(%r13,%r5) - la %r12,0(%r13,%r12) - l %r2,0(%r12,%r2) + la %r2,0(%r13,%r2) la %r1,0(%r13,%r1) + la %r12,0(%r13,%r12) #endif /* ok, now branch to the libc main routine */ @@ -109,7 +108,7 @@ _start: #else .L1: .long __libc_csu_init-.Llit .L2: .long __libc_csu_fini-.Llit -.L3: .long main@GOT +.L3: .long main-.Llit .L4: .long __libc_start_main@plt-.Llit .L5: .long _GLOBAL_OFFSET_TABLE_-.Llit #endif diff --git a/sysdeps/s390/s390-32/s390-mcount.S b/sysdeps/s390/s390-32/s390-mcount.S index 6d11f9bbdb..8ecdd0edae 100644 --- a/sysdeps/s390/s390-32/s390-mcount.S +++ b/sysdeps/s390/s390-32/s390-mcount.S @@ -81,4 +81,4 @@ C_LABEL(_mcount) ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount)) #undef mcount -weak_alias (_mcount, mcount) +weak_alias(_mcount, mcount) diff --git a/sysdeps/s390/s390-32/setjmp.S b/sysdeps/s390/s390-32/setjmp.S index b943085e93..dc4862b2a6 100644 --- a/sysdeps/s390/s390-32/setjmp.S +++ b/sysdeps/s390/s390-32/setjmp.S @@ -1,5 +1,5 @@ /* - Copyright (C) 2000, 2001, 2005 Free Software Foundation, Inc. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -29,23 +29,10 @@ /* R2 = pointer to jmp_buf, R3 = savemask */ ENTRY(__sigsetjmp) -#ifdef PTR_MANGLE - stm %r6,%r13,0(%r2) /* store registers in jmp_buf */ - lr %r4,%r14 - lr %r5,%r15 - PTR_MANGLE (%r4, %r1) - PTR_MANGLE2 (%r5, %r1) - stm %r4,%r5,32(%r2) -#else stm %r6,%r15,0(%r2) /* store registers in jmp_buf */ -#endif std %f4,40(%r2) std %f6,48(%r2) -#if defined NOT_IN_libc && defined IS_IN_rtld - /* In ld.so we never save the signal mask. */ - lhi %r2,0 - br %r14 -#elif defined PIC +#ifdef PIC /* We cannot use the PLT, because it requires that %r12 be set, but we can't save and restore our caller's value. Instead, we do an indirect jump through the GOT. */ diff --git a/sysdeps/s390/s390-64/Dist b/sysdeps/s390/s390-64/Dist new file mode 100644 index 0000000000..dbf7aa9661 --- /dev/null +++ b/sysdeps/s390/s390-64/Dist @@ -0,0 +1 @@ +s390x-mcount.S diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c index 030fb5b515..80abd3849a 100644 --- a/sysdeps/s390/s390-64/__longjmp.c +++ b/sysdeps/s390/s390-64/__longjmp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). @@ -29,35 +29,18 @@ void __longjmp (__jmp_buf env, int val) { - register long int r2 __asm ("%r2") = val == 0 ? 1 : val; -#ifdef PTR_DEMANGLE - register uintptr_t r3 __asm ("%r3") = THREAD_GET_POINTER_GUARD (); - register void *r1 __asm ("%r1") = (void *) env; -#endif - /* Restore registers and jump back. */ - asm volatile ("ld %%f7,104(%1)\n\t" - "ld %%f5,96(%1)\n\t" - "ld %%f3,88(%1)\n\t" - "ld %%f1,80(%1)\n\t" -#ifdef PTR_DEMANGLE - "lmg %%r6,%%r13,0(%1)\n\t" - "lmg %%r4,%%r5,64(%1)\n\t" - "xgr %%r4,%2\n\t" - "xgr %%r5,%2\n\t" - "lgr %%r15,%%r5\n\t" - "br %%r4" -#else - "lmg %%r6,%%r15,0(%1)\n\t" - "br %%r14" -#endif - : : "r" (r2), -#ifdef PTR_DEMANGLE - "r" (r1), "r" (r3) -#else - "a" (env) -#endif - ); + /* Restore registers and jump back. */ + asm volatile ("lgr %%r2,%0\n\t" /* Put val in grp 2. */ + "ld %%f7,104(%1)\n\t" + "ld %%f5,96(%1)\n\t" + "ld %%f3,88(%1)\n\t" + "ld %%f1,80(%1)\n\t" + "lmg %%r6,%%r15,0(%1)\n\t" + "br %%r14" + : : "r" (val == 0 ? 1 : val), + "a" (env) : "2" ); /* Avoid `volatile function does return' warnings. */ for (;;); } + diff --git a/sysdeps/s390/s390-64/backtrace.c b/sysdeps/s390/s390-64/backtrace.c index 7ba195cb7a..05321349ca 100644 --- a/sysdeps/s390/s390-64/backtrace.c +++ b/sysdeps/s390/s390-64/backtrace.c @@ -1,6 +1,6 @@ /* Return backtrace of current program state. 64 bit S/390 version. - Copyright (C) 2001, 2003, 2004, 2005 Free Software Foundation, Inc. - Contributed by Martin Schwidefsky . + Copyright (C) 2001, 2003, 2004 Free Software Foundation, Inc. + Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -141,4 +141,3 @@ __backtrace (void **array, int size) } weak_alias (__backtrace, backtrace) -libc_hidden_def (__backtrace) diff --git a/sysdeps/s390/s390-64/bcopy.S b/sysdeps/s390/s390-64/bcopy.S index abcb1fb1b4..ff7966723b 100644 --- a/sysdeps/s390/s390-64/bcopy.S +++ b/sysdeps/s390/s390-64/bcopy.S @@ -1,6 +1,6 @@ /* bcopy -- copy a block from source to destination. 64 bit S/390 version. This file is part of the GNU C Library. - Copyright (C) 2000, 2001, 2005 Free Software Foundation, Inc. + Copyright (C) 2000, 2001 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). The GNU C Library is free software; you can redistribute it and/or @@ -59,10 +59,14 @@ ENTRY(__bcopy) jo .L6 br %r14 .L7: # destructive overlay, can not use mvcle - lgr %r1,%r2 # bcopy is called with source,dest - lgr %r2,%r3 # memmove with dest,source! Oh, well... - lgr %r3,%r1 - jg HIDDEN_BUILTIN_JUMPTARGET(memmove) + lgr %r1,%r2 # bcopy is called with source,dest + lgr %r2,%r3 # memmove with dest,source! Oh, well... + lgr %r3,%r1 +#ifdef PIC + jg memmove@PLT +#else + jg memmove +#endif END(__bcopy) diff --git a/sysdeps/s390/s390-64/bits/wordsize.h b/sysdeps/s390/s390-64/bits/wordsize.h index b41661217f..4f50d8586c 100644 --- a/sysdeps/s390/s390-64/bits/wordsize.h +++ b/sysdeps/s390/s390-64/bits/wordsize.h @@ -5,14 +5,3 @@ #else # define __WORDSIZE 32 #endif - -#if !defined __NO_LONG_DOUBLE_MATH && !defined __LONG_DOUBLE_MATH_OPTIONAL - -/* Signal that 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 diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h index 5026a2edad..82ece0be0f 100644 --- a/sysdeps/s390/s390-64/dl-machine.h +++ b/sysdeps/s390/s390-64/dl-machine.h @@ -1,6 +1,6 @@ /* Machine-dependent ELF dynamic relocation inline functions. 64 bit S/390 Version. - Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -105,8 +105,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) { got[2] = (Elf64_Addr) &_dl_runtime_profile; - if (GLRO(dl_profile) != NULL - && _dl_name_match_p (GLRO(dl_profile), l)) + if (_dl_name_match_p (GLRO(dl_profile), l)) /* This is the object we are looking for. Say that we really want profiling and the timers are started. */ GL(dl_profile_map) = l; @@ -120,6 +119,112 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) return lazy; } +/* This code is used in dl-runtime.c to call the `fixup' function + and then redirect to the address it returns. */ + +/* s390: + Arguments are in register. + r2 - r7 holds the original parameters for the function call, fixup + and trampoline code use r0-r5 and r14-15. For the correct function + call r2-r5 and r14-15 must be restored. + Arguments from the PLT are stored at 48(r15) and 56(r15) + and must be moved to r2 and r3 for the fixup call (see elf32-s390.c + in the binutils for the PLT code). + Fixup function address in r2. +*/ +#ifndef PROF +#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ + asm ( "\ + .text\n\ + .globl _dl_runtime_resolve\n\ + .type _dl_runtime_resolve, @function\n\ + .align 16\n\ + " CFI_STARTPROC "\n\ +_dl_runtime_resolve:\n\ + # save registers\n\ + stmg 2,5,64(15)\n\ + stg 14,96(15)\n\ + lgr 0,15\n\ + aghi 15,-160\n\ + " CFI_ADJUST_CFA_OFFSET(160)"\n\ + stg 0,0(15)\n\ + # load args saved by PLT\n\ + lmg 2,3,208(15)\n\ + brasl 14,fixup # call fixup\n\ + lgr 1,2 # function addr returned in r2\n\ + # restore registers\n\ + aghi 15,160\n\ + " CFI_ADJUST_CFA_OFFSET(-160)" \n\ + lg 14,96(15)\n\ + lmg 2,5,64(15)\n\ + br 1\n\ + " CFI_ENDPROC "\n\ + .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ +\n\ + .globl _dl_runtime_profile\n\ + .type _dl_runtime_profile, @function\n\ + .align 16\n\ + " CFI_STARTPROC "\n\ +_dl_runtime_profile:\n\ + # save registers\n\ + stmg 2,5,64(15)\n\ + stg 14,96(15)\n\ + lgr 0,15\n\ + aghi 15,-160\n\ + " CFI_ADJUST_CFA_OFFSET(160)"\n\ + stg 0,0(15)\n\ + # load args saved by PLT\n\ + lmg 2,3,208(15)\n\ + # load return address as third parameter\n\ + lgr 4,14\n\ + brasl 14,profile_fixup # call fixup\n\ + lgr 1,2 # function addr returned in r2\n\ + # restore registers\n\ + aghi 15,160\n\ + " CFI_ADJUST_CFA_OFFSET(-160)" \n\ + lg 14,96(15)\n\ + lmg 2,5,64(15)\n\ + br 1\n\ + " CFI_ENDPROC "\n\ + .size _dl_runtime_profile, .-_dl_runtime_profile\n\ +"); +#else +#define ELF_MACHINE_RUNTIME_TRAMPOLINE \ + asm ( "\ + .text\n\ + .globl _dl_runtime_resolve\n\ + .globl _dl_runtime_profile\n\ + .type _dl_runtime_resolve, @function\n\ + .type _dl_runtime_profile, @function\n\ + .align 16\n\ + " CFI_STARTPROC "\n\ +_dl_runtime_resolve:\n\ +_dl_runtime_profile:\n\ + # save registers\n\ + stmg 2,5,64(15)\n\ + stg 14,96(15)\n\ + lgr 0,15\n\ + aghi 15,-160\n\ + " CFI_ADJUST_CFA_OFFSET(160)"\n\ + stg 0,0(15)\n\ + # load args saved by PLT\n\ + lmg 2,3,208(15)\n\ + # load return address as third parameter\n\ + lgr 4,14\n\ + brasl 14,profile_fixup # call fixup\n\ + lgr 1,2 # function addr returned in r2\n\ + # restore registers\n\ + aghi 15,160\n\ + " CFI_ADJUST_CFA_OFFSET(-160)" \n\ + lg 14,96(15)\n\ + lmg 2,5,64(15)\n\ + br 1\n\ + " CFI_ENDPROC "\n\ + .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ + .size _dl_runtime_profile, .-_dl_runtime_profile\n\ +"); +#endif + /* Initial entry point code for the dynamic linker. The C function `_dl_start' is the real entry point; its return value is the user program's entry point. */ @@ -238,19 +343,14 @@ elf_machine_plt_value (struct link_map *map, const Elf64_Rela *reloc, return value; } -/* Names of the architecture-specific auditing callback functions. */ -#define ARCH_LA_PLTENTER s390_64_gnu_pltenter -#define ARCH_LA_PLTEXIT s390_64_gnu_pltexit - #endif /* !dl_machine_h */ -#ifdef RESOLVE_MAP +#ifdef RESOLVE /* Perform the relocation specified by RELOC and SYM (which is fully resolved). MAP is the object containing the reloc. */ -auto inline void -__attribute__ ((always_inline)) +static inline void elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, const Elf64_Sym *sym, const struct r_found_version *version, void *const reloc_addr_arg) @@ -284,8 +384,17 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, #ifndef RESOLVE_CONFLICT_FIND_MAP const Elf64_Sym *const refsym = sym; #endif +#if defined USE_TLS && !defined RTLD_BOOTSTRAP struct link_map *sym_map = RESOLVE_MAP (&sym, version, r_type); Elf64_Addr value = sym == NULL ? 0 : sym_map->l_addr + sym->st_value; +#else + Elf64_Addr value = RESOLVE (&sym, version, r_type); + +# ifndef RTLD_BOOTSTRAP + if (sym) +# endif + value += sym->st_value; +#endif /* use TLS and !RTLD_BOOTSTRAP */ switch (r_type) { @@ -409,8 +518,7 @@ elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, } } -auto inline void -__attribute__ ((always_inline)) +static inline void elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, void *const reloc_addr_arg) { @@ -418,8 +526,7 @@ elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, *reloc_addr = l_addr + reloc->r_addend; } -auto inline void -__attribute__ ((always_inline)) +static inline void elf_machine_lazy_rel (struct link_map *map, Elf64_Addr l_addr, const Elf64_Rela *reloc) { @@ -439,4 +546,4 @@ elf_machine_lazy_rel (struct link_map *map, _dl_reloc_bad_type (map, r_type, 1); } -#endif /* RESOLVE_MAP */ +#endif /* RESOLVE */ diff --git a/sysdeps/s390/s390-64/dl-trampoline.S b/sysdeps/s390/s390-64/dl-trampoline.S deleted file mode 100644 index 8093582163..0000000000 --- a/sysdeps/s390/s390-64/dl-trampoline.S +++ /dev/null @@ -1,128 +0,0 @@ -/* PLT trampolines. s390 version. - Copyright (C) 2005 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. */ - -/* The PLT stubs will call _dl_runtime_resolve/_dl_runtime_profile - * with the following linkage: - * r2 - r6 : parameter registers - * f0, f2, f4, f6 : floating point parameter registers - * 24(r15), 28(r15) : PLT arguments PLT1, PLT2 - * 96(r15) : additional stack parameters - * The normal clobber rules for function calls apply: - * r0 - r5 : call clobbered - * r6 - r13 : call saved - * r14 : return address (call clobbered) - * r15 : stack pointer (call saved) - * f1, f3, f5, f7 : call saved - * f0 - f3, f5, f7 - f15 : call clobbered - */ - -#include - - .text - .globl _dl_runtime_resolve - .type _dl_runtime_resolve, @function - cfi_startproc - .align 16 -_dl_runtime_resolve: - stmg 2,5,64(15) # save registers - stg 14,96(15) - lgr 0,15 # create stack frame - aghi 15,-160 - cfi_adjust_cfa_offset (160) - stg 0,0(15) - lmg 2,3,208(15) # load args saved by PLT - brasl 14,_dl_fixup # call fixup - lgr 1,2 # function addr returned in r2 - aghi 15,160 # remove stack frame - cfi_adjust_cfa_offset (-160) - lg 14,96(15) # restore registers - lmg 2,5,64(15) - br 1 - cfi_endproc - .size _dl_runtime_resolve, .-_dl_runtime_resolve - - -#ifndef PROF - .globl _dl_runtime_profile - .type _dl_runtime_profile, @function - cfi_startproc - .align 16 -_dl_runtime_profile: - stmg %r2,%r6,64(%r15) # save registers - std %f0,104(%r15) - std %f2,112(%r15) - std %f4,120(%r15) - std %f6,128(%r15) - stg %r6,16(%r15) - stg %r12,24(%r15) - stg %r14,32(%r15) - lgr %r12,%r15 # create stack frame - cfi_def_cfa_register (12) - aghi %r15,-160 - stg %r12,0(%r15) - lmg %r2,%r3,48(%r12) # load arguments saved by PLT - lgr %r4,%r14 # return address as third parameter - la %r5,64(%r12) # pointer to struct La_s390_32_regs - la %r6,40(%r12) # long int * framesize - brasl %r14,_dl_profile_fixup # call resolver - lgr %r1,%r2 # function addr returned in r2 - lg %r0,40(%r12) # load framesize - ltgr %r0,%r0 - jnm 1f - lmg %r2,%r6,64(%r12) - ld %f0,104(%r12) - ld %f2,112(%r12) - ld %f4,120(%r12) - ld %f6,128(%r12) - basr %r14,%r1 # call resolved function -0: lr %r15,%r12 # remove stack frame - cfi_def_cfa_register (15) - lg %r14,32(%r15) # restore registers - lg %r12,24(%r15) - lg %r6,16(%r15) - br %r14 - cfi_def_cfa_register (12) -1: jz 4f # framesize == 0 ? - aghi %r0,7 # align framesize to 8 - nill %r0,0xfff8 - slgr %r15,%r0 # make room for framesize bytes - stg %r12,0(%r15) - la %r2,160(%r15) - la %r3,160(%r12) - srlg %r0,%r0,3 -3: mvc 0(8,%r2),0(%r3) # copy additional parameters - la %r2,8(%r2) - la %r3,8(%r3) - brctg %r0,3b -4: lmg %r2,%r6,64(%r12) # load register parameters - ld %f0,104(%r12) - ld %f2,112(%r12) - ld %f4,120(%r12) - ld %f6,128(%r12) - basr %r14,%r1 # call resolved function - stg %r2,136(%r12) - std %f0,144(%r12) - lmg %r2,%r3,48(%r12) # load arguments saved by PLT - la %r4,32(%r12) # pointer to struct La_s390_32_regs - la %r5,72(%r12) # pointer to struct La_s390_32_retval - brasl %r14,_dl_call_pltexit - j 0b - cfi_endproc - .size _dl_runtime_profile, .-_dl_runtime_profile -#endif diff --git a/sysdeps/s390/s390-64/elf/setjmp.S b/sysdeps/s390/s390-64/elf/setjmp.S index 28b6a5a35b..fa3ac72480 100644 --- a/sysdeps/s390/s390-64/elf/setjmp.S +++ b/sysdeps/s390/s390-64/elf/setjmp.S @@ -1,5 +1,5 @@ /* setjmp for 64 bit S/390, ELF version. - Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc. + Copyright (C) 2001, 2002 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -46,25 +46,12 @@ END (setjmp) ENTRY(__sigsetjmp) .Linternal_sigsetjmp: -#ifdef PTR_MANGLE - stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */ - lgr %r4,%r14 - lgr %r5,%r15 - PTR_MANGLE (%r4, %r1) - PTR_MANGLE2 (%r5, %r1) - stmg %r4,%r5,64(%r2) -#else stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */ -#endif std %f1,80(%r2) std %f3,88(%r2) std %f5,96(%r2) std %f7,104(%r2) -#if defined NOT_IN_libc && defined IS_IN_rtld - /* In ld.so we never save the signal mask. */ - lghi %r2,0 - br %r14 -#elif defined PIC +#ifdef PIC jg __sigjmp_save@PLT /* Branch to PLT of __sigsetjmp. */ #else jg __sigjmp_save diff --git a/sysdeps/s390/s390-64/elf/start.S b/sysdeps/s390/s390-64/elf/start.S index c4cb34d02c..e5013d0057 100644 --- a/sysdeps/s390/s390-64/elf/start.S +++ b/sysdeps/s390/s390-64/elf/start.S @@ -1,5 +1,5 @@ /* Startup code compliant to the 64 bit S/390 ELF ABI. - Copyright (C) 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -78,14 +78,12 @@ _start: la %r7,160(%r15) larl %r6,__libc_csu_fini # load pointer to __libc_csu_fini larl %r5,__libc_csu_init # load pointer to __libc_csu_init + larl %r2,main # load pointer to main /* Ok, now branch to the libc main routine. */ #ifdef PIC - larl %r2,main@GOTENT # load pointer to main - lg %r2,0(%r2) brasl %r14,__libc_start_main@plt #else - larl %r2,main # load pointer to main brasl %r14,__libc_start_main #endif diff --git a/sysdeps/s390/s390-64/s390x-mcount.S b/sysdeps/s390/s390-64/s390x-mcount.S index 0fa614cbf4..5e3890b4f6 100644 --- a/sysdeps/s390/s390-64/s390x-mcount.S +++ b/sysdeps/s390/s390-64/s390x-mcount.S @@ -69,4 +69,4 @@ C_LABEL(_mcount) ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(_mcount)) #undef mcount -weak_alias (_mcount, mcount) +weak_alias(_mcount, mcount) diff --git a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/s390-64/setjmp.S index a962db46ce..7f245c2a1d 100644 --- a/sysdeps/s390/s390-64/setjmp.S +++ b/sysdeps/s390/s390-64/setjmp.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2005 Free Software Foundation, Inc. +/* Copyright (C) 2001 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -28,27 +28,16 @@ /* R2 = pointer to jmp_buf, R3 = savemask. */ ENTRY(__sigsetjmp) -#ifdef PTR_MANGLE - stmg %r6,%r13,0(%r2) /* Store registers in jmp_buf. */ - lgr %r4,%r14 - lgr %r5,%r15 - PTR_MANGLE (%r4, %r1) - PTR_MANGLE2 (%r5, %r1) - stmg %r4,%r5,64(%r2) -#else stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */ -#endif std %f1,80(%r2) std %f3,88(%r2) std %f5,96(%r2) std %f7,104(%r2) -#if defined NOT_IN_libc && defined IS_IN_rtld - /* In ld.so we never save the signal mask. */ - lghi %r2,0 - br %r14 -#elif defined PIC +#ifdef PIC jg __sigjmp_save@PLT /* Tail-call __sigjmp_save. */ #else jg __sigjmp_save /* Tail-call __sigjmp_save. */ #endif END (__sigsetjmp) + + -- cgit 1.4.1