summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d>2013-03-18 16:44:23 +0000
committerjoseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d>2013-03-18 16:44:23 +0000
commit8751114637bcc3caaf16a4216da0afb84456558a (patch)
treef3eca66b88003bc49c309a95827d461ae5b66aed
parentb261131fe2b94b53fe4950d9265ae10bef228455 (diff)
downloadeglibc2-8751114637bcc3caaf16a4216da0afb84456558a.tar.gz
Merge changes between r22552 and r22663 from /fsf/trunk.
git-svn-id: svn://svn.eglibc.org/trunk@22664 7b3dc134-2b1b-0410-93df-9e9f96275f8d
-rw-r--r--libc/ChangeLog680
-rw-r--r--libc/INSTALL11
-rw-r--r--libc/Makeconfig6
-rw-r--r--libc/Makefile.in5
-rw-r--r--libc/NEWS42
-rw-r--r--libc/Rules27
-rw-r--r--libc/Versions.def1
-rw-r--r--libc/benchtests/Makefile59
-rw-r--r--libc/benchtests/bench-skeleton.c75
-rw-r--r--libc/benchtests/exp-inputs1
-rw-r--r--libc/benchtests/pow-inputs1
-rw-r--r--libc/csu/elf-init.c7
-rw-r--r--libc/csu/gmon-start.c7
-rw-r--r--libc/elf/dl-support.c6
-rw-r--r--libc/extra-lib.mk7
-rw-r--r--libc/io/fcntl.h6
-rw-r--r--libc/malloc/arena.c8
-rw-r--r--libc/malloc/hooks.c6
-rw-r--r--libc/malloc/malloc.c38
-rw-r--r--libc/malloc/malloc.h13
-rw-r--r--libc/malloc/mcheck.c23
-rw-r--r--libc/malloc/morecore.c11
-rw-r--r--libc/malloc/mtrace.c19
-rw-r--r--libc/manual/Makefile2
-rw-r--r--libc/manual/debug.texi2
-rw-r--r--libc/manual/install.texi8
-rw-r--r--libc/manual/memory.texi32
-rw-r--r--libc/manual/nptl.texi44
-rw-r--r--libc/math/Makefile2
-rw-r--r--libc/math/basic-test.c51
-rw-r--r--libc/math/bits/mathcalls.h2
-rwxr-xr-xlibc/math/gen-libm-test.pl2
-rw-r--r--libc/math/libm-test.inc1216
-rw-r--r--libc/math/test-misc.c12
-rw-r--r--libc/math/test-snan.c (renamed from libc/sysdeps/powerpc/fpu/test-powerpc-snan.c)153
-rw-r--r--libc/misc/tst-efgcvt.c2
-rw-r--r--libc/nptl/ChangeLog29
-rw-r--r--libc/nptl/pthread_barrier_init.c4
-rw-r--r--libc/nptl/pthread_mutex_init.c5
-rw-r--r--libc/nptl/pthread_rwlock_init.c4
-rw-r--r--libc/nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h31
-rw-r--r--libc/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h50
-rw-r--r--libc/nptl/sysdeps/unix/sysv/linux/lowlevellock.c2
-rw-r--r--libc/po/es.po2747
-rw-r--r--libc/ports/ChangeLog.aarch6417
-rw-r--r--libc/ports/ChangeLog.alpha6
-rw-r--r--libc/ports/ChangeLog.am335
-rw-r--r--libc/ports/ChangeLog.arm190
-rw-r--r--libc/ports/ChangeLog.hppa6
-rw-r--r--libc/ports/ChangeLog.ia6466
-rw-r--r--libc/ports/ChangeLog.m68k11
-rw-r--r--libc/ports/ChangeLog.mips13
-rw-r--r--libc/ports/ChangeLog.tile15
-rw-r--r--libc/ports/sysdeps/arm/__longjmp.S32
-rw-r--r--libc/ports/sysdeps/arm/add_n.S99
-rw-r--r--libc/ports/sysdeps/arm/addmul_1.S73
-rw-r--r--libc/ports/sysdeps/arm/arm-features.h17
-rw-r--r--libc/ports/sysdeps/arm/arm-mcount.S13
-rw-r--r--libc/ports/sysdeps/arm/armv6/rawmemchr.S109
-rw-r--r--libc/ports/sysdeps/arm/armv6/stpcpy.S1
-rw-r--r--libc/ports/sysdeps/arm/armv6/strchr.S147
-rw-r--r--libc/ports/sysdeps/arm/armv6/strcpy.S231
-rw-r--r--libc/ports/sysdeps/arm/armv6/strlen.S103
-rw-r--r--libc/ports/sysdeps/arm/armv6/strrchr.S131
-rw-r--r--libc/ports/sysdeps/arm/armv6t2/Implies2
-rw-r--r--libc/ports/sysdeps/arm/armv6t2/ffs.S (renamed from libc/ports/sysdeps/arm/jmpbuf-offsets.h)22
-rw-r--r--libc/ports/sysdeps/arm/armv6t2/ffsll.S50
-rw-r--r--libc/ports/sysdeps/arm/armv6t2/memchr.S62
-rw-r--r--libc/ports/sysdeps/arm/bits/setjmp.h2
-rw-r--r--libc/ports/sysdeps/arm/crti.S4
-rw-r--r--libc/ports/sysdeps/arm/crtn.S8
-rw-r--r--libc/ports/sysdeps/arm/dl-machine.h2
-rw-r--r--libc/ports/sysdeps/arm/dl-tlsdesc.S42
-rw-r--r--libc/ports/sysdeps/arm/dl-trampoline.S13
-rw-r--r--libc/ports/sysdeps/arm/include/bits/setjmp.h (renamed from libc/sysdeps/generic/bp-sym.h)27
-rw-r--r--libc/ports/sysdeps/arm/jmpbuf-unwind.h1
-rw-r--r--libc/ports/sysdeps/arm/memcpy.S247
-rw-r--r--libc/ports/sysdeps/arm/memmove.S247
-rw-r--r--libc/ports/sysdeps/arm/memset.S44
-rw-r--r--libc/ports/sysdeps/arm/preconfigure102
-rw-r--r--libc/ports/sysdeps/arm/preconfigure.in58
-rw-r--r--libc/ports/sysdeps/arm/setjmp.S29
-rw-r--r--libc/ports/sysdeps/arm/start.S10
-rw-r--r--libc/ports/sysdeps/arm/strlen.S9
-rw-r--r--libc/ports/sysdeps/arm/sub_n.S2
-rw-r--r--libc/ports/sysdeps/arm/submul_1.S74
-rw-r--r--libc/ports/sysdeps/arm/sysdep.h197
-rw-r--r--libc/ports/sysdeps/ia64/dl-fptr.h10
-rw-r--r--libc/ports/sysdeps/ia64/dl-machine.h4
-rw-r--r--libc/ports/sysdeps/ia64/entry.h5
-rw-r--r--libc/ports/sysdeps/ia64/fpu/libm_error.c115
-rw-r--r--libc/ports/sysdeps/mips/bits/nan.h16
-rw-r--r--libc/ports/sysdeps/unix/arm/sysdep.S32
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/aarch64/bits/mman.h76
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/aarch64/configure13
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/aarch64/configure.in12
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/aarch64/nptl/libpthread.abilist1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/alpha/bits/mman.h3
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/alpha/bits/msq.h1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h63
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S4
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S9
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/bits/mman.h76
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/clone.S13
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/configure1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/configure.in1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/mmap.S8
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/mmap64.S8
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/nptl/libpthread.abilist1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S21
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h47
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c4
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c4
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S24
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/syscall.S4
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/sysdep.h69
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/arm/vfork.S2
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/generic/bits/msq.h1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/hppa/bits/mman.h3
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/hppa/bits/msq.h1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/ia64/bits/mman.h76
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/ia64/bits/msq.h6
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/ia64/makecontext.c20
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/ia64/nptl/dl-sysdep.h27
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h7
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/m68k/bits/mman.h76
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libpthread.abilist1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/mips/bits/mman.h78
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/mips/bits/msq.h1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/tile/bits/mman.h76
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libpthread.abilist1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libpthread.abilist1
-rw-r--r--libc/ports/sysdeps/unix/sysv/linux/tile/tilepro/nptl/libpthread.abilist1
-rw-r--r--libc/posix/Makefile7
-rw-r--r--libc/posix/tst-pathconf.c176
-rwxr-xr-xlibc/scripts/bench.pl93
-rw-r--r--libc/stdio-common/printf_fp.c3
-rw-r--r--libc/stdio-common/tstdiomisc.c38
-rw-r--r--libc/stdio-common/vfprintf.c47
-rw-r--r--libc/sysdeps/generic/ldsodefs.h7
-rw-r--r--libc/sysdeps/i386/fpu/libm-test-ulps12
-rw-r--r--libc/sysdeps/ieee754/bits/nan.h10
-rw-r--r--libc/sysdeps/ieee754/dbl-64/e_j0.c6
-rw-r--r--libc/sysdeps/ieee754/dbl-64/e_j1.c6
-rw-r--r--libc/sysdeps/ieee754/dbl-64/mpa.c4
-rw-r--r--libc/sysdeps/ieee754/dbl-64/slowexp.c12
-rw-r--r--libc/sysdeps/ieee754/dbl-64/slowpow.c17
-rw-r--r--libc/sysdeps/ieee754/ldbl-128/e_j0l.c68
-rw-r--r--libc/sysdeps/ieee754/ldbl-128/e_j1l.c69
-rw-r--r--libc/sysdeps/ieee754/ldbl-128ibm/e_acoshl.c2
-rw-r--r--libc/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h10
-rw-r--r--libc/sysdeps/ieee754/ldbl-96/e_j1l.c2
-rw-r--r--libc/sysdeps/init_array/crti.S13
-rw-r--r--libc/sysdeps/init_array/crtn.S13
-rw-r--r--libc/sysdeps/init_array/elf-init.c37
-rw-r--r--libc/sysdeps/init_array/gmon-start.c41
-rw-r--r--libc/sysdeps/powerpc/Implies1
-rw-r--r--libc/sysdeps/powerpc/bits/fenv.h4
-rw-r--r--libc/sysdeps/powerpc/fpu/Makefile1
-rw-r--r--libc/sysdeps/powerpc/fpu/fenv_libc.h4
-rw-r--r--libc/sysdeps/powerpc/fpu/math_ldbl.h171
-rw-r--r--libc/sysdeps/powerpc/power4/fpu/Makefile (renamed from libc/sysdeps/powerpc/powerpc32/power4/fpu/Makefile)2
-rw-r--r--libc/sysdeps/powerpc/power4/fpu/mpa.c214
-rw-r--r--libc/sysdeps/powerpc/powerpc32/power4/Implies2
-rw-r--r--libc/sysdeps/powerpc/powerpc32/power4/fpu/mpa.c837
-rw-r--r--libc/sysdeps/powerpc/powerpc32/power4/fpu/slowexp.c65
-rw-r--r--libc/sysdeps/powerpc/powerpc32/power4/fpu/slowpow.c93
-rw-r--r--libc/sysdeps/powerpc/powerpc32/power4/strncmp.S3
-rw-r--r--libc/sysdeps/powerpc/powerpc32/power7/strncmp.S3
-rw-r--r--libc/sysdeps/powerpc/powerpc32/strncmp.S3
-rw-r--r--libc/sysdeps/powerpc/powerpc64/__longjmp-common.S7
-rw-r--r--libc/sysdeps/powerpc/powerpc64/a2/memcpy.S6
-rw-r--r--libc/sysdeps/powerpc/powerpc64/bp-asm.h113
-rw-r--r--libc/sysdeps/powerpc/powerpc64/cell/memcpy.S6
-rw-r--r--libc/sysdeps/powerpc/powerpc64/memcpy.S6
-rw-r--r--libc/sysdeps/powerpc/powerpc64/memset.S44
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power4/Implies2
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power4/fpu/Makefile5
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power4/fpu/mpa.c837
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power4/fpu/slowexp.c65
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power4/fpu/slowpow.c93
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power4/memcmp.S9
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power4/memcpy.S6
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power4/memset.S44
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power4/strncmp.S9
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power6/memcpy.S6
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power6/memset.S44
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/memchr.S8
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/memcmp.S9
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/memcpy.S6
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/mempcpy.S10
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/memrchr.S8
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/memset.S12
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/rawmemchr.S6
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/strcasecmp.S8
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/strchr.S8
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/strchrnul.S6
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/strlen.S6
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/strncmp.S9
-rw-r--r--libc/sysdeps/powerpc/powerpc64/power7/strnlen.S8
-rw-r--r--libc/sysdeps/powerpc/powerpc64/setjmp-common.S19
-rw-r--r--libc/sysdeps/powerpc/powerpc64/start.S5
-rw-r--r--libc/sysdeps/powerpc/powerpc64/stpcpy.S29
-rw-r--r--libc/sysdeps/powerpc/powerpc64/strchr.S33
-rw-r--r--libc/sysdeps/powerpc/powerpc64/strcmp.S22
-rw-r--r--libc/sysdeps/powerpc/powerpc64/strcpy.S33
-rw-r--r--libc/sysdeps/powerpc/powerpc64/strlen.S14
-rw-r--r--libc/sysdeps/powerpc/powerpc64/strncmp.S9
-rw-r--r--libc/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c6
-rw-r--r--libc/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c6
-rw-r--r--libc/sysdeps/sparc/fpu/libm-test-ulps16
-rw-r--r--libc/sysdeps/unix/sysv/linux/Makefile3
-rw-r--r--libc/sysdeps/unix/sysv/linux/bits/mman-linux.h108
-rw-r--r--libc/sysdeps/unix/sysv/linux/bits/msq.h1
-rw-r--r--libc/sysdeps/unix/sysv/linux/fpathconf.c7
-rw-r--r--libc/sysdeps/unix/sysv/linux/internal_statvfs.c6
-rw-r--r--libc/sysdeps/unix/sysv/linux/ldsodefs.h6
-rw-r--r--libc/sysdeps/unix/sysv/linux/linux_fsinfo.h7
-rw-r--r--libc/sysdeps/unix/sysv/linux/pathconf.c23
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/Implies4
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h10
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/bits/mman.h73
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/bits/msq.h1
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c48
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S9
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S11
-rw-r--r--libc/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h3
-rw-r--r--libc/sysdeps/unix/sysv/linux/s390/bits/mman.h76
-rw-r--r--libc/sysdeps/unix/sysv/linux/s390/bits/msq.h1
-rw-r--r--libc/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S43
-rw-r--r--libc/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S43
-rw-r--r--libc/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S6
-rw-r--r--libc/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S43
-rw-r--r--libc/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S43
-rw-r--r--libc/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S6
-rw-r--r--libc/sysdeps/unix/sysv/linux/s390/sys/ptrace.h3
-rw-r--r--libc/sysdeps/unix/sysv/linux/s390/ucontext_i.sym2
-rw-r--r--libc/sysdeps/unix/sysv/linux/sh/bits/mman.h76
-rw-r--r--libc/sysdeps/unix/sysv/linux/sparc/bits/mman.h74
-rw-r--r--libc/sysdeps/unix/sysv/linux/sparc/bits/msq.h1
-rw-r--r--libc/sysdeps/unix/sysv/linux/sparc/sys/ptrace.h3
-rw-r--r--libc/sysdeps/unix/sysv/linux/sys/ptrace.h3
-rw-r--r--libc/sysdeps/unix/sysv/linux/times.c10
-rw-r--r--libc/sysdeps/unix/sysv/linux/x86/bits/mman.h72
-rw-r--r--libc/sysdeps/unix/sysv/linux/x86/bits/msq.h1
-rw-r--r--libc/sysdeps/unix/sysv/linux/x86_64/x32/nptl/libpthread.abilist1
-rw-r--r--libc/sysdeps/x86_64/fpu/libm-test-ulps12
-rw-r--r--libc/sysdeps/x86_64/memset.S2
-rw-r--r--libc/sysdeps/x86_64/multiarch/Makefile6
-rw-r--r--libc/sysdeps/x86_64/multiarch/bzero.S28
-rw-r--r--libc/sysdeps/x86_64/multiarch/ifunc-impl-list.c24
-rw-r--r--libc/sysdeps/x86_64/multiarch/init-arch.c11
-rw-r--r--libc/sysdeps/x86_64/multiarch/init-arch.h4
-rw-r--r--libc/sysdeps/x86_64/multiarch/memset-x86-64.S19
-rw-r--r--libc/sysdeps/x86_64/multiarch/memset.S79
-rw-r--r--libc/sysdeps/x86_64/multiarch/memset_chk.S44
-rw-r--r--libc/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S232
-rw-r--r--libc/sysdeps/x86_64/multiarch/strcat-ssse3.S316
-rw-r--r--libc/sysdeps/x86_64/multiarch/strlen-sse2-no-bsf.S685
-rw-r--r--libc/sysdeps/x86_64/multiarch/strlen-sse2-pminub.S259
-rw-r--r--libc/sysdeps/x86_64/multiarch/strlen-sse4.S84
-rw-r--r--libc/sysdeps/x86_64/multiarch/strlen.S68
-rw-r--r--libc/sysdeps/x86_64/multiarch/strnlen-sse2-no-bsf.S3
-rw-r--r--libc/sysdeps/x86_64/multiarch/strnlen.S57
-rw-r--r--libc/sysdeps/x86_64/preconfigure120
-rw-r--r--libc/sysdeps/x86_64/strcat.S1
-rw-r--r--libc/sysdeps/x86_64/strlen.S272
-rw-r--r--libc/sysdeps/x86_64/strnlen.S67
-rw-r--r--libc/timezone/zic.c6
269 files changed, 7752 insertions, 8189 deletions
diff --git a/libc/ChangeLog b/libc/ChangeLog
index bd1fb0d7e..aca9c8bba 100644
--- a/libc/ChangeLog
+++ b/libc/ChangeLog
@@ -1,3 +1,683 @@
+2013-03-18 Ondrej Bilka <neleai@seznam.cz>
+
+ * sysdeps/x86_64/strlen.S: Replace with new SSE2 based
+ implementation which is faster on all x86_64 architectures.
+ Tested on AMD, Intel Nehalem, SNB, IVB.
+ * sysdeps/x86_64/strnlen.S: Likewise.
+
+ * sysdeps/x86_64/multiarch/Makefile (sysdep_routines):
+ Remove all multiarch strlen and strnlen versions.
+ * sysdeps/x86_64/multiarch/ifunc-impl-list.c: Update.
+ Remove strlen and strnlen related parts.
+
+ * sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S: Update.
+ Inline strlen part.
+ * sysdeps/x86_64/multiarch/strcat-ssse3.S: Likewise.
+
+ * sysdeps/x86_64/multiarch/strlen.S: Remove.
+ * sysdeps/x86_64/multiarch/strlen-sse2-no-bsf.S: Likewise.
+ * sysdeps/x86_64/multiarch/strlen-sse2-pminub.S: Likewise.
+ * sysdeps/x86_64/multiarch/strlen-sse4.S: Likewise.
+ * sysdeps/x86_64/multiarch/strnlen.S: Likewise.
+ * sysdeps/x86_64/multiarch/strnlen-sse2-no-bsf.S: Likewise.
+
+2013-03-17 Carlos O'Donell <carlos@redhat.com>
+
+ * manual/memory.texi (Malloc Tunable Parameters):
+ Sort parameters alphabetically. Add comments for missing entries.
+
+2013-03-17 David S. Miller <davem@davemloft.net>
+
+ * sysdeps/sparc/fpu/libm-test-ulps: Update.
+
+2013-03-16 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #15283]
+ * sysdeps/ieee754/ldbl-96/e_j1l.c (__ieee754_y1l): Correct test
+ for arguments at most half maximum finite value.
+ * math/libm-test.inc (j0_test): Add more tests.
+ (j1_test): Likewise.
+ (y0_test): Likewise.
+ (y1_test): Likewise.
+ * sysdeps/i386/fpu/libm-test-ulps: Update.
+ * sysdeps/x86_64/fpu/libm-test-ulps: Likewise.
+
+ [BZ #14155]
+ * sysdeps/ieee754/ldbl-128/e_j0l.c (__ieee754_j0l): Do not compute
+ 1 / x and functions P and Q for arguments above 0x1p256L.
+ (__ieee754_y0l): Likewise.
+ * sysdeps/ieee754/ldbl-128/e_j1l.c (__ieee754_j1l): Likewise.
+ (__ieee754_y1l): Likewise.
+ * math/libm-test.inc (j0_test): Do not allow spurious underflows.
+ (j1_test): Likewise.
+ (y0_test): Likewise.
+ (y1_test): Likewise.
+
+2013-03-16 Thomas Schwinge <thomas@codesourcery.com>
+
+ * math/test-snan.c (TEST_FUNC): Add and use minus_sNaN_var
+ variable.
+
+2013-03-15 Roland McGrath <roland@hack.frob.com>
+
+ * elf/dl-support.c (_dl_aux_init): Ignore zero value for AT_PAGESZ.
+ (_dl_non_dynamic_init): Don't set _dl_pagesize; it will never be
+ zero since it's initialized to EXEC_PAGESIZE.
+
+ * sysdeps/unix/sysv/linux/ldsodefs.h
+ (_dl_non_dynamic_init, _dl_aux_init): Move declarations to ...
+ * sysdeps/generic/ldsodefs.h: ... here.
+
+2013-03-15 Thomas Schwinge <thomas@codesourcery.com>
+
+ * math/libm-test.inc (ldexp_test): Add missing START/END markers.
+
+ * sysdeps/powerpc/fpu/test-powerpc-snan.c: Rename to
+ math/test-snan.c.
+ * math/test-snan.c: Renamed from
+ sysdeps/powerpc/fpu/test-powerpc-snan.c.
+ * math/Makefile (tests): Add test-snan.
+ * sysdeps/powerpc/fpu/Makefile (libm-tests): Don't add
+ test-powerpc-snan.
+
+ * math/basic-test.c (TEST_FUNC): Replace NANFUNC argument with
+ SUFFIX. Initialize qNaN_var with __builtin_nan family of
+ functions.
+ (TEST_TRUNC): Add SUFFIX argument. Initialize qNaN_var with
+ __builtin_nan family of functions.
+ * math/libm-test.inc (initialize): Initialize qnan_value with
+ __builtin_nan family of functions.
+ * sysdeps/powerpc/fpu/test-powerpc-snan.c (SNANf, SNAN, SNANl):
+ Remove variables.
+ (init_signaling_nan, snan_float, snan_double, snan_ldouble):
+ Remove functions.
+ (TEST_FUNC): Add SUFFIX argument. Move sNaN_var into static
+ storage class. Initialize qNaN_var and sNaN_var with
+ __builtin_nan and __builtin_nans families of functions,
+ respectively.
+
+ * math/libm-test.inc (acosh_test): Also test with qNaN input.
+ (sqrt_test): Remove duplicate test with qNaN input.
+ (lrint_test, llrint_test, lround_test, llround_test, rint_test)
+ (round_test, signbit_test, significand_test): Note missing +/-Inf
+ as well as qNaN tests.
+
+ * math/basic-test.c (TEST_FUNC, TEST_TRUNC): Rename NaN_var to
+ qNaN_var. Fix a few strings, too.
+ * math/libm-test.inc (nan_value): Rename to qnan_value.
+ * math/gen-libm-test.pl (%beautify): Adjust to that.
+ * math/bits/mathcalls.h (nan): Refer to qNaN instead of NaN.
+ * math/test-misc.c (main): Likewise.
+ * sysdeps/ieee754/bits/nan.h (__nan_bytes, __nan_union): Rename
+ to __qnan_bytes, and __qnan_union, respectively.
+ * ports/sysdeps/mips/bits/nan.h (__nan_bytes, __nan_union):
+ Likewise.
+ * stdio-common/tstdiomisc.c (nanval, lnanval): Rename to qnanval,
+ and lqnanval, respectively.
+ * sysdeps/powerpc/bits/fenv.h: Fix usage of NaN/qNaN/sNaN.
+ * sysdeps/powerpc/fpu/fenv_libc.h: Likewise.
+ * sysdeps/powerpc/fpu/test-powerpc-snan.c (TEST_FUNC): Likewise,
+ and rename NaN_var to qNaN_var, and SNaN_var to sNaN_var.
+
+ * math/libm-test.inc (fpstack_test) [__x86_64__]: Enable test.
+ * math/test-misc.c (main) [__x86_64__]: Enable test for long
+ doubles.
+
+ * math/test-misc.c (main): Fix copy'n'pastos.
+ * misc/tst-efgcvt.c (special): Likewise.
+
+ * stdio-common/printf_fp.c (__isinfl_internal, __isnanl_internal):
+ Remove declarations.
+
+2013-03-15 Siddhesh Poyarekar <siddhesh@redhat.com>
+
+ * sysdeps/ieee754/dbl-64/mpa-arch.h: Remove.
+ * sysdeps/ieee754/dbl-64/mpa.c: Revert last change.
+ * sysdeps/ieee754/dbl-64/mpa.h: Revert last change.
+ * sysdeps/powerpc/power4/fpu/mpa-arch.h: Remove.
+
+2013-03-15 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
+
+ * sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h (VDSO_IFUNC_RET): Add
+ macro to return vdso values correctly in IFUNC implementations.
+ * sysdeps/unix/sysv/linux/powerpc/gettimeofday.c (__gettimeofday):
+ Optimization by using IFUNC.
+
+2013-03-15 Siddhesh Poyarekar <siddhesh@redhat.com>
+ Richard Henderson <rth@redhat.com>
+ Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
+
+ * Makefile.in (bench): New target.
+ * NEWS: Mention the benchmark framework.
+ * Rules (bench): Likewise.
+ (binaries-bench): Generate binaries for functions to
+ benchmark.
+ * benchtests/Makefile: New makefile for benchmark tests.
+ * benchtests/bench-skeleton.c: New skeleton file for benchmark
+ programs.
+ * benchtests/exp-inputs: New input file for EXP function.
+ * benchtests/pow-inputs: New input file for POW function.
+ * scripts/bench.pl: New script to generate source files for
+ benchmark programs.
+
+2013-03-15 Siddhesh Poyarekar <siddhesh@redhat.com>
+
+ * sysdeps/ieee754/dbl-64/mpa-arch.h: New file.
+ * sysdeps/ieee754/dbl-64/mpa.c (norm): Use MANTISSA_T to store
+ computations on mantissa. Use macros for rounding and
+ division.
+ (denorm): Likewise.
+ (__dbl_mp): Likewise.
+ (add_magnitudes): Likewise.
+ (sub_magnitudes): Likewise.
+ (__mul): Likewise.
+ (__sqr): Likewise.
+ * sysdeps/ieee754/dbl-64/mpa.h: Include mpa-arch.h. Define
+ powers of two in terms of TWOPOW macro.
+ (mp_no): Make type of mantissa as MANTISSA_T.
+ [!RADIXI]: Define RADIXI.
+ [!TWO52]: Define TWO52.
+ * sysdeps/powerpc/power4/fpu/mpa-arch.h: New file.
+
+ * manual/nptl.texi (cindex): Modify threads to pthreads.
+
+2013-03-15 Joseph Myers <joseph@codesourcery.com>
+
+ * sysdeps/x86_64/preconfigure: Regenerated.
+
+2013-03-14 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #14155]
+ * sysdeps/ieee754/dbl-64/e_j0.c (pzero): Return 1.0 for arguments
+ 0x1p28 and above.
+ (qzero): Return -0.125 / x for arguments 0x1p28 and above.
+ * sysdeps/ieee754/dbl-64/e_j1.c (pzero): Return 1.0 for arguments
+ 0x1p28 and above.
+ (qzero): Return 0.375 / x for arguments 0x1p28 and above.
+ * math/libm-test.inc (j0_test): Do not allow one spurious
+ underflow exception.
+ (y1_test): Likewise.
+
+2013-03-14 Siddhesh Poyarekar <siddhesh@redhat.com>
+
+ * manual/Makefile (chapters): Add nptl.
+ * manual/debug.texi (Debugging Support): Add link to Threads
+ chapter.
+ * manual/nptl.texi: New file.
+
+ * sysdeps/unix/sysv/linux/times.c (__times): Fix formatting.
+
+2013-03-14 Petr Baudis <pasky@ucw.cz>
+
+ * sysdeps/unix/sysv/linux/times.c (__times): On EFAULT, test
+ for non-NULL pointer before the memory validity test. Pointed
+ out by Holger Brunck <holger.brunck@keymile.com>.
+
+2013-03-13 Andreas Schwab <schwab@suse.de>
+
+ * extra-lib.mk (extra-objs): Add static-only-routines as .oS
+ instead of .os.
+
+2013-03-13 Joseph Myers <joseph@codesourcery.com>
+
+ * timezone/zic.c: Update from tzcode 2013b.
+
+2013-03-12 Carlos O'Donell <carlos@redhat.com>
+
+ * manual/install.texi (Configuring and compiling):
+ Mention i686 and i586.
+ * INSTALL: Regenerate.
+
+2013-03-12 Roland McGrath <roland@hack.frob.com>
+
+ * sysdeps/init_array/elf-init.c: New file.
+ * csu/elf-init.c
+ (__libc_csu_init) [!NO_INITFINI]: Conditionalize _init call on this.
+ (__libc_csu_fini) [!NO_INITFINI]: Conditionalize _fini call on this.
+
+ * csu/gmon-start.c [GMON_START_ARRAY_SECTION]: Don't define
+ __gmon_start__ as global, but as static with a .preinit_array pointer.
+ * sysdeps/init_array/gmon-start.c: New file. Use that.
+ * sysdeps/init_array/crti.S: New file, empty except for comments.
+ * sysdeps/init_array/crtn.S: Likewise.
+
+2013-03-11 Ondřej Bílka <neleai@seznam.cz>
+
+ * sysdeps/x86_64/memset.S: Remove USE_MULTIARCH conditional for
+ definining bcopy.
+ * sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features):
+ Remove Prefer_SSE_for_memop.
+ * sysdeps/x86_64/multiarch/init-arch.h: Remove
+ bit_Prefer_SSE_for_memop, index_Prefer_SSE_for_memop,
+ HAS_PREFER_SSE_FOR_MEMOP.
+ * sysdeps/x86_64/multiarch/Makefile (sysdep_routines): Remove
+ memset-x86-64.
+ * sysdeps/x86_64/multiarch/ifunc-impl-list.c (__libc_ifunc_impl_list):
+ Remove bzero, memset ifunc support.
+ * sysdeps/x86_64/multiarch/bzero.S: Remove file.
+ * sysdeps/x86_64/multiarch/memset-x86-64.S: Likewise.
+ * sysdeps/x86_64/multiarch/memset.S: Likewise.
+ * sysdeps/x86_64/multiarch/memset_chk.S: Likewise.
+
+2013-03-11 Andreas Schwab <schwab@suse.de>
+
+ [BZ #15234]
+ * Versions.def (libpthread): Add GLIBC_2.3, so that it can be used
+ by SHLIB_COMPAT.
+ * sysdeps/unix/sysv/linux/x86_64/x32/nptl/libpthread.abilist
+ (GLIBC_2.16): Remove pthread_atfork.
+
+2013-03-08 Paul Pluzhnikov <ppluzhnikov@google.com>
+
+ * posix/Makefile (testcases.h): Set LC_ALL=C before sed.
+ (ptestcases.h): Likewise.
+
+2013-03-08 Roland McGrath <roland@hack.frob.com>
+
+ * Makeconfig ($(common-objpfx)config.status): Depend on
+ sysdeps/*/preconfigure{,.in} too.
+
+2013-03-08 Joseph Myers <joseph@codesourcery.com>
+
+ * malloc/malloc.h (__malloc_ptr_t): Remove macro.
+ (__free_hook): Use void * instead of __malloc_ptr_t.
+ (__malloc_hook): Likewise.
+ (__realloc_hook): Likewise.
+ (__memalign_hook): Likewise.
+ (__after_morecore_hook): Likewise.
+ * malloc/arena.c (save_malloc_hook): Likewise.
+ (save_free_hook): Likewise.
+ * malloc/hooks.c (malloc_hook_ini): Likewise.
+ (realloc_hook_ini): Likewise.
+ (memalign_hook_ini): Likewise.
+ * malloc/malloc.c (malloc_hook_ini): Likewise.
+ (realloc_hook_ini): Likewise.
+ (memalign_hook_ini): Likewise.
+ (__free_hook): Likewise.
+ (__malloc_hook): Likewise.
+ (__realloc_hook): Likewise.
+ (__memalign_hook): Likewise.
+ (__libc_malloc): Likewise.
+ (__libc_free): Likewise.
+ (__libc_realloc): Likewise.
+ (__libc_memalign): Likewise.
+ (__libc_valloc): Likewise.
+ (__libc_pvalloc): Likewise.
+ (__libc_calloc): Likewise.
+ (__posix_memalign): Likewise.
+ * malloc/morecore.c (__sbrk): Likewise.
+ (__default_morecore): Likewise.
+
+ * malloc/morecore.c (__default_morecore): Use ISO C prototype.
+
+ * malloc/malloc.h (__malloc_ptrdiff_t): Remove macro.
+ * malloc/morecore.c (__default_morecore): Use ptrdiff_t instead of
+ __malloc_ptrdiff_t.
+
+ * malloc/malloc.h (__malloc_size_t): Remove macro.
+ * malloc/mcheck.c (old_malloc_hook): Use size_t instead of
+ __malloc_size_t.
+ (old_memalign_hook): Likewise.
+ (old_realloc_hook): Likewise.
+ (struct hdr): Likewise.
+ (flood): Likewise.
+ (mallochook): Likewise.
+ (memalignhook): Likewise.
+ (reallochook): Likewise.
+ * malloc/mtrace.c (tr_old_malloc_hook): Likewise.
+ (tr_old_realloc_hook): Likewise.
+ (tr_old_memalign_hook): Likewise.
+ (tr_mallochook): Likewise.
+ (tr_reallochook): Likewise.
+ (tr_memalignhook): Likewise.
+
+2013-03-08 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
+
+ * sysdeps/ieee754/ldbl-128ibm/math_ldbl.h (ldbl_pack): Rename to
+ default_ldbl_pack and using as default implementation.
+ (ldbl_unpack): Rename to default_ldbl_unpack and using as default
+ implementation.
+ * sysdeps/powerpc/fpu/math_ldbl.h (ldbl_extract_mantissa): Remove
+ redundant definition.
+ (ldbl_insert_mantissa): Likewise.
+ (ldbl_canonicalize): Likewise.
+ (ldbl_nearbyint): Likewise.
+ (ldbl_pack): Rename to ldbl_pack_ppc.
+ (ldbl_unpack): Rename to ldbl_unpack_ppc.
+ * sysdeps/unix/sysv/linux/powerpc/Implies: Remove file.
+ * sysdeps/powerpc/Implies: Add ieee754/ldbl-opt after ieee754/ldbl-128ibm.
+
+2013-03-08 Siddhesh Poyarekar <siddhesh@redhat.com>
+
+ * sysdeps/powerpc/powerpc32/power4/fpu/mpa.c: Move file...
+ * sysdeps/powerpc/power4/fpu/mpa.c: ... here.
+ * sysdeps/powerpc/powerpc32/power4/fpu/Makefile: Move file...
+ * sysdeps/powerpc/power4/fpu/Makefile: ... here.
+ * sysdeps/powerpc/powerpc64/power4/fpu/mpa.c: Remove file.
+ * sysdeps/powerpc/powerpc64/power4/fpu/Makefile: Remove file.
+ * sysdeps/powerpc/powerpc32/power4/Implies: New file.
+ * sysdeps/powerpc/powerpc64/power4/Implies: New file.
+
+2013-03-07 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add
+ bits/mman-linux.h.
+
+2013-03-07 Siddhesh Poyarekar <siddhesh@redhat.com>
+
+ * sysdeps/ieee754/dbl-64/slowexp.c [!USE_LONG_DOUBLE_FOR_MP]:
+ Include mpa.h and declare __MPEXP.
+ [USE_LONG_DOUBLE_FOR_MP] (__slowexp): Call __IEEE754_EXPL.
+ * sysdeps/powerpc/powerpc32/power4/fpu/Makefile
+ (CPPFLAGS-slowexp.c): Define USE_LONG_DOUBLE_FOR_MP.
+ * sysdeps/powerpc/powerpc32/power4/fpu/slowexp.c: Remove.
+ * sysdeps/powerpc/powerpc64/power4/fpu/Makefile
+ (CPPFLAGS-slowexp.c): Define USE_LONG_DOUBLE_FOR_MP.
+ * sysdeps/powerpc/powerpc64/power4/fpu/slowexp.c: Remove.
+
+ * sysdeps/ieee754/dbl-64/slowpow.c [USE_LONG_DOUBLE_FOR_MP]
+ (__slowpow): Use long double EXPL and LOGL functions to
+ compute POW.
+ * sysdeps/powerpc/powerpc32/power4/fpu/Makefile
+ (CPPFLAGS-slowpow.c): Define USE_LONG_DOUBLE_FOR_MP.
+ * sysdeps/powerpc/powerpc32/power4/fpu/slowpow.c: Remove.
+ * sysdeps/powerpc/powerpc64/power4/fpu/Makefile
+ (CPPFLAGS-slowpow.c): Define USE_LONG_DOUBLE_FOR_MP.
+ * sysdeps/powerpc/powerpc64/power4/fpu/slowpow.c: Remove.
+
+ * sysdeps/powerpc/powerpc32/power4/fpu/mpa.c (__mul): Use
+ intermediate variable to calculate exponent.
+ (__sqr): Likewise.
+ * sysdeps/powerpc/powerpc64/power4/fpu/mpa.c (__mul):
+ Likewise.
+ (__sqr): Likewise.
+
+ * sysdeps/ieee754/dbl-64/mpa.c [!NO__MUL]: Define __mul.
+ [!NO__SQR]: Define __sqr.
+ * sysdeps/powerpc/powerpc32/power4/fpu/mpa.c: define NO__MUL
+ and NO__SQR. Remove all code except __mul and __sqr. Include
+ sysdeps/ieee754/dbl-64/mpa.c.
+ * sysdeps/powerpc/powerpc64/power4/fpu/mpa.c: Likewise.
+
+ [BZ #12723]
+ * posix/Makefile (tests): Add tst-pathconf.
+ * posix/tst-pathconf.c: New test case.
+ * sysdeps/unix/sysv/linux/fpathconf.c (__fpathconf): Remove
+ _PC_PIPE_BUF.
+ * sysdeps/unix/sysv/linux/pathconf.c (__pathconf): Likewise.
+
+2013-03-06 Patsy Franklin <pfrankli@redhat.com>
+
+ * io/fcntl.h: Added a comment about AT_EACCESS and AT_REMOVEDIR.
+
+2013-03-06 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/bits/mman-linux.h (MAP_ANONYMOUS): Allow
+ definition via __MAP_ANONYMOUS.
+
+ * sysdeps/unix/sysv/linux/s390/bits/mman.h (MAP_GROWSUP): Remove,
+ it's not part of Linux headers.
+
+ * sysdeps/unix/sysv/linux/bits/mman-linux.h (MAP_HUGE_SHIFT): Define.
+ (MAP_HUGE_MASK): Define.
+
+ * sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h (PTRACE_O_EXIT_KILL):
+ Define.
+ (PTRACE_O_MASK): Adjust for PTRACE_O_EXITKILL.
+ * sysdeps/unix/sysv/linux/s390/sys/ptrace.h (PTRACE_O_EXIT_KILL):
+ Define.
+ (PTRACE_O_MASK): Adjust for PTRACE_O_EXITKILL.
+ * sysdeps/unix/sysv/linux/sys/ptrace.h (PTRACE_O_EXIT_KILL):
+ Define.
+ (PTRACE_O_MASK): Adjust for PTRACE_O_EXITKILL.
+ * sysdeps/unix/sysv/linux/sparc/sys/ptrace.h (PTRACE_O_EXITKILL):
+ Define.
+ (PTRACE_O_MASK): Adjust for PTRACE_O_EXITKILL.
+
+ * sysdeps/unix/sysv/linux/x86/bits/msq.h (MSG_COPY): Likewise.
+ * sysdeps/unix/sysv/linux/generic/bits/msq.h (MSG_COPY): Define.
+ * sysdeps/unix/sysv/linux/powerpc/bits/msq.h (MSG_COPY): Likewise.
+ * sysdeps/unix/sysv/linux/bits/msq.h (MSG_COPY): Likewise.
+ * sysdeps/unix/sysv/linux/s390/bits/msq.h (MSG_COPY): Likewise.
+ * sysdeps/unix/sysv/linux/sparc/bits/msq.h (MSG_COPY): Define.
+
+ * sysdeps/unix/sysv/linux/pathconf.c (__statfs_filesize_max):
+ Handle f2fs.
+
+ * sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags):
+ Handle f2fs and efivarfs.
+
+ * sysdeps/unix/sysv/linux/pathconf.c (__statfs_link_max): Handle
+ f2fs.
+
+ * sysdeps/unix/sysv/linux/linux_fsinfo.h (F2FS_SUPER_MAGIC): Add.
+ (EFIVARFS_MAGIC): Add.
+ (F2FS_LINK_MAX): Add.
+
+2013-03-06 Paul Pluzhnikov <ppluzhnikov@google.com>
+
+ * stdio-common/vfprintf.c: Replace __builtin_expect with
+ __glibc_unlikely.
+
+2013-03-06 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #13550]
+ * sysdeps/generic/bp-sym.h: Remove file.
+ * sysdeps/powerpc/powerpc64/bp-asm.h: Likewise.
+ * sysdeps/powerpc/powerpc64/__longjmp-common.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__longjmp): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/a2/memcpy.S: Don't include <bp-sym.h>
+ and <bp-asm.h>.
+ (memcpy): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/cell/memcpy.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (memcpy): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/memcpy.S: Don't include <bp-sym.h> and
+ <bp-asm.h>.
+ (memcpy): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/memset.S: Don't include <bp-sym.h> and
+ <bp-asm.h>.
+ (memset): Don't use BP_SYM.
+ (memset) [__BOUNDED_POINTERS__]: Remove conditional code.
+ (memset) [!__BOUNDED_POINTERS__]: Make code unconditional.
+ (__bzero): Don't use BP_SYM.
+ (__bzero) [__BOUNDED_POINTERS__]: Remove conditional code.
+ (__bzero) [!__BOUNDED_POINTERS__]: Make code unconditional.
+ * sysdeps/powerpc/powerpc64/power4/memcmp.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (memcmp): Don't use BP_SYM. Remove comment about bounded
+ pointers.
+ * sysdeps/powerpc/powerpc64/power4/memcpy.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (memcpy): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power4/memset.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (memset): Don't use BP_SYM.
+ (memset) [__BOUNDED_POINTERS__]: Remove conditional code.
+ (memset) [!__BOUNDED_POINTERS__]: Make code unconditional.
+ (__bzero): Don't use BP_SYM.
+ (__bzero) [__BOUNDED_POINTERS__]: Remove conditional code.
+ (__bzero) [!__BOUNDED_POINTERS__]: Make code unconditional.
+ * sysdeps/powerpc/powerpc64/power4/strncmp.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (strncmp): Don't use BP_SYM. Remove comment about bounded
+ pointers.
+ * sysdeps/powerpc/powerpc64/power6/memcpy.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (memcpy): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power6/memset.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (memset): Don't use BP_SYM.
+ (memset) [__BOUNDED_POINTERS__]: Remove conditional code.
+ (memset) [!__BOUNDED_POINTERS__]: Make code unconditional.
+ (__bzero): Don't use BP_SYM.
+ (__bzero) [__BOUNDED_POINTERS__]: Remove conditional code.
+ (__bzero) [!__BOUNDED_POINTERS__]: Make code unconditional.
+ * sysdeps/powerpc/powerpc64/power7/memchr.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__memchr): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power7/memcmp.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (memcmp): Don't use BP_SYM. Remove comment about bounded
+ pointers.
+ * sysdeps/powerpc/powerpc64/power7/memcpy.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (memcpy): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power7/mempcpy.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__mempcpy): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power7/memrchr.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__memrchr): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power7/memset.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (memset): Don't use BP_SYM.
+ (__bzero): Likewise.
+ * sysdeps/powerpc/powerpc64/power7/rawmemchr.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__rawmemchr): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power7/strcasecmp.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__STRCMP): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power7/strchr.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (strchr): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power7/strchrnul.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__strchrnul): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power7/strlen.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (strlen): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/power7/strncmp.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (strncmp): Don't use BP_SYM. Remove comment about bounded
+ pointers.
+ * sysdeps/powerpc/powerpc64/power7/strnlen.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__strnlen): Don't use BP_SYM.
+ * sysdeps/powerpc/powerpc64/setjmp-common.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__GI__setjmp): Don't use BP_SYM.
+ (_setjmp): Likewise.
+ (__sigsetjmp): Likewise.
+ * sysdeps/powerpc/powerpc64/start.S: Don't include "bp-sym.h".
+ (L(start_addresses)): Don't use BP_SYM.
+ (_start): Likewise.
+ * sysdeps/powerpc/powerpc64/stpcpy.S: Don't include <bp-sym.h> and
+ <bp-asm.h>.
+ (__stpcpy): Don't use BP_SYM, CHECK_BOUNDS_LOW,
+ STORE_RETURN_BOUNDS, CHECK_BOUNDS_HIGH and STORE_RETURN_VALUE.
+ (__stpcpy) [__BOUNDED_POINTERS__]: Remove conditional code.
+ (__stpcpy) [!__BOUNDED_POINTERS__]: Make code unconditional.
+ * sysdeps/powerpc/powerpc64/strchr.S: Don't include <bp-sym.h> and
+ <bp-asm.h>.
+ (strchr): Don't use BP_SYM, CHECK_BOUNDS_LOW, STORE_RETURN_BOUNDS,
+ CHECK_BOUNDS_HIGH_RTN and STORE_RETURN_VALUE. Remove comment
+ about bounded pointers.
+ (strchr) [__BOUNDED_POINTERS__]: Remove conditional code.
+ (strchr) [!__BOUNDED_POINTERS__]: Make code unconditional.
+ * sysdeps/powerpc/powerpc64/strcmp.S: Don't include <bp-sym.h> and
+ <bp-asm.h>.
+ (strcmp): Don't use BP_SYM and CHECK_BOUNDS_LOW. Remove comment
+ about bounded pointers. Remove GKM FIXME comments.
+ (strcmp) [__BOUNDED_POINTERS__]: Remove conditional code.
+ * sysdeps/powerpc/powerpc64/strcpy.S: Don't include <bp-sym.h> and
+ <bp-asm.h>.
+ (strcpy): Don't use BP_SYM, CHECK_BOUNDS_LOW and
+ STORE_RETURN_BOUNDS. Remove comment about bounded pointers.
+ Remove GKM FIXME comments.
+ (strcpy) [__BOUNDED_POINTERS__]: Remove conditional code.
+ (strcpy) [!__BOUNDED_POINTERS__]: Make code unconditional.
+ * sysdeps/powerpc/powerpc64/strlen.S: Don't include <bp-sym.h> and
+ <bp-asm.h>.
+ (strlen): Don't use BP_SYM and CHECK_BOUNDS_LOW. Remove comment
+ about bounded pointers. Remove GKM FIXME comment.
+ * sysdeps/powerpc/powerpc64/strncmp.S: Don't include <bp-sym.h>
+ and <bp-asm.h>.
+ (strncmp): Don't use BP_SYM. Remove comment about bounded
+ pointers.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__brk): Don't use BP_SYM and DISCARD_BOUNDS.
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S: Don't include
+ <bp-sym.h> and <bp-asm.h>.
+ (__clone): Don't use BP_SYM and DISCARD_BOUNDS. Remove GKM FIXME
+ comment.
+
+2013-03-05 Paul Pluzhnikov <ppluzhnikov@google.com>
+
+ * stdio-common/vfprintf.c (vfprintf): Check malloc return; don't
+ call free(NULL).
+
+2013-03-05 David S. Miller <davem@davemloft.net>
+
+ * po/es.po: Update from translation team.
+
+2013-03-05 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/s390/bits/mman.h: Include
+ <bits/mman-linux.h>.
+ (MCL_CURRENT, MCL_FUTURE): Do not define here, the generic value
+ is fine.
+ * sysdeps/unix/sysv/linux/sh/bits/mman.h: Move include of
+ <bits/mman-linux.h> to end of file.
+ (MCL_CURRENT, MCL_FUTURE): Do not define here, the generic value
+ is fine.
+ * sysdeps/unix/sysv/linux/x86/bits/mman.h: Move include of
+ <bits/mman-linux.h> to end of file.
+ (MCL_CURRENT, MCL_FUTURE): Do not define here, the generic value
+ is fine.
+ * sysdeps/unix/sysv/linux/sparc/bits/mman.h: Move include of
+ <bits/mman-linux.h> to end of file.
+
+ * sysdeps/unix/sysv/linux/bits/mman-linux.h [!MCL_CURRENT]
+ (MCL_CURRENT, MCL_FUTURE): Define here.
+
+2013-03-05 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
+
+ [BZ #15232]
+ * sysdeps/s390/s390-32/multiarch/ifunc-resolve.c: Use
+ attribute_hidden.
+ * sysdeps/s390/s390-64/multiarch/ifunc-resolve.c: Likewise.
+
+2013-03-05 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
+
+ * sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S: Set the
+ fourth parameter needed for rt_sigprocmask syscall.
+ * sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S:
+ * sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S: Likewise.
+ * sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S: Likewise.
+ * sysdeps/unix/sysv/linux/s390/ucontext_i.sym: Define _NSIG8.
+
+2013-03-04 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #13550]
+ * sysdeps/powerpc/powerpc32/power4/strncmp.S (strncmp): Remove
+ comment about bounded pointers.
+ * sysdeps/powerpc/powerpc32/power7/strncmp.S (strncmp): Likewise.
+ * sysdeps/powerpc/powerpc32/strncmp.S (strncmp): Likewise.
+
+2013-03-04 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/bits/mman-linux.h: New file, with Linux
+ common definitions.
+
+ * sysdeps/unix/sysv/linux/sh/bits/mman.h: Remove all defines
+ provided by bits/mman-linux.h and include <bits/mman-linux.h>.
+ * sysdeps/unix/sysv/linux/x86/bits/mman.h: Likewise.
+ * sysdeps/unix/sysv/linux/s390/bits/mman.h: Likewise.
+ * sysdeps/unix/sysv/linux/powerpc/bits/mman.h: Likewise.
+ * sysdeps/unix/sysv/linux/sparc/bits/mman.h: Likewise.
+
+2013-03-04 Adhemerval Zanella <azanella@linux.vnet.ibm.com>
+
+ [BZ #15055]
+ * sysdeps/ieee754/ldbl-128ibm/e_acoshl.c (__ieee754_acoshl): Use
+ __ieee754_sqrl instead of __sqrl.
+
2013-03-01 Joseph Myers <joseph@codesourcery.com>
* sysdeps/powerpc/fpu/fpu_control.h: Move to ...
diff --git a/libc/INSTALL b/libc/INSTALL
index 6bc6a4d4a..6088275a1 100644
--- a/libc/INSTALL
+++ b/libc/INSTALL
@@ -140,6 +140,11 @@ will be used, and CFLAGS sets optimization options for the compiler.
this can be prevented though there generally is no reason since it
creates compatibility problems.
+`--enable-hardcoded-path-in-tests'
+ By default, dynamic tests are linked to run with the installed C
+ library. This option hardcodes the newly built C library path in
+ dynamic tests so that they can be invoked directly.
+
`--build=BUILD-SYSTEM'
`--host=HOST-SYSTEM'
These options are for cross-compiling. If you specify both
@@ -153,9 +158,9 @@ will be used, and CFLAGS sets optimization options for the compiler.
native compile but use what you specify instead of guessing what
your system is. This is most useful to change the CPU submodel.
For example, if `configure' guesses your machine as
- `i586-pc-linux-gnu' but you want to compile a library for 386es,
- give `--host=i386-pc-linux-gnu' or just `--host=i386-linux' and add
- the appropriate compiler flags (`-mcpu=i386' will do the trick) to
+ `i686-pc-linux-gnu' but you want to compile a library for 586es,
+ give `--host=i586-pc-linux-gnu' or just `--host=i586-linux' and add
+ the appropriate compiler flags (`-mcpu=i586' will do the trick) to
CFLAGS.
If you specify just `--build', `configure' will get confused.
diff --git a/libc/Makeconfig b/libc/Makeconfig
index c8149ecbb..33f7d11b2 100644
--- a/libc/Makeconfig
+++ b/libc/Makeconfig
@@ -90,10 +90,14 @@ $(common-objpfx)config.status: $(..)version.h $(..)configure \
$(firstword $(wildcard \
$(addprefix $(dir)/,configure configure.in))))) \
$(patsubst %.in,%,\
+ $(wildcard $(..)sysdeps/*/preconfigure $(..)sysdeps/*/preconfigure.in)) \
+ $(patsubst %.in,%,\
$(foreach add-on,$(add-ons),\
$(firstword $(wildcard \
$(addprefix $(firstword $(filter /%,$(add-on)) $(..)$(add-on))/,\
- configure configure.in)))))
+ configure configure.in))) \
+ $(wildcard $(addprefix $(firstword $(filter /%,$(add-on)) $(..)$(add-on))/,\
+ sysdeps/*/preconfigure sysdeps/*/preconfigure.in))))
@cd $(@D); if test -f $(@F); then exec $(SHELL) $(@F) --recheck; else \
echo The GNU C library has not been configured. >&2; \
echo Run \`configure\' to configure it before building. >&2; \
diff --git a/libc/Makefile.in b/libc/Makefile.in
index d73a78f8e..df75b8f0c 100644
--- a/libc/Makefile.in
+++ b/libc/Makefile.in
@@ -3,7 +3,7 @@ srcdir = @srcdir@
# Uncomment the line below if you want to do parallel build.
# PARALLELMFLAGS = -j 4
-.PHONY: all install
+.PHONY: all install bench
all .DEFAULT:
$(MAKE) -r PARALLELMFLAGS="$(PARALLELMFLAGS)" -C $(srcdir) objdir=`pwd` $@
@@ -11,3 +11,6 @@ all .DEFAULT:
install:
LANGUAGE=C LC_ALL=C; export LANGUAGE LC_ALL; \
$(MAKE) -r PARALLELMFLAGS="$(PARALLELMFLAGS)" -C $(srcdir) objdir=`pwd` $@
+
+bench:
+ $(MAKE) -C $(srcdir)/benchtests $(PARALLELMFLAGS) objdir=`pwd` $@
diff --git a/libc/NEWS b/libc/NEWS
index c5e38b3f6..a02bf162f 100644
--- a/libc/NEWS
+++ b/libc/NEWS
@@ -9,9 +9,9 @@ Version 2.18
* The following bugs are resolved with this release:
- 11561, 13951, 14142, 14200, 14317, 14327, 14496, 14920, 14964, 14981,
- 14982, 14985, 14994, 14996, 15003, 15006, 15020, 15023, 15036, 15054,
- 15062, 15078, 15160.
+ 11561, 12723, 13550, 13951, 14142, 14200, 14317, 14327, 14496, 14920,
+ 14964, 14981, 14982, 14985, 14994, 14996, 15003, 15006, 15020, 15023,
+ 15036, 15054, 15055, 15062, 15078, 15160, 15232, 15234, 15283.
* Add support for calling C++11 thread_local object destructors on thread
and program exit. This needs compiler support for offloading C++11
@@ -23,6 +23,8 @@ Version 2.18
* Support for priority inherited mutexes in pthread condition variables on
non-x86 architectures.
+* Added a benchmark framework to track performance of functions in glibc.
+
Version 2.17
@@ -122,23 +124,23 @@ Version 2.16
4822, 5077, 5461, 5805, 5993, 6471, 6486, 6578, 6649, 6730, 6770, 6794,
6884, 6890, 6894, 6895, 6907, 6911, 6959, 7064, 9739, 9902, 10110, 10135,
10140, 10153, 10210, 10254, 10346, 10375, 10545, 10716, 10846, 11174,
- 11322, 11365, 11451, 11494, 11521, 11677, 11837, 11959, 12047, 12097,
- 12193, 12194, 12297, 12298, 12301, 12340, 12354, 12416, 12495, 13058,
- 13223, 13361, 13525, 13526, 13527, 13528, 13529, 13530, 13531, 13532,
- 13533, 13547, 13551, 13552, 13553, 13555, 13556, 13559, 13563, 13566,
- 13576, 13579, 13583, 13592, 13594, 13613, 13618, 13637, 13656, 13658,
- 13673, 13691, 13695, 13704, 13705, 13706, 13718, 13726, 13738, 13739,
- 13743, 13750, 13758, 13760, 13761, 13775, 13786, 13787, 13792, 13806,
- 13824, 13840, 13841, 13844, 13846, 13848, 13851, 13852, 13854, 13871,
- 13872, 13873, 13879, 13882, 13883, 13884, 13885, 13886, 13892, 13895,
- 13908, 13910, 13911, 13912, 13913, 13914, 13915, 13916, 13917, 13918,
- 13919, 13920, 13921, 13922, 13923, 13924, 13926, 13927, 13928, 13938,
- 13941, 13942, 13954, 13955, 13956, 13963, 13967, 13968, 13970, 13973,
- 13979, 13983, 13986, 13996, 14012, 14027, 14033, 14034, 14036, 14040,
- 14043, 14044, 14048, 14049, 14050, 14053, 14055, 14059, 14064, 14075,
- 14080, 14083, 14103, 14104, 14109, 14112, 14117, 14122, 14123, 14134,
- 14153, 14183, 14188, 14199, 14210, 14218, 14229, 14241, 14273, 14277,
- 14278.
+ 11261, 11322, 11365, 11451, 11494, 11521, 11677, 11837, 11959, 12047,
+ 12097, 12193, 12194, 12297, 12298, 12301, 12340, 12354, 12416, 12495,
+ 13058, 13223, 13361, 13525, 13526, 13527, 13528, 13529, 13530, 13531,
+ 13532, 13533, 13547, 13551, 13552, 13553, 13555, 13556, 13559, 13563,
+ 13566, 13576, 13579, 13583, 13592, 13594, 13613, 13618, 13637, 13656,
+ 13658, 13673, 13691, 13695, 13704, 13705, 13706, 13718, 13726, 13738,
+ 13739, 13743, 13750, 13758, 13760, 13761, 13775, 13786, 13787, 13792,
+ 13806, 13824, 13840, 13841, 13844, 13846, 13848, 13851, 13852, 13854,
+ 13871, 13872, 13873, 13879, 13882, 13883, 13884, 13885, 13886, 13892,
+ 13895, 13908, 13910, 13911, 13912, 13913, 13914, 13915, 13916, 13917,
+ 13918, 13919, 13920, 13921, 13922, 13923, 13924, 13926, 13927, 13928,
+ 13938, 13941, 13942, 13954, 13955, 13956, 13963, 13967, 13968, 13970,
+ 13973, 13979, 13983, 13986, 13996, 14012, 14027, 14033, 14034, 14036,
+ 14040, 14043, 14044, 14048, 14049, 14050, 14053, 14055, 14059, 14064,
+ 14075, 14080, 14083, 14103, 14104, 14109, 14112, 14117, 14122, 14123,
+ 14134, 14153, 14183, 14188, 14199, 14210, 14218, 14229, 14241, 14273,
+ 14277, 14278.
* Support for the x32 ABI on x86-64 added. The x32 target is selected by
configuring glibc with:
diff --git a/libc/Rules b/libc/Rules
index 301a74818..bc5dacd2f 100644
--- a/libc/Rules
+++ b/libc/Rules
@@ -83,7 +83,7 @@ common-generated += dummy.o dummy.c
# This makes all the auxiliary and test programs.
-.PHONY: others tests
+.PHONY: others tests bench
ifeq ($(multi-arch),no)
tests := $(filter-out $(tests-ifunc), $(tests))
xtests := $(filter-out $(xtests-ifunc), $(xtests))
@@ -188,6 +188,31 @@ $(objpfx)%.out: /dev/null $(objpfx)% # Make it 2nd arg for canned sequence.
$(make-test-out) > $@
endif # tests
+
+# Build and run benchmark programs.
+binaries-bench := $(addprefix $(objpfx)bench-,$(bench))
+
+run-bench = $(test-wrapper-env) \
+ GCONV_PATH=$(common-objpfx)iconvdata LC_ALL=C \
+ $($*-ENV) $(run-via-rtld-prefix) $${run}
+
+bench: $(binaries-bench)
+ if [ -f $(objpfx)bench.out ]; then \
+ mv -f $(objpfx)bench.out $(objpfx)bench.out.old; \
+ fi
+ for run in $^; do \
+ eval $(run-bench) >> $(objpfx)bench.out; \
+ done
+
+$(binaries-bench): %: %.o \
+ $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \
+ $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit)
+ $(+link)
+
+$(objpfx)bench-%.c: %-inputs bench-skeleton.c
+ $(..)scripts/bench.pl $(patsubst %-inputs,%,$<) \
+ $($*-ITER) $($*-ARGLIST) $($*-RET) > $@
+
.PHONY: distclean realclean subdir_distclean subdir_realclean \
subdir_clean subdir_mostlyclean subdir_testclean
diff --git a/libc/Versions.def b/libc/Versions.def
index 8651992a1..7c7d1f89d 100644
--- a/libc/Versions.def
+++ b/libc/Versions.def
@@ -93,6 +93,7 @@ libpthread {
GLIBC_2.2
GLIBC_2.2.3
GLIBC_2.2.6
+ GLIBC_2.3
GLIBC_2.3.2
GLIBC_2.3.3
GLIBC_2.3.4
diff --git a/libc/benchtests/Makefile b/libc/benchtests/Makefile
new file mode 100644
index 000000000..74938b925
--- /dev/null
+++ b/libc/benchtests/Makefile
@@ -0,0 +1,59 @@
+# Copyright (C) 2013 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, see
+# <http://www.gnu.org/licenses/>.
+
+
+# Makefile for benchmark tests. The only useful target here is `bench`.
+
+# Adding a new function `foo`:
+# ---------------------------
+
+# - Append the function name to the bench variable
+
+# - Define foo-ITER with the number of iterations you want to run. Keep it
+# high enough that the overhead of clock_gettime is only a small fraction of
+# the total run time of the test.
+
+# - Define foo-ARGLIST as a colon separated list of types of the input
+# arguments. Use `void` if function does not take any inputs. Put in quotes
+# if the input argument is a pointer, e.g.:
+
+# malloc-ARGLIST: "void *"
+
+# - Define foo-RET as the type the function returns. Skip if the function
+# returns void. One could even skip foo-ARGLIST if the function does not
+# take any inputs AND the function returns void.
+
+
+# - Make a file called `foo-inputs` with one input value per line, an input
+# being a comma separated list of arguments to be passed into the function.
+# See pow-inputs for an example.
+
+subdir := benchtests
+bench := exp pow
+
+exp-ITER = 100000
+exp-ARGLIST = double
+exp-RET = double
+LDFLAGS-bench-exp = -lm
+
+pow-ITER = 100000
+pow-ARGLIST = double:double
+pow-RET = double
+LDFLAGS-bench-pow = -lm
+
+include ../Makeconfig
+include ../Rules
diff --git a/libc/benchtests/bench-skeleton.c b/libc/benchtests/bench-skeleton.c
new file mode 100644
index 000000000..13f986d81
--- /dev/null
+++ b/libc/benchtests/bench-skeleton.c
@@ -0,0 +1,75 @@
+/* Skeleton for benchmark programs.
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <string.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <time.h>
+#include <inttypes.h>
+
+int
+main (int argc, char **argv)
+{
+ unsigned long i, j, k;
+ uint64_t total = 0, max = 0, min = 0x7fffffffffffffff;
+ struct timespec start, end;
+
+ memset (&start, 0, sizeof (start));
+ memset (&end, 0, sizeof (end));
+
+ clock_getres (CLOCK_PROCESS_CPUTIME_ID, &start);
+
+ /* Measure 1000 times the resolution of the clock. So for a 1ns resolution
+ clock, we measure 1000 iterations of the function call at a time.
+ Measurements close to the minimum clock resolution won't make much sense,
+ but it's better than having nothing at all. */
+ unsigned long iters = 1000 * start.tv_nsec;
+ unsigned long total_iters = ITER / iters;
+
+ for (i = 0; i < NUM_SAMPLES; i++)
+ {
+ for (j = 0; j < total_iters; j ++)
+ {
+ clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &start);
+ for (k = 0; k < iters; k++)
+ BENCH_FUNC(i);
+ clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &end);
+
+ uint64_t cur = (end.tv_nsec - start.tv_nsec
+ + ((end.tv_sec - start.tv_sec)
+ * (uint64_t) 1000000000));
+
+ if (cur > max)
+ max = cur;
+
+ if (cur < min)
+ min = cur;
+
+ total += cur;
+ }
+ }
+
+ double d_total_s = total * 1e-9;
+ double d_iters = iters;
+ double d_total_i = (double)ITER * NUM_SAMPLES;
+ printf (FUNCNAME ": ITERS:%g: TOTAL:%gs, MAX:%gns, MIN:%gns, %g iter/s\n",
+ d_total_i, d_total_s, max / d_iters, min / d_iters,
+ d_total_i / d_total_s);
+
+ return 0;
+}
diff --git a/libc/benchtests/exp-inputs b/libc/benchtests/exp-inputs
new file mode 100644
index 000000000..a2086baa8
--- /dev/null
+++ b/libc/benchtests/exp-inputs
@@ -0,0 +1 @@
+708.00096423260981737257679924368858
diff --git a/libc/benchtests/pow-inputs b/libc/benchtests/pow-inputs
new file mode 100644
index 000000000..dbb1270b7
--- /dev/null
+++ b/libc/benchtests/pow-inputs
@@ -0,0 +1 @@
+1.0000000000000020, 1.5
diff --git a/libc/csu/elf-init.c b/libc/csu/elf-init.c
index 1e231c1a0..84700e6ff 100644
--- a/libc/csu/elf-init.c
+++ b/libc/csu/elf-init.c
@@ -49,10 +49,13 @@ extern void (*__fini_array_start []) (void) attribute_hidden;
extern void (*__fini_array_end []) (void) attribute_hidden;
+#ifndef NO_INITFINI
/* These function symbols are provided for the .init/.fini section entry
points automagically by the linker. */
extern void _init (void);
extern void _fini (void);
+#endif
+
/* These functions are passed to __libc_start_main by the startup code.
These get statically linked into each program. For dynamically linked
@@ -76,7 +79,9 @@ __libc_csu_init (int argc, char **argv, char **envp)
}
#endif
+#ifndef NO_INITFINI
_init ();
+#endif
const size_t size = __init_array_end - __init_array_start;
for (size_t i = 0; i < size; i++)
@@ -94,6 +99,8 @@ __libc_csu_fini (void)
while (i-- > 0)
(*__fini_array_start [i]) ();
+# ifndef NO_INITFINI
_fini ();
+# endif
#endif
}
diff --git a/libc/csu/gmon-start.c b/libc/csu/gmon-start.c
index 54495eb49..0c1832109 100644
--- a/libc/csu/gmon-start.c
+++ b/libc/csu/gmon-start.c
@@ -59,10 +59,17 @@ extern char etext[];
# endif
#endif
+#ifdef GMON_START_ARRAY_SECTION
+static void __gmon_start__ (void);
+static void (*const gmon_start_initializer) (void)
+ __attribute__ ((used, section (GMON_START_ARRAY_SECTION))) = &__gmon_start__;
+static
+#else
/* We cannot use the normal constructor mechanism to call
__gmon_start__ because gcrt1.o appears before crtbegin.o in the link.
Instead crti.o calls it specially. */
extern void __gmon_start__ (void);
+#endif
void
__gmon_start__ (void)
diff --git a/libc/elf/dl-support.c b/libc/elf/dl-support.c
index df8524530..829e9d6fd 100644
--- a/libc/elf/dl-support.c
+++ b/libc/elf/dl-support.c
@@ -201,7 +201,8 @@ _dl_aux_init (ElfW(auxv_t) *av)
switch (av->a_type)
{
case AT_PAGESZ:
- GLRO(dl_pagesize) = av->a_un.a_val;
+ if (av->a_un.a_val != 0)
+ GLRO(dl_pagesize) = av->a_un.a_val;
break;
case AT_CLKTCK:
GLRO(dl_clktck) = av->a_un.a_val;
@@ -269,9 +270,6 @@ _dl_non_dynamic_init (void)
if (HP_TIMING_AVAIL)
HP_TIMING_NOW (_dl_cpuclock_offset);
- if (!_dl_pagesize)
- _dl_pagesize = __getpagesize ();
-
_dl_verbose = *(getenv ("LD_WARN") ?: "") == '\0' ? 0 : 1;
/* Set up the data structures for the system-supplied DSO early,
diff --git a/libc/extra-lib.mk b/libc/extra-lib.mk
index d87626e11..6df4688ea 100644
--- a/libc/extra-lib.mk
+++ b/libc/extra-lib.mk
@@ -36,7 +36,12 @@ extra-objs += $(foreach o,$(filter-out .os .oS,$(object-suffixes-$(lib))),\
$($(lib)-shared-only-routines),\
$(all-$(lib)-routines))))
ifneq (,$(filter .os,$(object-suffixes-$(lib))))
-extra-objs += $(all-$(lib)-routines:%=%.os)
+extra-objs += $(patsubst %,%.os,$(filter-out $($(lib)-static-only-routines),\
+ $(all-$(lib)-routines)))
+endif
+ifneq (,$(filter .oS,$(object-suffixes-$(lib))))
+extra-objs += $(patsubst %,%.oS,$(filter $($(lib)-static-only-routines),\
+ $(all-$(lib)-routines)))
endif
alltypes-$(lib) := $(foreach o,$(object-suffixes-$(lib)),\
$(objpfx)$(patsubst %,$(libtype$o),\
diff --git a/libc/io/fcntl.h b/libc/io/fcntl.h
index 61834cef1..14ccae0d2 100644
--- a/libc/io/fcntl.h
+++ b/libc/io/fcntl.h
@@ -129,6 +129,12 @@ typedef __pid_t pid_t;
# define SEEK_END 2 /* Seek from end of file. */
#endif /* XPG */
+/* The constants AT_REMOVEDIR and AT_EACCESS have the same value. AT_EASSESS
+ is meaningful only to faccessat, while AT_REMOVEDIR is meaningful only to
+ unlinkat. The two functions do completely different things and therefore,
+ the flags can be allowed to overlap. For example, passing AT_REMOVEDIR to
+ faccessat would be undefined behavior and thus treating it equivalent to
+ AT_EACCESS is valid undefined behavior. */
#ifdef __USE_ATFILE
# define AT_FDCWD -100 /* Special value used to indicate
the *at functions should use the
diff --git a/libc/malloc/arena.c b/libc/malloc/arena.c
index 7d51a9dd1..12a48ad7b 100644
--- a/libc/malloc/arena.c
+++ b/libc/malloc/arena.c
@@ -144,11 +144,9 @@ int __malloc_initialized = -1;
/* atfork support. */
-static __malloc_ptr_t (*save_malloc_hook) (size_t __size,
- const __malloc_ptr_t);
-static void (*save_free_hook) (__malloc_ptr_t __ptr,
- const __malloc_ptr_t);
-static void* save_arena;
+static void *(*save_malloc_hook) (size_t __size, const void *);
+static void (*save_free_hook) (void *__ptr, const void *);
+static void *save_arena;
#ifdef ATFORK_MEM
ATFORK_MEM;
diff --git a/libc/malloc/hooks.c b/libc/malloc/hooks.c
index 05cc35e84..8e4a6ed03 100644
--- a/libc/malloc/hooks.c
+++ b/libc/malloc/hooks.c
@@ -25,7 +25,7 @@
initialization routine, then do the normal work. */
static void*
-malloc_hook_ini(size_t sz, const __malloc_ptr_t caller)
+malloc_hook_ini(size_t sz, const void *caller)
{
__malloc_hook = NULL;
ptmalloc_init();
@@ -33,7 +33,7 @@ malloc_hook_ini(size_t sz, const __malloc_ptr_t caller)
}
static void*
-realloc_hook_ini(void* ptr, size_t sz, const __malloc_ptr_t caller)
+realloc_hook_ini(void* ptr, size_t sz, const void *caller)
{
__malloc_hook = NULL;
__realloc_hook = NULL;
@@ -42,7 +42,7 @@ realloc_hook_ini(void* ptr, size_t sz, const __malloc_ptr_t caller)
}
static void*
-memalign_hook_ini(size_t alignment, size_t sz, const __malloc_ptr_t caller)
+memalign_hook_ini(size_t alignment, size_t sz, const void *caller)
{
__memalign_hook = NULL;
ptmalloc_init();
diff --git a/libc/malloc/malloc.c b/libc/malloc/malloc.c
index bbb035393..70b9329cc 100644
--- a/libc/malloc/malloc.c
+++ b/libc/malloc/malloc.c
@@ -1841,22 +1841,22 @@ static void malloc_consolidate(mstate);
/* Forward declarations. */
static void* malloc_hook_ini (size_t sz,
- const __malloc_ptr_t caller) __THROW;
+ const void *caller) __THROW;
static void* realloc_hook_ini (void* ptr, size_t sz,
- const __malloc_ptr_t caller) __THROW;
+ const void *caller) __THROW;
static void* memalign_hook_ini (size_t alignment, size_t sz,
- const __malloc_ptr_t caller) __THROW;
+ const void *caller) __THROW;
void weak_variable (*__malloc_initialize_hook) (void) = NULL;
-void weak_variable (*__free_hook) (__malloc_ptr_t __ptr,
- const __malloc_ptr_t) = NULL;
-__malloc_ptr_t weak_variable (*__malloc_hook)
- (size_t __size, const __malloc_ptr_t) = malloc_hook_ini;
-__malloc_ptr_t weak_variable (*__realloc_hook)
- (__malloc_ptr_t __ptr, size_t __size, const __malloc_ptr_t)
+void weak_variable (*__free_hook) (void *__ptr,
+ const void *) = NULL;
+void *weak_variable (*__malloc_hook)
+ (size_t __size, const void *) = malloc_hook_ini;
+void *weak_variable (*__realloc_hook)
+ (void *__ptr, size_t __size, const void *)
= realloc_hook_ini;
-__malloc_ptr_t weak_variable (*__memalign_hook)
- (size_t __alignment, size_t __size, const __malloc_ptr_t)
+void *weak_variable (*__memalign_hook)
+ (size_t __alignment, size_t __size, const void *)
= memalign_hook_ini;
void weak_variable (*__after_morecore_hook) (void) = NULL;
@@ -2842,7 +2842,7 @@ __libc_malloc(size_t bytes)
mstate ar_ptr;
void *victim;
- __malloc_ptr_t (*hook) (size_t, const __malloc_ptr_t)
+ void *(*hook) (size_t, const void *)
= force_reg (__malloc_hook);
if (__builtin_expect (hook != NULL, 0))
return (*hook)(bytes, RETURN_ADDRESS (0));
@@ -2873,7 +2873,7 @@ __libc_free(void* mem)
mstate ar_ptr;
mchunkptr p; /* chunk corresponding to mem */
- void (*hook) (__malloc_ptr_t, const __malloc_ptr_t)
+ void (*hook) (void *, const void *)
= force_reg (__free_hook);
if (__builtin_expect (hook != NULL, 0)) {
(*hook)(mem, RETURN_ADDRESS (0));
@@ -2912,7 +2912,7 @@ __libc_realloc(void* oldmem, size_t bytes)
void* newp; /* chunk to return */
- __malloc_ptr_t (*hook) (__malloc_ptr_t, size_t, const __malloc_ptr_t) =
+ void *(*hook) (void *, size_t, const void *) =
force_reg (__realloc_hook);
if (__builtin_expect (hook != NULL, 0))
return (*hook)(oldmem, bytes, RETURN_ADDRESS (0));
@@ -3004,7 +3004,7 @@ __libc_memalign(size_t alignment, size_t bytes)
mstate ar_ptr;
void *p;
- __malloc_ptr_t (*hook) (size_t, size_t, const __malloc_ptr_t) =
+ void *(*hook) (size_t, size_t, const void *) =
force_reg (__memalign_hook);
if (__builtin_expect (hook != NULL, 0))
return (*hook)(alignment, bytes, RETURN_ADDRESS (0));
@@ -3046,7 +3046,7 @@ __libc_valloc(size_t bytes)
size_t pagesz = GLRO(dl_pagesize);
- __malloc_ptr_t (*hook) (size_t, size_t, const __malloc_ptr_t) =
+ void *(*hook) (size_t, size_t, const void *) =
force_reg (__memalign_hook);
if (__builtin_expect (hook != NULL, 0))
return (*hook)(pagesz, bytes, RETURN_ADDRESS (0));
@@ -3082,7 +3082,7 @@ __libc_pvalloc(size_t bytes)
size_t page_mask = GLRO(dl_pagesize) - 1;
size_t rounded_bytes = (bytes + page_mask) & ~(page_mask);
- __malloc_ptr_t (*hook) (size_t, size_t, const __malloc_ptr_t) =
+ void *(*hook) (size_t, size_t, const void *) =
force_reg (__memalign_hook);
if (__builtin_expect (hook != NULL, 0))
return (*hook)(pagesz, rounded_bytes, RETURN_ADDRESS (0));
@@ -3125,7 +3125,7 @@ __libc_calloc(size_t n, size_t elem_size)
}
}
- __malloc_ptr_t (*hook) (size_t, const __malloc_ptr_t) =
+ void *(*hook) (size_t, const void *) =
force_reg (__malloc_hook);
if (__builtin_expect (hook != NULL, 0)) {
sz = bytes;
@@ -4916,7 +4916,7 @@ __posix_memalign (void **memptr, size_t alignment, size_t size)
/* Call the hook here, so that caller is posix_memalign's caller
and not posix_memalign itself. */
- __malloc_ptr_t (*hook) (size_t, size_t, const __malloc_ptr_t) =
+ void *(*hook) (size_t, size_t, const void *) =
force_reg (__memalign_hook);
if (__builtin_expect (hook != NULL, 0))
mem = (*hook)(alignment, size, RETURN_ADDRESS (0));
diff --git a/libc/malloc/malloc.h b/libc/malloc/malloc.h
index 9fe7ab26b..b8b0ca34c 100644
--- a/libc/malloc/malloc.h
+++ b/libc/malloc/malloc.h
@@ -22,11 +22,6 @@
#include <features.h>
#include <stddef.h>
#include <stdio.h>
-# define __malloc_ptr_t void *
-
-/* Used by GNU libc internals. */
-#define __malloc_size_t size_t
-#define __malloc_ptrdiff_t ptrdiff_t
#ifdef _LIBC
# define __MALLOC_HOOK_VOLATILE
@@ -153,18 +148,18 @@ extern void (*__MALLOC_HOOK_VOLATILE __malloc_initialize_hook) (void)
__MALLOC_DEPRECATED;
/* Hooks for debugging and user-defined versions. */
extern void (*__MALLOC_HOOK_VOLATILE __free_hook) (void *__ptr,
- const __malloc_ptr_t)
+ const void *)
__MALLOC_DEPRECATED;
extern void *(*__MALLOC_HOOK_VOLATILE __malloc_hook) (size_t __size,
- const __malloc_ptr_t)
+ const void *)
__MALLOC_DEPRECATED;
extern void *(*__MALLOC_HOOK_VOLATILE __realloc_hook) (void *__ptr,
size_t __size,
- const __malloc_ptr_t)
+ const void *)
__MALLOC_DEPRECATED;
extern void *(*__MALLOC_HOOK_VOLATILE __memalign_hook) (size_t __alignment,
size_t __size,
- const __malloc_ptr_t)
+ const void *)
__MALLOC_DEPRECATED;
extern void (*__MALLOC_HOOK_VOLATILE __after_morecore_hook) (void);
diff --git a/libc/malloc/mcheck.c b/libc/malloc/mcheck.c
index b6eb3b31e..2e5eadd80 100644
--- a/libc/malloc/mcheck.c
+++ b/libc/malloc/mcheck.c
@@ -29,11 +29,10 @@
/* Old hook values. */
static void (*old_free_hook) (__ptr_t ptr, const __ptr_t);
-static __ptr_t (*old_malloc_hook) (__malloc_size_t size, const __ptr_t);
-static __ptr_t (*old_memalign_hook) (__malloc_size_t alignment,
- __malloc_size_t size,
+static __ptr_t (*old_malloc_hook) (size_t size, const __ptr_t);
+static __ptr_t (*old_memalign_hook) (size_t alignment, size_t size,
const __ptr_t);
-static __ptr_t (*old_realloc_hook) (__ptr_t ptr, __malloc_size_t size,
+static __ptr_t (*old_realloc_hook) (__ptr_t ptr, size_t size,
const __ptr_t);
/* Function to call when something awful happens. */
@@ -48,7 +47,7 @@ static void (*abortfunc) (enum mcheck_status);
struct hdr
{
- __malloc_size_t size; /* Exact size requested by user. */
+ size_t size; /* Exact size requested by user. */
unsigned long int magic; /* Magic number to check header integrity. */
struct hdr *prev;
struct hdr *next;
@@ -69,12 +68,12 @@ static int pedantic;
# include <string.h>
# define flood memset
#else
-static void flood (__ptr_t, int, __malloc_size_t);
+static void flood (__ptr_t, int, size_t);
static void
flood (ptr, val, size)
__ptr_t ptr;
int val;
- __malloc_size_t size;
+ size_t size;
{
char *cp = ptr;
while (size--)
@@ -202,7 +201,7 @@ freehook (__ptr_t ptr, const __ptr_t caller)
}
static __ptr_t
-mallochook (__malloc_size_t size, const __ptr_t caller)
+mallochook (size_t size, const __ptr_t caller)
{
struct hdr *hdr;
@@ -235,11 +234,11 @@ mallochook (__malloc_size_t size, const __ptr_t caller)
}
static __ptr_t
-memalignhook (__malloc_size_t alignment, __malloc_size_t size,
+memalignhook (size_t alignment, size_t size,
const __ptr_t caller)
{
struct hdr *hdr;
- __malloc_size_t slop;
+ size_t slop;
char *block;
if (pedantic)
@@ -274,7 +273,7 @@ memalignhook (__malloc_size_t alignment, __malloc_size_t size,
}
static __ptr_t
-reallochook (__ptr_t ptr, __malloc_size_t size, const __ptr_t caller)
+reallochook (__ptr_t ptr, size_t size, const __ptr_t caller)
{
if (size == 0)
{
@@ -283,7 +282,7 @@ reallochook (__ptr_t ptr, __malloc_size_t size, const __ptr_t caller)
}
struct hdr *hdr;
- __malloc_size_t osize;
+ size_t osize;
if (pedantic)
mcheck_check_all ();
diff --git a/libc/malloc/morecore.c b/libc/malloc/morecore.c
index 3b1940634..0a644c36a 100644
--- a/libc/malloc/morecore.c
+++ b/libc/malloc/morecore.c
@@ -30,7 +30,7 @@
#include <stddef.h>
#include <stdlib.h>
-extern __malloc_ptr_t __sbrk (ptrdiff_t increment) __THROW;
+extern void *__sbrk (ptrdiff_t increment) __THROW;
libc_hidden_proto (__sbrk)
#endif
@@ -41,12 +41,11 @@ libc_hidden_proto (__sbrk)
/* Allocate INCREMENT more bytes of data space,
and return the start of data space, or NULL on errors.
If INCREMENT is negative, shrink data space. */
-__malloc_ptr_t
-__default_morecore (increment)
- __malloc_ptrdiff_t increment;
+void *
+__default_morecore (ptrdiff_t increment)
{
- __malloc_ptr_t result = (__malloc_ptr_t) __sbrk (increment);
- if (result == (__malloc_ptr_t) -1)
+ void *result = (void *) __sbrk (increment);
+ if (result == (void *) -1)
return NULL;
return result;
}
diff --git a/libc/malloc/mtrace.c b/libc/malloc/mtrace.c
index e9ccfa299..62867b118 100644
--- a/libc/malloc/mtrace.c
+++ b/libc/malloc/mtrace.c
@@ -58,11 +58,10 @@ __ptr_t mallwatch;
/* Old hook values. */
static void (*tr_old_free_hook) (__ptr_t ptr, const __ptr_t);
-static __ptr_t (*tr_old_malloc_hook) (__malloc_size_t size, const __ptr_t);
-static __ptr_t (*tr_old_realloc_hook) (__ptr_t ptr, __malloc_size_t size,
+static __ptr_t (*tr_old_malloc_hook) (size_t size, const __ptr_t);
+static __ptr_t (*tr_old_realloc_hook) (__ptr_t ptr, size_t size,
const __ptr_t);
-static __ptr_t (*tr_old_memalign_hook) (__malloc_size_t __alignment,
- __malloc_size_t __size,
+static __ptr_t (*tr_old_memalign_hook) (size_t __alignment, size_t __size,
const __ptr_t);
/* This function is called when the block being alloc'd, realloc'd, or
@@ -160,10 +159,10 @@ tr_freehook (ptr, caller)
__libc_lock_unlock (lock);
}
-static __ptr_t tr_mallochook (__malloc_size_t, const __ptr_t) __THROW;
+static __ptr_t tr_mallochook (size_t, const __ptr_t) __THROW;
static __ptr_t
tr_mallochook (size, caller)
- __malloc_size_t size;
+ size_t size;
const __ptr_t caller;
{
__ptr_t hdr;
@@ -190,12 +189,12 @@ tr_mallochook (size, caller)
return hdr;
}
-static __ptr_t tr_reallochook (__ptr_t, __malloc_size_t, const __ptr_t)
+static __ptr_t tr_reallochook (__ptr_t, size_t, const __ptr_t)
__THROW;
static __ptr_t
tr_reallochook (ptr, size, caller)
__ptr_t ptr;
- __malloc_size_t size;
+ size_t size;
const __ptr_t caller;
{
__ptr_t hdr;
@@ -243,11 +242,11 @@ tr_reallochook (ptr, size, caller)
return hdr;
}
-static __ptr_t tr_memalignhook (__malloc_size_t, __malloc_size_t,
+static __ptr_t tr_memalignhook (size_t, size_t,
const __ptr_t) __THROW;
static __ptr_t
tr_memalignhook (alignment, size, caller)
- __malloc_size_t alignment, size;
+ size_t alignment, size;
const __ptr_t caller;
{
__ptr_t hdr;
diff --git a/libc/manual/Makefile b/libc/manual/Makefile
index c1a304cc8..10314a962 100644
--- a/libc/manual/Makefile
+++ b/libc/manual/Makefile
@@ -42,7 +42,7 @@ chapters = $(addsuffix .texi, \
message search pattern io stdio llio filesys \
pipe socket terminal syslog math arith time \
resource setjmp signal startup process job nss \
- users sysinfo conf crypt debug)
+ users sysinfo conf crypt debug nptl)
add-chapters = $(wildcard $(foreach d, $(add-ons), ../$d/$d.texi))
appendices = lang.texi header.texi install.texi maint.texi platform.texi \
contrib.texi
diff --git a/libc/manual/debug.texi b/libc/manual/debug.texi
index b2bcb31a1..1db9c180f 100644
--- a/libc/manual/debug.texi
+++ b/libc/manual/debug.texi
@@ -1,5 +1,5 @@
@node Debugging Support
-@c @node Debugging Support, , Cryptographic Functions, Top
+@c @node Debugging Support, POSIX Threads, Cryptographic Functions, Top
@c %MENU% Functions to help debugging applications
@chapter Debugging support
diff --git a/libc/manual/install.texi b/libc/manual/install.texi
index e36fb052a..e6c1bafe6 100644
--- a/libc/manual/install.texi
+++ b/libc/manual/install.texi
@@ -172,10 +172,10 @@ the compiler and/or binutils.
If you only specify @samp{--host}, @code{configure} will prepare for a
native compile but use what you specify instead of guessing what your
system is. This is most useful to change the CPU submodel. For example,
-if @code{configure} guesses your machine as @code{i586-pc-linux-gnu} but
-you want to compile a library for 386es, give
-@samp{--host=i386-pc-linux-gnu} or just @samp{--host=i386-linux} and add
-the appropriate compiler flags (@samp{-mcpu=i386} will do the trick) to
+if @code{configure} guesses your machine as @code{i686-pc-linux-gnu} but
+you want to compile a library for 586es, give
+@samp{--host=i586-pc-linux-gnu} or just @samp{--host=i586-linux} and add
+the appropriate compiler flags (@samp{-mcpu=i586} will do the trick) to
@var{CFLAGS}.
If you specify just @samp{--build}, @code{configure} will get confused.
diff --git a/libc/manual/memory.texi b/libc/manual/memory.texi
index 5b14aa69b..0c3d39efa 100644
--- a/libc/manual/memory.texi
+++ b/libc/manual/memory.texi
@@ -683,25 +683,21 @@ parameter to be set, and @var{value} the new value to be set. Possible
choices for @var{param}, as defined in @file{malloc.h}, are:
@table @code
-@item M_TRIM_THRESHOLD
-This is the minimum size (in bytes) of the top-most, releasable chunk
-that will cause @code{sbrk} to be called with a negative argument in
-order to return memory to the system.
-@item M_TOP_PAD
-This parameter determines the amount of extra memory to obtain from the
-system when a call to @code{sbrk} is required. It also specifies the
-number of bytes to retain when shrinking the heap by calling @code{sbrk}
-with a negative argument. This provides the necessary hysteresis in
-heap size such that excessive amounts of system calls can be avoided.
+@comment TODO: @item M_ARENA_MAX
+@comment - Document ARENA_MAX env var.
+@comment TODO: @item M_ARENA_TEST
+@comment - Document ARENA_TEST env var.
+@comment TODO: @item M_CHECK_ACTION
+@item M_MMAP_MAX
+The maximum number of chunks to allocate with @code{mmap}. Setting this
+to zero disables all use of @code{mmap}.
@item M_MMAP_THRESHOLD
All chunks larger than this value are allocated outside the normal
heap, using the @code{mmap} system call. This way it is guaranteed
that the memory for these chunks can be returned to the system on
@code{free}. Note that requests smaller than this threshold might still
be allocated via @code{mmap}.
-@item M_MMAP_MAX
-The maximum number of chunks to allocate with @code{mmap}. Setting this
-to zero disables all use of @code{mmap}.
+@comment TODO: @item M_MXFAST
@item M_PERTURB
If non-zero, memory blocks are filled with values depending on some
low order bits of this parameter when they are allocated (except when
@@ -710,6 +706,16 @@ use of uninitialized or freed heap memory. Note that this option does not
guarantee that the freed block will have any specific values. It only
guarantees that the content the block had before it was freed will be
overwritten.
+@item M_TOP_PAD
+This parameter determines the amount of extra memory to obtain from the
+system when a call to @code{sbrk} is required. It also specifies the
+number of bytes to retain when shrinking the heap by calling @code{sbrk}
+with a negative argument. This provides the necessary hysteresis in
+heap size such that excessive amounts of system calls can be avoided.
+@item M_TRIM_THRESHOLD
+This is the minimum size (in bytes) of the top-most, releasable chunk
+that will cause @code{sbrk} to be called with a negative argument in
+order to return memory to the system.
@end table
@end deftypefun
diff --git a/libc/manual/nptl.texi b/libc/manual/nptl.texi
new file mode 100644
index 000000000..9a1df1a86
--- /dev/null
+++ b/libc/manual/nptl.texi
@@ -0,0 +1,44 @@
+@node POSIX Threads
+@c @node POSIX Threads, , Cryptographic Functions, Top
+@chapter POSIX Threads
+@c %MENU% POSIX Threads
+@cindex pthreads
+
+This chapter describes the @glibcadj{} POSIX Thread implementation.
+
+@menu
+* Thread-specific Data:: Support for creating and
+ managing thread-specific data
+@end menu
+
+@node Thread-specific Data
+@section Thread-specific Data
+
+The @glibcadj{} implements functions to allow users to create and manage
+data specific to a thread. Such data may be destroyed at thread exit,
+if a destructor is provided. The following functions are defined:
+
+@table @code
+
+@item int pthread_key_create (pthread_key_t *@var{key}, void (*@var{destructor})(void*))
+Create a thread-specific data key for the calling thread, referenced by
+@var{key}.
+
+Objects declared with the C++11 @code{thread_local} keyword are destroyed
+before thread-specific data, so they should not be used in thread-specific
+data destructors or even as members of the thread-specific data, since the
+latter is passed as an argument to the destructor function.
+
+@item int pthread_key_delete (pthread_key_t @var{key})
+Destroy the thread-specific data @var{key} in the calling thread. The
+destructor for the thread-specific data is not called during destruction, nor
+is it called during thread exit.
+
+@item void *pthread_getspecific (pthread_key_t @var{key})
+Return the thread-specific data associated with @var{key} in the calling
+thread.
+
+@item int pthread_setspecific (pthread_key_t @var{key}, const void *@var{value})
+Associate the thread-specific @var{value} with @var{key} in the calling thread.
+
+@end table
diff --git a/libc/math/Makefile b/libc/math/Makefile
index ea24f70e5..ae60e2414 100644
--- a/libc/math/Makefile
+++ b/libc/math/Makefile
@@ -90,7 +90,7 @@ long-c-yes = $(calls:=l)
tests = test-matherr test-fenv basic-test \
test-misc test-fpucw tst-definitions test-tgmath test-tgmath-ret \
bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int test-tgmath2 \
- test-dbl-wrap test-powl tst-CMPLX tst-CMPLX2
+ test-dbl-wrap test-powl tst-CMPLX tst-CMPLX2 test-snan
tests-$(OPTION_EGLIBC_LIBM_BIG) += atest-exp atest-sincos atest-exp2
# We do the `long double' tests only if this data type is available and
# distinct from `double'.
diff --git a/libc/math/basic-test.c b/libc/math/basic-test.c
index f9b9752de..ffead2ec0 100644
--- a/libc/math/basic-test.c
+++ b/libc/math/basic-test.c
@@ -32,40 +32,40 @@ check (const char *testname, int result)
}
}
-#define TEST_FUNC(NAME, FLOAT, NANFUNC, EPSILON, HUGEVAL) \
+#define TEST_FUNC(NAME, FLOAT, SUFFIX, EPSILON, HUGEVAL) \
static void \
NAME (void) \
{ \
/* Variables are declared volatile to forbid some compiler \
optimizations. */ \
- volatile FLOAT Inf_var, NaN_var, zero_var, one_var; \
+ volatile FLOAT Inf_var, qNaN_var, zero_var, one_var; \
FLOAT x1, x2; \
\
zero_var = 0.0; \
one_var = 1.0; \
- NaN_var = zero_var / zero_var; \
+ qNaN_var = __builtin_nan ## SUFFIX (""); \
Inf_var = one_var / zero_var; \
\
(void) &zero_var; \
(void) &one_var; \
- (void) &NaN_var; \
+ (void) &qNaN_var; \
(void) &Inf_var; \
\
\
check (#FLOAT " isinf (inf) == 1", isinf (Inf_var) == 1); \
check (#FLOAT " isinf (-inf) == -1", isinf (-Inf_var) == -1); \
check (#FLOAT " !isinf (1)", !(isinf (one_var))); \
- check (#FLOAT " !isinf (NaN)", !(isinf (NaN_var))); \
+ check (#FLOAT " !isinf (qNaN)", !(isinf (qNaN_var))); \
\
- check (#FLOAT " isnan (NaN)", isnan (NaN_var)); \
- check (#FLOAT " isnan (-NaN)", isnan (-NaN_var)); \
+ check (#FLOAT " isnan (qNaN)", isnan (qNaN_var)); \
+ check (#FLOAT " isnan (-qNaN)", isnan (-qNaN_var)); \
check (#FLOAT " !isnan (1)", !(isnan (one_var))); \
check (#FLOAT " !isnan (inf)", !(isnan (Inf_var))); \
\
check (#FLOAT " inf == inf", Inf_var == Inf_var); \
check (#FLOAT " -inf == -inf", -Inf_var == -Inf_var); \
check (#FLOAT " inf != -inf", Inf_var != -Inf_var); \
- check (#FLOAT " NaN != NaN", NaN_var != NaN_var); \
+ check (#FLOAT " qNaN != qNaN", qNaN_var != qNaN_var); \
\
/* \
the same tests but this time with NAN from <bits/nan.h> \
@@ -80,11 +80,12 @@ NAME (void) \
/* \
And again with the value returned by the `nan' function. \
*/ \
- check (#FLOAT " isnan (NAN)", isnan (NANFUNC (""))); \
- check (#FLOAT " isnan (-NAN)", isnan (-NANFUNC (""))); \
- check (#FLOAT " !isinf (NAN)", !(isinf (NANFUNC ("")))); \
- check (#FLOAT " !isinf (-NAN)", !(isinf (-NANFUNC ("")))); \
- check (#FLOAT " NAN != NAN", NANFUNC ("") != NANFUNC ("")); \
+ check (#FLOAT " isnan (nan (\"\"))", isnan (nan ## SUFFIX (""))); \
+ check (#FLOAT " isnan (-nan (\"\"))", isnan (-nan ## SUFFIX (""))); \
+ check (#FLOAT " !isinf (nan (\"\"))", !(isinf (nan ## SUFFIX ("")))); \
+ check (#FLOAT " !isinf (-nan (\"\"))", !(isinf (-nan ## SUFFIX ("")))); \
+ check (#FLOAT " nan (\"\") != nan (\"\")", \
+ nan ## SUFFIX ("") != nan ## SUFFIX ("")); \
\
/* test if EPSILON is ok */ \
x1 = 1.0; \
@@ -102,34 +103,34 @@ NAME (void) \
check (#FLOAT " isinf (-HUGE_VALx) == -1", isinf (x1) == -1); \
}
-#define TEST_TRUNC(NAME, FLOAT, DOUBLE) \
+#define TEST_TRUNC(NAME, FLOAT, DOUBLE, SUFFIX) \
void \
NAME (void) \
{ \
- volatile DOUBLE Inf_var, NaN_var, zero_var, one_var; \
+ volatile DOUBLE Inf_var, qNaN_var, zero_var, one_var; \
FLOAT x1, x2; \
\
zero_var = 0.0; \
one_var = 1.0; \
- NaN_var = zero_var / zero_var; \
+ qNaN_var = __builtin_nan ## SUFFIX (""); \
Inf_var = one_var / zero_var; \
\
- (void) &NaN_var; \
+ (void) &qNaN_var; \
(void) &Inf_var; \
\
- x1 = (FLOAT) NaN_var; \
- check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") NaN", isnan (x1) != 0); \
+ x1 = (FLOAT) qNaN_var; \
+ check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") qNaN", isnan (x1) != 0); \
x2 = (FLOAT) Inf_var; \
check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") Inf", isinf (x2) != 0); \
}
-TEST_FUNC (float_test, float, nanf, FLT_EPSILON, HUGE_VALF)
-TEST_FUNC (double_test, double, nan, DBL_EPSILON, HUGE_VAL)
-TEST_TRUNC (truncdfsf_test, float, double)
+TEST_FUNC (float_test, float, f, FLT_EPSILON, HUGE_VALF)
+TEST_FUNC (double_test, double, , DBL_EPSILON, HUGE_VAL)
+TEST_TRUNC (truncdfsf_test, float, double, )
#ifndef NO_LONG_DOUBLE
-TEST_FUNC (ldouble_test, long double, nanl, LDBL_EPSILON, HUGE_VALL)
-TEST_TRUNC (trunctfsf_test, float, long double)
-TEST_TRUNC (trunctfdf_test, double, long double)
+TEST_FUNC (ldouble_test, long double, l, LDBL_EPSILON, HUGE_VALL)
+TEST_TRUNC (trunctfsf_test, float, long double, l)
+TEST_TRUNC (trunctfdf_test, double, long double, l)
#endif
int
diff --git a/libc/math/bits/mathcalls.h b/libc/math/bits/mathcalls.h
index e90a34b0f..e5af50725 100644
--- a/libc/math/bits/mathcalls.h
+++ b/libc/math/bits/mathcalls.h
@@ -220,7 +220,7 @@ __END_NAMESPACE_C99
#ifdef __USE_ISOC99
__BEGIN_NAMESPACE_C99
-/* Return representation of NaN for double type. */
+/* Return representation of qNaN for double type. */
__MATHCALLX (nan,, (const char *__tagb), (__const__));
__END_NAMESPACE_C99
#endif
diff --git a/libc/math/gen-libm-test.pl b/libc/math/gen-libm-test.pl
index 47062eb7f..86d95078d 100755
--- a/libc/math/gen-libm-test.pl
+++ b/libc/math/gen-libm-test.pl
@@ -58,7 +58,7 @@ use vars qw ($output_dir $ulps_file $default_ulp);
"plus_zero" => "+0",
"minus_infty" => "-inf",
"plus_infty" => "inf",
- "nan_value" => "NaN",
+ "qnan_value" => "qNaN",
"M_El" => "e",
"M_E2l" => "e^2",
"M_E3l" => "e^3",
diff --git a/libc/math/libm-test.inc b/libc/math/libm-test.inc
index 5435c82b2..6565656ba 100644
--- a/libc/math/libm-test.inc
+++ b/libc/math/libm-test.inc
@@ -225,7 +225,7 @@ static int output_points; /* Should the single function results printed? */
static int ignore_max_ulp; /* Should we ignore max_ulp? */
static FLOAT minus_zero, plus_zero;
-static FLOAT plus_infty, minus_infty, nan_value, max_value, min_value;
+static FLOAT plus_infty, minus_infty, qnan_value, max_value, min_value;
static FLOAT min_subnorm_value;
static FLOAT max_error, real_max_error, imag_max_error;
@@ -369,7 +369,7 @@ print_complex_function_ulps (const char *function_name, FLOAT real_ulp,
static void
fpstack_test (const char *test_name)
{
-#ifdef i386
+#if defined (__i386__) || defined (__x86_64__)
static int old_stack;
int sw;
@@ -813,15 +813,15 @@ acos_test (void)
START (acos);
- TEST_f_f (acos, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_f_f (acos, minus_infty, nan_value, INVALID_EXCEPTION);
- TEST_f_f (acos, nan_value, nan_value);
+ TEST_f_f (acos, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (acos, minus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (acos, qnan_value, qnan_value);
/* |x| > 1: */
- TEST_f_f (acos, 1.125L, nan_value, INVALID_EXCEPTION);
- TEST_f_f (acos, -1.125L, nan_value, INVALID_EXCEPTION);
- TEST_f_f (acos, max_value, nan_value, INVALID_EXCEPTION);
- TEST_f_f (acos, -max_value, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (acos, 1.125L, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (acos, -1.125L, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (acos, max_value, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (acos, -max_value, qnan_value, INVALID_EXCEPTION);
TEST_f_f (acos, 0, M_PI_2l);
TEST_f_f (acos, minus_zero, M_PI_2l);
@@ -979,11 +979,12 @@ acosh_test (void)
START (acosh);
TEST_f_f (acosh, plus_infty, plus_infty);
- TEST_f_f (acosh, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (acosh, minus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (acosh, qnan_value, qnan_value);
/* x < 1: */
- TEST_f_f (acosh, -1.125L, nan_value, INVALID_EXCEPTION);
- TEST_f_f (acosh, -max_value, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (acosh, -1.125L, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (acosh, -max_value, qnan_value, INVALID_EXCEPTION);
TEST_f_f (acosh, 1, 0);
TEST_f_f (acosh, 7, 2.63391579384963341725009269461593689L);
@@ -1002,15 +1003,15 @@ asin_test (void)
START (asin);
- TEST_f_f (asin, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_f_f (asin, minus_infty, nan_value, INVALID_EXCEPTION);
- TEST_f_f (asin, nan_value, nan_value);
+ TEST_f_f (asin, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (asin, minus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (asin, qnan_value, qnan_value);
- /* asin x == NaN plus invalid exception for |x| > 1. */
- TEST_f_f (asin, 1.125L, nan_value, INVALID_EXCEPTION);
- TEST_f_f (asin, -1.125L, nan_value, INVALID_EXCEPTION);
- TEST_f_f (asin, max_value, nan_value, INVALID_EXCEPTION);
- TEST_f_f (asin, -max_value, nan_value, INVALID_EXCEPTION);
+ /* asin x == qNaN plus invalid exception for |x| > 1. */
+ TEST_f_f (asin, 1.125L, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (asin, -1.125L, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (asin, max_value, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (asin, -max_value, qnan_value, INVALID_EXCEPTION);
TEST_f_f (asin, 0, 0);
TEST_f_f (asin, minus_zero, minus_zero);
@@ -1172,7 +1173,7 @@ asinh_test (void)
TEST_f_f (asinh, plus_infty, plus_infty);
TEST_f_f (asinh, minus_infty, minus_infty);
#endif
- TEST_f_f (asinh, nan_value, nan_value);
+ TEST_f_f (asinh, qnan_value, qnan_value);
TEST_f_f (asinh, 0.75L, 0.693147180559945309417232121458176568L);
END (asinh);
@@ -1194,7 +1195,7 @@ atan_test (void)
TEST_f_f (atan, plus_infty, M_PI_2l);
TEST_f_f (atan, minus_infty, -M_PI_2l);
- TEST_f_f (atan, nan_value, nan_value);
+ TEST_f_f (atan, qnan_value, qnan_value);
TEST_f_f (atan, max_value, M_PI_2l);
TEST_f_f (atan, -max_value, -M_PI_2l);
@@ -1233,13 +1234,13 @@ atanh_test (void)
TEST_f_f (atanh, 1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
TEST_f_f (atanh, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
- TEST_f_f (atanh, nan_value, nan_value);
+ TEST_f_f (atanh, qnan_value, qnan_value);
- /* atanh (x) == NaN plus invalid exception if |x| > 1. */
- TEST_f_f (atanh, 1.125L, nan_value, INVALID_EXCEPTION);
- TEST_f_f (atanh, -1.125L, nan_value, INVALID_EXCEPTION);
- TEST_f_f (atanh, max_value, nan_value, INVALID_EXCEPTION);
- TEST_f_f (atanh, -max_value, nan_value, INVALID_EXCEPTION);
+ /* atanh (x) == qNaN plus invalid exception if |x| > 1. */
+ TEST_f_f (atanh, 1.125L, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (atanh, -1.125L, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (atanh, max_value, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (atanh, -max_value, qnan_value, INVALID_EXCEPTION);
TEST_f_f (atanh, 0.75L, 0.972955074527656652552676371721589865L);
@@ -1309,7 +1310,7 @@ atan2_test (void)
TEST_ff_f (atan2, minus_infty, plus_infty, -M_PI_4l);
TEST_ff_f (atan2, plus_infty, minus_infty, M_PI_34l);
TEST_ff_f (atan2, minus_infty, minus_infty, -M_PI_34l);
- TEST_ff_f (atan2, nan_value, nan_value, nan_value);
+ TEST_ff_f (atan2, qnan_value, qnan_value, qnan_value);
TEST_ff_f (atan2, max_value, max_value, M_PI_4l);
@@ -1349,10 +1350,10 @@ cabs_test (void)
/* cabs (-inf + i x) == +inf. */
TEST_c_f (cabs, minus_infty, 1.0, plus_infty);
- TEST_c_f (cabs, minus_infty, nan_value, plus_infty);
- TEST_c_f (cabs, minus_infty, nan_value, plus_infty);
+ TEST_c_f (cabs, minus_infty, qnan_value, plus_infty);
+ TEST_c_f (cabs, minus_infty, qnan_value, plus_infty);
- TEST_c_f (cabs, nan_value, nan_value, nan_value);
+ TEST_c_f (cabs, qnan_value, qnan_value, qnan_value);
/* cabs (x,y) == cabs (y,x). */
TEST_c_f (cabs, 0.75L, 12.390625L, 12.4133028598606664302388810868156657L);
@@ -1418,22 +1419,22 @@ cacos_test (void)
TEST_c_c (cacos, plus_infty, 0.5, 0.0, minus_infty);
TEST_c_c (cacos, plus_infty, -0.5, 0.0, plus_infty);
- TEST_c_c (cacos, plus_infty, nan_value, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (cacos, minus_infty, nan_value, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (cacos, plus_infty, qnan_value, qnan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (cacos, minus_infty, qnan_value, qnan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (cacos, 0, nan_value, M_PI_2l, nan_value);
- TEST_c_c (cacos, minus_zero, nan_value, M_PI_2l, nan_value);
+ TEST_c_c (cacos, 0, qnan_value, M_PI_2l, qnan_value);
+ TEST_c_c (cacos, minus_zero, qnan_value, M_PI_2l, qnan_value);
- TEST_c_c (cacos, nan_value, plus_infty, nan_value, minus_infty);
- TEST_c_c (cacos, nan_value, minus_infty, nan_value, plus_infty);
+ TEST_c_c (cacos, qnan_value, plus_infty, qnan_value, minus_infty);
+ TEST_c_c (cacos, qnan_value, minus_infty, qnan_value, plus_infty);
- TEST_c_c (cacos, 10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cacos, -10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cacos, 10.5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cacos, -10.5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cacos, nan_value, 0.75, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cacos, nan_value, -0.75, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cacos, qnan_value, 0.75, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cacos, qnan_value, -0.75, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cacos, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (cacos, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (cacos, plus_zero, -1.5L, M_PI_2l, 1.194763217287109304111930828519090523536L);
TEST_c_c (cacos, minus_zero, -1.5L, M_PI_2l, 1.194763217287109304111930828519090523536L);
@@ -1572,22 +1573,22 @@ cacosh_test (void)
TEST_c_c (cacosh, plus_infty, 0.5, plus_infty, 0.0);
TEST_c_c (cacosh, plus_infty, -0.5, plus_infty, minus_zero);
- TEST_c_c (cacosh, plus_infty, nan_value, plus_infty, nan_value);
- TEST_c_c (cacosh, minus_infty, nan_value, plus_infty, nan_value);
+ TEST_c_c (cacosh, plus_infty, qnan_value, plus_infty, qnan_value);
+ TEST_c_c (cacosh, minus_infty, qnan_value, plus_infty, qnan_value);
- TEST_c_c (cacosh, 0, nan_value, nan_value, nan_value);
- TEST_c_c (cacosh, minus_zero, nan_value, nan_value, nan_value);
+ TEST_c_c (cacosh, 0, qnan_value, qnan_value, qnan_value);
+ TEST_c_c (cacosh, minus_zero, qnan_value, qnan_value, qnan_value);
- TEST_c_c (cacosh, nan_value, plus_infty, plus_infty, nan_value);
- TEST_c_c (cacosh, nan_value, minus_infty, plus_infty, nan_value);
+ TEST_c_c (cacosh, qnan_value, plus_infty, plus_infty, qnan_value);
+ TEST_c_c (cacosh, qnan_value, minus_infty, plus_infty, qnan_value);
- TEST_c_c (cacosh, 10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cacosh, -10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cacosh, 10.5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cacosh, -10.5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cacosh, nan_value, 0.75, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cacosh, nan_value, -0.75, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cacosh, qnan_value, 0.75, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cacosh, qnan_value, -0.75, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cacosh, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (cacosh, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (cacosh, plus_zero, -1.5L, 1.194763217287109304111930828519090523536L, -M_PI_2l);
TEST_c_c (cacosh, minus_zero, -1.5L, 1.194763217287109304111930828519090523536L, -M_PI_2l);
@@ -1684,7 +1685,7 @@ carg_test (void)
TEST_c_f (carg, minus_infty, minus_infty, -3 * M_PI_4l);
- TEST_c_f (carg, nan_value, nan_value, nan_value);
+ TEST_c_f (carg, qnan_value, qnan_value, qnan_value);
END (carg);
}
@@ -1729,22 +1730,22 @@ casin_test (void)
TEST_c_c (casin, plus_infty, 0.5, M_PI_2l, plus_infty);
TEST_c_c (casin, plus_infty, -0.5, M_PI_2l, minus_infty);
- TEST_c_c (casin, nan_value, plus_infty, nan_value, plus_infty);
- TEST_c_c (casin, nan_value, minus_infty, nan_value, minus_infty);
+ TEST_c_c (casin, qnan_value, plus_infty, qnan_value, plus_infty);
+ TEST_c_c (casin, qnan_value, minus_infty, qnan_value, minus_infty);
- TEST_c_c (casin, 0.0, nan_value, 0.0, nan_value);
- TEST_c_c (casin, minus_zero, nan_value, minus_zero, nan_value);
+ TEST_c_c (casin, 0.0, qnan_value, 0.0, qnan_value);
+ TEST_c_c (casin, minus_zero, qnan_value, minus_zero, qnan_value);
- TEST_c_c (casin, plus_infty, nan_value, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (casin, minus_infty, nan_value, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (casin, plus_infty, qnan_value, qnan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (casin, minus_infty, qnan_value, qnan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (casin, nan_value, 10.5, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (casin, nan_value, -10.5, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (casin, qnan_value, 10.5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (casin, qnan_value, -10.5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (casin, 0.75, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (casin, -0.75, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (casin, 0.75, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (casin, -0.75, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (casin, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (casin, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (casin, plus_zero, -1.5L, plus_zero, -1.194763217287109304111930828519090523536L);
TEST_c_c (casin, minus_zero, -1.5L, minus_zero, -1.194763217287109304111930828519090523536L);
@@ -1885,22 +1886,22 @@ casinh_test (void)
TEST_c_c (casinh, plus_infty, 0.5, plus_infty, 0.0);
TEST_c_c (casinh, plus_infty, -0.5, plus_infty, minus_zero);
- TEST_c_c (casinh, plus_infty, nan_value, plus_infty, nan_value);
- TEST_c_c (casinh, minus_infty, nan_value, minus_infty, nan_value);
+ TEST_c_c (casinh, plus_infty, qnan_value, plus_infty, qnan_value);
+ TEST_c_c (casinh, minus_infty, qnan_value, minus_infty, qnan_value);
- TEST_c_c (casinh, nan_value, 0, nan_value, 0.0);
- TEST_c_c (casinh, nan_value, minus_zero, nan_value, minus_zero);
+ TEST_c_c (casinh, qnan_value, 0, qnan_value, 0.0);
+ TEST_c_c (casinh, qnan_value, minus_zero, qnan_value, minus_zero);
- TEST_c_c (casinh, nan_value, plus_infty, plus_infty, nan_value, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (casinh, nan_value, minus_infty, plus_infty, nan_value, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (casinh, qnan_value, plus_infty, plus_infty, qnan_value, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (casinh, qnan_value, minus_infty, plus_infty, qnan_value, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (casinh, 10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (casinh, -10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (casinh, 10.5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (casinh, -10.5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (casinh, nan_value, 0.75, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (casinh, -0.75, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (casinh, qnan_value, 0.75, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (casinh, -0.75, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (casinh, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (casinh, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (casinh, plus_zero, -1.5L, 0.9624236501192068949955178268487368462704L, -M_PI_2l);
TEST_c_c (casinh, minus_zero, -1.5L, -0.9624236501192068949955178268487368462704L, -M_PI_2l);
@@ -2042,25 +2043,25 @@ catan_test (void)
TEST_c_c (catan, 0.5, plus_infty, M_PI_2l, 0);
TEST_c_c (catan, -0.5, plus_infty, -M_PI_2l, 0);
- TEST_c_c (catan, nan_value, 0.0, nan_value, 0);
- TEST_c_c (catan, nan_value, minus_zero, nan_value, minus_zero);
+ TEST_c_c (catan, qnan_value, 0.0, qnan_value, 0);
+ TEST_c_c (catan, qnan_value, minus_zero, qnan_value, minus_zero);
- TEST_c_c (catan, nan_value, plus_infty, nan_value, 0);
- TEST_c_c (catan, nan_value, minus_infty, nan_value, minus_zero);
+ TEST_c_c (catan, qnan_value, plus_infty, qnan_value, 0);
+ TEST_c_c (catan, qnan_value, minus_infty, qnan_value, minus_zero);
- TEST_c_c (catan, 0.0, nan_value, nan_value, nan_value);
- TEST_c_c (catan, minus_zero, nan_value, nan_value, nan_value);
+ TEST_c_c (catan, 0.0, qnan_value, qnan_value, qnan_value);
+ TEST_c_c (catan, minus_zero, qnan_value, qnan_value, qnan_value);
- TEST_c_c (catan, plus_infty, nan_value, M_PI_2l, 0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (catan, minus_infty, nan_value, -M_PI_2l, 0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (catan, plus_infty, qnan_value, M_PI_2l, 0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (catan, minus_infty, qnan_value, -M_PI_2l, 0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (catan, nan_value, 10.5, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (catan, nan_value, -10.5, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (catan, qnan_value, 10.5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (catan, qnan_value, -10.5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (catan, 0.75, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (catan, -0.75, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (catan, 0.75, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (catan, -0.75, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (catan, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (catan, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (catan, 0.75L, 1.25L, 1.10714871779409050301706546017853704L, 0.549306144334054845697622618461262852L);
TEST_c_c (catan, -2, -3, -1.4099210495965755225306193844604208L, -0.22907268296853876629588180294200276L);
@@ -2108,25 +2109,25 @@ catanh_test (void)
TEST_c_c (catanh, plus_infty, 0.5, 0.0, M_PI_2l);
TEST_c_c (catanh, plus_infty, -0.5, 0.0, -M_PI_2l);
- TEST_c_c (catanh, 0, nan_value, 0.0, nan_value);
- TEST_c_c (catanh, minus_zero, nan_value, minus_zero, nan_value);
+ TEST_c_c (catanh, 0, qnan_value, 0.0, qnan_value);
+ TEST_c_c (catanh, minus_zero, qnan_value, minus_zero, qnan_value);
- TEST_c_c (catanh, plus_infty, nan_value, 0.0, nan_value);
- TEST_c_c (catanh, minus_infty, nan_value, minus_zero, nan_value);
+ TEST_c_c (catanh, plus_infty, qnan_value, 0.0, qnan_value);
+ TEST_c_c (catanh, minus_infty, qnan_value, minus_zero, qnan_value);
- TEST_c_c (catanh, nan_value, 0, nan_value, nan_value);
- TEST_c_c (catanh, nan_value, minus_zero, nan_value, nan_value);
+ TEST_c_c (catanh, qnan_value, 0, qnan_value, qnan_value);
+ TEST_c_c (catanh, qnan_value, minus_zero, qnan_value, qnan_value);
- TEST_c_c (catanh, nan_value, plus_infty, 0.0, M_PI_2l, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (catanh, nan_value, minus_infty, 0.0, -M_PI_2l, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (catanh, qnan_value, plus_infty, 0.0, M_PI_2l, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (catanh, qnan_value, minus_infty, 0.0, -M_PI_2l, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (catanh, 10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (catanh, -10.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (catanh, 10.5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (catanh, -10.5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (catanh, nan_value, 0.75, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (catanh, nan_value, -0.75, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (catanh, qnan_value, 0.75, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (catanh, qnan_value, -0.75, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (catanh, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (catanh, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (catanh, 0.75L, 1.25L, 0.261492138795671927078652057366532140L, 0.996825126463918666098902241310446708L);
TEST_c_c (catanh, -2, -3, -0.14694666622552975204743278515471595L, -1.3389725222944935611241935759091443L);
@@ -2150,7 +2151,7 @@ cbrt_test (void)
TEST_f_f (cbrt, plus_infty, plus_infty);
TEST_f_f (cbrt, minus_infty, minus_infty);
- TEST_f_f (cbrt, nan_value, nan_value);
+ TEST_f_f (cbrt, qnan_value, qnan_value);
TEST_f_f (cbrt, -0.001L, -0.1L);
TEST_f_f (cbrt, 8, 2);
@@ -2178,50 +2179,50 @@ ccos_test (void)
TEST_c_c (ccos, 0.0, minus_zero, 1.0, 0.0);
TEST_c_c (ccos, minus_zero, minus_zero, 1.0, minus_zero);
- TEST_c_c (ccos, plus_infty, 0.0, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccos, plus_infty, minus_zero, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccos, minus_infty, 0.0, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccos, minus_infty, minus_zero, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccos, plus_infty, 0.0, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccos, plus_infty, minus_zero, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccos, minus_infty, 0.0, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccos, minus_infty, minus_zero, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
TEST_c_c (ccos, 0.0, plus_infty, plus_infty, minus_zero);
TEST_c_c (ccos, 0.0, minus_infty, plus_infty, 0.0);
TEST_c_c (ccos, minus_zero, plus_infty, plus_infty, 0.0);
TEST_c_c (ccos, minus_zero, minus_infty, plus_infty, minus_zero);
- TEST_c_c (ccos, plus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccos, minus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccos, plus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccos, minus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccos, plus_infty, plus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccos, minus_infty, plus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccos, plus_infty, minus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccos, minus_infty, minus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
TEST_c_c (ccos, 4.625, plus_infty, minus_infty, plus_infty);
TEST_c_c (ccos, 4.625, minus_infty, minus_infty, minus_infty);
TEST_c_c (ccos, -4.625, plus_infty, minus_infty, minus_infty);
TEST_c_c (ccos, -4.625, minus_infty, minus_infty, plus_infty);
- TEST_c_c (ccos, plus_infty, 6.75, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccos, plus_infty, -6.75, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccos, minus_infty, 6.75, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccos, minus_infty, -6.75, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccos, plus_infty, 6.75, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccos, plus_infty, -6.75, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccos, minus_infty, 6.75, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccos, minus_infty, -6.75, qnan_value, qnan_value, INVALID_EXCEPTION);
- TEST_c_c (ccos, nan_value, 0.0, nan_value, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccos, nan_value, minus_zero, nan_value, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccos, qnan_value, 0.0, qnan_value, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccos, qnan_value, minus_zero, qnan_value, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccos, nan_value, plus_infty, plus_infty, nan_value);
- TEST_c_c (ccos, nan_value, minus_infty, plus_infty, nan_value);
+ TEST_c_c (ccos, qnan_value, plus_infty, plus_infty, qnan_value);
+ TEST_c_c (ccos, qnan_value, minus_infty, plus_infty, qnan_value);
- TEST_c_c (ccos, nan_value, 9.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccos, nan_value, -9.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccos, qnan_value, 9.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccos, qnan_value, -9.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccos, 0.0, nan_value, nan_value, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccos, minus_zero, nan_value, nan_value, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccos, 0.0, qnan_value, qnan_value, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccos, minus_zero, qnan_value, qnan_value, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccos, 10.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccos, -10.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccos, 10.0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccos, -10.0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccos, plus_infty, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccos, minus_infty, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccos, plus_infty, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccos, minus_infty, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccos, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (ccos, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (ccos, 0.75L, 1.25L, 1.38173873063425888530729933139078645L, -1.09193013555397466170919531722024128L);
TEST_c_c (ccos, -2, -3, -4.18962569096880723013255501961597373L, -9.10922789375533659797919726277886212L);
@@ -2277,50 +2278,50 @@ ccosh_test (void)
TEST_c_c (ccosh, 0.0, minus_zero, 1.0, minus_zero);
TEST_c_c (ccosh, minus_zero, minus_zero, 1.0, 0.0);
- TEST_c_c (ccosh, 0.0, plus_infty, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccosh, minus_zero, plus_infty, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccosh, 0.0, minus_infty, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccosh, minus_zero, minus_infty, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccosh, 0.0, plus_infty, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccosh, minus_zero, plus_infty, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccosh, 0.0, minus_infty, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccosh, minus_zero, minus_infty, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
TEST_c_c (ccosh, plus_infty, 0.0, plus_infty, 0.0);
TEST_c_c (ccosh, minus_infty, 0.0, plus_infty, minus_zero);
TEST_c_c (ccosh, plus_infty, minus_zero, plus_infty, minus_zero);
TEST_c_c (ccosh, minus_infty, minus_zero, plus_infty, 0.0);
- TEST_c_c (ccosh, plus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccosh, minus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccosh, plus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccosh, minus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccosh, plus_infty, plus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccosh, minus_infty, plus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccosh, plus_infty, minus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccosh, minus_infty, minus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
TEST_c_c (ccosh, plus_infty, 4.625, minus_infty, minus_infty);
TEST_c_c (ccosh, minus_infty, 4.625, minus_infty, plus_infty);
TEST_c_c (ccosh, plus_infty, -4.625, minus_infty, plus_infty);
TEST_c_c (ccosh, minus_infty, -4.625, minus_infty, minus_infty);
- TEST_c_c (ccosh, 6.75, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccosh, -6.75, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccosh, 6.75, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ccosh, -6.75, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccosh, 6.75, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccosh, -6.75, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccosh, 6.75, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ccosh, -6.75, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
- TEST_c_c (ccosh, 0.0, nan_value, nan_value, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccosh, minus_zero, nan_value, nan_value, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccosh, 0.0, qnan_value, qnan_value, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccosh, minus_zero, qnan_value, qnan_value, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccosh, plus_infty, nan_value, plus_infty, nan_value);
- TEST_c_c (ccosh, minus_infty, nan_value, plus_infty, nan_value);
+ TEST_c_c (ccosh, plus_infty, qnan_value, plus_infty, qnan_value);
+ TEST_c_c (ccosh, minus_infty, qnan_value, plus_infty, qnan_value);
- TEST_c_c (ccosh, 9.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccosh, -9.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccosh, 9.0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccosh, -9.0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccosh, nan_value, 0.0, nan_value, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccosh, nan_value, minus_zero, nan_value, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccosh, qnan_value, 0.0, qnan_value, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ccosh, qnan_value, minus_zero, qnan_value, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ccosh, nan_value, 10.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccosh, nan_value, -10.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccosh, qnan_value, 10.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccosh, qnan_value, -10.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccosh, nan_value, plus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccosh, nan_value, minus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccosh, qnan_value, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ccosh, qnan_value, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ccosh, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (ccosh, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (ccosh, 0.75L, 1.25L, 0.408242591877968807788852146397499084L, 0.780365930845853240391326216300863152L);
@@ -2370,7 +2371,7 @@ ceil_test (void)
TEST_f_f (ceil, minus_zero, minus_zero);
TEST_f_f (ceil, plus_infty, plus_infty);
TEST_f_f (ceil, minus_infty, minus_infty);
- TEST_f_f (ceil, nan_value, nan_value);
+ TEST_f_f (ceil, qnan_value, qnan_value);
TEST_f_f (ceil, M_PIl, 4.0);
TEST_f_f (ceil, -M_PIl, -3.0);
@@ -2477,40 +2478,40 @@ cexp_test (void)
TEST_c_c (cexp, minus_infty, plus_zero, 0.0, 0.0);
TEST_c_c (cexp, minus_infty, minus_zero, 0.0, minus_zero);
- TEST_c_c (cexp, 0.0, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (cexp, minus_zero, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (cexp, 0.0, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (cexp, minus_zero, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
- TEST_c_c (cexp, 0.0, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (cexp, minus_zero, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (cexp, 0.0, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (cexp, minus_zero, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
- TEST_c_c (cexp, 100.0, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (cexp, -100.0, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (cexp, 100.0, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (cexp, -100.0, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
- TEST_c_c (cexp, 100.0, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (cexp, -100.0, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (cexp, 100.0, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (cexp, -100.0, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
TEST_c_c (cexp, minus_infty, 2.0, minus_zero, 0.0);
TEST_c_c (cexp, minus_infty, 4.0, minus_zero, minus_zero);
TEST_c_c (cexp, plus_infty, 2.0, minus_infty, plus_infty);
TEST_c_c (cexp, plus_infty, 4.0, minus_infty, minus_infty);
- TEST_c_c (cexp, plus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (cexp, plus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (cexp, plus_infty, plus_infty, plus_infty, qnan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (cexp, plus_infty, minus_infty, plus_infty, qnan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
TEST_c_c (cexp, minus_infty, plus_infty, 0.0, 0.0, IGNORE_ZERO_INF_SIGN);
TEST_c_c (cexp, minus_infty, minus_infty, 0.0, minus_zero, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (cexp, minus_infty, nan_value, 0, 0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (cexp, minus_infty, qnan_value, 0, 0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (cexp, plus_infty, nan_value, plus_infty, nan_value);
+ TEST_c_c (cexp, plus_infty, qnan_value, plus_infty, qnan_value);
- TEST_c_c (cexp, nan_value, 0.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cexp, nan_value, 1.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cexp, qnan_value, 0.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cexp, qnan_value, 1.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cexp, nan_value, plus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cexp, 0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cexp, 1, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (cexp, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (cexp, qnan_value, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cexp, 0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cexp, 1, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (cexp, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (cexp, 0.75L, 1.25L, 0.667537446429131586942201977015932112L, 2.00900045494094876258347228145863909L);
TEST_c_c (cexp, -2.0, -3.0, -0.13398091492954261346140525546115575L, -0.019098516261135196432576240858800925L);
@@ -2569,8 +2570,8 @@ cimag_test (void)
START (cimag);
TEST_c_f (cimag, 1.0, 0.0, 0.0);
TEST_c_f (cimag, 1.0, minus_zero, minus_zero);
- TEST_c_f (cimag, 1.0, nan_value, nan_value);
- TEST_c_f (cimag, nan_value, nan_value, nan_value);
+ TEST_c_f (cimag, 1.0, qnan_value, qnan_value);
+ TEST_c_f (cimag, qnan_value, qnan_value, qnan_value);
TEST_c_f (cimag, 1.0, plus_infty, plus_infty);
TEST_c_f (cimag, 1.0, minus_infty, minus_infty);
TEST_c_f (cimag, 2.0, 3.0, 3.0);
@@ -2620,23 +2621,23 @@ clog_test (void)
TEST_c_c (clog, plus_infty, minus_zero, plus_infty, minus_zero);
TEST_c_c (clog, plus_infty, -1, plus_infty, minus_zero);
- TEST_c_c (clog, plus_infty, nan_value, plus_infty, nan_value);
- TEST_c_c (clog, minus_infty, nan_value, plus_infty, nan_value);
+ TEST_c_c (clog, plus_infty, qnan_value, plus_infty, qnan_value);
+ TEST_c_c (clog, minus_infty, qnan_value, plus_infty, qnan_value);
- TEST_c_c (clog, nan_value, plus_infty, plus_infty, nan_value);
- TEST_c_c (clog, nan_value, minus_infty, plus_infty, nan_value);
+ TEST_c_c (clog, qnan_value, plus_infty, plus_infty, qnan_value);
+ TEST_c_c (clog, qnan_value, minus_infty, plus_infty, qnan_value);
- TEST_c_c (clog, 0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog, 3, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog, minus_zero, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog, -3, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog, 0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog, 3, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog, minus_zero, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog, -3, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog, nan_value, 0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog, nan_value, 5, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog, nan_value, minus_zero, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog, nan_value, -5, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog, qnan_value, 0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog, qnan_value, 5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog, qnan_value, minus_zero, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog, qnan_value, -5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (clog, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (clog, 0.75L, 1.25L, 0.376885901188190075998919126749298416L, 1.03037682652431246378774332703115153L);
TEST_c_c (clog, -2, -3, 1.2824746787307683680267437207826593L, -2.1587989303424641704769327722648368L);
@@ -2840,23 +2841,23 @@ clog10_test (void)
TEST_c_c (clog10, plus_infty, minus_zero, plus_infty, minus_zero);
TEST_c_c (clog10, plus_infty, -1, plus_infty, minus_zero);
- TEST_c_c (clog10, plus_infty, nan_value, plus_infty, nan_value);
- TEST_c_c (clog10, minus_infty, nan_value, plus_infty, nan_value);
+ TEST_c_c (clog10, plus_infty, qnan_value, plus_infty, qnan_value);
+ TEST_c_c (clog10, minus_infty, qnan_value, plus_infty, qnan_value);
- TEST_c_c (clog10, nan_value, plus_infty, plus_infty, nan_value);
- TEST_c_c (clog10, nan_value, minus_infty, plus_infty, nan_value);
+ TEST_c_c (clog10, qnan_value, plus_infty, plus_infty, qnan_value);
+ TEST_c_c (clog10, qnan_value, minus_infty, plus_infty, qnan_value);
- TEST_c_c (clog10, 0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog10, 3, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog10, minus_zero, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog10, -3, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog10, 0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog10, 3, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog10, minus_zero, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog10, -3, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog10, nan_value, 0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog10, nan_value, 5, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog10, nan_value, minus_zero, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog10, nan_value, -5, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog10, qnan_value, 0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog10, qnan_value, 5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog10, qnan_value, minus_zero, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (clog10, qnan_value, -5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (clog10, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (clog10, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (clog10, 0.75L, 1.25L, 0.163679467193165171449476605077428975L, 0.447486970040493067069984724340855636L);
TEST_c_c (clog10, -2, -3, 0.556971676153418384603252578971164214L, -0.937554462986374708541507952140189646L);
@@ -3025,7 +3026,7 @@ conj_test (void)
START (conj);
TEST_c_c (conj, 0.0, 0.0, 0.0, minus_zero);
TEST_c_c (conj, 0.0, minus_zero, 0.0, 0.0);
- TEST_c_c (conj, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (conj, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (conj, plus_infty, minus_infty, plus_infty, plus_infty);
TEST_c_c (conj, plus_infty, plus_infty, plus_infty, minus_infty);
TEST_c_c (conj, 1.0, 2.0, 1.0, -2.0);
@@ -3056,10 +3057,10 @@ copysign_test (void)
TEST_ff_f (copysign, minus_zero, minus_zero, minus_zero);
/* XXX More correctly we would have to check the sign of the NaN. */
- TEST_ff_f (copysign, nan_value, 0, nan_value);
- TEST_ff_f (copysign, nan_value, minus_zero, nan_value);
- TEST_ff_f (copysign, -nan_value, 0, nan_value);
- TEST_ff_f (copysign, -nan_value, minus_zero, nan_value);
+ TEST_ff_f (copysign, qnan_value, 0, qnan_value);
+ TEST_ff_f (copysign, qnan_value, minus_zero, qnan_value);
+ TEST_ff_f (copysign, -qnan_value, 0, qnan_value);
+ TEST_ff_f (copysign, -qnan_value, minus_zero, qnan_value);
END (copysign);
}
@@ -3079,14 +3080,14 @@ cos_test (void)
TEST_f_f (cos, 0, 1);
TEST_f_f (cos, minus_zero, 1);
errno = 0;
- TEST_f_f (cos, plus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (cos, plus_infty, qnan_value, INVALID_EXCEPTION);
check_int ("errno for cos(+inf) == EDOM", errno, EDOM, 0, 0, 0);
errno = 0;
- TEST_f_f (cos, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (cos, minus_infty, qnan_value, INVALID_EXCEPTION);
check_int ("errno for cos(-inf) == EDOM", errno, EDOM, 0, 0, 0);
errno = 0;
- TEST_f_f (cos, nan_value, nan_value);
- check_int ("errno for cos(NaN) unchanged", errno, 0, 0, 0, 0);
+ TEST_f_f (cos, qnan_value, qnan_value);
+ check_int ("errno for cos(qNaN) unchanged", errno, 0, 0, 0, 0);
TEST_f_f (cos, M_PI_6l * 2.0, 0.5);
TEST_f_f (cos, M_PI_6l * 4.0, -0.5);
@@ -3276,7 +3277,7 @@ cosh_test (void)
TEST_f_f (cosh, plus_infty, plus_infty);
TEST_f_f (cosh, minus_infty, plus_infty);
#endif
- TEST_f_f (cosh, nan_value, nan_value);
+ TEST_f_f (cosh, qnan_value, qnan_value);
TEST_f_f (cosh, 0.75L, 1.29468328467684468784170818539018176L);
@@ -3414,7 +3415,7 @@ cpow_test (void)
TEST_cc_c (cpow, M_El, 0, 0, 2 * M_PIl, 1.0, 0.0);
TEST_cc_c (cpow, 2, 3, 4, 0, -119.0, -120.0);
- TEST_cc_c (cpow, nan_value, nan_value, nan_value, nan_value, nan_value, nan_value);
+ TEST_cc_c (cpow, qnan_value, qnan_value, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_cc_c (cpow, 0.75L, 1.25L, 0.75L, 1.25L, 0.117506293914473555420279832210420483L, 0.346552747708338676483025352060418001L);
TEST_cc_c (cpow, 0.75L, 1.25L, 1.0L, 1.0L, 0.0846958290317209430433805274189191353L, 0.513285749182902449043287190519090481L);
@@ -3434,7 +3435,7 @@ cproj_test (void)
TEST_c_c (cproj, 0.0, minus_zero, 0.0, minus_zero);
TEST_c_c (cproj, minus_zero, 0.0, minus_zero, 0.0);
- TEST_c_c (cproj, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (cproj, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (cproj, plus_infty, plus_infty, plus_infty, 0.0);
TEST_c_c (cproj, plus_infty, minus_infty, plus_infty, minus_zero);
@@ -3454,8 +3455,8 @@ creal_test (void)
START (creal);
TEST_c_f (creal, 0.0, 1.0, 0.0);
TEST_c_f (creal, minus_zero, 1.0, minus_zero);
- TEST_c_f (creal, nan_value, 1.0, nan_value);
- TEST_c_f (creal, nan_value, nan_value, nan_value);
+ TEST_c_f (creal, qnan_value, 1.0, qnan_value);
+ TEST_c_f (creal, qnan_value, qnan_value, qnan_value);
TEST_c_f (creal, plus_infty, 1.0, plus_infty);
TEST_c_f (creal, minus_infty, 1.0, minus_infty);
TEST_c_f (creal, 2.0, 3.0, 2.0);
@@ -3484,45 +3485,45 @@ csin_test (void)
TEST_c_c (csin, 0.0, minus_infty, 0.0, minus_infty);
TEST_c_c (csin, minus_zero, minus_infty, minus_zero, minus_infty);
- TEST_c_c (csin, plus_infty, 0.0, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, minus_infty, 0.0, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, plus_infty, minus_zero, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, minus_infty, minus_zero, nan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, plus_infty, 0.0, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, minus_infty, 0.0, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, plus_infty, minus_zero, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, minus_infty, minus_zero, qnan_value, 0.0, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, plus_infty, plus_infty, nan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, minus_infty, plus_infty, nan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, plus_infty, minus_infty, nan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, minus_infty, minus_infty, nan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, plus_infty, plus_infty, qnan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, minus_infty, plus_infty, qnan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, plus_infty, minus_infty, qnan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, minus_infty, minus_infty, qnan_value, plus_infty, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, plus_infty, 6.75, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (csin, plus_infty, -6.75, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (csin, minus_infty, 6.75, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (csin, minus_infty, -6.75, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (csin, plus_infty, 6.75, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (csin, plus_infty, -6.75, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (csin, minus_infty, 6.75, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (csin, minus_infty, -6.75, qnan_value, qnan_value, INVALID_EXCEPTION);
TEST_c_c (csin, 4.625, plus_infty, minus_infty, minus_infty);
TEST_c_c (csin, 4.625, minus_infty, minus_infty, plus_infty);
TEST_c_c (csin, -4.625, plus_infty, plus_infty, minus_infty);
TEST_c_c (csin, -4.625, minus_infty, plus_infty, plus_infty);
- TEST_c_c (csin, nan_value, 0.0, nan_value, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, nan_value, minus_zero, nan_value, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, qnan_value, 0.0, qnan_value, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, qnan_value, minus_zero, qnan_value, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, nan_value, plus_infty, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, nan_value, minus_infty, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, qnan_value, plus_infty, qnan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csin, qnan_value, minus_infty, qnan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csin, nan_value, 9.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csin, nan_value, -9.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csin, qnan_value, 9.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csin, qnan_value, -9.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csin, 0.0, nan_value, 0.0, nan_value);
- TEST_c_c (csin, minus_zero, nan_value, minus_zero, nan_value);
+ TEST_c_c (csin, 0.0, qnan_value, 0.0, qnan_value);
+ TEST_c_c (csin, minus_zero, qnan_value, minus_zero, qnan_value);
- TEST_c_c (csin, 10.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csin, nan_value, -10.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csin, 10.0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csin, qnan_value, -10.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csin, plus_infty, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csin, minus_infty, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csin, plus_infty, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csin, minus_infty, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csin, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (csin, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (csin, 0.75L, 1.25L, 1.28722291002649188575873510790565441L, 1.17210635989270256101081285116138863L);
TEST_c_c (csin, -2, -3, -9.15449914691142957346729954460983256L, 4.16890695996656435075481305885375484L);
@@ -3578,50 +3579,50 @@ csinh_test (void)
TEST_c_c (csinh, 0.0, minus_zero, 0.0, minus_zero);
TEST_c_c (csinh, minus_zero, minus_zero, minus_zero, minus_zero);
- TEST_c_c (csinh, 0.0, plus_infty, 0.0, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csinh, minus_zero, plus_infty, 0.0, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csinh, 0.0, minus_infty, 0.0, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csinh, minus_zero, minus_infty, 0.0, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, 0.0, plus_infty, 0.0, qnan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, minus_zero, plus_infty, 0.0, qnan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, 0.0, minus_infty, 0.0, qnan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, minus_zero, minus_infty, 0.0, qnan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
TEST_c_c (csinh, plus_infty, 0.0, plus_infty, 0.0);
TEST_c_c (csinh, minus_infty, 0.0, minus_infty, 0.0);
TEST_c_c (csinh, plus_infty, minus_zero, plus_infty, minus_zero);
TEST_c_c (csinh, minus_infty, minus_zero, minus_infty, minus_zero);
- TEST_c_c (csinh, plus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csinh, minus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csinh, plus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csinh, minus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, plus_infty, plus_infty, plus_infty, qnan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, minus_infty, plus_infty, plus_infty, qnan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, plus_infty, minus_infty, plus_infty, qnan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, minus_infty, minus_infty, plus_infty, qnan_value, INVALID_EXCEPTION|IGNORE_ZERO_INF_SIGN);
TEST_c_c (csinh, plus_infty, 4.625, minus_infty, minus_infty);
TEST_c_c (csinh, minus_infty, 4.625, plus_infty, minus_infty);
TEST_c_c (csinh, plus_infty, -4.625, minus_infty, plus_infty);
TEST_c_c (csinh, minus_infty, -4.625, plus_infty, plus_infty);
- TEST_c_c (csinh, 6.75, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (csinh, -6.75, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (csinh, 6.75, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (csinh, -6.75, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (csinh, 6.75, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (csinh, -6.75, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (csinh, 6.75, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (csinh, -6.75, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
- TEST_c_c (csinh, 0.0, nan_value, 0.0, nan_value, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csinh, minus_zero, nan_value, 0.0, nan_value, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, 0.0, qnan_value, 0.0, qnan_value, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, minus_zero, qnan_value, 0.0, qnan_value, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csinh, plus_infty, nan_value, plus_infty, nan_value, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csinh, minus_infty, nan_value, plus_infty, nan_value, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, plus_infty, qnan_value, plus_infty, qnan_value, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csinh, minus_infty, qnan_value, plus_infty, qnan_value, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csinh, 9.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csinh, -9.0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csinh, 9.0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csinh, -9.0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csinh, nan_value, 0.0, nan_value, 0.0);
- TEST_c_c (csinh, nan_value, minus_zero, nan_value, minus_zero);
+ TEST_c_c (csinh, qnan_value, 0.0, qnan_value, 0.0);
+ TEST_c_c (csinh, qnan_value, minus_zero, qnan_value, minus_zero);
- TEST_c_c (csinh, nan_value, 10.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csinh, nan_value, -10.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csinh, qnan_value, 10.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csinh, qnan_value, -10.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csinh, nan_value, plus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csinh, nan_value, minus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csinh, qnan_value, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csinh, qnan_value, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csinh, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (csinh, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (csinh, 0.75L, 1.25L, 0.259294854551162779153349830618433028L, 1.22863452409509552219214606515777594L);
TEST_c_c (csinh, -2, -3, 3.59056458998577995201256544779481679L, -0.530921086248519805267040090660676560L);
@@ -3700,21 +3701,21 @@ csqrt_test (void)
TEST_c_c (csqrt, -4, minus_infty, plus_infty, minus_infty);
TEST_c_c (csqrt, minus_infty, minus_infty, plus_infty, minus_infty);
- TEST_c_c (csqrt, minus_infty, nan_value, nan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (csqrt, minus_infty, qnan_value, qnan_value, plus_infty, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (csqrt, plus_infty, nan_value, plus_infty, nan_value);
+ TEST_c_c (csqrt, plus_infty, qnan_value, plus_infty, qnan_value);
- TEST_c_c (csqrt, 0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csqrt, 1, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csqrt, minus_zero, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csqrt, -1, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csqrt, 0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csqrt, 1, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csqrt, minus_zero, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csqrt, -1, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csqrt, nan_value, 0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csqrt, nan_value, 8, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csqrt, nan_value, minus_zero, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csqrt, nan_value, -8, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csqrt, qnan_value, 0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csqrt, qnan_value, 8, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csqrt, qnan_value, minus_zero, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (csqrt, qnan_value, -8, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (csqrt, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (csqrt, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (csqrt, 16.0, -30.0, 5.0, -3.0);
TEST_c_c (csqrt, -1, 0, 0.0, 1.0);
@@ -3808,30 +3809,30 @@ ctan_test (void)
TEST_c_c (ctan, minus_zero, minus_infty, minus_zero, -1.0);
TEST_c_c (ctan, -1, minus_infty, minus_zero, -1.0);
- TEST_c_c (ctan, plus_infty, 0, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctan, plus_infty, 2, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctan, minus_infty, 0, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctan, minus_infty, 2, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctan, plus_infty, minus_zero, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctan, plus_infty, -2, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctan, minus_infty, minus_zero, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctan, minus_infty, -2, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctan, plus_infty, 0, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctan, plus_infty, 2, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctan, minus_infty, 0, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctan, minus_infty, 2, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctan, plus_infty, minus_zero, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctan, plus_infty, -2, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctan, minus_infty, minus_zero, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctan, minus_infty, -2, qnan_value, qnan_value, INVALID_EXCEPTION);
- TEST_c_c (ctan, nan_value, plus_infty, 0.0, 1.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ctan, nan_value, minus_infty, 0.0, -1.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ctan, qnan_value, plus_infty, 0.0, 1.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ctan, qnan_value, minus_infty, 0.0, -1.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ctan, 0, nan_value, 0.0, nan_value);
- TEST_c_c (ctan, minus_zero, nan_value, minus_zero, nan_value);
+ TEST_c_c (ctan, 0, qnan_value, 0.0, qnan_value);
+ TEST_c_c (ctan, minus_zero, qnan_value, minus_zero, qnan_value);
- TEST_c_c (ctan, 0.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctan, -4.5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctan, 0.5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctan, -4.5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctan, nan_value, 0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctan, nan_value, 5, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctan, nan_value, minus_zero, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctan, nan_value, -0.25, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctan, qnan_value, 0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctan, qnan_value, 5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctan, qnan_value, minus_zero, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctan, qnan_value, -0.25, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctan, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (ctan, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (ctan, 0.75L, 1.25L, 0.160807785916206426725166058173438663L, 0.975363285031235646193581759755216379L);
TEST_c_c (ctan, -2, -3, 0.376402564150424829275122113032269084e-2L, -1.00323862735360980144635859782192726L);
@@ -4027,30 +4028,30 @@ ctanh_test (void)
TEST_c_c (ctanh, minus_infty, minus_zero, -1.0, minus_zero);
TEST_c_c (ctanh, minus_infty, -1, -1.0, minus_zero);
- TEST_c_c (ctanh, 0, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctanh, 2, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctanh, 0, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctanh, 2, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctanh, minus_zero, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctanh, -2, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctanh, minus_zero, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_c_c (ctanh, -2, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctanh, 0, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctanh, 2, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctanh, 0, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctanh, 2, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctanh, minus_zero, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctanh, -2, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctanh, minus_zero, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_c_c (ctanh, -2, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
- TEST_c_c (ctanh, plus_infty, nan_value, 1.0, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ctanh, minus_infty, nan_value, -1.0, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ctanh, plus_infty, qnan_value, 1.0, 0.0, IGNORE_ZERO_INF_SIGN);
+ TEST_c_c (ctanh, minus_infty, qnan_value, -1.0, 0.0, IGNORE_ZERO_INF_SIGN);
- TEST_c_c (ctanh, nan_value, 0, nan_value, 0.0);
- TEST_c_c (ctanh, nan_value, minus_zero, nan_value, minus_zero);
+ TEST_c_c (ctanh, qnan_value, 0, qnan_value, 0.0);
+ TEST_c_c (ctanh, qnan_value, minus_zero, qnan_value, minus_zero);
- TEST_c_c (ctanh, nan_value, 0.5, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctanh, nan_value, -4.5, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctanh, qnan_value, 0.5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctanh, qnan_value, -4.5, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctanh, 0, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctanh, 5, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctanh, minus_zero, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctanh, -0.25, nan_value, nan_value, nan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctanh, 0, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctanh, 5, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctanh, minus_zero, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_c_c (ctanh, -0.25, qnan_value, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
- TEST_c_c (ctanh, nan_value, nan_value, nan_value, nan_value);
+ TEST_c_c (ctanh, qnan_value, qnan_value, qnan_value, qnan_value);
TEST_c_c (ctanh, 0, M_PI_4l, 0.0, 1.0);
@@ -4238,7 +4239,7 @@ erf_test (void)
TEST_f_f (erf, minus_zero, minus_zero);
TEST_f_f (erf, plus_infty, 1);
TEST_f_f (erf, minus_infty, -1);
- TEST_f_f (erf, nan_value, nan_value);
+ TEST_f_f (erf, qnan_value, qnan_value);
TEST_f_f (erf, 0.125L, 0.140316204801333817393029446521623398L);
TEST_f_f (erf, 0.75L, 0.711155633653515131598937834591410777L);
@@ -4266,7 +4267,7 @@ erfc_test (void)
TEST_f_f (erfc, minus_infty, 2.0);
TEST_f_f (erfc, 0.0, 1.0);
TEST_f_f (erfc, minus_zero, 1.0);
- TEST_f_f (erfc, nan_value, nan_value);
+ TEST_f_f (erfc, qnan_value, qnan_value);
TEST_f_f (erfc, 0.125L, 0.859683795198666182606970553478376602L);
TEST_f_f (erfc, 0.75L, 0.288844366346484868401062165408589223L);
@@ -4313,7 +4314,7 @@ exp_test (void)
TEST_f_f (exp, plus_infty, plus_infty);
TEST_f_f (exp, minus_infty, 0);
#endif
- TEST_f_f (exp, nan_value, nan_value);
+ TEST_f_f (exp, qnan_value, qnan_value);
TEST_f_f (exp, 1, M_El);
TEST_f_f (exp, 2, M_E2l);
@@ -4462,7 +4463,7 @@ exp10_test (void)
TEST_f_f (exp10, plus_infty, plus_infty);
TEST_f_f (exp10, minus_infty, 0);
- TEST_f_f (exp10, nan_value, nan_value);
+ TEST_f_f (exp10, qnan_value, qnan_value);
TEST_f_f (exp10, 3, 1000);
TEST_f_f (exp10, -1, 0.1L);
TEST_f_f (exp10, 36, 1.0e36L);
@@ -4500,7 +4501,7 @@ exp2_test (void)
TEST_f_f (exp2, minus_zero, 1);
TEST_f_f (exp2, plus_infty, plus_infty);
TEST_f_f (exp2, minus_infty, 0);
- TEST_f_f (exp2, nan_value, nan_value);
+ TEST_f_f (exp2, qnan_value, qnan_value);
TEST_f_f (exp2, 10, 1024);
TEST_f_f (exp2, -1, 0.5);
@@ -4547,7 +4548,7 @@ expm1_test (void)
TEST_f_f (expm1, plus_infty, plus_infty);
TEST_f_f (expm1, minus_infty, -1);
#endif
- TEST_f_f (expm1, nan_value, nan_value);
+ TEST_f_f (expm1, qnan_value, qnan_value);
TEST_f_f (expm1, 1, M_El - 1.0);
TEST_f_f (expm1, 0.75L, 1.11700001661267466854536981983709561L);
@@ -4604,7 +4605,7 @@ fabs_test (void)
TEST_f_f (fabs, plus_infty, plus_infty);
TEST_f_f (fabs, minus_infty, plus_infty);
- TEST_f_f (fabs, nan_value, nan_value);
+ TEST_f_f (fabs, qnan_value, qnan_value);
TEST_f_f (fabs, 38.0, 38.0);
TEST_f_f (fabs, -M_El, M_El);
@@ -4633,16 +4634,16 @@ fdim_test (void)
TEST_ff_f (fdim, 9, plus_infty, 0);
TEST_ff_f (fdim, -9, plus_infty, 0);
- TEST_ff_f (fdim, 0, nan_value, nan_value);
- TEST_ff_f (fdim, 9, nan_value, nan_value);
- TEST_ff_f (fdim, -9, nan_value, nan_value);
- TEST_ff_f (fdim, nan_value, 9, nan_value);
- TEST_ff_f (fdim, nan_value, -9, nan_value);
- TEST_ff_f (fdim, plus_infty, nan_value, nan_value);
- TEST_ff_f (fdim, minus_infty, nan_value, nan_value);
- TEST_ff_f (fdim, nan_value, plus_infty, nan_value);
- TEST_ff_f (fdim, nan_value, minus_infty, nan_value);
- TEST_ff_f (fdim, nan_value, nan_value, nan_value);
+ TEST_ff_f (fdim, 0, qnan_value, qnan_value);
+ TEST_ff_f (fdim, 9, qnan_value, qnan_value);
+ TEST_ff_f (fdim, -9, qnan_value, qnan_value);
+ TEST_ff_f (fdim, qnan_value, 9, qnan_value);
+ TEST_ff_f (fdim, qnan_value, -9, qnan_value);
+ TEST_ff_f (fdim, plus_infty, qnan_value, qnan_value);
+ TEST_ff_f (fdim, minus_infty, qnan_value, qnan_value);
+ TEST_ff_f (fdim, qnan_value, plus_infty, qnan_value);
+ TEST_ff_f (fdim, qnan_value, minus_infty, qnan_value);
+ TEST_ff_f (fdim, qnan_value, qnan_value, qnan_value);
TEST_ff_f (fdim, plus_infty, plus_infty, 0);
@@ -4661,7 +4662,7 @@ finite_test (void)
TEST_f_b (finite, min_subnorm_value, 1);
TEST_f_b (finite, plus_infty, 0);
TEST_f_b (finite, minus_infty, 0);
- TEST_f_b (finite, nan_value, 0);
+ TEST_f_b (finite, qnan_value, 0);
END (finite);
}
@@ -4676,7 +4677,7 @@ floor_test (void)
TEST_f_f (floor, minus_zero, minus_zero);
TEST_f_f (floor, plus_infty, plus_infty);
TEST_f_f (floor, minus_infty, minus_infty);
- TEST_f_f (floor, nan_value, nan_value);
+ TEST_f_f (floor, qnan_value, qnan_value);
TEST_f_f (floor, M_PIl, 3.0);
TEST_f_f (floor, -M_PIl, -4.0);
@@ -4774,26 +4775,26 @@ fma_test (void)
START (fma);
TEST_fff_f (fma, 1.0, 2.0, 3.0, 5.0);
- TEST_fff_f (fma, nan_value, 2.0, 3.0, nan_value);
- TEST_fff_f (fma, 1.0, nan_value, 3.0, nan_value);
- TEST_fff_f (fma, 1.0, 2.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_fff_f (fma, plus_infty, 0.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_fff_f (fma, minus_infty, 0.0, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_fff_f (fma, 0.0, plus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_fff_f (fma, 0.0, minus_infty, nan_value, nan_value, INVALID_EXCEPTION_OK);
- TEST_fff_f (fma, plus_infty, 0.0, 1.0, nan_value, INVALID_EXCEPTION);
- TEST_fff_f (fma, minus_infty, 0.0, 1.0, nan_value, INVALID_EXCEPTION);
- TEST_fff_f (fma, 0.0, plus_infty, 1.0, nan_value, INVALID_EXCEPTION);
- TEST_fff_f (fma, 0.0, minus_infty, 1.0, nan_value, INVALID_EXCEPTION);
-
- TEST_fff_f (fma, plus_infty, plus_infty, minus_infty, nan_value, INVALID_EXCEPTION);
- TEST_fff_f (fma, minus_infty, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_fff_f (fma, plus_infty, minus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_fff_f (fma, minus_infty, minus_infty, minus_infty, nan_value, INVALID_EXCEPTION);
- TEST_fff_f (fma, plus_infty, 3.5L, minus_infty, nan_value, INVALID_EXCEPTION);
- TEST_fff_f (fma, minus_infty, -7.5L, minus_infty, nan_value, INVALID_EXCEPTION);
- TEST_fff_f (fma, -13.5L, plus_infty, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_fff_f (fma, minus_infty, 7.5L, plus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, qnan_value, 2.0, 3.0, qnan_value);
+ TEST_fff_f (fma, 1.0, qnan_value, 3.0, qnan_value);
+ TEST_fff_f (fma, 1.0, 2.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_fff_f (fma, plus_infty, 0.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_fff_f (fma, minus_infty, 0.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_fff_f (fma, 0.0, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_fff_f (fma, 0.0, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+ TEST_fff_f (fma, plus_infty, 0.0, 1.0, qnan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, minus_infty, 0.0, 1.0, qnan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, 0.0, plus_infty, 1.0, qnan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, 0.0, minus_infty, 1.0, qnan_value, INVALID_EXCEPTION);
+
+ TEST_fff_f (fma, plus_infty, plus_infty, minus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, minus_infty, plus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, plus_infty, minus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, minus_infty, minus_infty, minus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, plus_infty, 3.5L, minus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, minus_infty, -7.5L, minus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, -13.5L, plus_infty, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_fff_f (fma, minus_infty, 7.5L, plus_infty, qnan_value, INVALID_EXCEPTION);
TEST_fff_f (fma, 1.25L, 0.75L, 0.0625L, 1.0L);
@@ -5741,17 +5742,17 @@ fmax_test (void)
TEST_ff_f (fmax, 9, minus_infty, 9);
TEST_ff_f (fmax, -9, minus_infty, -9);
- TEST_ff_f (fmax, 0, nan_value, 0);
- TEST_ff_f (fmax, 9, nan_value, 9);
- TEST_ff_f (fmax, -9, nan_value, -9);
- TEST_ff_f (fmax, nan_value, 0, 0);
- TEST_ff_f (fmax, nan_value, 9, 9);
- TEST_ff_f (fmax, nan_value, -9, -9);
- TEST_ff_f (fmax, plus_infty, nan_value, plus_infty);
- TEST_ff_f (fmax, minus_infty, nan_value, minus_infty);
- TEST_ff_f (fmax, nan_value, plus_infty, plus_infty);
- TEST_ff_f (fmax, nan_value, minus_infty, minus_infty);
- TEST_ff_f (fmax, nan_value, nan_value, nan_value);
+ TEST_ff_f (fmax, 0, qnan_value, 0);
+ TEST_ff_f (fmax, 9, qnan_value, 9);
+ TEST_ff_f (fmax, -9, qnan_value, -9);
+ TEST_ff_f (fmax, qnan_value, 0, 0);
+ TEST_ff_f (fmax, qnan_value, 9, 9);
+ TEST_ff_f (fmax, qnan_value, -9, -9);
+ TEST_ff_f (fmax, plus_infty, qnan_value, plus_infty);
+ TEST_ff_f (fmax, minus_infty, qnan_value, minus_infty);
+ TEST_ff_f (fmax, qnan_value, plus_infty, plus_infty);
+ TEST_ff_f (fmax, qnan_value, minus_infty, minus_infty);
+ TEST_ff_f (fmax, qnan_value, qnan_value, qnan_value);
END (fmax);
}
@@ -5778,17 +5779,17 @@ fmin_test (void)
TEST_ff_f (fmin, 9, minus_infty, minus_infty);
TEST_ff_f (fmin, -9, minus_infty, minus_infty);
- TEST_ff_f (fmin, 0, nan_value, 0);
- TEST_ff_f (fmin, 9, nan_value, 9);
- TEST_ff_f (fmin, -9, nan_value, -9);
- TEST_ff_f (fmin, nan_value, 0, 0);
- TEST_ff_f (fmin, nan_value, 9, 9);
- TEST_ff_f (fmin, nan_value, -9, -9);
- TEST_ff_f (fmin, plus_infty, nan_value, plus_infty);
- TEST_ff_f (fmin, minus_infty, nan_value, minus_infty);
- TEST_ff_f (fmin, nan_value, plus_infty, plus_infty);
- TEST_ff_f (fmin, nan_value, minus_infty, minus_infty);
- TEST_ff_f (fmin, nan_value, nan_value, nan_value);
+ TEST_ff_f (fmin, 0, qnan_value, 0);
+ TEST_ff_f (fmin, 9, qnan_value, 9);
+ TEST_ff_f (fmin, -9, qnan_value, -9);
+ TEST_ff_f (fmin, qnan_value, 0, 0);
+ TEST_ff_f (fmin, qnan_value, 9, 9);
+ TEST_ff_f (fmin, qnan_value, -9, -9);
+ TEST_ff_f (fmin, plus_infty, qnan_value, plus_infty);
+ TEST_ff_f (fmin, minus_infty, qnan_value, minus_infty);
+ TEST_ff_f (fmin, qnan_value, plus_infty, plus_infty);
+ TEST_ff_f (fmin, qnan_value, minus_infty, minus_infty);
+ TEST_ff_f (fmin, qnan_value, qnan_value, qnan_value);
END (fmin);
}
@@ -5811,27 +5812,27 @@ fmod_test (void)
/* fmod (-0, y) == -0 for y != 0. */
TEST_ff_f (fmod, minus_zero, 3, minus_zero);
- /* fmod (+inf, y) == NaN plus invalid exception. */
+ /* fmod (+inf, y) == qNaN plus invalid exception. */
errno = 0;
- TEST_ff_f (fmod, plus_infty, 3, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (fmod, plus_infty, 3, qnan_value, INVALID_EXCEPTION);
check_int ("errno for fmod(Inf,3) unchanged", errno, EDOM, 0, 0, 0);
- /* fmod (-inf, y) == NaN plus invalid exception. */
+ /* fmod (-inf, y) == qNaN plus invalid exception. */
errno = 0;
- TEST_ff_f (fmod, minus_infty, 3, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (fmod, minus_infty, 3, qnan_value, INVALID_EXCEPTION);
check_int ("errno for fmod(-Inf,3) unchanged", errno, EDOM, 0, 0, 0);
- /* fmod (x, +0) == NaN plus invalid exception. */
+ /* fmod (x, +0) == qNaN plus invalid exception. */
errno = 0;
- TEST_ff_f (fmod, 3, 0, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (fmod, 3, 0, qnan_value, INVALID_EXCEPTION);
check_int ("errno for fmod(3,0) unchanged", errno, EDOM, 0, 0, 0);
- /* fmod (x, -0) == NaN plus invalid exception. */
- TEST_ff_f (fmod, 3, minus_zero, nan_value, INVALID_EXCEPTION);
+ /* fmod (x, -0) == qNaN plus invalid exception. */
+ TEST_ff_f (fmod, 3, minus_zero, qnan_value, INVALID_EXCEPTION);
/* fmod (x, +inf) == x for x not infinite. */
TEST_ff_f (fmod, 3.0, plus_infty, 3.0);
/* fmod (x, -inf) == x for x not infinite. */
TEST_ff_f (fmod, 3.0, minus_infty, 3.0);
- TEST_ff_f (fmod, nan_value, nan_value, nan_value);
+ TEST_ff_f (fmod, qnan_value, qnan_value, qnan_value);
TEST_ff_f (fmod, 6.5, 2.25L, 2.0L);
TEST_ff_f (fmod, -6.5, 2.25L, -2.0L);
@@ -5855,7 +5856,7 @@ fpclassify_test (void)
{
START (fpclassify);
- TEST_f_i (fpclassify, nan_value, FP_NAN);
+ TEST_f_i (fpclassify, qnan_value, FP_NAN);
TEST_f_i (fpclassify, plus_infty, FP_INFINITE);
TEST_f_i (fpclassify, minus_infty, FP_INFINITE);
TEST_f_i (fpclassify, plus_zero, FP_ZERO);
@@ -5876,7 +5877,7 @@ frexp_test (void)
TEST_fI_f1 (frexp, plus_infty, plus_infty, IGNORE);
TEST_fI_f1 (frexp, minus_infty, minus_infty, IGNORE);
- TEST_fI_f1 (frexp, nan_value, nan_value, IGNORE);
+ TEST_fI_f1 (frexp, qnan_value, qnan_value, IGNORE);
TEST_fI_f1 (frexp, 0.0, 0.0, 0.0);
TEST_fI_f1 (frexp, minus_zero, minus_zero, 0.0);
@@ -5904,7 +5905,7 @@ gamma_test (void)
TEST_f_f (gamma, 0, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
TEST_f_f (gamma, -3, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
TEST_f_f (gamma, minus_infty, plus_infty);
- TEST_f_f (gamma, nan_value, nan_value);
+ TEST_f_f (gamma, qnan_value, qnan_value);
TEST_f_f1 (gamma, 1, 0, 1);
TEST_f_f1 (gamma, 3, M_LN2l, 1);
@@ -5930,13 +5931,13 @@ hypot_test (void)
TEST_ff_f (hypot, minus_infty, 1, plus_infty, IGNORE_ZERO_INF_SIGN);
#ifndef TEST_INLINE
- TEST_ff_f (hypot, plus_infty, nan_value, plus_infty);
- TEST_ff_f (hypot, minus_infty, nan_value, plus_infty);
- TEST_ff_f (hypot, nan_value, plus_infty, plus_infty);
- TEST_ff_f (hypot, nan_value, minus_infty, plus_infty);
+ TEST_ff_f (hypot, plus_infty, qnan_value, plus_infty);
+ TEST_ff_f (hypot, minus_infty, qnan_value, plus_infty);
+ TEST_ff_f (hypot, qnan_value, plus_infty, plus_infty);
+ TEST_ff_f (hypot, qnan_value, minus_infty, plus_infty);
#endif
- TEST_ff_f (hypot, nan_value, nan_value, nan_value);
+ TEST_ff_f (hypot, qnan_value, qnan_value, qnan_value);
/* hypot (x,y) == hypot (+-x, +-y) */
TEST_ff_f (hypot, 0.7L, 12.4L, 12.419742348374220601176836866763271L);
@@ -5991,10 +5992,10 @@ ilogb_test (void)
errno = 0;
TEST_f_i (ilogb, 0.0, FP_ILOGB0, INVALID_EXCEPTION);
check_int ("errno for ilogb(0.0) unchanged", errno, EDOM, 0, 0, 0);
- /* ilogb (NaN) == FP_ILOGBNAN plus invalid exception */
+ /* ilogb (qNaN) == FP_ILOGBNAN plus invalid exception */
errno = 0;
- TEST_f_i (ilogb, nan_value, FP_ILOGBNAN, INVALID_EXCEPTION);
- check_int ("errno for ilogb(NaN) unchanged", errno, EDOM, 0, 0, 0);
+ TEST_f_i (ilogb, qnan_value, FP_ILOGBNAN, INVALID_EXCEPTION);
+ check_int ("errno for ilogb(qNaN) unchanged", errno, EDOM, 0, 0, 0);
/* ilogb (inf) == INT_MAX plus invalid exception */
errno = 0;
TEST_f_i (ilogb, plus_infty, INT_MAX, INVALID_EXCEPTION);
@@ -6018,7 +6019,7 @@ isfinite_test (void)
TEST_f_b (isfinite, min_subnorm_value, 1);
TEST_f_b (isfinite, plus_infty, 0);
TEST_f_b (isfinite, minus_infty, 0);
- TEST_f_b (isfinite, nan_value, 0);
+ TEST_f_b (isfinite, qnan_value, 0);
END (isfinite);
}
@@ -6031,19 +6032,19 @@ isgreater_test (void)
TEST_ff_i (isgreater, minus_zero, minus_zero, 0);
TEST_ff_i (isgreater, minus_zero, plus_zero, 0);
TEST_ff_i (isgreater, minus_zero, (FLOAT) 1, 0);
- TEST_ff_i (isgreater, minus_zero, nan_value, 0);
+ TEST_ff_i (isgreater, minus_zero, qnan_value, 0);
TEST_ff_i (isgreater, plus_zero, minus_zero, 0);
TEST_ff_i (isgreater, plus_zero, plus_zero, 0);
TEST_ff_i (isgreater, plus_zero, (FLOAT) 1, 0);
- TEST_ff_i (isgreater, plus_zero, nan_value, 0);
+ TEST_ff_i (isgreater, plus_zero, qnan_value, 0);
TEST_ff_i (isgreater, (FLOAT) 1, minus_zero, 1);
TEST_ff_i (isgreater, (FLOAT) 1, plus_zero, 1);
TEST_ff_i (isgreater, (FLOAT) 1, (FLOAT) 1, 0);
- TEST_ff_i (isgreater, (FLOAT) 1, nan_value, 0);
- TEST_ff_i (isgreater, nan_value, minus_zero, 0);
- TEST_ff_i (isgreater, nan_value, plus_zero, 0);
- TEST_ff_i (isgreater, nan_value, (FLOAT) 1, 0);
- TEST_ff_i (isgreater, nan_value, nan_value, 0);
+ TEST_ff_i (isgreater, (FLOAT) 1, qnan_value, 0);
+ TEST_ff_i (isgreater, qnan_value, minus_zero, 0);
+ TEST_ff_i (isgreater, qnan_value, plus_zero, 0);
+ TEST_ff_i (isgreater, qnan_value, (FLOAT) 1, 0);
+ TEST_ff_i (isgreater, qnan_value, qnan_value, 0);
END (isgreater);
}
@@ -6056,19 +6057,19 @@ isgreaterequal_test (void)
TEST_ff_i (isgreaterequal, minus_zero, minus_zero, 1);
TEST_ff_i (isgreaterequal, minus_zero, plus_zero, 1);
TEST_ff_i (isgreaterequal, minus_zero, (FLOAT) 1, 0);
- TEST_ff_i (isgreaterequal, minus_zero, nan_value, 0);
+ TEST_ff_i (isgreaterequal, minus_zero, qnan_value, 0);
TEST_ff_i (isgreaterequal, plus_zero, minus_zero, 1);
TEST_ff_i (isgreaterequal, plus_zero, plus_zero, 1);
TEST_ff_i (isgreaterequal, plus_zero, (FLOAT) 1, 0);
- TEST_ff_i (isgreaterequal, plus_zero, nan_value, 0);
+ TEST_ff_i (isgreaterequal, plus_zero, qnan_value, 0);
TEST_ff_i (isgreaterequal, (FLOAT) 1, minus_zero, 1);
TEST_ff_i (isgreaterequal, (FLOAT) 1, plus_zero, 1);
TEST_ff_i (isgreaterequal, (FLOAT) 1, (FLOAT) 1, 1);
- TEST_ff_i (isgreaterequal, (FLOAT) 1, nan_value, 0);
- TEST_ff_i (isgreaterequal, nan_value, minus_zero, 0);
- TEST_ff_i (isgreaterequal, nan_value, plus_zero, 0);
- TEST_ff_i (isgreaterequal, nan_value, (FLOAT) 1, 0);
- TEST_ff_i (isgreaterequal, nan_value, nan_value, 0);
+ TEST_ff_i (isgreaterequal, (FLOAT) 1, qnan_value, 0);
+ TEST_ff_i (isgreaterequal, qnan_value, minus_zero, 0);
+ TEST_ff_i (isgreaterequal, qnan_value, plus_zero, 0);
+ TEST_ff_i (isgreaterequal, qnan_value, (FLOAT) 1, 0);
+ TEST_ff_i (isgreaterequal, qnan_value, qnan_value, 0);
END (isgreaterequal);
}
@@ -6084,7 +6085,7 @@ isinf_test (void)
TEST_f_b (isinf, min_subnorm_value, 0);
TEST_f_b (isinf, plus_infty, 1);
TEST_f_b (isinf, minus_infty, 1);
- TEST_f_b (isinf, nan_value, 0);
+ TEST_f_b (isinf, qnan_value, 0);
END (isinf);
}
@@ -6097,19 +6098,19 @@ isless_test (void)
TEST_ff_i (isless, minus_zero, minus_zero, 0);
TEST_ff_i (isless, minus_zero, plus_zero, 0);
TEST_ff_i (isless, minus_zero, (FLOAT) 1, 1);
- TEST_ff_i (isless, minus_zero, nan_value, 0);
+ TEST_ff_i (isless, minus_zero, qnan_value, 0);
TEST_ff_i (isless, plus_zero, minus_zero, 0);
TEST_ff_i (isless, plus_zero, plus_zero, 0);
TEST_ff_i (isless, plus_zero, (FLOAT) 1, 1);
- TEST_ff_i (isless, plus_zero, nan_value, 0);
+ TEST_ff_i (isless, plus_zero, qnan_value, 0);
TEST_ff_i (isless, (FLOAT) 1, minus_zero, 0);
TEST_ff_i (isless, (FLOAT) 1, plus_zero, 0);
TEST_ff_i (isless, (FLOAT) 1, (FLOAT) 1, 0);
- TEST_ff_i (isless, (FLOAT) 1, nan_value, 0);
- TEST_ff_i (isless, nan_value, minus_zero, 0);
- TEST_ff_i (isless, nan_value, plus_zero, 0);
- TEST_ff_i (isless, nan_value, (FLOAT) 1, 0);
- TEST_ff_i (isless, nan_value, nan_value, 0);
+ TEST_ff_i (isless, (FLOAT) 1, qnan_value, 0);
+ TEST_ff_i (isless, qnan_value, minus_zero, 0);
+ TEST_ff_i (isless, qnan_value, plus_zero, 0);
+ TEST_ff_i (isless, qnan_value, (FLOAT) 1, 0);
+ TEST_ff_i (isless, qnan_value, qnan_value, 0);
END (isless);
}
@@ -6122,19 +6123,19 @@ islessequal_test (void)
TEST_ff_i (islessequal, minus_zero, minus_zero, 1);
TEST_ff_i (islessequal, minus_zero, plus_zero, 1);
TEST_ff_i (islessequal, minus_zero, (FLOAT) 1, 1);
- TEST_ff_i (islessequal, minus_zero, nan_value, 0);
+ TEST_ff_i (islessequal, minus_zero, qnan_value, 0);
TEST_ff_i (islessequal, plus_zero, minus_zero, 1);
TEST_ff_i (islessequal, plus_zero, plus_zero, 1);
TEST_ff_i (islessequal, plus_zero, (FLOAT) 1, 1);
- TEST_ff_i (islessequal, plus_zero, nan_value, 0);
+ TEST_ff_i (islessequal, plus_zero, qnan_value, 0);
TEST_ff_i (islessequal, (FLOAT) 1, minus_zero, 0);
TEST_ff_i (islessequal, (FLOAT) 1, plus_zero, 0);
TEST_ff_i (islessequal, (FLOAT) 1, (FLOAT) 1, 1);
- TEST_ff_i (islessequal, (FLOAT) 1, nan_value, 0);
- TEST_ff_i (islessequal, nan_value, minus_zero, 0);
- TEST_ff_i (islessequal, nan_value, plus_zero, 0);
- TEST_ff_i (islessequal, nan_value, (FLOAT) 1, 0);
- TEST_ff_i (islessequal, nan_value, nan_value, 0);
+ TEST_ff_i (islessequal, (FLOAT) 1, qnan_value, 0);
+ TEST_ff_i (islessequal, qnan_value, minus_zero, 0);
+ TEST_ff_i (islessequal, qnan_value, plus_zero, 0);
+ TEST_ff_i (islessequal, qnan_value, (FLOAT) 1, 0);
+ TEST_ff_i (islessequal, qnan_value, qnan_value, 0);
END (islessequal);
}
@@ -6147,19 +6148,19 @@ islessgreater_test (void)
TEST_ff_i (islessgreater, minus_zero, minus_zero, 0);
TEST_ff_i (islessgreater, minus_zero, plus_zero, 0);
TEST_ff_i (islessgreater, minus_zero, (FLOAT) 1, 1);
- TEST_ff_i (islessgreater, minus_zero, nan_value, 0);
+ TEST_ff_i (islessgreater, minus_zero, qnan_value, 0);
TEST_ff_i (islessgreater, plus_zero, minus_zero, 0);
TEST_ff_i (islessgreater, plus_zero, plus_zero, 0);
TEST_ff_i (islessgreater, plus_zero, (FLOAT) 1, 1);
- TEST_ff_i (islessgreater, plus_zero, nan_value, 0);
+ TEST_ff_i (islessgreater, plus_zero, qnan_value, 0);
TEST_ff_i (islessgreater, (FLOAT) 1, minus_zero, 1);
TEST_ff_i (islessgreater, (FLOAT) 1, plus_zero, 1);
TEST_ff_i (islessgreater, (FLOAT) 1, (FLOAT) 1, 0);
- TEST_ff_i (islessgreater, (FLOAT) 1, nan_value, 0);
- TEST_ff_i (islessgreater, nan_value, minus_zero, 0);
- TEST_ff_i (islessgreater, nan_value, plus_zero, 0);
- TEST_ff_i (islessgreater, nan_value, (FLOAT) 1, 0);
- TEST_ff_i (islessgreater, nan_value, nan_value, 0);
+ TEST_ff_i (islessgreater, (FLOAT) 1, qnan_value, 0);
+ TEST_ff_i (islessgreater, qnan_value, minus_zero, 0);
+ TEST_ff_i (islessgreater, qnan_value, plus_zero, 0);
+ TEST_ff_i (islessgreater, qnan_value, (FLOAT) 1, 0);
+ TEST_ff_i (islessgreater, qnan_value, qnan_value, 0);
END (islessgreater);
}
@@ -6175,7 +6176,7 @@ isnan_test (void)
TEST_f_b (isnan, min_subnorm_value, 0);
TEST_f_b (isnan, plus_infty, 0);
TEST_f_b (isnan, minus_infty, 0);
- TEST_f_b (isnan, nan_value, 1);
+ TEST_f_b (isnan, qnan_value, 1);
END (isnan);
}
@@ -6191,7 +6192,7 @@ isnormal_test (void)
TEST_f_b (isnormal, min_subnorm_value, 0);
TEST_f_b (isnormal, plus_infty, 0);
TEST_f_b (isnormal, minus_infty, 0);
- TEST_f_b (isnormal, nan_value, 0);
+ TEST_f_b (isnormal, qnan_value, 0);
END (isnormal);
}
@@ -6204,19 +6205,19 @@ isunordered_test (void)
TEST_ff_i (isunordered, minus_zero, minus_zero, 0);
TEST_ff_i (isunordered, minus_zero, plus_zero, 0);
TEST_ff_i (isunordered, minus_zero, (FLOAT) 1, 0);
- TEST_ff_i (isunordered, minus_zero, nan_value, 1);
+ TEST_ff_i (isunordered, minus_zero, qnan_value, 1);
TEST_ff_i (isunordered, plus_zero, minus_zero, 0);
TEST_ff_i (isunordered, plus_zero, plus_zero, 0);
TEST_ff_i (isunordered, plus_zero, (FLOAT) 1, 0);
- TEST_ff_i (isunordered, plus_zero, nan_value, 1);
+ TEST_ff_i (isunordered, plus_zero, qnan_value, 1);
TEST_ff_i (isunordered, (FLOAT) 1, minus_zero, 0);
TEST_ff_i (isunordered, (FLOAT) 1, plus_zero, 0);
TEST_ff_i (isunordered, (FLOAT) 1, (FLOAT) 1, 0);
- TEST_ff_i (isunordered, (FLOAT) 1, nan_value, 1);
- TEST_ff_i (isunordered, nan_value, minus_zero, 1);
- TEST_ff_i (isunordered, nan_value, plus_zero, 1);
- TEST_ff_i (isunordered, nan_value, (FLOAT) 1, 1);
- TEST_ff_i (isunordered, nan_value, nan_value, 1);
+ TEST_ff_i (isunordered, (FLOAT) 1, qnan_value, 1);
+ TEST_ff_i (isunordered, qnan_value, minus_zero, 1);
+ TEST_ff_i (isunordered, qnan_value, plus_zero, 1);
+ TEST_ff_i (isunordered, qnan_value, (FLOAT) 1, 1);
+ TEST_ff_i (isunordered, qnan_value, qnan_value, 1);
END (isunordered);
}
@@ -6238,7 +6239,7 @@ j0_test (void)
START (j0);
/* j0 is the Bessel function of the first kind of order 0 */
- TEST_f_f (j0, nan_value, nan_value);
+ TEST_f_f (j0, qnan_value, qnan_value);
TEST_f_f (j0, plus_infty, 0);
TEST_f_f (j0, -1.0, 0.765197686557966551449717526102663221L);
TEST_f_f (j0, 0.0, 1.0);
@@ -6252,12 +6253,15 @@ j0_test (void)
TEST_f_f (j0, 4.0, -3.9714980986384737228659076845169804197562E-1L);
TEST_f_f (j0, -4.0, -3.9714980986384737228659076845169804197562E-1L);
- /* Bug 14155: spurious exception may occur. */
- TEST_f_f (j0, 0x1.d7ce3ap+107L, 2.775523647291230802651040996274861694514e-17L, UNDERFLOW_EXCEPTION_OK);
+ TEST_f_f (j0, 0x1.d7ce3ap+107L, 2.775523647291230802651040996274861694514e-17L);
#ifndef TEST_FLOAT
- /* Bug 14155: spurious exception may occur. */
- TEST_f_f (j0, -0x1.001000001p+593L, -3.927269966354206207832593635798954916263e-90L, UNDERFLOW_EXCEPTION_OK);
+ TEST_f_f (j0, -0x1.001000001p+593L, -3.927269966354206207832593635798954916263e-90L);
+#endif
+
+#if defined TEST_LDOUBLE && LDBL_MAX_EXP >= 16384
+ TEST_f_f (j0, 0x1p16382L, -1.2193782500509000574176799046642541129387e-2466L);
+ TEST_f_f (j0, 0x1p16383L, 9.5859502826270374691362975419147645151233e-2467L);
#endif
END (j0);
@@ -6282,7 +6286,7 @@ j1_test (void)
START (j1);
- TEST_f_f (j1, nan_value, nan_value);
+ TEST_f_f (j1, qnan_value, qnan_value);
TEST_f_f (j1, plus_infty, 0);
TEST_f_f (j1, -1.0, -0.440050585744933515959682203718914913L);
@@ -6298,8 +6302,12 @@ j1_test (void)
TEST_f_f (j1, 0x1.3ffp+74L, 1.818984347516051243459364437186082741567e-12L);
#ifndef TEST_FLOAT
- /* Bug 14155: spurious exception may occur. */
- TEST_f_f (j1, 0x1.ff00000000002p+840L, 1.846591691699331493194965158699937660696e-127L, UNDERFLOW_EXCEPTION_OK);
+ TEST_f_f (j1, 0x1.ff00000000002p+840L, 1.846591691699331493194965158699937660696e-127L);
+#endif
+
+#if defined TEST_LDOUBLE && LDBL_MAX_EXP >= 16384
+ TEST_f_f (j1, 0x1p16382L, 8.0839224448726336195866026476176740513439e-2467L);
+ TEST_f_f (j1, 0x1p16383L, -3.8895531955766020648617743624167352352217e-2467L);
#endif
END (j1);
@@ -6323,7 +6331,7 @@ jn_test (void)
START (jn);
/* jn (0, x) == j0 (x) */
- TEST_ff_f (jn, 0, nan_value, nan_value);
+ TEST_ff_f (jn, 0, qnan_value, qnan_value);
TEST_ff_f (jn, 0, plus_infty, 0);
TEST_ff_f (jn, 0, -1.0, 0.765197686557966551449717526102663221L);
TEST_ff_f (jn, 0, 0.0, 1.0);
@@ -6338,7 +6346,7 @@ jn_test (void)
TEST_ff_f (jn, 0, -4.0, -3.9714980986384737228659076845169804197562E-1L);
/* jn (1, x) == j1 (x) */
- TEST_ff_f (jn, 1, nan_value, nan_value);
+ TEST_ff_f (jn, 1, qnan_value, qnan_value);
TEST_ff_f (jn, 1, plus_infty, 0);
TEST_ff_f (jn, 1, -1.0, -0.440050585744933515959682203718914913L);
TEST_ff_f (jn, 1, 0.0, 0.0);
@@ -6351,7 +6359,7 @@ jn_test (void)
TEST_ff_f (jn, 1, 10.0, 0.0434727461688614366697487680258592883L);
/* jn (3, x) */
- TEST_ff_f (jn, 3, nan_value, nan_value);
+ TEST_ff_f (jn, 3, qnan_value, qnan_value);
TEST_ff_f (jn, 3, plus_infty, 0);
TEST_ff_f (jn, 3, -1.0, -0.0195633539826684059189053216217515083L);
@@ -6363,7 +6371,7 @@ jn_test (void)
TEST_ff_f (jn, 3, 10.0, 0.0583793793051868123429354784103409563L);
/* jn (10, x) */
- TEST_ff_f (jn, 10, nan_value, nan_value);
+ TEST_ff_f (jn, 10, qnan_value, qnan_value);
TEST_ff_f (jn, 10, plus_infty, 0);
TEST_ff_f (jn, 10, -1.0, 0.263061512368745320699785368779050294e-9L);
@@ -6394,18 +6402,22 @@ jn_test (void)
static void
ldexp_test (void)
{
+ START (ldexp);
+
TEST_ff_f (ldexp, 0, 0, 0);
TEST_ff_f (ldexp, minus_zero, 0, minus_zero);
TEST_ff_f (ldexp, plus_infty, 1, plus_infty);
TEST_ff_f (ldexp, minus_infty, 1, minus_infty);
- TEST_ff_f (ldexp, nan_value, 1, nan_value);
+ TEST_ff_f (ldexp, qnan_value, 1, qnan_value);
TEST_ff_f (ldexp, 0.8L, 4, 12.8L);
TEST_ff_f (ldexp, -0.854375L, 5, -27.34L);
/* ldexp (x, 0) == x. */
TEST_ff_f (ldexp, 1.0L, 0L, 1.0L);
+
+ END (ldexp);
}
@@ -6425,7 +6437,7 @@ lgamma_test (void)
check_int ("signgam for lgamma(0) == 1", signgam, 1, 0, 0, 0);
TEST_f_f (lgamma, minus_zero, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
check_int ("signgam for lgamma(-0) == -1", signgam, -1, 0, 0, 0);
- TEST_f_f (lgamma, nan_value, nan_value);
+ TEST_f_f (lgamma, qnan_value, qnan_value);
/* lgamma (x) == +inf plus divide by zero exception for integer x <= 0. */
errno = 0;
@@ -6454,6 +6466,7 @@ lrint_test (void)
/* XXX this test is incomplete. We need to have a way to specifiy
the rounding method and test the critical cases. So far, only
unproblematic numbers are tested. */
+ /* TODO: missing +/-Inf as well as qNaN tests. */
START (lrint);
@@ -6646,6 +6659,7 @@ llrint_test (void)
/* XXX this test is incomplete. We need to have a way to specifiy
the rounding method and test the critical cases. So far, only
unproblematic numbers are tested. */
+ /* TODO: missing +/-Inf as well as qNaN tests. */
START (llrint);
@@ -7334,11 +7348,11 @@ log_test (void)
TEST_f_f (log, 1, 0);
- TEST_f_f (log, -1, nan_value, INVALID_EXCEPTION);
- TEST_f_f (log, -max_value, nan_value, INVALID_EXCEPTION);
- TEST_f_f (log, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (log, -1, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (log, -max_value, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (log, minus_infty, qnan_value, INVALID_EXCEPTION);
TEST_f_f (log, plus_infty, plus_infty);
- TEST_f_f (log, nan_value, nan_value);
+ TEST_f_f (log, qnan_value, qnan_value);
TEST_f_f (log, M_El, 1);
TEST_f_f (log, 1.0 / M_El, -1);
@@ -7366,13 +7380,13 @@ log10_test (void)
TEST_f_f (log10, 1, 0);
- /* log10 (x) == NaN plus invalid exception if x < 0. */
- TEST_f_f (log10, -1, nan_value, INVALID_EXCEPTION);
- TEST_f_f (log10, -max_value, nan_value, INVALID_EXCEPTION);
- TEST_f_f (log10, minus_infty, nan_value, INVALID_EXCEPTION);
+ /* log10 (x) == qNaN plus invalid exception if x < 0. */
+ TEST_f_f (log10, -1, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (log10, -max_value, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (log10, minus_infty, qnan_value, INVALID_EXCEPTION);
TEST_f_f (log10, plus_infty, plus_infty);
- TEST_f_f (log10, nan_value, nan_value);
+ TEST_f_f (log10, qnan_value, qnan_value);
TEST_f_f (log10, 0.1L, -1);
TEST_f_f (log10, 10.0, 1);
@@ -7400,12 +7414,12 @@ log1p_test (void)
TEST_f_f (log1p, minus_zero, minus_zero);
TEST_f_f (log1p, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
- TEST_f_f (log1p, -2, nan_value, INVALID_EXCEPTION);
- TEST_f_f (log1p, -max_value, nan_value, INVALID_EXCEPTION);
- TEST_f_f (log1p, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (log1p, -2, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (log1p, -max_value, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (log1p, minus_infty, qnan_value, INVALID_EXCEPTION);
TEST_f_f (log1p, plus_infty, plus_infty);
- TEST_f_f (log1p, nan_value, nan_value);
+ TEST_f_f (log1p, qnan_value, qnan_value);
TEST_f_f (log1p, M_El - 1.0, 1);
@@ -7432,12 +7446,12 @@ log2_test (void)
TEST_f_f (log2, 1, 0);
- TEST_f_f (log2, -1, nan_value, INVALID_EXCEPTION);
- TEST_f_f (log2, -max_value, nan_value, INVALID_EXCEPTION);
- TEST_f_f (log2, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (log2, -1, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (log2, -max_value, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (log2, minus_infty, qnan_value, INVALID_EXCEPTION);
TEST_f_f (log2, plus_infty, plus_infty);
- TEST_f_f (log2, nan_value, nan_value);
+ TEST_f_f (log2, qnan_value, qnan_value);
TEST_f_f (log2, M_El, M_LOG2El);
TEST_f_f (log2, 2.0, 1);
@@ -7460,7 +7474,7 @@ logb_test (void)
TEST_f_f (logb, 0, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
TEST_f_f (logb, minus_zero, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
- TEST_f_f (logb, nan_value, nan_value);
+ TEST_f_f (logb, qnan_value, qnan_value);
TEST_f_f (logb, 1, 0);
TEST_f_f (logb, M_El, 1);
@@ -7524,6 +7538,8 @@ logb_test_downward (void)
static void
lround_test (void)
{
+ /* TODO: missing +/-Inf as well as qNaN tests. */
+
START (lround);
TEST_f_l (lround, 0, 0);
@@ -7566,6 +7582,8 @@ lround_test (void)
static void
llround_test (void)
{
+ /* TODO: missing +/-Inf as well as qNaN tests. */
+
START (llround);
TEST_f_L (llround, 0, 0);
@@ -7742,7 +7760,7 @@ modf_test (void)
TEST_fF_f1 (modf, plus_infty, 0, plus_infty);
TEST_fF_f1 (modf, minus_infty, minus_zero, minus_infty);
- TEST_fF_f1 (modf, nan_value, nan_value, nan_value);
+ TEST_fF_f1 (modf, qnan_value, qnan_value, qnan_value);
TEST_fF_f1 (modf, 0, 0, 0);
TEST_fF_f1 (modf, 1.5, 0.5, 1);
TEST_fF_f1 (modf, 2.5, 0.5, 2);
@@ -7764,7 +7782,7 @@ nearbyint_test (void)
TEST_f_f (nearbyint, minus_zero, minus_zero);
TEST_f_f (nearbyint, plus_infty, plus_infty);
TEST_f_f (nearbyint, minus_infty, minus_infty);
- TEST_f_f (nearbyint, nan_value, nan_value);
+ TEST_f_f (nearbyint, qnan_value, qnan_value);
/* Subnormal values */
TEST_f_f (nearbyint, -8.98847e+307, -8.98847e+307);
@@ -7823,9 +7841,9 @@ nextafter_test (void)
TEST_ff_f (nextafter, plus_infty, plus_infty, plus_infty);
TEST_ff_f (nextafter, minus_infty, minus_infty, minus_infty);
- TEST_ff_f (nextafter, nan_value, 1.1L, nan_value);
- TEST_ff_f (nextafter, 1.1L, nan_value, nan_value);
- TEST_ff_f (nextafter, nan_value, nan_value, nan_value);
+ TEST_ff_f (nextafter, qnan_value, 1.1L, qnan_value);
+ TEST_ff_f (nextafter, 1.1L, qnan_value, qnan_value);
+ TEST_ff_f (nextafter, qnan_value, qnan_value, qnan_value);
FLOAT fltmax = CHOOSE (LDBL_MAX, DBL_MAX, FLT_MAX,
LDBL_MAX, DBL_MAX, FLT_MAX);
@@ -7858,9 +7876,9 @@ nexttoward_test (void)
TEST_ff_f (nexttoward, plus_infty, plus_infty, plus_infty);
TEST_ff_f (nexttoward, minus_infty, minus_infty, minus_infty);
- TEST_ff_f (nexttoward, nan_value, 1.1L, nan_value);
- TEST_ff_f (nexttoward, 1.1L, nan_value, nan_value);
- TEST_ff_f (nexttoward, nan_value, nan_value, nan_value);
+ TEST_ff_f (nexttoward, qnan_value, 1.1L, qnan_value);
+ TEST_ff_f (nexttoward, 1.1L, qnan_value, qnan_value);
+ TEST_ff_f (nexttoward, qnan_value, qnan_value, qnan_value);
#ifdef TEST_FLOAT
TEST_ff_f (nexttoward, 1.0, 1.1L, 0x1.000002p0);
@@ -7956,8 +7974,8 @@ pow_test (void)
TEST_ff_f (pow, -10, 0, 1);
TEST_ff_f (pow, -10, minus_zero, 1);
- TEST_ff_f (pow, nan_value, 0, 1);
- TEST_ff_f (pow, nan_value, minus_zero, 1);
+ TEST_ff_f (pow, qnan_value, 0, 1);
+ TEST_ff_f (pow, qnan_value, minus_zero, 1);
#ifndef TEST_INLINE
@@ -8018,28 +8036,28 @@ pow_test (void)
TEST_ff_f (pow, minus_infty, -min_subnorm_value, 0);
#endif
- TEST_ff_f (pow, nan_value, nan_value, nan_value);
- TEST_ff_f (pow, 0, nan_value, nan_value);
- TEST_ff_f (pow, 1, nan_value, 1);
- TEST_ff_f (pow, -1, nan_value, nan_value);
- TEST_ff_f (pow, nan_value, 1, nan_value);
- TEST_ff_f (pow, nan_value, -1, nan_value);
-
- /* pow (x, NaN) == NaN. */
- TEST_ff_f (pow, 3.0, nan_value, nan_value);
- TEST_ff_f (pow, minus_zero, nan_value, nan_value);
- TEST_ff_f (pow, plus_infty, nan_value, nan_value);
- TEST_ff_f (pow, -3.0, nan_value, nan_value);
- TEST_ff_f (pow, minus_infty, nan_value, nan_value);
-
- TEST_ff_f (pow, nan_value, 3.0, nan_value);
- TEST_ff_f (pow, nan_value, -3.0, nan_value);
- TEST_ff_f (pow, nan_value, plus_infty, nan_value);
- TEST_ff_f (pow, nan_value, minus_infty, nan_value);
- TEST_ff_f (pow, nan_value, 2.5, nan_value);
- TEST_ff_f (pow, nan_value, -2.5, nan_value);
- TEST_ff_f (pow, nan_value, min_subnorm_value, nan_value);
- TEST_ff_f (pow, nan_value, -min_subnorm_value, nan_value);
+ TEST_ff_f (pow, qnan_value, qnan_value, qnan_value);
+ TEST_ff_f (pow, 0, qnan_value, qnan_value);
+ TEST_ff_f (pow, 1, qnan_value, 1);
+ TEST_ff_f (pow, -1, qnan_value, qnan_value);
+ TEST_ff_f (pow, qnan_value, 1, qnan_value);
+ TEST_ff_f (pow, qnan_value, -1, qnan_value);
+
+ /* pow (x, qNaN) == qNaN. */
+ TEST_ff_f (pow, 3.0, qnan_value, qnan_value);
+ TEST_ff_f (pow, minus_zero, qnan_value, qnan_value);
+ TEST_ff_f (pow, plus_infty, qnan_value, qnan_value);
+ TEST_ff_f (pow, -3.0, qnan_value, qnan_value);
+ TEST_ff_f (pow, minus_infty, qnan_value, qnan_value);
+
+ TEST_ff_f (pow, qnan_value, 3.0, qnan_value);
+ TEST_ff_f (pow, qnan_value, -3.0, qnan_value);
+ TEST_ff_f (pow, qnan_value, plus_infty, qnan_value);
+ TEST_ff_f (pow, qnan_value, minus_infty, qnan_value);
+ TEST_ff_f (pow, qnan_value, 2.5, qnan_value);
+ TEST_ff_f (pow, qnan_value, -2.5, qnan_value);
+ TEST_ff_f (pow, qnan_value, min_subnorm_value, qnan_value);
+ TEST_ff_f (pow, qnan_value, -min_subnorm_value, qnan_value);
TEST_ff_f (pow, 1, plus_infty, 1);
TEST_ff_f (pow, -1, plus_infty, 1);
@@ -8070,14 +8088,14 @@ pow_test (void)
TEST_ff_f (pow, 0x1p-72L, 0, 1);
TEST_ff_f (pow, 0x1p-72L, minus_zero, 1);
- TEST_ff_f (pow, -0.1L, 1.1L, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -0.1L, -1.1L, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -10.1L, 1.1L, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -10.1L, -1.1L, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -1.01L, min_subnorm_value, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -1.01L, -min_subnorm_value, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -1.0L, min_subnorm_value, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -1.0L, -min_subnorm_value, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -0.1L, 1.1L, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -0.1L, -1.1L, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -10.1L, 1.1L, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -10.1L, -1.1L, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -1.01L, min_subnorm_value, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -1.01L, -min_subnorm_value, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -1.0L, min_subnorm_value, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -1.0L, -min_subnorm_value, qnan_value, INVALID_EXCEPTION);
errno = 0;
TEST_ff_f (pow, 0, -1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
@@ -8487,9 +8505,9 @@ pow_test (void)
#endif
TEST_ff_f (pow, -2.0, max_value, plus_infty, OVERFLOW_EXCEPTION);
- TEST_ff_f (pow, -max_value, 0.5, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -max_value, 1.5, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -max_value, 1000.5, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -max_value, 0.5, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -max_value, 1.5, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -max_value, 1000.5, qnan_value, INVALID_EXCEPTION);
TEST_ff_f (pow, -max_value, -2, plus_zero, UNDERFLOW_EXCEPTION);
TEST_ff_f (pow, -max_value, -3, minus_zero, UNDERFLOW_EXCEPTION);
TEST_ff_f (pow, -max_value, 2, plus_infty, OVERFLOW_EXCEPTION);
@@ -8588,9 +8606,9 @@ pow_test (void)
#endif
TEST_ff_f (pow, -0.5, max_value, plus_zero, UNDERFLOW_EXCEPTION);
- TEST_ff_f (pow, -min_value, 0.5, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -min_value, 1.5, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (pow, -min_value, 1000.5, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -min_value, 0.5, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -min_value, 1.5, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (pow, -min_value, 1000.5, qnan_value, INVALID_EXCEPTION);
TEST_ff_f (pow, -min_value, -2, plus_infty, OVERFLOW_EXCEPTION);
TEST_ff_f (pow, -min_value, -3, minus_infty, OVERFLOW_EXCEPTION);
/* Allow inexact results to be considered to underflow. */
@@ -8826,26 +8844,26 @@ remainder_test (void)
START (remainder);
errno = 0;
- TEST_ff_f (remainder, 1, 0, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (remainder, 1, 0, qnan_value, INVALID_EXCEPTION);
check_int ("errno for remainder(1, 0) = EDOM ", errno, EDOM, 0, 0, 0);
errno = 0;
- TEST_ff_f (remainder, 1, minus_zero, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (remainder, 1, minus_zero, qnan_value, INVALID_EXCEPTION);
check_int ("errno for remainder(1, -0) = EDOM ", errno, EDOM, 0, 0, 0);
errno = 0;
- TEST_ff_f (remainder, plus_infty, 1, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (remainder, plus_infty, 1, qnan_value, INVALID_EXCEPTION);
check_int ("errno for remainder(INF, 1) = EDOM ", errno, EDOM, 0, 0, 0);
errno = 0;
- TEST_ff_f (remainder, minus_infty, 1, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (remainder, minus_infty, 1, qnan_value, INVALID_EXCEPTION);
check_int ("errno for remainder(-INF, 1) = EDOM ", errno, EDOM, 0, 0, 0);
errno = 0;
- TEST_ff_f (remainder, nan_value, nan_value, nan_value);
- check_int ("errno for remainder(NAN, NAN) unchanged", errno, 0, 0, 0, 0);
+ TEST_ff_f (remainder, qnan_value, qnan_value, qnan_value);
+ check_int ("errno for remainder(qNAN, qNAN) unchanged", errno, 0, 0, 0, 0);
errno = 0;
- TEST_ff_f (remainder, 0, nan_value, nan_value);
- check_int ("errno for remainder(0, NAN) unchanged", errno, 0, 0, 0, 0);
+ TEST_ff_f (remainder, 0, qnan_value, qnan_value);
+ check_int ("errno for remainder(0, qNAN) unchanged", errno, 0, 0, 0, 0);
errno = 0;
- TEST_ff_f (remainder, nan_value, 0, nan_value);
- check_int ("errno for remainder(NaN, 0) unchanged", errno, 0, 0, 0, 0);
+ TEST_ff_f (remainder, qnan_value, 0, qnan_value);
+ check_int ("errno for remainder(qNaN, 0) unchanged", errno, 0, 0, 0, 0);
TEST_ff_f (remainder, 1.625, 1.0, -0.375);
TEST_ff_f (remainder, -1.625, 1.0, 0.375);
@@ -8871,11 +8889,11 @@ remquo_test (void)
START (remquo);
- TEST_ffI_f1 (remquo, 1, 0, nan_value, IGNORE, INVALID_EXCEPTION);
- TEST_ffI_f1 (remquo, 1, minus_zero, nan_value, IGNORE, INVALID_EXCEPTION);
- TEST_ffI_f1 (remquo, plus_infty, 1, nan_value, IGNORE, INVALID_EXCEPTION);
- TEST_ffI_f1 (remquo, minus_infty, 1, nan_value, IGNORE, INVALID_EXCEPTION);
- TEST_ffI_f1 (remquo, nan_value, nan_value, nan_value, IGNORE);
+ TEST_ffI_f1 (remquo, 1, 0, qnan_value, IGNORE, INVALID_EXCEPTION);
+ TEST_ffI_f1 (remquo, 1, minus_zero, qnan_value, IGNORE, INVALID_EXCEPTION);
+ TEST_ffI_f1 (remquo, plus_infty, 1, qnan_value, IGNORE, INVALID_EXCEPTION);
+ TEST_ffI_f1 (remquo, minus_infty, 1, qnan_value, IGNORE, INVALID_EXCEPTION);
+ TEST_ffI_f1 (remquo, qnan_value, qnan_value, qnan_value, IGNORE);
TEST_ffI_f1 (remquo, 1.625, 1.0, -0.375, 2);
TEST_ffI_f1 (remquo, -1.625, 1.0, 0.375, -2);
@@ -8891,6 +8909,8 @@ remquo_test (void)
static void
rint_test (void)
{
+ /* TODO: missing qNaN tests. */
+
START (rint);
TEST_f_f (rint, 0.0, 0.0);
@@ -9356,6 +9376,8 @@ rint_test_upward (void)
static void
round_test (void)
{
+ /* TODO: missing +/-Inf as well as qNaN tests. */
+
START (round);
TEST_f_f (round, 0, 0);
@@ -9458,17 +9480,17 @@ scalb_test (void)
START (scalb);
- TEST_ff_f (scalb, 2.0, 0.5, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (scalb, 3.0, -2.5, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (scalb, 2.0, 0.5, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (scalb, 3.0, -2.5, qnan_value, INVALID_EXCEPTION);
- TEST_ff_f (scalb, 0, nan_value, nan_value);
- TEST_ff_f (scalb, 1, nan_value, nan_value);
+ TEST_ff_f (scalb, 0, qnan_value, qnan_value);
+ TEST_ff_f (scalb, 1, qnan_value, qnan_value);
TEST_ff_f (scalb, 1, 0, 1);
TEST_ff_f (scalb, -1, 0, -1);
- TEST_ff_f (scalb, 0, plus_infty, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (scalb, minus_zero, plus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (scalb, 0, plus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (scalb, minus_zero, plus_infty, qnan_value, INVALID_EXCEPTION);
TEST_ff_f (scalb, 0, 2, 0);
TEST_ff_f (scalb, minus_zero, -4, minus_zero);
@@ -9494,16 +9516,16 @@ scalb_test (void)
TEST_ff_f (scalb, plus_infty, plus_infty, plus_infty);
TEST_ff_f (scalb, minus_infty, plus_infty, minus_infty);
- TEST_ff_f (scalb, plus_infty, minus_infty, nan_value, INVALID_EXCEPTION);
- TEST_ff_f (scalb, minus_infty, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_ff_f (scalb, plus_infty, minus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_ff_f (scalb, minus_infty, minus_infty, qnan_value, INVALID_EXCEPTION);
- TEST_ff_f (scalb, nan_value, 1, nan_value);
- TEST_ff_f (scalb, 1, nan_value, nan_value);
- TEST_ff_f (scalb, nan_value, 0, nan_value);
- TEST_ff_f (scalb, 0, nan_value, nan_value);
- TEST_ff_f (scalb, nan_value, plus_infty, nan_value);
- TEST_ff_f (scalb, plus_infty, nan_value, nan_value);
- TEST_ff_f (scalb, nan_value, nan_value, nan_value);
+ TEST_ff_f (scalb, qnan_value, 1, qnan_value);
+ TEST_ff_f (scalb, 1, qnan_value, qnan_value);
+ TEST_ff_f (scalb, qnan_value, 0, qnan_value);
+ TEST_ff_f (scalb, 0, qnan_value, qnan_value);
+ TEST_ff_f (scalb, qnan_value, plus_infty, qnan_value);
+ TEST_ff_f (scalb, plus_infty, qnan_value, qnan_value);
+ TEST_ff_f (scalb, qnan_value, qnan_value, qnan_value);
TEST_ff_f (scalb, 0.8L, 4, 12.8L);
TEST_ff_f (scalb, -0.854375L, 5, -27.34L);
@@ -9523,7 +9545,7 @@ scalbn_test (void)
TEST_fi_f (scalbn, plus_infty, 1, plus_infty);
TEST_fi_f (scalbn, minus_infty, 1, minus_infty);
- TEST_fi_f (scalbn, nan_value, 1, nan_value);
+ TEST_fi_f (scalbn, qnan_value, 1, qnan_value);
TEST_fi_f (scalbn, 0.8L, 4, 12.8L);
TEST_fi_f (scalbn, -0.854375L, 5, -27.34L);
@@ -9554,7 +9576,7 @@ scalbln_test (void)
TEST_fl_f (scalbln, plus_infty, 1, plus_infty);
TEST_fl_f (scalbln, minus_infty, 1, minus_infty);
- TEST_fl_f (scalbln, nan_value, 1, nan_value);
+ TEST_fl_f (scalbln, qnan_value, 1, qnan_value);
TEST_fl_f (scalbln, 0.8L, 4, 12.8L);
TEST_fl_f (scalbln, -0.854375L, 5, -27.34L);
@@ -9597,6 +9619,7 @@ scalbln_test (void)
static void
signbit_test (void)
{
+ /* TODO: missing qNaN tests. */
START (signbit);
@@ -9628,14 +9651,14 @@ sin_test (void)
TEST_f_f (sin, 0, 0);
TEST_f_f (sin, minus_zero, minus_zero);
errno = 0;
- TEST_f_f (sin, plus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (sin, plus_infty, qnan_value, INVALID_EXCEPTION);
check_int ("errno for sin(+inf) == EDOM", errno, EDOM, 0, 0, 0);
errno = 0;
- TEST_f_f (sin, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (sin, minus_infty, qnan_value, INVALID_EXCEPTION);
check_int ("errno for sin(-inf) == EDOM", errno, EDOM, 0, 0, 0);
errno = 0;
- TEST_f_f (sin, nan_value, nan_value);
- check_int ("errno for sin(NaN) unchanged", errno, 0, 0, 0, 0);
+ TEST_f_f (sin, qnan_value, qnan_value);
+ check_int ("errno for sin(qNaN) unchanged", errno, 0, 0, 0, 0);
TEST_f_f (sin, M_PI_6l, 0.5);
TEST_f_f (sin, -M_PI_6l, -0.5);
@@ -9827,9 +9850,9 @@ sincos_test (void)
TEST_extra (sincos, 0, 0, 1);
TEST_extra (sincos, minus_zero, minus_zero, 1);
- TEST_extra (sincos, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_extra (sincos, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
- TEST_extra (sincos, nan_value, nan_value, nan_value);
+ TEST_extra (sincos, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_extra (sincos, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
+ TEST_extra (sincos, qnan_value, qnan_value, qnan_value);
TEST_extra (sincos, M_PI_2l, 1, 0);
TEST_extra (sincos, M_PI_6l, 0.5, 0.86602540378443864676372317075293616L);
@@ -9879,7 +9902,7 @@ sinh_test (void)
TEST_f_f (sinh, plus_infty, plus_infty);
TEST_f_f (sinh, minus_infty, minus_infty);
#endif
- TEST_f_f (sinh, nan_value, nan_value);
+ TEST_f_f (sinh, qnan_value, qnan_value);
TEST_f_f (sinh, 0.75L, 0.822316731935829980703661634446913849L);
TEST_f_f (sinh, 0x8p-32L, 1.86264514923095703232705808926175479e-9L);
@@ -10008,16 +10031,15 @@ sqrt_test (void)
START (sqrt);
TEST_f_f (sqrt, 0, 0);
- TEST_f_f (sqrt, nan_value, nan_value);
+ TEST_f_f (sqrt, qnan_value, qnan_value);
TEST_f_f (sqrt, plus_infty, plus_infty);
TEST_f_f (sqrt, minus_zero, minus_zero);
- /* sqrt (x) == NaN plus invalid exception for x < 0. */
- TEST_f_f (sqrt, -1, nan_value, INVALID_EXCEPTION);
- TEST_f_f (sqrt, -max_value, nan_value, INVALID_EXCEPTION);
- TEST_f_f (sqrt, minus_infty, nan_value, INVALID_EXCEPTION);
- TEST_f_f (sqrt, nan_value, nan_value);
+ /* sqrt (x) == qNaN plus invalid exception for x < 0. */
+ TEST_f_f (sqrt, -1, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (sqrt, -max_value, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (sqrt, minus_infty, qnan_value, INVALID_EXCEPTION);
TEST_f_f (sqrt, 2209, 47);
TEST_f_f (sqrt, 4, 2);
@@ -10045,14 +10067,14 @@ tan_test (void)
TEST_f_f (tan, 0, 0);
TEST_f_f (tan, minus_zero, minus_zero);
errno = 0;
- TEST_f_f (tan, plus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (tan, plus_infty, qnan_value, INVALID_EXCEPTION);
check_int ("errno for tan(Inf) == EDOM", errno, EDOM, 0, 0, 0);
errno = 0;
- TEST_f_f (tan, minus_infty, nan_value, INVALID_EXCEPTION);
+ TEST_f_f (tan, minus_infty, qnan_value, INVALID_EXCEPTION);
check_int ("errno for tan(-Inf) == EDOM", errno, EDOM, 0, 0, 0);
errno = 0;
- TEST_f_f (tan, nan_value, nan_value);
- check_int ("errno for tan(NaN) == 0", errno, 0, 0, 0, 0);
+ TEST_f_f (tan, qnan_value, qnan_value);
+ check_int ("errno for tan(qNaN) == 0", errno, 0, 0, 0, 0);
TEST_f_f (tan, M_PI_4l, 1);
TEST_f_f (tan, 0.75L, 0.931596459944072461165202756573936428L);
@@ -10265,7 +10287,7 @@ tanh_test (void)
TEST_f_f (tanh, plus_infty, 1);
TEST_f_f (tanh, minus_infty, -1);
#endif
- TEST_f_f (tanh, nan_value, nan_value);
+ TEST_f_f (tanh, qnan_value, qnan_value);
TEST_f_f (tanh, 0.75L, 0.635148952387287319214434357312496495L);
TEST_f_f (tanh, -0.75L, -0.635148952387287319214434357312496495L);
@@ -10294,11 +10316,11 @@ tgamma_test (void)
TEST_f_f (tgamma, max_value, plus_infty, OVERFLOW_EXCEPTION);
TEST_f_f (tgamma, 0, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
TEST_f_f (tgamma, minus_zero, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
- /* tgamma (x) == NaN plus invalid exception for integer x <= 0. */
- TEST_f_f (tgamma, -2, nan_value, INVALID_EXCEPTION);
- TEST_f_f (tgamma, -max_value, nan_value, INVALID_EXCEPTION);
- TEST_f_f (tgamma, minus_infty, nan_value, INVALID_EXCEPTION);
- TEST_f_f (tgamma, nan_value, nan_value);
+ /* tgamma (x) == qNaN plus invalid exception for integer x <= 0. */
+ TEST_f_f (tgamma, -2, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (tgamma, -max_value, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (tgamma, minus_infty, qnan_value, INVALID_EXCEPTION);
+ TEST_f_f (tgamma, qnan_value, qnan_value);
TEST_f_f (tgamma, 0.5, M_SQRT_PIl);
TEST_f_f (tgamma, -0.5, -M_2_SQRT_PIl);
@@ -10320,7 +10342,7 @@ trunc_test (void)
TEST_f_f (trunc, plus_infty, plus_infty);
TEST_f_f (trunc, minus_infty, minus_infty);
- TEST_f_f (trunc, nan_value, nan_value);
+ TEST_f_f (trunc, qnan_value, qnan_value);
TEST_f_f (trunc, 0, 0);
TEST_f_f (trunc, minus_zero, minus_zero);
@@ -10442,7 +10464,7 @@ y0_test (void)
TEST_f_f (y0, -1.0, minus_infty, INVALID_EXCEPTION);
TEST_f_f (y0, -max_value, minus_infty, INVALID_EXCEPTION);
TEST_f_f (y0, 0.0, minus_infty);
- TEST_f_f (y0, nan_value, nan_value);
+ TEST_f_f (y0, qnan_value, qnan_value);
TEST_f_f (y0, plus_infty, 0);
TEST_f_f (y0, 0.125L, -1.38968062514384052915582277745018693L);
@@ -10456,8 +10478,12 @@ y0_test (void)
TEST_f_f (y0, 0x1.3ffp+74L, 1.818984347516051243459467456433028748678e-12L);
#ifndef TEST_FLOAT
- /* Bug 14155: spurious exception may occur. */
- TEST_f_f (y0, 0x1.ff00000000002p+840L, 1.846591691699331493194965158699937660696e-127L, UNDERFLOW_EXCEPTION_OK);
+ TEST_f_f (y0, 0x1.ff00000000002p+840L, 1.846591691699331493194965158699937660696e-127L);
+#endif
+
+#if defined TEST_LDOUBLE && LDBL_MAX_EXP >= 16384
+ TEST_f_f (y0, 0x1p16382L, 8.0839224448726336195866026476176740513439e-2467L);
+ TEST_f_f (y0, 0x1p16383L, -3.8895531955766020648617743624167352352217e-2467L);
#endif
TEST_f_f (y0, 0x1p-10L, -4.4865150767109739412411806297168793661098L);
@@ -10497,7 +10523,7 @@ y1_test (void)
TEST_f_f (y1, -max_value, minus_infty, INVALID_EXCEPTION);
TEST_f_f (y1, 0.0, minus_infty);
TEST_f_f (y1, plus_infty, 0);
- TEST_f_f (y1, nan_value, nan_value);
+ TEST_f_f (y1, qnan_value, qnan_value);
TEST_f_f (y1, 0.125L, -5.19993611253477499595928744876579921L);
TEST_f_f (y1, 0.75L, -1.03759455076928541973767132140642198L);
@@ -10507,12 +10533,15 @@ y1_test (void)
TEST_f_f (y1, 8.0, -0.158060461731247494255555266187483550L);
TEST_f_f (y1, 10.0, 0.249015424206953883923283474663222803L);
- /* Bug 14155: spurious exception may occur. */
- TEST_f_f (y1, 0x1.27e204p+99L, -8.881610148467797208469612080785210013461e-16L, UNDERFLOW_EXCEPTION_OK);
+ TEST_f_f (y1, 0x1.27e204p+99L, -8.881610148467797208469612080785210013461e-16L);
#ifndef TEST_FLOAT
- /* Bug 14155: spurious exception may occur. */
- TEST_f_f (y1, 0x1.001000001p+593L, 3.927269966354206207832593635798954916263e-90L, UNDERFLOW_EXCEPTION_OK);
+ TEST_f_f (y1, 0x1.001000001p+593L, 3.927269966354206207832593635798954916263e-90L);
+#endif
+
+#if defined TEST_LDOUBLE && LDBL_MAX_EXP >= 16384
+ TEST_f_f (y1, 0x1p16382L, 1.2193782500509000574176799046642541129387e-2466L);
+ TEST_f_f (y1, 0x1p16383L, -9.5859502826270374691362975419147645151233e-2467L);
#endif
TEST_f_f (y1, 0x1p-10L, -6.5190099301063115047395187618929589514382e+02L);
@@ -10552,7 +10581,7 @@ yn_test (void)
TEST_ff_f (yn, 0, -1.0, minus_infty, INVALID_EXCEPTION);
TEST_ff_f (yn, 0, -max_value, minus_infty, INVALID_EXCEPTION);
TEST_ff_f (yn, 0, 0.0, minus_infty);
- TEST_ff_f (yn, 0, nan_value, nan_value);
+ TEST_ff_f (yn, 0, qnan_value, qnan_value);
TEST_ff_f (yn, 0, plus_infty, 0);
TEST_ff_f (yn, 0, 0.125L, -1.38968062514384052915582277745018693L);
@@ -10567,7 +10596,7 @@ yn_test (void)
TEST_ff_f (yn, 1, -1.0, minus_infty, INVALID_EXCEPTION);
TEST_ff_f (yn, 1, 0.0, minus_infty);
TEST_ff_f (yn, 1, plus_infty, 0);
- TEST_ff_f (yn, 1, nan_value, nan_value);
+ TEST_ff_f (yn, 1, qnan_value, qnan_value);
TEST_ff_f (yn, 1, 0.125L, -5.19993611253477499595928744876579921L);
TEST_ff_f (yn, 1, 0.75L, -1.03759455076928541973767132140642198L);
@@ -10579,7 +10608,7 @@ yn_test (void)
/* yn (3, x) */
TEST_ff_f (yn, 3, plus_infty, 0);
- TEST_ff_f (yn, 3, nan_value, nan_value);
+ TEST_ff_f (yn, 3, qnan_value, qnan_value);
TEST_ff_f (yn, 3, 0.125L, -2612.69757350066712600220955744091741L);
TEST_ff_f (yn, 3, 0.75L, -12.9877176234475433186319774484809207L);
@@ -10589,7 +10618,7 @@ yn_test (void)
/* yn (10, x) */
TEST_ff_f (yn, 10, plus_infty, 0);
- TEST_ff_f (yn, 10, nan_value, nan_value);
+ TEST_ff_f (yn, 10, qnan_value, qnan_value);
TEST_ff_f (yn, 10, 0.125L, -127057845771019398.252538486899753195L);
TEST_ff_f (yn, 10, 0.75L, -2133501638.90573424452445412893839236L);
@@ -10613,6 +10642,9 @@ static void
significand_test (void)
{
/* significand returns the mantissa of the exponential representation. */
+
+ /* TODO: missing +/-Inf as well as qNaN tests. */
+
START (significand);
TEST_f_f (significand, 4.0, 1.0);
@@ -10627,10 +10659,10 @@ static void
initialize (void)
{
fpstack_test ("start *init*");
- plus_zero = 0.0;
- nan_value = plus_zero / plus_zero; /* Suppress GCC warning */
- minus_zero = FUNC(copysign) (0.0, -1.0);
+ plus_zero = 0.0;
+ qnan_value = FUNC (__builtin_nan) ("");
+ minus_zero = FUNC (copysign) (0.0, -1.0);
plus_infty = CHOOSE (HUGE_VALL, HUGE_VAL, HUGE_VALF,
HUGE_VALL, HUGE_VAL, HUGE_VALF);
minus_infty = CHOOSE (-HUGE_VALL, -HUGE_VAL, -HUGE_VALF,
@@ -10647,7 +10679,7 @@ initialize (void)
__FLT_DENORM_MIN__);
(void) &plus_zero;
- (void) &nan_value;
+ (void) &qnan_value;
(void) &minus_zero;
(void) &plus_infty;
(void) &minus_infty;
diff --git a/libc/math/test-misc.c b/libc/math/test-misc.c
index d64e8e2fc..c13bafa11 100644
--- a/libc/math/test-misc.c
+++ b/libc/math/test-misc.c
@@ -1056,7 +1056,7 @@ main (void)
}
#endif
-#ifdef __i386__
+#if defined (__i386__) || defined (__x86_64__)
/* This is a test for the strange long doubles in x86 FPUs. */
{
union
@@ -1074,7 +1074,7 @@ main (void)
}
}
- /* Special NaNs in x86 long double. Test for scalbl. */
+ /* Special qNaNs in x86 long double. Test for scalbl. */
{
union
{
@@ -1087,12 +1087,12 @@ main (void)
r = scalbl (u.d, 0.0);
if (!isnan (r))
{
- puts ("scalbl(NaN, 0) does not return NaN");
+ puts ("scalbl (qNaN, 0) does not return NaN");
result = 1;
}
else if (memcmp (&r, &u.d, sizeof (double)) != 0)
{
- puts ("scalbl(NaN, 0) does not return the same NaN");
+ puts ("scalbl (qNaN, 0) does not return the same NaN");
result = 1;
}
}
@@ -1116,7 +1116,7 @@ main (void)
}
else if (fetestexcept (FE_UNDERFLOW))
{
- puts ("scalbl(NaN, 0) raises underflow exception");
+ puts ("scalbl (LDBL_MIN, 2147483647) raises underflow exception");
result = 1;
}
@@ -1134,7 +1134,7 @@ main (void)
}
else if (fetestexcept (FE_OVERFLOW))
{
- puts ("scalbl(NaN, 0) raises overflow exception");
+ puts ("scalbl (LDBL_MAX, -2147483647) raises overflow exception");
result = 1;
}
}
diff --git a/libc/sysdeps/powerpc/fpu/test-powerpc-snan.c b/libc/math/test-snan.c
index e3bd47aba..83657eef0 100644
--- a/libc/sysdeps/powerpc/fpu/test-powerpc-snan.c
+++ b/libc/math/test-snan.c
@@ -1,4 +1,4 @@
-/* Test Signalling NaN in isnan, isinf etc functions.
+/* Test signaling NaNs in isnan, isinf, and similar functions.
Copyright (C) 2008-2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@suse.de>, 2005.
@@ -34,56 +34,10 @@ char *dest_address;
double value = 123.456;
double zero = 0.0;
-float SNANf;
-double SNAN;
-long double SNANl;
-
static sigjmp_buf sigfpe_buf;
-void
-init_signaling_nan (void)
-{
- union {
- double _ld16;
- double _d8;
- unsigned int _ui4[4];
- float _f4;
- } nan_temp;
-
- nan_temp._ui4[0] = 0x7fa00000;
- SNANf = nan_temp._f4;
-
- nan_temp._ui4[0] = 0x7ff40000;
- nan_temp._ui4[1] = 0x00000000;
- SNAN = nan_temp._d8;
-
- nan_temp._ui4[0] = 0x7ff40000;
- nan_temp._ui4[1] = 0x00000000;
- nan_temp._ui4[2] = 0x00000000;
- nan_temp._ui4[3] = 0x00000000;
- SNANl = nan_temp._ld16;
-}
-
-static float
-snan_float (void)
-{
- return SNANf;
-}
-
-static double
-snan_double (void)
-{
- return SNAN;
-}
-
typedef long double ldouble;
-static ldouble
-snan_ldouble (void)
-{
- return SNANl;
-}
-
void
myFPsighandler(int signal,
@@ -130,25 +84,29 @@ check (const char *testname, int result)
}
}
-#define TEST_FUNC(NAME, FLOAT) \
+#define TEST_FUNC(NAME, FLOAT, SUFFIX) \
static void \
NAME (void) \
{ \
/* Variables are declared volatile to forbid some compiler \
optimizations. */ \
- volatile FLOAT Inf_var, NaN_var, zero_var, one_var, SNaN_var; \
+ volatile FLOAT Inf_var, qNaN_var, zero_var, one_var; \
+ /* A sNaN is only guaranteed to be representable in variables with */ \
+ /* static (or thread-local) storage duration. */ \
+ static volatile FLOAT sNaN_var = __builtin_nans ## SUFFIX (""); \
+ static volatile FLOAT minus_sNaN_var = -__builtin_nans ## SUFFIX (""); \
fenv_t saved_fenv; \
\
zero_var = 0.0; \
one_var = 1.0; \
- NaN_var = zero_var / zero_var; \
- SNaN_var = snan_##FLOAT (); \
+ qNaN_var = __builtin_nan ## SUFFIX (""); \
Inf_var = one_var / zero_var; \
\
(void) &zero_var; \
(void) &one_var; \
- (void) &NaN_var; \
- (void) &SNaN_var; \
+ (void) &qNaN_var; \
+ (void) &sNaN_var; \
+ (void) &minus_sNaN_var; \
(void) &Inf_var; \
\
set_sigaction_FP (); \
@@ -158,217 +116,216 @@ NAME (void) \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isnan(NaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isnan (qNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnan (NaN)", isnan (NaN_var)); \
+ check (#FLOAT " isnan (qNaN)", isnan (qNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isnan(-NaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isnan (-qNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnan (-NaN)", isnan (-NaN_var)); \
+ check (#FLOAT " isnan (-qNaN)", isnan (-qNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isnan(SNaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isnan (sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnan (SNaN)", isnan (SNaN_var)); \
+ check (#FLOAT " isnan (sNaN)", isnan (sNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isnan(-SNaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isnan (-sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnan (-SNaN)", isnan (-SNaN_var)); \
+ check (#FLOAT " isnan (-sNaN)", isnan (minus_sNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isinf(NaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isinf (qNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isinf (NaN)", !isinf (NaN_var)); \
+ check (#FLOAT " isinf (qNaN)", !isinf (qNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isinf(-NaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isinf (-qNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isinf (-NaN)", !isinf (-NaN_var)); \
+ check (#FLOAT " isinf (-qNaN)", !isinf (-qNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isinf(SNaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isinf (sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isinf (SNaN)", !isinf (SNaN_var)); \
+ check (#FLOAT " isinf (sNaN)", !isinf (sNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isinf(-SNaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isinf (-sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isinf (-SNaN)", !isinf (-SNaN_var)); \
+ check (#FLOAT " isinf (-sNaN)", !isinf (minus_sNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isfinite(NaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isfinite (qNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isfinite (NaN)", !isfinite (NaN_var)); \
+ check (#FLOAT " isfinite (qNaN)", !isfinite (qNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isfinite(-NaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isfinite (-qNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isfinite (-NaN)", !isfinite (-NaN_var)); \
+ check (#FLOAT " isfinite (-qNaN)", !isfinite (-qNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isfinite(SNaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isfinite (sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isfinite (SNaN)", !isfinite (SNaN_var)); \
+ check (#FLOAT " isfinite (sNaN)", !isfinite (sNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isfinite(-SNaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isfinite (-sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isfinite (-SNaN)", !isfinite (-SNaN_var)); \
+ check (#FLOAT " isfinite (-sNaN)", !isfinite (minus_sNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isnormal(NaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isnormal (qNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnormal (NaN)", !isnormal (NaN_var)); \
+ check (#FLOAT " isnormal (qNaN)", !isnormal (qNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isnormal(-NaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isnormal (-qNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnormal (-NaN)", !isnormal (-NaN_var)); \
+ check (#FLOAT " isnormal (-qNaN)", !isnormal (-qNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isnormal(SNaN) isnormal SIGFPE\n"); \
+ printf (#FLOAT " isnormal (sNaN) isnormal SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnormal (SNaN)", !isnormal (SNaN_var)); \
+ check (#FLOAT " isnormal (sNaN)", !isnormal (sNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " isnormal(-SNaN) raised SIGFPE\n"); \
+ printf (#FLOAT " isnormal (-sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnormal (-SNaN)", !isnormal (-SNaN_var)); \
+ check (#FLOAT " isnormal (-sNaN)", !isnormal (minus_sNaN_var)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " fpclassify(NaN) raised SIGFPE\n"); \
+ printf (#FLOAT " fpclassify (qNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " fpclassify (NaN)", (fpclassify (NaN_var)==FP_NAN)); \
+ check (#FLOAT " fpclassify (qNaN)", (fpclassify (qNaN_var)==FP_NAN)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " fpclassify(-NaN) raised SIGFPE\n"); \
+ printf (#FLOAT " fpclassify (-qNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " fpclassify (-NaN)", (fpclassify (-NaN_var)==FP_NAN)); \
+ check (#FLOAT " fpclassify (-qNaN)", (fpclassify (-qNaN_var)==FP_NAN)); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " fpclassify(SNaN) isnormal SIGFPE\n"); \
+ printf (#FLOAT " fpclassify (sNaN) isnormal SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " fpclassify (SNaN)", (fpclassify (SNaN_var)==FP_NAN)); \
+ check (#FLOAT " fpclassify (sNaN)", fpclassify (sNaN_var) == FP_NAN); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
feenableexcept (FE_ALL_EXCEPT); \
if (sigsetjmp(sigfpe_buf, 0)) \
{ \
- printf (#FLOAT " fpclassify(-SNaN) raised SIGFPE\n"); \
+ printf (#FLOAT " fpclassify (-sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " fpclassify (-SNaN)", (fpclassify (-SNaN_var)==FP_NAN)); \
+ check (#FLOAT " fpclassify (-sNaN)", \
+ fpclassify (minus_sNaN_var) == FP_NAN); \
} \
\
fesetenv(&saved_fenv); /* restore saved fenv */ \
remove_sigaction_FP(); \
}
-TEST_FUNC (float_test, float)
-TEST_FUNC (double_test, double)
+TEST_FUNC (float_test, float, f)
+TEST_FUNC (double_test, double, )
#ifndef NO_LONG_DOUBLE
-TEST_FUNC (ldouble_test, ldouble)
+TEST_FUNC (ldouble_test, ldouble, l)
#endif
static int
do_test (void)
{
- init_signaling_nan();
-
float_test();
double_test();
#ifndef NO_LONG_DOUBLE
diff --git a/libc/misc/tst-efgcvt.c b/libc/misc/tst-efgcvt.c
index 9f01d2910..3dfed19d5 100644
--- a/libc/misc/tst-efgcvt.c
+++ b/libc/misc/tst-efgcvt.c
@@ -177,7 +177,7 @@ special (void)
p = ecvt (INFINITY, 10, &decpt, &sign);
if (sign != 0 || strcmp (p, "inf") != 0)
- output_error ("ecvt", NAN, 10, "inf", 0, 0, p, decpt, sign);
+ output_error ("ecvt", INFINITY, 10, "inf", 0, 0, p, decpt, sign);
/* Simply make sure these calls with large NDIGITs don't crash. */
(void) ecvt (123.456, 10000, &decpt, &sign);
diff --git a/libc/nptl/ChangeLog b/libc/nptl/ChangeLog
index 2374bbfd1..db98d4e9c 100644
--- a/libc/nptl/ChangeLog
+++ b/libc/nptl/ChangeLog
@@ -1,3 +1,32 @@
+2013-03-18 Siddhesh Poyarekar <siddhesh@redhat.com>
+
+ * pthread_barrier_init.c (default_attr): Rename to
+ default_barrierattr.
+ (pthread_barrier_init): Adjust for the rename.
+ * pthread_mutex_init.c (default_attr): Rename to
+ default_mutexattr.
+ (__pthread_mutex_init): Adjust for the rename.
+ * pthread_rwlock_init.c (default_attr): Rebane to
+ default_rwlockattr.
+ (__pthread_rwlock_init): Adjust for the rename.
+
+2013-03-12 Carlos O'Donell <carlos@redhat.com>
+
+ * sysdeps/unix/sysv/linux/lowlevellock.c: Include <atomic.h>.
+
+2013-03-04 Roland McGrath <roland@hack.frob.com>
+
+ * sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h:
+ Change multiple inclusion guard to _LINUX_I686_DL_SYSDEP_H.
+ Use #include_next.
+ (HAVE_DL_DISCOVER_OSVERSION): Remove definition, now redundant.
+ (RTLD_PRIVATE_ERRNO): Likewise.
+ (NEED_DL_SYSINFO, DL_SYSINFO_DEFAULT, DL_SYSINFO_IMPLEMENTATION):
+ Move macros and associated declaration to ...
+ * sysdeps/unix/sysv/linux/i386/dl-sysdep.h: ... here.
+ Change multiple include guard to _LINUX_I386_DL_SYSDEP_H.
+ Use #include_next.
+
2013-03-01 Carlos O'Donell <carlos@redhat.com>
* Makefile (tests): Revert last change.
diff --git a/libc/nptl/pthread_barrier_init.c b/libc/nptl/pthread_barrier_init.c
index d5891fd41..6d2910ef9 100644
--- a/libc/nptl/pthread_barrier_init.c
+++ b/libc/nptl/pthread_barrier_init.c
@@ -22,7 +22,7 @@
#include <kernel-features.h>
-static const struct pthread_barrierattr default_attr =
+static const struct pthread_barrierattr default_barrierattr =
{
.pshared = PTHREAD_PROCESS_PRIVATE
};
@@ -42,7 +42,7 @@ pthread_barrier_init (barrier, attr, count)
const struct pthread_barrierattr *iattr
= (attr != NULL
? iattr = (struct pthread_barrierattr *) attr
- : &default_attr);
+ : &default_barrierattr);
if (iattr->pshared != PTHREAD_PROCESS_PRIVATE
&& __builtin_expect (iattr->pshared != PTHREAD_PROCESS_SHARED, 0))
diff --git a/libc/nptl/pthread_mutex_init.c b/libc/nptl/pthread_mutex_init.c
index 36da3f8bf..174d900dc 100644
--- a/libc/nptl/pthread_mutex_init.c
+++ b/libc/nptl/pthread_mutex_init.c
@@ -24,7 +24,7 @@
#include <stap-probe.h>
-static const struct pthread_mutexattr default_attr =
+static const struct pthread_mutexattr default_mutexattr =
{
/* Default is a normal mutex, not shared between processes. */
.mutexkind = PTHREAD_MUTEX_NORMAL
@@ -45,7 +45,8 @@ __pthread_mutex_init (mutex, mutexattr)
assert (sizeof (pthread_mutex_t) <= __SIZEOF_PTHREAD_MUTEX_T);
- imutexattr = (const struct pthread_mutexattr *) mutexattr ?: &default_attr;
+ imutexattr = ((const struct pthread_mutexattr *) mutexattr
+ ?: &default_mutexattr);
/* Sanity checks. */
switch (__builtin_expect (imutexattr->mutexkind
diff --git a/libc/nptl/pthread_rwlock_init.c b/libc/nptl/pthread_rwlock_init.c
index 16bfe2d75..29bef71db 100644
--- a/libc/nptl/pthread_rwlock_init.c
+++ b/libc/nptl/pthread_rwlock_init.c
@@ -21,7 +21,7 @@
#include <kernel-features.h>
-static const struct pthread_rwlockattr default_attr =
+static const struct pthread_rwlockattr default_rwlockattr =
{
.lockkind = PTHREAD_RWLOCK_DEFAULT_NP,
.pshared = PTHREAD_PROCESS_PRIVATE
@@ -35,7 +35,7 @@ __pthread_rwlock_init (rwlock, attr)
{
const struct pthread_rwlockattr *iattr;
- iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_attr;
+ iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_rwlockattr;
memset (rwlock, '\0', sizeof (*rwlock));
diff --git a/libc/nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h b/libc/nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h
index 29a77a08f..a89eb0a62 100644
--- a/libc/nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h
+++ b/libc/nptl/sysdeps/unix/sysv/linux/i386/dl-sysdep.h
@@ -16,12 +16,31 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifndef _DL_SYSDEP_H
-# include "i686/dl-sysdep.h"
+#ifndef _LINUX_I386_DL_SYSDEP_H
-/* sysenter/syscall is not useful on i386 through i586, but the dynamic
- linker and dl code in libc.a has to be able to load i686 compiled
- libraries. */
-# undef USE_DL_SYSINFO
+#include_next <dl-sysdep.h>
+
+/* Traditionally system calls have been made using int $0x80. A
+ second method was introduced which, if possible, will use the
+ sysenter/syscall instructions. To signal the presence and where to
+ find the code the kernel passes an AT_SYSINFO value in the
+ auxiliary vector to the application. */
+#define NEED_DL_SYSINFO 1
+
+#ifndef __ASSEMBLER__
+extern void _dl_sysinfo_int80 (void) attribute_hidden;
+# define DL_SYSINFO_DEFAULT (uintptr_t) _dl_sysinfo_int80
+# define DL_SYSINFO_IMPLEMENTATION \
+ asm (".text\n\t" \
+ ".type _dl_sysinfo_int80,@function\n\t" \
+ ".hidden _dl_sysinfo_int80\n" \
+ CFI_STARTPROC "\n" \
+ "_dl_sysinfo_int80:\n\t" \
+ "int $0x80;\n\t" \
+ "ret;\n\t" \
+ CFI_ENDPROC "\n" \
+ ".size _dl_sysinfo_int80,.-_dl_sysinfo_int80\n\t" \
+ ".previous");
+#endif
#endif /* dl-sysdep.h */
diff --git a/libc/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h b/libc/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h
index 466f0177c..c59c8dbbd 100644
--- a/libc/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h
+++ b/libc/nptl/sysdeps/unix/sysv/linux/i386/i686/dl-sysdep.h
@@ -16,52 +16,14 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifndef _DL_SYSDEP_H
-#define _DL_SYSDEP_H 1
+#ifndef _LINUX_I686_DL_SYSDEP_H
+#define _LINUX_I686_DL_SYSDEP_H 1
-/* This macro must be defined to either 0 or 1.
+/* The i386 file does most of the work. */
+#include_next <dl-sysdep.h>
- If 1, then an errno global variable hidden in ld.so will work right with
- all the errno-using libc code compiled for ld.so, and there is never a
- need to share the errno location with libc. This is appropriate only if
- all the libc functions that ld.so uses are called without PLT and always
- get the versions linked into ld.so rather than the libc ones. */
-
-#ifdef IS_IN_rtld
-# define RTLD_PRIVATE_ERRNO 1
-#else
-# define RTLD_PRIVATE_ERRNO 0
-#endif
-
-/* Traditionally system calls have been made using int $0x80. A
- second method was introduced which, if possible, will use the
- sysenter/syscall instructions. To signal the presence and where to
- find the code the kernel passes an AT_SYSINFO value in the
- auxiliary vector to the application. */
-#define NEED_DL_SYSINFO 1
+/* Actually use the vDSO entry point for syscalls.
+ i386/dl-sysdep.h arranges to support it, but not use it. */
#define USE_DL_SYSINFO 1
-#if defined NEED_DL_SYSINFO && !defined __ASSEMBLER__
-extern void _dl_sysinfo_int80 (void) attribute_hidden;
-# define DL_SYSINFO_DEFAULT (uintptr_t) _dl_sysinfo_int80
-# define DL_SYSINFO_IMPLEMENTATION \
- asm (".text\n\t" \
- ".type _dl_sysinfo_int80,@function\n\t" \
- ".hidden _dl_sysinfo_int80\n" \
- CFI_STARTPROC "\n" \
- "_dl_sysinfo_int80:\n\t" \
- "int $0x80;\n\t" \
- "ret;\n\t" \
- CFI_ENDPROC "\n" \
- ".size _dl_sysinfo_int80,.-_dl_sysinfo_int80\n\t" \
- ".previous");
-#endif
-
-
-#ifndef __ASSEMBLER__
-/* Get version of the OS. */
-extern int _dl_discover_osversion (void) attribute_hidden;
-# define HAVE_DL_DISCOVER_OSVERSION 1
-#endif
-
#endif /* dl-sysdep.h */
diff --git a/libc/nptl/sysdeps/unix/sysv/linux/lowlevellock.c b/libc/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
index c33791ac2..0efb72a56 100644
--- a/libc/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
+++ b/libc/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
@@ -21,7 +21,7 @@
#include <sysdep.h>
#include <lowlevellock.h>
#include <sys/time.h>
-
+#include <atomic.h>
void
__lll_lock_wait_private (int *futex)
diff --git a/libc/po/es.po b/libc/po/es.po
index e03b82676..156f3ebca 100644
--- a/libc/po/es.po
+++ b/libc/po/es.po
@@ -1,15 +1,15 @@
# Mensajes en español para GNU libc.
-# Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2004, 2011 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997, 1998, 2001, 2002, 2003, 2004, 2011, 2013 Free Software Foundation, Inc.
# This file is distributed under the same license as the glibc package.
# Enrique Melero Gómez <melero@eurolands.com>, 1996, 1997.
-# Santiago Vila Doncel <sanvila@unex.es>, 1997, 1998, 2001, 2002, 2003, 2004, 2011.
+# Santiago Vila Doncel <sanvila@unex.es>, 1997, 1998, 2001, 2002, 2003, 2004, 2011, 2013.
#
msgid ""
msgstr ""
-"Project-Id-Version: GNU libc 2.14\n"
+"Project-Id-Version: GNU libc 2.17-pre1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-05-31 00:06-0400\n"
-"PO-Revision-Date: 2011-10-25 17:03+0200\n"
+"POT-Creation-Date: 2012-12-07 15:10-0500\n"
+"PO-Revision-Date: 2013-03-03 22:30+0100\n"
"Last-Translator: Santiago Vila Doncel <sanvila@unex.es>\n"
"Language-Team: Spanish <es@li.org>\n"
"Language: es\n"
@@ -17,79 +17,79 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8-bit\n"
-#: argp/argp-help.c:228
+#: argp/argp-help.c:227
#, c-format
msgid "%.*s: ARGP_HELP_FMT parameter requires a value"
msgstr "%.*s: El argumento ARGP_HELP_FMT requiere un valor"
-#: argp/argp-help.c:238
+#: argp/argp-help.c:237
#, c-format
msgid "%.*s: Unknown ARGP_HELP_FMT parameter"
msgstr "%.*s: Parámetro ARGP_HELP_FMT desconocido"
-#: argp/argp-help.c:251
+#: argp/argp-help.c:250
#, c-format
msgid "Garbage in ARGP_HELP_FMT: %s"
msgstr "Inconsistencias en ARGP_HELP_FMT: %s"
-#: argp/argp-help.c:1215
+#: argp/argp-help.c:1214
msgid "Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options."
msgstr ""
"Los argumentos obligatorios u opcionales para las opciones largas son\n"
"también obligatorios u opcionales para las opciones cortas correspondientes."
-#: argp/argp-help.c:1601
+#: argp/argp-help.c:1600
msgid "Usage:"
msgstr "Modo de empleo:"
-#: argp/argp-help.c:1605
+#: argp/argp-help.c:1604
msgid " or: "
msgstr " o: "
-#: argp/argp-help.c:1617
+#: argp/argp-help.c:1616
msgid " [OPTION...]"
msgstr " [OPCIÓN...]"
-#: argp/argp-help.c:1644
+#: argp/argp-help.c:1643
#, c-format
msgid "Try `%s --help' or `%s --usage' for more information.\n"
msgstr "Pruebe `%s --help' o `%s --usage' para más información.\n"
-#: argp/argp-help.c:1672
+#: argp/argp-help.c:1671
#, c-format
msgid "Report bugs to %s.\n"
-msgstr "Comunicar bichos a %s.\n"
+msgstr "Comunicar errores a %s.\n"
-#: argp/argp-parse.c:102
+#: argp/argp-parse.c:101
msgid "Give this help list"
msgstr "Da esta lista de ayuda"
-#: argp/argp-parse.c:103
+#: argp/argp-parse.c:102
msgid "Give a short usage message"
msgstr "Da un mensaje corto de uso"
-#: argp/argp-parse.c:104
+#: argp/argp-parse.c:103
msgid "Set the program name"
msgstr "Establece el nombre del programa"
-#: argp/argp-parse.c:106
+#: argp/argp-parse.c:105
msgid "Hang for SECS seconds (default 3600)"
msgstr "Cuelga durante SECS segundos (por omisión, 3600)"
-#: argp/argp-parse.c:167
+#: argp/argp-parse.c:166
msgid "Print program version"
msgstr "Muestra la versión del programa"
-#: argp/argp-parse.c:183
+#: argp/argp-parse.c:182
msgid "(PROGRAM ERROR) No version known!?"
msgstr "(ERROR DEL PROGRAMA) ¿¡No se conoce ninguna versión!?"
-#: argp/argp-parse.c:623
+#: argp/argp-parse.c:622
#, c-format
msgid "%s: Too many arguments\n"
msgstr "%s: Demasiados argumentos\n"
-#: argp/argp-parse.c:766
+#: argp/argp-parse.c:765
msgid "(PROGRAM ERROR) Option should have been recognized!?"
msgstr "(ERROR DEL PROGRAMA) ¿¡No se debería haber reconocido la opción!?"
@@ -106,7 +106,7 @@ msgstr "(ERROR DEL PROGRAMA) ¿¡No se debería haber reconocido la opción!?"
# recordar a una opción en silla de ruedas...). sv+
#
# Lo cambio después de leer 1984. sv
-#: assert/assert-perr.c:37
+#: assert/assert-perr.c:36
#, c-format
msgid "%s%s%s:%u: %s%sUnexpected error: %s.\n"
msgstr "%s%s%s:%u: %s%sError inesperado: %s.\n"
@@ -114,7 +114,7 @@ msgstr "%s%s%s:%u: %s%sError inesperado: %s.\n"
# La traducción de Jochen es exactamente esta: Zusicherung %s nicht erfüllt
# que viene a decir algo así que las promesas no se han cumplido, o que
# las afirmaciones hechas no son ciertas.
-#: assert/assert.c:105
+#: assert/assert.c:101
#, c-format
msgid ""
"%s%s%s:%u: %s%sAssertion `%s' failed.\n"
@@ -123,24 +123,24 @@ msgstr ""
"%s%s%s:%u: %s%sLa declaración `%s' no se cumple.\n"
"%n"
-#: catgets/gencat.c:110 catgets/gencat.c:114 nscd/nscd.c:100 nss/makedb.c:61
+#: catgets/gencat.c:109 catgets/gencat.c:113 nscd/nscd.c:115 nss/makedb.c:119
msgid "NAME"
msgstr "NOMBRE"
-#: catgets/gencat.c:111
+#: catgets/gencat.c:110
msgid "Create C header file NAME containing symbol definitions"
msgstr "Crea un fichero de cabecera C, NOMBRE, que contiene las definiciones de símbolos"
-#: catgets/gencat.c:113
+#: catgets/gencat.c:112
msgid "Do not use existing catalog, force new output file"
msgstr "No utiliza el catálogo existente, crea un nuevo fichero de salida"
-#: catgets/gencat.c:114 nss/makedb.c:61
+#: catgets/gencat.c:113 nss/makedb.c:119
msgid "Write output to file NAME"
msgstr "Escribe el resultado en el fichero NOMBRE"
# FIXME: ¿Qué es ^K?
-#: catgets/gencat.c:119
+#: catgets/gencat.c:118
msgid ""
"Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE\n"
"is -, output is written to standard output.\n"
@@ -149,7 +149,7 @@ msgstr ""
"se lee de la entrada estándar. Si FICHERO-SALIDA es -, el resultado se\n"
"escribe en la salida estándar.\n"
-#: catgets/gencat.c:124
+#: catgets/gencat.c:123
msgid ""
"-o OUTPUT-FILE [INPUT-FILE]...\n"
"[OUTPUT-FILE [INPUT-FILE]...]"
@@ -157,28 +157,28 @@ msgstr ""
"-o FICHERO-SALIDA [FICHERO-ENTRADA]...\n"
"[FICHERO-SALIDA [FICHERO-ENTRADA]...]"
-#: catgets/gencat.c:232 debug/pcprofiledump.c:208 debug/xtrace.sh:58
-#: elf/ldconfig.c:302 elf/ldd.bash.in:56 elf/sln.c:86 elf/sotruss.ksh:49
-#: elf/sprof.c:371 iconv/iconv_prog.c:408 iconv/iconvconfig.c:380
-#: locale/programs/locale.c:278 locale/programs/localedef.c:371
-#: login/programs/pt_chown.c:92 malloc/memusage.sh:65
-#: malloc/memusagestat.c:539 nscd/nscd.c:415 nss/getent.c:918 nss/makedb.c:231
-#: posix/getconf.c:1122 sunrpc/rpc_main.c:1492 sunrpc/rpcinfo.c:691
-#: sysdeps/unix/sysv/linux/lddlibc4.c:62
+#: catgets/gencat.c:235 debug/pcprofiledump.c:208 elf/ldconfig.c:302
+#: elf/pldd.c:222 elf/sln.c:85 elf/sprof.c:371 iconv/iconv_prog.c:408
+#: iconv/iconvconfig.c:383 locale/programs/locale.c:279
+#: locale/programs/localedef.c:363 login/programs/pt_chown.c:88
+#: malloc/memusagestat.c:536 nscd/nscd.c:459 nss/getent.c:965 nss/makedb.c:371
+#: posix/getconf.c:1121 sunrpc/rpcinfo.c:691
+#: sysdeps/unix/sysv/linux/lddlibc4.c:61
+#, c-format
msgid ""
"For bug reporting instructions, please see:\n"
-"<http://www.gnu.org/software/libc/bugs.html>.\n"
+"%s.\n"
msgstr ""
"Para instrucciones sobre informes de fallo, por favor consulte:\n"
-"<http://www.gnu.org/software/libc/bugs.html>.\n"
+"%s.\n"
-#: catgets/gencat.c:246 debug/pcprofiledump.c:222 debug/xtrace.sh:66
-#: elf/ldconfig.c:316 elf/ldd.bash.in:39 elf/sotruss.ksh:76 elf/sprof.c:386
-#: iconv/iconv_prog.c:423 iconv/iconvconfig.c:395 locale/programs/locale.c:293
-#: locale/programs/localedef.c:387 login/programs/pt_chown.c:63
-#: malloc/memusage.sh:73 malloc/memusagestat.c:557 nscd/nscd.c:429
-#: nss/getent.c:87 nss/makedb.c:245 posix/getconf.c:1104
-#: sysdeps/unix/sysv/linux/lddlibc4.c:69
+#: catgets/gencat.c:251 debug/pcprofiledump.c:224 debug/xtrace.sh:64
+#: elf/ldconfig.c:318 elf/ldd.bash.in:38 elf/pldd.c:238 elf/sotruss.ksh:75
+#: elf/sprof.c:388 iconv/iconv_prog.c:425 iconv/iconvconfig.c:400
+#: locale/programs/locale.c:296 locale/programs/localedef.c:389
+#: login/programs/pt_chown.c:62 malloc/memusage.sh:71
+#: malloc/memusagestat.c:552 nscd/nscd.c:475 nss/getent.c:86 nss/makedb.c:387
+#: posix/getconf.c:1103 sysdeps/unix/sysv/linux/lddlibc4.c:68
#, c-format
msgid ""
"Copyright (C) %s Free Software Foundation, Inc.\n"
@@ -190,35 +190,35 @@ msgstr ""
"No hay NINGUNA garantía; ni siquiera de COMERCIABILIDAD o IDONEIDAD PARA UN\n"
"FIN DETERMINADO.\n"
-#: catgets/gencat.c:251 debug/pcprofiledump.c:227 debug/xtrace.sh:70
-#: elf/ldconfig.c:321 elf/sprof.c:392 iconv/iconv_prog.c:428
-#: iconv/iconvconfig.c:400 locale/programs/locale.c:298
-#: locale/programs/localedef.c:392 malloc/memusage.sh:77
-#: malloc/memusagestat.c:562 nscd/nscd.c:434 nss/getent.c:92 nss/makedb.c:250
-#: posix/getconf.c:1109
+#: catgets/gencat.c:256 debug/pcprofiledump.c:229 debug/xtrace.sh:68
+#: elf/ldconfig.c:323 elf/pldd.c:243 elf/sprof.c:394 iconv/iconv_prog.c:430
+#: iconv/iconvconfig.c:405 locale/programs/locale.c:301
+#: locale/programs/localedef.c:394 malloc/memusage.sh:75
+#: malloc/memusagestat.c:557 nscd/nscd.c:480 nss/getent.c:91 nss/makedb.c:392
+#: posix/getconf.c:1108
#, c-format
msgid "Written by %s.\n"
msgstr "Escrito por %s.\n"
-#: catgets/gencat.c:282
+#: catgets/gencat.c:287
msgid "*standard input*"
msgstr "*entrada estándar*"
-#: catgets/gencat.c:288 iconv/iconv_charmap.c:170 iconv/iconv_prog.c:294
-#: nss/makedb.c:170
+#: catgets/gencat.c:293 iconv/iconv_charmap.c:169 iconv/iconv_prog.c:293
+#: nss/makedb.c:248
#, c-format
msgid "cannot open input file `%s'"
msgstr "no se puede abrir el fichero de entrada `%s'"
-#: catgets/gencat.c:417 catgets/gencat.c:494
+#: catgets/gencat.c:422 catgets/gencat.c:497
msgid "illegal set number"
msgstr "número de conjunto ilegal"
-#: catgets/gencat.c:444
+#: catgets/gencat.c:449
msgid "duplicate set definition"
msgstr "definición de conjunto duplicada"
-#: catgets/gencat.c:446 catgets/gencat.c:623 catgets/gencat.c:677
+#: catgets/gencat.c:451 catgets/gencat.c:623 catgets/gencat.c:675
msgid "this is the first definition"
msgstr "esta es la primera vez que aparece la definición"
@@ -243,91 +243,92 @@ msgstr "directiva desconocida `%s': línea pasada por alto"
msgid "duplicated message number"
msgstr "número de mensaje duplicado"
-#: catgets/gencat.c:674
+#: catgets/gencat.c:672
msgid "duplicated message identifier"
msgstr "identificador de mensaje duplicado"
-#: catgets/gencat.c:731
+#: catgets/gencat.c:729
msgid "invalid character: message ignored"
msgstr "carácter inválido: mensaje descartado"
-#: catgets/gencat.c:774
+#: catgets/gencat.c:772
msgid "invalid line"
msgstr "línea inválida"
-#: catgets/gencat.c:828
+#: catgets/gencat.c:826
msgid "malformed line ignored"
msgstr "una línea incorrecta no se tendrá en cuenta"
-#: catgets/gencat.c:992 catgets/gencat.c:1033 nss/makedb.c:183
+#: catgets/gencat.c:990 catgets/gencat.c:1031
#, c-format
msgid "cannot open output file `%s'"
msgstr "no se puede abrir el fichero de salida `%s'"
-#: catgets/gencat.c:1195 locale/programs/linereader.c:560
+#: catgets/gencat.c:1193 locale/programs/linereader.c:559
msgid "invalid escape sequence"
msgstr "secuencia de escape inválida"
-#: catgets/gencat.c:1217
+#: catgets/gencat.c:1215
msgid "unterminated message"
msgstr "mensaje sin terminar"
-#: catgets/gencat.c:1241
+#: catgets/gencat.c:1239
#, c-format
msgid "while opening old catalog file"
msgstr "al abrir el fichero de catálogo antiguo"
-#: catgets/gencat.c:1332
+#: catgets/gencat.c:1330
#, c-format
msgid "conversion modules not available"
msgstr "no están disponibles los módulos de conversión"
-#: catgets/gencat.c:1358
+#: catgets/gencat.c:1356
#, c-format
msgid "cannot determine escape character"
msgstr "no se puede determinar el carácter de escape"
-#: debug/pcprofiledump.c:53
+#: debug/pcprofiledump.c:52
msgid "Don't buffer output"
msgstr "No hace pasar el resultado a través de un búfer"
# Se admiten sugerencias. sv
-#: debug/pcprofiledump.c:58
+#: debug/pcprofiledump.c:57
msgid "Dump information generated by PC profiling."
msgstr "Información de volcado generada mediante `PC profiling'."
-#: debug/pcprofiledump.c:61
+#: debug/pcprofiledump.c:60
msgid "[FILE]"
msgstr "[FICHERO]"
-#: debug/pcprofiledump.c:108
+#: debug/pcprofiledump.c:107
#, c-format
msgid "cannot open input file"
msgstr "no se puede abrir el fichero de entrada"
-#: debug/pcprofiledump.c:115
+#: debug/pcprofiledump.c:114
#, c-format
msgid "cannot read header"
msgstr "no se puede leer la cabecera"
-#: debug/pcprofiledump.c:179
+#: debug/pcprofiledump.c:178
#, c-format
msgid "invalid pointer size"
msgstr "tamaño de puntero inválido"
-#: debug/xtrace.sh:27 debug/xtrace.sh:45
+#: debug/xtrace.sh:26 debug/xtrace.sh:44
msgid "Usage: xtrace [OPTION]... PROGRAM [PROGRAMOPTION]...\\n"
msgstr "Modo de empleo: xtrace [OPCIÓN]... PROGRAMA [OPCIÓNDEPROGRAMA]...\\n"
-#: debug/xtrace.sh:33 malloc/memusage.sh:27
-msgid "Try \\`%s --help' or `%s --usage' for more information.\\n"
+#: debug/xtrace.sh:32 elf/sotruss.ksh:56 elf/sotruss.ksh:67
+#: elf/sotruss.ksh:135 malloc/memusage.sh:26
+msgid "Try \\`%s --help' or \\`%s --usage' for more information.\\n"
msgstr "Pruebe \\`%s --help' o `%s --usage' para más información.\\n"
-#: debug/xtrace.sh:39
+#: debug/xtrace.sh:38
msgid "%s: option '%s' requires an argument.\\n"
msgstr "%s: la opción '%s' requiere un argumento\\n"
-#: debug/xtrace.sh:46
+#: debug/xtrace.sh:45
msgid ""
"Trace execution of program by printing currently executed function.\n"
"\n"
@@ -352,156 +353,166 @@ msgstr ""
"Los argumentos obligatorios para las opciones largas son también obligatorios\n"
"para las opciones cortas correspondientes.\n"
-#: debug/xtrace.sh:127
+# FIXME: No entiendo lo del final.
+#: debug/xtrace.sh:57 elf/ldd.bash.in:55 elf/sotruss.ksh:49
+#: malloc/memusage.sh:64
+msgid "For bug reporting instructions, please see:\\\\n%s.\\\\n"
+msgstr "Para instrucciones sobre informes de fallo, por favor consulte:\\\\n%s.\\\\n"
+
+#: debug/xtrace.sh:125
msgid "xtrace: unrecognized option \\`$1'\\n"
msgstr "xtrace: opción no reconocida \\`$1'\\n"
-#: debug/xtrace.sh:140
+#: debug/xtrace.sh:138
msgid "No program name given\\n"
msgstr "No se ha especificado el nombre del programa\\n"
-#: debug/xtrace.sh:148
+#: debug/xtrace.sh:146
#, sh-format
msgid "executable \\`$program' not found\\n"
msgstr "no se ha encontrado el ejecutable \\`$program'\\n"
-#: debug/xtrace.sh:152
+#: debug/xtrace.sh:150
#, sh-format
msgid "\\`$program' is no executable\\n"
msgstr "\\`$program' no es ejecutable\\n"
-#: dlfcn/dlinfo.c:64
+#: dlfcn/dlinfo.c:63
msgid "RTLD_SELF used in code not dynamically loaded"
msgstr "Se ha usado RTLD_SELF en una parte del código que no se cargó dinámicamente"
-#: dlfcn/dlinfo.c:73
+#: dlfcn/dlinfo.c:72
msgid "unsupported dlinfo request"
msgstr "Petición dlinfo no admitida"
-#: dlfcn/dlmopen.c:64
+#: dlfcn/dlmopen.c:63
msgid "invalid namespace"
msgstr "espacio de nombres inválido"
-#: dlfcn/dlmopen.c:69
+#: dlfcn/dlmopen.c:68
msgid "invalid mode"
msgstr "modo inválido"
-#: dlfcn/dlopen.c:65
+#: dlfcn/dlopen.c:64
msgid "invalid mode parameter"
msgstr "parámetro de modo inválido"
# FIXME: Falta ver si es niño o niña. sv
-#: elf/cache.c:69
+#: elf/cache.c:68
msgid "unknown"
msgstr "desconocido/a"
-#: elf/cache.c:112
+#: elf/cache.c:121
msgid "Unknown OS"
msgstr "Sistema Operativo desconocido"
-#: elf/cache.c:117
+#: elf/cache.c:126
#, c-format
msgid ", OS ABI: %s %d.%d.%d"
msgstr ", ABI del SO: %s %d.%d.%d"
-#: elf/cache.c:134 elf/ldconfig.c:1305
+#: elf/cache.c:143 elf/ldconfig.c:1309
#, c-format
msgid "Can't open cache file %s\n"
msgstr "No se puede abrir el fichero de caché %s\n"
-#: elf/cache.c:148
+#: elf/cache.c:157
#, c-format
msgid "mmap of cache file failed.\n"
msgstr "falló la operación `mmap' sobre el fichero de caché.\n"
-#: elf/cache.c:152 elf/cache.c:166
+#: elf/cache.c:161 elf/cache.c:175
#, c-format
msgid "File is not a cache file.\n"
msgstr "El fichero no es un fichero de caché.\n"
-#: elf/cache.c:199 elf/cache.c:209
+#: elf/cache.c:208 elf/cache.c:218
#, c-format
msgid "%d libs found in cache `%s'\n"
msgstr "%d bibliotecas se encontraron en la caché `%s'\n"
-#: elf/cache.c:403
+#: elf/cache.c:412
#, c-format
msgid "Can't create temporary cache file %s"
msgstr "No se puede crear el fichero temporal de caché %s"
-#: elf/cache.c:411 elf/cache.c:421 elf/cache.c:425 elf/cache.c:430
+#: elf/cache.c:420 elf/cache.c:430 elf/cache.c:434 elf/cache.c:439
#, c-format
msgid "Writing of cache data failed"
msgstr "Falló la escritura de los datos de la caché"
-#: elf/cache.c:435
+#: elf/cache.c:444
#, c-format
msgid "Changing access rights of %s to %#o failed"
msgstr "El cambio de los derechos de acceso de %s a %#o falló"
-#: elf/cache.c:440
+#: elf/cache.c:449
#, c-format
msgid "Renaming of %s to %s failed"
msgstr "Falló el renombramiento de %s a %s"
-#: elf/dl-close.c:387 elf/dl-open.c:397
+#: elf/dl-close.c:378 elf/dl-open.c:474
msgid "cannot create scope list"
msgstr "no se puede crear la lista de ámbito"
-#: elf/dl-close.c:767
+#: elf/dl-close.c:771
msgid "shared object not open"
msgstr "el objeto compartido no está abierto"
-#: elf/dl-deps.c:114
+#: elf/dl-deps.c:112
msgid "DST not allowed in SUID/SGID programs"
msgstr "No se permite DST en programas SUID/SGID"
-#: elf/dl-deps.c:127
+#: elf/dl-deps.c:125
msgid "empty dynamic string token substitution"
msgstr "sustitución dinámica de un elemento por una cadena vacía"
# Hmm, me suena que lo que es dinámica aquí es la cadena, no la sustitución.
# FIXME: Consultarlo. sv
-#: elf/dl-deps.c:133
+#: elf/dl-deps.c:131
#, c-format
msgid "cannot load auxiliary `%s' because of empty dynamic string token substitution\n"
msgstr ""
"no se puede cargar el `%s' auxiliar debido a la sustitución dinámica\n"
"de un elemento por cadena vacía\n"
-#: elf/dl-deps.c:474
+#: elf/dl-deps.c:483
msgid "cannot allocate dependency list"
msgstr "no se pudo asignar espacio para la lista de dependencias"
-#: elf/dl-deps.c:514 elf/dl-deps.c:574
+#: elf/dl-deps.c:520 elf/dl-deps.c:580
msgid "cannot allocate symbol search list"
msgstr "no se puede asignar espacio para la lista de búsqueda de los símbolos"
-#: elf/dl-deps.c:554
+#: elf/dl-deps.c:560
msgid "Filters not supported with LD_TRACE_PRELINKING"
msgstr "No se admiten filtros con LD_TRACE_PRELINKING"
# Véase "A bug's life".
-#: elf/dl-error.c:77
+#: elf/dl-error.c:76
msgid "DYNAMIC LINKER BUG!!!"
-msgstr "¡¡¡HAY UN BICHO EN EL ENLAZADOR DINÁMICO!!!"
+msgstr "¡¡¡HAY UN ERROR EN EL ENLAZADOR DINÁMICO!!!"
-#: elf/dl-error.c:124
+#: elf/dl-error.c:123
msgid "error while loading shared libraries"
msgstr "error al cargar las bibliotecas compartidas"
-#: elf/dl-fptr.c:88
+#: elf/dl-fptr.c:87 ports/sysdeps/hppa/dl-fptr.c:93
msgid "cannot map pages for fdesc table"
msgstr "no se pueden asignar páginas para la tabla fdesc"
-#: elf/dl-fptr.c:192
+#: elf/dl-fptr.c:191 ports/sysdeps/hppa/dl-fptr.c:206
msgid "cannot map pages for fptr table"
msgstr "no se pueden asignar páginas para la tabla fptr"
-#: elf/dl-fptr.c:221
+#: elf/dl-fptr.c:220 ports/sysdeps/hppa/dl-fptr.c:235
msgid "internal error: symidx out of range of fptr table"
msgstr "error interno: symidx fuera del rango de la tabla fptr"
+#: elf/dl-hwcaps.c:173 elf/dl-hwcaps.c:185
+msgid "cannot create capability list"
+msgstr "no se puede crear la lista de capacidades"
+
#: elf/dl-load.c:471
msgid "cannot allocate name record"
msgstr "no se puede asignar el registro del nombre"
@@ -520,171 +531,171 @@ msgstr "no se puede crear una copia RUNPATH/RPATH"
msgid "cannot create search path array"
msgstr "no se puede crear la matriz de la ruta de búsqueda"
-#: elf/dl-load.c:931
+#: elf/dl-load.c:934
msgid "cannot stat shared object"
msgstr "no se puede efectuar `stat' sobre el objeto compartido"
-#: elf/dl-load.c:1009
+#: elf/dl-load.c:1012
msgid "cannot open zero fill device"
msgstr "no se puede abrir el dispositivo de `zero fill'"
-#: elf/dl-load.c:1055 elf/dl-load.c:2313
+#: elf/dl-load.c:1059 elf/dl-load.c:2339
msgid "cannot create shared object descriptor"
msgstr "no se puede crear el descriptor del objeto compartido"
-#: elf/dl-load.c:1074 elf/dl-load.c:1730 elf/dl-load.c:1833
+#: elf/dl-load.c:1078 elf/dl-load.c:1751 elf/dl-load.c:1854
msgid "cannot read file data"
msgstr "no se pueden leer los datos del fichero"
-#: elf/dl-load.c:1120
+#: elf/dl-load.c:1124
msgid "ELF load command alignment not page-aligned"
msgstr "El alineamiento de la orden de carga ELF no está alineada a la página"
-#: elf/dl-load.c:1127
+#: elf/dl-load.c:1131
msgid "ELF load command address/offset not properly aligned"
msgstr "La dirección/desplazamiento de la orden de carga ELF no está bien alineada"
-#: elf/dl-load.c:1210
+#: elf/dl-load.c:1216
msgid "cannot allocate TLS data structures for initial thread"
msgstr "no se pueden crear las estructuras de datos TLS para el hilo inicial"
-#: elf/dl-load.c:1233
+#: elf/dl-load.c:1239
msgid "cannot handle TLS data"
msgstr "no se pueden manejar los datos de TLS"
-#: elf/dl-load.c:1252
+#: elf/dl-load.c:1258
msgid "object file has no loadable segments"
msgstr "el fichero objeto no tiene segmentos cargables"
-#: elf/dl-load.c:1288
+#: elf/dl-load.c:1294
msgid "failed to map segment from shared object"
msgstr "fallo al asignar un segmento del objeto compartido"
-#: elf/dl-load.c:1314
+#: elf/dl-load.c:1320
msgid "cannot dynamically load executable"
msgstr "no se puede cargar el ejecutable dinámicamente"
-#: elf/dl-load.c:1376
+#: elf/dl-load.c:1383
msgid "cannot change memory protections"
msgstr "no se pueden cambiar las protecciones de memoria"
-#: elf/dl-load.c:1395
+#: elf/dl-load.c:1402
msgid "cannot map zero-fill pages"
msgstr "no se pueden asignar páginas de tipo `zero-fill'"
-#: elf/dl-load.c:1409
+#: elf/dl-load.c:1416
msgid "object file has no dynamic section"
msgstr "el fichero objeto no tiene sección dinámica"
-#: elf/dl-load.c:1432
+#: elf/dl-load.c:1439
msgid "shared object cannot be dlopen()ed"
msgstr "no se puede efectuar dlopen() sobre el objeto compartido"
-#: elf/dl-load.c:1445
+#: elf/dl-load.c:1452
msgid "cannot allocate memory for program header"
msgstr "no se puede asignar memoria para la cabecera del programa"
-#: elf/dl-load.c:1462 elf/dl-open.c:180
+#: elf/dl-load.c:1469 elf/dl-open.c:180
msgid "invalid caller"
msgstr "llamante inválido"
-#: elf/dl-load.c:1501
+#: elf/dl-load.c:1508
msgid "cannot enable executable stack as shared object requires"
msgstr "no se puede activar la pila ejecutable tal y como el objeto compartido necesita"
-#: elf/dl-load.c:1514
+#: elf/dl-load.c:1521
msgid "cannot close file descriptor"
msgstr "no se puede cerrar el descriptor de fichero"
-#: elf/dl-load.c:1730
+#: elf/dl-load.c:1751
msgid "file too short"
msgstr "fichero demasiado corto"
-#: elf/dl-load.c:1766
+#: elf/dl-load.c:1787
msgid "invalid ELF header"
msgstr "cabecera ELF inválida"
-#: elf/dl-load.c:1778
+#: elf/dl-load.c:1799
msgid "ELF file data encoding not big-endian"
msgstr "La codificación de los datos del fichero ELF no es `big-endian'"
-#: elf/dl-load.c:1780
+#: elf/dl-load.c:1801
msgid "ELF file data encoding not little-endian"
msgstr "La codificación de los datos del fichero ELF no es `little-endian'"
-#: elf/dl-load.c:1784
+#: elf/dl-load.c:1805
msgid "ELF file version ident does not match current one"
msgstr "La identificación de versión del fichero ELF no encaja con la actual"
-#: elf/dl-load.c:1788
+#: elf/dl-load.c:1809
msgid "ELF file OS ABI invalid"
msgstr "ABI del OS del fichero ELF inválida"
-#: elf/dl-load.c:1791
+#: elf/dl-load.c:1812
msgid "ELF file ABI version invalid"
msgstr "Versión de ABI del fichero ELF inválida"
-#: elf/dl-load.c:1794
+#: elf/dl-load.c:1815
msgid "nonzero padding in e_ident"
msgstr "relleno con no ceros en e_ident"
-#: elf/dl-load.c:1797
+#: elf/dl-load.c:1818
msgid "internal error"
msgstr "error interno"
-#: elf/dl-load.c:1804
+#: elf/dl-load.c:1825
msgid "ELF file version does not match current one"
msgstr "La versión del fichero ELF no coincide con la actual"
-#: elf/dl-load.c:1812
+#: elf/dl-load.c:1833
msgid "only ET_DYN and ET_EXEC can be loaded"
msgstr "solamente pueden cargarse ET_DYN y ET_EXEC"
-#: elf/dl-load.c:1818
+#: elf/dl-load.c:1839
msgid "ELF file's phentsize not the expected size"
msgstr "El `phentsize' del fichero ELF no es el tamaño esperado"
-#: elf/dl-load.c:2332
+#: elf/dl-load.c:2358
msgid "wrong ELF class: ELFCLASS64"
msgstr "clase ELF errónea: ELFCLASS64"
-#: elf/dl-load.c:2333
+#: elf/dl-load.c:2359
msgid "wrong ELF class: ELFCLASS32"
msgstr "clase ELF errónea: ELFCLASS32"
-#: elf/dl-load.c:2336
+#: elf/dl-load.c:2362
msgid "cannot open shared object file"
msgstr "no se puede abrir el fichero del objeto compartido"
-#: elf/dl-lookup.c:757
+#: elf/dl-lookup.c:757 ports/sysdeps/mips/dl-lookup.c:774
msgid "relocation error"
msgstr "error de relocalización"
-#: elf/dl-lookup.c:785
+#: elf/dl-lookup.c:786 ports/sysdeps/mips/dl-lookup.c:803
msgid "symbol lookup error"
msgstr "error de búsqueda de símbolo"
-#: elf/dl-open.c:115
+#: elf/dl-open.c:110
msgid "cannot extend global scope"
msgstr "no se puede extender el ámbito global"
-#: elf/dl-open.c:440
+#: elf/dl-open.c:524
msgid "TLS generation counter wrapped! Please report this."
msgstr "¡El contador de generaciones TLS ha vuelto a cero! Por favor envíe un informe."
-#: elf/dl-open.c:462
+#: elf/dl-open.c:546
msgid "cannot load any more object with static TLS"
msgstr "no se puede cargar ningún objeto más con TLS estático"
-#: elf/dl-open.c:511
+#: elf/dl-open.c:599
msgid "invalid mode for dlopen()"
msgstr "modo inválido para dlopen()"
-#: elf/dl-open.c:528
+#: elf/dl-open.c:616
msgid "no more namespaces available for dlmopen()"
msgstr "no hay más espacios de nombres disponibles para dlmopen()"
-#: elf/dl-open.c:547
+#: elf/dl-open.c:634
msgid "invalid target namespace in dlmopen()"
msgstr "espacio de nombres objetivo inválido para dlmopen()"
@@ -692,276 +703,272 @@ msgstr "espacio de nombres objetivo inválido para dlmopen()"
msgid "cannot allocate memory in static TLS block"
msgstr "No se pudo asignar memoria en el bloque TLS estático"
-#: elf/dl-reloc.c:212
+#: elf/dl-reloc.c:213
msgid "cannot make segment writable for relocation"
msgstr "no se puede hacer el segmento escribible para su relocalización"
-#: elf/dl-reloc.c:275
+#: elf/dl-reloc.c:276
#, c-format
msgid "%s: no PLTREL found in object %s\n"
msgstr "%s no se encontró ningún PLTREL en el objeto %s\n"
-#: elf/dl-reloc.c:286
+#: elf/dl-reloc.c:287
#, c-format
msgid "%s: out of memory to store relocation results for %s\n"
msgstr "%s: memoria agotada para almacenar los resultados de relocalización para %s\n"
# Se admiten sugerencias. sv
-#: elf/dl-reloc.c:302
+#: elf/dl-reloc.c:303
msgid "cannot restore segment prot after reloc"
msgstr "no se puede restaurar el `prot' del segmento después de la relocalización"
-#: elf/dl-reloc.c:331
+#: elf/dl-reloc.c:332
msgid "cannot apply additional memory protection after relocation"
msgstr "no se pueden aplicar protecciones de memoria adicionales después de relocalizar"
-#: elf/dl-sym.c:162
+#: elf/dl-sym.c:163
msgid "RTLD_NEXT used in code not dynamically loaded"
msgstr "Se ha usado RTLD_NEXT en una parte del código que no se cargó dinámicamente"
-#: elf/dl-sysdep.c:488 elf/dl-sysdep.c:500
-msgid "cannot create capability list"
-msgstr "no se puede crear la lista de capacidades"
-
-#: elf/dl-tls.c:861
+#: elf/dl-tls.c:875
msgid "cannot create TLS data structures"
msgstr "no se pueden crear las estructuras de datos TLS"
-#: elf/dl-version.c:172
+#: elf/dl-version.c:166
msgid "version lookup error"
msgstr "error de búsqueda de versión"
-#: elf/dl-version.c:303
+#: elf/dl-version.c:297
msgid "cannot allocate version reference table"
msgstr "no se puede asignar espacio para la tabla de versiones de referencia"
-#: elf/ldconfig.c:141
+#: elf/ldconfig.c:140
msgid "Print cache"
msgstr "Muestra la caché"
-#: elf/ldconfig.c:142
+#: elf/ldconfig.c:141
msgid "Generate verbose messages"
msgstr "Genera mensajes explicativos"
-#: elf/ldconfig.c:143
+#: elf/ldconfig.c:142
msgid "Don't build cache"
msgstr "No crea caché"
-#: elf/ldconfig.c:144
+#: elf/ldconfig.c:143
msgid "Don't generate links"
msgstr "No genera enlaces"
-#: elf/ldconfig.c:145
+#: elf/ldconfig.c:144
msgid "Change to and use ROOT as root directory"
msgstr "Cambia a RAÍZ y lo utiliza como directorio raíz"
-#: elf/ldconfig.c:145
+#: elf/ldconfig.c:144
msgid "ROOT"
msgstr "RAÍZ"
-#: elf/ldconfig.c:146
+#: elf/ldconfig.c:145
msgid "CACHE"
msgstr "CACHÉ"
-#: elf/ldconfig.c:146
+#: elf/ldconfig.c:145
msgid "Use CACHE as cache file"
msgstr "Utiliza CACHE como fichero de caché"
-#: elf/ldconfig.c:147
+#: elf/ldconfig.c:146
msgid "CONF"
msgstr "CONF"
-#: elf/ldconfig.c:147
+#: elf/ldconfig.c:146
msgid "Use CONF as configuration file"
msgstr "Utiliza CONF como fichero de configuración"
-#: elf/ldconfig.c:148
+#: elf/ldconfig.c:147
msgid "Only process directories specified on the command line. Don't build cache."
msgstr ""
"Procesa únicamente los directorios especificados en la línea de órdenes.\n"
"No crea la caché."
-#: elf/ldconfig.c:149
+#: elf/ldconfig.c:148
msgid "Manually link individual libraries."
msgstr "Enlace bibliotecas individuales manualmente."
-#: elf/ldconfig.c:150
+#: elf/ldconfig.c:149
msgid "FORMAT"
msgstr "FORMATO"
-#: elf/ldconfig.c:150
+#: elf/ldconfig.c:149
msgid "Format to use: new, old or compat (default)"
msgstr "Formato utilizado: new, old o compat (predeterminado)"
# Antes decía: .rhosts no es un fichero regular
-#: elf/ldconfig.c:151
+#: elf/ldconfig.c:150
msgid "Ignore auxiliary cache file"
msgstr "Descarta el fichero de caché auxiliar"
# FIXME: Why So Many Uppercase Letters? sv
-#: elf/ldconfig.c:159
+#: elf/ldconfig.c:158
msgid "Configure Dynamic Linker Run Time Bindings."
msgstr "Configura las asociaciones de tiempo de ejecución del enlazador dinámico"
-#: elf/ldconfig.c:339
+#: elf/ldconfig.c:341
#, c-format
msgid "Path `%s' given more than once"
msgstr "Se ha dado la ruta `%s' más de una vez"
-#: elf/ldconfig.c:379
+#: elf/ldconfig.c:381
#, c-format
msgid "%s is not a known library type"
msgstr "%s no es un tipo de biblioteca conocido"
-#: elf/ldconfig.c:407
+#: elf/ldconfig.c:409
#, c-format
msgid "Can't stat %s"
msgstr "No se puede efectuar `stat' sobre %s"
-#: elf/ldconfig.c:481
+#: elf/ldconfig.c:483
#, c-format
msgid "Can't stat %s\n"
msgstr "No se puede efectuar `stat' sobre %s\n"
-#: elf/ldconfig.c:491
+#: elf/ldconfig.c:493
#, c-format
msgid "%s is not a symbolic link\n"
msgstr "%s no es un enlace simbólico\n"
-#: elf/ldconfig.c:510
+#: elf/ldconfig.c:512
#, c-format
msgid "Can't unlink %s"
msgstr "No se puede efectuar `unlink' sobre %s"
-#: elf/ldconfig.c:516
+#: elf/ldconfig.c:518
#, c-format
msgid "Can't link %s to %s"
msgstr "No se puede crear un enlace de %s a %s"
-#: elf/ldconfig.c:522
+#: elf/ldconfig.c:524
msgid " (changed)\n"
msgstr " (cambiado)\n"
-#: elf/ldconfig.c:524
+#: elf/ldconfig.c:526
msgid " (SKIPPED)\n"
msgstr " (SALTADO)\n"
-#: elf/ldconfig.c:579
+#: elf/ldconfig.c:581
#, c-format
msgid "Can't find %s"
msgstr "No se encuentra %s"
-#: elf/ldconfig.c:595 elf/ldconfig.c:768 elf/ldconfig.c:827 elf/ldconfig.c:861
+#: elf/ldconfig.c:597 elf/ldconfig.c:770 elf/ldconfig.c:829 elf/ldconfig.c:863
#, c-format
msgid "Cannot lstat %s"
msgstr "No se puede efectuar `lstat' sobre %s"
-#: elf/ldconfig.c:602
+#: elf/ldconfig.c:604
#, c-format
msgid "Ignored file %s since it is not a regular file."
msgstr "Descartado el fichero %s dado que no es un fichero regular."
-#: elf/ldconfig.c:611
+#: elf/ldconfig.c:613
#, c-format
msgid "No link created since soname could not be found for %s"
msgstr "No se creó el enlace ya que no se encontró el soname para %s"
-#: elf/ldconfig.c:694
+#: elf/ldconfig.c:696
#, c-format
msgid "Can't open directory %s"
msgstr "No se puede abrir el directorio %s"
-#: elf/ldconfig.c:786 elf/ldconfig.c:848 elf/readlib.c:91
+#: elf/ldconfig.c:788 elf/ldconfig.c:850 elf/readlib.c:90
#, c-format
msgid "Input file %s not found.\n"
msgstr "No se encontró el fichero de entrada %s.\n"
-#: elf/ldconfig.c:793
+#: elf/ldconfig.c:795
#, c-format
msgid "Cannot stat %s"
msgstr "No se puede efectuar `stat' sobre %s"
-#: elf/ldconfig.c:922
+#: elf/ldconfig.c:924
#, c-format
msgid "libc5 library %s in wrong directory"
msgstr "biblioteca libc5 %s en un directorio equivocado"
-#: elf/ldconfig.c:925
+#: elf/ldconfig.c:927
#, c-format
msgid "libc6 library %s in wrong directory"
msgstr "biblioteca libc6 %s en un directorio equivocado"
-#: elf/ldconfig.c:928
+#: elf/ldconfig.c:930
#, c-format
msgid "libc4 library %s in wrong directory"
msgstr "biblioteca libc4 %s en un directorio equivocado"
-#: elf/ldconfig.c:956
+#: elf/ldconfig.c:958
#, c-format
msgid "libraries %s and %s in directory %s have same soname but different type."
msgstr "las bibliotecas %s y %s en el directorio %s tienen el mismo soname pero distinto tipo."
-#: elf/ldconfig.c:1065
+#: elf/ldconfig.c:1067
#, c-format
-msgid "Can't open configuration file %s"
-msgstr "No se puede abrir el fichero de configuración `%s'"
+msgid "Warning: ignoring configuration file that cannot be opened: %s"
+msgstr "Atención: no se tendrá en cuenta el fichero de configuración que no se puede abrir: %s"
-#: elf/ldconfig.c:1129
+#: elf/ldconfig.c:1133
#, c-format
msgid "%s:%u: bad syntax in hwcap line"
msgstr "%s:%u: sintaxis errónea en línea hwcap"
-#: elf/ldconfig.c:1135
+#: elf/ldconfig.c:1139
#, c-format
msgid "%s:%u: hwcap index %lu above maximum %u"
msgstr "%s:%u: el índice de hwcap %lu está por encima del máximo %u"
-#: elf/ldconfig.c:1142 elf/ldconfig.c:1150
+#: elf/ldconfig.c:1146 elf/ldconfig.c:1154
#, c-format
msgid "%s:%u: hwcap index %lu already defined as %s"
msgstr "%s:%u: el índice de hwcap %lu ya está definido como %s"
-#: elf/ldconfig.c:1153
+#: elf/ldconfig.c:1157
#, c-format
msgid "%s:%u: duplicate hwcap %lu %s"
msgstr "%s:%u: hwcap duplicado %lu %s"
-#: elf/ldconfig.c:1175
+#: elf/ldconfig.c:1179
#, c-format
msgid "need absolute file name for configuration file when using -r"
msgstr "se necesita un nombre de fichero absoluto para el fichero de configuración cuando se utiliza -r"
-#: elf/ldconfig.c:1182 locale/programs/xmalloc.c:70 malloc/obstack.c:434
-#: malloc/obstack.c:436 posix/getconf.c:1077 posix/getconf.c:1297
+#: elf/ldconfig.c:1186 locale/programs/xmalloc.c:65 malloc/obstack.c:433
+#: malloc/obstack.c:435 posix/getconf.c:1076 posix/getconf.c:1296
#, c-format
msgid "memory exhausted"
msgstr "memoria agotada"
-#: elf/ldconfig.c:1214
+#: elf/ldconfig.c:1218
#, c-format
msgid "%s:%u: cannot read directory %s"
msgstr "%s:%u: no se puede leer el directorio %s"
-#: elf/ldconfig.c:1258
+#: elf/ldconfig.c:1262
#, c-format
msgid "relative path `%s' used to build cache"
msgstr "se usa el camino relativo `%s' para construir el caché"
-#: elf/ldconfig.c:1284
+#: elf/ldconfig.c:1288
#, c-format
msgid "Can't chdir to /"
msgstr "No se puede cambiar al directorio /"
-#: elf/ldconfig.c:1325
+#: elf/ldconfig.c:1329
#, c-format
msgid "Can't open cache file directory %s\n"
msgstr "No se puede leer el directorio de ficheros de caché %s\n"
-#: elf/ldd.bash.in:43
+#: elf/ldd.bash.in:42
msgid "Written by %s and %s.\n"
msgstr "Escrito por %s y %s.\n"
-#: elf/ldd.bash.in:48
+#: elf/ldd.bash.in:47
msgid ""
"Usage: ldd [OPTION]... FILE...\n"
" --help print this help and exit\n"
@@ -979,106 +986,194 @@ msgstr ""
" -u, --unused muestra las dependencias directas no utilizadas\n"
" -v, --verbose muestra toda la información\n"
-#: elf/ldd.bash.in:82
+#: elf/ldd.bash.in:80
msgid "ldd: option \\`$1' is ambiguous"
msgstr "ldd: la opción \\`$1' es ambigua"
-#: elf/ldd.bash.in:89
+#: elf/ldd.bash.in:87
msgid "unrecognized option"
msgstr "opción no reconocida"
-#: elf/ldd.bash.in:90 elf/ldd.bash.in:128
+#: elf/ldd.bash.in:88 elf/ldd.bash.in:126
msgid "Try \\`ldd --help' for more information."
msgstr "Pruebe \\`ldd --help' para más información."
-#: elf/ldd.bash.in:127
+#: elf/ldd.bash.in:125
msgid "missing file arguments"
msgstr "faltan los ficheros de argumentos"
#. TRANS No such file or directory. This is a ``file doesn't exist'' error
#. TRANS for ordinary files that are referenced in contexts where they are
#. TRANS expected to already exist.
-#: elf/ldd.bash.in:150 sysdeps/gnu/errlist.c:36
+#: elf/ldd.bash.in:148 sysdeps/gnu/errlist.c:36
msgid "No such file or directory"
msgstr "No existe el fichero o el directorio"
# Antes decía: .rhosts no es un fichero regular
-#: elf/ldd.bash.in:153 inet/rcmd.c:488
+#: elf/ldd.bash.in:151 inet/rcmd.c:488
msgid "not regular file"
msgstr "no es un fichero regular"
-#: elf/ldd.bash.in:156
+#: elf/ldd.bash.in:154
msgid "warning: you do not have execution permission for"
msgstr "atención: no tiene permiso de ejecitación para"
-#: elf/ldd.bash.in:185
+#: elf/ldd.bash.in:183
msgid "\tnot a dynamic executable"
msgstr "\tno es un ejecutable dinámico"
-#: elf/ldd.bash.in:193
+#: elf/ldd.bash.in:191
msgid "exited with unknown exit code"
msgstr "salió con estado de salida desconocido"
-#: elf/ldd.bash.in:198
+#: elf/ldd.bash.in:196
msgid "error: you do not have read permission for"
msgstr "error: no tiene permiso de lectura para"
-#: elf/readelflib.c:35
+#: elf/pldd-xx.c:105
+#, c-format
+msgid "cannot find program header of process"
+msgstr "no se puede encontrar la cabecera del proceso"
+
+#: elf/pldd-xx.c:110
+#, c-format
+msgid "cannot read program header"
+msgstr "no se puede leer la cabecera del programa"
+
+#: elf/pldd-xx.c:135
+#, c-format
+msgid "cannot read dynamic section"
+msgstr "no se puede leer la sección dinámica"
+
+#: elf/pldd-xx.c:147
+#, c-format
+msgid "cannot read r_debug"
+msgstr "no se puede leer r_debug"
+
+#: elf/pldd-xx.c:167
+#, c-format
+msgid "cannot read program interpreter"
+msgstr "no se puede leer el intérprete del programa"
+
+#: elf/pldd-xx.c:196
+#, c-format
+msgid "cannot read link map"
+msgstr "no se puede leer la asignación de enlace"
+
+#: elf/pldd-xx.c:207
+#, c-format
+msgid "cannot read object name"
+msgstr "no se puede leer el nombre del objeto"
+
+#: elf/pldd.c:65
+msgid "List dynamic shared objects loaded into process."
+msgstr "Lista los objetos compartidos dinámicos cargados en este proceso."
+
+#: elf/pldd.c:69
+msgid "PID"
+msgstr "PID"
+
+#: elf/pldd.c:100
+#, c-format
+msgid "Exactly one parameter with process ID required.\n"
+msgstr "Se requiere exactamente un parámetro con el ID de proceso.\n"
+
+#: elf/pldd.c:112
+#, c-format
+msgid "invalid process ID '%s'"
+msgstr "ID de proceso inválido '%s'"
+
+#: elf/pldd.c:120
+#, c-format
+msgid "cannot open %s"
+msgstr "no se puede abrir %s"
+
+#: elf/pldd.c:145
+#, c-format
+msgid "cannot open %s/task"
+msgstr "no se puede abrir %s/tarea"
+
+#: elf/pldd.c:148
+#, c-format
+msgid "cannot prepare reading %s/task"
+msgstr "no se puede preparar la lectura de %s/tarea"
+
+#: elf/pldd.c:161
+#, c-format
+msgid "invalid thread ID '%s'"
+msgstr "ID de hilo inválido '%s'"
+
+#: elf/pldd.c:172
+#, c-format
+msgid "cannot attach to process %lu"
+msgstr "no se puede asociar al proceso %lu"
+
+#: elf/pldd.c:264
+#, c-format
+msgid "cannot get information about process %lu"
+msgstr "no se puede obtener información sobre el proceso %lu"
+
+#: elf/pldd.c:277
+#, c-format
+msgid "process %lu is no ELF program"
+msgstr "el proceso %lu no es un programa ELF"
+
+#: elf/readelflib.c:34
#, c-format
msgid "file %s is truncated\n"
msgstr "el fichero %s está truncado\n"
-#: elf/readelflib.c:67
+#: elf/readelflib.c:66
#, c-format
msgid "%s is a 32 bit ELF file.\n"
msgstr "%s es un fichero ELF de 32 bits.\n"
-#: elf/readelflib.c:69
+#: elf/readelflib.c:68
#, c-format
msgid "%s is a 64 bit ELF file.\n"
msgstr "%s es un fichero ELF de 64 bits.\n"
-#: elf/readelflib.c:71
+#: elf/readelflib.c:70
#, c-format
msgid "Unknown ELFCLASS in file %s.\n"
msgstr "ELFCLASS desconocido en el fichero %s.\n"
-#: elf/readelflib.c:78
+#: elf/readelflib.c:77
#, c-format
msgid "%s is not a shared object file (Type: %d).\n"
msgstr "%s no es un fichero `shared object' (Tipo: %d).\n"
-#: elf/readelflib.c:109
+#: elf/readelflib.c:108
#, c-format
msgid "more than one dynamic segment\n"
msgstr "más de un segmento dinámico\n"
-#: elf/readlib.c:97
+#: elf/readlib.c:96
#, c-format
msgid "Cannot fstat file %s.\n"
msgstr "No se puede efectuar `fstat' sobre el fichero %s.\n"
-#: elf/readlib.c:108
+#: elf/readlib.c:107
#, c-format
msgid "File %s is empty, not checked."
msgstr "El fichero %s está vacío, no se comprueba."
-#: elf/readlib.c:114
+#: elf/readlib.c:113
#, c-format
msgid "File %s is too small, not checked."
msgstr "El fichero %s es demasiado pequeño, no se comprueba."
-#: elf/readlib.c:124
+#: elf/readlib.c:123
#, c-format
msgid "Cannot mmap file %s.\n"
msgstr "No se puede efectuar `mmap' sobre el fichero %s.\n"
-#: elf/readlib.c:162
+#: elf/readlib.c:161
#, c-format
msgid "%s is not an ELF file - it has the wrong magic bytes at the start.\n"
msgstr "%s no es un fichero ELF - tiene los bytes mágicos equivocados en el comienzo.\n"
-#: elf/sln.c:85
+#: elf/sln.c:84
#, c-format
msgid ""
"Usage: sln src dest|file\n"
@@ -1087,22 +1182,22 @@ msgstr ""
"Modo de empleo: sln orig desti|fichero\n"
"\n"
-#: elf/sln.c:110
+#: elf/sln.c:109
#, c-format
msgid "%s: file open error: %m\n"
msgstr "%s: error al abrir el fichero: %m\n"
-#: elf/sln.c:147
+#: elf/sln.c:146
#, c-format
msgid "No target in line %d\n"
msgstr "No hay ningún objetivo en la línea %d\n"
-#: elf/sln.c:179
+#: elf/sln.c:178
#, c-format
msgid "%s: destination must not be a directory\n"
msgstr "%s: el destino no debe ser un directorio\n"
-#: elf/sln.c:185
+#: elf/sln.c:184
#, c-format
msgid "%s: failed to remove the old destination\n"
msgstr "%s: fallo al borrar el destino antiguo\n"
@@ -1121,42 +1216,44 @@ msgstr "%s: fallo al borrar el destino antiguo\n"
# Después de leer "1984", lo cambio.
# Aquí y en todas partes. sv
#
-#: elf/sln.c:193
+#: elf/sln.c:192
#, c-format
msgid "%s: invalid destination: %s\n"
msgstr "%s: destino inválido: %s\n"
-#: elf/sln.c:208 elf/sln.c:217
+#: elf/sln.c:207 elf/sln.c:216
#, c-format
msgid "Invalid link from \"%s\" to \"%s\": %s\n"
msgstr "Enlace inválido de \"%s\" a \"%s\": %s\n"
-#: elf/sotruss.ksh:33
+#: elf/sotruss.ksh:32
#, sh-format
msgid ""
"Usage: sotruss [OPTION...] [--] EXECUTABLE [EXECUTABLE-OPTION...]\n"
-" -F, --from FROMLIST trace calls from objects on FORMLIST\n"
-" -T, --to TOLIST trace calls to objects on TOLIST\n"
+" -F, --from FROMLIST Trace calls from objects on FROMLIST\n"
+" -T, --to TOLIST Trace calls to objects on TOLIST\n"
"\n"
-" -e, --exit also show exits from the function calls\n"
-" -f, --follow trace child processes\n"
-" -o, --output FILENAME write output to FILENAME (or FILENAME.$PID in case\n"
+" -e, --exit Also show exits from the function calls\n"
+" -f, --follow Trace child processes\n"
+" -o, --output FILENAME Write output to FILENAME (or FILENAME.$PID in case\n"
"\t\t\t -f is also used) instead of standard error\n"
"\n"
-" --help print this help and exit\n"
-" --version print version information and exit"
+" -?, --help Give this help list\n"
+" --usage Give a short usage message\n"
+" --version Print program version"
msgstr ""
"Modo de empleo: sotruss [OPCIÓN...] [--] EJECUTABLE [OPCIÓN-DEL-EJECUTABLE...]\n"
-" -F, --from LISTA_DE sigue las llamadas de objetos en LISTA_DE\n"
-" -T, --to LISTA_A sigue las llamadas a objetos en LISTA_A\n"
+" -F, --from LISTA_DE Sigue las llamadas de objetos en LISTA_DE\n"
+" -T, --to LISTA_A Sigue las llamadas a objetos en LISTA_A\n"
"\n"
-" -e, --exit muestra también la salidas de las llamadas a función\n"
-" -f, --follow sigue los procesos hijos\n"
-" -o, --output FICHERO escribe el resultado en FICHERO (o en FICHERO.$PID si se\n"
+" -e, --exit Muestra también la salidas de las llamadas a función\n"
+" -f, --follow Sigue los procesos hijos\n"
+" -o, --output FICHERO Escribe el resultado en FICHERO (o en FICHERO.$PID si se\n"
" utiliza también -f) en lugar de la salida de error estándar\n"
"\n"
-" --help muestra esta ayuda y finaliza\n"
-" --version muestra la información de versión y finaliza"
+" -?, --help Da esta lista de ayuda\n"
+" --usage Da un mensaje corto de uso\n"
+" --version Muestra la versión del programa"
#: elf/sotruss.ksh:46
msgid "Mandatory arguments to long options are also mandatory for any corresponding\\nshort options.\\n"
@@ -1164,285 +1261,286 @@ msgstr ""
"Los argumentos obligatorios para las opciones largas son\n"
"también obligatorios para las opciones cortas correspondientes."
-#: elf/sotruss.ksh:56
+#: elf/sotruss.ksh:55
msgid "%s: option requires an argument -- '%s'\\n"
msgstr "%s: la opción requiere un argumento -- '%c'\\n"
-#: elf/sotruss.ksh:57 elf/sotruss.ksh:68 elf/sotruss.ksh:134
-msgid "Try \\`%s --help' or \\`%s --usage' for more information.\\n"
-msgstr "Pruebe \\`%s --help' o `%s --usage' para más información.\\n"
-
-#: elf/sotruss.ksh:62
+#: elf/sotruss.ksh:61
msgid "%s: option is ambiguous; possibilities:"
msgstr "%s: la opción es ambigua; posibilidades:"
-#: elf/sotruss.ksh:80
+#: elf/sotruss.ksh:79
msgid "Written by %s.\\n"
msgstr "Escrito por %s.\\n"
-#: elf/sotruss.ksh:87
+# FIXME: Posible errata en el msgid.
+#: elf/sotruss.ksh:86
msgid ""
"Usage: %s [-ef] [-F FROMLIST] [-o FILENAME] [-T TOLIST] [--exit]\n"
-"\t [--follow] [--from FROMLIST] [--output FILENAME] [--to TOLIST]\\n"
+"\t [--follow] [--from FROMLIST] [--output FILENAME] [--to TOLIST]\n"
+"\t [--help] [--usage] [--version] [--]\n"
+"\t EXECUTABLE [EXECUTABLE-OPTION...]\\n"
msgstr ""
"Modo de empleo: %s [-ef] [-F LISTA_DE] [-o FICHERO] [-T LISTA_A] [--exit]\n"
-"\t [--follow] [--from LISTA_DE] [--output FICHERO] [--to LISTA_A]\\n"
+"\t [--follow] [--from LISTA_DE] [--output FICHERO] [--to LISTA_A]\n"
+"\t [--help] [--usage] [--version] [--]\n"
+"\t EJECUTABLE [OPCIÓN-DEL-EJECUTABLE...]\\n"
-#: elf/sotruss.ksh:133
+#: elf/sotruss.ksh:134
msgid "%s: unrecognized option '%c%s'\\n"
msgstr "%s: opción no reconocida '%c%s'\\n"
-#: elf/sprof.c:77
+#: elf/sprof.c:76
msgid "Output selection:"
msgstr "Selección del resultado:"
-#: elf/sprof.c:79
+#: elf/sprof.c:78
msgid "print list of count paths and their number of use"
msgstr "muestra la lista de contadores de ruta y su número de uso"
-#: elf/sprof.c:81
+#: elf/sprof.c:80
msgid "generate flat profile with counts and ticks"
msgstr "genera un `profile' plano con contadores y `ticks'"
-#: elf/sprof.c:82
+#: elf/sprof.c:81
msgid "generate call graph"
msgstr "genera el grafo de llamadas"
# ¿profiling? sv
-#: elf/sprof.c:89
+#: elf/sprof.c:88
msgid "Read and display shared object profiling data."
msgstr "Lee y muestra los datos de `profiling' del objeto compartido."
-#: elf/sprof.c:94
+#: elf/sprof.c:93
msgid "SHOBJ [PROFDATA]"
msgstr "SHOBJ [DATOSPROF]"
-#: elf/sprof.c:431
+#: elf/sprof.c:432
#, c-format
msgid "failed to load shared object `%s'"
msgstr "fallo al cargar el objeto compartido `%s'"
-#: elf/sprof.c:440
+#: elf/sprof.c:441
#, c-format
msgid "cannot create internal descriptors"
msgstr "no se pueden crear descriptores internos"
-#: elf/sprof.c:559
+#: elf/sprof.c:553
#, c-format
msgid "Reopening shared object `%s' failed"
msgstr "La reapertura del objeto compartido `%s' falló"
-#: elf/sprof.c:566 elf/sprof.c:660
+#: elf/sprof.c:560 elf/sprof.c:655
#, c-format
msgid "reading of section headers failed"
msgstr "falló la lectura de las cabeceras de sección"
# Estupendo, entre section, header, string y table hay 4! posibilidades...
-#: elf/sprof.c:574 elf/sprof.c:668
+#: elf/sprof.c:568 elf/sprof.c:663
#, c-format
msgid "reading of section header string table failed"
msgstr "falló la lectura de la tabla de cadenas de cabeceras de sección"
-#: elf/sprof.c:600
+#: elf/sprof.c:594
#, c-format
msgid "*** Cannot read debuginfo file name: %m\n"
msgstr "*** No se puede leer el nombre del fichero de información de depuración: %m\n"
-#: elf/sprof.c:620
+#: elf/sprof.c:615
#, c-format
msgid "cannot determine file name"
msgstr "no se puede determinar el nombre del fichero"
-#: elf/sprof.c:653
+#: elf/sprof.c:648
#, c-format
msgid "reading of ELF header failed"
msgstr "falló la lectura de la cabecera ELF"
# Duda: stripped.
-#: elf/sprof.c:689
+#: elf/sprof.c:684
#, c-format
msgid "*** The file `%s' is stripped: no detailed analysis possible\n"
msgstr "*** El fichero `%s' está `stripped': no es posible un análisis detallado\n"
-#: elf/sprof.c:719
+#: elf/sprof.c:714
#, c-format
msgid "failed to load symbol data"
msgstr "fallo al cargar los datos del símbolo"
-#: elf/sprof.c:784
+#: elf/sprof.c:779
#, c-format
msgid "cannot load profiling data"
msgstr "no se pueden cargar los datos de `profiling'"
-#: elf/sprof.c:793
+#: elf/sprof.c:788
#, c-format
msgid "while stat'ing profiling data file"
msgstr "al ejecutar `stat' sobre el fichero de datos de `profiling'"
-#: elf/sprof.c:801
+#: elf/sprof.c:796
#, c-format
msgid "profiling data file `%s' does not match shared object `%s'"
msgstr ""
"el fichero de datos para `profiling' %s no se corresponde con el\n"
"objeto compartido `%s'"
-#: elf/sprof.c:812
+#: elf/sprof.c:807
#, c-format
msgid "failed to mmap the profiling data file"
msgstr "no se pudo hacer mmap con el fichero de datos de `profile'"
# Se admiten sugerencias para el "profiling" sv.
-#: elf/sprof.c:820
+#: elf/sprof.c:815
#, c-format
msgid "error while closing the profiling data file"
msgstr "error al cerrar el fichero de datos de `profiling'"
-#: elf/sprof.c:829 elf/sprof.c:927
+#: elf/sprof.c:824 elf/sprof.c:922
#, c-format
msgid "cannot create internal descriptor"
msgstr "no se puede crear un descriptor interno"
-#: elf/sprof.c:903
+#: elf/sprof.c:898
#, c-format
msgid "`%s' is no correct profile data file for `%s'"
msgstr "`%s' no es un fichero de datos para `profile' correcto para `%s'"
-#: elf/sprof.c:1084 elf/sprof.c:1142
+#: elf/sprof.c:1079 elf/sprof.c:1137
#, c-format
msgid "cannot allocate symbol data"
msgstr "no se puede asignar espacio para los datos del símbolo"
-#: iconv/iconv_charmap.c:142 iconv/iconv_prog.c:446
+#: iconv/iconv_charmap.c:143 iconv/iconv_prog.c:448
#, c-format
msgid "cannot open output file"
msgstr "no se puede abrir el fichero de salida"
-#: iconv/iconv_charmap.c:188 iconv/iconv_prog.c:312
+#: iconv/iconv_charmap.c:189 iconv/iconv_prog.c:311
#, c-format
msgid "error while closing input `%s'"
msgstr "error al cerrar la entrada `%s'"
-#: iconv/iconv_charmap.c:462
+#: iconv/iconv_charmap.c:463
#, c-format
msgid "illegal input sequence at position %Zd"
msgstr "secuencia de entrada ilegal en la posición %Zd"
-#: iconv/iconv_charmap.c:481 iconv/iconv_prog.c:537
+#: iconv/iconv_charmap.c:482 iconv/iconv_prog.c:539
#, c-format
msgid "incomplete character or shift sequence at end of buffer"
msgstr "carácter o secuencia de desplazamiento incompleta al final del búfer"
-#: iconv/iconv_charmap.c:526 iconv/iconv_charmap.c:562 iconv/iconv_prog.c:580
-#: iconv/iconv_prog.c:616
+#: iconv/iconv_charmap.c:527 iconv/iconv_charmap.c:563 iconv/iconv_prog.c:582
+#: iconv/iconv_prog.c:618
#, c-format
msgid "error while reading the input"
msgstr "error al leer la entrada"
-#: iconv/iconv_charmap.c:544 iconv/iconv_prog.c:598
+#: iconv/iconv_charmap.c:545 iconv/iconv_prog.c:600
#, c-format
msgid "unable to allocate buffer for input"
msgstr "no se puede asignar espacio para el búfer de entrada"
-#: iconv/iconv_prog.c:60
+#: iconv/iconv_prog.c:59
msgid "Input/Output format specification:"
msgstr "Especificación de formato de Entrada/Salida:"
-#: iconv/iconv_prog.c:61
+#: iconv/iconv_prog.c:60
msgid "encoding of original text"
msgstr "codificación del texto original"
-#: iconv/iconv_prog.c:62
+#: iconv/iconv_prog.c:61
msgid "encoding for output"
msgstr "codificación para el resultado"
-#: iconv/iconv_prog.c:63
+#: iconv/iconv_prog.c:62
msgid "Information:"
msgstr "Información:"
-#: iconv/iconv_prog.c:64
+#: iconv/iconv_prog.c:63
msgid "list all known coded character sets"
msgstr "lista todos los juegos de caracteres conocidos"
-#: iconv/iconv_prog.c:65 locale/programs/localedef.c:127
+#: iconv/iconv_prog.c:64 locale/programs/localedef.c:126
msgid "Output control:"
msgstr "Control del resultado:"
-#: iconv/iconv_prog.c:66
+#: iconv/iconv_prog.c:65
msgid "omit invalid characters from output"
msgstr "se omiten los caracteres inválidos en la salida"
-#: iconv/iconv_prog.c:67
+#: iconv/iconv_prog.c:66
msgid "output file"
msgstr "fichero de salida"
-#: iconv/iconv_prog.c:68
+#: iconv/iconv_prog.c:67
msgid "suppress warnings"
msgstr "suprime los avisos"
-#: iconv/iconv_prog.c:69
+#: iconv/iconv_prog.c:68
msgid "print progress information"
msgstr "muestra información sobre el desarrollo"
-#: iconv/iconv_prog.c:74
+#: iconv/iconv_prog.c:73
msgid "Convert encoding of given files from one encoding to another."
msgstr "Convierte la codificación de los ficheros dados de una codificación a otra."
-#: iconv/iconv_prog.c:78
+#: iconv/iconv_prog.c:77
msgid "[FILE...]"
msgstr "[FICHERO...]"
-#: iconv/iconv_prog.c:234
+#: iconv/iconv_prog.c:233
#, c-format
msgid "conversions from `%s' and to `%s' are not supported"
msgstr "no se admiten las conversiones desde `%s' y hacia `%s'"
-#: iconv/iconv_prog.c:239
+#: iconv/iconv_prog.c:238
#, c-format
msgid "conversion from `%s' is not supported"
msgstr "no se admite la conversión de `%s'"
-#: iconv/iconv_prog.c:246
+#: iconv/iconv_prog.c:245
#, c-format
msgid "conversion to `%s' is not supported"
msgstr "no se admite la conversión a `%s'"
-#: iconv/iconv_prog.c:250
+#: iconv/iconv_prog.c:249
#, c-format
msgid "conversion from `%s' to `%s' is not supported"
msgstr "no se admite la conversión de `%s' a `%s'"
-#: iconv/iconv_prog.c:260
+#: iconv/iconv_prog.c:259
#, c-format
msgid "failed to start conversion processing"
msgstr "fallo al comenzar el proceso de conversión"
-#: iconv/iconv_prog.c:358
+#: iconv/iconv_prog.c:357
#, c-format
msgid "error while closing output file"
msgstr "error al cerrar el fichero de salida"
-#: iconv/iconv_prog.c:456
+#: iconv/iconv_prog.c:458
#, c-format
msgid "conversion stopped due to problem in writing the output"
msgstr "la conversión se ha detenido debido a un problema al escribir el resultado"
-#: iconv/iconv_prog.c:533
+#: iconv/iconv_prog.c:535
#, c-format
msgid "illegal input sequence at position %ld"
msgstr "secuencia de entrada ilegal en la posición %ld"
-#: iconv/iconv_prog.c:541
+#: iconv/iconv_prog.c:543
#, c-format
msgid "internal error (illegal descriptor)"
msgstr "error interno (descriptor ilegal)"
-#: iconv/iconv_prog.c:544
+#: iconv/iconv_prog.c:546
#, c-format
msgid "unknown iconv() error %d"
msgstr "error de iconv() desconocido %d"
# FIXME: Espacio en blanco final.
-#: iconv/iconv_prog.c:790
+#: iconv/iconv_prog.c:791
msgid ""
"The following list contain all the coded character sets known. This does\n"
"not necessarily mean that all combinations of these names can be used for\n"
@@ -1459,11 +1557,11 @@ msgstr ""
"\n"
" "
-#: iconv/iconvconfig.c:110
+#: iconv/iconvconfig.c:109
msgid "Create fastloading iconv module configuration file."
msgstr "Crea un fichero de configuración de un módulo iconv de carga rápida."
-#: iconv/iconvconfig.c:114
+#: iconv/iconvconfig.c:113
msgid "[DIR...]"
msgstr "[DIR...]"
@@ -1472,34 +1570,34 @@ msgstr "[DIR...]"
# caso el msgstr que he puesto es apropiado) o si por el contrario lo
# que nos dicen es que se utilizará prefijo para todos los accesos a
# ficheros.
-#: iconv/iconvconfig.c:127
+#: iconv/iconvconfig.c:126
msgid "Prefix used for all file accesses"
msgstr "Prefijo utilizado para todos los accesos a ficheros"
-#: iconv/iconvconfig.c:128
+#: iconv/iconvconfig.c:127
msgid "Put output in FILE instead of installed location (--prefix does not apply to FILE)"
msgstr "Pone el resultado en FICHERO, no en el lugar instalado (--prefix no es aplicable a FICHERO)"
-#: iconv/iconvconfig.c:132
+#: iconv/iconvconfig.c:131
msgid "Do not search standard directories, only those on the command line"
msgstr "No busca en los directorios estándar, solamente en los de la línea de órdenes"
-#: iconv/iconvconfig.c:301
+#: iconv/iconvconfig.c:303
#, c-format
msgid "Directory arguments required when using --nostdlib"
msgstr "Se requieren directorios como argumentos cuando se usa --nostdlib"
-#: iconv/iconvconfig.c:343 locale/programs/localedef.c:291
+#: iconv/iconvconfig.c:345 locale/programs/localedef.c:287
#, c-format
msgid "no output file produced because warnings were issued"
msgstr "no se ha producido ningún fichero de salida debido a la existencia de avisos"
-#: iconv/iconvconfig.c:429
+#: iconv/iconvconfig.c:434
#, c-format
msgid "while inserting in search tree"
msgstr "al insertar en el árbol de búsqueda"
-#: iconv/iconvconfig.c:1238
+#: iconv/iconvconfig.c:1243
#, c-format
msgid "cannot generate output file"
msgstr "no se puede generar el fichero de salida"
@@ -1595,753 +1693,753 @@ msgstr "Elimine la contraseña o haga el fichero no legible por otros."
msgid "Unknown .netrc keyword %s"
msgstr "Palabra clave %s desconocida en .netrc"
-#: libidn/nfkc.c:464
+#: libidn/nfkc.c:462
msgid "Character out of range for UTF-8"
msgstr "Carácter fuera de rango para UTF-8"
-#: locale/programs/charmap-dir.c:59
+#: locale/programs/charmap-dir.c:58
#, c-format
msgid "cannot read character map directory `%s'"
msgstr "no se puede leer el directorio de tablas de caracteres `%s'"
-#: locale/programs/charmap.c:138
+#: locale/programs/charmap.c:137
#, c-format
msgid "character map file `%s' not found"
msgstr "el fichero de tabla de caracteres `%s' no se encontró"
-#: locale/programs/charmap.c:195
+#: locale/programs/charmap.c:194
#, c-format
msgid "default character map file `%s' not found"
msgstr "no se encontró el fichero de tabla de caracteres predeterminado `%s'"
-#: locale/programs/charmap.c:258
+#: locale/programs/charmap.c:257
#, c-format
msgid "character map `%s' is not ASCII compatible, locale not ISO C compliant\n"
msgstr ""
"la tabla de caracteres `%s' no es compatible con ASCII, el local no cumple\n"
"con ISO C\n"
-#: locale/programs/charmap.c:337
+#: locale/programs/charmap.c:336
#, c-format
msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n"
msgstr "%s: <mb_cur_max> debe ser mayor que <mb_cur_min>\n"
-#: locale/programs/charmap.c:357 locale/programs/charmap.c:374
-#: locale/programs/repertoire.c:174
+#: locale/programs/charmap.c:356 locale/programs/charmap.c:373
+#: locale/programs/repertoire.c:173
#, c-format
msgid "syntax error in prolog: %s"
msgstr "error de sintaxis en el prólogo: %s"
-#: locale/programs/charmap.c:358
+#: locale/programs/charmap.c:357
msgid "invalid definition"
msgstr "definición inválida"
-#: locale/programs/charmap.c:375 locale/programs/locfile.c:126
-#: locale/programs/locfile.c:153 locale/programs/repertoire.c:175
+#: locale/programs/charmap.c:374 locale/programs/locfile.c:125
+#: locale/programs/locfile.c:152 locale/programs/repertoire.c:174
msgid "bad argument"
msgstr "argumento erróneo"
-#: locale/programs/charmap.c:403
+#: locale/programs/charmap.c:402
#, c-format
msgid "duplicate definition of <%s>"
msgstr "definición duplicada de <%s>"
-#: locale/programs/charmap.c:410
+#: locale/programs/charmap.c:409
#, c-format
msgid "value for <%s> must be 1 or greater"
msgstr "el valor para <%s> debe ser 1 o mayor"
# Milagro, por una vez es más corto en español :-) sv
-#: locale/programs/charmap.c:422
+#: locale/programs/charmap.c:421
#, c-format
msgid "value of <%s> must be greater or equal than the value of <%s>"
msgstr "el valor de <%s> debe ser mayor o igual que el valor de <%s>"
-#: locale/programs/charmap.c:445 locale/programs/repertoire.c:183
+#: locale/programs/charmap.c:444 locale/programs/repertoire.c:182
#, c-format
msgid "argument to <%s> must be a single character"
msgstr "el argumento para <%s> debe ser un único carácter"
-#: locale/programs/charmap.c:471
+#: locale/programs/charmap.c:470
msgid "character sets with locking states are not supported"
msgstr "los conjuntos de caracteres con estados de bloqueo no están soportados"
-#: locale/programs/charmap.c:498 locale/programs/charmap.c:552
-#: locale/programs/charmap.c:584 locale/programs/charmap.c:678
-#: locale/programs/charmap.c:733 locale/programs/charmap.c:774
-#: locale/programs/charmap.c:815
+#: locale/programs/charmap.c:497 locale/programs/charmap.c:551
+#: locale/programs/charmap.c:583 locale/programs/charmap.c:677
+#: locale/programs/charmap.c:732 locale/programs/charmap.c:773
+#: locale/programs/charmap.c:814
#, c-format
msgid "syntax error in %s definition: %s"
msgstr "error de sintaxis en la definición de %s: %s"
-#: locale/programs/charmap.c:499 locale/programs/charmap.c:679
-#: locale/programs/charmap.c:775 locale/programs/repertoire.c:230
+#: locale/programs/charmap.c:498 locale/programs/charmap.c:678
+#: locale/programs/charmap.c:774 locale/programs/repertoire.c:229
msgid "no symbolic name given"
msgstr "no se ha especificado ningún nombre simbólico"
-#: locale/programs/charmap.c:553
+#: locale/programs/charmap.c:552
msgid "invalid encoding given"
msgstr "especificada una codificación inválida"
-#: locale/programs/charmap.c:562
+#: locale/programs/charmap.c:561
msgid "too few bytes in character encoding"
msgstr "insuficiente número de bytes en la codificación del carácter"
-#: locale/programs/charmap.c:564
+#: locale/programs/charmap.c:563
msgid "too many bytes in character encoding"
msgstr "demasiados bytes en la codificación del carácter"
-#: locale/programs/charmap.c:586 locale/programs/charmap.c:734
-#: locale/programs/charmap.c:817 locale/programs/repertoire.c:296
+#: locale/programs/charmap.c:585 locale/programs/charmap.c:733
+#: locale/programs/charmap.c:816 locale/programs/repertoire.c:295
msgid "no symbolic name given for end of range"
msgstr "no se ha especificado ningún nombre simbólico para el final del rango"
-#: locale/programs/charmap.c:610 locale/programs/ld-address.c:602
-#: locale/programs/ld-collate.c:2769 locale/programs/ld-collate.c:3927
-#: locale/programs/ld-ctype.c:2257 locale/programs/ld-ctype.c:3009
-#: locale/programs/ld-identification.c:452
-#: locale/programs/ld-measurement.c:238 locale/programs/ld-messages.c:332
-#: locale/programs/ld-monetary.c:943 locale/programs/ld-name.c:307
-#: locale/programs/ld-numeric.c:368 locale/programs/ld-paper.c:241
-#: locale/programs/ld-telephone.c:313 locale/programs/ld-time.c:1221
-#: locale/programs/repertoire.c:313
+#: locale/programs/charmap.c:609 locale/programs/ld-address.c:601
+#: locale/programs/ld-collate.c:2766 locale/programs/ld-collate.c:3924
+#: locale/programs/ld-ctype.c:2255 locale/programs/ld-ctype.c:3006
+#: locale/programs/ld-identification.c:451
+#: locale/programs/ld-measurement.c:237 locale/programs/ld-messages.c:331
+#: locale/programs/ld-monetary.c:942 locale/programs/ld-name.c:306
+#: locale/programs/ld-numeric.c:367 locale/programs/ld-paper.c:240
+#: locale/programs/ld-telephone.c:312 locale/programs/ld-time.c:1220
+#: locale/programs/repertoire.c:312
#, c-format
msgid "%1$s: definition does not end with `END %1$s'"
msgstr "%1$s: la definición no termina con `END %1$s'"
-#: locale/programs/charmap.c:643
+#: locale/programs/charmap.c:642
msgid "only WIDTH definitions are allowed to follow the CHARMAP definition"
msgstr "solamente se permiten ANCHO definiciones después de la definición CHARMAP"
-#: locale/programs/charmap.c:651 locale/programs/charmap.c:714
+#: locale/programs/charmap.c:650 locale/programs/charmap.c:713
#, c-format
msgid "value for %s must be an integer"
msgstr "el valor para %s debe ser un número entero"
# Para entender este mensaje, pensar en Turing.
-#: locale/programs/charmap.c:842
+#: locale/programs/charmap.c:841
#, c-format
msgid "%s: error in state machine"
msgstr "%s: error en la máquina de estados"
-#: locale/programs/charmap.c:850 locale/programs/ld-address.c:618
-#: locale/programs/ld-collate.c:2766 locale/programs/ld-collate.c:4120
-#: locale/programs/ld-ctype.c:2254 locale/programs/ld-ctype.c:3026
-#: locale/programs/ld-identification.c:468
-#: locale/programs/ld-measurement.c:254 locale/programs/ld-messages.c:348
-#: locale/programs/ld-monetary.c:959 locale/programs/ld-name.c:323
-#: locale/programs/ld-numeric.c:384 locale/programs/ld-paper.c:257
-#: locale/programs/ld-telephone.c:329 locale/programs/ld-time.c:1237
-#: locale/programs/locfile.c:826 locale/programs/repertoire.c:324
+#: locale/programs/charmap.c:849 locale/programs/ld-address.c:617
+#: locale/programs/ld-collate.c:2763 locale/programs/ld-collate.c:4117
+#: locale/programs/ld-ctype.c:2252 locale/programs/ld-ctype.c:3023
+#: locale/programs/ld-identification.c:467
+#: locale/programs/ld-measurement.c:253 locale/programs/ld-messages.c:347
+#: locale/programs/ld-monetary.c:958 locale/programs/ld-name.c:322
+#: locale/programs/ld-numeric.c:383 locale/programs/ld-paper.c:256
+#: locale/programs/ld-telephone.c:328 locale/programs/ld-time.c:1236
+#: locale/programs/locfile.c:825 locale/programs/repertoire.c:323
#, c-format
msgid "%s: premature end of file"
msgstr "%s: fin de fichero no esperado"
-#: locale/programs/charmap.c:869 locale/programs/charmap.c:880
+#: locale/programs/charmap.c:868 locale/programs/charmap.c:879
#, c-format
msgid "unknown character `%s'"
msgstr "carácter desconocido `%s'"
-#: locale/programs/charmap.c:888
+#: locale/programs/charmap.c:887
#, c-format
msgid "number of bytes for byte sequence of beginning and end of range not the same: %d vs %d"
msgstr ""
"el número de bytes para la sucesión de bytes de comienzo y final del rango\n"
"no es el mismo: %d vs %d"
-#: locale/programs/charmap.c:993 locale/programs/ld-collate.c:3046
-#: locale/programs/repertoire.c:419
+#: locale/programs/charmap.c:992 locale/programs/ld-collate.c:3043
+#: locale/programs/repertoire.c:418
msgid "invalid names for character range"
msgstr "nombres inválidos para el rango de caracteres"
-#: locale/programs/charmap.c:1005 locale/programs/repertoire.c:431
+#: locale/programs/charmap.c:1004 locale/programs/repertoire.c:430
msgid "hexadecimal range format should use only capital characters"
msgstr "el formato de rango hexadecimal debe usar solamente caracteres en mayúsculas"
-#: locale/programs/charmap.c:1023 locale/programs/repertoire.c:449
+#: locale/programs/charmap.c:1022 locale/programs/repertoire.c:448
#, c-format
msgid "<%s> and <%s> are invalid names for range"
msgstr "<%s> y <%s> son nombres inválidos para el rango de caracteres"
-#: locale/programs/charmap.c:1029 locale/programs/repertoire.c:456
+#: locale/programs/charmap.c:1028 locale/programs/repertoire.c:455
msgid "upper limit in range is smaller than lower limit"
msgstr "el límite superior del rango es menor que el límite inferior"
-#: locale/programs/charmap.c:1087
+#: locale/programs/charmap.c:1086
msgid "resulting bytes for range not representable."
msgstr "los bytes resultantes para el rango no son representables."
-#: locale/programs/ld-address.c:135 locale/programs/ld-collate.c:1558
-#: locale/programs/ld-ctype.c:421 locale/programs/ld-identification.c:133
-#: locale/programs/ld-measurement.c:94 locale/programs/ld-messages.c:97
-#: locale/programs/ld-monetary.c:194 locale/programs/ld-name.c:94
-#: locale/programs/ld-numeric.c:98 locale/programs/ld-paper.c:91
-#: locale/programs/ld-telephone.c:94 locale/programs/ld-time.c:159
+#: locale/programs/ld-address.c:134 locale/programs/ld-collate.c:1557
+#: locale/programs/ld-ctype.c:420 locale/programs/ld-identification.c:132
+#: locale/programs/ld-measurement.c:93 locale/programs/ld-messages.c:96
+#: locale/programs/ld-monetary.c:193 locale/programs/ld-name.c:93
+#: locale/programs/ld-numeric.c:97 locale/programs/ld-paper.c:90
+#: locale/programs/ld-telephone.c:93 locale/programs/ld-time.c:158
#, c-format
msgid "No definition for %s category found"
msgstr "No se encontró ninguna definición para la categoría %s"
# FIXME: ¿Por qué hay dos mensajes distintos para este y el siguiente?
-#: locale/programs/ld-address.c:146 locale/programs/ld-address.c:184
-#: locale/programs/ld-address.c:202 locale/programs/ld-address.c:231
-#: locale/programs/ld-address.c:303 locale/programs/ld-address.c:322
-#: locale/programs/ld-address.c:335 locale/programs/ld-identification.c:146
-#: locale/programs/ld-measurement.c:105 locale/programs/ld-monetary.c:206
-#: locale/programs/ld-monetary.c:250 locale/programs/ld-monetary.c:266
-#: locale/programs/ld-monetary.c:278 locale/programs/ld-name.c:105
-#: locale/programs/ld-name.c:142 locale/programs/ld-numeric.c:112
-#: locale/programs/ld-numeric.c:126 locale/programs/ld-paper.c:102
-#: locale/programs/ld-paper.c:111 locale/programs/ld-telephone.c:105
-#: locale/programs/ld-telephone.c:162 locale/programs/ld-time.c:175
-#: locale/programs/ld-time.c:196
+#: locale/programs/ld-address.c:145 locale/programs/ld-address.c:183
+#: locale/programs/ld-address.c:201 locale/programs/ld-address.c:230
+#: locale/programs/ld-address.c:302 locale/programs/ld-address.c:321
+#: locale/programs/ld-address.c:334 locale/programs/ld-identification.c:145
+#: locale/programs/ld-measurement.c:104 locale/programs/ld-monetary.c:205
+#: locale/programs/ld-monetary.c:249 locale/programs/ld-monetary.c:265
+#: locale/programs/ld-monetary.c:277 locale/programs/ld-name.c:104
+#: locale/programs/ld-name.c:141 locale/programs/ld-numeric.c:111
+#: locale/programs/ld-numeric.c:125 locale/programs/ld-paper.c:101
+#: locale/programs/ld-paper.c:110 locale/programs/ld-telephone.c:104
+#: locale/programs/ld-telephone.c:161 locale/programs/ld-time.c:174
+#: locale/programs/ld-time.c:195
#, c-format
msgid "%s: field `%s' not defined"
msgstr "%s: el campo `%s' no está definido"
-#: locale/programs/ld-address.c:158 locale/programs/ld-address.c:210
-#: locale/programs/ld-address.c:240 locale/programs/ld-address.c:278
-#: locale/programs/ld-name.c:117 locale/programs/ld-telephone.c:117
+#: locale/programs/ld-address.c:157 locale/programs/ld-address.c:209
+#: locale/programs/ld-address.c:239 locale/programs/ld-address.c:277
+#: locale/programs/ld-name.c:116 locale/programs/ld-telephone.c:116
#, c-format
msgid "%s: field `%s' must not be empty"
msgstr "%s: el campo `%s' no debe estar vacío"
-#: locale/programs/ld-address.c:170
+#: locale/programs/ld-address.c:169
#, c-format
msgid "%s: invalid escape `%%%c' sequence in field `%s'"
msgstr "%s: secuencia de escape `%%%c' inválida en el campo `%s'"
-#: locale/programs/ld-address.c:221
+#: locale/programs/ld-address.c:220
#, c-format
msgid "%s: terminology language code `%s' not defined"
msgstr "%s: el código de terminología del idioma `%s' no está definido"
# FIXME: ¿Por qué hay dos mensajes distintos para este y el siguiente?
-#: locale/programs/ld-address.c:246
+#: locale/programs/ld-address.c:245
#, c-format
msgid "%s: field `%s' must not be defined"
msgstr "%s: no se debe definir el campo `%s'"
-#: locale/programs/ld-address.c:260 locale/programs/ld-address.c:289
+#: locale/programs/ld-address.c:259 locale/programs/ld-address.c:288
#, c-format
msgid "%s: language abbreviation `%s' not defined"
msgstr "%s: la abreviatura de lenguaje `%s' no está definida"
-#: locale/programs/ld-address.c:267 locale/programs/ld-address.c:295
-#: locale/programs/ld-address.c:329 locale/programs/ld-address.c:341
+#: locale/programs/ld-address.c:266 locale/programs/ld-address.c:294
+#: locale/programs/ld-address.c:328 locale/programs/ld-address.c:340
#, c-format
msgid "%s: `%s' value does not match `%s' value"
msgstr "%s: el valor `%s' no coincide con el valor `%s'"
-#: locale/programs/ld-address.c:314
+#: locale/programs/ld-address.c:313
#, c-format
msgid "%s: numeric country code `%d' not valid"
msgstr "%s: el código numérico de país `%d' no es válido"
-#: locale/programs/ld-address.c:510 locale/programs/ld-address.c:547
-#: locale/programs/ld-address.c:585 locale/programs/ld-ctype.c:2633
-#: locale/programs/ld-identification.c:364
-#: locale/programs/ld-measurement.c:221 locale/programs/ld-messages.c:301
-#: locale/programs/ld-monetary.c:701 locale/programs/ld-monetary.c:736
-#: locale/programs/ld-monetary.c:777 locale/programs/ld-name.c:280
-#: locale/programs/ld-numeric.c:263 locale/programs/ld-paper.c:224
-#: locale/programs/ld-telephone.c:288 locale/programs/ld-time.c:1126
-#: locale/programs/ld-time.c:1168
+#: locale/programs/ld-address.c:509 locale/programs/ld-address.c:546
+#: locale/programs/ld-address.c:584 locale/programs/ld-ctype.c:2630
+#: locale/programs/ld-identification.c:363
+#: locale/programs/ld-measurement.c:220 locale/programs/ld-messages.c:300
+#: locale/programs/ld-monetary.c:700 locale/programs/ld-monetary.c:735
+#: locale/programs/ld-monetary.c:776 locale/programs/ld-name.c:279
+#: locale/programs/ld-numeric.c:262 locale/programs/ld-paper.c:223
+#: locale/programs/ld-telephone.c:287 locale/programs/ld-time.c:1125
+#: locale/programs/ld-time.c:1167
#, c-format
msgid "%s: field `%s' declared more than once"
msgstr "%s: el campo `%s' ha sido declarado más de una vez"
-#: locale/programs/ld-address.c:514 locale/programs/ld-address.c:552
-#: locale/programs/ld-identification.c:368 locale/programs/ld-messages.c:311
-#: locale/programs/ld-monetary.c:705 locale/programs/ld-monetary.c:740
-#: locale/programs/ld-name.c:284 locale/programs/ld-numeric.c:267
-#: locale/programs/ld-telephone.c:292 locale/programs/ld-time.c:1020
-#: locale/programs/ld-time.c:1089 locale/programs/ld-time.c:1131
+#: locale/programs/ld-address.c:513 locale/programs/ld-address.c:551
+#: locale/programs/ld-identification.c:367 locale/programs/ld-messages.c:310
+#: locale/programs/ld-monetary.c:704 locale/programs/ld-monetary.c:739
+#: locale/programs/ld-name.c:283 locale/programs/ld-numeric.c:266
+#: locale/programs/ld-telephone.c:291 locale/programs/ld-time.c:1019
+#: locale/programs/ld-time.c:1088 locale/programs/ld-time.c:1130
#, c-format
msgid "%s: unknown character in field `%s'"
msgstr "%s: carácter desconocido en el campo `%s'"
-#: locale/programs/ld-address.c:599 locale/programs/ld-collate.c:3925
-#: locale/programs/ld-ctype.c:3006 locale/programs/ld-identification.c:449
-#: locale/programs/ld-measurement.c:235 locale/programs/ld-messages.c:330
-#: locale/programs/ld-monetary.c:941 locale/programs/ld-name.c:305
-#: locale/programs/ld-numeric.c:366 locale/programs/ld-paper.c:239
-#: locale/programs/ld-telephone.c:311 locale/programs/ld-time.c:1219
+#: locale/programs/ld-address.c:598 locale/programs/ld-collate.c:3922
+#: locale/programs/ld-ctype.c:3003 locale/programs/ld-identification.c:448
+#: locale/programs/ld-measurement.c:234 locale/programs/ld-messages.c:329
+#: locale/programs/ld-monetary.c:940 locale/programs/ld-name.c:304
+#: locale/programs/ld-numeric.c:365 locale/programs/ld-paper.c:238
+#: locale/programs/ld-telephone.c:310 locale/programs/ld-time.c:1218
#, c-format
msgid "%s: incomplete `END' line"
msgstr "%s: línea `END' incompleta"
-#: locale/programs/ld-address.c:609 locale/programs/ld-collate.c:544
-#: locale/programs/ld-collate.c:596 locale/programs/ld-collate.c:892
-#: locale/programs/ld-collate.c:905 locale/programs/ld-collate.c:2735
-#: locale/programs/ld-collate.c:2756 locale/programs/ld-collate.c:4110
-#: locale/programs/ld-ctype.c:1985 locale/programs/ld-ctype.c:2244
-#: locale/programs/ld-ctype.c:2831 locale/programs/ld-ctype.c:3017
-#: locale/programs/ld-identification.c:459
-#: locale/programs/ld-measurement.c:245 locale/programs/ld-messages.c:339
-#: locale/programs/ld-monetary.c:950 locale/programs/ld-name.c:314
-#: locale/programs/ld-numeric.c:375 locale/programs/ld-paper.c:248
-#: locale/programs/ld-telephone.c:320 locale/programs/ld-time.c:1228
+#: locale/programs/ld-address.c:608 locale/programs/ld-collate.c:543
+#: locale/programs/ld-collate.c:595 locale/programs/ld-collate.c:891
+#: locale/programs/ld-collate.c:904 locale/programs/ld-collate.c:2732
+#: locale/programs/ld-collate.c:2753 locale/programs/ld-collate.c:4107
+#: locale/programs/ld-ctype.c:1984 locale/programs/ld-ctype.c:2242
+#: locale/programs/ld-ctype.c:2828 locale/programs/ld-ctype.c:3014
+#: locale/programs/ld-identification.c:458
+#: locale/programs/ld-measurement.c:244 locale/programs/ld-messages.c:338
+#: locale/programs/ld-monetary.c:949 locale/programs/ld-name.c:313
+#: locale/programs/ld-numeric.c:374 locale/programs/ld-paper.c:247
+#: locale/programs/ld-telephone.c:319 locale/programs/ld-time.c:1227
#, c-format
msgid "%s: syntax error"
msgstr "%s: error de sintaxis"
-#: locale/programs/ld-collate.c:419
+#: locale/programs/ld-collate.c:418
#, c-format
msgid "`%.*s' already defined in charmap"
msgstr "`%.*s' ya está definido en la tabla de caracteres"
-#: locale/programs/ld-collate.c:428
+#: locale/programs/ld-collate.c:427
#, c-format
msgid "`%.*s' already defined in repertoire"
msgstr "`%.*s' ya está definido en el repertorio"
-#: locale/programs/ld-collate.c:435
+#: locale/programs/ld-collate.c:434
#, c-format
msgid "`%.*s' already defined as collating symbol"
msgstr "`%.*s' ya está definido como símbolo de ordenación"
-#: locale/programs/ld-collate.c:442
+#: locale/programs/ld-collate.c:441
#, c-format
msgid "`%.*s' already defined as collating element"
msgstr "`%.*s' ya está definido como elemento de ordenación"
-#: locale/programs/ld-collate.c:473 locale/programs/ld-collate.c:499
+#: locale/programs/ld-collate.c:472 locale/programs/ld-collate.c:498
#, c-format
msgid "%s: `forward' and `backward' are mutually excluding each other"
msgstr "%s: `forward' y `backward' se excluyen mutuamente"
-#: locale/programs/ld-collate.c:483 locale/programs/ld-collate.c:509
-#: locale/programs/ld-collate.c:525
+#: locale/programs/ld-collate.c:482 locale/programs/ld-collate.c:508
+#: locale/programs/ld-collate.c:524
#, c-format
msgid "%s: `%s' mentioned more than once in definition of weight %d"
msgstr "%s: `%s' mencionado más de una vez en la definición del peso %d"
-#: locale/programs/ld-collate.c:581
+#: locale/programs/ld-collate.c:580
#, c-format
msgid "%s: too many rules; first entry only had %d"
msgstr "%s: demasiadas reglas; la primera entrada solamente tenía %d"
-#: locale/programs/ld-collate.c:617
+#: locale/programs/ld-collate.c:616
#, c-format
msgid "%s: not enough sorting rules"
msgstr "%s: no hay suficientes reglas de ordenación"
-#: locale/programs/ld-collate.c:782
+#: locale/programs/ld-collate.c:781
#, c-format
msgid "%s: empty weight string not allowed"
msgstr "%s: no se permite una cadena de peso vacía"
-#: locale/programs/ld-collate.c:877
+#: locale/programs/ld-collate.c:876
#, c-format
msgid "%s: weights must use the same ellipsis symbol as the name"
msgstr "%s: los pesos deben usar el mismo símbolo de elipsis que el nombre"
-#: locale/programs/ld-collate.c:933
+#: locale/programs/ld-collate.c:932
#, c-format
msgid "%s: too many values"
msgstr "%s: demasiados valores"
-#: locale/programs/ld-collate.c:1053 locale/programs/ld-collate.c:1228
+#: locale/programs/ld-collate.c:1052 locale/programs/ld-collate.c:1227
#, c-format
msgid "order for `%.*s' already defined at %s:%Zu"
msgstr "el orden para `%.*s' ya está definido en %s:%Zu"
-#: locale/programs/ld-collate.c:1103
+#: locale/programs/ld-collate.c:1102
#, c-format
msgid "%s: the start and the end symbol of a range must stand for characters"
msgstr "%s: los símbolos de comienzo y de final de un rango deben representar caracteres"
-#: locale/programs/ld-collate.c:1130
+#: locale/programs/ld-collate.c:1129
#, c-format
msgid "%s: byte sequences of first and last character must have the same length"
msgstr ""
"%s: los órdenes de byte de los caracteres primero y último deben tener\n"
"la misma longitud"
-#: locale/programs/ld-collate.c:1172
+#: locale/programs/ld-collate.c:1171
#, c-format
msgid "%s: byte sequence of first character of range is not lower than that of the last character"
msgstr ""
"%s: el orden de byte del primer carácter del rango no es menor que\n"
"el del último carácter"
-#: locale/programs/ld-collate.c:1297
+#: locale/programs/ld-collate.c:1296
#, c-format
msgid "%s: symbolic range ellipsis must not directly follow `order_start'"
msgstr "%s: el rango simbólico de la elipsis no debe seguir directamente a `order_start'"
-#: locale/programs/ld-collate.c:1301
+#: locale/programs/ld-collate.c:1300
#, c-format
msgid "%s: symbolic range ellipsis must not be directly followed by `order_end'"
msgstr "%s: el rango simbólico de la elipsis no debe estar directamente seguido por `order_end'"
-#: locale/programs/ld-collate.c:1321 locale/programs/ld-ctype.c:1502
+#: locale/programs/ld-collate.c:1320 locale/programs/ld-ctype.c:1501
#, c-format
msgid "`%s' and `%.*s' are not valid names for symbolic range"
msgstr "`%s' y `%.*s' no son nombres válidos para el rango simbólico"
-#: locale/programs/ld-collate.c:1371 locale/programs/ld-collate.c:3861
+#: locale/programs/ld-collate.c:1370 locale/programs/ld-collate.c:3858
#, c-format
msgid "%s: order for `%.*s' already defined at %s:%Zu"
msgstr "%s: el orden para `%.*s' ya está definido en %s:%Zu"
-#: locale/programs/ld-collate.c:1380
+#: locale/programs/ld-collate.c:1379
#, c-format
msgid "%s: `%s' must be a character"
msgstr "%s: `%s' debe ser un carácter"
-#: locale/programs/ld-collate.c:1575
+#: locale/programs/ld-collate.c:1574
#, c-format
msgid "%s: `position' must be used for a specific level in all sections or none"
msgstr "%s: `position' debe utilizarse para un nivel específico en todas las secciones o en ninguna"
-#: locale/programs/ld-collate.c:1600
+#: locale/programs/ld-collate.c:1599
#, c-format
msgid "symbol `%s' not defined"
msgstr "el símbolo `%s' no está definido"
-#: locale/programs/ld-collate.c:1676 locale/programs/ld-collate.c:1782
+#: locale/programs/ld-collate.c:1675 locale/programs/ld-collate.c:1781
#, c-format
msgid "symbol `%s' has the same encoding as"
msgstr "el símbolo `%s' tiene la misma codificación que"
-#: locale/programs/ld-collate.c:1680 locale/programs/ld-collate.c:1786
+#: locale/programs/ld-collate.c:1679 locale/programs/ld-collate.c:1785
#, c-format
msgid "symbol `%s'"
msgstr "el símbolo `%s'"
-#: locale/programs/ld-collate.c:1828
+#: locale/programs/ld-collate.c:1827
#, c-format
msgid "no definition of `UNDEFINED'"
msgstr "no hay definición para `UNDEFINED'"
-#: locale/programs/ld-collate.c:1857
+#: locale/programs/ld-collate.c:1856
#, c-format
msgid "too many errors; giving up"
msgstr "demasiados errores; abandono"
-#: locale/programs/ld-collate.c:2661 locale/programs/ld-collate.c:4049
+#: locale/programs/ld-collate.c:2658 locale/programs/ld-collate.c:4046
#, c-format
msgid "%s: nested conditionals not supported"
msgstr "%s: no se admiten condicionales anidados"
-#: locale/programs/ld-collate.c:2679
+#: locale/programs/ld-collate.c:2676
#, c-format
msgid "%s: more then one 'else'"
msgstr "%s: más de un 'else'"
-#: locale/programs/ld-collate.c:2854
+#: locale/programs/ld-collate.c:2851
#, c-format
msgid "%s: duplicate definition of `%s'"
msgstr "%s: definición duplicada de `%s'"
-#: locale/programs/ld-collate.c:2890
+#: locale/programs/ld-collate.c:2887
#, c-format
msgid "%s: duplicate declaration of section `%s'"
msgstr "%s: definición duplicada de la sección `%s'"
-#: locale/programs/ld-collate.c:3026
+#: locale/programs/ld-collate.c:3023
#, c-format
msgid "%s: unknown character in collating symbol name"
msgstr "%s: carácter desconocido en el nombre de un símbolo de ordenación"
-#: locale/programs/ld-collate.c:3155
+#: locale/programs/ld-collate.c:3152
#, c-format
msgid "%s: unknown character in equivalent definition name"
msgstr "%s: carácter desconocido en el nombre de definición equivalente"
-#: locale/programs/ld-collate.c:3166
+#: locale/programs/ld-collate.c:3163
#, c-format
msgid "%s: unknown character in equivalent definition value"
msgstr "%s: carácter desconocido en el valor de definición equivalente"
-#: locale/programs/ld-collate.c:3176
+#: locale/programs/ld-collate.c:3173
#, c-format
msgid "%s: unknown symbol `%s' in equivalent definition"
msgstr "%s: símbolo desconocido `%s' en la definición equivalente"
-#: locale/programs/ld-collate.c:3185
+#: locale/programs/ld-collate.c:3182
msgid "error while adding equivalent collating symbol"
msgstr "error al añadir símbolo de ordenación equivalente"
-#: locale/programs/ld-collate.c:3223
+#: locale/programs/ld-collate.c:3220
#, c-format
msgid "duplicate definition of script `%s'"
msgstr "definición duplicada de `script' `%s'"
-#: locale/programs/ld-collate.c:3271
+#: locale/programs/ld-collate.c:3268
#, c-format
msgid "%s: unknown section name `%.*s'"
msgstr "%s: nombre de sección desconocido `%.*s'"
-#: locale/programs/ld-collate.c:3300
+#: locale/programs/ld-collate.c:3297
#, c-format
msgid "%s: multiple order definitions for section `%s'"
msgstr "%s: hay varias definiciones de orden para la sección `%s'"
-#: locale/programs/ld-collate.c:3328
+#: locale/programs/ld-collate.c:3325
#, c-format
msgid "%s: invalid number of sorting rules"
msgstr "%s: número inválido de reglas de ordenación"
-#: locale/programs/ld-collate.c:3355
+#: locale/programs/ld-collate.c:3352
#, c-format
msgid "%s: multiple order definitions for unnamed section"
msgstr "%s: varias definiciones de orden para la sección sin nombre"
-#: locale/programs/ld-collate.c:3410 locale/programs/ld-collate.c:3540
-#: locale/programs/ld-collate.c:3903
+#: locale/programs/ld-collate.c:3407 locale/programs/ld-collate.c:3537
+#: locale/programs/ld-collate.c:3900
#, c-format
msgid "%s: missing `order_end' keyword"
msgstr "%s: falta la palabra clave `order_end'"
-#: locale/programs/ld-collate.c:3473
+#: locale/programs/ld-collate.c:3470
#, c-format
msgid "%s: order for collating symbol %.*s not yet defined"
msgstr "%s: el orden para el símbolo de ordenación %.*s todavía no está definido"
# FIXME: ¿Por qué este y el siguiente no son iguales?
-#: locale/programs/ld-collate.c:3491
+#: locale/programs/ld-collate.c:3488
#, c-format
msgid "%s: order for collating element %.*s not yet defined"
msgstr "%s: el orden para el elemento de ordenación %.*s todavía no está definido"
-#: locale/programs/ld-collate.c:3502
+#: locale/programs/ld-collate.c:3499
#, c-format
msgid "%s: cannot reorder after %.*s: symbol not known"
msgstr "%s: no se puede reordenar después de %.*s: símbolo desconocido"
-#: locale/programs/ld-collate.c:3554 locale/programs/ld-collate.c:3915
+#: locale/programs/ld-collate.c:3551 locale/programs/ld-collate.c:3912
#, c-format
msgid "%s: missing `reorder-end' keyword"
msgstr "%s: falta la palabra clave `reorder-end'"
-#: locale/programs/ld-collate.c:3588 locale/programs/ld-collate.c:3786
+#: locale/programs/ld-collate.c:3585 locale/programs/ld-collate.c:3783
#, c-format
msgid "%s: section `%.*s' not known"
msgstr "%s: la sección `%.*s' es desconocida"
-#: locale/programs/ld-collate.c:3653
+#: locale/programs/ld-collate.c:3650
#, c-format
msgid "%s: bad symbol <%.*s>"
msgstr "%s: símbolo erróneo <%.*s>"
-#: locale/programs/ld-collate.c:3849
+#: locale/programs/ld-collate.c:3846
#, c-format
msgid "%s: cannot have `%s' as end of ellipsis range"
msgstr "%s: no puede tener `%s' como final de un rango de elipsis"
-#: locale/programs/ld-collate.c:3899
+#: locale/programs/ld-collate.c:3896
#, c-format
msgid "%s: empty category description not allowed"
msgstr "%s: no se permite una descripción de categoría vacía"
-#: locale/programs/ld-collate.c:3918
+#: locale/programs/ld-collate.c:3915
#, c-format
msgid "%s: missing `reorder-sections-end' keyword"
msgstr "%s: falta la palabra clave `reorder-sections-end'"
-#: locale/programs/ld-collate.c:4082
+#: locale/programs/ld-collate.c:4079
#, c-format
msgid "%s: '%s' without matching 'ifdef' or 'ifndef'"
msgstr "%s: '%s' sin el 'ifdef' o 'ifndef' correspondiente"
-#: locale/programs/ld-collate.c:4100
+#: locale/programs/ld-collate.c:4097
#, c-format
msgid "%s: 'endif' without matching 'ifdef' or 'ifndef'"
msgstr "%s: 'endif' sin el 'ifdef' o 'ifndef' correspondiente"
-#: locale/programs/ld-ctype.c:440
+#: locale/programs/ld-ctype.c:439
#, c-format
msgid "No character set name specified in charmap"
msgstr ""
"No se ha especificado ningún nombre de conjunto de caracteres en la tabla\n"
"de caracteres"
-#: locale/programs/ld-ctype.c:469
+#: locale/programs/ld-ctype.c:468
#, c-format
msgid "character L'\\u%0*x' in class `%s' must be in class `%s'"
msgstr "el carácter L'\\u%0*x' en la clase `%s' debe estar en la clase `%s'"
-#: locale/programs/ld-ctype.c:484
+#: locale/programs/ld-ctype.c:483
#, c-format
msgid "character L'\\u%0*x' in class `%s' must not be in class `%s'"
msgstr "el carácter L'\\u%0*x' en la clase `%s' no debe estar en la clase `%s"
-#: locale/programs/ld-ctype.c:498 locale/programs/ld-ctype.c:556
+#: locale/programs/ld-ctype.c:497 locale/programs/ld-ctype.c:555
#, c-format
msgid "internal error in %s, line %u"
msgstr "error interno en %s, línea %u"
-#: locale/programs/ld-ctype.c:527
+#: locale/programs/ld-ctype.c:526
#, c-format
msgid "character '%s' in class `%s' must be in class `%s'"
msgstr "el carácter '%s' en la clase `%s' debe estar en la clase `%s'"
-#: locale/programs/ld-ctype.c:543
+#: locale/programs/ld-ctype.c:542
#, c-format
msgid "character '%s' in class `%s' must not be in class `%s'"
msgstr "el carácter '%s' en la clase `%s' no debe estar en la clase `%s"
-#: locale/programs/ld-ctype.c:573 locale/programs/ld-ctype.c:611
+#: locale/programs/ld-ctype.c:572 locale/programs/ld-ctype.c:610
#, c-format
msgid "<SP> character not in class `%s'"
msgstr "El carácter <SP> no está en la clase `%s'"
-#: locale/programs/ld-ctype.c:585 locale/programs/ld-ctype.c:622
+#: locale/programs/ld-ctype.c:584 locale/programs/ld-ctype.c:621
#, c-format
msgid "<SP> character must not be in class `%s'"
msgstr "El carácter <SP> no debe estar en la clase `%s'"
-#: locale/programs/ld-ctype.c:600
+#: locale/programs/ld-ctype.c:599
#, c-format
msgid "character <SP> not defined in character map"
msgstr "el carácter <SP> no está definido en la tabla de caracteres"
-#: locale/programs/ld-ctype.c:736
+#: locale/programs/ld-ctype.c:735
#, c-format
msgid "`digit' category has not entries in groups of ten"
msgstr "la categoría `digit' no tiene entradas en grupos de diez"
# FIXME: El original no se entiende. ¿Es gramaticalmente correcto? sv
-#: locale/programs/ld-ctype.c:785
+#: locale/programs/ld-ctype.c:784
#, c-format
msgid "no input digits defined and none of the standard names in the charmap"
msgstr ""
"no hay ningún dígito de entrada definido y ninguno de los nombres estándar\n"
"en el conjunto de caracteres"
-#: locale/programs/ld-ctype.c:850
+#: locale/programs/ld-ctype.c:849
#, c-format
msgid "not all characters used in `outdigit' are available in the charmap"
msgstr ""
"no todos los caracteres usados en `outdigit' están disponibles en la tabla\n"
"de caracteres"
-#: locale/programs/ld-ctype.c:867
+#: locale/programs/ld-ctype.c:866
#, c-format
msgid "not all characters used in `outdigit' are available in the repertoire"
msgstr "no todos los caracteres usados en `outdigit' están disponibles en el repertorio"
-#: locale/programs/ld-ctype.c:1270
+#: locale/programs/ld-ctype.c:1269
#, c-format
msgid "character class `%s' already defined"
msgstr "la clase de carácter `%s' ya fue definida"
-#: locale/programs/ld-ctype.c:1276
+#: locale/programs/ld-ctype.c:1275
#, c-format
msgid "implementation limit: no more than %Zd character classes allowed"
msgstr "límite de la implementación: no se permiten más de %Zd clases de caracteres"
-#: locale/programs/ld-ctype.c:1302
+#: locale/programs/ld-ctype.c:1301
#, c-format
msgid "character map `%s' already defined"
msgstr "la tabla de caracteres `%s' ya está definida"
-#: locale/programs/ld-ctype.c:1308
+#: locale/programs/ld-ctype.c:1307
#, c-format
msgid "implementation limit: no more than %d character maps allowed"
msgstr "límite de la implementación: no se permiten más de %d tablas de caracteres"
-#: locale/programs/ld-ctype.c:1573 locale/programs/ld-ctype.c:1698
-#: locale/programs/ld-ctype.c:1804 locale/programs/ld-ctype.c:2496
-#: locale/programs/ld-ctype.c:3492
+#: locale/programs/ld-ctype.c:1572 locale/programs/ld-ctype.c:1697
+#: locale/programs/ld-ctype.c:1803 locale/programs/ld-ctype.c:2493
+#: locale/programs/ld-ctype.c:3489
#, c-format
msgid "%s: field `%s' does not contain exactly ten entries"
msgstr "%s: el campo `%s' no contiene exactamente diez entradas"
-#: locale/programs/ld-ctype.c:1601 locale/programs/ld-ctype.c:2175
+#: locale/programs/ld-ctype.c:1600 locale/programs/ld-ctype.c:2174
#, c-format
msgid "to-value <U%0*X> of range is smaller than from-value <U%0*X>"
msgstr "el valor `to' del rango <U%0*X> es más pequeño que el valor `from' <U%0*X>"
-#: locale/programs/ld-ctype.c:1728
+#: locale/programs/ld-ctype.c:1727
msgid "start and end character sequence of range must have the same length"
msgstr "los caracteres de comienzo y final del rango debe tener la misma longitud"
-#: locale/programs/ld-ctype.c:1735
+#: locale/programs/ld-ctype.c:1734
msgid "to-value character sequence is smaller than from-value sequence"
msgstr "el valor `to' de la sucesión de caracteres es más pequeño que el valor `from'"
-#: locale/programs/ld-ctype.c:2095 locale/programs/ld-ctype.c:2146
+#: locale/programs/ld-ctype.c:2094 locale/programs/ld-ctype.c:2145
msgid "premature end of `translit_ignore' definition"
msgstr "Fin no esperado de la definición `translit_ignore'"
-#: locale/programs/ld-ctype.c:2101 locale/programs/ld-ctype.c:2152
-#: locale/programs/ld-ctype.c:2194
+#: locale/programs/ld-ctype.c:2100 locale/programs/ld-ctype.c:2151
+#: locale/programs/ld-ctype.c:2193
msgid "syntax error"
msgstr "error de sintaxis"
-#: locale/programs/ld-ctype.c:2328
+#: locale/programs/ld-ctype.c:2326
#, c-format
msgid "%s: syntax error in definition of new character class"
msgstr "%s: error de sintaxis en la definición de una nueva clase de caracteres"
-#: locale/programs/ld-ctype.c:2343
+#: locale/programs/ld-ctype.c:2341
#, c-format
msgid "%s: syntax error in definition of new character map"
msgstr "%s: error de sintaxis en la definición de un nueva tabla de caracteres"
-#: locale/programs/ld-ctype.c:2518
+#: locale/programs/ld-ctype.c:2515
msgid "ellipsis range must be marked by two operands of same type"
msgstr "el rango de la elipsis debe estar marcada mediante dos operandos del mismo tipo"
-#: locale/programs/ld-ctype.c:2527
+#: locale/programs/ld-ctype.c:2524
msgid "with symbolic name range values the absolute ellipsis `...' must not be used"
msgstr "con valores de rango nombre simbólico la elipsis absoluta `...' no debe usarse"
-#: locale/programs/ld-ctype.c:2542
+#: locale/programs/ld-ctype.c:2539
msgid "with UCS range values one must use the hexadecimal symbolic ellipsis `..'"
msgstr "con valores de rango UCS se debe utilizar la elipsis simbólica hexadecimal `..'"
-#: locale/programs/ld-ctype.c:2556
+#: locale/programs/ld-ctype.c:2553
msgid "with character code range values one must use the absolute ellipsis `...'"
msgstr "con valores de rango código de caracteres se debe utilizar la elipsis absoluta `...'"
-#: locale/programs/ld-ctype.c:2707
+#: locale/programs/ld-ctype.c:2704
#, c-format
msgid "duplicated definition for mapping `%s'"
msgstr "definición duplicada para la asignación `%s'"
-#: locale/programs/ld-ctype.c:2793 locale/programs/ld-ctype.c:2937
+#: locale/programs/ld-ctype.c:2790 locale/programs/ld-ctype.c:2934
#, c-format
msgid "%s: `translit_start' section does not end with `translit_end'"
msgstr "%s: la sección `translit_start' no termina con `translit_end'"
-#: locale/programs/ld-ctype.c:2888
+#: locale/programs/ld-ctype.c:2885
#, c-format
msgid "%s: duplicate `default_missing' definition"
msgstr "%s: definición `default_missing' duplicada"
-#: locale/programs/ld-ctype.c:2893
+#: locale/programs/ld-ctype.c:2890
msgid "previous definition was here"
msgstr "aquí estaba la definición anterior"
-#: locale/programs/ld-ctype.c:2915
+#: locale/programs/ld-ctype.c:2912
#, c-format
msgid "%s: no representable `default_missing' definition found"
msgstr "%s: no se ha encontrado ninguna definición de `default_missing' representable"
-#: locale/programs/ld-ctype.c:3068 locale/programs/ld-ctype.c:3152
-#: locale/programs/ld-ctype.c:3172 locale/programs/ld-ctype.c:3193
-#: locale/programs/ld-ctype.c:3214 locale/programs/ld-ctype.c:3235
-#: locale/programs/ld-ctype.c:3256 locale/programs/ld-ctype.c:3296
-#: locale/programs/ld-ctype.c:3317 locale/programs/ld-ctype.c:3384
-#: locale/programs/ld-ctype.c:3426 locale/programs/ld-ctype.c:3451
+#: locale/programs/ld-ctype.c:3065 locale/programs/ld-ctype.c:3149
+#: locale/programs/ld-ctype.c:3169 locale/programs/ld-ctype.c:3190
+#: locale/programs/ld-ctype.c:3211 locale/programs/ld-ctype.c:3232
+#: locale/programs/ld-ctype.c:3253 locale/programs/ld-ctype.c:3293
+#: locale/programs/ld-ctype.c:3314 locale/programs/ld-ctype.c:3381
+#: locale/programs/ld-ctype.c:3423 locale/programs/ld-ctype.c:3448
#, c-format
msgid "%s: character `%s' not defined while needed as default value"
msgstr "%s: el carácter `%s' no está definido cuando se necesitó como valor predeterminado"
-#: locale/programs/ld-ctype.c:3073 locale/programs/ld-ctype.c:3157
-#: locale/programs/ld-ctype.c:3177 locale/programs/ld-ctype.c:3198
-#: locale/programs/ld-ctype.c:3219 locale/programs/ld-ctype.c:3240
-#: locale/programs/ld-ctype.c:3261 locale/programs/ld-ctype.c:3301
-#: locale/programs/ld-ctype.c:3322 locale/programs/ld-ctype.c:3389
+#: locale/programs/ld-ctype.c:3070 locale/programs/ld-ctype.c:3154
+#: locale/programs/ld-ctype.c:3174 locale/programs/ld-ctype.c:3195
+#: locale/programs/ld-ctype.c:3216 locale/programs/ld-ctype.c:3237
+#: locale/programs/ld-ctype.c:3258 locale/programs/ld-ctype.c:3298
+#: locale/programs/ld-ctype.c:3319 locale/programs/ld-ctype.c:3386
#, c-format
msgid "%s: character `%s' in charmap not representable with one byte"
msgstr "%s: el carácter `%s' en la tabla de caracteres no es representable con un byte"
-#: locale/programs/ld-ctype.c:3433 locale/programs/ld-ctype.c:3458
+#: locale/programs/ld-ctype.c:3430 locale/programs/ld-ctype.c:3455
#, c-format
msgid "%s: character `%s' needed as default value not representable with one byte"
msgstr ""
@@ -2349,7 +2447,7 @@ msgstr ""
"con un byte"
# FIXME: Lo mismo de antes.
-#: locale/programs/ld-ctype.c:3514
+#: locale/programs/ld-ctype.c:3511
#, c-format
msgid "no output digits defined and none of the standard names in the charmap"
msgstr ""
@@ -2357,229 +2455,229 @@ msgstr ""
"en el conjunto de caracteres"
# Pregunta: ¿De verdad existe transliteración en español? sv
-#: locale/programs/ld-ctype.c:3805
+#: locale/programs/ld-ctype.c:3802
#, c-format
msgid "%s: transliteration data from locale `%s' not available"
msgstr "%s: los datos de transliteración del local `%s' no están disponibles"
-#: locale/programs/ld-ctype.c:3906
+#: locale/programs/ld-ctype.c:3903
#, c-format
msgid "%s: table for class \"%s\": %lu bytes\n"
msgstr "%s: tabla para la clase \"%s\": %lu bytes\n"
-#: locale/programs/ld-ctype.c:3975
+#: locale/programs/ld-ctype.c:3972
#, c-format
msgid "%s: table for map \"%s\": %lu bytes\n"
msgstr "%s: tabla para la asignación \"%s\": %lu bytes\n"
-#: locale/programs/ld-ctype.c:4108
+#: locale/programs/ld-ctype.c:4105
#, c-format
msgid "%s: table for width: %lu bytes\n"
msgstr "%s: tabla para el ancho: %lu bytes\n"
-#: locale/programs/ld-identification.c:170
+#: locale/programs/ld-identification.c:169
#, c-format
msgid "%s: no identification for category `%s'"
msgstr "%s: no hay ninguna identificación para la categoría `%s'"
-#: locale/programs/ld-identification.c:435
+#: locale/programs/ld-identification.c:434
#, c-format
msgid "%s: duplicate category version definition"
msgstr "%s: definición duplicada de la versión de la categoría"
# Ídem. 1984.
-#: locale/programs/ld-measurement.c:113
+#: locale/programs/ld-measurement.c:112
#, c-format
msgid "%s: invalid value for field `%s'"
msgstr "%s: valor inválido para el campo `%s'"
# FIXME: Este mensaje se parece sospechosamente al anterior. sv
-#: locale/programs/ld-messages.c:114 locale/programs/ld-messages.c:148
+#: locale/programs/ld-messages.c:113 locale/programs/ld-messages.c:147
#, c-format
msgid "%s: field `%s' undefined"
msgstr "%s: el campo `%s' no está definido"
-#: locale/programs/ld-messages.c:121 locale/programs/ld-messages.c:155
-#: locale/programs/ld-monetary.c:256 locale/programs/ld-numeric.c:118
+#: locale/programs/ld-messages.c:120 locale/programs/ld-messages.c:154
+#: locale/programs/ld-monetary.c:255 locale/programs/ld-numeric.c:117
#, c-format
msgid "%s: value for field `%s' must not be an empty string"
msgstr "%s: el valor para el campo `%s' no debe ser la cadena vacía"
-#: locale/programs/ld-messages.c:137 locale/programs/ld-messages.c:171
+#: locale/programs/ld-messages.c:136 locale/programs/ld-messages.c:170
#, c-format
msgid "%s: no correct regular expression for field `%s': %s"
msgstr "%s: la expresión regular para el campo `%s' no es correcta: %s"
# ¿Errónea? em+
# También se puede poner equivocada. sv+
-#: locale/programs/ld-monetary.c:224
+#: locale/programs/ld-monetary.c:223
#, c-format
msgid "%s: value of field `int_curr_symbol' has wrong length"
msgstr "%s: el valor del campo `int_curr_symbol' tiene una longitud errónea"
-#: locale/programs/ld-monetary.c:237
+#: locale/programs/ld-monetary.c:236
#, c-format
msgid "%s: value of field `int_curr_symbol' does not correspond to a valid name in ISO 4217"
msgstr ""
"%s: el valor del campo `int_curr_symbol' no se corresponde con un nombre\n"
"válido en ISO 4217"
-#: locale/programs/ld-monetary.c:285 locale/programs/ld-monetary.c:315
+#: locale/programs/ld-monetary.c:284 locale/programs/ld-monetary.c:314
#, c-format
msgid "%s: value for field `%s' must be in range %d...%d"
msgstr "%s: el valor para el campo `%s' debe estar en el rango %d...%d"
-#: locale/programs/ld-monetary.c:747 locale/programs/ld-numeric.c:274
+#: locale/programs/ld-monetary.c:746 locale/programs/ld-numeric.c:273
#, c-format
msgid "%s: value for field `%s' must be a single character"
msgstr "%s: el valor para el campo `%s' debe ser un único carácter"
-#: locale/programs/ld-monetary.c:844 locale/programs/ld-numeric.c:318
+#: locale/programs/ld-monetary.c:843 locale/programs/ld-numeric.c:317
#, c-format
msgid "%s: `-1' must be last entry in `%s' field"
msgstr "%s: `-1' debe ser la última entrada del campo `%s'"
-#: locale/programs/ld-monetary.c:866 locale/programs/ld-numeric.c:335
+#: locale/programs/ld-monetary.c:865 locale/programs/ld-numeric.c:334
#, c-format
msgid "%s: values for field `%s' must be smaller than 127"
msgstr "%s: los valores para el campo `%s' deben ser menores que 127"
-#: locale/programs/ld-monetary.c:909
+#: locale/programs/ld-monetary.c:908
msgid "conversion rate value cannot be zero"
msgstr "el valor de la tasa de conversión no puede ser cero"
-#: locale/programs/ld-name.c:129 locale/programs/ld-telephone.c:126
-#: locale/programs/ld-telephone.c:149
+#: locale/programs/ld-name.c:128 locale/programs/ld-telephone.c:125
+#: locale/programs/ld-telephone.c:148
#, c-format
msgid "%s: invalid escape sequence in field `%s'"
msgstr "%s: secuencia de escape inválida en el campo `%s'"
-#: locale/programs/ld-time.c:247
+#: locale/programs/ld-time.c:246
#, c-format
msgid "%s: direction flag in string %Zd in `era' field is not '+' nor '-'"
msgstr "%s: el indicador de dirección en la cadena %Zd en el campo `era' no es '+' ni '-'"
-#: locale/programs/ld-time.c:258
+#: locale/programs/ld-time.c:257
#, c-format
msgid "%s: direction flag in string %Zd in `era' field is not a single character"
msgstr "%s: el indicador de dirección en la cadena %Zd en el campo `era' no es un único carácter"
-#: locale/programs/ld-time.c:271
+#: locale/programs/ld-time.c:270
#, c-format
msgid "%s: invalid number for offset in string %Zd in `era' field"
msgstr "%s: número de desplazamiento ilegal en la cadena %Zd en el campo `era'"
-#: locale/programs/ld-time.c:279
+#: locale/programs/ld-time.c:278
#, c-format
msgid "%s: garbage at end of offset value in string %Zd in `era' field"
msgstr ""
"%s: incongruencias al final del valor de desplazamiento en la cadena %Zd\n"
"en el campo `era'"
-#: locale/programs/ld-time.c:330
+#: locale/programs/ld-time.c:329
#, c-format
msgid "%s: invalid starting date in string %Zd in `era' field"
msgstr "%s: fecha de comienzo inválida en la cadena %Zd en el campo `era'"
# FIXME: ¿Por qué el espacio final? sv
-#: locale/programs/ld-time.c:339
+#: locale/programs/ld-time.c:338
#, c-format
msgid "%s: garbage at end of starting date in string %Zd in `era' field "
msgstr ""
"%s: incongruencias al final de la fecha de comienzo en la cadena %Zd\n"
"en el campo `era' "
-#: locale/programs/ld-time.c:358
+#: locale/programs/ld-time.c:357
#, c-format
msgid "%s: starting date is invalid in string %Zd in `era' field"
msgstr "%s: la fecha de comienzo es inválida en la cadena %Zd del campo `era'"
-#: locale/programs/ld-time.c:407 locale/programs/ld-time.c:435
+#: locale/programs/ld-time.c:406 locale/programs/ld-time.c:434
#, c-format
msgid "%s: invalid stopping date in string %Zd in `era' field"
msgstr "%s: fecha de parada inválida en la cadena %Zd en el campo `era'"
-#: locale/programs/ld-time.c:416
+#: locale/programs/ld-time.c:415
#, c-format
msgid "%s: garbage at end of stopping date in string %Zd in `era' field"
msgstr ""
"%s: incongruencias al final de la fecha de parada en la cadena %Zd\n"
"en el campo `era'"
-#: locale/programs/ld-time.c:444
+#: locale/programs/ld-time.c:443
#, c-format
msgid "%s: missing era name in string %Zd in `era' field"
msgstr "%s: falta el nombre de la era en la cadena %Zd en el campo `era'"
-#: locale/programs/ld-time.c:456
+#: locale/programs/ld-time.c:455
#, c-format
msgid "%s: missing era format in string %Zd in `era' field"
msgstr "%s: falta el formato de era en la cadena %Zd en el campo `era'"
-#: locale/programs/ld-time.c:497
+#: locale/programs/ld-time.c:496
#, c-format
msgid "%s: third operand for value of field `%s' must not be larger than %d"
msgstr "%s: el tercer operando para el valor del campo `%s' no debe ser mayor que %d"
-#: locale/programs/ld-time.c:505 locale/programs/ld-time.c:513
-#: locale/programs/ld-time.c:521
+#: locale/programs/ld-time.c:504 locale/programs/ld-time.c:512
+#: locale/programs/ld-time.c:520
#, c-format
msgid "%s: values for field `%s' must not be larger than %d"
msgstr "%s: los valores para el campo `%s' no deben ser mayores que %d"
-#: locale/programs/ld-time.c:1004
+#: locale/programs/ld-time.c:1003
#, c-format
msgid "%s: too few values for field `%s'"
msgstr "%s: insuficiente número de valores para el campo `%s'"
-#: locale/programs/ld-time.c:1049
+#: locale/programs/ld-time.c:1048
msgid "extra trailing semicolon"
msgstr "sobra un punto y coma al final"
-#: locale/programs/ld-time.c:1052
+#: locale/programs/ld-time.c:1051
#, c-format
msgid "%s: too many values for field `%s'"
msgstr "%s: demasiados valores para el campo `%s'"
-#: locale/programs/linereader.c:130
+#: locale/programs/linereader.c:129
msgid "trailing garbage at end of line"
msgstr "hay inconsistencias al final de la línea"
-#: locale/programs/linereader.c:298
+#: locale/programs/linereader.c:297
msgid "garbage at end of number"
msgstr "inconsistencias al final del número"
-#: locale/programs/linereader.c:410
+#: locale/programs/linereader.c:409
msgid "garbage at end of character code specification"
msgstr "inconsistencia al final de la especificación del código de caracteres"
-#: locale/programs/linereader.c:496
+#: locale/programs/linereader.c:495
msgid "unterminated symbolic name"
msgstr "nombre simbólico sin terminar"
-#: locale/programs/linereader.c:623
+#: locale/programs/linereader.c:622
msgid "illegal escape sequence at end of string"
msgstr "secuencia de escape ilegal al final de la cadena de caracteres"
-#: locale/programs/linereader.c:627 locale/programs/linereader.c:855
+#: locale/programs/linereader.c:626 locale/programs/linereader.c:854
msgid "unterminated string"
msgstr "cadena de caracteres sin terminar"
-#: locale/programs/linereader.c:669
+#: locale/programs/linereader.c:668
msgid "non-symbolic character value should not be used"
msgstr "los valores de caracteres no simbólicos no deben utilizarse"
-#: locale/programs/linereader.c:816
+#: locale/programs/linereader.c:815
#, c-format
msgid "symbol `%.*s' not in charmap"
msgstr "el símbolo `%.*s' no está en la tabla de caracteres"
-#: locale/programs/linereader.c:837
+#: locale/programs/linereader.c:836
#, c-format
msgid "symbol `%.*s' not in repertoire map"
msgstr "el símbolo `%.*s' no está en el repertorio"
-#: locale/programs/locale-spec.c:131
+#: locale/programs/locale-spec.c:130
#, c-format
msgid "unknown name \"%s\""
msgstr "nombre desconocido \"%s\""
@@ -2644,84 +2742,84 @@ msgstr "No se puede establecer LC_COLLATE al local predeterminado"
msgid "Cannot set LC_ALL to default locale"
msgstr "No se puede establecer LC_ALL al local predeterminado"
-#: locale/programs/locale.c:518
+#: locale/programs/locale.c:521
#, c-format
msgid "while preparing output"
msgstr "al preparar la salida"
-#: locale/programs/localedef.c:120
+#: locale/programs/localedef.c:119
msgid "Input Files:"
msgstr "Ficheros de Entrada:"
-#: locale/programs/localedef.c:122
+#: locale/programs/localedef.c:121
msgid "Symbolic character names defined in FILE"
msgstr "Nombres simbólicos de caracteres definidos en FICHERO"
-#: locale/programs/localedef.c:123
+#: locale/programs/localedef.c:122
msgid "Source definitions are found in FILE"
msgstr "Las definiciones fuente se encuentran en FICHERO"
-#: locale/programs/localedef.c:125
+#: locale/programs/localedef.c:124
msgid "FILE contains mapping from symbolic names to UCS4 values"
msgstr "El FICHERO contiene una asignación de nombres simbólicos a valores UCS4"
-#: locale/programs/localedef.c:129
+#: locale/programs/localedef.c:128
msgid "Create output even if warning messages were issued"
msgstr "Crea la salida incluso si hubo mensajes de aviso"
-#: locale/programs/localedef.c:130
+#: locale/programs/localedef.c:129
msgid "Create old-style tables"
msgstr "Crea tablas en estilo antiguo"
-#: locale/programs/localedef.c:131
+#: locale/programs/localedef.c:130
msgid "Optional output file prefix"
msgstr "Prefijo opcional del fichero de salida"
-#: locale/programs/localedef.c:132
+#: locale/programs/localedef.c:131
msgid "Be strictly POSIX conform"
msgstr "Actúa estrictamente de acuerdo con la norma POSIX"
-#: locale/programs/localedef.c:134
+#: locale/programs/localedef.c:133
msgid "Suppress warnings and information messages"
msgstr "Suprime los avisos y los mensajes de información"
-#: locale/programs/localedef.c:135
+#: locale/programs/localedef.c:134
msgid "Print more messages"
msgstr "Muestra más mensajes"
-#: locale/programs/localedef.c:136
+#: locale/programs/localedef.c:135
msgid "Archive control:"
msgstr "Control del archivo:"
-#: locale/programs/localedef.c:138
+#: locale/programs/localedef.c:137
msgid "Don't add new data to archive"
msgstr "No añade nuevos datos al archivo"
-#: locale/programs/localedef.c:140
+#: locale/programs/localedef.c:139
msgid "Add locales named by parameters to archive"
msgstr "Añade locales nombrados por parámetros al archivo"
-#: locale/programs/localedef.c:141
+#: locale/programs/localedef.c:140
msgid "Replace existing archive content"
msgstr "Reemplaza el contenido del archivo que exista"
-#: locale/programs/localedef.c:143
+#: locale/programs/localedef.c:142
msgid "Remove locales named by parameters from archive"
msgstr "Elimina locales nombrados por parámetros del archivo"
-#: locale/programs/localedef.c:144
+#: locale/programs/localedef.c:143
msgid "List content of archive"
msgstr "Lista el contenido del archivo"
-#: locale/programs/localedef.c:146
+#: locale/programs/localedef.c:145
msgid "locale.alias file to consult when making archive"
msgstr "fichero locale.alias que se consultará al crear el archivo"
-#: locale/programs/localedef.c:151
+#: locale/programs/localedef.c:150
msgid "Compile locale specification"
msgstr "Compila una especificación de locales"
-#: locale/programs/localedef.c:154
+#: locale/programs/localedef.c:153
msgid ""
"NAME\n"
"[--add-to-archive|--delete-from-archive] FILE...\n"
@@ -2731,30 +2829,30 @@ msgstr ""
"[--add-to-archive|--delete-from-archive] FICHERO...\n"
"--list-archive [FICHERO]"
-#: locale/programs/localedef.c:232
+#: locale/programs/localedef.c:228
#, c-format
msgid "cannot create directory for output files"
msgstr "no se puede crear el directorio para los ficheros de salida"
-#: locale/programs/localedef.c:243
+#: locale/programs/localedef.c:239
#, c-format
msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'"
msgstr "Error fatal: el sistema no define `_POSIX2_LOCALEDEF'"
-#: locale/programs/localedef.c:257 locale/programs/localedef.c:273
-#: locale/programs/localedef.c:599 locale/programs/localedef.c:619
+#: locale/programs/localedef.c:253 locale/programs/localedef.c:269
+#: locale/programs/localedef.c:601 locale/programs/localedef.c:621
#, c-format
msgid "cannot open locale definition file `%s'"
msgstr "no se puede abrir el fichero de definición de locales `%s'"
# OJO: %s podría ser un directorio.
-#: locale/programs/localedef.c:285
+#: locale/programs/localedef.c:281
#, c-format
msgid "cannot write output files to `%s'"
msgstr "no se puede escribir en el fichero de salida `%s'"
# ¿repertorios?
-#: locale/programs/localedef.c:366
+#: locale/programs/localedef.c:367
#, c-format
msgid ""
"System's directory for character maps : %s\n"
@@ -2767,208 +2865,209 @@ msgstr ""
"\t\t ruta de búsqueda de locales : %s\n"
"%s"
-#: locale/programs/localedef.c:567
+#: locale/programs/localedef.c:569
#, c-format
msgid "circular dependencies between locale definitions"
msgstr "dependencias circulares entre definiciones de locales"
-#: locale/programs/localedef.c:573
+#: locale/programs/localedef.c:575
#, c-format
msgid "cannot add already read locale `%s' a second time"
msgstr "no se puede añadir el local ya leído `%s' por segunda vez"
-#: locale/programs/locarchive.c:92 locale/programs/locarchive.c:338
+#: locale/programs/locarchive.c:113 locale/programs/locarchive.c:347
+#: nss/makedb.c:290
#, c-format
msgid "cannot create temporary file"
msgstr "no se puede crear un fichero temporal"
-#: locale/programs/locarchive.c:122 locale/programs/locarchive.c:384
+#: locale/programs/locarchive.c:143 locale/programs/locarchive.c:393
#, c-format
msgid "cannot initialize archive file"
msgstr "no se puede inicializar el archivo"
-#: locale/programs/locarchive.c:129 locale/programs/locarchive.c:391
+#: locale/programs/locarchive.c:150 locale/programs/locarchive.c:400
#, c-format
msgid "cannot resize archive file"
msgstr "no se puede cambiar el tamaño del archivo"
-#: locale/programs/locarchive.c:152 locale/programs/locarchive.c:414
-#: locale/programs/locarchive.c:633
+#: locale/programs/locarchive.c:163 locale/programs/locarchive.c:413
+#: locale/programs/locarchive.c:619
#, c-format
msgid "cannot map archive header"
msgstr "no se puede leer la cabecera del archivo"
-#: locale/programs/locarchive.c:174
+#: locale/programs/locarchive.c:185
#, c-format
msgid "failed to create new locale archive"
msgstr "fallo al crear un nuevo archivo de locales"
-#: locale/programs/locarchive.c:186
+#: locale/programs/locarchive.c:197
#, c-format
msgid "cannot change mode of new locale archive"
msgstr "no se puede cambiar el modo del nuevo archivo de locales"
-#: locale/programs/locarchive.c:285
+#: locale/programs/locarchive.c:296
#, c-format
msgid "cannot read data from locale archive"
msgstr "no se pueden leer datos del archivo de locales"
-#: locale/programs/locarchive.c:318
+#: locale/programs/locarchive.c:327
#, c-format
msgid "cannot map locale archive file"
msgstr "no se puede leer el fichero de locales"
-#: locale/programs/locarchive.c:422
+#: locale/programs/locarchive.c:421
#, c-format
msgid "cannot lock new archive"
msgstr "no se puede bloquear el archivo nuevo"
-#: locale/programs/locarchive.c:488
+#: locale/programs/locarchive.c:485
#, c-format
msgid "cannot extend locale archive file"
msgstr "no se puede extender el archivo de locales"
-#: locale/programs/locarchive.c:497
+#: locale/programs/locarchive.c:494
#, c-format
msgid "cannot change mode of resized locale archive"
msgstr "no se puede cambiar el modo de un archivo de locales redimensionado"
-#: locale/programs/locarchive.c:505
+#: locale/programs/locarchive.c:502
#, c-format
msgid "cannot rename new archive"
msgstr "no se puede renombrar el nuevo archivo"
-#: locale/programs/locarchive.c:558
+#: locale/programs/locarchive.c:555
#, c-format
msgid "cannot open locale archive \"%s\""
msgstr "no se puede abrir el archivo de locales \"%s\""
-#: locale/programs/locarchive.c:563
+#: locale/programs/locarchive.c:560
#, c-format
msgid "cannot stat locale archive \"%s\""
msgstr "no se puede efectuar `stat' sobre el archivo de locales \"%s\""
-#: locale/programs/locarchive.c:582
+#: locale/programs/locarchive.c:579
#, c-format
msgid "cannot lock locale archive \"%s\""
msgstr "no se puede bloquear el archivo de locales \"%s\""
-#: locale/programs/locarchive.c:605
+#: locale/programs/locarchive.c:602
#, c-format
msgid "cannot read archive header"
msgstr "no se puede leer la cabecera del archivo"
-#: locale/programs/locarchive.c:680
+#: locale/programs/locarchive.c:666
#, c-format
msgid "locale '%s' already exists"
msgstr "el local `%s' ya existe"
-#: locale/programs/locarchive.c:942 locale/programs/locarchive.c:957
-#: locale/programs/locarchive.c:969 locale/programs/locarchive.c:981
-#: locale/programs/locfile.c:344
+#: locale/programs/locarchive.c:928 locale/programs/locarchive.c:943
+#: locale/programs/locarchive.c:955 locale/programs/locarchive.c:967
+#: locale/programs/locfile.c:343
#, c-format
msgid "cannot add to locale archive"
msgstr "no se puede añadir al archivo de locales"
-#: locale/programs/locarchive.c:1139
+#: locale/programs/locarchive.c:1125
#, c-format
msgid "locale alias file `%s' not found"
msgstr "no se encontró el fichero de alias de locales `%s'"
-#: locale/programs/locarchive.c:1289
+#: locale/programs/locarchive.c:1275
#, c-format
msgid "Adding %s\n"
msgstr "Añadiendo %s\n"
-#: locale/programs/locarchive.c:1295
+#: locale/programs/locarchive.c:1281
#, c-format
msgid "stat of \"%s\" failed: %s: ignored"
msgstr "falló la llamada a `stat' sobre \"%s\": %s: descartado"
-#: locale/programs/locarchive.c:1301
+#: locale/programs/locarchive.c:1287
#, c-format
msgid "\"%s\" is no directory; ignored"
msgstr "\"%s\" no es un directorio; descartado"
-#: locale/programs/locarchive.c:1308
+#: locale/programs/locarchive.c:1294
#, c-format
msgid "cannot open directory \"%s\": %s: ignored"
msgstr "no se puede abrir el directorio \"%s\": %s: descartado"
-#: locale/programs/locarchive.c:1380
+#: locale/programs/locarchive.c:1366
#, c-format
msgid "incomplete set of locale files in \"%s\""
msgstr "conjunto incompleto de ficheros de locales en \"%s\""
-#: locale/programs/locarchive.c:1444
+#: locale/programs/locarchive.c:1430
#, c-format
msgid "cannot read all files in \"%s\": ignored"
msgstr "no se pueden leer todos los ficheros de \"%s\": descartado"
-#: locale/programs/locarchive.c:1514
+#: locale/programs/locarchive.c:1500
#, c-format
msgid "locale \"%s\" not in archive"
msgstr "el local \"%s\" no está en el archivo"
-#: locale/programs/locfile.c:132
+#: locale/programs/locfile.c:131
#, c-format
msgid "argument to `%s' must be a single character"
msgstr "el argumento para `%s' debe ser un único carácter"
-#: locale/programs/locfile.c:252
+#: locale/programs/locfile.c:251
msgid "syntax error: not inside a locale definition section"
msgstr "error de sintaxis: no está dentro de una sección de definición para un local"
-#: locale/programs/locfile.c:626
+#: locale/programs/locfile.c:625
#, c-format
msgid "cannot open output file `%s' for category `%s'"
msgstr "no se puede abrir el fichero de salida `%s' para la categoría `%s'"
-#: locale/programs/locfile.c:650
+#: locale/programs/locfile.c:649
#, c-format
msgid "failure while writing data for category `%s'"
msgstr "error al escribir los datos para la categoría `%s'"
-#: locale/programs/locfile.c:746
+#: locale/programs/locfile.c:745
#, c-format
msgid "cannot create output file `%s' for category `%s'"
msgstr "no se puede crear el fichero de salida `%s' para la categoría `%s'"
-#: locale/programs/locfile.c:782
+#: locale/programs/locfile.c:781
msgid "expecting string argument for `copy'"
msgstr "se esperaba un argumento de cadena de caracteres para `copy'"
-#: locale/programs/locfile.c:786
+#: locale/programs/locfile.c:785
msgid "locale name should consist only of portable characters"
msgstr "el nombre del local debe estar formado por caracteres portables únicamente"
-#: locale/programs/locfile.c:805
+#: locale/programs/locfile.c:804
msgid "no other keyword shall be specified when `copy' is used"
msgstr "cuando se utiliza `copy' no debe especificarse ninguna otra palabra clave"
-#: locale/programs/locfile.c:819
+#: locale/programs/locfile.c:818
#, c-format
msgid "`%1$s' definition does not end with `END %1$s'"
msgstr "La definición `%1$s' no termina con `END %1$s'"
-#: locale/programs/repertoire.c:229 locale/programs/repertoire.c:270
-#: locale/programs/repertoire.c:295
+#: locale/programs/repertoire.c:228 locale/programs/repertoire.c:269
+#: locale/programs/repertoire.c:294
#, c-format
msgid "syntax error in repertoire map definition: %s"
msgstr "error de sintaxis en la definición de la asignación: %s"
-#: locale/programs/repertoire.c:271
+#: locale/programs/repertoire.c:270
msgid "no <Uxxxx> or <Uxxxxxxxx> value given"
msgstr "no se ha dado ningún valor <Uxxxx> o <Uxxxxxxxx>"
# No sé qué es eso del "repertoire map", pero creo que el repertoire
# es una simple aclaración. sv
-#: locale/programs/repertoire.c:331
+#: locale/programs/repertoire.c:330
#, c-format
msgid "cannot save new repertoire map"
msgstr "no se puede guardar el nuevo repertorio"
-#: locale/programs/repertoire.c:342
+#: locale/programs/repertoire.c:341
#, c-format
msgid "repertoire map file `%s' not found"
msgstr "el fichero de tabla de caracteres `%s' no se encontró"
@@ -2978,7 +3077,7 @@ msgstr "el fichero de tabla de caracteres `%s' no se encontró"
msgid "Set the owner, group and access permission of the slave pseudo terminal corresponding to the master pseudo terminal passed on file descriptor `%d'. This is the helper program for the `grantpt' function. It is not intended to be run directly from the command line.\n"
msgstr "Establece el propietario, grupo y permisos de acceso del pseudoterminal esclavo correspondiente al pseudoterminal maestro que se le pasa en el descriptor de fichero `%d'. Este es el programa de apoyo para la función `grantpt'. No está pensada para ejecutarse directamente desde la línea de órdenes.\n"
-#: login/programs/pt_chown.c:88
+#: login/programs/pt_chown.c:92
#, c-format
msgid ""
"The owner is set to the current user, the group is set to `%s', and the access permission is set to `%o'.\n"
@@ -2989,42 +3088,42 @@ msgstr ""
"\n"
"%s"
-#: login/programs/pt_chown.c:192
+#: login/programs/pt_chown.c:198
#, c-format
msgid "too many arguments"
msgstr "demasiados argumentos"
-#: login/programs/pt_chown.c:200
+#: login/programs/pt_chown.c:206
#, c-format
msgid "needs to be installed setuid `root'"
msgstr "necesita ser instalado setuid `root'"
-#: malloc/mcheck.c:350
+#: malloc/mcheck.c:348
msgid "memory is consistent, library is buggy\n"
-msgstr "la memoria es consistente, la biblioteca tiene un bicho\n"
+msgstr "la memoria es consistente, la biblioteca tiene un error\n"
-#: malloc/mcheck.c:353
+#: malloc/mcheck.c:351
msgid "memory clobbered before allocated block\n"
msgstr "memoria alterada antes del bloque de memoria asignado\n"
-#: malloc/mcheck.c:356
+#: malloc/mcheck.c:354
msgid "memory clobbered past end of allocated block\n"
msgstr "memoria alterada pasado el final del bloque de memoria asignado\n"
-#: malloc/mcheck.c:359
+#: malloc/mcheck.c:357
msgid "block freed twice\n"
msgstr "bloque liberado dos veces\n"
# Revisar lo de bogus. creo que es eso.
-#: malloc/mcheck.c:362
+#: malloc/mcheck.c:360
msgid "bogus mcheck_status, library is buggy\n"
-msgstr "valor de mcheck_status incorrecto, la biblioteca tiene un bicho\n"
+msgstr "valor de mcheck_status incorrecto, la biblioteca tiene un error\n"
-#: malloc/memusage.sh:33
+#: malloc/memusage.sh:32
msgid "%s: option '%s' requires an argument\\n"
msgstr "%s: la opción '%s' requiere un argumento\\n"
-#: malloc/memusage.sh:39
+#: malloc/memusage.sh:38
msgid ""
"Usage: memusage [OPTION]... PROGRAM [PROGRAMOPTION]...\n"
"Profile memory usage of PROGRAM.\n"
@@ -3077,7 +3176,7 @@ msgstr ""
"Los argumentos obligatorios para las opciones largas son también obligatorios\n"
"para las opciones cortas correspondientes.\n"
-#: malloc/memusage.sh:101
+#: malloc/memusage.sh:99
msgid ""
"Syntax: memusage [--data=FILE] [--progname=NAME] [--png=FILE] [--unbuffered]\n"
"\t [--buffer=SIZE] [--no-timer] [--time-based] [--total]\n"
@@ -3089,58 +3188,58 @@ msgstr ""
"\t [--title=CADENA] [--x-size=TAMAÑO] [--y-size=TAMAÑO]\n"
"\t PROGRAMA [OPCIÓNDEPROGRAMA]..."
-#: malloc/memusage.sh:193
+#: malloc/memusage.sh:191
msgid "memusage: option \\`${1##*=}' is ambiguous"
msgstr "memusage: la opción \\`${1##*=}' es ambigua"
-#: malloc/memusage.sh:202
+#: malloc/memusage.sh:200
msgid "memusage: unrecognized option \\`$1'"
msgstr "memusage: opción no reconocida \\`$1'"
-#: malloc/memusage.sh:215
+#: malloc/memusage.sh:213
msgid "No program name given"
msgstr "No se ha dado ningún nombre de programa"
# Supondremos que se trata de un imperativo. sv
-#: malloc/memusagestat.c:57
+#: malloc/memusagestat.c:55
msgid "Name output file"
msgstr "Nombre el fichero de salida"
-#: malloc/memusagestat.c:58
+#: malloc/memusagestat.c:56
msgid "Title string used in output graphic"
msgstr "Se ha utilizado una cadena de título en la gráfica de salida"
-#: malloc/memusagestat.c:59
+#: malloc/memusagestat.c:57
msgid "Generate output linear to time (default is linear to number of function calls)"
msgstr ""
"Genera un resultado lineal en el tiempo (por omisión es lineal en el número\n"
"de llamadas a función)"
-#: malloc/memusagestat.c:61
+#: malloc/memusagestat.c:59
msgid "Also draw graph for total memory consumption"
msgstr "Dibuja también una gráfica del total de memoria consumida"
-#: malloc/memusagestat.c:62
+#: malloc/memusagestat.c:60
msgid "Make output graphic VALUE pixels wide"
msgstr "Hace que la salida gráfica tenga VALOR pixels de ancho"
-#: malloc/memusagestat.c:63
+#: malloc/memusagestat.c:61
msgid "Make output graphic VALUE pixels high"
msgstr "Hace que la salida gráfica tenga VALOR pixels de alto"
-#: malloc/memusagestat.c:68
+#: malloc/memusagestat.c:66
msgid "Generate graphic from memory profiling data"
msgstr "Genera un gráfico a partir de los datos de `profiling' de memoria"
-#: malloc/memusagestat.c:71
+#: malloc/memusagestat.c:69
msgid "DATAFILE [OUTFILE]"
msgstr "FICHERODEDATOS [FICHERODESALIDA]"
-#: misc/error.c:118
+#: misc/error.c:117
msgid "Unknown system error"
msgstr "Error del sistema desconocido"
-#: nis/nis_callback.c:189
+#: nis/nis_callback.c:188
msgid "unable to free arguments"
msgstr "no se pueden liberar los argumentos"
@@ -3148,7 +3247,7 @@ msgstr "no se pueden liberar los argumentos"
# me gustaría que hubiera otra palabra mejor. SV
# Siempre me han gustado F&C ;-)
# A mí también :-) sv
-#: nis/nis_error.h:1 nis/ypclnt.c:833 nis/ypclnt.c:921 posix/regcomp.c:132
+#: nis/nis_error.h:1 nis/ypclnt.c:832 nis/ypclnt.c:920 posix/regcomp.c:131
#: sysdeps/gnu/errlist.c:20
msgid "Success"
msgstr "Conseguido"
@@ -3190,7 +3289,7 @@ msgid "First/next chain broken"
msgstr "Cadena primero/siguiente rota"
#. TRANS Permission denied; the file permissions do not allow the attempted operation.
-#: nis/nis_error.h:11 nis/ypclnt.c:878 sysdeps/gnu/errlist.c:157
+#: nis/nis_error.h:11 nis/ypclnt.c:877 sysdeps/gnu/errlist.c:157
msgid "Permission denied"
msgstr "Permiso denegado"
@@ -3346,130 +3445,130 @@ msgstr "No se puede crear el proceso en el servidor"
msgid "Master server busy, full dump rescheduled."
msgstr "El servidor maestro está ocupado, el volcado completo se postpone."
-#: nis/nis_local_names.c:122
+#: nis/nis_local_names.c:121
#, c-format
msgid "LOCAL entry for UID %d in directory %s not unique\n"
msgstr "La entrada LOCAL para el UID %d en el directorio %s no es única\n"
-#: nis/nis_print.c:51
+#: nis/nis_print.c:50
msgid "UNKNOWN"
msgstr "DESCONOCIDO"
-#: nis/nis_print.c:109
+#: nis/nis_print.c:108
msgid "BOGUS OBJECT\n"
msgstr "OBJETO INVÁLIDO\n"
-#: nis/nis_print.c:112
+#: nis/nis_print.c:111
msgid "NO OBJECT\n"
msgstr "NO HAY NINGÚN OBJETO\n"
-#: nis/nis_print.c:115
+#: nis/nis_print.c:114
msgid "DIRECTORY\n"
msgstr "DIRECTORIO\n"
-#: nis/nis_print.c:118
+#: nis/nis_print.c:117
msgid "GROUP\n"
msgstr "GRUPO\n"
-#: nis/nis_print.c:121
+#: nis/nis_print.c:120
msgid "TABLE\n"
msgstr "TABLA\n"
-#: nis/nis_print.c:124
+#: nis/nis_print.c:123
msgid "ENTRY\n"
msgstr "ENTRADA\n"
-#: nis/nis_print.c:127
+#: nis/nis_print.c:126
msgid "LINK\n"
msgstr "ENLACE\n"
-#: nis/nis_print.c:130
+#: nis/nis_print.c:129
msgid "PRIVATE\n"
msgstr "PRIVADO\n"
-#: nis/nis_print.c:133
+#: nis/nis_print.c:132
msgid "(Unknown object)\n"
msgstr "(Objeto desconocido)\n"
-#: nis/nis_print.c:167
+#: nis/nis_print.c:166
#, c-format
msgid "Name : `%s'\n"
msgstr "Nombre : `%s'\n"
-#: nis/nis_print.c:168
+#: nis/nis_print.c:167
#, c-format
msgid "Type : %s\n"
msgstr "Tipo : %s\n"
-#: nis/nis_print.c:173
+#: nis/nis_print.c:172
msgid "Master Server :\n"
msgstr "Servidor Maestro :\n"
# ¿Replicate?
-#: nis/nis_print.c:175
+#: nis/nis_print.c:174
msgid "Replicate :\n"
msgstr "Replicado :\n"
-#: nis/nis_print.c:176
+#: nis/nis_print.c:175
#, c-format
msgid "\tName : %s\n"
msgstr "\tNombre : %s\n"
-#: nis/nis_print.c:177
+#: nis/nis_print.c:176
msgid "\tPublic Key : "
msgstr "\tClave Pública : "
-#: nis/nis_print.c:181
+#: nis/nis_print.c:180
msgid "None.\n"
msgstr "Ninguno.\n"
-#: nis/nis_print.c:184
+#: nis/nis_print.c:183
#, c-format
msgid "Diffie-Hellmann (%d bits)\n"
msgstr "Diffie-Hellmann (%d bits)\n"
-#: nis/nis_print.c:189
+#: nis/nis_print.c:188
#, c-format
msgid "RSA (%d bits)\n"
msgstr "RSA (%d bits)\n"
# Véase "Investigación y Ciencia" sv
-#: nis/nis_print.c:192
+#: nis/nis_print.c:191
msgid "Kerberos.\n"
msgstr "Cerbero.\n"
-#: nis/nis_print.c:195
+#: nis/nis_print.c:194
#, c-format
msgid "Unknown (type = %d, bits = %d)\n"
msgstr "Desconocido (tipo = %d, bits = %d)\n"
-#: nis/nis_print.c:206
+#: nis/nis_print.c:205
#, c-format
msgid "\tUniversal addresses (%u)\n"
msgstr "\tDirección universal (%u)\n"
-#: nis/nis_print.c:228
+#: nis/nis_print.c:227
msgid "Time to live : "
msgstr "Tiempo de vida : "
-#: nis/nis_print.c:230
+#: nis/nis_print.c:229
msgid "Default Access rights :\n"
msgstr "Derechos de acceso predeterminados :\n"
-#: nis/nis_print.c:239
+#: nis/nis_print.c:238
#, c-format
msgid "\tType : %s\n"
msgstr "\tTipo : %s\n"
-#: nis/nis_print.c:240
+#: nis/nis_print.c:239
msgid "\tAccess rights: "
msgstr "\tDerechos de acceso: "
-#: nis/nis_print.c:254
+#: nis/nis_print.c:253
msgid "Group Flags :"
msgstr "Opciones de Grupo :"
-#: nis/nis_print.c:257
+#: nis/nis_print.c:256
msgid ""
"\n"
"Group Members :\n"
@@ -3477,95 +3576,95 @@ msgstr ""
"\n"
"Miembros del Grupo :\n"
-#: nis/nis_print.c:269
+#: nis/nis_print.c:268
#, c-format
msgid "Table Type : %s\n"
msgstr "Tipo de Tabla : %s\n"
-#: nis/nis_print.c:270
+#: nis/nis_print.c:269
#, c-format
msgid "Number of Columns : %d\n"
msgstr "Número de Columnas : %d\n"
-#: nis/nis_print.c:271
+#: nis/nis_print.c:270
#, c-format
msgid "Character Separator : %c\n"
msgstr "Separador de Caracteres : %c\n"
-#: nis/nis_print.c:272
+#: nis/nis_print.c:271
#, c-format
msgid "Search Path : %s\n"
msgstr "Ruta de búsqueda : %s\n"
-#: nis/nis_print.c:273
+#: nis/nis_print.c:272
msgid "Columns :\n"
msgstr "Columnas :\n"
-#: nis/nis_print.c:276
+#: nis/nis_print.c:275
#, c-format
msgid "\t[%d]\tName : %s\n"
msgstr "\t[%d]\tNombre : %s\n"
-#: nis/nis_print.c:278
+#: nis/nis_print.c:277
msgid "\t\tAttributes : "
msgstr "\t\tAtributos : "
-#: nis/nis_print.c:280
+#: nis/nis_print.c:279
msgid "\t\tAccess Rights : "
msgstr "\t\tDerechos de Acceso : "
-#: nis/nis_print.c:290
+#: nis/nis_print.c:289
msgid "Linked Object Type : "
msgstr "Tipo de objeto enlazado : "
-#: nis/nis_print.c:292
+#: nis/nis_print.c:291
#, c-format
msgid "Linked to : %s\n"
msgstr "Enlazado a : %s\n"
-#: nis/nis_print.c:302
+#: nis/nis_print.c:301
#, c-format
msgid "\tEntry data of type %s\n"
msgstr "\tEntrada de tipo %s\n"
-#: nis/nis_print.c:305
+#: nis/nis_print.c:304
#, c-format
msgid "\t[%u] - [%u bytes] "
msgstr "\t[%u] - [%u bytes] "
-#: nis/nis_print.c:308
+#: nis/nis_print.c:307
msgid "Encrypted data\n"
msgstr "Datos cifrados\n"
-#: nis/nis_print.c:310
+#: nis/nis_print.c:309
msgid "Binary data\n"
msgstr "Datos binarios\n"
-#: nis/nis_print.c:326
+#: nis/nis_print.c:325
#, c-format
msgid "Object Name : %s\n"
msgstr "Nombre del Objeto : %s\n"
-#: nis/nis_print.c:327
+#: nis/nis_print.c:326
#, c-format
msgid "Directory : %s\n"
msgstr "Directorio : %s\n"
-#: nis/nis_print.c:328
+#: nis/nis_print.c:327
#, c-format
msgid "Owner : %s\n"
msgstr "Propietario : %s\n"
-#: nis/nis_print.c:329
+#: nis/nis_print.c:328
#, c-format
msgid "Group : %s\n"
msgstr "Grupo : %s\n"
-#: nis/nis_print.c:330
+#: nis/nis_print.c:329
msgid "Access Rights : "
msgstr "Derechos de acceso : "
-#: nis/nis_print.c:332
+#: nis/nis_print.c:331
#, c-format
msgid ""
"\n"
@@ -3574,37 +3673,37 @@ msgstr ""
"\n"
"Tiempo de Vida : "
-#: nis/nis_print.c:335
+#: nis/nis_print.c:334
#, c-format
msgid "Creation Time : %s"
msgstr "Fecha de creación : %s"
-#: nis/nis_print.c:337
+#: nis/nis_print.c:336
#, c-format
msgid "Mod. Time : %s"
msgstr "Fecha de modificación: %s"
-#: nis/nis_print.c:338
+#: nis/nis_print.c:337
msgid "Object Type : "
msgstr "Tipo del Objeto : "
-#: nis/nis_print.c:358
+#: nis/nis_print.c:357
#, c-format
msgid " Data Length = %u\n"
msgstr " Longitud de los datos = %u\n"
-#: nis/nis_print.c:372
+#: nis/nis_print.c:371
#, c-format
msgid "Status : %s\n"
msgstr "Estado : %s\n"
-#: nis/nis_print.c:373
+#: nis/nis_print.c:372
#, c-format
msgid "Number of objects : %u\n"
msgstr "Número de objetos : %u\n"
# Tal vez habría que poner núm en vez de #. sv
-#: nis/nis_print.c:377
+#: nis/nis_print.c:376
#, c-format
msgid "Object #%d:\n"
msgstr "Objeto #%d:\n"
@@ -3662,107 +3761,107 @@ msgstr " No miembros recursivos:\n"
msgid " No recursive nonmembers\n"
msgstr " No hay ningún no miembro recursivo\n"
-#: nis/nss_nisplus/nisplus-publickey.c:101
-#: nis/nss_nisplus/nisplus-publickey.c:183
+#: nis/nss_nisplus/nisplus-publickey.c:100
+#: nis/nss_nisplus/nisplus-publickey.c:182
#, c-format
msgid "DES entry for netname %s not unique\n"
msgstr "La entrada DES para el nombre %s no es única\n"
-#: nis/nss_nisplus/nisplus-publickey.c:220
+#: nis/nss_nisplus/nisplus-publickey.c:219
#, c-format
msgid "netname2user: missing group id list in `%s'"
msgstr "netname2user: falta la lista de ids de grupo en `%s'"
-#: nis/nss_nisplus/nisplus-publickey.c:302
-#: nis/nss_nisplus/nisplus-publickey.c:308
-#: nis/nss_nisplus/nisplus-publickey.c:373
-#: nis/nss_nisplus/nisplus-publickey.c:382
+#: nis/nss_nisplus/nisplus-publickey.c:301
+#: nis/nss_nisplus/nisplus-publickey.c:307
+#: nis/nss_nisplus/nisplus-publickey.c:372
+#: nis/nss_nisplus/nisplus-publickey.c:381
#, c-format
msgid "netname2user: (nis+ lookup): %s\n"
msgstr "netname2user: (búsqueda nis+): %s\n"
-#: nis/nss_nisplus/nisplus-publickey.c:321
+#: nis/nss_nisplus/nisplus-publickey.c:320
#, c-format
msgid "netname2user: DES entry for %s in directory %s not unique"
msgstr "netname2user: la entrada DES para %s en el directorio %s no es única"
-#: nis/nss_nisplus/nisplus-publickey.c:339
+#: nis/nss_nisplus/nisplus-publickey.c:338
#, c-format
msgid "netname2user: principal name `%s' too long"
msgstr "netname2user: el nombre principal `%s' es demasiado largo"
-#: nis/nss_nisplus/nisplus-publickey.c:395
+#: nis/nss_nisplus/nisplus-publickey.c:394
#, c-format
msgid "netname2user: LOCAL entry for %s in directory %s not unique"
msgstr "netname2user: la entrada LOCAL para %s en el directorio %s no es única"
-#: nis/nss_nisplus/nisplus-publickey.c:402
+#: nis/nss_nisplus/nisplus-publickey.c:401
msgid "netname2user: should not have uid 0"
msgstr "netname2user: no debería tener uid 0"
-#: nis/ypclnt.c:836
+#: nis/ypclnt.c:835
msgid "Request arguments bad"
msgstr "Los argumentos de la petición son incorrectos"
-#: nis/ypclnt.c:839
+#: nis/ypclnt.c:838
msgid "RPC failure on NIS operation"
msgstr "Fallo RPC en una operación NIS"
-#: nis/ypclnt.c:842
+#: nis/ypclnt.c:841
msgid "Can't bind to server which serves this domain"
msgstr "Ha fallado la llamada a bind() con el servidor que sirve a este dominio"
-#: nis/ypclnt.c:845
+#: nis/ypclnt.c:844
msgid "No such map in server's domain"
msgstr "No existe esa tabla en el dominio del servidor"
-#: nis/ypclnt.c:848
+#: nis/ypclnt.c:847
msgid "No such key in map"
msgstr "No existe esta clave en la tabla"
-#: nis/ypclnt.c:851
+#: nis/ypclnt.c:850
msgid "Internal NIS error"
msgstr "Error interno de NIS"
-#: nis/ypclnt.c:854
+#: nis/ypclnt.c:853
msgid "Local resource allocation failure"
msgstr "La asignación de recursos locales ha fallado"
-#: nis/ypclnt.c:857
+#: nis/ypclnt.c:856
msgid "No more records in map database"
msgstr "No hay más registros en la base de datos"
-#: nis/ypclnt.c:860
+#: nis/ypclnt.c:859
msgid "Can't communicate with portmapper"
msgstr "No se puede comunicar con el asignador de puertos"
-#: nis/ypclnt.c:863
+#: nis/ypclnt.c:862
msgid "Can't communicate with ypbind"
msgstr "No se puede establecer comunicación con `ypbind'"
-#: nis/ypclnt.c:866
+#: nis/ypclnt.c:865
msgid "Can't communicate with ypserv"
msgstr "No se puede establecer comunicación con `ypserv'"
-#: nis/ypclnt.c:869
+#: nis/ypclnt.c:868
msgid "Local domain name not set"
msgstr "No se ha establecido el nombre del dominio local"
-#: nis/ypclnt.c:872
+#: nis/ypclnt.c:871
msgid "NIS map database is bad"
msgstr "La base de datos de la tabla NIS no es correcta"
-#: nis/ypclnt.c:875
+#: nis/ypclnt.c:874
msgid "NIS client/server version mismatch - can't supply service"
msgstr ""
"Discordancia en las versiones de NIS del cliente y el servidor.\n"
"No se puede suministrar el servicio."
-#: nis/ypclnt.c:881
+#: nis/ypclnt.c:880
msgid "Database is busy"
msgstr "La base de datos está ocupada"
-#: nis/ypclnt.c:884
+#: nis/ypclnt.c:883
msgid "Unknown NIS error code"
msgstr "Error de NIS desconocido"
@@ -3773,411 +3872,440 @@ msgstr "Error de NIS desconocido"
# De acuerdo.
# [ Antes decía ... la llamada a bind para el servicio de páginas amarillas ]
# Un poco demasiado explicativo. sv
-#: nis/ypclnt.c:924
+#: nis/ypclnt.c:923
msgid "Internal ypbind error"
msgstr "Error interno en ypbind"
# FUZZY
-#: nis/ypclnt.c:927
+#: nis/ypclnt.c:926
msgid "Domain not bound"
msgstr "No se pudo conectar con el dominio"
-#: nis/ypclnt.c:930
+#: nis/ypclnt.c:929
msgid "System resource allocation failure"
msgstr "Fallo en la asignación de recursos del sistema"
-#: nis/ypclnt.c:933
+#: nis/ypclnt.c:932
msgid "Unknown ypbind error"
msgstr "Error desconocido en la llamada a `ypbind()'"
-#: nis/ypclnt.c:974
+#: nis/ypclnt.c:973
msgid "yp_update: cannot convert host to netname\n"
msgstr "yp_update: no se puede convertir el nombre del `host' a nombre de red\n"
-#: nis/ypclnt.c:992
+#: nis/ypclnt.c:991
msgid "yp_update: cannot get server address\n"
msgstr "yp_update: no se puede encontrar la dirección del servidor\n"
-#: nscd/aicache.c:83 nscd/hstcache.c:492
+#: nscd/aicache.c:82 nscd/hstcache.c:493
#, c-format
msgid "Haven't found \"%s\" in hosts cache!"
msgstr "No se ha encontrado \"%s\" en el caché de `hosts'"
-#: nscd/aicache.c:85 nscd/hstcache.c:494
+#: nscd/aicache.c:84 nscd/hstcache.c:495
#, c-format
msgid "Reloading \"%s\" in hosts cache!"
msgstr "Recargando \"%s\" en el caché de hosts"
-#: nscd/cache.c:150
+#: nscd/cache.c:151
#, c-format
msgid "add new entry \"%s\" of type %s for %s to cache%s"
msgstr "añade nueva entrada \"%s\" de tipo %s para %s al caché%s"
-#: nscd/cache.c:152
+#: nscd/cache.c:153
msgid " (first)"
msgstr " (primero)"
-#: nscd/cache.c:276 nscd/connections.c:861
+#: nscd/cache.c:285 nscd/connections.c:1002
#, c-format
msgid "cannot stat() file `%s': %s"
msgstr "no se puede ejecutar stat() sobre el fichero `%s': %s"
-#: nscd/cache.c:318
+#: nscd/cache.c:331
#, c-format
msgid "pruning %s cache; time %ld"
msgstr "limpiando %s caché; tiempo %ld"
-#: nscd/cache.c:347
+#: nscd/cache.c:360
#, c-format
msgid "considering %s entry \"%s\", timeout %<PRIu64>"
msgstr "considerando la entrada %s \"%s\", tiempo límite %<PRIu64>"
-#: nscd/connections.c:565
+#: nscd/connections.c:570
#, c-format
msgid "invalid persistent database file \"%s\": %s"
msgstr "fichero de base de datos persistente inválido \"%s\": %s"
-#: nscd/connections.c:573
+#: nscd/connections.c:578
msgid "uninitialized header"
msgstr "cabecera no inicializada"
-#: nscd/connections.c:578
+#: nscd/connections.c:583
msgid "header size does not match"
msgstr "el tamaño de la cabecera no coincide"
-#: nscd/connections.c:588
+#: nscd/connections.c:593
msgid "file size does not match"
msgstr "el tamaño del fichero no coincide"
-#: nscd/connections.c:605
+#: nscd/connections.c:610
msgid "verification failed"
msgstr "falló la verificación"
-#: nscd/connections.c:619
+#: nscd/connections.c:624
#, c-format
msgid "suggested size of table for database %s larger than the persistent database's table"
msgstr "el tamaño sugerido de tabla para la base de datos %s es más grande que la tabla de la base de datos persistente"
-#: nscd/connections.c:630 nscd/connections.c:715
+#: nscd/connections.c:635 nscd/connections.c:720
#, c-format
msgid "cannot create read-only descriptor for \"%s\"; no mmap"
msgstr "no se puede crear descriptor de sólo lectura para \"%s\"; no hay mmap"
-#: nscd/connections.c:646
+#: nscd/connections.c:651
#, c-format
msgid "cannot access '%s'"
msgstr "no se puede acceder a '%s'"
-#: nscd/connections.c:694
+#: nscd/connections.c:699
#, c-format
msgid "database for %s corrupted or simultaneously used; remove %s manually if necessary and restart"
msgstr "la base de datos %s está corrupta o se está usando simultáneamente; borre %s manualmente si fuera necesario y reinicie"
-#: nscd/connections.c:701
+#: nscd/connections.c:706
#, c-format
msgid "cannot create %s; no persistent database used"
msgstr "no se puede crear %s; no se ha utilizado una base de datos persistente"
-#: nscd/connections.c:704
+#: nscd/connections.c:709
#, c-format
msgid "cannot create %s; no sharing possible"
msgstr "no se puede crear %s; no es posible la compartición"
-#: nscd/connections.c:775
+#: nscd/connections.c:780
#, c-format
msgid "cannot write to database file %s: %s"
msgstr "no se puede escribir al fichero de datos %s: %s"
-#: nscd/connections.c:814
+#: nscd/connections.c:819
#, c-format
msgid "cannot set socket to close on exec: %s; disabling paranoia mode"
msgstr "no se puede establecer el `socket' para cerrar en ejecutación: %s; se desactiva el modo paranoia"
-#: nscd/connections.c:897
+#: nscd/connections.c:868
#, c-format
msgid "cannot open socket: %s"
msgstr "no se puede abrir el `socket': %s"
-#: nscd/connections.c:917
+#: nscd/connections.c:888 nscd/connections.c:952
#, c-format
msgid "cannot change socket to nonblocking mode: %s"
msgstr "no se puede cambiar el `socket' a modo no bloqueante: %s"
-#: nscd/connections.c:925
+#: nscd/connections.c:896 nscd/connections.c:962
#, c-format
msgid "cannot set socket to close on exec: %s"
msgstr "no se puede establecer el `socket' para que se cierre en ejecución: %s"
-#: nscd/connections.c:938
+#: nscd/connections.c:909
#, c-format
msgid "cannot enable socket to accept connections: %s"
msgstr "no se puede activar el `socket' para aceptar conexiones: %s"
-#: nscd/connections.c:1039
+#: nscd/connections.c:986
+#, c-format
+msgid "register trace file %s for database %s"
+msgstr "registra el fichero de seguimiento %s para la base de datos %s"
+
+#: nscd/connections.c:1116
#, c-format
msgid "provide access to FD %d, for %s"
msgstr "proporciona acceso al descriptor de fichero %d, para %s"
-#: nscd/connections.c:1051
+#: nscd/connections.c:1128
#, c-format
msgid "cannot handle old request version %d; current version is %d"
msgstr ""
"no se pueden manejar peticiones de la versión %d, la versión\n"
"actual es %d"
-#: nscd/connections.c:1073
+#: nscd/connections.c:1150
#, c-format
msgid "request from %ld not handled due to missing permission"
msgstr "la petición de %ld no ha sido atendida por falta de permisos"
-#: nscd/connections.c:1078
+#: nscd/connections.c:1155
#, c-format
msgid "request from '%s' [%ld] not handled due to missing permission"
msgstr "la petición de '%s' [%ld] no ha sido atendida por falta de permisos"
-#: nscd/connections.c:1083
+#: nscd/connections.c:1160
msgid "request not handled due to missing permission"
msgstr "la petición no ha sido atendida por falta de permisos"
-#: nscd/connections.c:1121 nscd/connections.c:1174
+#: nscd/connections.c:1198 nscd/connections.c:1251
#, c-format
msgid "cannot write result: %s"
msgstr "no se puede escribir el resultado: %s"
-#: nscd/connections.c:1257
+#: nscd/connections.c:1342
#, c-format
msgid "error getting caller's id: %s"
msgstr "error al obtener el id de los llamantes: %s"
-#: nscd/connections.c:1316
+#: nscd/connections.c:1402
#, c-format
msgid "cannot open /proc/self/cmdline: %s; disabling paranoia mode"
msgstr "no se puede abrir /proc/self/cmdline: %s; se desactiva el modo paranoia"
-#: nscd/connections.c:1330
+#: nscd/connections.c:1416
#, c-format
msgid "cannot read /proc/self/cmdline: %s; disabling paranoia mode"
msgstr "no se puede leer /proc/self/cmdline: %s; se desactiva el modo paranoia"
-#: nscd/connections.c:1370
+#: nscd/connections.c:1456
#, c-format
msgid "cannot change to old UID: %s; disabling paranoia mode"
msgstr "no se puede cambiar al UID antiguo: %s; se desactiva el modo paranoia"
-#: nscd/connections.c:1380
+#: nscd/connections.c:1466
#, c-format
msgid "cannot change to old GID: %s; disabling paranoia mode"
msgstr "no se puede cambiar al GID antiguo: %s; se desactiva el modo paranoia"
-#: nscd/connections.c:1393
+#: nscd/connections.c:1479
#, c-format
msgid "cannot change to old working directory: %s; disabling paranoia mode"
msgstr "no se puede cambiar al directorio de trabajo antiguo: %s; se desactiva el modo paranoia"
-#: nscd/connections.c:1439
+#: nscd/connections.c:1525
#, c-format
msgid "re-exec failed: %s; disabling paranoia mode"
msgstr "falló la re-ejecución: %s; se desactiva el modo paranoia"
-#: nscd/connections.c:1448
+#: nscd/connections.c:1534
#, c-format
msgid "cannot change current working directory to \"/\": %s"
msgstr "no se puede cambiar el directorio de trabajo a \"/\": %s"
-#: nscd/connections.c:1641
+#: nscd/connections.c:1727
#, c-format
msgid "short read while reading request: %s"
msgstr "lectura insuficiente mientras se leía la petición: %s"
-#: nscd/connections.c:1674
+#: nscd/connections.c:1760
#, c-format
msgid "key length in request too long: %d"
msgstr "la longitud de la clave en la petición es demasiado larga: %d"
-#: nscd/connections.c:1687
+#: nscd/connections.c:1773
#, c-format
msgid "short read while reading request key: %s"
msgstr "se acabaron los datos mientras se leía la clave de petición: %s"
-#: nscd/connections.c:1696
+#: nscd/connections.c:1782
#, c-format
msgid "handle_request: request received (Version = %d) from PID %ld"
msgstr "handle_request: petición recibida (Versión = %d) del PID %ld"
-#: nscd/connections.c:1701
+#: nscd/connections.c:1787
#, c-format
msgid "handle_request: request received (Version = %d)"
msgstr "handle_request: petición recibida (Versión = %d)"
-#: nscd/connections.c:1901 nscd/connections.c:2099
+#: nscd/connections.c:1999 nscd/connections.c:2227
#, c-format
msgid "disabled inotify after read error %d"
msgstr "se desactiva `inotify' después de un error de lectura %d"
-#: nscd/connections.c:2228
+#: nscd/connections.c:2374
msgid "could not initialize conditional variable"
msgstr "no se pudo inicializar la variable condicional"
-#: nscd/connections.c:2236
+#: nscd/connections.c:2382
msgid "could not start clean-up thread; terminating"
msgstr "no se pudo iniciar el hilo de limpieza; terminando"
-#: nscd/connections.c:2250
+#: nscd/connections.c:2396
msgid "could not start any worker thread; terminating"
msgstr "no se pudo iniciar ningún hilo de trabajo; terminando"
-#: nscd/connections.c:2301 nscd/connections.c:2302 nscd/connections.c:2319
-#: nscd/connections.c:2328 nscd/connections.c:2346 nscd/connections.c:2357
-#: nscd/connections.c:2368
+#: nscd/connections.c:2447 nscd/connections.c:2448 nscd/connections.c:2465
+#: nscd/connections.c:2474 nscd/connections.c:2492 nscd/connections.c:2503
+#: nscd/connections.c:2514
#, c-format
msgid "Failed to run nscd as user '%s'"
msgstr "Fallo al ejecutar nscd como usuario `%s'"
-#: nscd/connections.c:2320
+#: nscd/connections.c:2466
#, c-format
msgid "initial getgrouplist failed"
msgstr "falló el `getgrouplist' inicial"
-#: nscd/connections.c:2329
+#: nscd/connections.c:2475
#, c-format
msgid "getgrouplist failed"
msgstr "falló `getgrouplist'"
-#: nscd/connections.c:2347
+#: nscd/connections.c:2493
#, c-format
msgid "setgroups failed"
msgstr "falló `setgroups'"
-#: nscd/grpcache.c:383 nscd/hstcache.c:439 nscd/initgrcache.c:406
-#: nscd/pwdcache.c:378 nscd/servicescache.c:332
+#: nscd/grpcache.c:407 nscd/hstcache.c:440 nscd/initgrcache.c:411
+#: nscd/pwdcache.c:383 nscd/servicescache.c:338
#, c-format
msgid "short write in %s: %s"
msgstr "escritura insuficiente en %s: %s"
-#: nscd/grpcache.c:428 nscd/initgrcache.c:78
+#: nscd/grpcache.c:452 nscd/initgrcache.c:77
#, c-format
msgid "Haven't found \"%s\" in group cache!"
msgstr "No se ha encontrado \"%s\" en el caché de grupos"
-#: nscd/grpcache.c:430 nscd/initgrcache.c:80
+#: nscd/grpcache.c:454 nscd/initgrcache.c:79
#, c-format
msgid "Reloading \"%s\" in group cache!"
msgstr "Recargando \"%s\" en el caché de grupos"
-#: nscd/grpcache.c:509
+#: nscd/grpcache.c:533
#, c-format
msgid "Invalid numeric gid \"%s\"!"
msgstr "¡gid numérico inválido \"%s\"!"
-#: nscd/mem.c:431
+#: nscd/mem.c:425
#, c-format
msgid "freed %zu bytes in %s cache"
msgstr "se han liberado %zu bytes en la caché %s"
-#: nscd/mem.c:574
+#: nscd/mem.c:568
#, c-format
msgid "no more memory for database '%s'"
msgstr "no hay más memoria para la base de datos '%s'"
-#: nscd/nscd.c:101
+#: nscd/netgroupcache.c:77
+#, c-format
+msgid "Haven't found \"%s\" in netgroup cache!"
+msgstr "No se ha encontrado \"%s\" en el caché de netgroup"
+
+#: nscd/netgroupcache.c:79
+#, c-format
+msgid "Reloading \"%s\" in netgroup cache!"
+msgstr "Recargando \"%s\" en el caché de netgroup"
+
+#: nscd/netgroupcache.c:467
+#, c-format
+msgid "Haven't found \"%s (%s,%s,%s)\" in netgroup cache!"
+msgstr "No se ha encontrado \"%s (%s,%s,%s)\" en el caché de netgroup"
+
+#: nscd/netgroupcache.c:470
+#, c-format
+msgid "Reloading \"%s (%s,%s,%s)\" in netgroup cache!"
+msgstr "Recargando \"%s (%s,%s,%s)\" en el caché de netgroup"
+
+#: nscd/nscd.c:116
msgid "Read configuration data from NAME"
msgstr "Lee datos de configuración de NOMBRE"
-#: nscd/nscd.c:103
+#: nscd/nscd.c:118
msgid "Do not fork and display messages on the current tty"
msgstr "No se divide y muestra los mensajes en la terminal actual"
-#: nscd/nscd.c:104
+#: nscd/nscd.c:120
+msgid "Do not fork, but otherwise behave like a daemon"
+msgstr "No hace fork, pero se comporta como un daemon"
+
+#: nscd/nscd.c:121
msgid "NUMBER"
msgstr "NÚMERO"
-#: nscd/nscd.c:104
+#: nscd/nscd.c:121
msgid "Start NUMBER threads"
msgstr "Comienza NÚMERO hilos"
-#: nscd/nscd.c:105
+#: nscd/nscd.c:122
msgid "Shut the server down"
msgstr "Apagar el servidor"
-#: nscd/nscd.c:106
+#: nscd/nscd.c:123
msgid "Print current configuration statistics"
msgstr "Muestra estadísticas sobre la configuración actual"
-#: nscd/nscd.c:107
+#: nscd/nscd.c:124
msgid "TABLE"
msgstr "TABLA"
-#: nscd/nscd.c:108
+#: nscd/nscd.c:125
msgid "Invalidate the specified cache"
msgstr "Invalida la caché especificada"
-#: nscd/nscd.c:109
+#: nscd/nscd.c:126
msgid "TABLE,yes"
msgstr "TABLA,sí"
-#: nscd/nscd.c:110
+#: nscd/nscd.c:127
msgid "Use separate cache for each user"
msgstr "Utiliza una caché separada para cada usuario"
-#: nscd/nscd.c:115
+#: nscd/nscd.c:132
msgid "Name Service Cache Daemon."
msgstr "Daemon de Caché del Servicio de Nombres."
-#: nscd/nscd.c:147 nss/getent.c:952 nss/makedb.c:123
+#: nscd/nscd.c:164 nss/getent.c:999 nss/makedb.c:208
#, c-format
msgid "wrong number of arguments"
msgstr "número incorrecto de argumentos"
-#: nscd/nscd.c:157
+#: nscd/nscd.c:174
#, c-format
msgid "failure while reading configuration file; this is fatal"
msgstr "fallo al leer el fichero de configuración; este error es fatal"
-#: nscd/nscd.c:166
+#: nscd/nscd.c:183
#, c-format
msgid "already running"
msgstr "ya está funcionando"
-#: nscd/nscd.c:181 nscd/nscd.c:236
+#: nscd/nscd.c:201 nscd/nscd.c:259
#, c-format
msgid "cannot fork"
msgstr "no se puede hacer `fork'"
-#: nscd/nscd.c:244
+#: nscd/nscd.c:268
#, c-format
msgid "cannot change current working directory to \"/\""
msgstr "no se puede cambiar el directorio de trabajo a \"/\""
-#: nscd/nscd.c:252
+#: nscd/nscd.c:276
msgid "Could not create log file"
msgstr "No se pudo crear el fichero de registro"
-#: nscd/nscd.c:305 nscd/nscd.c:330 nscd/nscd_stat.c:174
+#: nscd/nscd.c:348 nscd/nscd.c:373 nscd/nscd_stat.c:173
#, c-format
msgid "Only root is allowed to use this option!"
msgstr "Solamente root puede usar esta opción"
-#: nscd/nscd.c:345
+#: nscd/nscd.c:388
#, c-format
msgid "'%s' is not a known database"
msgstr "'%s' no es una base de datos conocida"
-#: nscd/nscd.c:370 nscd/nscd_stat.c:193
+#: nscd/nscd.c:413 nscd/nscd_stat.c:192
#, c-format
msgid "write incomplete"
msgstr "escritura incompleta"
-#: nscd/nscd.c:381
+#: nscd/nscd.c:424
#, c-format
msgid "cannot read invalidate ACK"
msgstr "no se puede leer el ACK de invalidación"
-#: nscd/nscd.c:387
+#: nscd/nscd.c:430
#, c-format
msgid "invalidation failed"
msgstr "fallo en la invalidación"
-#: nscd/nscd.c:397
+#: nscd/nscd.c:440
#, c-format
msgid "secure services not implemented anymore"
msgstr "los servicios seguros ya no están implementados"
@@ -4202,61 +4330,55 @@ msgstr "Debe especificar un nombre de usuario para la opción `server-user'"
msgid "Must specify user name for stat-user option"
msgstr "Debe especificar un nombre de usuario para la opción `stat-user'"
-# Ídem. 1984.
-#: nscd/nscd_conf.c:245
-#, c-format
-msgid "invalid value for 'reload-count': %u"
-msgstr "valor inválido para 'reload-count': %u"
-
-#: nscd/nscd_conf.c:260
+#: nscd/nscd_conf.c:258
#, c-format
msgid "Must specify value for restart-interval option"
msgstr "Debe especificar un valor para la opción `restart-interval'"
-#: nscd/nscd_conf.c:274
+#: nscd/nscd_conf.c:272
#, c-format
msgid "Unknown option: %s %s %s"
msgstr "Opción desconocida: %s %s %s"
-#: nscd/nscd_conf.c:287
+#: nscd/nscd_conf.c:285
#, c-format
msgid "cannot get current working directory: %s; disabling paranoia mode"
msgstr "no se puede obtener el directorio actual: %s; se desactiva el modo paranoia"
-#: nscd/nscd_conf.c:307
+#: nscd/nscd_conf.c:305
#, c-format
msgid "maximum file size for %s database too small"
msgstr "el tamaño máximo de fichero para la base de datos %s es demasiado pequeño"
-#: nscd/nscd_stat.c:143
+#: nscd/nscd_stat.c:142
#, c-format
msgid "cannot write statistics: %s"
msgstr "no se pueden escribir las estadísticas: %s"
-#: nscd/nscd_stat.c:158
+#: nscd/nscd_stat.c:157
msgid "yes"
msgstr "sí"
-#: nscd/nscd_stat.c:159
+#: nscd/nscd_stat.c:158
msgid "no"
msgstr "no"
-#: nscd/nscd_stat.c:170
+#: nscd/nscd_stat.c:169
#, c-format
msgid "Only root or %s is allowed to use this option!"
msgstr "Solamente root o %s puede usar esta opción"
-#: nscd/nscd_stat.c:181
+#: nscd/nscd_stat.c:180
#, c-format
msgid "nscd not running!\n"
msgstr "nscd no está en ejecución\n"
-#: nscd/nscd_stat.c:205
+#: nscd/nscd_stat.c:204
#, c-format
msgid "cannot read statistics data"
msgstr "no se pueden leer los datos de estadística"
-#: nscd/nscd_stat.c:208
+#: nscd/nscd_stat.c:207
#, c-format
msgid ""
"nscd configuration:\n"
@@ -4267,27 +4389,27 @@ msgstr ""
"\n"
"%15d nivel de depuración del servidor\n"
-#: nscd/nscd_stat.c:232
+#: nscd/nscd_stat.c:231
#, c-format
msgid "%3ud %2uh %2um %2lus server runtime\n"
msgstr "%3ud %2uh %2um %2lus tiempo de funcionamiento del servidor\n"
-#: nscd/nscd_stat.c:235
+#: nscd/nscd_stat.c:234
#, c-format
msgid " %2uh %2um %2lus server runtime\n"
msgstr " %2uh %2um %2lus tiempo de funcionamiento del servidor\n"
-#: nscd/nscd_stat.c:237
+#: nscd/nscd_stat.c:236
#, c-format
msgid " %2um %2lus server runtime\n"
msgstr " %2um %2lus tiempo de funcionamiento del servidor\n"
-#: nscd/nscd_stat.c:239
+#: nscd/nscd_stat.c:238
#, c-format
msgid " %2lus server runtime\n"
msgstr " %2lus tiempo de funcionamiento del servidor\n"
-#: nscd/nscd_stat.c:241
+#: nscd/nscd_stat.c:240
#, c-format
msgid ""
"%15d current number of threads\n"
@@ -4304,7 +4426,7 @@ msgstr ""
"%15lu reinicio interno\n"
"%15u recarga contadores\n"
-#: nscd/nscd_stat.c:276
+#: nscd/nscd_stat.c:275
#, c-format
msgid ""
"\n"
@@ -4355,99 +4477,99 @@ msgstr ""
"%15<PRIuMAX> fallos de asignación de memoria\n"
"%15s compruebe /etc/%s para cambios\n"
-#: nscd/pwdcache.c:423
+#: nscd/pwdcache.c:428
#, c-format
msgid "Haven't found \"%s\" in password cache!"
msgstr "No se ha encontrado \"%s\" en el caché de contraseñas"
-#: nscd/pwdcache.c:425
+#: nscd/pwdcache.c:430
#, c-format
msgid "Reloading \"%s\" in password cache!"
msgstr "Recargando \"%s\" en el caché de contraseñas"
-#: nscd/pwdcache.c:506
+#: nscd/pwdcache.c:511
#, c-format
msgid "Invalid numeric uid \"%s\"!"
msgstr "¡uid numérico inválido \"%s\"!"
-#: nscd/selinux.c:156
+#: nscd/selinux.c:160
#, c-format
msgid "Failed opening connection to the audit subsystem: %m"
msgstr "Fallo al abrir la conexión al subsistema de auditoría: %m"
-#: nscd/selinux.c:177
+#: nscd/selinux.c:181
msgid "Failed to set keep-capabilities"
msgstr "Fallo al establecer las capacidades que se mantienen"
-#: nscd/selinux.c:178 nscd/selinux.c:241
+#: nscd/selinux.c:182 nscd/selinux.c:245
#, c-format
msgid "prctl(KEEPCAPS) failed"
msgstr "Falló prctl(KEEPCAPS)"
-#: nscd/selinux.c:192
+#: nscd/selinux.c:196
msgid "Failed to initialize drop of capabilities"
msgstr "Fallo al inicializar el abandono de capacidades"
# ## Lo mismo con lstat. sv
# Antes decía: No se pudo obtener información (lstat) del fichero .rhosts
-#: nscd/selinux.c:193
+#: nscd/selinux.c:197
#, c-format
msgid "cap_init failed"
msgstr "cap_init ha fallado"
-#: nscd/selinux.c:214 nscd/selinux.c:231
+#: nscd/selinux.c:218 nscd/selinux.c:235
msgid "Failed to drop capabilities"
msgstr "Fallo al abandonar capacidades"
-#: nscd/selinux.c:215 nscd/selinux.c:232
+#: nscd/selinux.c:219 nscd/selinux.c:236
#, c-format
msgid "cap_set_proc failed"
msgstr "cap_set_proc ha fallado"
-#: nscd/selinux.c:240
+#: nscd/selinux.c:244
msgid "Failed to unset keep-capabilities"
msgstr "Fallo al desactivar las capacidades que se mantienen"
-#: nscd/selinux.c:256
+#: nscd/selinux.c:260
msgid "Failed to determine if kernel supports SELinux"
msgstr "Fallo al determinar si el núcleo admite SELinux"
-#: nscd/selinux.c:271
+#: nscd/selinux.c:275
#, c-format
msgid "Failed to start AVC thread"
msgstr "Fallo al iniciar hilo AVC"
-#: nscd/selinux.c:293
+#: nscd/selinux.c:297
#, c-format
msgid "Failed to create AVC lock"
msgstr "Fallo al crear bloqueo AVC"
-#: nscd/selinux.c:333
+#: nscd/selinux.c:337
#, c-format
msgid "Failed to start AVC"
msgstr "Fallo al iniciar AVC"
-#: nscd/selinux.c:335
+#: nscd/selinux.c:339
msgid "Access Vector Cache (AVC) started"
msgstr "Access Vector Cache (AVC) iniciado"
-#: nscd/selinux.c:356
+#: nscd/selinux.c:360
msgid "Error getting context of socket peer"
msgstr "Error al obtener el contexto del `socket' remoto"
-#: nscd/selinux.c:361
+#: nscd/selinux.c:365
msgid "Error getting context of nscd"
msgstr "Error al obtener el contexto de nscd"
-#: nscd/selinux.c:367
+#: nscd/selinux.c:371
msgid "Error getting sid from context"
msgstr "Error al obtener sid del contexto"
-#: nscd/selinux.c:374
+#: nscd/selinux.c:378
msgid "compile-time support for database policy missing"
msgstr "falta el soporte de tiempo de compilación para la base de datos de políticas"
-#: nscd/selinux.c:407
+#: nscd/selinux.c:411
#, c-format
msgid ""
"\n"
@@ -4474,68 +4596,76 @@ msgstr ""
"%15u consultas de CAV\n"
"%15u fallos de CAV\n"
-#: nscd/servicescache.c:381
+#: nscd/servicescache.c:387
#, c-format
msgid "Haven't found \"%s\" in services cache!"
msgstr "No se ha encontrado \"%s\" en el caché de `services'"
-#: nscd/servicescache.c:383
+#: nscd/servicescache.c:389
#, c-format
msgid "Reloading \"%s\" in services cache!"
msgstr "Recargando \"%s\" en el caché de services"
-#: nss/getent.c:54
+#: nss/getent.c:53
msgid "database [key ...]"
msgstr "basededatos [clave ...]"
-#: nss/getent.c:59
+#: nss/getent.c:58
msgid "Service configuration to be used"
msgstr "Configuración del servicio"
-#: nss/getent.c:60
+#: nss/getent.c:59
msgid "disable IDN encoding"
msgstr "desactiva la codificación IDN"
-#: nss/getent.c:65
+#: nss/getent.c:64
msgid "Get entries from administrative database."
msgstr "Obtiene entradas de la base de datos administrativa."
-#: nss/getent.c:149 nss/getent.c:479
+#: nss/getent.c:148 nss/getent.c:477 nss/getent.c:522
#, c-format
msgid "Enumeration not supported on %s\n"
msgstr "La enumeración no está soportada sobre %s\n"
-#: nss/getent.c:866
+#: nss/getent.c:913
#, c-format
msgid "Unknown database name"
msgstr "Nombre de base de datos desconocido"
-#: nss/getent.c:896
+#: nss/getent.c:943
msgid "Supported databases:\n"
msgstr "Bases de datos admitidas:\n"
-#: nss/getent.c:962
+#: nss/getent.c:1009
#, c-format
msgid "Unknown database: %s\n"
msgstr "Base de datos desconocida: %s\n"
-#: nss/makedb.c:60
+#: nss/makedb.c:118
msgid "Convert key to lower case"
msgstr "Convierte la clave a minúsculas"
-#: nss/makedb.c:63
+#: nss/makedb.c:121
msgid "Do not print messages while building database"
msgstr "No muestra ningún mensaje mientras construye la base de datos"
-#: nss/makedb.c:65
+#: nss/makedb.c:123
msgid "Print content of database file, one entry a line"
msgstr "Muestra el contenido de un fichero de base de datos, una entrada por línea"
-#: nss/makedb.c:70
-msgid "Create simple DB database from textual input."
-msgstr "Crea una base de datos DB simple a partir de una entrada de texto."
+#: nss/makedb.c:124
+msgid "CHAR"
+msgstr "CARÁCTER"
-#: nss/makedb.c:73
+#: nss/makedb.c:125
+msgid "Generated line not part of iteration"
+msgstr "La línea generada no es parte de la iteración"
+
+#: nss/makedb.c:130
+msgid "Create simple database from textual input."
+msgstr "Crea una base de datos simple a partir de una entrada de texto."
+
+#: nss/makedb.c:133
msgid ""
"INPUT-FILE OUTPUT-FILE\n"
"-o OUTPUT-FILE INPUT-FILE\n"
@@ -4545,50 +4675,86 @@ msgstr ""
"-o FICHERO-SALIDA FICHERO-ENTRADA\n"
"-u FICHERO-ENTRADA"
-#: nss/makedb.c:142
+#: nss/makedb.c:229
#, c-format
-msgid "No usable database library found."
-msgstr "No se ha encontrado ninguna biblioteca de base de datos utilizable."
+msgid "cannot open database file `%s'"
+msgstr "no se puede abrir el fichero de base de datos `%s'"
-#: nss/makedb.c:149
+#: nss/makedb.c:274
#, c-format
-msgid "cannot open database file `%s': %s"
-msgstr "no se puede abrir el fichero de datos `%s': %s"
+msgid "no entries to be processed"
+msgstr "no hay entradas que procesar"
-#: nss/makedb.c:151
-msgid "incorrectly formatted file"
-msgstr "fichero formateado incorrectamente"
+#: nss/makedb.c:284
+#, c-format
+msgid "cannot create temporary file name"
+msgstr "no se puede crear un nombre de fichero temporal"
-#: nss/makedb.c:331
-msgid "duplicate key"
-msgstr "clave duplicada"
+#: nss/makedb.c:306
+#, c-format
+msgid "cannot stat newly created file"
+msgstr "no se puede efectuar stat sobre el fichero recién creado"
+
+#: nss/makedb.c:317
+#, c-format
+msgid "cannot rename temporary file"
+msgstr "no se puede renombrar el fichero temporal"
-#: nss/makedb.c:337
+#: nss/makedb.c:533 nss/makedb.c:556
#, c-format
-msgid "while writing database file"
-msgstr "al escribir la base de datos"
+msgid "cannot create search tree"
+msgstr "no se puede crear el árbol de búsqueda"
-#: nss/makedb.c:348
+#: nss/makedb.c:562
+msgid "duplicate key"
+msgstr "clave duplicada"
+
+#: nss/makedb.c:574
#, c-format
msgid "problems while reading `%s'"
msgstr "problemas mientras se leía `%s'"
-#: nss/makedb.c:368 nss/makedb.c:385
+#: nss/makedb.c:801
+#, c-format
+msgid "failed to write new database file"
+msgstr "fallo al escribir la base de datos"
+
+#: nss/makedb.c:814
+#, c-format
+msgid "cannot stat database file"
+msgstr "no se puede efectuar stat sobre el fichero de la base de datos"
+
+#: nss/makedb.c:819
+#, c-format
+msgid "cannot map database file"
+msgstr "no se puede efectuar map sobre el fichero de la base de datos"
+
+#: nss/makedb.c:822
+#, c-format
+msgid "file not a database file"
+msgstr "el fichero no es un fichero de base de datos"
+
+#: nss/makedb.c:873
+#, c-format
+msgid "cannot set file creation context for `%s'"
+msgstr "no se puede establecer el contexto de creación de fichero para `%s'"
+
+#: ports/sysdeps/unix/sysv/linux/ia64/makecontext.c:62
#, c-format
-msgid "while reading database"
-msgstr "al leer el fichero de datos"
+msgid "makecontext: does not know how to handle more than 8 arguments\n"
+msgstr "makecontext: no sabe cómo manejar más de 8 argumentos\n"
-#: posix/getconf.c:1036
+#: posix/getconf.c:1035
#, c-format
msgid "Usage: %s [-v specification] variable_name [pathname]\n"
msgstr "Modo de empleo: %s [-v especificación] nombre_de_variable [ruta]\n"
-#: posix/getconf.c:1039
+#: posix/getconf.c:1038
#, c-format
msgid " %s -a [pathname]\n"
msgstr " %s -a [ruta]\n"
-#: posix/getconf.c:1115
+#: posix/getconf.c:1114
#, c-format
msgid ""
"Usage: getconf [-v SPEC] VAR\n"
@@ -4606,51 +4772,51 @@ msgstr ""
"variable RUTA_VAR para la ruta RUTA. Si se especifica ESP, se dan\n"
"los valores para el entorno de compilación ESP.\n"
-#: posix/getconf.c:1173
+#: posix/getconf.c:1172
#, c-format
msgid "unknown specification \"%s\""
msgstr "especificación \"%s\" desconocida"
-#: posix/getconf.c:1225
+#: posix/getconf.c:1224
#, c-format
msgid "Couldn't execute %s"
msgstr "No se pudo ejecutar %s"
-#: posix/getconf.c:1269 posix/getconf.c:1285
+#: posix/getconf.c:1268 posix/getconf.c:1284
msgid "undefined"
msgstr "sin definir"
-#: posix/getconf.c:1307
+#: posix/getconf.c:1306
#, c-format
msgid "Unrecognized variable `%s'"
msgstr "Variable no reconocida `%s'"
-#: posix/getopt.c:594 posix/getopt.c:623
+#: posix/getopt.c:593 posix/getopt.c:622
#, c-format
msgid "%s: option '%s' is ambiguous; possibilities:"
msgstr "%s: la opción '%s' es ambigua; posibilidades:"
-#: posix/getopt.c:664 posix/getopt.c:668
+#: posix/getopt.c:663 posix/getopt.c:667
#, c-format
msgid "%s: option '--%s' doesn't allow an argument\n"
msgstr "%s: la opción '--%s' no admite ningún argumento\n"
-#: posix/getopt.c:677 posix/getopt.c:682
+#: posix/getopt.c:676 posix/getopt.c:681
#, c-format
msgid "%s: option '%c%s' doesn't allow an argument\n"
msgstr "%s: la opción '%c%s' no admite ningún argumento\n"
-#: posix/getopt.c:725 posix/getopt.c:744
+#: posix/getopt.c:724 posix/getopt.c:743
#, c-format
msgid "%s: option '--%s' requires an argument\n"
msgstr "%s: la opción '--%s' requiere un argumento\n"
-#: posix/getopt.c:782 posix/getopt.c:785
+#: posix/getopt.c:781 posix/getopt.c:784
#, c-format
msgid "%s: unrecognized option '--%s'\n"
msgstr "%s: opción no reconocida '--%s'\n"
-#: posix/getopt.c:793 posix/getopt.c:796
+#: posix/getopt.c:792 posix/getopt.c:795
#, c-format
msgid "%s: unrecognized option '%c%s'\n"
msgstr "%s: opción no reconocida '%c%s'\n"
@@ -4669,101 +4835,101 @@ msgstr "%s: opción no reconocida '%c%s'\n"
# Después de leer "1984", lo cambio.
# Aquí y en todas partes. sv
#
-#: posix/getopt.c:845 posix/getopt.c:848
+#: posix/getopt.c:844 posix/getopt.c:847
#, c-format
msgid "%s: invalid option -- '%c'\n"
msgstr "%s: opción inválida -- '%c'\n"
-#: posix/getopt.c:898 posix/getopt.c:915 posix/getopt.c:1123
-#: posix/getopt.c:1141
+#: posix/getopt.c:900 posix/getopt.c:917 posix/getopt.c:1127
+#: posix/getopt.c:1145
#, c-format
msgid "%s: option requires an argument -- '%c'\n"
msgstr "%s: la opción requiere un argumento -- '%c'\n"
-#: posix/getopt.c:971 posix/getopt.c:987
+#: posix/getopt.c:973 posix/getopt.c:989
#, c-format
msgid "%s: option '-W %s' is ambiguous\n"
msgstr "%s: la opción '-W %s' es ambigua\n"
-#: posix/getopt.c:1011 posix/getopt.c:1029
+#: posix/getopt.c:1013 posix/getopt.c:1031
#, c-format
msgid "%s: option '-W %s' doesn't allow an argument\n"
msgstr "%s: la opción '-W %s' no admite ningún argumento\n"
-#: posix/getopt.c:1050 posix/getopt.c:1068
+#: posix/getopt.c:1052 posix/getopt.c:1070
#, c-format
msgid "%s: option '-W %s' requires an argument\n"
msgstr "%s: la opción '-W %s' requiere un argumento\n"
-#: posix/regcomp.c:135
+#: posix/regcomp.c:134
msgid "No match"
msgstr "No hay ninguna coincidencia"
-#: posix/regcomp.c:138
+#: posix/regcomp.c:137
msgid "Invalid regular expression"
msgstr "La expresión regular es errónea"
-#: posix/regcomp.c:141
+#: posix/regcomp.c:140
msgid "Invalid collation character"
msgstr "Carácter de unión inválido"
-#: posix/regcomp.c:144
+#: posix/regcomp.c:143
msgid "Invalid character class name"
msgstr "Nombre de clase de carácter inválido"
-#: posix/regcomp.c:147
+#: posix/regcomp.c:146
msgid "Trailing backslash"
msgstr "Barra invertida extra al final `\\'"
-#: posix/regcomp.c:150
+#: posix/regcomp.c:149
msgid "Invalid back reference"
msgstr "Referencia hacia atrás inválida"
-#: posix/regcomp.c:153
+#: posix/regcomp.c:152
msgid "Unmatched [ or [^"
msgstr "[ ó ^[ desemparejados"
-#: posix/regcomp.c:156
+#: posix/regcomp.c:155
msgid "Unmatched ( or \\("
msgstr "( ó \\( desemparejados"
-#: posix/regcomp.c:159
+#: posix/regcomp.c:158
msgid "Unmatched \\{"
msgstr "\\{ desemparejado"
-#: posix/regcomp.c:162
+#: posix/regcomp.c:161
msgid "Invalid content of \\{\\}"
msgstr "Contenido de \\{\\} inválido"
-#: posix/regcomp.c:165
+#: posix/regcomp.c:164
msgid "Invalid range end"
msgstr "Final de rango inválido"
-#: posix/regcomp.c:168
+#: posix/regcomp.c:167
msgid "Memory exhausted"
msgstr "Memoria agotada"
-#: posix/regcomp.c:171
+#: posix/regcomp.c:170
msgid "Invalid preceding regular expression"
msgstr "La expresión regular precedente es inválida"
-#: posix/regcomp.c:174
+#: posix/regcomp.c:173
msgid "Premature end of regular expression"
msgstr "Fin no esperado de la expresión regular"
-#: posix/regcomp.c:177
+#: posix/regcomp.c:176
msgid "Regular expression too big"
msgstr "La expresión regular es demasiado grande"
-#: posix/regcomp.c:180
+#: posix/regcomp.c:179
msgid "Unmatched ) or \\)"
msgstr ") ó \\) desemparejados"
-#: posix/regcomp.c:680
+#: posix/regcomp.c:679
msgid "No previous regular expression"
msgstr "No existe ninguna expresión regular anterior"
-#: posix/wordexp.c:1832
+#: posix/wordexp.c:1830
msgid "parameter null or not set"
msgstr "parámetro nulo o no establecido"
@@ -4800,27 +4966,27 @@ msgid "Unknown resolver error"
msgstr "Error del determinador de nombres desconocido"
# ¿Qué son dominios trim?
-#: resolv/res_hconf.c:124
+#: resolv/res_hconf.c:122
#, c-format
msgid "%s: line %d: cannot specify more than %d trim domains"
msgstr "%s: línea %d: no se pueden especificar más de % dominios"
-#: resolv/res_hconf.c:145
+#: resolv/res_hconf.c:143
#, c-format
msgid "%s: line %d: list delimiter not followed by domain"
msgstr "%s: línea %d: el delimitador de lista no está seguido por el dominio"
-#: resolv/res_hconf.c:204
+#: resolv/res_hconf.c:202
#, c-format
msgid "%s: line %d: expected `on' or `off', found `%s'\n"
msgstr "%s: línea %d: se esperaba `on' o `off', se encontró `%s'\n"
-#: resolv/res_hconf.c:247
+#: resolv/res_hconf.c:245
#, c-format
msgid "%s: line %d: bad command `%s'\n"
msgstr "%s: línea %d: orden errónea `%s'\n"
-#: resolv/res_hconf.c:282
+#: resolv/res_hconf.c:280
#, c-format
msgid "%s: line %d: ignoring trailing garbage `%s'\n"
msgstr "%s: línea %d: se descarta lo que sigue `%s'\n"
@@ -4970,108 +5136,108 @@ msgstr "Entrada de alta prioridad disponible"
msgid "Device disconnected"
msgstr "Dispositivo desconectado"
-#: stdio-common/psiginfo.c:145
+#: stdio-common/psiginfo.c:139
msgid "Signal sent by kill()"
msgstr "Señal enviada por kill()"
-#: stdio-common/psiginfo.c:148
+#: stdio-common/psiginfo.c:142
msgid "Signal sent by sigqueue()"
msgstr "Señal enviada por sigqueue()"
-#: stdio-common/psiginfo.c:151
+#: stdio-common/psiginfo.c:145
msgid "Signal generated by the expiration of a timer"
msgstr "Señal generada por la expiración de un temporizador"
-#: stdio-common/psiginfo.c:154
+#: stdio-common/psiginfo.c:148
msgid "Signal generated by the completion of an asynchronous I/O request"
msgstr "Señal generada por la compleción de una petición de E/S asíncrona"
-#: stdio-common/psiginfo.c:158
+#: stdio-common/psiginfo.c:152
msgid "Signal generated by the arrival of a message on an empty message queue"
msgstr "Señal generada por la llegada de un mensaje en una cola de mensajes vacía"
-#: stdio-common/psiginfo.c:163
+#: stdio-common/psiginfo.c:157
msgid "Signal sent by tkill()"
msgstr "Señal enviada por tkill()"
-#: stdio-common/psiginfo.c:168
+#: stdio-common/psiginfo.c:162
msgid "Signal generated by the completion of an asynchronous name lookup request"
msgstr "Señal generada por la compleción de una petición de búsqueda de nombres asíncrona"
-#: stdio-common/psiginfo.c:174
+#: stdio-common/psiginfo.c:168
msgid "Signal generated by the completion of an I/O request"
msgstr "Señal generada por la compleción de una petición de E/S"
-#: stdio-common/psiginfo.c:180
+#: stdio-common/psiginfo.c:174
msgid "Signal sent by the kernel"
msgstr "Señal enviada por el núcleo"
-#: stdio-common/psiginfo.c:204
+#: stdio-common/psiginfo.c:198
#, c-format
msgid "Unknown signal %d\n"
msgstr "Señal desconocida %d\n"
-#: stdio-common/psignal.c:51
+#: stdio-common/psignal.c:43
#, c-format
msgid "%s%sUnknown signal %d\n"
msgstr "%s%sSeñal desconocida %d\n"
-#: stdio-common/psignal.c:52
+#: stdio-common/psignal.c:44
msgid "Unknown signal"
msgstr "Señal desconocida"
-#: string/_strerror.c:47 sysdeps/mach/_strerror.c:87
+#: string/_strerror.c:46 sysdeps/mach/_strerror.c:86
msgid "Unknown error "
msgstr "Error desconocido "
-#: string/strerror.c:43
+#: string/strerror.c:42
msgid "Unknown error"
msgstr "Error desconocido"
-#: string/strsignal.c:65
+#: string/strsignal.c:60
#, c-format
msgid "Real-time signal %d"
msgstr "Señal de tiempo real %d"
-#: string/strsignal.c:69
+#: string/strsignal.c:64
#, c-format
msgid "Unknown signal %d"
msgstr "Señal desconocida %d"
-#: sunrpc/auth_unix.c:113 sunrpc/clnt_tcp.c:125 sunrpc/clnt_udp.c:136
-#: sunrpc/clnt_unix.c:126 sunrpc/svc_tcp.c:173 sunrpc/svc_tcp.c:218
-#: sunrpc/svc_udp.c:147 sunrpc/svc_unix.c:174 sunrpc/svc_unix.c:215
-#: sunrpc/xdr.c:632 sunrpc/xdr.c:792 sunrpc/xdr_array.c:100
-#: sunrpc/xdr_rec.c:154 sunrpc/xdr_ref.c:79
+#: sunrpc/auth_unix.c:111 sunrpc/clnt_tcp.c:123 sunrpc/clnt_udp.c:134
+#: sunrpc/clnt_unix.c:124 sunrpc/svc_tcp.c:188 sunrpc/svc_tcp.c:233
+#: sunrpc/svc_udp.c:162 sunrpc/svc_unix.c:188 sunrpc/svc_unix.c:229
+#: sunrpc/xdr.c:630 sunrpc/xdr.c:790 sunrpc/xdr_array.c:97
+#: sunrpc/xdr_rec.c:151 sunrpc/xdr_ref.c:76
msgid "out of memory\n"
msgstr "memoria agotada\n"
# ??? mariscalización ?
-#: sunrpc/auth_unix.c:351
+#: sunrpc/auth_unix.c:349
msgid "auth_unix.c: Fatal marshalling problem"
msgstr "auth_unix.c: - Problema muy grave con autorización marshall"
# FIXME: ¿¿No será major y minor??
-#: sunrpc/clnt_perr.c:98 sunrpc/clnt_perr.c:114
+#: sunrpc/clnt_perr.c:95 sunrpc/clnt_perr.c:111
#, c-format
msgid "%s: %s; low version = %lu, high version = %lu"
msgstr "%s: %s; versión menor = %lu, versión mayor = %lu"
-#: sunrpc/clnt_perr.c:105
+#: sunrpc/clnt_perr.c:102
#, c-format
msgid "%s: %s; why = %s\n"
msgstr "%s: %s; causa = %s\n"
-#: sunrpc/clnt_perr.c:107
+#: sunrpc/clnt_perr.c:104
#, c-format
msgid "%s: %s; why = (unknown authentication error - %d)\n"
msgstr "%s: %s; causa = (error de autentificación desconocido - %d)\n"
-#: sunrpc/clnt_perr.c:156
+#: sunrpc/clnt_perr.c:153
msgid "RPC: Success"
msgstr "RPC: Conseguido"
-#: sunrpc/clnt_perr.c:159
+#: sunrpc/clnt_perr.c:156
msgid "RPC: Can't encode arguments"
msgstr "RPC: No se pudieron codificar los argumentos"
@@ -5081,12 +5247,12 @@ msgstr "RPC: No se pudieron codificar los argumentos"
# indiferentemente. Ya se sabe lo mal que les suena el pasado de can,
# sobre todo en frases afirmativas ( que no es el caso, pero bueno )
#
-#: sunrpc/clnt_perr.c:163
+#: sunrpc/clnt_perr.c:160
msgid "RPC: Can't decode result"
msgstr "RPC: No se pudo descodificar la respuesta"
# Sugerencia: No se puede enviar. (?) (no estoy muy seguro) sv
-#: sunrpc/clnt_perr.c:167
+#: sunrpc/clnt_perr.c:164
msgid "RPC: Unable to send"
msgstr "RPC: No se puede enviar"
@@ -5095,27 +5261,27 @@ msgstr "RPC: No se puede enviar"
# da la impresión de que ni siquiera se intenta
# A lo mejor es que ni siquiera puede intentarlo ... sv
# Me suena horrible lo de "Incapaz", lo cambio. sv
-#: sunrpc/clnt_perr.c:171
+#: sunrpc/clnt_perr.c:168
msgid "RPC: Unable to receive"
msgstr "RPC: No se puede recibir"
-#: sunrpc/clnt_perr.c:175
+#: sunrpc/clnt_perr.c:172
msgid "RPC: Timed out"
msgstr "RPC: El tiempo expiró"
-#: sunrpc/clnt_perr.c:179
+#: sunrpc/clnt_perr.c:176
msgid "RPC: Incompatible versions of RPC"
msgstr "RPC: Versiones incompatibles de RPC"
-#: sunrpc/clnt_perr.c:183
+#: sunrpc/clnt_perr.c:180
msgid "RPC: Authentication error"
msgstr "RPC: Error de autentificación"
-#: sunrpc/clnt_perr.c:187
+#: sunrpc/clnt_perr.c:184
msgid "RPC: Program unavailable"
msgstr "RPC: Programa no disponible"
-#: sunrpc/clnt_perr.c:191
+#: sunrpc/clnt_perr.c:188
msgid "RPC: Program/version mismatch"
msgstr "RPC: La versión del programa no coincide"
@@ -5136,72 +5302,72 @@ msgstr "RPC: La versión del programa no coincide"
#
# Por cierto, unavailable es NO disponible. Lo cambio.
# Y quito el "rpc" sv+
-#: sunrpc/clnt_perr.c:195
+#: sunrpc/clnt_perr.c:192
msgid "RPC: Procedure unavailable"
msgstr "RPC: Procedimiento no disponible"
-#: sunrpc/clnt_perr.c:199
+#: sunrpc/clnt_perr.c:196
msgid "RPC: Server can't decode arguments"
msgstr "RPC: El servidor no puede descifrar los argumentos"
-#: sunrpc/clnt_perr.c:203
+#: sunrpc/clnt_perr.c:200
msgid "RPC: Remote system error"
msgstr "RPC: Error del sistema remoto"
-#: sunrpc/clnt_perr.c:207
+#: sunrpc/clnt_perr.c:204
msgid "RPC: Unknown host"
msgstr "RPC: `Host' desconocido"
-#: sunrpc/clnt_perr.c:211
+#: sunrpc/clnt_perr.c:208
msgid "RPC: Unknown protocol"
msgstr "RPC: Protocolo desconocido"
-#: sunrpc/clnt_perr.c:215
+#: sunrpc/clnt_perr.c:212
msgid "RPC: Port mapper failure"
msgstr "RPC: Fallo del asignador de puertos"
-#: sunrpc/clnt_perr.c:219
+#: sunrpc/clnt_perr.c:216
msgid "RPC: Program not registered"
msgstr "RPC: Programa no registrado"
# ??? Falló, fracasó, pinchó ;-)
-#: sunrpc/clnt_perr.c:223
+#: sunrpc/clnt_perr.c:220
msgid "RPC: Failed (unspecified error)"
msgstr "RPC: Falló (error no especificado)"
-#: sunrpc/clnt_perr.c:264
+#: sunrpc/clnt_perr.c:261
msgid "RPC: (unknown error code)"
msgstr "RPC: (código de error desconocido)"
-#: sunrpc/clnt_perr.c:336
+#: sunrpc/clnt_perr.c:333
msgid "Authentication OK"
msgstr "Autentificación válida"
-#: sunrpc/clnt_perr.c:339
+#: sunrpc/clnt_perr.c:336
msgid "Invalid client credential"
msgstr "Credenciales del cliente inválidas"
-#: sunrpc/clnt_perr.c:343
+#: sunrpc/clnt_perr.c:340
msgid "Server rejected credential"
msgstr "El servidor rechazó la credencial"
-#: sunrpc/clnt_perr.c:347
+#: sunrpc/clnt_perr.c:344
msgid "Invalid client verifier"
msgstr "Verificación del cliente inválida"
-#: sunrpc/clnt_perr.c:351
+#: sunrpc/clnt_perr.c:348
msgid "Server rejected verifier"
msgstr "El servidor rechazó el verificador"
-#: sunrpc/clnt_perr.c:355
+#: sunrpc/clnt_perr.c:352
msgid "Client credential too weak"
msgstr "Las credenciales del cliente son poco fiables"
-#: sunrpc/clnt_perr.c:359
+#: sunrpc/clnt_perr.c:356
msgid "Invalid server verifier"
msgstr "Verificación del servidor inválido"
-#: sunrpc/clnt_perr.c:363
+#: sunrpc/clnt_perr.c:360
msgid "Failed (unspecified error)"
msgstr "Falló (error no especificado)"
@@ -5240,250 +5406,256 @@ msgstr "Problema en el `poll' del `broadcast'"
msgid "Cannot receive reply to broadcast"
msgstr "No se puede recibir la respuesta al `broadcast'"
-#: sunrpc/rpc_main.c:288
+#: sunrpc/rpc_main.c:277
#, c-format
msgid "%s: output would overwrite %s\n"
msgstr "%s: la salida sobreescribiría %s\n"
-#: sunrpc/rpc_main.c:295
+#: sunrpc/rpc_main.c:284
#, c-format
msgid "%s: unable to open %s: %m\n"
msgstr "%s: no se pudo abrir %s: %m\n"
-#: sunrpc/rpc_main.c:307
+#: sunrpc/rpc_main.c:296
#, c-format
msgid "%s: while writing output %s: %m"
msgstr "%s: al escribir el resultado %s: %m:"
-# FIXME: El espacio final.
-#: sunrpc/rpc_main.c:342
+#: sunrpc/rpc_main.c:332 sunrpc/rpc_main.c:371
#, c-format
-msgid "cannot find C preprocessor: %s \n"
-msgstr "no se puede encontrar el preprocesador de C: %s \n"
-
-#: sunrpc/rpc_main.c:350
-msgid "cannot find any C preprocessor (cpp)\n"
-msgstr "no se puede encontrar ningún preprocesador de C (cpp)\n"
+msgid "cannot find C preprocessor: %s\n"
+msgstr "no se puede encontrar el preprocesador de C: %s\n"
-#: sunrpc/rpc_main.c:419
+#: sunrpc/rpc_main.c:407
#, c-format
msgid "%s: C preprocessor failed with signal %d\n"
msgstr "%s: El preprocesador de C falló con la señal %d\n"
-#: sunrpc/rpc_main.c:422
+#: sunrpc/rpc_main.c:410
#, c-format
msgid "%s: C preprocessor failed with exit code %d\n"
msgstr "%s: El preprocesador de C falló con un código de retorno %d\n"
-#: sunrpc/rpc_main.c:462
+#: sunrpc/rpc_main.c:450
#, c-format
msgid "illegal nettype: `%s'\n"
msgstr "tipodered ilegal: `%s'\n"
-#: sunrpc/rpc_main.c:1128
+#: sunrpc/rpc_main.c:1085
#, c-format
msgid "rpcgen: too many defines\n"
msgstr "rpcgen: demasiados defines\n"
-#: sunrpc/rpc_main.c:1140
+#: sunrpc/rpc_main.c:1097
#, c-format
msgid "rpcgen: arglist coding error\n"
msgstr "rpcgen: error de codificación de la lista de argumentos\n"
#. TRANS: the file will not be removed; this is an
#. TRANS: informative message.
-#: sunrpc/rpc_main.c:1173
+#: sunrpc/rpc_main.c:1130
#, c-format
msgid "file `%s' already exists and may be overwritten\n"
msgstr "el fichero `%s' ya existe y podría ser sobreescrito\n"
-#: sunrpc/rpc_main.c:1218
+#: sunrpc/rpc_main.c:1175
#, c-format
msgid "Cannot specify more than one input file!\n"
msgstr "No se puede especificar más de un fichero de entrada\n"
# Se admiten sugerencias para MT-safe. sv
-#: sunrpc/rpc_main.c:1392
+#: sunrpc/rpc_main.c:1345
#, c-format
msgid "This implementation doesn't support newstyle or MT-safe code!\n"
msgstr "¡Esta implementación no admite código de nuevo estilo o `MT-safe'!\n"
-#: sunrpc/rpc_main.c:1401
+#: sunrpc/rpc_main.c:1354
#, c-format
msgid "Cannot use netid flag with inetd flag!\n"
msgstr "No se puede usar la opción netid con la opción inetd\n"
-#: sunrpc/rpc_main.c:1413
+#: sunrpc/rpc_main.c:1363
#, c-format
msgid "Cannot use netid flag without TIRPC!\n"
msgstr "No se puede usar la opción netid sin TIRPC\n"
-#: sunrpc/rpc_main.c:1420
+#: sunrpc/rpc_main.c:1370
#, c-format
msgid "Cannot use table flags with newstyle!\n"
msgstr "No se pueden usar las opciones de la tabla con el nuevo estilo\n"
-#: sunrpc/rpc_main.c:1439
+#: sunrpc/rpc_main.c:1389
#, c-format
msgid "\"infile\" is required for template generation flags.\n"
msgstr ""
"se necesita un \"fichero_de_entrada\" para las opciones de generación\n"
"de plantillas\n"
-#: sunrpc/rpc_main.c:1444
+#: sunrpc/rpc_main.c:1394
#, c-format
msgid "Cannot have more than one file generation flag!\n"
msgstr "No se puede tener más de una opción de generación de fichero\n"
-#: sunrpc/rpc_main.c:1453
+#: sunrpc/rpc_main.c:1403
#, c-format
msgid "usage: %s infile\n"
msgstr "modo de empleo: %s fichero_de_entrada\n"
# Este mensaje tal vez habría que cortarlo por algún lado. sv
-#: sunrpc/rpc_main.c:1454
+#: sunrpc/rpc_main.c:1404
#, c-format
msgid "\t%s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile\n"
msgstr "\t%s [-abkCLNTM][-Dnombre[=valor]] [-i tamaño] [-I [-K segundos]] [-Y camino] fichero_de_entrada\n"
# Y este también. sv
-#: sunrpc/rpc_main.c:1456
+#: sunrpc/rpc_main.c:1406
#, c-format
msgid "\t%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]\n"
msgstr "\t%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o fichero_de_salida] [fichero_de_entrada]\n"
-#: sunrpc/rpc_main.c:1458
+#: sunrpc/rpc_main.c:1408
#, c-format
msgid "\t%s [-s nettype]* [-o outfile] [infile]\n"
msgstr "\t%s [-s tipored]* [-o fichero_de_salida] [fichero_de_entrada]\n"
-#: sunrpc/rpc_main.c:1459
+#: sunrpc/rpc_main.c:1409
#, c-format
msgid "\t%s [-n netid]* [-o outfile] [infile]\n"
msgstr "\t%s [-n netid]* [-o fichero_de_salida] [fichero_de_entrada]\n"
-#: sunrpc/rpc_main.c:1467
+#: sunrpc/rpc_main.c:1417
#, c-format
msgid "options:\n"
msgstr "opciones:\n"
-#: sunrpc/rpc_main.c:1468
+#: sunrpc/rpc_main.c:1418
#, c-format
msgid "-a\t\tgenerate all files, including samples\n"
msgstr "-a\t\tgenera todos los ficheros, incluyendo las muestras\n"
-#: sunrpc/rpc_main.c:1469
+#: sunrpc/rpc_main.c:1419
#, c-format
msgid "-b\t\tbackward compatibility mode (generates code for SunOS 4.1)\n"
msgstr "-b\t\tmodo de compatibilidad hacia atrás (genera código para SunOS 4.1)\n"
-#: sunrpc/rpc_main.c:1470
+#: sunrpc/rpc_main.c:1420
#, c-format
msgid "-c\t\tgenerate XDR routines\n"
msgstr "-c\t\tgenera rutinas XDR\n"
-#: sunrpc/rpc_main.c:1471
+#: sunrpc/rpc_main.c:1421
#, c-format
msgid "-C\t\tANSI C mode\n"
msgstr "-C\t\tmodo ANSI C\n"
-#: sunrpc/rpc_main.c:1472
+#: sunrpc/rpc_main.c:1422
#, c-format
msgid "-Dname[=value]\tdefine a symbol (same as #define)\n"
msgstr "-Dnombre[=valor]\tdefine un símbolo (igual que #define)\n"
-#: sunrpc/rpc_main.c:1473
+#: sunrpc/rpc_main.c:1423
#, c-format
msgid "-h\t\tgenerate header file\n"
msgstr "-h\t\tgenera un fichero de cabecera\n"
-#: sunrpc/rpc_main.c:1474
+#: sunrpc/rpc_main.c:1424
#, c-format
msgid "-i size\t\tsize at which to start generating inline code\n"
msgstr "-i tamaño\t\ttamaño en el que comienza a generar código `inline'\n"
-#: sunrpc/rpc_main.c:1475
+#: sunrpc/rpc_main.c:1425
#, c-format
msgid "-I\t\tgenerate code for inetd support in server (for SunOS 4.1)\n"
msgstr "-I\t\tgenera código para soporte de inetd en el servidor (para SunOS 4.1)\n"
# FIXME: Tendría que ser después de "segundos" segundos de inactividad
-#: sunrpc/rpc_main.c:1476
+#: sunrpc/rpc_main.c:1426
#, c-format
msgid "-K seconds\tserver exits after K seconds of inactivity\n"
msgstr "-K segundos\tel servidor termina después de K segundos de inactividad\n"
# Se admiten sugerencias para "stubs"
-#: sunrpc/rpc_main.c:1477
+#: sunrpc/rpc_main.c:1427
#, c-format
msgid "-l\t\tgenerate client side stubs\n"
msgstr "-l\t\tgenera `stubs' para el lado del cliente\n"
-#: sunrpc/rpc_main.c:1478
+#: sunrpc/rpc_main.c:1428
#, c-format
msgid "-L\t\tserver errors will be printed to syslog\n"
msgstr "-L\t\tlos errores del servidor se escribirán en syslog\n"
-#: sunrpc/rpc_main.c:1479
+#: sunrpc/rpc_main.c:1429
#, c-format
msgid "-m\t\tgenerate server side stubs\n"
msgstr "-m\t\tgenera `stubs' para el lado del servidor\n"
-#: sunrpc/rpc_main.c:1480
+#: sunrpc/rpc_main.c:1430
#, c-format
msgid "-M\t\tgenerate MT-safe code\n"
msgstr "-M\t\tgenera código multi-hilo seguro\n"
-#: sunrpc/rpc_main.c:1481
+#: sunrpc/rpc_main.c:1431
#, c-format
msgid "-n netid\tgenerate server code that supports named netid\n"
msgstr "-n netid\tgenera código servidor que soporta netid nombrado\n"
-#: sunrpc/rpc_main.c:1482
+#: sunrpc/rpc_main.c:1432
#, c-format
msgid "-N\t\tsupports multiple arguments and call-by-value\n"
msgstr "-N\t\tsoporta varios argumentos y llamada por valor\n"
-#: sunrpc/rpc_main.c:1483
+#: sunrpc/rpc_main.c:1433
#, c-format
msgid "-o outfile\tname of the output file\n"
msgstr "-o fichero_de_salida\tnombre del fichero de salida\n"
-#: sunrpc/rpc_main.c:1484
+#: sunrpc/rpc_main.c:1434
#, c-format
msgid "-s nettype\tgenerate server code that supports named nettype\n"
msgstr "-s nettype\tgenera código servidor que soporta nettype nombrado\n"
-#: sunrpc/rpc_main.c:1485
+#: sunrpc/rpc_main.c:1435
#, c-format
msgid "-Sc\t\tgenerate sample client code that uses remote procedures\n"
msgstr "-Sc\t\tgenera código cliente de muestra que usa procedimientos remotos\n"
-#: sunrpc/rpc_main.c:1486
+#: sunrpc/rpc_main.c:1436
#, c-format
msgid "-Ss\t\tgenerate sample server code that defines remote procedures\n"
msgstr "-Ss\t\tgenera código servidor de muestra que define procedimientos remotos\n"
-#: sunrpc/rpc_main.c:1487
+#: sunrpc/rpc_main.c:1437
#, c-format
msgid "-Sm \t\tgenerate makefile template \n"
msgstr "-Sm \t\tgenera una plantilla de makefile\n"
-#: sunrpc/rpc_main.c:1488
+#: sunrpc/rpc_main.c:1438
#, c-format
msgid "-t\t\tgenerate RPC dispatch table\n"
msgstr "-t\t\tgenera tabla de ejecución RPC\n"
-#: sunrpc/rpc_main.c:1489
+#: sunrpc/rpc_main.c:1439
#, c-format
msgid "-T\t\tgenerate code to support RPC dispatch tables\n"
msgstr "-T\t\tgenera código para soportar tablas de ejecución RPC\n"
-#: sunrpc/rpc_main.c:1490
+#: sunrpc/rpc_main.c:1440
#, c-format
msgid "-Y path\t\tdirectory name to find C preprocessor (cpp)\n"
msgstr "-Y ruta\t\tnombre del directorio donde encontrar el preprocesador de C (cpp)\n"
+#: sunrpc/rpc_main.c:1442
+#, c-format
+msgid ""
+"\n"
+"For bug reporting instructions, please see:\n"
+"%s.\n"
+msgstr ""
+"\n"
+"Para instrucciones sobre informes de fallo, por favor consulte:\n"
+"%s.\n"
+
#: sunrpc/rpc_scan.c:112
msgid "constant or identifier expected"
msgstr "se esperaba una constante o un identificador"
@@ -5612,55 +5784,55 @@ msgstr "svc_run: - memoria agotada"
msgid "svc_run: - poll failed"
msgstr "svc_run: - poll falló"
-#: sunrpc/svc_simple.c:81
+#: sunrpc/svc_simple.c:80
#, c-format
msgid "can't reassign procedure number %ld\n"
msgstr "no se puede reasignar el número de procedimiento %ld\n"
-#: sunrpc/svc_simple.c:91
+#: sunrpc/svc_simple.c:90
msgid "couldn't create an rpc server\n"
msgstr "no se pudo crear un servidor rpc\n"
-#: sunrpc/svc_simple.c:99
+#: sunrpc/svc_simple.c:98
#, c-format
msgid "couldn't register prog %ld vers %ld\n"
msgstr "no se pudo registrar el programa %ld versión %ld\n"
-#: sunrpc/svc_simple.c:107
+#: sunrpc/svc_simple.c:106
msgid "registerrpc: out of memory\n"
msgstr "registerrpc: memoria agotada\n"
-#: sunrpc/svc_simple.c:168
+#: sunrpc/svc_simple.c:169
#, c-format
msgid "trouble replying to prog %d\n"
msgstr "dificultades para responder al programa %d\n"
-#: sunrpc/svc_simple.c:177
+#: sunrpc/svc_simple.c:178
#, c-format
msgid "never registered prog %d\n"
msgstr "el programa %d no fue registrado nunca\n"
-#: sunrpc/svc_tcp.c:149
+#: sunrpc/svc_tcp.c:164
msgid "svc_tcp.c - tcp socket creation problem"
msgstr "svc_tcp.c - problema al crear el `socket' tcp"
-#: sunrpc/svc_tcp.c:164
+#: sunrpc/svc_tcp.c:179
msgid "svc_tcp.c - cannot getsockname or listen"
msgstr "svc_tcp.c - fallo en la ejecución de `getsockname()' o `listen()'"
-#: sunrpc/svc_udp.c:122
+#: sunrpc/svc_udp.c:137
msgid "svcudp_create: socket creation problem"
msgstr "svcudp_create: problemas para crear el `socket'"
-#: sunrpc/svc_udp.c:136
+#: sunrpc/svc_udp.c:151
msgid "svcudp_create - cannot getsockname"
msgstr "svcudp_create - fallo en la ejecución de `getsockname'"
-#: sunrpc/svc_udp.c:168
+#: sunrpc/svc_udp.c:183
msgid "svcudp_create: xp_pad is too small for IP_PKTINFO\n"
msgstr "svcudp_create: xp_pad es demasiado pequeño para IP_PKTINFO\n"
-#: sunrpc/svc_udp.c:476
+#: sunrpc/svc_udp.c:495
msgid "enablecache: cache already enabled"
msgstr "enablecache: el caché ya estaba activado"
@@ -5668,79 +5840,79 @@ msgstr "enablecache: el caché ya estaba activado"
# Parece ser indistinto, así que unas veces puede ser "la" y otras "el".
# dependiendo del caso (lo que mejor suene).
#
-#: sunrpc/svc_udp.c:482
+#: sunrpc/svc_udp.c:501
msgid "enablecache: could not allocate cache"
msgstr "enablecache: no se pudo crear espacio para el caché"
-#: sunrpc/svc_udp.c:491
+#: sunrpc/svc_udp.c:510
msgid "enablecache: could not allocate cache data"
msgstr "enablecache: no se pudo crear espacio para los datos del caché"
-#: sunrpc/svc_udp.c:499
+#: sunrpc/svc_udp.c:518
msgid "enablecache: could not allocate cache fifo"
msgstr "enablecache: no se pudo crear espacio para la pila del caché"
-#: sunrpc/svc_udp.c:535
+#: sunrpc/svc_udp.c:554
msgid "cache_set: victim not found"
msgstr "cache_set: no se encontró el objetivo"
-#: sunrpc/svc_udp.c:546
+#: sunrpc/svc_udp.c:565
msgid "cache_set: victim alloc failed"
msgstr "cache_set: falló la asignación de espacio para el objetivo"
-#: sunrpc/svc_udp.c:553
+#: sunrpc/svc_udp.c:572
msgid "cache_set: could not allocate new rpc_buffer"
msgstr "cache_set: no se pudo asignar espacio para un nuevo búfer rpc"
-#: sunrpc/svc_unix.c:148
+#: sunrpc/svc_unix.c:162
msgid "svc_unix.c - AF_UNIX socket creation problem"
msgstr "svc_unix.c - problema al crear el `socket' AF_UNIX"
-#: sunrpc/svc_unix.c:164
+#: sunrpc/svc_unix.c:178
msgid "svc_unix.c - cannot getsockname or listen"
msgstr "svc_unix.c - fallo en la ejecución de `getsockname()' o `listen()'"
# Habrá que mirar esto
# Mirado, efectivamente esto es una señal que habrá
# que dejarla con su nombre original ( entre paréntesis )
-#: sysdeps/generic/siglist.h:29 sysdeps/unix/siglist.c:27
+#: sysdeps/generic/siglist.h:28
msgid "Hangup"
msgstr "Colgar (hangup)"
-#: sysdeps/generic/siglist.h:30 sysdeps/unix/siglist.c:28
+#: sysdeps/generic/siglist.h:29
msgid "Interrupt"
msgstr "Interrupción"
# Podría ser también "Abandonar" sv
-#: sysdeps/generic/siglist.h:31 sysdeps/unix/siglist.c:29
+#: sysdeps/generic/siglist.h:30
msgid "Quit"
msgstr "Abandona"
# Se trata de una instrucción ilegal en el juego de instrucciones del 486
# que provoca una "excepción".
-#: sysdeps/generic/siglist.h:32 sysdeps/unix/siglist.c:30
+#: sysdeps/generic/siglist.h:31
msgid "Illegal instruction"
msgstr "Instrucción ilegal"
-#: sysdeps/generic/siglist.h:33 sysdeps/unix/siglist.c:31
+#: sysdeps/generic/siglist.h:32
msgid "Trace/breakpoint trap"
msgstr "`trap' para punto de parada/seguimiento"
-#: sysdeps/generic/siglist.h:34
+#: sysdeps/generic/siglist.h:33
msgid "Aborted"
msgstr "Abortado"
-#: sysdeps/generic/siglist.h:35 sysdeps/unix/siglist.c:34
+#: sysdeps/generic/siglist.h:34
msgid "Floating point exception"
msgstr "Excepción de coma flotante"
# A quien se le ocurra `matar' un proceso, que especifique con qué señal.
# En todo caso ` Terminado ( KILL ) ' sería apropiado. Ver fuentes
-#: sysdeps/generic/siglist.h:36 sysdeps/unix/siglist.c:35
+#: sysdeps/generic/siglist.h:35
msgid "Killed"
msgstr "Terminado (killed)"
-#: sysdeps/generic/siglist.h:37 sysdeps/unix/siglist.c:36
+#: sysdeps/generic/siglist.h:36
msgid "Bus error"
msgstr "Error del bus"
@@ -5752,7 +5924,7 @@ msgstr "Error del bus"
# No, en inglés siempre se ha dicho así. Siempre he traducido
# Segmentation fault como violación de segmento. Consultémoslo,
# es un mensaje que se ve demasiado a menudo em
-#: sysdeps/generic/siglist.h:38 sysdeps/unix/siglist.c:37
+#: sysdeps/generic/siglist.h:37
msgid "Segmentation fault"
msgstr "Violación de segmento"
@@ -5767,65 +5939,64 @@ msgstr "Violación de segmento"
#. TRANS @code{SIGPIPE} signal; this signal terminates the program if not handled
#. TRANS or blocked. Thus, your program will never actually see @code{EPIPE}
#. TRANS unless it has handled or blocked @code{SIGPIPE}.
-#: sysdeps/generic/siglist.h:39 sysdeps/gnu/errlist.c:359
-#: sysdeps/unix/siglist.c:39
+#: sysdeps/generic/siglist.h:38 sysdeps/gnu/errlist.c:359
msgid "Broken pipe"
msgstr "Tubería rota"
-#: sysdeps/generic/siglist.h:40 sysdeps/unix/siglist.c:40
+#: sysdeps/generic/siglist.h:39
msgid "Alarm clock"
msgstr "Temporizador"
-#: sysdeps/generic/siglist.h:41 sysdeps/unix/siglist.c:41
+#: sysdeps/generic/siglist.h:40
msgid "Terminated"
msgstr "Terminado"
# ?? sigo pensando en una traducción para condición
-#: sysdeps/generic/siglist.h:42 sysdeps/unix/siglist.c:42
+#: sysdeps/generic/siglist.h:41
msgid "Urgent I/O condition"
msgstr "Condición urgente de E/S"
-#: sysdeps/generic/siglist.h:43 sysdeps/unix/siglist.c:43
+#: sysdeps/generic/siglist.h:42
msgid "Stopped (signal)"
msgstr "Parado (por una señal)"
-#: sysdeps/generic/siglist.h:44 sysdeps/unix/siglist.c:44
+#: sysdeps/generic/siglist.h:43
msgid "Stopped"
msgstr "Parado"
-#: sysdeps/generic/siglist.h:45 sysdeps/unix/siglist.c:45
+#: sysdeps/generic/siglist.h:44
msgid "Continued"
msgstr "Continúa"
-#: sysdeps/generic/siglist.h:46 sysdeps/unix/siglist.c:46
+#: sysdeps/generic/siglist.h:45
msgid "Child exited"
msgstr "El proceso hijo terminó"
# Perdonad que sea tan largo, pero es algo que nunca está de más
# Creo que mejora al original ;)
-#: sysdeps/generic/siglist.h:47 sysdeps/unix/siglist.c:47
+#: sysdeps/generic/siglist.h:46
msgid "Stopped (tty input)"
msgstr "Parado (requiere entrada de terminal)"
# Perdonad que sea tan largo, pero es algo que nunca está de más
# Creo que mejora al original ;)
-#: sysdeps/generic/siglist.h:48 sysdeps/unix/siglist.c:48
+#: sysdeps/generic/siglist.h:47
msgid "Stopped (tty output)"
msgstr "Parado (requiere salida por terminal)"
-#: sysdeps/generic/siglist.h:49 sysdeps/unix/siglist.c:49
+#: sysdeps/generic/siglist.h:48
msgid "I/O possible"
msgstr "Operación de E/S permitida"
-#: sysdeps/generic/siglist.h:50 sysdeps/unix/siglist.c:50
+#: sysdeps/generic/siglist.h:49
msgid "CPU time limit exceeded"
msgstr "Rebasado el límite de tiempo de CPU"
-#: sysdeps/generic/siglist.h:51 sysdeps/unix/siglist.c:51
+#: sysdeps/generic/siglist.h:50
msgid "File size limit exceeded"
msgstr "Superado el límite de tamaño de fichero"
-#: sysdeps/generic/siglist.h:52 sysdeps/unix/siglist.c:52
+#: sysdeps/generic/siglist.h:51
msgid "Virtual timer expired"
msgstr "El temporizador virtual llegó al final"
@@ -5839,48 +6010,48 @@ msgstr "El temporizador virtual llegó al final"
# me acuerdo de cuál. sv
# Gracias por la explicación, sé que era algo referente
# al trace o debug de un programa. Miro a la alemana.
-#: sysdeps/generic/siglist.h:53 sysdeps/unix/siglist.c:53
+#: sysdeps/generic/siglist.h:52
msgid "Profiling timer expired"
msgstr "El tiempo de CPU expiró"
-#: sysdeps/generic/siglist.h:54 sysdeps/unix/siglist.c:54
-msgid "Window changed"
-msgstr "La ventana ha cambiado"
-
-#: sysdeps/generic/siglist.h:55 sysdeps/unix/siglist.c:56
+#: sysdeps/generic/siglist.h:53
msgid "User defined signal 1"
msgstr "Señal definida por el usuario 1"
-#: sysdeps/generic/siglist.h:56 sysdeps/unix/siglist.c:57
+#: sysdeps/generic/siglist.h:54
msgid "User defined signal 2"
msgstr "Señal definida por el usuario 2"
# ???, siempre lo he usado como trap, nunca encontramos la palabra
# y es una señal estándar Unix, así que no creo conveniente traducirla
-#: sysdeps/generic/siglist.h:60 sysdeps/unix/siglist.c:33
+#: sysdeps/generic/siglist.h:58
msgid "EMT trap"
msgstr "`trap' de EMT"
-#: sysdeps/generic/siglist.h:63 sysdeps/unix/siglist.c:38
+#: sysdeps/generic/siglist.h:61
msgid "Bad system call"
msgstr "Llamada al sistema errónea"
-#: sysdeps/generic/siglist.h:66
+#: sysdeps/generic/siglist.h:64
msgid "Stack fault"
msgstr "Fallo en la pila"
-#: sysdeps/generic/siglist.h:69
+#: sysdeps/generic/siglist.h:67
msgid "Information request"
msgstr "Petición de información"
-#: sysdeps/generic/siglist.h:71
+#: sysdeps/generic/siglist.h:69
msgid "Power failure"
msgstr "Fallo de alimentación"
-#: sysdeps/generic/siglist.h:74 sysdeps/unix/siglist.c:55
+#: sysdeps/generic/siglist.h:72
msgid "Resource lost"
msgstr "Recurso perdido"
+#: sysdeps/generic/siglist.h:75
+msgid "Window changed"
+msgstr "La ventana ha cambiado"
+
#. TRANS Operation not permitted; only the owner of the file (or other resource)
#. TRANS or processes with special privileges can perform the operation.
#: sysdeps/gnu/errlist.c:25
@@ -5926,8 +6097,8 @@ msgstr "No existe el dispositivo o la dirección"
#. TRANS Argument list too long; used when the arguments passed to a new program
#. TRANS being executed with one of the @code{exec} functions (@pxref{Executing a
-#. TRANS File}) occupy too much memory space. This condition never arises in the
-#. TRANS GNU system.
+#. TRANS File}) occupy too much memory space. This condition never arises on
+#. TRANS @gnuhurdsystems{}.
#: sysdeps/gnu/errlist.c:94
msgid "Argument list too long"
msgstr "La lista de argumentos es demasiado larga"
@@ -5978,7 +6149,7 @@ msgid "Cannot allocate memory"
msgstr "No se pudo asignar memoria"
#. TRANS Bad address; an invalid pointer was detected.
-#. TRANS In the GNU system, this error never happens; you get a signal instead.
+#. TRANS On @gnuhurdsystems{}, this error never happens; you get a signal instead.
#: sysdeps/gnu/errlist.c:167
msgid "Bad address"
msgstr "Dirección incorrecta"
@@ -6047,7 +6218,7 @@ msgstr "Demasiados ficheros abiertos"
#. TRANS There are too many distinct file openings in the entire system. Note
#. TRANS that any number of linked channels count as just one file opening; see
-#. TRANS @ref{Linked Channels}. This error never occurs in the GNU system.
+#. TRANS @ref{Linked Channels}. This error never occurs on @gnuhurdsystems{}.
#: sysdeps/gnu/errlist.c:275
msgid "Too many open files in system"
msgstr "Demasiados ficheros abiertos en el sistema"
@@ -6062,7 +6233,7 @@ msgstr "Función ioctl no apropiada para el dispositivo"
#. TRANS write to a file that is currently being executed. Often using a
#. TRANS debugger to run a program is considered having it open for writing and
#. TRANS will cause this error. (The name stands for ``text file busy''.) This
-#. TRANS is not an error in the GNU system; the text is copied as necessary.
+#. TRANS is not an error on @gnuhurdsystems{}; the text is copied as necessary.
#: sysdeps/gnu/errlist.c:298
msgid "Text file busy"
msgstr "El fichero de texto está ocupado"
@@ -6117,7 +6288,7 @@ msgstr "Resultado numérico fuera de rango"
#. TRANS Resource temporarily unavailable; the call might work if you try again
#. TRANS later. The macro @code{EWOULDBLOCK} is another name for @code{EAGAIN};
-#. TRANS they are always the same in the GNU C library.
+#. TRANS they are always the same in @theglibc{}.
#. TRANS
#. TRANS This error can happen in a few different situations:
#. TRANS
@@ -6148,7 +6319,7 @@ msgstr "Resultado numérico fuera de rango"
msgid "Resource temporarily unavailable"
msgstr "Recurso no disponible temporalmente"
-#. TRANS In the GNU C library, this is another name for @code{EAGAIN} (above).
+#. TRANS In @theglibc{}, this is another name for @code{EAGAIN} (above).
#. TRANS The values are always the same, on every operating system.
#. TRANS
#. TRANS C libraries in many older Unix systems have @code{EWOULDBLOCK} as a
@@ -6214,7 +6385,7 @@ msgstr "Tipo de `socket' no soportado"
#. TRANS The operation you requested is not supported. Some socket functions
#. TRANS don't make sense for all types of sockets, and others may not be
-#. TRANS implemented for all communications protocols. In the GNU system, this
+#. TRANS implemented for all communications protocols. On @gnuhurdsystems{}, this
#. TRANS error can happen for many calls when the object does not support the
#. TRANS particular operation; it is a generic indication that the server knows
#. TRANS nothing to do for that call.
@@ -6430,7 +6601,7 @@ msgstr "`handle' de fichero NFS en desuso"
#. TRANS An attempt was made to NFS-mount a remote file system with a file name that
#. TRANS already specifies an NFS-mounted file.
#. TRANS (This is an error on some operating systems, but we expect it to work
-#. TRANS properly on the GNU system, making this error code impossible.)
+#. TRANS properly on @gnuhurdsystems{}, making this error code impossible.)
#: sysdeps/gnu/errlist.c:799
msgid "Object is remote"
msgstr "El objeto es remoto"
@@ -6484,7 +6655,7 @@ msgstr "RPC: procedimiento erróneo para el programa"
# Miro la versión alemana.
# ??? ¿locks? ¿cómo diablos?
#. TRANS No locks available. This is used by the file locking facilities; see
-#. TRANS @ref{File Locks}. This error is never generated by the GNU system, but
+#. TRANS @ref{File Locks}. This error is never generated by @gnuhurdsystems{}, but
#. TRANS it can result from an operation to an NFS server running another
#. TRANS operating system.
#: sysdeps/gnu/errlist.c:856
@@ -6554,7 +6725,7 @@ msgstr "El carácter multibyte o extendido está incompleto o es inválido"
#
# En este caso, creo que sobran el "La" y el "es". Por eso le he quitado
# el "es". sv
-#. TRANS In the GNU system, servers supporting the @code{term} protocol return
+#. TRANS On @gnuhurdsystems{}, servers supporting the @code{term} protocol return
#. TRANS this error for certain operations when the caller is not in the
#. TRANS foreground process group of the terminal. Users do not usually see this
#. TRANS error because functions such as @code{read} and @code{write} translate
@@ -6576,7 +6747,7 @@ msgstr "Operación no válida para un proceso en segundo plano"
#
# Muy bien, pero lo pongo en pretérito perfecto. sv
#
-#. TRANS In the GNU system, opening a file returns this error when the file is
+#. TRANS On @gnuhurdsystems{}, opening a file returns this error when the file is
#. TRANS translated by a program and the translator program dies while starting
#. TRANS up, before it has connected to the file.
#: sysdeps/gnu/errlist.c:955
@@ -6915,9 +7086,13 @@ msgstr "El estado es irrecuperable"
msgid "Operation not possible due to RF-kill"
msgstr "Operación imposible por estar la radiofrecuencia desactivada"
+#: sysdeps/gnu/errlist.c:1469
+msgid "Memory page has hardware error"
+msgstr "La página de memoria tiene un error de hardware"
+
# ¿Qué demonios es esto?
# ¿Error en el error del sistema desconocido? sv
-#: sysdeps/mach/_strerror.c:57
+#: sysdeps/mach/_strerror.c:56
msgid "Error in unknown error system: "
msgstr "Error de sistema desconocido: "
@@ -6992,27 +7167,12 @@ msgstr "Interrumpido por una señal"
msgid "Parameter string not correctly encoded"
msgstr "Cadena de parámetros codificada incorrectamente"
-#: sysdeps/unix/siglist.c:26
-msgid "Signal 0"
-msgstr "Señal 0"
-
-# ???, siempre lo he usado como trap, nunca encontramos la palabra
-# y es una señal estándar Unix, así que no creo conveniente traducirla
-#: sysdeps/unix/siglist.c:32
-msgid "IOT trap"
-msgstr "`trap' de IOT"
-
-#: sysdeps/unix/sysv/linux/i386/readelflib.c:49
+#: sysdeps/unix/sysv/linux/i386/readelflib.c:65
#, c-format
msgid "%s is for unknown machine %d.\n"
msgstr "%s es para la máquina desconocida %d.\n"
-#: sysdeps/unix/sysv/linux/ia64/makecontext.c:63
-#, c-format
-msgid "makecontext: does not know how to handle more than 8 arguments\n"
-msgstr "makecontext: no sabe cómo manejar más de 8 argumentos\n"
-
-#: sysdeps/unix/sysv/linux/lddlibc4.c:61
+#: sysdeps/unix/sysv/linux/lddlibc4.c:60
#, c-format
msgid ""
"Usage: lddlibc4 FILE\n"
@@ -7021,164 +7181,164 @@ msgstr ""
"Modo de empleo: lddlibc4 FICHERO\n"
"\n"
-#: sysdeps/unix/sysv/linux/lddlibc4.c:82
+#: sysdeps/unix/sysv/linux/lddlibc4.c:81
#, c-format
msgid "cannot open `%s'"
msgstr "no se puede abrir `%s'"
-#: sysdeps/unix/sysv/linux/lddlibc4.c:86
+#: sysdeps/unix/sysv/linux/lddlibc4.c:85
#, c-format
msgid "cannot read header from `%s'"
msgstr "no se puede leer la cabecera de `%s'"
-#: timezone/zdump.c:215
+#: timezone/zdump.c:246
msgid "lacks alphabetic at start"
msgstr "no tiene caracteres alfabéticos al comienzo"
-#: timezone/zdump.c:217
+#: timezone/zdump.c:248
msgid "has fewer than 3 alphabetics"
msgstr "tiene menos de 3 caracteres alfabéticos"
-#: timezone/zdump.c:219
+#: timezone/zdump.c:250
msgid "has more than 6 alphabetics"
msgstr "tiene más de 6 caracteres alfabéticos"
-#: timezone/zdump.c:227
+#: timezone/zdump.c:258
msgid "differs from POSIX standard"
msgstr "difiere del estándar POSIX"
-#: timezone/zdump.c:233
+#: timezone/zdump.c:264
#, c-format
msgid "%s: warning: zone \"%s\" abbreviation \"%s\" %s\n"
msgstr "%s: atención: zona \"%s\" abreviatura \"%s\" %s\n"
-#: timezone/zdump.c:242
+#: timezone/zdump.c:273
#, c-format
msgid ""
"%s: usage is %s [ --version ] [ --help ] [ -v ] [ -c [loyear,]hiyear ] zonename ...\n"
"\n"
-"Report bugs to tz@elsie.nci.nih.gov.\n"
+"Report bugs to %s.\n"
msgstr ""
"%s: el modo de empleo es %s [ --version ] [ -v ] [ -c [añoinf,]añosup ] nombrezona ...\n"
"\n"
-"Comunicar errores a tz@elsie.nci.nih.gov.\n"
+"Comunicar errores a %s.\n"
-#: timezone/zdump.c:311
+#: timezone/zdump.c:340
#, c-format
msgid "%s: wild -c argument %s\n"
msgstr "%s: argumento %s descabellado para -c\n"
-#: timezone/zdump.c:398
+#: timezone/zdump.c:426
msgid "Error writing to standard output"
msgstr "Error al escribir en la salida estándar"
-#: timezone/zdump.c:421
+#: timezone/zdump.c:439
#, c-format
msgid "%s: use of -v on system with floating time_t other than float or double\n"
msgstr "%s: uso de -v en un sistema con time_t flotante distinto float o double\n"
-#: timezone/zic.c:388
+#: timezone/zic.c:361
#, c-format
msgid "%s: Memory exhausted: %s\n"
msgstr "%s: Memoria agotada: %s\n"
-#: timezone/zic.c:434
+#: timezone/zic.c:401
#, c-format
msgid "\"%s\", line %d: %s"
msgstr "\"%s\", línea %d: %s"
-#: timezone/zic.c:437
+#: timezone/zic.c:404
#, c-format
msgid " (rule from \"%s\", line %d)"
msgstr " (regla desde \"%s\", línea %d)"
-#: timezone/zic.c:449
+#: timezone/zic.c:415
msgid "warning: "
msgstr "atención: "
# FIXME: Decir al autor que no use tabs. sv
-#: timezone/zic.c:459
+#: timezone/zic.c:425
#, c-format
msgid ""
"%s: usage is %s [ --version ] [ --help ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n"
"\t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n"
"\n"
-"Report bugs to tz@elsie.nci.nih.gov.\n"
+"Report bugs to %s.\n"
msgstr ""
"%s: el modo de empleo es %s [ --version ] [ -v ] [ -l hora_local ] [ -p reglasposix ] \\\n"
" [ -d directorio ] [ -L segundos_intercalares ] [ -y tipoaño ] [ fichero ... ]\n"
"\n"
-"Comunicar errores a tz@elstz@elsie.nci.nih.gov.\n"
+"Comunicar errores a %s.\n"
-#: timezone/zic.c:496
+#: timezone/zic.c:460
msgid "wild compilation-time specification of zic_t"
msgstr "especificación de zic_t en tiempo de compilación descabellada"
-#: timezone/zic.c:515
+#: timezone/zic.c:479
#, c-format
msgid "%s: More than one -d option specified\n"
msgstr "%s: La opción -d se ha especificado más de una vez\n"
-#: timezone/zic.c:525
+#: timezone/zic.c:489
#, c-format
msgid "%s: More than one -l option specified\n"
msgstr "%s: La opción -l se ha especificado más de una vez\n"
-#: timezone/zic.c:535
+#: timezone/zic.c:499
#, c-format
msgid "%s: More than one -p option specified\n"
msgstr "%s: La opción -p se ha especificado más de una vez\n"
-#: timezone/zic.c:545
+#: timezone/zic.c:509
#, c-format
msgid "%s: More than one -y option specified\n"
msgstr "%s: La opción -y se ha especificado más de una vez\n"
-#: timezone/zic.c:555
+#: timezone/zic.c:519
#, c-format
msgid "%s: More than one -L option specified\n"
msgstr "%s: La opción -L se ha especificado más de una vez\n"
-#: timezone/zic.c:604
+#: timezone/zic.c:566
msgid "link to link"
msgstr "enlace a un enlace"
-#: timezone/zic.c:669
+#: timezone/zic.c:629
msgid "hard link failed, symbolic link used"
msgstr "el enlace duro falló, se usará un enlace simbólico"
-#: timezone/zic.c:677
+#: timezone/zic.c:637
#, c-format
msgid "%s: Can't link from %s to %s: %s\n"
msgstr "%s: No se pudo crear un enlace de %s a %s: %s\n"
-#: timezone/zic.c:749 timezone/zic.c:751
+#: timezone/zic.c:697 timezone/zic.c:699
msgid "same rule name in multiple files"
msgstr "mismo nombre de regla en varios ficheros"
-#: timezone/zic.c:792
+#: timezone/zic.c:740
msgid "unruly zone"
msgstr "zona sin reglas"
-#: timezone/zic.c:799
+#: timezone/zic.c:747
#, c-format
msgid "%s in ruleless zone"
msgstr "%s en una zona sin reglas"
-#: timezone/zic.c:820
+#: timezone/zic.c:767
msgid "standard input"
msgstr "entrada estándar"
-#: timezone/zic.c:825
+#: timezone/zic.c:772
#, c-format
msgid "%s: Can't open %s: %s\n"
msgstr "%s: No se puede abrir %s: %s\n"
-#: timezone/zic.c:836
+#: timezone/zic.c:783
msgid "line too long"
msgstr "línea demasiado larga"
-#: timezone/zic.c:856
+#: timezone/zic.c:803
msgid "input line of unknown type"
msgstr "línea de entrada de tipo desconocido"
@@ -7213,7 +7373,7 @@ msgstr "línea de entrada de tipo desconocido"
# Segundo, según he visto en la documentación, sólo existe un fichero
# de leap lines, por eso pongo 'el'... em+
#
-#: timezone/zic.c:872
+#: timezone/zic.c:819
#, c-format
msgid "%s: Leap line in non leap seconds file %s\n"
msgstr ""
@@ -7221,83 +7381,83 @@ msgstr ""
"ajuste de años bisiestos %s\n"
# Ídem. 1984.
-#: timezone/zic.c:879 timezone/zic.c:1316 timezone/zic.c:1338
+#: timezone/zic.c:826 timezone/zic.c:1243 timezone/zic.c:1265
#, c-format
msgid "%s: panic: Invalid l_value %d\n"
msgstr "%s: grave: valor_l %d inválido\n"
-#: timezone/zic.c:887
+#: timezone/zic.c:834
#, c-format
msgid "%s: Error reading %s\n"
msgstr "%s: Error al leer %s\n"
-#: timezone/zic.c:894
+#: timezone/zic.c:841
#, c-format
msgid "%s: Error closing %s: %s\n"
msgstr "%s: Error al cerrar %s: %s\n"
-#: timezone/zic.c:899
+#: timezone/zic.c:846
msgid "expected continuation line not found"
msgstr "la línea de continuación esperada no se encuentra"
# Sugerencia: Desbordamiento de fecha. (?) sv+
-#: timezone/zic.c:943 timezone/zic.c:2480 timezone/zic.c:2499
+#: timezone/zic.c:887 timezone/zic.c:2411 timezone/zic.c:2425
msgid "time overflow"
msgstr "desbordamiento horario"
-#: timezone/zic.c:947
+#: timezone/zic.c:891
msgid "24:00 not handled by pre-1998 versions of zic"
msgstr "24:00 no se puede tratar por versiones de zic anteriores a 1998"
-#: timezone/zic.c:950
+#: timezone/zic.c:894
msgid "values over 24 hours not handled by pre-2007 versions of zic"
msgstr "las versiones de zic anteriores a 2007 no manejan valores por encima de 24 horas"
-#: timezone/zic.c:963
+#: timezone/zic.c:905
msgid "wrong number of fields on Rule line"
msgstr "número incorrecto de argumentos en la línea de regla (Rule)"
-#: timezone/zic.c:967
+#: timezone/zic.c:909
msgid "nameless rule"
msgstr "regla sin nombre"
-#: timezone/zic.c:972
+#: timezone/zic.c:914
msgid "invalid saved time"
msgstr "la hora almacenada no es válida"
-#: timezone/zic.c:993
+#: timezone/zic.c:932
msgid "wrong number of fields on Zone line"
msgstr "número de campos incorrecto en la línea de zona (Zone)"
-#: timezone/zic.c:999
+#: timezone/zic.c:938
#, c-format
msgid "\"Zone %s\" line and -l option are mutually exclusive"
msgstr "la línea \"Zone %s\" y la opción -l son mutuamente excluyentes"
-#: timezone/zic.c:1007
+#: timezone/zic.c:946
#, c-format
msgid "\"Zone %s\" line and -p option are mutually exclusive"
msgstr "la línea \"Zone %s\" y la opción -p son mutuamente excluyentes"
-#: timezone/zic.c:1019
+#: timezone/zic.c:958
#, c-format
msgid "duplicate zone name %s (file \"%s\", line %d)"
msgstr "nombre de zona %s duplicado (fichero \"%s\", línea %d)"
-#: timezone/zic.c:1035
+#: timezone/zic.c:972
msgid "wrong number of fields on Zone continuation line"
msgstr "número de campos incorrecto en la línea de continuación de zona (Zone)"
-#: timezone/zic.c:1075
+#: timezone/zic.c:1009
msgid "invalid UTC offset"
msgstr "desplazamiento UTC inválido"
-#: timezone/zic.c:1078
+#: timezone/zic.c:1012
msgid "invalid abbreviation format"
msgstr "formato de abreviatura incorrecto"
# VER
-#: timezone/zic.c:1107
+#: timezone/zic.c:1041
msgid "Zone continuation line end time is not after end time of previous line"
msgstr ""
"La línea de continuación de la zona no está después del tiempo de final\n"
@@ -7313,148 +7473,147 @@ msgstr ""
# Si es mejor, ponlo en todos los sitios. Y si no, en ninguno.
# Yo creo que es mucho mejor poner "número incorrecto ..."
# Si no, queda como "al revés". sv+
-#: timezone/zic.c:1135
+#: timezone/zic.c:1066
msgid "wrong number of fields on Leap line"
msgstr "número incorrecto de campos en la línea de bisiesto (Leap)"
-#: timezone/zic.c:1144
+#: timezone/zic.c:1075
msgid "invalid leaping year"
msgstr "año bisiesto inválido"
-#: timezone/zic.c:1164 timezone/zic.c:1270
+#: timezone/zic.c:1095 timezone/zic.c:1197
msgid "invalid month name"
msgstr "nombre de mes incorrecto"
-#: timezone/zic.c:1177 timezone/zic.c:1383 timezone/zic.c:1397
+#: timezone/zic.c:1108 timezone/zic.c:1310 timezone/zic.c:1324
msgid "invalid day of month"
msgstr "día del mes inválido"
-#: timezone/zic.c:1182
+#: timezone/zic.c:1113
msgid "time before zero"
msgstr "hora antes de cero"
-#: timezone/zic.c:1186
+#: timezone/zic.c:1117
msgid "time too small"
msgstr "tiempo demasiado pequeño"
-#: timezone/zic.c:1190
+#: timezone/zic.c:1121
msgid "time too large"
msgstr "tiempo demasiado grande"
-#: timezone/zic.c:1194 timezone/zic.c:1299
+#: timezone/zic.c:1125 timezone/zic.c:1226
msgid "invalid time of day"
msgstr "hora del día inválida"
-#: timezone/zic.c:1213
+#: timezone/zic.c:1144
msgid "illegal CORRECTION field on Leap line"
msgstr "El campo CORRECTION en la línea de año bisiesto es ilegal"
-#: timezone/zic.c:1218
+#: timezone/zic.c:1149
msgid "illegal Rolling/Stationary field on Leap line"
msgstr "Campo Rolling/Stationary ilegal en la línea de año bisiesto"
-#: timezone/zic.c:1234
+#: timezone/zic.c:1163
msgid "wrong number of fields on Link line"
msgstr "número incorrecto de campos en la línea de enlace (Link)"
-#: timezone/zic.c:1238
+#: timezone/zic.c:1167
msgid "blank FROM field on Link line"
msgstr "Campo FROM vacío en la línea `Link'"
-#: timezone/zic.c:1242
+#: timezone/zic.c:1171
msgid "blank TO field on Link line"
msgstr "Campo TO vacío en la línea `Link'"
-#: timezone/zic.c:1320
+#: timezone/zic.c:1247
msgid "invalid starting year"
msgstr "año de comienzo inválido"
-#: timezone/zic.c:1342
+#: timezone/zic.c:1269
msgid "invalid ending year"
msgstr "año de final inválido"
-#: timezone/zic.c:1346
+#: timezone/zic.c:1273
msgid "starting year greater than ending year"
msgstr "año de comienzo mayor que año de final"
-#: timezone/zic.c:1353
+#: timezone/zic.c:1280
msgid "typed single year"
msgstr "tecleado un único año"
-#: timezone/zic.c:1388
+#: timezone/zic.c:1315
msgid "invalid weekday name"
msgstr "nombre del día de la semana incorrecto"
-#: timezone/zic.c:1566
+#: timezone/zic.c:1481
#, c-format
msgid "%s: Can't remove %s: %s\n"
msgstr "%s: No se puede eliminar %s: %s\n"
-#: timezone/zic.c:1576
+#: timezone/zic.c:1491
#, c-format
msgid "%s: Can't create %s: %s\n"
msgstr "%s: No se puede crear %s: %s\n"
-#: timezone/zic.c:1726
+#: timezone/zic.c:1683
#, c-format
msgid "%s: Error writing %s\n"
msgstr "%s: Error al escribir %s\n"
-#: timezone/zic.c:2019
+#: timezone/zic.c:1964
msgid "no POSIX environment variable for zone"
msgstr "no hay ninguna variable de entorno POSIX para la zona"
# FUZZY
-#: timezone/zic.c:2176
+#: timezone/zic.c:2131
msgid "can't determine time zone abbreviation to use just after until time"
msgstr ""
"No se puede determinar la abreviación de zona horaria que se usará justo\n"
"después"
-#: timezone/zic.c:2222
+#: timezone/zic.c:2175
msgid "too many transitions?!"
msgstr "¡¿demasiadas transiciones?!"
-#: timezone/zic.c:2241
+#: timezone/zic.c:2190
msgid "internal error - addtype called with bad isdst"
msgstr "error interno - se llamó a `addtype' con un `isdst' erróneo"
-#: timezone/zic.c:2245
+#: timezone/zic.c:2194
msgid "internal error - addtype called with bad ttisstd"
msgstr "error interno - se llamó a `addtype' con un `ttisstd' erróneo"
-#: timezone/zic.c:2249
+#: timezone/zic.c:2198
msgid "internal error - addtype called with bad ttisgmt"
msgstr "error interno - se llamó a `addtype' con un `ttisgmt' erróneo"
-#: timezone/zic.c:2268
+#: timezone/zic.c:2217
msgid "too many local time types"
msgstr "demasiados tipos de hora local"
-#: timezone/zic.c:2272
+#: timezone/zic.c:2221
msgid "UTC offset out of range"
msgstr "desplazamiento UTC fuera de rango"
-#: timezone/zic.c:2300
+#: timezone/zic.c:2245
msgid "too many leap seconds"
msgstr "demasiados segundos intercalares"
-#: timezone/zic.c:2306
+#: timezone/zic.c:2251
msgid "repeated leap second moment"
msgstr "segundo intercalar repetido"
# # Otra opción, resultado incongruente al ejecutar la orden em
-#: timezone/zic.c:2358
+#: timezone/zic.c:2301
msgid "Wild result from command execution"
msgstr "Resultado salvaje en la ejecución de la orden"
-# FIXME: `%s'
-#: timezone/zic.c:2359
+#: timezone/zic.c:2302
#, c-format
msgid "%s: command was '%s', result was %d\n"
-msgstr "%s: la orden fue `%s', el resultado fue %d\n"
+msgstr "%s: la orden fue '%s', el resultado fue %d\n"
-#: timezone/zic.c:2457
+#: timezone/zic.c:2393
msgid "Odd number of quotation marks"
msgstr "Número impar de comillas"
@@ -7463,40 +7622,40 @@ msgstr "Número impar de comillas"
# se entiende mejor. no sé. sv
# Si, estas pensando lo mismo que yo, 29 de febrero puede confundir, porque
# en el fichero pondrá 2/29 em
-#: timezone/zic.c:2546
+#: timezone/zic.c:2470
msgid "use of 2/29 in non leap-year"
msgstr "uso de 2/29 en un año no bisiesto"
-#: timezone/zic.c:2581
+#: timezone/zic.c:2505
msgid "rule goes past start/end of month--will not work with pre-2004 versions of zic"
msgstr "la regla sobrepasa el comienzo/final del mes--no funcionará con versiones de zic anteriores a 2004"
-#: timezone/zic.c:2613
+#: timezone/zic.c:2536
msgid "time zone abbreviation lacks alphabetic at start"
msgstr "la abreviatura de la zona horaria no comienza con un carácter alfabético"
-#: timezone/zic.c:2615
-msgid "time zone abbreviation has more than 3 alphabetics"
-msgstr "la abreviatura de la zona horaria tiene más de 3 caracteres alfabéticos"
+#: timezone/zic.c:2538
+msgid "time zone abbreviation has fewer than 3 alphabetics"
+msgstr "la abreviatura de la zona horaria tiene menos de 3 caracteres alfabéticos"
-#: timezone/zic.c:2617
+#: timezone/zic.c:2540
msgid "time zone abbreviation has too many alphabetics"
msgstr "la abreviatura de la zona horaria tiene demasiados caracteres alfabéticos"
-#: timezone/zic.c:2627
+#: timezone/zic.c:2550
msgid "time zone abbreviation differs from POSIX standard"
msgstr "la abreviatura de la zona horaria difiere del estándar POSIX"
-#: timezone/zic.c:2639
+#: timezone/zic.c:2562
msgid "too many, or too long, time zone abbreviations"
msgstr "demasiadas abreviaturas de zona horaria, o demasiado largas"
-#: timezone/zic.c:2680
+#: timezone/zic.c:2602
#, c-format
msgid "%s: Can't create directory %s: %s\n"
msgstr "%s: No se puede crear el directorio %s: %s\n"
-#: timezone/zic.c:2702
+#: timezone/zic.c:2623
#, c-format
msgid "%s: %d did not sign extend correctly\n"
msgstr "%s: %d no extendió el signo correctamente\n"
diff --git a/libc/ports/ChangeLog.aarch64 b/libc/ports/ChangeLog.aarch64
index c427f988a..e8365091d 100644
--- a/libc/ports/ChangeLog.aarch64
+++ b/libc/ports/ChangeLog.aarch64
@@ -1,3 +1,20 @@
+2013-03-14 Andreas Schwab <schwab@suse.de>
+
+ * sysdeps/unix/sysv/linux/aarch64/configure.in: Set
+ libc_cv_slibdir, libdir and libc_cv_localedir.
+ * sysdeps/unix/sysv/linux/aarch64/configure: Regenerate.
+
+2013-03-11 Andreas Schwab <schwab@suse.de>
+
+ [BZ #15234]
+ * sysdeps/unix/sysv/linux/aarch64/nptl/libpthread.abilist
+ (GLIBC_2.17): Remove pthread_atfork.
+
+2013-03-07 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/aarch64/bits/mman.h: Remove all defines
+ provided by bits/mman-linux.h and include <bits/mman-linux.h>.
+
2013-02-18 Siddhesh Poyarekar <siddhesh@redhat.com>
* sysdeps/unix/sysv/linux/aarch64/nptl/libc.abilist: Add
diff --git a/libc/ports/ChangeLog.alpha b/libc/ports/ChangeLog.alpha
index 2814559a0..9a77d276a 100644
--- a/libc/ports/ChangeLog.alpha
+++ b/libc/ports/ChangeLog.alpha
@@ -1,3 +1,9 @@
+2013-03-06 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/alpha/bits/mman.h (MAP_HUGE_MASK)
+ (MAP_HUGE_SHIFT): Define.
+ * sysdeps/unix/sysv/linux/alpha/bits/msq.h (MSG_COPY): Define.
+
2013-02-19 Richard Henderson <rth@redhat.com>
[BZ #14920]
diff --git a/libc/ports/ChangeLog.am33 b/libc/ports/ChangeLog.am33
index 2bb7893f9..42548b2c2 100644
--- a/libc/ports/ChangeLog.am33
+++ b/libc/ports/ChangeLog.am33
@@ -1,3 +1,8 @@
+2013-03-11 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/am33/bits/mman.h: Remove all defines
+ provided by bits/mman-linux.h and include <bits/mman-linux.h>.
+
2013-02-28 Joseph Myers <joseph@codesourcery.com>
* sysdeps/am33/elf/start.S: Don't include "bp-sym.h".
diff --git a/libc/ports/ChangeLog.arm b/libc/ports/ChangeLog.arm
index 28ec8f96a..f215f023d 100644
--- a/libc/ports/ChangeLog.arm
+++ b/libc/ports/ChangeLog.arm
@@ -1,3 +1,193 @@
+2013-03-15 Roland McGrath <roland@hack.frob.com>
+
+ * sysdeps/arm/sysdep.h [!ARM_SFI_MACROS] (sfi_sp): New macro.
+ * sysdeps/arm/__longjmp.S: Use it.
+
+ * sysdeps/arm/sysdep.h [!ARM_SFI_MACROS]
+ (ARM_SFI_MACROS): Define it.
+ (sfi_breg, sfi_pld): New assembler macros.
+ * sysdeps/arm/__longjmp.S: Use them for all memory references not
+ through the pc or sp registers.
+ * sysdeps/arm/add_n.S: Likewise.
+ * sysdeps/arm/addmul_1.S: Likewise.
+ * sysdeps/arm/arm-mcount.S: Likewise.
+ * sysdeps/arm/armv6/rawmemchr.S: Likewise.
+ * sysdeps/arm/armv6/strchr.S: Likewise.
+ * sysdeps/arm/armv6/strcpy.S: Likewise.
+ * sysdeps/arm/armv6/strlen.S: Likewise.
+ * sysdeps/arm/armv6/strrchr.S: Likewise.
+ * sysdeps/arm/armv6t2/memchr.S: Likewise.
+ * sysdeps/arm/memcpy.S: Likewise.
+ * sysdeps/arm/memmove.S: Likewise.
+ * sysdeps/arm/memset.S: Likewise.
+ * sysdeps/arm/setjmp.S: Likewise.
+ * sysdeps/arm/strlen.S: Likewise.
+ * sysdeps/arm/submul_1.S: Likewise.
+
+2013-03-13 Roland McGrath <roland@hack.frob.com>
+
+ * sysdeps/arm/arm-features.h (ARM_BX_ALIGN_LOG2): New macro.
+ * sysdeps/arm/memcpy.S: Respect ARM_BX_ALIGN_LOG2.
+ * sysdeps/arm/memmove.S: Likewise.
+
+ * sysdeps/arm/add_n.S: Include <arm-features.h>.
+ [ARM_ALWAYS_BX]: Don't pop into pc.
+
+ * sysdeps/arm/arm-features.h: Add comment about ARM_ALWAYS_BX.
+ * sysdeps/arm/memcpy.S: Include <arm-features.h>.
+ [ARM_ALWAYS_BX]: Avoid pc as destination.
+ * sysdeps/arm/memmove.S: Likewise.
+
+2013-03-12 Roland McGrath <roland@hack.frob.com>
+
+ * sysdeps/arm/armv6t2/memchr.S [NO_THUMB]:
+ Use .arm rather than .thumb, .thumb_func. Avoid cbz/cnbz instructions.
+
+ * sysdeps/arm/armv6t2/memchr.S: Change register allocation so ldrd use
+ is r4,r5 rather than r5,r6; this way ARM mode will allow that ldrd.
+
+2013-03-11 Joseph Myers <joseph@codesourcery.com>
+
+ * sysdeps/arm/preconfigure.in: Add comment about
+ -fno-unwind-tables addition to CFLAGS.
+ * sysdeps/arm/preconfigure: Regenerated.
+ * sysdeps/unix/sysv/linux/arm/configure.in: Add comment about
+ -fno-unwind-tables removal from CFLAGS.
+ * sysdeps/unix/sysv/linux/arm/configure: Regenerated.
+
+2013-03-11 Roland McGrath <roland@hack.frob.com>
+
+ * sysdeps/arm/bits/setjmp.h: Test [!__ASSEMBLER__] rather than [!_ASM].
+ * sysdeps/arm/jmpbuf-offsets.h: File removed.
+ * sysdeps/arm/jmpbuf-unwind.h: Don't #include it.
+ * sysdeps/arm/include/bits/setjmp.h: New file.
+ * sysdeps/arm/setjmp.S (_SETJMP_H, _ASM): Macros removed.
+ Use JMP_BUF_REGLIST macro.
+ * sysdeps/arm/__longjmp.S: Likewise.
+
+ * sysdeps/arm/memcpy.S: Convert to unified assembly syntax.
+ * sysdeps/arm/memmove.S: Likewise.
+ * sysdeps/arm/memset.S: Likewise.
+ * sysdeps/arm/strlen.S: Likewise.
+
+ * sysdeps/arm/memcpy.S: Use r10 instead of r9.
+ * sysdeps/arm/memmove.S: Likewise.
+
+ * sysdeps/arm/preconfigure.in: New file.
+ * sysdeps/arm/preconfigure: Replaced with generated file.
+
+2013-03-11 Andreas Schwab <schwab@suse.de>
+
+ [BZ #15234]
+ * sysdeps/unix/sysv/linux/arm/nptl/libpthread.abilist (GLIBC_2.4):
+ Remove pthread_atfork.
+
+2013-03-06 Richard Henderson <rth@redhat.com>
+
+ * sysdeps/arm/armv6/rawmemchr.S: New file.
+ * sysdeps/arm/armv6/stpcpy.S: New file.
+ * sysdeps/arm/armv6/strchr.S: New file.
+ * sysdeps/arm/armv6/strcpy.S: New file.
+ * sysdeps/arm/armv6/strlen.S: New file.
+ * sysdeps/arm/armv6/strrchr.S: New file.
+ * sysdeps/arm/armv6t2/Implies: New file.
+
+2013-03-06 Richard Henderson <rth@redhat.com>
+
+ * sysdeps/arm/add_n.S: New file.
+ * sysdeps/arm/sub_n.S: New file.
+ * sysdeps/arm/submul_1.S: New file.
+ * sysdeps/arm/addmul_1.S: New file.
+ * sysdeps/arm/armv6t2/ffs.S: New file.
+ * sysdeps/arm/armv6t2/ffsll.S: New file.
+
+ * sysdeps/arm/sysdep.h (ARCH_HAS_HARD_TP): New macro.
+ (GET_TLS): Use hard-tp if ARCH_HAS_HARD_TP.
+ * sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S: Likewise.
+ * sysdeps/unix/sysv/linux/arm/sysdep.h (GET_TLS): Don't override
+ the default definition if ARCH_HAS_HARD_TP.
+
+ * sysdeps/arm/sysdep.h (__ARM_ARCH): New macro.
+ (ARCH_HAS_BX, ARCH_HAS_BLX, ARCH_HAS_T2): New macros.
+ (BX): Select on ARCH_HAS_BX instead of __USE_BX__.
+ (BLX): Select on ARCH_HAS_BLX instead of __ARM_ARCH_4T__.
+ * ports/sysdeps/arm/dl-machine.h (BX): Select on ARCH_HAS_BX
+ instead of __USE_BX__.
+
+ * sysdeps/arm/arm-mcount.S (_mcount): Use pop into pc unless
+ __ARM_ARCH_4T__ and __THUMB_INTERWORK__.
+ * sysdeps/arm/dl-tlsdesc.S (_dl_tlsdesc_dynamic): Likewise.
+
+ * sysdeps/arm/sysdep.h (BX, BXC, BLX): New macros.
+ (DO_RET): Use BX.
+ (RETINSTR): Use BXC.
+ * sysdeps/arm/dl-tlsdesc.S (BX): Remove.
+ * sysdeps/arm/dl-trampoline.S (BX): Remove.
+ (_dl_runtime_profile): Use BLX.
+
+ * sysdeps/arm/__longjmp.S (__longjmp): Use ldmia insn directly.
+ * sysdeps/arm/sysdep.h (LOADREGS): Remove.
+
+ * sysdeps/arm/arm-mcount.S (_mcount): Use push/pop mnemonics.
+ * sysdeps/arm/crti.S, sysdeps/arm/crtn.S: Likewise.
+ * sysdeps/arm/dl-tlsdesc.S: Likewise.
+ * sysdeps/arm/dl-trampoline.S: Likewise.
+ * sysdeps/arm/start.S: Likewise.
+ * sysdeps/arm/memcpy.S (PULL): Rename macro from pull.
+ (PUSH): Rename macro from push.
+ (memcpy): Use push/pop mnemonics.
+ * sysdeps/arm/memmove.S: Similarly.
+ * sysdeps/arm/sysdep.h (CALL_MCOUNT): Use push/pop mnemonics.
+ * sysdeps/unix/sysv/linux/arm/____longjmp_chk.S: Likewise.
+ * sysdeps/unix/sysv/linux/arm/clone.S: Likewise.
+ * sysdeps/unix/sysv/linux/arm/mmap.S: Likewise.
+ * sysdeps/unix/sysv/linux/arm/mmap64.S: Likewise.
+ * sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h: Likewise.
+ * sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c: Likewise.
+ * sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c: Likewise.
+ * sysdeps/unix/sysv/linux/arm/syscall.S: Likewise.
+ * sysdeps/unix/sysv/linux/arm/sysdep.h: Likewise.
+ * sysdeps/unix/sysv/linux/arm/vfork.S: Likewise.
+
+ * sysdeps/arm/sysdep.h [__ASSEMBLER__]: Enable thumb2 if __thumb2__.
+ (PC_OFS): Respect __thumb__ if __ASSEMBLER__.
+
+ * sysdeps/arm/sysdep.h (GET_TLS): New macro.
+ * sysdeps/arm/dl-tlsdesc.S (_dl_tlsdesc_undefweak): Use it.
+ (_dl_tlsdesc_dynamic): Likewise.
+ * sysdeps/unix/arm/sysdep.S (__syscall_error): Likewise.
+ * sysdeps/unix/sysv/linux/arm/sysdep.h (GET_TLS): New macro.
+ * sysdeps/unix/sysv/linux/arm/clone.S (__clone): Likewise.
+ * sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S (SAVE_PID): Likewise.
+ * sysdeps/unix/sysv/linux/arm/nptl/vfork.S (SAVE_PID): Likewise.
+ * sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h (SINGLE_THREAD_P):
+ Likewise.
+ * sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S (__aeabi_read_tp):
+ Add thumb2 alternative.
+
+ * sysdeps/arm/sysdep.h (NEGOFF_ADJ_BASE): New macro.
+ (NEGOFF_ADJ_BASE2, NEGOFF_OFF1, NEGOFF_OFF2): New macros.
+ * sysdeps/unix/sysv/linux/arm/clone.S (__clone): Use them.
+ * sysdeps/unix/sysv/linux/arm/nptl/vfork.S: Likewise.
+ * sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S: Likewise.
+ * sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h (SINGLE_THREAD_P):
+ Likewise.
+
+ * sysdeps/arm/sysdep.h (LDST_PCREL): New macro.
+ * sysdeps/unix/arm/sysdep.S (__syscall_error): Use LDST_PCREL.
+ Fix up gottpoff load of errno for thumb2.
+ * sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h
+ (SINGLE_THREAD_P): Use LDST_PCREL.
+ (PSEUDO_PROLOGUE): Remove.
+ (PSEUDO): Don't use it.
+ * sysdeps/unix/sysv/linux/arm/sysdep.h (SYSCALL_ERROR_HANDLER):
+ Use LDST_PCREL.
+
+2013-03-06 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/arm/bits/mman.h: Remove all defines
+ provided by bits/mman-linux.h and include <bits/mman-linux.h>.
+
2013-02-28 Richard Henderson <rth@redhat.com>
* sysdeps/arm/preconfigure: Adjust scan for __ARM_ARCH_* defines.
diff --git a/libc/ports/ChangeLog.hppa b/libc/ports/ChangeLog.hppa
index 6314f1269..0610c177d 100644
--- a/libc/ports/ChangeLog.hppa
+++ b/libc/ports/ChangeLog.hppa
@@ -1,3 +1,9 @@
+2013-03-06 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/hppa/bits/msq.h (MSG_COPY): Define.
+ * ports/sysdeps/unix/sysv/linux/hppa/bits/mman.h (MAP_HUGE_MASK)
+ (MAP_HUGE_SHIFT): Define.
+
2013-02-14 Carlos O'Donell <carlos@redhat.com>
* sysdeps/unix/sysv/linux/hppa/nptl/lowlevellock.c
diff --git a/libc/ports/ChangeLog.ia64 b/libc/ports/ChangeLog.ia64
index d9fda457f..50b5604ec 100644
--- a/libc/ports/ChangeLog.ia64
+++ b/libc/ports/ChangeLog.ia64
@@ -1,3 +1,69 @@
+2013-03-12 Mike Frysinger <vapier@gentoo.org>
+
+ * sysdeps/unix/sysv/linux/ia64/sysdep.h (INTERNAL_SYSCALL_DECL): Add
+ __attribute__ ((unused)) to err decl.
+ (INTERNAL_SYSCALL_ERROR_P): Add (void)val dummy reference.
+
+2013-03-12 Mike Frysinger <vapier@gentoo.org>
+
+ * sysdeps/ia64/fpu/libm_error.c (STATIC): Delete redundant definition.
+ (_DECL_NUM, DECL_FLOAT, DECL_DOUBLE, DECL_LONG_DOUBLE): New defines.
+ (float_inf): Change definition to use DECL_FLOAT.
+ (float_huge, float_zero, float_neg_inf, float_neg_huge,
+ float_neg_zero): Likewise.
+ (double_inf): Change definition to use DECL_DOUBLE.
+ (double_huge, double_zero, double_neg_inf, double_neg_huge,
+ double_neg_zero): Likewise.
+ (long_double_inf): Change definition to use DECL_LONG_DOUBLE.
+ (long_double_huge, long_double_zero, long_double_neg_inf,
+ long_double_neg_huge, long_double_neg_zero): Likewise.
+ (RETVAL_HUGE_VALL): Change from casting a pointer to using the num
+ field of the union.
+ (RETVAL_NEG_HUGE_VALL, RETVAL_HUGEL, RETVAL_NEG_HUGEL,
+ RETVAL_HUGE_VALL, RETVAL_NEG_HUGE_VALL, RETVAL_HUGEL,
+ RETVAL_NEG_HUGEL, RETVAL_HUGE_VALD, RETVAL_NEG_HUGE_VALD,
+ RETVAL_HUGED, RETVAL_NEG_HUGED, RETVAL_HUGE_VALF,
+ RETVAL_NEG_HUGE_VALF, RETVAL_HUGEF, RETVAL_NEG_HUGEF,
+ ZEROL_VALUE, ZEROD_VALUE, ZEROF_VALUE, RETVAL_ZEROL,
+ RETVAL_ZEROD, RETVAL_ZEROF, RETVAL_NEG_ZEROL, RETVAL_NEG_ZEROD,
+ RETVAL_NEG_ZEROF): Likewise.
+
+2013-03-12 Mike Frysinger <vapier@gentoo.org>
+
+ * sysdeps/ia64/dl-fptr.h (ELF_PTR_TO_FDESC): New definition.
+ * sysdeps/ia64/dl-machine.h (elf_machine_runtime_setup): Change
+ struct fdesc * casts to use new ELF_PTR_TO_FDESC helper.
+ * sysdeps/ia64/entry.h: Include link.h and dl-fptr.h.
+ (ENTRY_POINT): Change cast to use new ELF_PTR_TO_FDESC helper.
+ * sysdeps/unix/sysv/linux/ia64/makecontext.c: Include link.h and
+ dl-fptr.h.
+ (struct fdesc): Remove structure, now redundant.
+ (makecontext): Change casts to use new ELF_PTR_TO_FDESC helper.
+
+2013-03-11 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/ia64/bits/mman.h: Remove all defines
+ provided by bits/mman-linux.h and include <bits/mman-linux.h>.
+
+2013-03-10 Mike Frysinger <vapier@gentoo.org>
+
+ * sysdeps/unix/sysv/linux/ia64/makecontext.c (__makecontext): Change
+ type of rbs to unsigned. Change stack_start cast to unsigned.
+
+2013-03-10 Mike Frysinger <vapier@gentoo.org>
+
+ * sysdeps/unix/sysv/linux/ia64/nptl/dl-sysdep.h:
+ Change multiple inclusion guard to _LINUX_IA64_DL_SYSDEP_H.
+ Use #include_next.
+ (RTLD_PRIVATE_ERRNO): Remove definition, now redundant.
+ (NEED_DL_SYSINFO, _dl_discover_osversion,
+ HAVE_DL_DISCOVER_OSVERSION): Likewise.
+
+2013-03-06 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/ia64/bits/msq.h (MSG_COPY): Define.
+ (MSG_EXCEPT): Make conditional on __USE_GNU.
+
2013-02-18 Siddhesh Poyarekar <siddhesh@redhat.com>
* sysdeps/unix/sysv/linux/ia64/nptl/libc.abilist: Add
diff --git a/libc/ports/ChangeLog.m68k b/libc/ports/ChangeLog.m68k
index e7cb81e8f..5e4fc6c46 100644
--- a/libc/ports/ChangeLog.m68k
+++ b/libc/ports/ChangeLog.m68k
@@ -1,3 +1,14 @@
+2013-03-11 Andreas Schwab <schwab@suse.de>
+
+ [BZ #15234]
+ * sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libpthread.abilist
+ (GLIBC_2.4): Remove pthread_atfork.
+
+2013-03-06 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/m68k/bits/mman.h: Remove all defines
+ provided by bits/mman-linux.h and include <bits/mman-linux.h>.
+
2013-02-18 Siddhesh Poyarekar <siddhesh@redhat.com>
* sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libc.abilist: Add
diff --git a/libc/ports/ChangeLog.mips b/libc/ports/ChangeLog.mips
index 251806572..be2e2d50c 100644
--- a/libc/ports/ChangeLog.mips
+++ b/libc/ports/ChangeLog.mips
@@ -1,3 +1,16 @@
+2013-03-15 Thomas Schwinge <thomas@codesourcery.com>
+
+ * sysdeps/unix/sysv/linux/mips/bits/mman.h [__USE_MISC]
+ (MAP_ANONYMOUS): Don't define.
+
+2013-03-06 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/mips/bits/mman.h: Remove all defines
+ provided by bits/mman-linux.h and include <bits/mman-linux.h>.
+ (__MAP_ANONYMOUS): Define.
+
+ * sysdeps/unix/sysv/linux/mips/bits/msq.h (MSG_COPY): Define.
+
2013-02-27 Chung-Lin Tang <cltang@codesourcery.com>
Maciej W. Rozycki <macro@codesourcery.com>
Maxim Kuvyrkov <maxim@codesourcery.com>
diff --git a/libc/ports/ChangeLog.tile b/libc/ports/ChangeLog.tile
index 6184bf6a0..f63bde486 100644
--- a/libc/ports/ChangeLog.tile
+++ b/libc/ports/ChangeLog.tile
@@ -1,3 +1,18 @@
+2013-03-11 Andreas Schwab <schwab@suse.de>
+
+ [BZ #15234]
+ * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libpthread.abilist
+ (GLIBC_2.12): Remove pthread_atfork.
+ * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libpthread.abilist
+ (GLIBC_2.12): Likewise.
+ * sysdeps/unix/sysv/linux/tile/tilepro/nptl/libpthread.abilist
+ (GLIBC_2.12): Likewise.
+
+2013-03-05 Andreas Jaeger <aj@suse.de>
+
+ * sysdeps/unix/sysv/linux/tile/bits/mman.h: Remove all defines
+ provided by bits/mman-linux.h and include <bits/mman-linux.h>.
+
2013-02-28 Chris Metcalf <cmetcalf@tilera.com>
* sysdeps/unix/sysv/linux/tile/nptl/lowlevellock.h
diff --git a/libc/ports/sysdeps/arm/__longjmp.S b/libc/ports/sysdeps/arm/__longjmp.S
index a3a2a8aec..8de9fa1c7 100644
--- a/libc/ports/sysdeps/arm/__longjmp.S
+++ b/libc/ports/sysdeps/arm/__longjmp.S
@@ -19,8 +19,6 @@
/* ??? Needs more rearrangement for the LDM to handle thumb mode. */
#define NO_THUMB
#include <sysdep.h>
-#define _SETJMP_H
-#define _ASM
#include <bits/setjmp.h>
#include <rtld-global-offsets.h>
#include <arm-features.h>
@@ -33,11 +31,13 @@ ENTRY (__longjmp)
moveq r0, #1 /* can't let setjmp() return zero! */
#ifdef CHECK_SP
- ldr r4, [ip, #32] /* jmpbuf's sp */
+ sfi_breg ip, \
+ ldr r4, [\B, #32] /* jmpbuf's sp */
cfi_undefined (r4)
CHECK_SP (r4)
#endif
- LOADREGS(ia, ip!, {v1-v6, sl, fp, sp, lr})
+ sfi_sp sfi_breg ip, \
+ ldmia \B!, JMP_BUF_REGLIST
cfi_restore (v1)
cfi_restore (v2)
cfi_restore (v3)
@@ -81,9 +81,11 @@ ENTRY (__longjmp)
/* Restore the VFP registers. */
/* Following instruction is vldmia ip!, {d8-d15}. */
- ldc p11, cr8, [r12], #64
+ sfi_breg r12, \
+ ldc p11, cr8, [\B], #64
/* Restore the floating-point status register. */
- ldr a3, [ip], #4
+ sfi_breg ip, \
+ ldr a3, [\B], #4
/* Following instruction is fmxr fpscr, a3. */
mcr p10, 7, a3, cr1, cr0, 0
.Lno_vfp:
@@ -94,12 +96,18 @@ ENTRY (__longjmp)
/* Restore the call-preserved iWMMXt registers. */
/* Following instructions are wldrd wr10, [ip], #8 (etc.) */
- ldcl p1, cr10, [r12], #8
- ldcl p1, cr11, [r12], #8
- ldcl p1, cr12, [r12], #8
- ldcl p1, cr13, [r12], #8
- ldcl p1, cr14, [r12], #8
- ldcl p1, cr15, [r12], #8
+ sfi_breg r12, \
+ ldcl p1, cr10, [\B], #8
+ sfi_breg r12, \
+ ldcl p1, cr11, [\B], #8
+ sfi_breg r12, \
+ ldcl p1, cr12, [\B], #8
+ sfi_breg r12, \
+ ldcl p1, cr13, [\B], #8
+ sfi_breg r12, \
+ ldcl p1, cr14, [\B], #8
+ sfi_breg r12, \
+ ldcl p1, cr15, [\B], #8
.Lno_iwmmxt:
#endif
diff --git a/libc/ports/sysdeps/arm/add_n.S b/libc/ports/sysdeps/arm/add_n.S
new file mode 100644
index 000000000..c6b014797
--- /dev/null
+++ b/libc/ports/sysdeps/arm/add_n.S
@@ -0,0 +1,99 @@
+/* mpn_add_n -- add (or subtract) bignums.
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+#include <arm-features.h>
+
+ .syntax unified
+ .text
+
+#ifdef USE_AS_SUB_N
+# define INITC cmp r0, r0
+# define OPC sbcs
+# define RETC sbc r0, r0, r0; neg r0, r0
+# define FUNC __mpn_sub_n
+#else
+# define INITC cmn r0, #0
+# define OPC adcs
+# define RETC mov r0, #0; adc r0, r0, r0
+# define FUNC __mpn_add_n
+#endif
+
+/* mp_limb_t mpn_add_n(res_ptr, src1_ptr, src2_ptr, size) */
+
+ENTRY (FUNC)
+ push { r4, r5, r6, r7, r8, r10, lr }
+ cfi_adjust_cfa_offset (28)
+ cfi_rel_offset (r4, 0)
+ cfi_rel_offset (r5, 4)
+ cfi_rel_offset (r6, 8)
+ cfi_rel_offset (r7, 12)
+ cfi_rel_offset (r8, 16)
+ cfi_rel_offset (r10, 20)
+ cfi_rel_offset (lr, 24)
+
+ INITC /* initialize carry flag */
+ tst r3, #1 /* count & 1 == 1? */
+ add lr, r1, r3, lsl #2 /* compute end src1 */
+ beq 1f
+
+ sfi_breg r1, \
+ ldr r4, [\B], #4 /* do one to make count even */
+ sfi_breg r2, \
+ ldr r5, [\B], #4
+ OPC r4, r4, r5
+ teq r1, lr /* end of count? (preserve carry) */
+ sfi_breg r0, \
+ str r4, [\B], #4
+ beq 9f
+1:
+ tst r3, #2 /* count & 2 == 2? */
+ beq 2f
+ sfi_breg r1, \
+ ldm \B!, { r4, r5 } /* do two to make count 0 mod 4 */
+ sfi_breg r2, \
+ ldm \B!, { r6, r7 }
+ OPC r4, r4, r6
+ OPC r5, r5, r7
+ teq r1, lr /* end of count? */
+ sfi_breg r0, \
+ stm \B!, { r4, r5 }
+ beq 9f
+2:
+ sfi_breg r1, \
+ ldm \B!, { r3, r5, r7, r10 } /* do four each loop */
+ sfi_breg r2, \
+ ldm \B!, { r4, r6, r8, ip }
+ OPC r3, r3, r4
+ OPC r5, r5, r6
+ OPC r7, r7, r8
+ OPC r10, r10, ip
+ teq r1, lr
+ sfi_breg r0, \
+ stm \B!, { r3, r5, r7, r10 }
+ bne 2b
+
+9:
+ RETC /* copy carry out */
+#ifndef ARM_ALWAYS_BX
+ pop { r4, r5, r6, r7, r8, r10, pc }
+#else
+ pop { r4, r5, r6, r7, r8, r10, lr }
+ bx lr
+#endif
+END (FUNC)
diff --git a/libc/ports/sysdeps/arm/addmul_1.S b/libc/ports/sysdeps/arm/addmul_1.S
new file mode 100644
index 000000000..d204c887e
--- /dev/null
+++ b/libc/ports/sysdeps/arm/addmul_1.S
@@ -0,0 +1,73 @@
+/* mpn_addmul_1 -- multiply and accumulate bignums.
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+ .syntax unified
+ .text
+
+@ cycles/limb
+@ StrongArm ?
+@ Cortex-A8 ?
+@ Cortex-A9 ?
+@ Cortex-A15 4
+
+/* mp_limb_t mpn_addmul_1(res_ptr, src1_ptr, size, s2_limb) */
+
+ENTRY (__mpn_addmul_1)
+ push { r4, r5, r6, r7 }
+ cfi_adjust_cfa_offset (16)
+ cfi_rel_offset (r4, 0)
+ cfi_rel_offset (r5, 4)
+ cfi_rel_offset (r6, 8)
+ cfi_rel_offset (r7, 12)
+
+ sfi_breg r1, \
+ ldr r6, [\B], #4
+ sfi_breg r0, \
+ ldr r5, [\B]
+ mov r4, #0 /* init carry in */
+ b 1f
+0:
+ sfi_breg r1, \
+ ldr r6, [\B], #4 /* load next ul */
+ adds r7, r4, r5 /* (out, c) = cl + lpl */
+ sfi_breg r0, \
+ ldr r5, [\B, #4] /* load next rl */
+ adc r4, ip, #0 /* cl = hpl + c */
+ sfi_breg r0, \
+ str r7, [\B], #4
+1:
+ mov ip, #0 /* zero-extend rl */
+ umlal r5, ip, r6, r3 /* (hpl, lpl) = ul * vl + rl */
+ subs r2, r2, #1
+ bne 0b
+
+ adds r4, r4, r5 /* (out, c) = cl + llpl */
+ sfi_breg r0, \
+ str r4, [\B]
+ adc r0, ip, #0 /* return hpl + c */
+
+ pop { r4, r5, r6, r7 }
+ cfi_adjust_cfa_offset (-16)
+ cfi_restore (r4)
+ cfi_restore (r5)
+ cfi_restore (r6)
+ cfi_restore (r7)
+ DO_RET (lr)
+END (__mpn_addmul_1)
diff --git a/libc/ports/sysdeps/arm/arm-features.h b/libc/ports/sysdeps/arm/arm-features.h
index 31801cf40..5104ba332 100644
--- a/libc/ports/sysdeps/arm/arm-features.h
+++ b/libc/ports/sysdeps/arm/arm-features.h
@@ -36,4 +36,21 @@
at runtime (or that we never care about its state) and so need not
be checked for. */
+/* A more-specific arm-features.h file may define ARM_ALWAYS_BX to indicate
+ that instructions using pc as a destination register must never be used,
+ so a "bx" (or "blx") instruction is always required. */
+
+/* The log2 of the minimum alignment required for an address that
+ is the target of a computed branch (i.e. a "bx" instruction).
+ A more-specific arm-features.h file may define this to set a more
+ stringent requirement.
+
+ Using this only makes sense for code in ARM mode (where instructions
+ always have a fixed size of four bytes), or for Thumb-mode code that is
+ specifically aligning all the related branch targets to match (since
+ Thumb instructions might be either two or four bytes). */
+#ifndef ARM_BX_ALIGN_LOG2
+# define ARM_BX_ALIGN_LOG2 2
+#endif
+
#endif /* arm-features.h */
diff --git a/libc/ports/sysdeps/arm/arm-mcount.S b/libc/ports/sysdeps/arm/arm-mcount.S
index 679d042ba..f61e978f5 100644
--- a/libc/ports/sysdeps/arm/arm-mcount.S
+++ b/libc/ports/sysdeps/arm/arm-mcount.S
@@ -69,7 +69,7 @@ END(__gnu_mcount_nc)
code be compiled with APCS frame pointers. */
ENTRY(_mcount)
- stmdb sp!, {r0, r1, r2, r3, fp, lr}
+ push {r0, r1, r2, r3, fp, lr}
cfi_adjust_cfa_offset (24)
cfi_rel_offset (r0, 0)
cfi_rel_offset (r1, 4)
@@ -79,13 +79,12 @@ ENTRY(_mcount)
cfi_rel_offset (lr, 20)
movs r0, fp
ittt ne
- ldrne r0, [r0, #-4]
+ sfi_breg r0, \
+ ldrne r0, [\B, #-4]
movsne r1, lr
blne __mcount_internal
-#ifdef __thumb2__
- ldmia sp!, {r0, r1, r2, r3, fp, pc}
-#else
- ldmia sp!, {r0, r1, r2, r3, fp, lr}
+#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
+ pop {r0, r1, r2, r3, fp, lr}
cfi_adjust_cfa_offset (-24)
cfi_restore (r0)
cfi_restore (r1)
@@ -94,6 +93,8 @@ ENTRY(_mcount)
cfi_restore (fp)
cfi_restore (lr)
bx lr
+#else
+ pop {r0, r1, r2, r3, fp, pc}
#endif
END(_mcount)
diff --git a/libc/ports/sysdeps/arm/armv6/rawmemchr.S b/libc/ports/sysdeps/arm/armv6/rawmemchr.S
new file mode 100644
index 000000000..b5e4a16f0
--- /dev/null
+++ b/libc/ports/sysdeps/arm/armv6/rawmemchr.S
@@ -0,0 +1,109 @@
+/* rawmemchr -- find a byte within an unsized memory block.
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+ .syntax unified
+ .text
+
+ENTRY (__rawmemchr)
+ @ r0 = start of string
+ @ r1 = character to match
+ @ returns a pointer to the match, which must be present.
+ sfi_breg r0, \
+ ldrb r2, [\B] @ load first byte asap
+
+ @ To cater to long strings, we want to search through a few
+ @ characters until we reach an aligned pointer. To cater to
+ @ small strings, we don't want to start doing word operations
+ @ immediately. The compromise is a maximum of 16 bytes less
+ @ whatever is required to end with an aligned pointer.
+ @ r3 = number of characters to search in alignment loop
+ and r3, r0, #7
+ uxtb r1, r1
+ rsb r3, r3, #15 @ 16 - 1 peeled loop iteration
+ cmp r2, r1
+ it eq
+ bxeq lr
+
+ @ Loop until we find ...
+1: sfi_breg r0, \
+ ldrb r2, [\B, #1]!
+ subs r3, r3, #1 @ ... the alignment point
+ it ne
+ cmpne r2, r1 @ ... or C
+ bne 1b
+
+ @ Disambiguate the exit possibilites above
+ cmp r2, r1 @ Found C
+ it eq
+ bxeq lr
+ add r0, r0, #1
+
+ @ So now we're aligned.
+ sfi_breg r0, \
+ ldrd r2, r3, [\B], #8
+ orr r1, r1, r1, lsl #8 @ Replicate C to all bytes
+#ifdef ARCH_HAS_T2
+ movw ip, #0x0101
+ sfi_pld r0, #64
+ movt ip, #0x0101
+#else
+ ldr ip, =0x01010101
+ sfi_pld r0, #64
+#endif
+ orr r1, r1, r1, lsl #16
+
+ @ Loop searching for C, 8 bytes at a time.
+ @ Subtracting (unsigned saturating) from 1 means result of 1 for
+ @ any byte that was originally zero and 0 otherwise. Therefore
+ @ we consider the lsb of each byte the "found" bit.
+2: eor r2, r2, r1 @ Convert C bytes to 0
+ eor r3, r3, r1
+ uqsub8 r2, ip, r2 @ Find C
+ uqsub8 r3, ip, r3
+ sfi_pld r0, #128
+ orrs r3, r3, r2 @ Test both words for found
+ it eq
+ sfi_breg r0, \
+ ldrdeq r2, r3, [\B], #8
+ beq 2b
+
+ @ Found something. Disambiguate between first and second words.
+ @ Adjust r0 to point to the word containing the match.
+ @ Adjust r2 to the found bits for the word containing the match.
+ cmp r2, #0
+ sub r0, r0, #4
+ ite eq
+ moveq r2, r3
+ subne r0, r0, #4
+
+ @ Find the bit-offset of the match within the word. Note that the
+ @ bit result from clz will be 7 higher than "true", but we'll
+ @ immediately discard those bits converting to a byte offset.
+#ifdef __ARMEL__
+ rev r2, r2 @ For LE, count from the little end
+#endif
+ clz r2, r2
+ add r0, r0, r2, lsr #3 @ Adjust the pointer to the found byte
+ bx lr
+
+END (__rawmemchr)
+
+weak_alias (__rawmemchr, rawmemchr)
+libc_hidden_def (__rawmemchr)
diff --git a/libc/ports/sysdeps/arm/armv6/stpcpy.S b/libc/ports/sysdeps/arm/armv6/stpcpy.S
new file mode 100644
index 000000000..21a4f385b
--- /dev/null
+++ b/libc/ports/sysdeps/arm/armv6/stpcpy.S
@@ -0,0 +1 @@
+/* Defined in strcpy.S. */
diff --git a/libc/ports/sysdeps/arm/armv6/strchr.S b/libc/ports/sysdeps/arm/armv6/strchr.S
new file mode 100644
index 000000000..936c2be66
--- /dev/null
+++ b/libc/ports/sysdeps/arm/armv6/strchr.S
@@ -0,0 +1,147 @@
+/* strchr -- find the first instance of C in a nul-terminated string.
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+ .syntax unified
+ .text
+
+ENTRY (strchr)
+ @ r0 = start of string
+ @ r1 = character to match
+ @ returns NULL for no match, or a pointer to the match
+ sfi_breg r0, \
+ ldrb r2, [\B] @ load the first byte asap
+ uxtb r1, r1
+
+ @ To cater to long strings, we want to search through a few
+ @ characters until we reach an aligned pointer. To cater to
+ @ small strings, we don't want to start doing word operations
+ @ immediately. The compromise is a maximum of 16 bytes less
+ @ whatever is required to end with an aligned pointer.
+ @ r3 = number of characters to search in alignment loop
+ and r3, r0, #7
+ rsb r3, r3, #15 @ 16 - 1 peeled loop iteration
+ cmp r2, r1 @ Found C?
+ it ne
+ cmpne r2, #0 @ Found EOS?
+ beq 99f
+
+ @ Loop until we find ...
+1: sfi_breg r0, \
+ ldrb r2, [\B, #1]!
+ subs r3, r3, #1 @ ... the aligment point
+ it ne
+ cmpne r2, r1 @ ... or the character
+ it ne
+ cmpne r2, #0 @ ... or EOS
+ bne 1b
+
+ @ Disambiguate the exit possibilites above
+ cmp r2, r1 @ Found the character
+ it ne
+ cmpne r2, #0 @ Found EOS
+ beq 99f
+ add r0, r0, #1
+
+ @ So now we're aligned. Now we actually need a stack frame.
+ push { r4, r5, r6, r7 }
+ cfi_adjust_cfa_offset (16)
+ cfi_rel_offset (r4, 0)
+ cfi_rel_offset (r5, 4)
+ cfi_rel_offset (r6, 8)
+ cfi_rel_offset (r7, 12)
+
+ sfi_breg r0, \
+ ldrd r2, r3, [\B], #8
+ orr r1, r1, r1, lsl #8 @ Replicate C to all bytes
+#ifdef ARCH_HAS_T2
+ movw ip, #0x0101
+ sfi_pld r0, #64
+ movt ip, #0x0101
+#else
+ ldr ip, =0x01010101
+ sfi_pld r0, #64
+#endif
+ orr r1, r1, r1, lsl #16
+
+ @ Loop searching for EOS or C, 8 bytes at a time.
+2:
+ @ Subtracting (unsigned saturating) from 1 means result of 1 for
+ @ any byte that was originally zero and 0 otherwise. Therefore
+ @ we consider the lsb of each byte the "found" bit.
+ uqsub8 r4, ip, r2 @ Find EOS
+ eor r6, r2, r1 @ Convert C bytes to 0
+ uqsub8 r5, ip, r3
+ eor r7, r3, r1
+ uqsub8 r6, ip, r6 @ Find C
+ sfi_pld r0, #128 @ Prefetch 2 lines ahead
+ uqsub8 r7, ip, r7
+ orr r4, r4, r6 @ Combine found for EOS and C
+ orr r5, r5, r7
+ orrs r6, r4, r5 @ Combine the two words
+ it eq
+ sfi_breg r0, \
+ ldrdeq r2, r3, [\B], #8
+ beq 2b
+
+ @ Found something. Disambiguate between first and second words.
+ @ Adjust r0 to point to the word containing the match.
+ @ Adjust r2 to the contents of the word containing the match.
+ @ Adjust r4 to the found bits for the word containing the match.
+ cmp r4, #0
+ sub r0, r0, #4
+ itte eq
+ moveq r4, r5
+ moveq r2, r3
+ subne r0, r0, #4
+
+ @ Find the bit-offset of the match within the word.
+#if defined(__ARMEL__)
+ @ For LE, swap the found word so clz searches from the little end.
+ rev r4, r4
+#else
+ @ For BE, byte swap the word to make it easier to extract the byte.
+ rev r2, r2
+#endif
+ @ We're counting 0x01 (not 0x80), so the bit offset is 7 too high.
+ clz r3, r4
+ sub r3, r3, #7
+ lsr r2, r2, r3 @ Shift down found byte
+ uxtb r1, r1 @ Undo replication of C
+ uxtb r2, r2 @ Extract found byte
+ add r0, r0, r3, lsr #3 @ Adjust the pointer to the found byte
+
+ pop { r4, r5, r6, r7 }
+ cfi_adjust_cfa_offset (-16)
+ cfi_restore (r4)
+ cfi_restore (r5)
+ cfi_restore (r6)
+ cfi_restore (r7)
+
+ @ Disambiguate between EOS and C.
+99:
+ cmp r2, r1
+ it ne
+ movne r0, #0 @ Found EOS, return NULL
+ bx lr
+
+END (strchr)
+
+weak_alias (strchr, index)
+libc_hidden_builtin_def (strchr)
diff --git a/libc/ports/sysdeps/arm/armv6/strcpy.S b/libc/ports/sysdeps/arm/armv6/strcpy.S
new file mode 100644
index 000000000..cd13ff7ec
--- /dev/null
+++ b/libc/ports/sysdeps/arm/armv6/strcpy.S
@@ -0,0 +1,231 @@
+/* strcpy -- copy a nul-terminated string.
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+/* Endian independent macros for shifting bytes within registers. */
+#ifdef __ARMEB__
+#define lsh_gt lsr
+#define lsh_ls lsl
+#else
+#define lsh_gt lsl
+#define lsh_ls lsr
+#endif
+
+ .syntax unified
+ .text
+
+ENTRY (__stpcpy)
+ @ Signal stpcpy with NULL in IP.
+ mov ip, #0
+ b 0f
+END (__stpcpy)
+
+weak_alias (__stpcpy, stpcpy)
+libc_hidden_def (__stpcpy)
+libc_hidden_builtin_def (stpcpy)
+
+ENTRY (strcpy)
+ @ Signal strcpy with DEST in IP.
+ mov ip, r0
+0:
+ sfi_pld r0
+ sfi_pld r1
+
+ @ To cater to long strings, we want 8 byte alignment in the source.
+ @ To cater to small strings, we don't want to start that right away.
+ @ Loop up to 16 times, less whatever it takes to reach alignment.
+ and r3, r1, #7
+ rsb r3, r3, #16
+
+ @ Loop until we find ...
+1: sfi_breg r1, \
+ ldrb r2, [\B], #1
+ subs r3, r3, #1 @ ... the alignment point
+ sfi_breg r0, \
+ strb r2, [\B], #1
+ it ne
+ cmpne r2, #0 @ ... or EOS
+ bne 1b
+
+ @ Disambiguate the exit possibilites above
+ cmp r2, #0 @ Found EOS
+ beq .Lreturn
+
+ @ Load the next two words asap
+ sfi_breg r1, \
+ ldrd r2, r3, [\B], #8
+ sfi_pld r0, #64
+ sfi_pld r1, #64
+
+ @ For longer strings, we actaully need a stack frame.
+ push { r4, r5, r6, r7 }
+ cfi_adjust_cfa_offset (16)
+ cfi_rel_offset (r4, 0)
+ cfi_rel_offset (r5, 4)
+ cfi_rel_offset (r6, 8)
+ cfi_rel_offset (r7, 12)
+
+ @ Subtracting (unsigned saturating) from 1 for any byte means result
+ @ of 1 for any byte that was originally zero and 0 otherwise.
+ @ Therefore we consider the lsb of each byte the "found" bit.
+#ifdef ARCH_HAS_T2
+ movw r7, #0x0101
+ tst r0, #3 @ Test alignment of DEST
+ movt r7, #0x0101
+#else
+ ldr ip, =0x01010101
+ tst r0, #3
+#endif
+ bne .Lunaligned
+
+ @ So now source (r1) is aligned to 8, and dest (r0) is aligned to 4.
+ @ Loop, reading 8 bytes at a time, searching for EOS.
+ .balign 16
+2: uqsub8 r4, r7, r2 @ Find EOS
+ uqsub8 r5, r7, r3
+ sfi_pld r1, #128
+ cmp r4, #0 @ EOS in first word?
+ sfi_pld r0, #128
+ bne 3f
+ sfi_breg r0, \
+ str r2, [\B], #4
+ cmp r5, #0 @ EOS in second word?
+ bne 4f
+ sfi_breg r0, \
+ str r3, [\B], #4
+ sfi_breg r1, \
+ ldrd r2, r3, [\B], #8
+ b 2b
+
+3: sub r1, r1, #4 @ backup to first word
+4: sub r1, r1, #4 @ backup to second word
+
+ @ ... then finish up any tail a byte at a time.
+ @ Note that we generally back up and re-read source bytes,
+ @ but we'll not re-write dest bytes.
+.Lbyte_loop:
+ sfi_breg r1, \
+ ldrb r2, [\B], #1
+ cmp r2, #0
+ sfi_breg r0, \
+ strb r2, [\B], #1
+ bne .Lbyte_loop
+
+ pop { r4, r5, r6, r7 }
+ cfi_remember_state
+ cfi_adjust_cfa_offset (-16)
+ cfi_restore (r4)
+ cfi_restore (r5)
+ cfi_restore (r6)
+ cfi_restore (r7)
+
+.Lreturn:
+ cmp ip, #0 @ Was this strcpy or stpcpy?
+ ite eq
+ subeq r0, r0, #1 @ stpcpy: undo post-inc from store
+ movne r0, ip @ strcpy: return original dest
+ bx lr
+
+.Lunaligned:
+ cfi_restore_state
+ @ Here, source is aligned to 8, but the destination is not word
+ @ aligned. Therefore we have to shift the data in order to be
+ @ able to perform aligned word stores.
+
+ @ Find out which misalignment we're dealing with.
+ tst r0, #1
+ beq .Lunaligned2
+ tst r0, #2
+ bne .Lunaligned3
+ @ Fallthru to .Lunaligned1.
+
+.macro unaligned_copy unalign
+ @ Prologue to unaligned loop. Seed shifted non-zero bytes.
+ uqsub8 r4, r7, r2 @ Find EOS
+ uqsub8 r5, r7, r3
+ mvns r4, r4 @ EOS in first word?
+ it ne
+ subne r1, r1, #8
+ bne .Lbyte_loop
+#ifdef __ARMEB__
+ rev r2, r2 @ Byte stores below need LE data
+#endif
+ @ Store a few bytes from the first word.
+ @ At the same time we align r0 and shift out bytes from r2.
+.rept 4-\unalign
+ sfi_breg r0, \
+ strb r2, [\B], #1
+ lsr r2, r2, #8
+.endr
+#ifdef __ARMEB__
+ rev r2, r2 @ Undo previous rev
+#endif
+ @ Rotated unaligned copy loop. The tail of the prologue is
+ @ shared with the loop itself.
+ .balign 8
+1: mvns r5, r5 @ EOS in second word?
+ bne 4f
+ @ Combine first and second words
+ orr r2, r2, r3, lsh_gt #(\unalign*8)
+ @ Save leftover bytes from the two words
+ lsh_ls r6, r3, #((4-\unalign)*8)
+ sfi_breg r0, \
+ str r2, [\B], #4
+ @ The "real" start of the unaligned copy loop.
+ sfi_breg r1, \
+ ldrd r2, r3, [\B], #8 @ Load 8 more bytes
+ uqsub8 r4, r7, r2 @ Find EOS
+ sfi_pld r1, #128
+ uqsub8 r5, r7, r3
+ sfi_pld r0, #128
+ mvns r4, r4 @ EOS in first word?
+ bne 3f
+ @ Combine the leftover and the first word
+ orr r6, r6, r2, lsh_gt #(\unalign*8)
+ @ Discard used bytes from the first word.
+ lsh_ls r2, r2, #((4-\unalign)*8)
+ sfi_breg r0, \
+ str r6, [\B], #4
+ b 1b
+ @ Found EOS in one of the words; adjust backward
+3: sub r1, r1, #4
+ mov r2, r6
+4: sub r1, r1, #4
+ @ And store the remaining bytes from the leftover
+#ifdef __ARMEB__
+ rev r2, r2
+#endif
+.rept \unalign
+ sfi_breg r0, \
+ strb r2, [\B], #1
+ lsr r2, r2, #8
+.endr
+ b .Lbyte_loop
+.endm
+
+.Lunaligned1:
+ unaligned_copy 1
+.Lunaligned2:
+ unaligned_copy 2
+.Lunaligned3:
+ unaligned_copy 3
+
+END (strcpy)
+
+libc_hidden_builtin_def (strcpy)
diff --git a/libc/ports/sysdeps/arm/armv6/strlen.S b/libc/ports/sysdeps/arm/armv6/strlen.S
new file mode 100644
index 000000000..59ff6b5d9
--- /dev/null
+++ b/libc/ports/sysdeps/arm/armv6/strlen.S
@@ -0,0 +1,103 @@
+/* strlen -- find the length of a nul-terminated string.
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+ .syntax unified
+ .text
+
+ENTRY (strlen)
+ @ r0 = start of string
+ sfi_breg r0, \
+ ldrb r2, [\B] @ load the first byte asap
+
+ @ To cater to long strings, we want to search through a few
+ @ characters until we reach an aligned pointer. To cater to
+ @ small strings, we don't want to start doing word operations
+ @ immediately. The compromise is a maximum of 16 bytes less
+ @ whatever is required to end with an aligned pointer.
+ @ r3 = number of characters to search in alignment loop
+ and r3, r0, #7
+ mov r1, r0 @ Save the input pointer
+ rsb r3, r3, #15 @ 16 - 1 peeled loop iteration
+ cmp r2, #0
+ beq 99f
+
+ @ Loop until we find ...
+1: sfi_breg r0, \
+ ldrb r2, [\B, #1]!
+ subs r3, r3, #1 @ ... the aligment point
+ it ne
+ cmpne r2, #0 @ ... or EOS
+ bne 1b
+
+ @ Disambiguate the exit possibilites above
+ cmp r2, #0 @ Found EOS
+ beq 99f
+ add r0, r0, #1
+
+ @ So now we're aligned.
+ sfi_breg r0, \
+ ldrd r2, r3, [\B], #8
+#ifdef ARCH_HAS_T2
+ movw ip, #0x0101
+ sfi_pld r0, #64
+ movt ip, #0x0101
+#else
+ ldr ip, =0x01010101
+ sfi_pld r0, #64
+#endif
+
+ @ Loop searching for EOS, 8 bytes at a time.
+ @ Subtracting (unsigned saturating) from 1 for any byte means that
+ @ we get 1 for any byte that was originally zero and 0 otherwise.
+ @ Therefore we consider the lsb of each byte the "found" bit.
+ .balign 16
+2: uqsub8 r2, ip, r2 @ Find EOS
+ uqsub8 r3, ip, r3
+ sfi_pld r0, #128 @ Prefetch 2 lines ahead
+ orrs r3, r3, r2 @ Combine the two words
+ it eq
+ sfi_breg r0, \
+ ldrdeq r2, r3, [\B], #8
+ beq 2b
+
+ @ Found something. Disambiguate between first and second words.
+ @ Adjust r0 to point to the word containing the match.
+ @ Adjust r2 to the found bits for the word containing the match.
+ cmp r2, #0
+ sub r0, r0, #4
+ ite eq
+ moveq r2, r3
+ subne r0, r0, #4
+
+ @ Find the bit-offset of the match within the word. Note that the
+ @ bit result from clz will be 7 higher than "true", but we'll
+ @ immediately discard those bits converting to a byte offset.
+#ifdef __ARMEL__
+ rev r2, r2 @ For LE, count from the little end
+#endif
+ clz r2, r2
+ add r0, r0, r2, lsr #3 @ Adjust the pointer to the found byte
+99:
+ sub r0, r0, r1 @ Subtract input to compute length
+ bx lr
+
+END (strlen)
+
+libc_hidden_builtin_def (strlen)
diff --git a/libc/ports/sysdeps/arm/armv6/strrchr.S b/libc/ports/sysdeps/arm/armv6/strrchr.S
new file mode 100644
index 000000000..e40df90a7
--- /dev/null
+++ b/libc/ports/sysdeps/arm/armv6/strrchr.S
@@ -0,0 +1,131 @@
+/* strrchr -- find the last occurence of C in a nul-terminated string
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+ .syntax unified
+ .text
+
+ENTRY (strrchr)
+ @ r0 = start of string
+ @ r1 = character to match
+ @ returns NULL for no match, or a pointer to the match
+
+ mov r3, r0
+ mov r0, #0
+ uxtb r1, r1
+
+ @ Loop a few times until we're aligned.
+ tst r3, #7
+ beq 2f
+1: sfi_breg r3, \
+ ldrb r2, [\B], #1
+ cmp r2, r1 @ Find the character
+ it eq
+ subeq r0, r3, #1
+ cmp r2, #0 @ Find EOS
+ it eq
+ bxeq lr
+ tst r3, #7 @ Find the aligment point
+ bne 1b
+
+ @ So now we're aligned. Now we actually need a stack frame.
+2: push { r4, r5, r6, r7 }
+ cfi_adjust_cfa_offset (16)
+ cfi_rel_offset (r4, 0)
+ cfi_rel_offset (r5, 4)
+ cfi_rel_offset (r6, 8)
+ cfi_rel_offset (r7, 12)
+
+ orr r1, r1, r1, lsl #8 @ Replicate C to all bytes
+#ifdef ARCH_HAS_T2
+ movw ip, #0x0101
+ movt ip, #0x0101
+#else
+ ldr ip, =0x01010101
+#endif
+ orr r1, r1, r1, lsl #16
+ mov r2, #0 @ No found bits yet
+
+ @ Loop searching for EOS and C, 8 bytes at a time.
+ @ Any time we find a match in a word, we copy the address of
+ @ the word to r0, and the found bits to r2.
+3: sfi_breg r3, \
+ ldrd r4, r5, [\B], #8
+ @ Subtracting (unsigned saturating) from 1 means result of 1 for
+ @ any byte that was originally zero and 0 otherwise. Therefore
+ @ we consider the lsb of each byte the "found" bit.
+ uqsub8 r6, ip, r4 @ Find EOS
+ uqsub8 r7, ip, r5
+ eor r4, r4, r1 @ Convert C bytes to 0
+ eor r5, r5, r1
+ uqsub8 r4, ip, r4 @ Find C
+ uqsub8 r5, ip, r5
+ cmp r6, #0 @ Found EOS, first word
+ bne 4f
+ cmp r4, #0 @ Handle C, first word
+ itt ne
+ subne r0, r3, #8
+ movne r2, r4
+ cmp r7, #0 @ Found EOS, second word
+ bne 5f
+ cmp r5, #0 @ Handle C, second word
+ itt ne
+ subne r0, r3, #4
+ movne r2, r5
+ b 3b
+
+ @ Found EOS in second word; fold to first word.
+5: add r3, r3, #4 @ Dec pointer to 2nd word, with below
+ mov r4, r5 @ Overwrite first word C found
+ mov r6, r7 @ Overwrite first word EOS found
+
+ @ Found EOS. Zap found C after EOS.
+4: sub r3, r3, #8 @ Decrement pointer to first word
+#ifdef __ARMEB__
+ @ Byte swap to be congruent with LE, which is easier from here on.
+ rev r6, r6 @ Byte swap found EOS,
+ rev r4, r4 @ ... this found C
+ rev r2, r2 @ ... prev found C
+#endif
+ sub r7, r6, #1 @ Toggle EOS lsb and below
+ eor r6, r6, r7 @ All bits below and including lsb
+ ands r4, r4, r6 @ Zap C above EOS
+ itt ne
+ movne r2, r4 @ Copy to result, if still non-zero
+ movne r0, r3
+
+ pop { r4, r5, r6, r7 }
+ cfi_adjust_cfa_offset (-16)
+ cfi_restore (r4)
+ cfi_restore (r5)
+ cfi_restore (r6)
+ cfi_restore (r7)
+
+ @ Adjust the result pointer if we found a word containing C.
+ cmp r2, #0
+ clz r2, r2 @ Find the bit offset of the last C
+ itt ne
+ rsbne r2, r2, #32 @ Convert to a count from the right
+ addne r0, r0, r2, lsr #3 @ Convert to byte offset and add.
+ bx lr
+
+END (strrchr)
+
+weak_alias (strrchr, rindex)
+libc_hidden_builtin_def (strrchr)
diff --git a/libc/ports/sysdeps/arm/armv6t2/Implies b/libc/ports/sysdeps/arm/armv6t2/Implies
new file mode 100644
index 000000000..20a87fc8a
--- /dev/null
+++ b/libc/ports/sysdeps/arm/armv6t2/Implies
@@ -0,0 +1,2 @@
+# We can do everything that 6 can
+arm/armv6
diff --git a/libc/ports/sysdeps/arm/jmpbuf-offsets.h b/libc/ports/sysdeps/arm/armv6t2/ffs.S
index beeccbb40..b2c88b946 100644
--- a/libc/ports/sysdeps/arm/jmpbuf-offsets.h
+++ b/libc/ports/sysdeps/arm/armv6t2/ffs.S
@@ -1,5 +1,5 @@
-/* Private macros for accessing __jmp_buf contents. ARM EABI version.
- Copyright (C) 2007-2013 Free Software Foundation, Inc.
+/* ffs -- find first set bit in an int, from least significant end.
+ Copyright (C) 2013 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
@@ -16,4 +16,20 @@
License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
-#define __JMP_BUF_SP 8
+#include <sysdep.h>
+
+ .syntax unified
+ .text
+
+ENTRY (__ffs)
+ cmp r0, #0
+ rbit r0, r0
+ itt ne
+ clzne r0, r0
+ addne r0, r0, #1
+ bx lr
+END (__ffs)
+
+weak_alias (__ffs, ffs)
+weak_alias (__ffs, ffsl)
+libc_hidden_builtin_def (ffs)
diff --git a/libc/ports/sysdeps/arm/armv6t2/ffsll.S b/libc/ports/sysdeps/arm/armv6t2/ffsll.S
new file mode 100644
index 000000000..e49c70fdf
--- /dev/null
+++ b/libc/ports/sysdeps/arm/armv6t2/ffsll.S
@@ -0,0 +1,50 @@
+/* ffsll -- find first set bit in a long long, from least significant end.
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+ .syntax unified
+ .text
+
+ENTRY (ffsll)
+ @ If low part is 0, operate on the high part. Ensure that the
+ @ word on which we operate is in r0. Set r2 to the bit offset
+ @ of the word being considered. Set the flags for the word
+ @ being operated on.
+#ifdef __ARMEL__
+ cmp r0, #0
+ itee ne
+ movne r2, #0
+ moveq r2, #32
+ movseq r0, r1
+#else
+ cmp r1, #0
+ ittee ne
+ movne r2, #0
+ movne r0, r1
+ moveq r2, #32
+ cmpeq r0, #0
+#endif
+ @ Perform the ffs on r0.
+ rbit r0, r0
+ ittt ne
+ clzne r0, r0
+ addne r2, r2, #1
+ addne r0, r0, r2
+ bx lr
+END (ffsll)
diff --git a/libc/ports/sysdeps/arm/armv6t2/memchr.S b/libc/ports/sysdeps/arm/armv6t2/memchr.S
index 6d35f478b..f75897143 100644
--- a/libc/ports/sysdeps/arm/armv6t2/memchr.S
+++ b/libc/ports/sysdeps/arm/armv6t2/memchr.S
@@ -42,10 +42,12 @@
.syntax unified
.text
+#ifdef NO_THUMB
+ .arm
+#else
.thumb
-
-@ ---------------------------------------------------------------------------
.thumb_func
+#endif
.global memchr
.type memchr,%function
ENTRY(memchr)
@@ -63,7 +65,8 @@ ENTRY(memchr)
@ Work up to an aligned point
5:
- ldrb r3, [r0],#1
+ sfi_breg r0, \
+ ldrb r3, [\B],#1
subs r2, r2, #1
cmp r3, r1
beq 50f @ If it matches exit found
@@ -83,20 +86,29 @@ ENTRY(memchr)
orr r1, r1, r1, lsl #8 @ expand the match word across to all bytes
orr r1, r1, r1, lsl #16
- bic r4, r2, #7 @ Number of double words to work with * 8
+ bic r6, r2, #7 @ Number of double words to work with * 8
mvns r7, #0 @ all F's
movs r3, #0
15:
- ldrd r5,r6, [r0],#8
- subs r4, r4, #8
- eor r5,r5, r1 @ Get it so that r5,r6 have 00's where the bytes match the target
- eor r6,r6, r1
+ sfi_breg r0, \
+ ldrd r4,r5, [\B],#8
+#ifndef NO_THUMB
+ subs r6, r6, #8
+#endif
+ eor r4,r4, r1 @ Get it so that r4,r5 have 00's where the bytes match the target
+ eor r5,r5, r1
+ uadd8 r4, r4, r7 @ Parallel add 0xff - sets the GE bits for anything that wasn't 0
+ sel r4, r3, r7 @ bytes are 00 for none-00 bytes, or ff for 00 bytes - NOTE INVERSION
uadd8 r5, r5, r7 @ Parallel add 0xff - sets the GE bits for anything that wasn't 0
- sel r5, r3, r7 @ bytes are 00 for none-00 bytes, or ff for 00 bytes - NOTE INVERSION
- uadd8 r6, r6, r7 @ Parallel add 0xff - sets the GE bits for anything that wasn't 0
- sel r6, r5, r7 @ chained....bytes are 00 for none-00 bytes, or ff for 00 bytes - NOTE INVERSION
- cbnz r6, 60f
+ sel r5, r4, r7 @ chained....bytes are 00 for none-00 bytes, or ff for 00 bytes - NOTE INVERSION
+#ifndef NO_THUMB
+ cbnz r5, 60f
+#else
+ cmp r5, #0
+ bne 60f
+ subs r6, r6, #8
+#endif
bne 15b @ (Flags from the subs above) If not run out of bytes then go around again
pop {r4,r5,r6,r7}
@@ -110,13 +122,25 @@ ENTRY(memchr)
and r2,r2,#7 @ Leave the count remaining as the number after the double words have been done
20:
+#ifndef NO_THUMB
cbz r2, 40f @ 0 length or hit the end already then not found
+#else
+ cmp r2, #0
+ beq 40f
+#endif
21: @ Post aligned section, or just a short call
- ldrb r3,[r0],#1
+ sfi_breg r0, \
+ ldrb r3,[\B],#1
+#ifndef NO_THUMB
subs r2,r2,#1
eor r3,r3,r1 @ r3 = 0 if match - doesn't break flags from sub
cbz r3, 50f
+#else
+ eors r3, r3, r1
+ beq 50f
+ subs r2, r2, #1
+#endif
bne 21b @ on r2 flags
40:
@@ -129,22 +153,22 @@ ENTRY(memchr)
60: @ We're here because the fast path found a hit - now we have to track down exactly which word it was
@ r0 points to the start of the double word after the one that was tested
- @ r5 has the 00/ff pattern for the first word, r6 has the chained value
+ @ r4 has the 00/ff pattern for the first word, r5 has the chained value
cfi_restore_state
- cmp r5, #0
+ cmp r4, #0
itte eq
- moveq r5, r6 @ the end is in the 2nd word
+ moveq r4, r5 @ the end is in the 2nd word
subeq r0,r0,#3 @ Points to 2nd byte of 2nd word
subne r0,r0,#7 @ or 2nd byte of 1st word
@ r0 currently points to the 2nd byte of the word containing the hit
- tst r5, # CHARTSTMASK(0) @ 1st character
+ tst r4, # CHARTSTMASK(0) @ 1st character
bne 61f
adds r0,r0,#1
- tst r5, # CHARTSTMASK(1) @ 2nd character
+ tst r4, # CHARTSTMASK(1) @ 2nd character
ittt eq
addeq r0,r0,#1
- tsteq r5, # (3<<15) @ 2nd & 3rd character
+ tsteq r4, # (3<<15) @ 2nd & 3rd character
@ If not the 3rd must be the last one
addeq r0,r0,#1
diff --git a/libc/ports/sysdeps/arm/bits/setjmp.h b/libc/ports/sysdeps/arm/bits/setjmp.h
index 1f7ddd365..21bbf7f57 100644
--- a/libc/ports/sysdeps/arm/bits/setjmp.h
+++ b/libc/ports/sysdeps/arm/bits/setjmp.h
@@ -24,7 +24,7 @@
# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
#endif
-#ifndef _ASM
+#ifndef __ASSEMBLER__
/* The exact set of registers saved may depend on the particular core
in use, as some coprocessor registers may need to be saved. The C
Library ABI requires that the buffer be 8-byte aligned, and
diff --git a/libc/ports/sysdeps/arm/crti.S b/libc/ports/sysdeps/arm/crti.S
index 1d55ae27a..be20a1199 100644
--- a/libc/ports/sysdeps/arm/crti.S
+++ b/libc/ports/sysdeps/arm/crti.S
@@ -80,7 +80,7 @@ call_weak_fn:
.globl _init
.type _init, %function
_init:
- stmfd sp!, {r3, lr}
+ push {r3, lr}
#if PREINIT_FUNCTION_WEAK
bl call_weak_fn
#else
@@ -92,4 +92,4 @@ _init:
.globl _fini
.type _fini, %function
_fini:
- stmfd sp!, {r3, lr}
+ push {r3, lr}
diff --git a/libc/ports/sysdeps/arm/crtn.S b/libc/ports/sysdeps/arm/crtn.S
index a01eb0139..ae7546c5e 100644
--- a/libc/ports/sysdeps/arm/crtn.S
+++ b/libc/ports/sysdeps/arm/crtn.S
@@ -42,16 +42,16 @@
.section .init,"ax",%progbits
#ifdef __ARM_ARCH_4T__
- ldmfd sp!, {r3, lr}
+ pop {r3, lr}
bx lr
#else
- ldmfd sp!, {r3, pc}
+ pop {r3, pc}
#endif
.section .fini,"ax",%progbits
#ifdef __ARM_ARCH_4T__
- ldmfd sp!, {r3, lr}
+ pop {r3, lr}
bx lr
#else
- ldmfd sp!, {r3, pc}
+ pop {r3, pc}
#endif
diff --git a/libc/ports/sysdeps/arm/dl-machine.h b/libc/ports/sysdeps/arm/dl-machine.h
index 30ad46c25..5a424f841 100644
--- a/libc/ports/sysdeps/arm/dl-machine.h
+++ b/libc/ports/sysdeps/arm/dl-machine.h
@@ -136,7 +136,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
return lazy;
}
-#if defined(__USE_BX__)
+#if defined(ARCH_HAS_BX)
#define BX(x) "bx\t" #x
#else
#define BX(x) "mov\tpc, " #x
diff --git a/libc/ports/sysdeps/arm/dl-tlsdesc.S b/libc/ports/sysdeps/arm/dl-tlsdesc.S
index 7b4c8dfcb..e810d0db3 100644
--- a/libc/ports/sysdeps/arm/dl-tlsdesc.S
+++ b/libc/ports/sysdeps/arm/dl-tlsdesc.S
@@ -20,12 +20,6 @@
#include <tls.h>
#include "tlsdesc.h"
-#ifdef __USE_BX__
- #define BX(x) bx x
-#else
- #define BX(x) mov pc, x
-#endif
-
.text
@ emit debug information with cfi
@ use arm-specific pseudos for unwinding itself
@@ -50,18 +44,9 @@ _dl_tlsdesc_return:
.fnstart
.align 2
_dl_tlsdesc_undefweak:
- @ Are we allowed a misaligned stack pointer calling read_tp?
- .save {lr}
- stmdb sp!, {lr}
- cfi_adjust_cfa_offset (4)
- cfi_rel_offset (lr,0)
- bl __aeabi_read_tp
+ GET_TLS (r1)
rsb r0, r0, #0
- ldmia sp!, {lr}
- cfi_adjust_cfa_offset (-4)
- cfi_restore (lr)
BX (lr)
-
cfi_endproc
.fnend
.size _dl_tlsdesc_undefweak, .-_dl_tlsdesc_undefweak
@@ -99,14 +84,14 @@ _dl_tlsdesc_dynamic:
/* Our calling convention is to clobber r0, r1 and the processor
flags. All others that are modified must be saved */
.save {r2,r3,r4,lr}
- stmdb sp!, {r2,r3,r4,lr}
+ push {r2,r3,r4,lr}
cfi_adjust_cfa_offset (16)
cfi_rel_offset (r2,0)
cfi_rel_offset (r3,4)
cfi_rel_offset (r4,8)
cfi_rel_offset (lr,12)
ldr r1, [r0] /* td */
- bl __aeabi_read_tp
+ GET_TLS (lr)
mov r4, r0 /* r4 = tp */
ldr r0, [r0]
ldr r2, [r1, #8] /* gen_count */
@@ -124,13 +109,18 @@ _dl_tlsdesc_dynamic:
1: mov r0, r1
bl __tls_get_addr
rsb r0, r4, r0
-2: ldmia sp!, {r2,r3,r4, lr}
+2:
+#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
+ pop {r2,r3,r4, lr}
cfi_adjust_cfa_offset (-16)
cfi_restore (lr)
cfi_restore (r4)
cfi_restore (r3)
cfi_restore (r2)
- BX (lr)
+ bx lr
+#else
+ pop {r2,r3,r4, pc}
+#endif
.fnend
cfi_endproc
.size _dl_tlsdesc_dynamic, .-_dl_tlsdesc_dynamic
@@ -155,7 +145,7 @@ _dl_tlsdesc_lazy_resolver:
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r2, 0)
.save {r0,r1,r3,ip,lr}
- stmdb sp!, {r0, r1, r3, ip, lr}
+ push {r0, r1, r3, ip, lr}
cfi_adjust_cfa_offset (20)
cfi_rel_offset (r0, 0)
cfi_rel_offset (r1, 4)
@@ -163,14 +153,14 @@ _dl_tlsdesc_lazy_resolver:
cfi_rel_offset (ip, 12)
cfi_rel_offset (lr, 16)
bl _dl_tlsdesc_lazy_resolver_fixup
- ldmia sp!, {r0, r1, r3, ip, lr}
+ pop {r0, r1, r3, ip, lr}
cfi_adjust_cfa_offset (-20)
cfi_restore (lr)
cfi_restore (ip)
cfi_restore (r3)
cfi_restore (r1)
cfi_restore (r0)
- ldmia sp!, {r2}
+ pop {r2}
cfi_adjust_cfa_offset (-4)
cfi_restore (r2)
ldr r1, [r0, #4]
@@ -193,7 +183,7 @@ _dl_tlsdesc_resolve_hold:
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r2, 0)
.save {r0,r1,r3,ip,lr}
- stmdb sp!, {r0, r1, r3, ip, lr}
+ push {r0, r1, r3, ip, lr}
cfi_adjust_cfa_offset (20)
cfi_rel_offset (r0, 0)
cfi_rel_offset (r1, 4)
@@ -202,14 +192,14 @@ _dl_tlsdesc_resolve_hold:
cfi_rel_offset (lr, 16)
adr r2, _dl_tlsdesc_resolve_hold
bl _dl_tlsdesc_resolve_hold_fixup
- ldmia sp!, {r0, r1, r3, ip, lr}
+ pop {r0, r1, r3, ip, lr}
cfi_adjust_cfa_offset (-20)
cfi_restore (lr)
cfi_restore (ip)
cfi_restore (r3)
cfi_restore (r1)
cfi_restore (r0)
- ldmia sp!, {r2}
+ pop {r2}
cfi_adjust_cfa_offset (-4)
cfi_restore (r2)
ldr r1, [r0, #4]
diff --git a/libc/ports/sysdeps/arm/dl-trampoline.S b/libc/ports/sysdeps/arm/dl-trampoline.S
index 561d8ae6f..936697676 100644
--- a/libc/ports/sysdeps/arm/dl-trampoline.S
+++ b/libc/ports/sysdeps/arm/dl-trampoline.S
@@ -21,12 +21,6 @@
#include <sysdep.h>
#include <libc-symbols.h>
-#if defined(__USE_BX__)
-#define BX(x) bx x
-#else
-#define BX(x) mov pc, x
-#endif
-
.text
.globl _dl_runtime_resolve
.type _dl_runtime_resolve, #function
@@ -43,7 +37,7 @@ _dl_runtime_resolve:
@ lr points to &GOT[2]
@ Save arguments. We save r4 to realign the stack.
- stmdb sp!,{r0-r4}
+ push {r0-r4}
cfi_adjust_cfa_offset (20)
cfi_rel_offset (r0, 0)
cfi_rel_offset (r1, 4)
@@ -67,7 +61,7 @@ _dl_runtime_resolve:
@ get arguments and return address back. We restore r4
@ only to realign the stack.
- ldmia sp!, {r0-r4,lr}
+ pop {r0-r4,lr}
cfi_adjust_cfa_offset (-24)
@ jump to the newly found address
@@ -192,8 +186,7 @@ _dl_runtime_profile:
add ip, r7, #72
ldmia ip, {r0-r3}
ldr ip, [r7, #264]
- mov lr, pc
- BX(ip)
+ BLX(ip)
stmia r7, {r0-r3}
@ Call pltexit.
diff --git a/libc/sysdeps/generic/bp-sym.h b/libc/ports/sysdeps/arm/include/bits/setjmp.h
index 089912a68..23d8f75cf 100644
--- a/libc/sysdeps/generic/bp-sym.h
+++ b/libc/ports/sysdeps/arm/include/bits/setjmp.h
@@ -1,7 +1,6 @@
-/* Bounded-pointer symbol modifier.
- Copyright (C) 2000-2013 Free Software Foundation, Inc.
+/* Private jmp_buf-related definitions. ARM EABI version.
+ Copyright (C) 2013 Free Software Foundation, Inc.
This file is part of the GNU C Library.
- Contributed by Greg McGary <greg@mcgary.org>
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -14,12 +13,22 @@
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, see
+ License along with the GNU C Library. If not, see
<http://www.gnu.org/licenses/>. */
-#define BP_SYM(name) _BP_SYM (name)
-#if __BOUNDED_POINTERS__
-# define _BP_SYM(name) __BP_##name
-#else
-# define _BP_SYM(name) name
+#ifndef _INCLUDE_BITS_SETJMP_H
+#define _INCLUDE_BITS_SETJMP_H 1
+
+#ifndef __ASSEMBLER__
+/* Get the public declarations. */
+# include <sysdeps/arm/bits/setjmp.h>
#endif
+
+/* Register list for a ldm/stm instruction to load/store
+ the general registers from a __jmp_buf. */
+#define JMP_BUF_REGLIST {v1-v6, sl, fp, sp, lr}
+
+/* Index of __jmp_buf where the sp register resides. */
+#define __JMP_BUF_SP 8
+
+#endif /* include/bits/setjmp.h */
diff --git a/libc/ports/sysdeps/arm/jmpbuf-unwind.h b/libc/ports/sysdeps/arm/jmpbuf-unwind.h
index 7f7770aea..0863540ce 100644
--- a/libc/ports/sysdeps/arm/jmpbuf-unwind.h
+++ b/libc/ports/sysdeps/arm/jmpbuf-unwind.h
@@ -16,7 +16,6 @@
<http://www.gnu.org/licenses/>. */
#include <setjmp.h>
-#include <jmpbuf-offsets.h>
#include <stdint.h>
#include <unwind.h>
diff --git a/libc/ports/sysdeps/arm/memcpy.S b/libc/ports/sysdeps/arm/memcpy.S
index 98b9b47e3..add82e2d1 100644
--- a/libc/ports/sysdeps/arm/memcpy.S
+++ b/libc/ports/sysdeps/arm/memcpy.S
@@ -20,6 +20,7 @@
/* Thumb requires excessive IT insns here. */
#define NO_THUMB
#include <sysdep.h>
+#include <arm-features.h>
/*
* Data preload for architectures that support it (ARM V5TE and above)
@@ -45,20 +46,21 @@
* Endian independent macros for shifting bytes within registers.
*/
#ifndef __ARMEB__
-#define pull lsr
-#define push lsl
+#define PULL lsr
+#define PUSH lsl
#else
-#define pull lsl
-#define push lsr
+#define PULL lsl
+#define PUSH lsr
#endif
.text
+ .syntax unified
/* Prototype: void *memcpy(void *dest, const void *src, size_t n); */
ENTRY(memcpy)
- stmfd sp!, {r0, r4, lr}
+ push {r0, r4, lr}
cfi_adjust_cfa_offset (12)
cfi_rel_offset (r4, 4)
cfi_rel_offset (lr, 8)
@@ -68,13 +70,13 @@ ENTRY(memcpy)
subs r2, r2, #4
blt 8f
ands ip, r0, #3
- PLD( pld [r1, #0] )
+ PLD( sfi_pld r1, #0 )
bne 9f
ands ip, r1, #3
bne 10f
1: subs r2, r2, #(28)
- stmfd sp!, {r5 - r8}
+ push {r5 - r8}
cfi_adjust_cfa_offset (16)
cfi_rel_offset (r5, 0)
cfi_rel_offset (r6, 4)
@@ -84,54 +86,112 @@ ENTRY(memcpy)
CALGN( ands ip, r1, #31 )
CALGN( rsb r3, ip, #32 )
- CALGN( sbcnes r4, r3, r2 ) @ C is always set here
+ CALGN( sbcsne r4, r3, r2 ) @ C is always set here
CALGN( bcs 2f )
CALGN( adr r4, 6f )
CALGN( subs r2, r2, r3 ) @ C gets set
- CALGN( add pc, r4, ip )
+#ifndef ARM_ALWAYS_BX
+ CALGN( add pc, r4, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2))
+#else
+ CALGN( add r4, r4, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2))
+ CALGN( bx r4 )
+#endif
- PLD( pld [r1, #0] )
+ PLD( sfi_pld r1, #0 )
2: PLD( subs r2, r2, #96 )
- PLD( pld [r1, #28] )
+ PLD( sfi_pld r1, #28 )
PLD( blt 4f )
- PLD( pld [r1, #60] )
- PLD( pld [r1, #92] )
+ PLD( sfi_pld r1, #60 )
+ PLD( sfi_pld r1, #92 )
-3: PLD( pld [r1, #124] )
-4: ldmia r1!, {r3, r4, r5, r6, r7, r8, ip, lr}
+3: PLD( sfi_pld r1, #124 )
+4: sfi_breg r1, \
+ ldmia \B!, {r3, r4, r5, r6, r7, r8, ip, lr}
subs r2, r2, #32
- stmia r0!, {r3, r4, r5, r6, r7, r8, ip, lr}
+ sfi_breg r0, \
+ stmia \B!, {r3, r4, r5, r6, r7, r8, ip, lr}
bge 3b
PLD( cmn r2, #96 )
PLD( bge 4b )
5: ands ip, r2, #28
rsb ip, ip, #32
- addne pc, pc, ip @ C is always clear here
+#ifndef ARM_ALWAYS_BX
+ /* C is always clear here. */
+ addne pc, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
b 7f
+#else
+ beq 7f
+ push {r10}
+ cfi_adjust_cfa_offset (4)
+ cfi_rel_offset (r10, 0)
+ add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
+ bx r10
+#endif
+ .p2align ARM_BX_ALIGN_LOG2
6: nop
- ldr r3, [r1], #4
- ldr r4, [r1], #4
- ldr r5, [r1], #4
- ldr r6, [r1], #4
- ldr r7, [r1], #4
- ldr r8, [r1], #4
- ldr lr, [r1], #4
-
- add pc, pc, ip
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r3, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r4, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r5, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r6, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r7, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r8, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr lr, [\B], #4
+
+#ifndef ARM_ALWAYS_BX
+ add pc, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
nop
+#else
+ add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
+ bx r10
+#endif
+ .p2align ARM_BX_ALIGN_LOG2
nop
- str r3, [r0], #4
- str r4, [r0], #4
- str r5, [r0], #4
- str r6, [r0], #4
- str r7, [r0], #4
- str r8, [r0], #4
- str lr, [r0], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r3, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r4, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r5, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r6, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r7, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r8, [\B], #4
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str lr, [\B], #4
+
+#ifdef ARM_ALWAYS_BX
+ pop {r10}
+ cfi_adjust_cfa_offset (-4)
+ cfi_restore (r10)
+#endif
CALGN( bcs 2b )
-7: ldmfd sp!, {r5 - r8}
+7: pop {r5 - r8}
cfi_adjust_cfa_offset (-16)
cfi_restore (r5)
cfi_restore (r6)
@@ -139,41 +199,55 @@ ENTRY(memcpy)
cfi_restore (r8)
8: movs r2, r2, lsl #31
- ldrneb r3, [r1], #1
- ldrcsb r4, [r1], #1
- ldrcsb ip, [r1]
- strneb r3, [r0], #1
- strcsb r4, [r0], #1
- strcsb ip, [r0]
-
-#if defined (__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__)
- ldmfd sp!, {r0, r4, lr}
+ sfi_breg r1, \
+ ldrbne r3, [\B], #1
+ sfi_breg r1, \
+ ldrbcs r4, [\B], #1
+ sfi_breg r1, \
+ ldrbcs ip, [\B]
+ sfi_breg r0, \
+ strbne r3, [\B], #1
+ sfi_breg r0, \
+ strbcs r4, [\B], #1
+ sfi_breg r0, \
+ strbcs ip, [\B]
+
+#if ((defined (__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__)) \
+ || defined (ARM_ALWAYS_BX))
+ pop {r0, r4, lr}
cfi_adjust_cfa_offset (-12)
cfi_restore (r4)
cfi_restore (lr)
bx lr
#else
- ldmfd sp!, {r0, r4, pc}
+ pop {r0, r4, pc}
#endif
cfi_restore_state
9: rsb ip, ip, #4
cmp ip, #2
- ldrgtb r3, [r1], #1
- ldrgeb r4, [r1], #1
- ldrb lr, [r1], #1
- strgtb r3, [r0], #1
- strgeb r4, [r0], #1
+ sfi_breg r1, \
+ ldrbgt r3, [\B], #1
+ sfi_breg r1, \
+ ldrbge r4, [\B], #1
+ sfi_breg r1, \
+ ldrb lr, [\B], #1
+ sfi_breg r0, \
+ strbgt r3, [\B], #1
+ sfi_breg r0, \
+ strbge r4, [\B], #1
subs r2, r2, ip
- strb lr, [r0], #1
+ sfi_breg r0, \
+ strb lr, [\B], #1
blt 8b
ands ip, r1, #3
beq 1b
10: bic r1, r1, #3
cmp ip, #2
- ldr lr, [r1], #4
+ sfi_breg r1, \
+ ldr lr, [\B], #4
beq 17f
bgt 18f
@@ -185,66 +259,71 @@ ENTRY(memcpy)
CALGN( ands ip, r1, #31 )
CALGN( rsb ip, ip, #32 )
- CALGN( sbcnes r4, ip, r2 ) @ C is always set here
+ CALGN( sbcsne r4, ip, r2 ) @ C is always set here
CALGN( subcc r2, r2, ip )
CALGN( bcc 15f )
-11: stmfd sp!, {r5 - r9}
+11: push {r5 - r8, r10}
cfi_adjust_cfa_offset (20)
cfi_rel_offset (r5, 0)
cfi_rel_offset (r6, 4)
cfi_rel_offset (r7, 8)
cfi_rel_offset (r8, 12)
- cfi_rel_offset (r9, 16)
+ cfi_rel_offset (r10, 16)
- PLD( pld [r1, #0] )
+ PLD( sfi_pld r1, #0 )
PLD( subs r2, r2, #96 )
- PLD( pld [r1, #28] )
+ PLD( sfi_pld r1, #28 )
PLD( blt 13f )
- PLD( pld [r1, #60] )
- PLD( pld [r1, #92] )
+ PLD( sfi_pld r1, #60 )
+ PLD( sfi_pld r1, #92 )
-12: PLD( pld [r1, #124] )
-13: ldmia r1!, {r4, r5, r6, r7}
- mov r3, lr, pull #\pull
+12: PLD( sfi_pld r1, #124 )
+13: sfi_breg r1, \
+ ldmia \B!, {r4, r5, r6, r7}
+ mov r3, lr, PULL #\pull
subs r2, r2, #32
- ldmia r1!, {r8, r9, ip, lr}
- orr r3, r3, r4, push #\push
- mov r4, r4, pull #\pull
- orr r4, r4, r5, push #\push
- mov r5, r5, pull #\pull
- orr r5, r5, r6, push #\push
- mov r6, r6, pull #\pull
- orr r6, r6, r7, push #\push
- mov r7, r7, pull #\pull
- orr r7, r7, r8, push #\push
- mov r8, r8, pull #\pull
- orr r8, r8, r9, push #\push
- mov r9, r9, pull #\pull
- orr r9, r9, ip, push #\push
- mov ip, ip, pull #\pull
- orr ip, ip, lr, push #\push
- stmia r0!, {r3, r4, r5, r6, r7, r8, r9, ip}
+ sfi_breg r1, \
+ ldmia \B!, {r8, r10, ip, lr}
+ orr r3, r3, r4, PUSH #\push
+ mov r4, r4, PULL #\pull
+ orr r4, r4, r5, PUSH #\push
+ mov r5, r5, PULL #\pull
+ orr r5, r5, r6, PUSH #\push
+ mov r6, r6, PULL #\pull
+ orr r6, r6, r7, PUSH #\push
+ mov r7, r7, PULL #\pull
+ orr r7, r7, r8, PUSH #\push
+ mov r8, r8, PULL #\pull
+ orr r8, r8, r10, PUSH #\push
+ mov r10, r10, PULL #\pull
+ orr r10, r10, ip, PUSH #\push
+ mov ip, ip, PULL #\pull
+ orr ip, ip, lr, PUSH #\push
+ sfi_breg r0, \
+ stmia \B!, {r3, r4, r5, r6, r7, r8, r10, ip}
bge 12b
PLD( cmn r2, #96 )
PLD( bge 13b )
- ldmfd sp!, {r5 - r9}
+ pop {r5 - r8, r10}
cfi_adjust_cfa_offset (-20)
cfi_restore (r5)
cfi_restore (r6)
cfi_restore (r7)
cfi_restore (r8)
- cfi_restore (r9)
+ cfi_restore (r10)
14: ands ip, r2, #28
beq 16f
-15: mov r3, lr, pull #\pull
- ldr lr, [r1], #4
+15: mov r3, lr, PULL #\pull
+ sfi_breg r1, \
+ ldr lr, [\B], #4
subs ip, ip, #4
- orr r3, r3, lr, push #\push
- str r3, [r0], #4
+ orr r3, r3, lr, PUSH #\push
+ sfi_breg r0, \
+ str r3, [\B], #4
bgt 15b
CALGN( cmp r2, #0 )
CALGN( bge 11b )
diff --git a/libc/ports/sysdeps/arm/memmove.S b/libc/ports/sysdeps/arm/memmove.S
index 059ca7ac3..9d4d5b099 100644
--- a/libc/ports/sysdeps/arm/memmove.S
+++ b/libc/ports/sysdeps/arm/memmove.S
@@ -20,6 +20,7 @@
/* Thumb requires excessive IT insns here. */
#define NO_THUMB
#include <sysdep.h>
+#include <arm-features.h>
/*
* Data preload for architectures that support it (ARM V5TE and above)
@@ -45,14 +46,15 @@
* Endian independent macros for shifting bytes within registers.
*/
#ifndef __ARMEB__
-#define pull lsr
-#define push lsl
+#define PULL lsr
+#define PUSH lsl
#else
-#define pull lsl
-#define push lsr
+#define PULL lsl
+#define PUSH lsr
#endif
.text
+ .syntax unified
/*
* Prototype: void *memmove(void *dest, const void *src, size_t n);
@@ -73,7 +75,7 @@ ENTRY(memmove)
bls HIDDEN_JUMPTARGET(memcpy)
#endif
- stmfd sp!, {r0, r4, lr}
+ push {r0, r4, lr}
cfi_adjust_cfa_offset (12)
cfi_rel_offset (r4, 4)
cfi_rel_offset (lr, 8)
@@ -85,13 +87,13 @@ ENTRY(memmove)
subs r2, r2, #4
blt 8f
ands ip, r0, #3
- PLD( pld [r1, #-4] )
+ PLD( sfi_pld r1, #-4 )
bne 9f
ands ip, r1, #3
bne 10f
1: subs r2, r2, #(28)
- stmfd sp!, {r5 - r8}
+ push {r5 - r8}
cfi_adjust_cfa_offset (16)
cfi_rel_offset (r5, 0)
cfi_rel_offset (r6, 4)
@@ -100,54 +102,112 @@ ENTRY(memmove)
blt 5f
CALGN( ands ip, r1, #31 )
- CALGN( sbcnes r4, ip, r2 ) @ C is always set here
+ CALGN( sbcsne r4, ip, r2 ) @ C is always set here
CALGN( bcs 2f )
CALGN( adr r4, 6f )
CALGN( subs r2, r2, ip ) @ C is set here
- CALGN( add pc, r4, ip )
+#ifndef ARM_ALWAYS_BX
+ CALGN( add pc, r4, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2))
+#else
+ CALGN( add r4, r4, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2))
+ CALGN( bx r4 )
+#endif
- PLD( pld [r1, #-4] )
+ PLD( sfi_pld r1, #-4 )
2: PLD( subs r2, r2, #96 )
- PLD( pld [r1, #-32] )
+ PLD( sfi_pld r1, #-32 )
PLD( blt 4f )
- PLD( pld [r1, #-64] )
- PLD( pld [r1, #-96] )
+ PLD( sfi_pld r1, #-64 )
+ PLD( sfi_pld r1, #-96 )
-3: PLD( pld [r1, #-128] )
-4: ldmdb r1!, {r3, r4, r5, r6, r7, r8, ip, lr}
+3: PLD( sfi_pld r1, #-128 )
+4: sfi_breg r1, \
+ ldmdb \B!, {r3, r4, r5, r6, r7, r8, ip, lr}
subs r2, r2, #32
- stmdb r0!, {r3, r4, r5, r6, r7, r8, ip, lr}
+ sfi_breg r0, \
+ stmdb \B!, {r3, r4, r5, r6, r7, r8, ip, lr}
bge 3b
PLD( cmn r2, #96 )
PLD( bge 4b )
5: ands ip, r2, #28
rsb ip, ip, #32
- addne pc, pc, ip @ C is always clear here
+#ifndef ARM_ALWAYS_BX
+ /* C is always clear here. */
+ addne pc, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
b 7f
+#else
+ beq 7f
+ push {r10}
+ cfi_adjust_cfa_offset (4)
+ cfi_rel_offset (r10, 0)
+ add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
+ bx r10
+#endif
+ .p2align ARM_BX_ALIGN_LOG2
6: nop
- ldr r3, [r1, #-4]!
- ldr r4, [r1, #-4]!
- ldr r5, [r1, #-4]!
- ldr r6, [r1, #-4]!
- ldr r7, [r1, #-4]!
- ldr r8, [r1, #-4]!
- ldr lr, [r1, #-4]!
-
- add pc, pc, ip
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r3, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r4, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r5, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r6, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r7, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr r8, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r1, \
+ ldr lr, [\B, #-4]!
+
+#ifndef ARM_ALWAYS_BX
+ add pc, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
nop
+#else
+ add r10, pc, ip, lsl #(ARM_BX_ALIGN_LOG2 - 2)
+ bx r10
+#endif
+ .p2align ARM_BX_ALIGN_LOG2
nop
- str r3, [r0, #-4]!
- str r4, [r0, #-4]!
- str r5, [r0, #-4]!
- str r6, [r0, #-4]!
- str r7, [r0, #-4]!
- str r8, [r0, #-4]!
- str lr, [r0, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r3, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r4, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r5, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r6, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r7, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str r8, [\B, #-4]!
+ .p2align ARM_BX_ALIGN_LOG2
+ sfi_breg r0, \
+ str lr, [\B, #-4]!
+
+#ifdef ARM_ALWAYS_BX
+ pop {r10}
+ cfi_adjust_cfa_offset (-4)
+ cfi_restore (r10)
+#endif
CALGN( bcs 2b )
-7: ldmfd sp!, {r5 - r8}
+7: pop {r5 - r8}
cfi_adjust_cfa_offset (-16)
cfi_restore (r5)
cfi_restore (r6)
@@ -155,40 +215,54 @@ ENTRY(memmove)
cfi_restore (r8)
8: movs r2, r2, lsl #31
- ldrneb r3, [r1, #-1]!
- ldrcsb r4, [r1, #-1]!
- ldrcsb ip, [r1, #-1]
- strneb r3, [r0, #-1]!
- strcsb r4, [r0, #-1]!
- strcsb ip, [r0, #-1]
-
-#if defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)
- ldmfd sp!, {r0, r4, lr}
+ sfi_breg r1, \
+ ldrbne r3, [\B, #-1]!
+ sfi_breg r1, \
+ ldrbcs r4, [\B, #-1]!
+ sfi_breg r1, \
+ ldrbcs ip, [\B, #-1]
+ sfi_breg r0, \
+ strbne r3, [\B, #-1]!
+ sfi_breg r0, \
+ strbcs r4, [\B, #-1]!
+ sfi_breg r0, \
+ strbcs ip, [\B, #-1]
+
+#if ((defined (__ARM_ARCH_4T__) && defined (__THUMB_INTERWORK__)) \
+ || defined (ARM_ALWAYS_BX))
+ pop {r0, r4, lr}
cfi_adjust_cfa_offset (-12)
cfi_restore (r4)
cfi_restore (lr)
bx lr
#else
- ldmfd sp!, {r0, r4, pc}
+ pop {r0, r4, pc}
#endif
cfi_restore_state
9: cmp ip, #2
- ldrgtb r3, [r1, #-1]!
- ldrgeb r4, [r1, #-1]!
- ldrb lr, [r1, #-1]!
- strgtb r3, [r0, #-1]!
- strgeb r4, [r0, #-1]!
+ sfi_breg r1, \
+ ldrbgt r3, [\B, #-1]!
+ sfi_breg r1, \
+ ldrbge r4, [\B, #-1]!
+ sfi_breg r1, \
+ ldrb lr, [\B, #-1]!
+ sfi_breg r0, \
+ strbgt r3, [\B, #-1]!
+ sfi_breg r0, \
+ strbge r4, [\B, #-1]!
subs r2, r2, ip
- strb lr, [r0, #-1]!
+ sfi_breg r0, \
+ strb lr, [\B, #-1]!
blt 8b
ands ip, r1, #3
beq 1b
10: bic r1, r1, #3
cmp ip, #2
- ldr r3, [r1, #0]
+ sfi_breg r1, \
+ ldr r3, [\B, #0]
beq 17f
blt 18f
@@ -200,66 +274,71 @@ ENTRY(memmove)
CALGN( ands ip, r1, #31 )
CALGN( rsb ip, ip, #32 )
- CALGN( sbcnes r4, ip, r2 ) @ C is always set here
+ CALGN( sbcsne r4, ip, r2 ) @ C is always set here
CALGN( subcc r2, r2, ip )
CALGN( bcc 15f )
-11: stmfd sp!, {r5 - r9}
+11: push {r5 - r8, r10}
cfi_adjust_cfa_offset (20)
cfi_rel_offset (r5, 0)
cfi_rel_offset (r6, 4)
cfi_rel_offset (r7, 8)
cfi_rel_offset (r8, 12)
- cfi_rel_offset (r9, 16)
+ cfi_rel_offset (r10, 16)
- PLD( pld [r1, #-4] )
+ PLD( sfi_pld r1, #-4 )
PLD( subs r2, r2, #96 )
- PLD( pld [r1, #-32] )
+ PLD( sfi_pld r1, #-32 )
PLD( blt 13f )
- PLD( pld [r1, #-64] )
- PLD( pld [r1, #-96] )
+ PLD( sfi_pld r1, #-64 )
+ PLD( sfi_pld r1, #-96 )
-12: PLD( pld [r1, #-128] )
-13: ldmdb r1!, {r7, r8, r9, ip}
- mov lr, r3, push #\push
+12: PLD( sfi_pld r1, #-128 )
+13: sfi_breg r1, \
+ ldmdb \B!, {r7, r8, r10, ip}
+ mov lr, r3, PUSH #\push
subs r2, r2, #32
- ldmdb r1!, {r3, r4, r5, r6}
- orr lr, lr, ip, pull #\pull
- mov ip, ip, push #\push
- orr ip, ip, r9, pull #\pull
- mov r9, r9, push #\push
- orr r9, r9, r8, pull #\pull
- mov r8, r8, push #\push
- orr r8, r8, r7, pull #\pull
- mov r7, r7, push #\push
- orr r7, r7, r6, pull #\pull
- mov r6, r6, push #\push
- orr r6, r6, r5, pull #\pull
- mov r5, r5, push #\push
- orr r5, r5, r4, pull #\pull
- mov r4, r4, push #\push
- orr r4, r4, r3, pull #\pull
- stmdb r0!, {r4 - r9, ip, lr}
+ sfi_breg r1, \
+ ldmdb \B!, {r3, r4, r5, r6}
+ orr lr, lr, ip, PULL #\pull
+ mov ip, ip, PUSH #\push
+ orr ip, ip, r10, PULL #\pull
+ mov r10, r10, PUSH #\push
+ orr r10, r10, r8, PULL #\pull
+ mov r8, r8, PUSH #\push
+ orr r8, r8, r7, PULL #\pull
+ mov r7, r7, PUSH #\push
+ orr r7, r7, r6, PULL #\pull
+ mov r6, r6, PUSH #\push
+ orr r6, r6, r5, PULL #\pull
+ mov r5, r5, PUSH #\push
+ orr r5, r5, r4, PULL #\pull
+ mov r4, r4, PUSH #\push
+ orr r4, r4, r3, PULL #\pull
+ sfi_breg r0, \
+ stmdb \B!, {r4 - r8, r10, ip, lr}
bge 12b
PLD( cmn r2, #96 )
PLD( bge 13b )
- ldmfd sp!, {r5 - r9}
+ pop {r5 - r8, r10}
cfi_adjust_cfa_offset (-20)
cfi_restore (r5)
cfi_restore (r6)
cfi_restore (r7)
cfi_restore (r8)
- cfi_restore (r9)
+ cfi_restore (r10)
14: ands ip, r2, #28
beq 16f
-15: mov lr, r3, push #\push
- ldr r3, [r1, #-4]!
+15: mov lr, r3, PUSH #\push
+ sfi_breg r1, \
+ ldr r3, [\B, #-4]!
subs ip, ip, #4
- orr lr, lr, r3, pull #\pull
- str lr, [r0, #-4]!
+ orr lr, lr, r3, PULL #\pull
+ sfi_breg r0, \
+ str lr, [\B, #-4]!
bgt 15b
CALGN( cmp r2, #0 )
CALGN( bge 11b )
diff --git a/libc/ports/sysdeps/arm/memset.S b/libc/ports/sysdeps/arm/memset.S
index 9924cb911..a28cdc620 100644
--- a/libc/ports/sysdeps/arm/memset.S
+++ b/libc/ports/sysdeps/arm/memset.S
@@ -20,6 +20,9 @@
#define NO_THUMB
#include <sysdep.h>
+ .text
+ .syntax unified
+
/* void *memset (dstpp, c, len) */
ENTRY(memset)
@@ -29,7 +32,8 @@ ENTRY(memset)
1:
tst r3, #3 @ aligned yet?
- strneb r1, [r3], #1
+ sfi_breg r3, \
+ strbne r1, [\B], #1
subne r2, r2, #1
bne 1b
@@ -40,27 +44,35 @@ ENTRY(memset)
1:
subs r2, r2, #8
- stmcsia r3!, {r1, ip} @ store up to 32 bytes per loop iteration
- subcss r2, r2, #8
- stmcsia r3!, {r1, ip}
- subcss r2, r2, #8
- stmcsia r3!, {r1, ip}
- subcss r2, r2, #8
- stmcsia r3!, {r1, ip}
+ sfi_breg r3, \
+ stmiacs \B!, {r1, ip} @ store up to 32 bytes per loop iteration
+ subscs r2, r2, #8
+ sfi_breg r3, \
+ stmiacs \B!, {r1, ip}
+ subscs r2, r2, #8
+ sfi_breg r3, \
+ stmiacs \B!, {r1, ip}
+ subscs r2, r2, #8
+ sfi_breg r3, \
+ stmiacs \B!, {r1, ip}
bcs 1b
and r2, r2, #7
2:
subs r2, r2, #1 @ store up to 4 bytes per loop iteration
- strcsb r1, [r3], #1
- subcss r2, r2, #1
- strcsb r1, [r3], #1
- subcss r2, r2, #1
- strcsb r1, [r3], #1
- subcss r2, r2, #1
- strcsb r1, [r3], #1
+ sfi_breg r3, \
+ strbcs r1, [\B], #1
+ subscs r2, r2, #1
+ sfi_breg r3, \
+ strbcs r1, [\B], #1
+ subscs r2, r2, #1
+ sfi_breg r3, \
+ strbcs r1, [\B], #1
+ subscs r2, r2, #1
+ sfi_breg r3, \
+ strbcs r1, [\B], #1
bcs 2b
-
+
DO_RET(lr)
END(memset)
libc_hidden_builtin_def (memset)
diff --git a/libc/ports/sysdeps/arm/preconfigure b/libc/ports/sysdeps/arm/preconfigure
index 6d61b1428..7ba17492e 100644
--- a/libc/ports/sysdeps/arm/preconfigure
+++ b/libc/ports/sysdeps/arm/preconfigure
@@ -1,53 +1,63 @@
+# This file is generated from configure.in by Autoconf. DO NOT EDIT!
+ # Local preconfigure fragment for sysdeps/arm
+
case "$machine" in
arm*)
- base_machine=arm
- case $config_os in
- linux-gnueabi*)
- # Lets ask the compiler which ARM family we've got
- # Unfortunately it doesn't define any flags for implementations
- # that you might pass to -mcpu or -mtune
- # Note if you add patterns here you must ensure that
- # an appropriate directory exists in sysdeps/arm
- archcppflag=`echo "" |
- $CC $CFLAGS $CPPFLAGS -E -dM - |
- grep '__ARM_ARCH_[0-9].*__' |
- sed -e 's/^#define //' -e 's/ .*//'`
+ case $config_os in
+ linux-gnueabi*)
+ # If the compiler enables unwind tables by default, this causes
+ # problems with undefined symbols in -nostdlib link tests. To
+ # avoid this, add -fno-unwind-tables here and remove it in
+ # sysdeps/unix/sysv/linux/arm/configure.in after those tests have
+ # been run.
+ if "${CFLAGS+set}" != "set" ; then
+ CFLAGS="-g -O2"
+ fi
+ CFLAGS="$CFLAGS -fno-unwind-tables"
+ ;;
+ linux*)
+ as_fn_error $? "Old ABI no longer supported" "$LINENO" 5
+ ;;
+ esac
+
+ base_machine=arm
+ # Lets ask the compiler which ARM family we've got
+ # Unfortunately it doesn't define any flags for implementations
+ # that you might pass to -mcpu or -mtune
+ # Note if you add patterns here you must ensure that
+ # an appropriate directory exists in sysdeps/arm
+ archcppflag=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null |
+ sed -n 's/^#define \(__ARM_ARCH_[0-9].*__\) .*$/\1/p'`
- case x$archcppflag in
- x__ARM_ARCH_[89]*__)
- machine=armv7
- echo "Found compiler is configured for something newer than v7 - using v7"
- ;;
+ case "x$archcppflag" in
+ x__ARM_ARCH_89*__)
+ machine=armv7
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Found compiler is configured for something newer than v7 - using v7" >&5
+$as_echo "$as_me: Found compiler is configured for something newer than v7 - using v7" >&6;}
+ ;;
- x__ARM_ARCH_7A__)
- machine=armv7
- echo "Found compiler is configured for $machine"
- ;;
+ x__ARM_ARCH_7A__)
+ machine=armv7
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Found compiler is configured for $machine" >&5
+$as_echo "$as_me: Found compiler is configured for $machine" >&6;}
+ ;;
- x__ARM_ARCH_6T2__)
- machine=armv6t2
- echo "Found compiler is configured for $machine"
- ;;
- x__ARM_ARCH_6*__)
- machine=armv6
- echo "Found compiler is configured for $machine"
- ;;
- *)
- machine=arm
- echo 2>&1 "arm/preconfigure: Did not find ARM architecture type; using default"
- ;;
- esac
+ x__ARM_ARCH_6T2__)
+ machine=armv6t2
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Found compiler is configured for $machine" >&5
+$as_echo "$as_me: Found compiler is configured for $machine" >&6;}
+ ;;
+ x__ARM_ARCH_6*__)
+ machine=armv6
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Found compiler is configured for $machine" >&5
+$as_echo "$as_me: Found compiler is configured for $machine" >&6;}
+ ;;
+ *)
+ machine=arm
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: arm/preconfigure: Did not find ARM architecture type; using default" >&5
+$as_echo "$as_me: WARNING: arm/preconfigure: Did not find ARM architecture type; using default" >&2;}
+ ;;
+ esac
- machine=arm/$machine
- if [ "${CFLAGS+set}" != "set" ]; then
- CFLAGS="-g -O2"
- fi
- CFLAGS="$CFLAGS -fno-unwind-tables"
- ;;
- linux*)
- echo "Old ABI no longer supported" 2>&1
- exit 1
- ;;
- esac
- ;;
+ machine=arm/$machine
esac
diff --git a/libc/ports/sysdeps/arm/preconfigure.in b/libc/ports/sysdeps/arm/preconfigure.in
new file mode 100644
index 000000000..99f21282f
--- /dev/null
+++ b/libc/ports/sysdeps/arm/preconfigure.in
@@ -0,0 +1,58 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local preconfigure fragment for sysdeps/arm
+
+case "$machine" in
+arm*)
+ case $config_os in
+ linux-gnueabi*)
+ # If the compiler enables unwind tables by default, this causes
+ # problems with undefined symbols in -nostdlib link tests. To
+ # avoid this, add -fno-unwind-tables here and remove it in
+ # sysdeps/unix/sysv/linux/arm/configure.in after those tests have
+ # been run.
+ if [ "${CFLAGS+set}" != "set" ]; then
+ CFLAGS="-g -O2"
+ fi
+ CFLAGS="$CFLAGS -fno-unwind-tables"
+ ;;
+ linux*)
+ AC_MSG_ERROR([Old ABI no longer supported])
+ ;;
+ esac
+
+ base_machine=arm
+ # Lets ask the compiler which ARM family we've got
+ # Unfortunately it doesn't define any flags for implementations
+ # that you might pass to -mcpu or -mtune
+ # Note if you add patterns here you must ensure that
+ # an appropriate directory exists in sysdeps/arm
+ archcppflag=`$CC $CFLAGS $CPPFLAGS -E -dM -xc /dev/null |
+ sed -n 's/^#define \(__ARM_ARCH_[0-9].*__\) .*$/\1/p'`
+
+ case "x$archcppflag" in
+ x__ARM_ARCH_[89]*__)
+ machine=armv7
+ AC_MSG_NOTICE([Found compiler is configured for something newer than v7 - using v7])
+ ;;
+
+ x__ARM_ARCH_7A__)
+ machine=armv7
+ AC_MSG_NOTICE([Found compiler is configured for $machine])
+ ;;
+
+ x__ARM_ARCH_6T2__)
+ machine=armv6t2
+ AC_MSG_NOTICE([Found compiler is configured for $machine])
+ ;;
+ x__ARM_ARCH_6*__)
+ machine=armv6
+ AC_MSG_NOTICE([Found compiler is configured for $machine])
+ ;;
+ *)
+ machine=arm
+ AC_MSG_WARN([arm/preconfigure: Did not find ARM architecture type; using default])
+ ;;
+ esac
+
+ machine=arm/$machine
+esac
diff --git a/libc/ports/sysdeps/arm/setjmp.S b/libc/ports/sysdeps/arm/setjmp.S
index 6776cab38..f75047065 100644
--- a/libc/ports/sysdeps/arm/setjmp.S
+++ b/libc/ports/sysdeps/arm/setjmp.S
@@ -19,8 +19,6 @@
/* ??? Needs more rearrangement for the STM to handle thumb mode. */
#define NO_THUMB
#include <sysdep.h>
-#define _SETJMP_H
-#define _ASM
#include <bits/setjmp.h>
#include <rtld-global-offsets.h>
#include <arm-features.h>
@@ -29,7 +27,8 @@ ENTRY (__sigsetjmp)
mov ip, r0
/* Save registers */
- stmia ip!, {v1-v6, sl, fp, sp, lr}
+ sfi_breg ip, \
+ stmia \B!, JMP_BUF_REGLIST
#if !defined ARM_ASSUME_NO_IWMMXT || defined __SOFTFP__
# define NEED_HWCAP 1
@@ -66,11 +65,13 @@ ENTRY (__sigsetjmp)
Don't use VFP instructions directly because this code
is used in non-VFP multilibs. */
/* Following instruction is vstmia ip!, {d8-d15}. */
- stc p11, cr8, [ip], #64
+ sfi_breg ip, \
+ stc p11, cr8, [\B], #64
/* Store the floating-point status register. */
/* Following instruction is vmrs a4, fpscr. */
mrc p10, 7, a4, cr1, cr0, 0
- str a4, [ip], #4
+ sfi_breg ip, \
+ str a4, [\B], #4
.Lno_vfp:
#ifndef ARM_ASSUME_NO_IWMMXT
@@ -79,12 +80,18 @@ ENTRY (__sigsetjmp)
/* Save the call-preserved iWMMXt registers. */
/* Following instructions are wstrd wr10, [ip], #8 (etc.) */
- stcl p1, cr10, [r12], #8
- stcl p1, cr11, [r12], #8
- stcl p1, cr12, [r12], #8
- stcl p1, cr13, [r12], #8
- stcl p1, cr14, [r12], #8
- stcl p1, cr15, [r12], #8
+ sfi_breg r12, \
+ stcl p1, cr10, [\B], #8
+ sfi_breg r12, \
+ stcl p1, cr11, [\B], #8
+ sfi_breg r12, \
+ stcl p1, cr12, [\B], #8
+ sfi_breg r12, \
+ stcl p1, cr13, [\B], #8
+ sfi_breg r12, \
+ stcl p1, cr14, [\B], #8
+ sfi_breg r12, \
+ stcl p1, cr15, [\B], #8
.Lno_iwmmxt:
#endif
diff --git a/libc/ports/sysdeps/arm/start.S b/libc/ports/sysdeps/arm/start.S
index a1d15b810..0a57b0bec 100644
--- a/libc/ports/sysdeps/arm/start.S
+++ b/libc/ports/sysdeps/arm/start.S
@@ -80,14 +80,14 @@ _start:
mov lr, #0
/* Pop argc off the stack and save a pointer to argv */
- ldr a2, [sp], #4
+ pop { a2 }
mov a3, sp
/* Push stack limit */
- str a3, [sp, #-4]!
+ push { a3 }
/* Push rtld_fini */
- str a1, [sp, #-4]!
+ push { a1 }
#ifdef SHARED
ldr sl, .L_GOT
@@ -97,7 +97,7 @@ _start:
ldr ip, .L_GOT+4 /* __libc_csu_fini */
ldr ip, [sl, ip]
- str ip, [sp, #-4]! /* Push __libc_csu_fini */
+ push { ip } /* Push __libc_csu_fini */
ldr a4, .L_GOT+8 /* __libc_csu_init */
ldr a4, [sl, a4]
@@ -113,7 +113,7 @@ _start:
ldr ip, =__libc_csu_fini
/* Push __libc_csu_fini */
- str ip, [sp, #-4]!
+ push { ip }
/* Set up the other arguments in registers */
ldr a1, =main
diff --git a/libc/ports/sysdeps/arm/strlen.S b/libc/ports/sysdeps/arm/strlen.S
index 2b947e240..7d358a724 100644
--- a/libc/ports/sysdeps/arm/strlen.S
+++ b/libc/ports/sysdeps/arm/strlen.S
@@ -25,9 +25,13 @@
* exit: r0 = len
*/
+ .syntax unified
+ .text
+
ENTRY(strlen)
bic r1, r0, $3 @ addr of word containing first byte
- ldr r2, [r1], $4 @ get the first word
+ sfi_breg r1, \
+ ldr r2, [\B], $4 @ get the first word
ands r3, r0, $3 @ how many bytes are duff?
rsb r0, r3, $0 @ get - that number into counter.
beq Laligned @ skip into main check routine if no
@@ -51,7 +55,8 @@ Laligned: @ here, we have a word in r2. Does it
tstne r2, $0x00ff0000 @
tstne r2, $0xff000000 @
addne r0, r0, $4 @ if not, the string is 4 bytes longer
- ldrne r2, [r1], $4 @ and we continue to the next word
+ sfi_breg r1, \
+ ldrne r2, [\B], $4 @ and we continue to the next word
bne Laligned @
Llastword: @ drop through to here once we find a
#ifdef __ARMEB__
diff --git a/libc/ports/sysdeps/arm/sub_n.S b/libc/ports/sysdeps/arm/sub_n.S
new file mode 100644
index 000000000..8eafa41e6
--- /dev/null
+++ b/libc/ports/sysdeps/arm/sub_n.S
@@ -0,0 +1,2 @@
+#define USE_AS_SUB_N
+#include "add_n.S"
diff --git a/libc/ports/sysdeps/arm/submul_1.S b/libc/ports/sysdeps/arm/submul_1.S
new file mode 100644
index 000000000..2d17490d8
--- /dev/null
+++ b/libc/ports/sysdeps/arm/submul_1.S
@@ -0,0 +1,74 @@
+/* mpn_submul_1 -- multiply and subtract bignums.
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+ .syntax unified
+ .text
+
+@ cycles/limb
+@ StrongArm ?
+@ Cortex-A8 ?
+@ Cortex-A9 ?
+@ Cortex-A15 4
+
+/* mp_limb_t mpn_submul_1(res_ptr, src1_ptr, size, s2_limb) */
+
+ENTRY (__mpn_submul_1)
+ push { r4, r5, r6, r7 }
+ cfi_adjust_cfa_offset (16)
+ cfi_rel_offset (r4, 0)
+ cfi_rel_offset (r5, 4)
+ cfi_rel_offset (r6, 8)
+ cfi_rel_offset (r7, 12)
+
+ sfi_breg r1, \
+ ldr r6, [\B], #4
+ sfi_breg r0, \
+ ldr r7, [\B]
+ mov r4, #0 /* init carry in */
+ b 1f
+0:
+ sfi_breg r1, \
+ ldr r6, [\B], #4 /* load next ul */
+ adds r5, r5, r4 /* (lpl, c) = lpl + cl */
+ adc r4, ip, #0 /* cl = hpl + c */
+ subs r5, r7, r5 /* (lpl, !c) = rl - lpl */
+ sfi_breg r0, \
+ ldr r7, [\B, #4] /* load next rl */
+ it cc
+ addcc r4, r4, #1 /* cl += !c */
+ sfi_breg r0, \
+ str r5, [\B], #4
+1:
+ umull r5, ip, r6, r3 /* (hpl, lpl) = ul * vl */
+ subs r2, r2, #1
+ bne 0b
+
+ adds r5, r5, r4 /* (lpl, c) = lpl + cl */
+ adc r4, ip, #0 /* cl = hpl + c */
+ subs r5, r7, r5 /* (lpl, !c) = rl - lpl */
+ sfi_breg r0, \
+ str r5, [\B], #4
+ it cc
+ addcc r4, r4, #1 /* cl += !c */
+ mov r0, r4 /* return carry */
+
+ pop { r4, r5, r6, r7 }
+ DO_RET (lr)
+END (__mpn_submul_1)
diff --git a/libc/ports/sysdeps/arm/sysdep.h b/libc/ports/sysdeps/arm/sysdep.h
index 4af7429ac..83df7ebc3 100644
--- a/libc/ports/sysdeps/arm/sysdep.h
+++ b/libc/ports/sysdeps/arm/sysdep.h
@@ -19,9 +19,42 @@
#include <sysdeps/generic/sysdep.h>
#include <features.h>
-#if (!defined (__ARM_ARCH_2__) && !defined (__ARM_ARCH_3__) \
- && !defined (__ARM_ARCH_3M__) && !defined (__ARM_ARCH_4__))
-# define __USE_BX__
+/* The __ARM_ARCH define is provided by gcc 4.8. Construct it otherwise. */
+#ifndef __ARM_ARCH
+# ifdef __ARM_ARCH_2__
+# define __ARM_ARCH 2
+# elif defined (__ARM_ARCH_3__) || defined (__ARM_ARCH_3M__)
+# define __ARM_ARCH 3
+# elif defined (__ARM_ARCH_4__) || defined (__ARM_ARCH_4T__)
+# define __ARM_ARCH 4
+# elif defined (__ARM_ARCH_5__) || defined (__ARM_ARCH_5E__) \
+ || defined(__ARM_ARCH_5T__) || defined(__ARM_ARCH_5TE__) \
+ || defined(__ARM_ARCH_5TEJ__)
+# define __ARM_ARCH 5
+# elif defined (__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) \
+ || defined (__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) \
+ || defined (__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__)
+# define __ARM_ARCH 6
+# elif defined (__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \
+ || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \
+ || defined(__ARM_ARCH_7EM__)
+# define __ARM_ARCH 7
+# else
+# error unknown arm architecture
+# endif
+#endif
+
+#if __ARM_ARCH > 4 || defined (__ARM_ARCH_4T__)
+# define ARCH_HAS_BX
+#endif
+#if __ARM_ARCH > 4
+# define ARCH_HAS_BLX
+#endif
+#if __ARM_ARCH > 6 || defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6ZK__)
+# define ARCH_HAS_HARD_TP
+#endif
+#if __ARM_ARCH > 6 || defined (__ARM_ARCH_6T2__)
+# define ARCH_HAS_T2
#endif
#ifdef __ASSEMBLER__
@@ -33,30 +66,23 @@
#define PLTJMP(_x) _x##(PLT)
-/* APCS-32 doesn't preserve the condition codes across function call. */
-#ifdef __APCS_32__
-#define LOADREGS(cond, base, reglist...)\
- ldm##cond base,reglist
-#ifdef __USE_BX__
-#define RETINSTR(cond, reg) \
- bx##cond reg
-#define DO_RET(_reg) \
- bx _reg
+#ifdef ARCH_HAS_BX
+# define BX(R) bx R
+# define BXC(C, R) bx##C R
+# ifdef ARCH_HAS_BLX
+# define BLX(R) blx R
+# else
+# define BLX(R) mov lr, pc; bx R
+# endif
#else
-#define RETINSTR(cond, reg) \
- mov##cond pc, reg
-#define DO_RET(_reg) \
- mov pc, _reg
-#endif
-#else /* APCS-26 */
-#define LOADREGS(cond, base, reglist...)\
- ldm##cond base,reglist^
-#define RETINSTR(cond, reg) \
- mov##cond##s pc, reg
-#define DO_RET(_reg) \
- movs pc, _reg
+# define BX(R) mov pc, R
+# define BXC(C, R) mov##C pc, R
+# define BLX(R) mov lr, pc; mov pc, R
#endif
+#define DO_RET(R) BX(R)
+#define RETINSTR(C, R) BXC(C, R)
+
/* Define an entry point visible from C. */
#define ENTRY(name) \
.globl C_SYMBOL_NAME(name); \
@@ -80,7 +106,7 @@
/* Call __gnu_mcount_nc if GCC >= 4.4. */
#if __GNUC_PREREQ(4,4)
#define CALL_MCOUNT \
- str lr,[sp, #-4]!; \
+ push {lr}; \
cfi_adjust_cfa_offset (4); \
cfi_rel_offset (lr, 0); \
bl PLTJMP(mcount); \
@@ -88,11 +114,11 @@
cfi_restore (lr)
#else /* else call _mcount */
#define CALL_MCOUNT \
- str lr,[sp, #-4]!; \
+ push {lr}; \
cfi_adjust_cfa_offset (4); \
cfi_rel_offset (lr, 0); \
bl PLTJMP(mcount); \
- ldr lr, [sp], #4; \
+ pops {lr}; \
cfi_adjust_cfa_offset (-4); \
cfi_restore (lr)
#endif
@@ -117,11 +143,124 @@
the caller. */
.eabi_attribute 24, 1
+/* The thumb2 encoding is reasonably complete. Unless suppressed, use it. */
+ .syntax unified
+# if defined(__thumb2__) && !defined(NO_THUMB)
+ .thumb
+#else
+# undef __thumb__
+# undef __thumb2__
+ .arm
+# endif
+
+/* Load or store to/from a pc-relative EXPR into/from R, using T. */
+# ifdef __thumb2__
+# define LDST_PCREL(OP, R, T, EXPR) \
+ ldr T, 98f; \
+ .subsection 2; \
+98: .word EXPR - 99f - PC_OFS; \
+ .previous; \
+99: add T, T, pc; \
+ OP R, [T]
+# else
+# define LDST_PCREL(OP, R, T, EXPR) \
+ ldr T, 98f; \
+ .subsection 2; \
+98: .word EXPR - 99f - PC_OFS; \
+ .previous; \
+99: OP R, [pc, T]
+# endif
+
+/* Cope with negative memory offsets, which thumb can't encode.
+ Use NEGOFF_ADJ_BASE to (conditionally) alter the base register,
+ and then NEGOFF_OFF1 to use 0 for thumb and the offset for arm,
+ or NEGOFF_OFF2 to use A-B for thumb and A for arm. */
+# ifdef __thumb2__
+# define NEGOFF_ADJ_BASE(R, OFF) add R, R, $OFF
+# define NEGOFF_ADJ_BASE2(D, S, OFF) add D, S, $OFF
+# define NEGOFF_OFF1(R, OFF) [R]
+# define NEGOFF_OFF2(R, OFFA, OFFB) [R, $((OFFA) - (OFFB))]
+# else
+# define NEGOFF_ADJ_BASE(R, OFF)
+# define NEGOFF_ADJ_BASE2(D, S, OFF) mov D, S
+# define NEGOFF_OFF1(R, OFF) [R, $OFF]
+# define NEGOFF_OFF2(R, OFFA, OFFB) [R, $OFFA]
+# endif
+
+/* Helper to get the TLS base pointer. The interface is that TMP is a
+ register that may be used to hold the LR, if necessary. TMP may be
+ LR itself to indicate that LR need not be saved. The base pointer
+ is returned in R0. Only R0 and TMP are modified. */
+
+# ifdef ARCH_HAS_HARD_TP
+/* If the cpu has cp15 available, use it. */
+# define GET_TLS(TMP) mrc p15, 0, r0, c13, c0, 3
+# else
+/* At this generic level we have no tricks to pull. Call the ABI routine. */
+# define GET_TLS(TMP) \
+ push { r1, r2, r3, lr }; \
+ cfi_remember_state; \
+ cfi_adjust_cfa_offset (16); \
+ cfi_rel_offset (r1, 0); \
+ cfi_rel_offset (r2, 4); \
+ cfi_rel_offset (r3, 8); \
+ cfi_rel_offset (lr, 12); \
+ bl __aeabi_read_tp; \
+ pop { r1, r2, r3, lr }; \
+ cfi_restore_state
+# endif /* ARCH_HAS_HARD_TP */
+
+# ifndef ARM_SFI_MACROS
+# define ARM_SFI_MACROS 1
+/* This assembly macro is prepended to any load/store instruction,
+ pulling the base register out of the addressing mode syntax and
+ making it the first operand of the macro. For example:
+ ldr r0, [r1]
+ becomes:
+ sfi_breg r1, ldr r0, [\B]
+ The \B stands in for the base register that is the first operand
+ to the macro, so we can avoid error-prone repetition of the base
+ register in two places on the line.
+
+ This is used for all memory access through a base register other
+ than PC or SP. It's intended to support SFI schemes such as
+ Native Client, where the OS will enforce that all load/store
+ instructions use a special form. In any such configuration,
+ another sysdep.h file will have defined ARM_SFI_MACROS and
+ provided its own assembly macros with the same interface. */
+
+ .macro sfi_breg basereg, insn, operands:vararg
+ .macro _sfi_breg_doit B
+ \insn \operands
+ .endm
+ _sfi_breg_doit \basereg
+ .purgem _sfi_breg_doit
+ .endm
+
+/* This assembly macro replaces the "pld" instruction.
+ The syntax:
+ sfi_pld REGISTER, #OFFSET
+ is exactly equivalent to:
+ sfi_breg REGISTER, pld [\B, #OFFSET]
+ (and ", #OFFSET" is optional). We have a separate macro
+ only to work around a bug in GAS versions prior to 2.23.2,
+ that misparses the sfi_breg macro expansion in this case. */
+
+ .macro sfi_pld basereg, offset=#0
+ pld [\basereg, \offset]
+ .endm
+
+/* This macro precedes any instruction that directly changes the SP.
+ It's not needed for push/pop or for any kind of load or store that
+ implicitly changes the SP via the ! syntax. */
+# define sfi_sp /* Nothing to do. */
+
+# endif
+
#endif /* __ASSEMBLER__ */
/* This number is the offset from the pc at the current location. */
-/* ??? At the moment we're not turning on thumb mode in assembly. */
-#if defined(__thumb__) && !defined(__ASSEMBLER__)
+#ifdef __thumb__
# define PC_OFS 4
#else
# define PC_OFS 8
diff --git a/libc/ports/sysdeps/ia64/dl-fptr.h b/libc/ports/sysdeps/ia64/dl-fptr.h
index c2bef6c28..447c098af 100644
--- a/libc/ports/sysdeps/ia64/dl-fptr.h
+++ b/libc/ports/sysdeps/ia64/dl-fptr.h
@@ -32,4 +32,14 @@
#define ELF_MACHINE_LOAD_ADDRESS(var, symbol) \
asm ("movl %0 = @gprel (" #symbol ");; add %0 = %0, gp" : "=&r" (var));
+/* We don't have a gcc helper to extract the plabel info. */
+#define ELF_PTR_TO_FDESC(ptr) \
+ ({ union { \
+ void *_ptr; \
+ struct fdesc *_fdesc; \
+ } _u; \
+ _u._ptr = ptr; \
+ _u._fdesc; \
+ })
+
#endif /* !dl_ia64_fptr_h */
diff --git a/libc/ports/sysdeps/ia64/dl-machine.h b/libc/ports/sysdeps/ia64/dl-machine.h
index 2eb80d752..dd469d7a7 100644
--- a/libc/ports/sysdeps/ia64/dl-machine.h
+++ b/libc/ports/sysdeps/ia64/dl-machine.h
@@ -119,7 +119,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
/* This function will be called to perform the relocation. */
if (!profile)
- doit = (Elf64_Addr) ((struct fdesc *) &_dl_runtime_resolve)->ip;
+ doit = (Elf64_Addr) ELF_PTR_TO_FDESC (&_dl_runtime_resolve)->ip;
else
{
if (GLRO(dl_profile) != NULL
@@ -129,7 +129,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
want profiling and the timers are started. */
GL(dl_profile_map) = l;
}
- doit = (Elf64_Addr) ((struct fdesc *) &_dl_runtime_profile)->ip;
+ doit = (Elf64_Addr) ELF_PTR_TO_FDESC (&_dl_runtime_profile)->ip;
}
reserve[1] = doit;
diff --git a/libc/ports/sysdeps/ia64/entry.h b/libc/ports/sysdeps/ia64/entry.h
index b93e1b6a5..e11b49fc5 100644
--- a/libc/ports/sysdeps/ia64/entry.h
+++ b/libc/ports/sysdeps/ia64/entry.h
@@ -1,10 +1,13 @@
+#include <link.h>
+#include <dl-fptr.h>
+
#ifndef __ASSEMBLY__
extern void _start (void);
#endif
/* The function's entry point is stored in the first word of the
function descriptor (plabel) of _start(). */
-#define ENTRY_POINT (((long int *) _start)[0])
+#define ENTRY_POINT ELF_PTR_TO_FDESC (_start)->ip
/* We have to provide a special declaration. */
#define ENTRY_POINT_DECL(class) class void _start (void);
diff --git a/libc/ports/sysdeps/ia64/fpu/libm_error.c b/libc/ports/sysdeps/ia64/fpu/libm_error.c
index 8ef4bb5a7..a9307dd4b 100644
--- a/libc/ports/sysdeps/ia64/fpu/libm_error.c
+++ b/libc/ports/sysdeps/ia64/fpu/libm_error.c
@@ -162,80 +162,79 @@ struct exceptionl excl;
# endif
-#define STATIC static
+#define _DECL_NUM(type, prefix, var, bytes...) \
+ ALIGNIT static const union { \
+ const char _bytes[sizeof (type)]; \
+ const type num; \
+ } prefix ## var = { \
+ ._bytes = bytes, \
+ }
+
+#define DECL_FLOAT(var, bytes...) \
+ _DECL_NUM (float, float_, var, ##bytes)
+
+DECL_FLOAT(inf, {0x00,0x00,0x80,0x7F});
+DECL_FLOAT(huge, {0xFF,0xFF,0x7F,0x7F});
+DECL_FLOAT(zero, {0x00,0x00,0x00,0x00});
+DECL_FLOAT(neg_inf, {0x00,0x00,0x80,0xFF});
+DECL_FLOAT(neg_huge, {0xFF,0xFF,0x7F,0xFF});
+DECL_FLOAT(neg_zero, {0x00,0x00,0x00,0x80});
-ALIGNIT
-STATIC const char float_inf[4] = {0x00,0x00,0x80,0x7F};
-ALIGNIT
-STATIC const char float_huge[4] = {0xFF,0xFF,0x7F,0x7F};
-ALIGNIT
-STATIC const char float_zero[4] = {0x00,0x00,0x00,0x00};
-ALIGNIT
-STATIC const char float_neg_inf[4] = {0x00,0x00,0x80,0xFF};
-ALIGNIT
-STATIC const char float_neg_huge[4] = {0xFF,0xFF,0x7F,0xFF};
-ALIGNIT
-STATIC const char float_neg_zero[4] = {0x00,0x00,0x00,0x80};
-ALIGNIT
-STATIC const char double_inf[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x7F};
+#define DECL_DOUBLE(var, bytes...) \
+ _DECL_NUM (double, double_, var, ##bytes)
+
+DECL_DOUBLE(inf, {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x7F});
#ifndef _LIBC
-ALIGNIT
-STATIC const char double_huge[8] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0x7F};
+DECL_DOUBLE(huge, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0x7F});
#endif
-ALIGNIT
-STATIC const char double_zero[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
-ALIGNIT
-STATIC const char double_neg_inf[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF};
+DECL_DOUBLE(zero, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00});
+DECL_DOUBLE(neg_inf, {0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xFF});
#ifndef _LIBC
-ALIGNIT
-STATIC const char double_neg_huge[8] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF};
+DECL_DOUBLE(neg_huge, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xEF,0xFF});
#endif
-ALIGNIT
-STATIC const char double_neg_zero[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80};
-ALIGNIT
-STATIC const char long_double_inf[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00};
-ALIGNIT
+DECL_DOUBLE(neg_zero, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80});
+
+#define DECL_LONG_DOUBLE(var, bytes...) \
+ _DECL_NUM (long double, long_double_, var, ##bytes)
+
+DECL_LONG_DOUBLE(inf, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00});
#ifndef _LIBC
-STATIC const char long_double_huge[16] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00};
+DECL_LONG_DOUBLE(huge, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x7F,0x00,0x00,0x00,0x00,0x00,0x00});
#endif
-ALIGNIT
-STATIC const char long_double_zero[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
-ALIGNIT
-STATIC const char long_double_neg_inf[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00};
-ALIGNIT
+DECL_LONG_DOUBLE(zero, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00});
+DECL_LONG_DOUBLE(neg_inf, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00});
#ifndef _LIBC
-STATIC const char long_double_neg_huge[16] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0x00};
+DECL_LONG_DOUBLE(neg_huge, {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0x00});
#endif
-ALIGNIT
-STATIC const char long_double_neg_zero[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00};
+DECL_LONG_DOUBLE(neg_zero, {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00});
-#define RETVAL_HUGE_VALL *(long double *)retval = *(long double *)long_double_inf
-#define RETVAL_NEG_HUGE_VALL *(long double *)retval = *(long double *)long_double_neg_inf
-#define RETVAL_HUGEL *(long double *)retval = (long double)*(float *)float_huge
-#define RETVAL_NEG_HUGEL *(long double *)retval =(long double)*(float*)float_neg_huge
+#define RETVAL_HUGE_VALL *(long double *)retval = long_double_inf.num
+#define RETVAL_NEG_HUGE_VALL *(long double *)retval = long_double_neg_inf.num
+#define RETVAL_HUGEL *(long double *)retval = (long double)float_huge.num
+#define RETVAL_NEG_HUGEL *(long double *)retval = (long double)float_neg_huge.num
-#define RETVAL_HUGE_VALD *(double *)retval = *(double *) double_inf
-#define RETVAL_NEG_HUGE_VALD *(double *)retval = *(double *) double_neg_inf
-#define RETVAL_HUGED *(double *)retval = (double) *(float *)float_huge
-#define RETVAL_NEG_HUGED *(double *)retval = (double) *(float *) float_neg_huge
+#define RETVAL_HUGE_VALD *(double *)retval = double_inf.num
+#define RETVAL_NEG_HUGE_VALD *(double *)retval = double_neg_inf.num
+#define RETVAL_HUGED *(double *)retval = (double)float_huge.num
+#define RETVAL_NEG_HUGED *(double *)retval = (double)float_neg_huge.num
-#define RETVAL_HUGE_VALF *(float *)retval = *(float *) float_inf
-#define RETVAL_NEG_HUGE_VALF *(float *)retval = *(float *) float_neg_inf
-#define RETVAL_HUGEF *(float *)retval = *(float *) float_huge
-#define RETVAL_NEG_HUGEF *(float *)retval = *(float *) float_neg_huge
+#define RETVAL_HUGE_VALF *(float *)retval = float_inf.num
+#define RETVAL_NEG_HUGE_VALF *(float *)retval = float_neg_inf.num
+#define RETVAL_HUGEF *(float *)retval = float_huge.num
+#define RETVAL_NEG_HUGEF *(float *)retval = float_neg_huge.num
-#define ZEROL_VALUE *(long double *)long_double_zero
-#define ZEROD_VALUE *(double *)double_zero
-#define ZEROF_VALUE *(float *)float_zero
+#define ZEROL_VALUE long_double_zero.num
+#define ZEROD_VALUE double_zero.num
+#define ZEROF_VALUE float_zero.num
-#define RETVAL_ZEROL *(long double *)retval = *(long double *)long_double_zero
-#define RETVAL_ZEROD *(double *)retval = *(double *)double_zero
-#define RETVAL_ZEROF *(float *)retval = *(float *)float_zero
+#define RETVAL_ZEROL *(long double *)retval = long_double_zero.num
+#define RETVAL_ZEROD *(double *)retval = double_zero.num
+#define RETVAL_ZEROF *(float *)retval = float_zero.num
-#define RETVAL_NEG_ZEROL *(long double *)retval = *(long double *)long_double_neg_zero
-#define RETVAL_NEG_ZEROD *(double *)retval = *(double *)double_neg_zero
-#define RETVAL_NEG_ZEROF *(float *)retval = *(float *)float_neg_zero
+#define RETVAL_NEG_ZEROL *(long double *)retval = long_double_neg_zero.num
+#define RETVAL_NEG_ZEROD *(double *)retval = double_neg_zero.num
+#define RETVAL_NEG_ZEROF *(float *)retval = float_neg_zero.num
#define RETVAL_ONEL *(long double *)retval = (long double) 1.0
#define RETVAL_ONED *(double *)retval = 1.0
diff --git a/libc/ports/sysdeps/mips/bits/nan.h b/libc/ports/sysdeps/mips/bits/nan.h
index 7aa157b1d..80f7866a9 100644
--- a/libc/ports/sysdeps/mips/bits/nan.h
+++ b/libc/ports/sysdeps/mips/bits/nan.h
@@ -22,10 +22,10 @@
/* IEEE Not A Number. */
-/* Note that MIPS has the QNaN and SNaN patterns reversed compared to most
- other architectures. The IEEE spec left the definition of this open to
+/* Note that MIPS has the qNaN and sNaN patterns reversed compared to most
+ other architectures. IEEE 754-1985 left the definition of this open to
implementations, and for MIPS the top bit of the mantissa must be SET to
- indicate a SNaN. */
+ indicate a sNaN. */
#if __GNUC_PREREQ(3,3)
@@ -43,14 +43,14 @@
# include <endian.h>
# if __BYTE_ORDER == __BIG_ENDIAN
-# define __nan_bytes { 0x7f, 0xbf, 0xff, 0xff }
+# define __qnan_bytes { 0x7f, 0xbf, 0xff, 0xff }
# endif
# if __BYTE_ORDER == __LITTLE_ENDIAN
-# define __nan_bytes { 0xff, 0xff, 0xbf, 0x7f }
+# define __qnan_bytes { 0xff, 0xff, 0xbf, 0x7f }
# endif
-static union { unsigned char __c[4]; float __d; } __nan_union
- __attribute__ ((__unused__)) = { __nan_bytes };
-# define NAN (__nan_union.__d)
+static union { unsigned char __c[4]; float __d; } __qnan_union
+ __attribute__ ((__unused__)) = { __qnan_bytes };
+# define NAN (__qnan_union.__d)
#endif /* GCC. */
diff --git a/libc/ports/sysdeps/unix/arm/sysdep.S b/libc/ports/sysdeps/unix/arm/sysdep.S
index 40e4d80ec..d82ad258a 100644
--- a/libc/ports/sysdeps/unix/arm/sysdep.S
+++ b/libc/ports/sysdeps/unix/arm/sysdep.S
@@ -37,28 +37,24 @@ __syscall_error:
#endif
#ifndef IS_IN_rtld
- mov ip, lr
- cfi_register (lr, ip)
- mov r1, r0
-
- mov r0, #0xffff0fff
- mov lr, pc
- sub pc, r0, #31
-
- ldr r2, 1f
-2: ldr r2, [pc, r2]
- str r1, [r0, r2]
- mvn r0, #0
- RETINSTR (, ip)
+ mov r1, r0
+ GET_TLS (r2)
+ ldr r2, 1f
+#ifdef __thumb__
+2: add r2, r2, pc
+ ldr r2, [r2]
+#else
+2: ldr r2, [pc, r2]
+#endif
+ str r1, [r0, r2]
+ mvn r0, #0
+ DO_RET(lr)
1: .word errno(gottpoff) + (. - 2b - PC_OFS)
#elif RTLD_PRIVATE_ERRNO
- ldr r1, 1f
-0: str r0, [pc, r1]
- mvn r0, $0
+ LDST_PCREL(str, r0, r1, C_SYMBOL_NAME(rtld_errno))
+ mvn r0, #0
DO_RET(r14)
-
-1: .word C_SYMBOL_NAME(rtld_errno) - 0b - PC_OFS
#else
#error "Unsupported non-TLS case"
#endif
diff --git a/libc/ports/sysdeps/unix/sysv/linux/aarch64/bits/mman.h b/libc/ports/sysdeps/unix/sysv/linux/aarch64/bits/mman.h
index 67c563ce2..770607b83 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/aarch64/bits/mman.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/aarch64/bits/mman.h
@@ -25,38 +25,8 @@
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
-
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0
-# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-#endif
-
-#ifdef __USE_MISC
/* These are Linux-specific. */
+#ifdef __USE_MISC
# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */
# define MAP_DENYWRITE 0x00800 /* ETXTBSY */
# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */
@@ -68,47 +38,7 @@
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
-/* Flags for `mlockall'. */
-#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
-#define MCL_FUTURE 2 /* Lock all additions to address
- space. */
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-# 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. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/libc/ports/sysdeps/unix/sysv/linux/aarch64/configure b/libc/ports/sysdeps/unix/sysv/linux/aarch64/configure
index 5a22126fe..04b6c81b6 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/aarch64/configure
+++ b/libc/ports/sysdeps/unix/sysv/linux/aarch64/configure
@@ -1,3 +1,16 @@
# This file is generated from configure.in by Autoconf. DO NOT EDIT!
+ # Local configure fragment for sysdeps/unix/sysv/linux/aarch64.
arch_minimum_kernel=3.7.0
+
+test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+ /usr | /usr/)
+ libc_cv_slibdir="/lib64"
+ if test "$libdir" = '${exec_prefix}/lib'; then
+ libdir='${exec_prefix}/lib64';
+ # Locale data can be shared between 32bit and 64bit libraries
+ libc_cv_localedir='${exec_prefix}/lib/locale'
+ fi
+ ;;
+esac
diff --git a/libc/ports/sysdeps/unix/sysv/linux/aarch64/configure.in b/libc/ports/sysdeps/unix/sysv/linux/aarch64/configure.in
index d1995d486..6596a1511 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/aarch64/configure.in
+++ b/libc/ports/sysdeps/unix/sysv/linux/aarch64/configure.in
@@ -2,3 +2,15 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
# Local configure fragment for sysdeps/unix/sysv/linux/aarch64.
arch_minimum_kernel=3.7.0
+
+test -n "$libc_cv_slibdir" ||
+case "$prefix" in
+ /usr | /usr/)
+ libc_cv_slibdir="/lib64"
+ if test "$libdir" = '${exec_prefix}/lib'; then
+ libdir='${exec_prefix}/lib64';
+ # Locale data can be shared between 32bit and 64bit libraries
+ libc_cv_localedir='${exec_prefix}/lib/locale'
+ fi
+ ;;
+esac
diff --git a/libc/ports/sysdeps/unix/sysv/linux/aarch64/nptl/libpthread.abilist b/libc/ports/sysdeps/unix/sysv/linux/aarch64/nptl/libpthread.abilist
index 031c70e8a..696158aef 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/aarch64/nptl/libpthread.abilist
+++ b/libc/ports/sysdeps/unix/sysv/linux/aarch64/nptl/libpthread.abilist
@@ -73,7 +73,6 @@ GLIBC_2.17
pause F
pread F
pread64 F
- pthread_atfork F
pthread_attr_destroy F
pthread_attr_getaffinity_np F
pthread_attr_getdetachstate F
diff --git a/libc/ports/sysdeps/unix/sysv/linux/alpha/bits/mman.h b/libc/ports/sysdeps/unix/sysv/linux/alpha/bits/mman.h
index 2238c2c72..c51b05d37 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/alpha/bits/mman.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/alpha/bits/mman.h
@@ -51,6 +51,9 @@
# define MAP_FILE 0
# define MAP_ANONYMOUS 0x10 /* Don't use a file. */
# define MAP_ANON MAP_ANONYMOUS
+/* When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size. */
+# define MAP_HUGE_SHIFT 26
+# define MAP_HUGE_MASK 0x3f
#endif
/* Not used by Linux, but here to make sure we don't clash with
diff --git a/libc/ports/sysdeps/unix/sysv/linux/alpha/bits/msq.h b/libc/ports/sysdeps/unix/sysv/linux/alpha/bits/msq.h
index 1b07465d4..8bb057b4e 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/alpha/bits/msq.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/alpha/bits/msq.h
@@ -25,6 +25,7 @@
#define MSG_NOERROR 010000 /* no error if message is too big */
#ifdef __USE_GNU
# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+# define MSG_COPY 040000 /* copy (not remove) all queue messages */
#endif
/* Types used in the structure definition. */
diff --git a/libc/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h b/libc/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h
index 5dd8ae13f..a6e85f99d 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/am33/bits/mman.h
@@ -24,35 +24,6 @@
But the kernel header is not namespace clean. */
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0
-# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-#endif
-
/* These are Linux-specific. */
#ifdef __USE_MISC
# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */
@@ -62,35 +33,5 @@
# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
-/* Flags for `mlockall'. */
-#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
-#define MCL_FUTURE 2 /* Lock all additions to address
- space. */
-
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
-
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S b/libc/ports/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S
index 29edec69d..6ee7a1aeb 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/____longjmp_chk.S
@@ -53,7 +53,7 @@ longjmp_msg:
cfi_remember_state; \
cmp sp, reg; \
bls .Lok; \
- str r7, [sp, #-4]!; \
+ push { r7 }; \
cfi_adjust_cfa_offset (4); \
cfi_rel_offset (r7, 0); \
mov r5, r0; \
@@ -79,7 +79,7 @@ longjmp_msg:
.Lfail: \
add sp, sp, #12; \
cfi_adjust_cfa_offset (-12); \
- ldr r7, [sp], #4; \
+ pop { r7 }; \
cfi_adjust_cfa_offset (-4); \
cfi_restore (r7); \
CALL_FAIL \
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S b/libc/ports/sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S
index c4ddbc69f..21e322986 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/aeabi_read_tp.S
@@ -41,6 +41,15 @@
.hidden __aeabi_read_tp
ENTRY (__aeabi_read_tp)
+#ifdef ARCH_HAS_HARD_TP
+ mrc p15, 0, r0, c13, c0, 3
+ bx lr
+#elif defined(__thumb2__)
+ movw r0, #0x0fe0
+ movt r0, #0xffff
+ bx r0
+#else
mov r0, #0xffff0fff
sub pc, r0, #31
+#endif
END (__aeabi_read_tp)
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/bits/mman.h b/libc/ports/sysdeps/unix/sysv/linux/arm/bits/mman.h
index f5ca3c9b6..11ecbca03 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/bits/mman.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/bits/mman.h
@@ -23,36 +23,6 @@
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
-
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0
-# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-#endif
-
/* These are Linux-specific. */
#ifdef __USE_MISC
# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */
@@ -66,47 +36,5 @@
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
-/* Flags for `mlockall'. */
-#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
-#define MCL_FUTURE 2 /* Lock all additions to address
- space. */
-
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-# 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. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
-
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/clone.S b/libc/ports/sysdeps/unix/sysv/linux/arm/clone.S
index 732a3ffd0..ce9c2a5ba 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/clone.S
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/clone.S
@@ -49,7 +49,7 @@ ENTRY(__clone)
mov ip, r2
#endif
@ new sp is already in r1
- stmfd sp!, {r4, r7}
+ push {r4, r7}
cfi_adjust_cfa_offset (8)
cfi_rel_offset (r4, 0)
cfi_rel_offset (r7, 4)
@@ -61,7 +61,7 @@ ENTRY(__clone)
cfi_endproc
cmp r0, #0
beq 1f
- ldmfd sp!, {r4, r7}
+ pop {r4, r7}
blt PLTJMP(C_SYMBOL_NAME(__syscall_error))
RETINSTR(, lr)
@@ -74,17 +74,16 @@ PSEUDO_END (__clone)
#ifdef RESET_PID
tst ip, #CLONE_THREAD
bne 3f
- mov r0, #0xffff0fff
- mov lr, pc
- sub pc, r0, #31
+ GET_TLS (lr)
mov r1, r0
tst ip, #CLONE_VM
ldr r7, =SYS_ify(getpid)
ite ne
movne r0, #-1
swieq 0x0
- str r0, [r1, #PID_OFFSET]
- str r0, [r1, #TID_OFFSET]
+ NEGOFF_ADJ_BASE (r1, TID_OFFSET)
+ str r0, NEGOFF_OFF1 (r1, TID_OFFSET)
+ str r0, NEGOFF_OFF2 (r1, PID_OFFSET, TID_OFFSET)
3:
#endif
@ pick the function arg and call address off the stack and execute
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/configure b/libc/ports/sysdeps/unix/sysv/linux/arm/configure
index cb94cc5eb..f66b15828 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/configure
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/configure
@@ -2,4 +2,5 @@
# Local configure fragment for sysdeps/unix/sysv/linux/arm.
libc_cv_gcc_unwind_find_fde=no
+# Remove -fno-unwind-tables that was added in sysdeps/arm/preconfigure.in.
CFLAGS=${CFLAGS% -fno-unwind-tables}
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/configure.in b/libc/ports/sysdeps/unix/sysv/linux/arm/configure.in
index 3e67dee42..8fffe9405 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/configure.in
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/configure.in
@@ -2,4 +2,5 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
# Local configure fragment for sysdeps/unix/sysv/linux/arm.
libc_cv_gcc_unwind_find_fde=no
+# Remove -fno-unwind-tables that was added in sysdeps/arm/preconfigure.in.
CFLAGS=${CFLAGS% -fno-unwind-tables}
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/mmap.S b/libc/ports/sysdeps/unix/sysv/linux/arm/mmap.S
index 68560b065..06b737eeb 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/mmap.S
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/mmap.S
@@ -23,11 +23,11 @@
ENTRY (__mmap)
/* shuffle args */
- str r5, [sp, #-4]!
+ push { r5 }
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r5, 0)
ldr r5, [sp, #8]
- str r4, [sp, #-4]!
+ push { r4 }
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r4, 0)
cfi_remember_state
@@ -43,10 +43,10 @@ ENTRY (__mmap)
/* restore registers */
2:
- ldr r4, [sp], #4
+ pop { r4 }
cfi_adjust_cfa_offset (-4)
cfi_restore (r4)
- ldr r5, [sp], #4
+ pop { r5 }
cfi_adjust_cfa_offset (-4)
cfi_restore (r5)
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/mmap64.S b/libc/ports/sysdeps/unix/sysv/linux/arm/mmap64.S
index dcbab3aed..d039129b2 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/mmap64.S
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/mmap64.S
@@ -34,11 +34,11 @@
.text
ENTRY (__mmap64)
ldr ip, [sp, $LOW_OFFSET]
- str r5, [sp, #-4]!
+ push { r5 }
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r5, 0)
ldr r5, [sp, $HIGH_OFFSET]
- str r4, [sp, #-4]!
+ push { r4 }
cfi_adjust_cfa_offset (4)
cfi_rel_offset (r4, 0)
cfi_remember_state
@@ -51,7 +51,7 @@ ENTRY (__mmap64)
orr r5, ip, r5, lsl $20 @ compose page offset
DO_CALL (mmap2, 0)
cmn r0, $4096
- ldmfd sp!, {r4, r5}
+ pop {r4, r5}
cfi_adjust_cfa_offset (-8)
cfi_restore (r4)
cfi_restore (r5)
@@ -62,7 +62,7 @@ ENTRY (__mmap64)
cfi_restore_state
.Linval:
mov r0, $-EINVAL
- ldmfd sp!, {r4, r5}
+ pop {r4, r5}
cfi_adjust_cfa_offset (-8)
cfi_restore (r4)
cfi_restore (r5)
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/libpthread.abilist b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/libpthread.abilist
index 6c0bbde67..de8095a60 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/libpthread.abilist
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/libpthread.abilist
@@ -83,7 +83,6 @@ GLIBC_2.4
pause F
pread F
pread64 F
- pthread_atfork F
pthread_attr_destroy F
pthread_attr_getaffinity_np F
pthread_attr_getdetachstate F
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S
index a38d56419..ca5045707 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/pt-vfork.S
@@ -19,23 +19,16 @@
/* Save the PID value. */
#define SAVE_PID \
- str lr, [sp, #-4]!; /* Save LR. */ \
- cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (lr, 0); \
- mov r0, #0xffff0fff; /* Point to the high page. */ \
- mov lr, pc; /* Save our return address. */ \
- sub pc, r0, #31; /* Jump to the TLS entry. */ \
- ldr lr, [sp], #4; /* Restore LR. */ \
- cfi_adjust_cfa_offset (-4); \
- cfi_restore (lr); \
- mov r2, r0; /* Save the TLS addr in r2. */ \
- ldr r3, [r2, #PID_OFFSET]; /* Load the saved PID. */ \
- rsb r0, r3, #0; /* Negate it. */ \
- str r0, [r2, #PID_OFFSET] /* Store the temporary PID. */
+ GET_TLS (r2); \
+ NEGOFF_ADJ_BASE2 (r2, r0, PID_OFFSET); /* Save the TLS addr in r2. */ \
+ ldr r3, NEGOFF_OFF1 (r2, PID_OFFSET); /* Load the saved PID. */ \
+ rsb r0, r3, #0; /* Negate it. */ \
+ str r0, NEGOFF_OFF1 (r2, PID_OFFSET); /* Store the temp PID. */
/* Restore the old PID value in the parent. */
#define RESTORE_PID \
cmp r0, #0; /* If we are the parent... */ \
- strne r3, [r2, #PID_OFFSET] /* ... restore the saved PID. */
+ it ne; \
+ strne r3, NEGOFF_OFF1 (r2, PID_OFFSET); /* restore the saved PID. */
#include "../vfork.S"
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h
index df85d5199..59b826ded 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h
@@ -31,7 +31,6 @@
# undef PSEUDO
# define PSEUDO(name, syscall_name, args) \
.text; \
- PSEUDO_PROLOGUE; \
ENTRY (__##syscall_name##_nocancel); \
CFI_SECTIONS; \
DO_CALL (syscall_name, args); \
@@ -77,19 +76,19 @@
# define DOCARGS_0 \
.save {r7}; \
- str lr, [sp, #-4]!; \
+ push {lr}; \
cfi_adjust_cfa_offset (4); \
cfi_rel_offset (lr, 0); \
.save {lr}
# define UNDOCARGS_0
# define RESTORE_LR_0 \
- ldr lr, [sp], #4; \
+ pop {lr}; \
cfi_adjust_cfa_offset (-4); \
cfi_restore (lr)
# define DOCARGS_1 \
.save {r7}; \
- stmfd sp!, {r0, r1, lr}; \
+ push {r0, r1, lr}; \
cfi_adjust_cfa_offset (12); \
cfi_rel_offset (lr, 8); \
.save {lr}; \
@@ -103,13 +102,13 @@
# define DOCARGS_2 \
.save {r7}; \
- stmfd sp!, {r0, r1, lr}; \
+ push {r0, r1, lr}; \
cfi_adjust_cfa_offset (12); \
cfi_rel_offset (lr, 8); \
.save {lr}; \
.pad #8
# define UNDOCARGS_2 \
- ldmfd sp!, {r0, r1}; \
+ pop {r0, r1}; \
cfi_adjust_cfa_offset (-8); \
RESTART_UNWIND
# define RESTORE_LR_2 \
@@ -117,13 +116,13 @@
# define DOCARGS_3 \
.save {r7}; \
- stmfd sp!, {r0, r1, r2, r3, lr}; \
+ push {r0, r1, r2, r3, lr}; \
cfi_adjust_cfa_offset (20); \
cfi_rel_offset (lr, 16); \
.save {lr}; \
.pad #16
# define UNDOCARGS_3 \
- ldmfd sp!, {r0, r1, r2, r3}; \
+ pop {r0, r1, r2, r3}; \
cfi_adjust_cfa_offset (-16); \
RESTART_UNWIND
# define RESTORE_LR_3 \
@@ -131,13 +130,13 @@
# define DOCARGS_4 \
.save {r7}; \
- stmfd sp!, {r0, r1, r2, r3, lr}; \
+ push {r0, r1, r2, r3, lr}; \
cfi_adjust_cfa_offset (20); \
cfi_rel_offset (lr, 16); \
.save {lr}; \
.pad #16
# define UNDOCARGS_4 \
- ldmfd sp!, {r0, r1, r2, r3}; \
+ pop {r0, r1, r2, r3}; \
cfi_adjust_cfa_offset (-16); \
RESTART_UNWIND
# define RESTORE_LR_4 \
@@ -146,13 +145,13 @@
/* r4 is only stmfd'ed for correct stack alignment. */
# define DOCARGS_5 \
.save {r4, r7}; \
- stmfd sp!, {r0, r1, r2, r3, r4, lr}; \
+ push {r0, r1, r2, r3, r4, lr}; \
cfi_adjust_cfa_offset (24); \
cfi_rel_offset (lr, 20); \
.save {lr}; \
.pad #20
# define UNDOCARGS_5 \
- ldmfd sp!, {r0, r1, r2, r3}; \
+ pop {r0, r1, r2, r3}; \
cfi_adjust_cfa_offset (-16); \
.fnend; \
.fnstart; \
@@ -160,20 +159,20 @@
.save {lr}; \
.pad #4
# define RESTORE_LR_5 \
- ldmfd sp!, {r4, lr}; \
+ pop {r4, lr}; \
cfi_adjust_cfa_offset (-8); \
/* r4 will be marked as restored later. */ \
cfi_restore (lr)
# define DOCARGS_6 \
.save {r4, r5, r7}; \
- stmfd sp!, {r0, r1, r2, r3, lr}; \
+ push {r0, r1, r2, r3, lr}; \
cfi_adjust_cfa_offset (20); \
cfi_rel_offset (lr, 16); \
.save {lr}; \
.pad #16
# define UNDOCARGS_6 \
- ldmfd sp!, {r0, r1, r2, r3}; \
+ pop {r0, r1, r2, r3}; \
cfi_adjust_cfa_offset (-16); \
.fnend; \
.fnstart; \
@@ -203,12 +202,8 @@ extern int __local_multiple_threads attribute_hidden;
# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
# else
# define SINGLE_THREAD_P \
- ldr ip, 1b; \
- 2: \
- ldr ip, [pc, ip]; \
- teq ip, #0;
-# define PSEUDO_PROLOGUE \
- 1: .word __local_multiple_threads - 2f - PC_OFS;
+ LDST_PCREL(ldr, ip, ip, __local_multiple_threads); \
+ teq ip, #0
# endif
# else
/* There is no __local_multiple_threads for librt, so use the TCB. */
@@ -217,14 +212,14 @@ extern int __local_multiple_threads attribute_hidden;
__builtin_expect (THREAD_GETMEM (THREAD_SELF, \
header.multiple_threads) == 0, 1)
# else
-# define PSEUDO_PROLOGUE
# define SINGLE_THREAD_P \
- stmfd sp!, {r0, lr}; \
+ push {r0, lr}; \
cfi_adjust_cfa_offset (8); \
cfi_rel_offset (lr, 4); \
- bl __aeabi_read_tp; \
- ldr ip, [r0, #MULTIPLE_THREADS_OFFSET]; \
- ldmfd sp!, {r0, lr}; \
+ GET_TLS (lr); \
+ NEGOFF_ADJ_BASE (r0, MULTIPLE_THREADS_OFFSET); \
+ ldr ip, NEGOFF_OFF1 (r0, MULTIPLE_THREADS_OFFSET); \
+ pop {r0, lr}; \
cfi_adjust_cfa_offset (-8); \
cfi_restore (lr); \
teq ip, #0
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c
index caa6a2626..108924d8b 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-forcedunwind.c
@@ -93,7 +93,7 @@ asm (
"_Unwind_Resume:\n"
" .cfi_sections .debug_frame\n"
" " CFI_STARTPROC "\n"
-" stmfd sp!, {r4, r5, r6, lr}\n"
+" push {r4, r5, r6, lr}\n"
" " CFI_ADJUST_CFA_OFFSET (16)" \n"
" " CFI_REL_OFFSET (r4, 0) "\n"
" " CFI_REL_OFFSET (r5, 4) "\n"
@@ -108,7 +108,7 @@ asm (
" cmp r3, #0\n"
" beq 4f\n"
"5: mov r0, r6\n"
-" ldmfd sp!, {r4, r5, r6, lr}\n"
+" pop {r4, r5, r6, lr}\n"
" " CFI_ADJUST_CFA_OFFSET (-16) "\n"
" " CFI_RESTORE (r4) "\n"
" " CFI_RESTORE (r5) "\n"
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c
index 121159913..d155ea7dc 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/unwind-resume.c
@@ -56,7 +56,7 @@ asm (
"_Unwind_Resume:\n"
" .cfi_sections .debug_frame\n"
" " CFI_STARTPROC "\n"
-" stmfd sp!, {r4, r5, r6, lr}\n"
+" push {r4, r5, r6, lr}\n"
" " CFI_ADJUST_CFA_OFFSET (16)" \n"
" " CFI_REL_OFFSET (r4, 0) "\n"
" " CFI_REL_OFFSET (r5, 4) "\n"
@@ -71,7 +71,7 @@ asm (
" cmp r3, #0\n"
" beq 4f\n"
"5: mov r0, r6\n"
-" ldmfd sp!, {r4, r5, r6, lr}\n"
+" pop {r4, r5, r6, lr}\n"
" " CFI_ADJUST_CFA_OFFSET (-16) "\n"
" " CFI_RESTORE (r4) "\n"
" " CFI_RESTORE (r5) "\n"
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S
index 3fce2d1af..216fb2d2e 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/nptl/vfork.S
@@ -19,24 +19,18 @@
/* Save the PID value. */
#define SAVE_PID \
- str lr, [sp, #-4]!; /* Save LR. */ \
- cfi_adjust_cfa_offset (4); \
- cfi_rel_offset (lr, 0); \
- mov r0, #0xffff0fff; /* Point to the high page. */ \
- mov lr, pc; /* Save our return address. */ \
- sub pc, r0, #31; /* Jump to the TLS entry. */ \
- ldr lr, [sp], #4; /* Restore LR. */ \
- cfi_adjust_cfa_offset (-4); \
- cfi_restore (lr); \
- mov r2, r0; /* Save the TLS addr in r2. */ \
- ldr r3, [r2, #PID_OFFSET]; /* Load the saved PID. */ \
- rsbs r0, r3, #0; /* Negate it. */ \
- moveq r0, #0x80000000; /* Use 0x80000000 if it was 0. */ \
- str r0, [r2, #PID_OFFSET] /* Store the temporary PID. */
+ GET_TLS (r2); \
+ NEGOFF_ADJ_BASE2 (r2, r0, PID_OFFSET); /* Save the TLS addr in r2. */ \
+ ldr r3, NEGOFF_OFF1 (r2, PID_OFFSET); /* Load the saved PID. */ \
+ rsbs r0, r3, #0; /* Negate it. */ \
+ it eq; \
+ moveq r0, #0x80000000; /* Use 0x80000000 if it was 0. */ \
+ str r0, NEGOFF_OFF1 (r2, PID_OFFSET); /* Store the temp PID. */
/* Restore the old PID value in the parent. */
#define RESTORE_PID \
cmp r0, #0; /* If we are the parent... */ \
- strne r3, [r2, #PID_OFFSET] /* ... restore the saved PID. */
+ it ne; \
+ strne r3, NEGOFF_OFF1 (r2, PID_OFFSET); /* restore the saved PID. */
#include "../vfork.S"
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/syscall.S b/libc/ports/sysdeps/unix/sysv/linux/arm/syscall.S
index 665ecb4de..bdd5a52be 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/syscall.S
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/syscall.S
@@ -23,7 +23,7 @@
ENTRY (syscall)
mov ip, sp
- stmfd sp!, {r4, r5, r6, r7}
+ push {r4, r5, r6, r7}
cfi_adjust_cfa_offset (16)
cfi_rel_offset (r4, 0)
cfi_rel_offset (r5, 4)
@@ -35,7 +35,7 @@ ENTRY (syscall)
mov r2, r3
ldmfd ip, {r3, r4, r5, r6}
swi 0x0
- ldmfd sp!, {r4, r5, r6, r7}
+ pop {r4, r5, r6, r7}
cfi_adjust_cfa_offset (-16)
cfi_restore (r4)
cfi_restore (r5)
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/sysdep.h b/libc/ports/sysdeps/unix/sysv/linux/arm/sysdep.h
index f40cb95e8..b195d8ea1 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/sysdep.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/sysdep.h
@@ -45,6 +45,38 @@
#ifdef __ASSEMBLER__
+#ifndef ARCH_HAS_HARD_TP
+/* Internal macro calling the linux kernel kuser_get_tls helper.
+ Note that in thumb mode, a constant pool break is often out of range, so
+ we always expand the constant inline. */
+# ifdef __thumb2__
+# define GET_TLS_BODY \
+ movw r0, #0x0fe0; \
+ movt r0, #0xffff; \
+ blx r0
+# else
+# define GET_TLS_BODY \
+ mov r0, #0xffff0fff; /* Point to the high page. */ \
+ mov lr, pc; /* Save our return address. */ \
+ sub pc, r0, #31 /* Jump to the TLS entry. */
+# endif
+
+/* Helper to get the TLS base pointer. Save LR in TMP, return in R0,
+ and no other registers clobbered. TMP may be LR itself to indicate
+ that no save is necessary. */
+# undef GET_TLS
+# define GET_TLS(TMP) \
+ .ifnc TMP, lr; \
+ mov TMP, lr; \
+ cfi_register (lr, TMP); \
+ GET_TLS_BODY; \
+ mov lr, TMP; \
+ cfi_restore (lr); \
+ .else; \
+ GET_TLS_BODY; \
+ .endif
+#endif /* ARCH_HAS_HARD_TP */
+
/* Linux uses a negative return value to indicate syscall errors,
unlike most Unices, which use the condition codes' carry flag.
@@ -110,32 +142,29 @@
# if RTLD_PRIVATE_ERRNO
# define SYSCALL_ERROR_HANDLER \
__local_syscall_error: \
- ldr r1, 1f; \
- rsb r0, r0, #0; \
-0: str r0, [pc, r1]; \
- mvn r0, #0; \
- DO_RET(lr); \
-1: .word C_SYMBOL_NAME(rtld_errno) - 0b - PC_OFS;
+ rsb r0, r0, #0; \
+ LDST_PCREL(str, r0, r1, C_SYMBOL_NAME(rtld_errno)); \
+ mvn r0, #0; \
+ DO_RET(lr)
# else
# if defined(__ARM_ARCH_4T__) && defined(__THUMB_INTERWORK__)
# define POP_PC \
- ldr lr, [sp], #4; \
+ pop { lr }; \
cfi_adjust_cfa_offset (-4); \
cfi_restore (lr); \
bx lr
# else
-# define POP_PC \
- ldr pc, [sp], #4
+# define POP_PC pop { pc }
# endif
# define SYSCALL_ERROR_HANDLER \
__local_syscall_error: \
- str lr, [sp, #-4]!; \
+ push { lr }; \
cfi_adjust_cfa_offset (4); \
cfi_rel_offset (lr, 0); \
- str r0, [sp, #-4]!; \
+ push { r0 }; \
cfi_adjust_cfa_offset (4); \
bl PLTJMP(C_SYMBOL_NAME(__errno_location)); \
- ldr r1, [sp], #4; \
+ pop { r1 }; \
cfi_adjust_cfa_offset (-4); \
rsb r1, r1, #0; \
str r1, [r0]; \
@@ -202,7 +231,7 @@ __local_syscall_error: \
#undef DOARGS_0
#define DOARGS_0 \
.fnstart; \
- str r7, [sp, #-4]!; \
+ push { r7 }; \
cfi_adjust_cfa_offset (4); \
cfi_rel_offset (r7, 0); \
.save { r7 }
@@ -217,7 +246,7 @@ __local_syscall_error: \
#undef DOARGS_5
#define DOARGS_5 \
.fnstart; \
- stmfd sp!, {r4, r7}; \
+ push {r4, r7}; \
cfi_adjust_cfa_offset (8); \
cfi_rel_offset (r4, 0); \
cfi_rel_offset (r7, 4); \
@@ -227,7 +256,7 @@ __local_syscall_error: \
#define DOARGS_6 \
.fnstart; \
mov ip, sp; \
- stmfd sp!, {r4, r5, r7}; \
+ push {r4, r5, r7}; \
cfi_adjust_cfa_offset (12); \
cfi_rel_offset (r4, 0); \
cfi_rel_offset (r5, 4); \
@@ -238,7 +267,7 @@ __local_syscall_error: \
#define DOARGS_7 \
.fnstart; \
mov ip, sp; \
- stmfd sp!, {r4, r5, r6, r7}; \
+ push {r4, r5, r6, r7}; \
cfi_adjust_cfa_offset (16); \
cfi_rel_offset (r4, 0); \
cfi_rel_offset (r5, 4); \
@@ -249,7 +278,7 @@ __local_syscall_error: \
#undef UNDOARGS_0
#define UNDOARGS_0 \
- ldr r7, [sp], #4; \
+ pop {r7}; \
cfi_adjust_cfa_offset (-4); \
cfi_restore (r7); \
.fnend
@@ -263,14 +292,14 @@ __local_syscall_error: \
#define UNDOARGS_4 UNDOARGS_0
#undef UNDOARGS_5
#define UNDOARGS_5 \
- ldmfd sp!, {r4, r7}; \
+ pop {r4, r7}; \
cfi_adjust_cfa_offset (-8); \
cfi_restore (r4); \
cfi_restore (r7); \
.fnend
#undef UNDOARGS_6
#define UNDOARGS_6 \
- ldmfd sp!, {r4, r5, r7}; \
+ pop {r4, r5, r7}; \
cfi_adjust_cfa_offset (-12); \
cfi_restore (r4); \
cfi_restore (r5); \
@@ -278,7 +307,7 @@ __local_syscall_error: \
.fnend
#undef UNDOARGS_7
#define UNDOARGS_7 \
- ldmfd sp!, {r4, r5, r6, r7}; \
+ pop {r4, r5, r6, r7}; \
cfi_adjust_cfa_offset (-16); \
cfi_restore (r4); \
cfi_restore (r5); \
diff --git a/libc/ports/sysdeps/unix/sysv/linux/arm/vfork.S b/libc/ports/sysdeps/unix/sysv/linux/arm/vfork.S
index ae931f79c..128a6402b 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/arm/vfork.S
+++ b/libc/ports/sysdeps/unix/sysv/linux/arm/vfork.S
@@ -37,7 +37,7 @@ ENTRY (__vfork)
mov ip, r7
cfi_register (r7, ip)
.fnstart
- str r7, [sp, #-4]!
+ push { r7 }
cfi_adjust_cfa_offset (4)
.save { r7 }
ldr r7, =SYS_ify (vfork)
diff --git a/libc/ports/sysdeps/unix/sysv/linux/generic/bits/msq.h b/libc/ports/sysdeps/unix/sysv/linux/generic/bits/msq.h
index 87f37b4d6..49cbf0611 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/generic/bits/msq.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/generic/bits/msq.h
@@ -27,6 +27,7 @@
#define MSG_NOERROR 010000 /* no error if message is too big */
#ifdef __USE_GNU
# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+# define MSG_COPY 040000 /* copy (not remove) all queue messages */
#endif
/* Types used in the structure definition. */
diff --git a/libc/ports/sysdeps/unix/sysv/linux/hppa/bits/mman.h b/libc/ports/sysdeps/unix/sysv/linux/hppa/bits/mman.h
index c216ddb1f..2835b0ff0 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/hppa/bits/mman.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/hppa/bits/mman.h
@@ -44,6 +44,9 @@
# define MAP_ANONYMOUS 0x10 /* Don't use a file */
# define MAP_ANON MAP_ANONYMOUS
# define MAP_VARIABLE 0
+/* When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size. */
+# define MAP_HUGE_SHIFT 26
+# define MAP_HUGE_MASK 0x3f
#endif
/* These are Linux-specific. */
diff --git a/libc/ports/sysdeps/unix/sysv/linux/hppa/bits/msq.h b/libc/ports/sysdeps/unix/sysv/linux/hppa/bits/msq.h
index e56286b28..ac35f510b 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/hppa/bits/msq.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/hppa/bits/msq.h
@@ -26,6 +26,7 @@
#define MSG_NOERROR 010000 /* no error if message is too big */
#ifdef __USE_GNU
# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+# define MSG_COPY 040000 /* copy (not remove) all queue messages */
#endif
/* Types used in the structure definition. */
diff --git a/libc/ports/sysdeps/unix/sysv/linux/ia64/bits/mman.h b/libc/ports/sysdeps/unix/sysv/linux/ia64/bits/mman.h
index fba16db47..c3b1caf9d 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/ia64/bits/mman.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/ia64/bits/mman.h
@@ -23,36 +23,6 @@
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
-
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0
-# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-#endif
-
/* These are Linux-specific. */
#ifdef __USE_MISC
# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */
@@ -67,47 +37,5 @@
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 0x1 /* Sync memory asynchronously. */
-#define MS_INVALIDATE 0x2 /* Invalidate the caches. */
-#define MS_SYNC 0x4 /* Synchronous memory sync. */
-
-/* Flags for `mlockall'. */
-#define MCL_CURRENT 0x1 /* Lock all currently mapped pages. */
-#define MCL_FUTURE 0x2 /* Lock all additions to address
- space. */
-
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-# 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. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
-
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/libc/ports/sysdeps/unix/sysv/linux/ia64/bits/msq.h b/libc/ports/sysdeps/unix/sysv/linux/ia64/bits/msq.h
index 68d3ed792..8519390c4 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/ia64/bits/msq.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/ia64/bits/msq.h
@@ -24,8 +24,10 @@
/* Define options for message queue functions. */
#define MSG_NOERROR 010000 /* no error if message is too big */
-#define MSG_EXCEPT 020000 /* recv any msg except of specified type */
-
+#ifdef __USE_GNU
+# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+# define MSG_COPY 040000 /* copy (not remove) all queue messages */
+#endif
/* Structure of record for one message inside the kernel.
The type `struct __msg' is opaque. */
diff --git a/libc/ports/sysdeps/unix/sysv/linux/ia64/makecontext.c b/libc/ports/sysdeps/unix/sysv/linux/ia64/makecontext.c
index 79fa05af6..c3bb5de19 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/ia64/makecontext.c
+++ b/libc/ports/sysdeps/unix/sysv/linux/ia64/makecontext.c
@@ -22,14 +22,10 @@
#include <stdlib.h>
#include <ucontext.h>
#include <sys/rse.h>
+#include <link.h>
+#include <dl-fptr.h>
-struct fdesc
- {
- unsigned long ip;
- unsigned long gp;
- };
-
#define PUSH(val) \
do { \
if (ia64_rse_is_rnat_slot (rbs)) \
@@ -48,7 +44,7 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
extern void __start_context (ucontext_t *link, long gp, ...);
unsigned long stack_start, stack_end;
va_list ap;
- long *rbs;
+ unsigned long *rbs;
int i;
stack_start = (long) sc->sc_stack.ss_sp;
@@ -65,16 +61,16 @@ makecontext: does not know how to handle more than 8 arguments\n"));
}
/* set the entry point and global pointer: */
- sc->sc_br[0] = ((struct fdesc *) &__start_context)->ip;
- sc->sc_br[1] = ((struct fdesc *) func)->ip;
- sc->sc_gr[1] = ((struct fdesc *) func)->gp;
+ sc->sc_br[0] = ELF_PTR_TO_FDESC (&__start_context)->ip;
+ sc->sc_br[1] = ELF_PTR_TO_FDESC (func)->ip;
+ sc->sc_gr[1] = ELF_PTR_TO_FDESC (func)->gp;
/* set up the call frame: */
sc->sc_ar_pfs = ((sc->sc_ar_pfs & ~0x3fffffffffUL)
| (argc + 2) | ((argc + 2) << 7));
- rbs = (long *) stack_start;
+ rbs = (unsigned long *) stack_start;
PUSH((long) ucp->uc_link);
- PUSH(((struct fdesc *) &__start_context)->gp);
+ PUSH(ELF_PTR_TO_FDESC (&__start_context)->gp);
va_start (ap, argc);
for (i = 0; i < argc; ++i)
PUSH(va_arg (ap, long));
diff --git a/libc/ports/sysdeps/unix/sysv/linux/ia64/nptl/dl-sysdep.h b/libc/ports/sysdeps/unix/sysv/linux/ia64/nptl/dl-sysdep.h
index e87b0fe69..886a4f0e5 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/ia64/nptl/dl-sysdep.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/ia64/nptl/dl-sysdep.h
@@ -16,22 +16,10 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifndef _DL_SYSDEP_H
-#define _DL_SYSDEP_H 1
+#ifndef _LINUX_IA64_DL_SYSDEP_H
+#define _LINUX_IA64_DL_SYSDEP_H 1
-/* This macro must be defined to either 0 or 1.
-
- If 1, then an errno global variable hidden in ld.so will work right with
- all the errno-using libc code compiled for ld.so, and there is never a
- need to share the errno location with libc. This is appropriate only if
- all the libc functions that ld.so uses are called without PLT and always
- get the versions linked into ld.so rather than the libc ones. */
-
-#ifdef IS_IN_rtld
-# define RTLD_PRIVATE_ERRNO 1
-#else
-# define RTLD_PRIVATE_ERRNO 0
-#endif
+#include_next <dl-sysdep.h>
/* Traditionally system calls have been made using break 0x100000. A
second method was introduced which, if possible, will use the EPC
@@ -41,7 +29,7 @@
#define NEED_DL_SYSINFO 1
#define USE_DL_SYSINFO 1
-#if defined NEED_DL_SYSINFO && !defined __ASSEMBLER__
+#ifndef __ASSEMBLER__
/* Don't declare this as a function---we want it's entry-point, not
it's function descriptor... */
extern int _dl_sysinfo_break attribute_hidden;
@@ -64,11 +52,4 @@ extern int _dl_sysinfo_break attribute_hidden;
might write into it after _dl_start returns. */
#define DL_ARGV_NOT_RELRO 1
-
-#ifndef __ASSEMBLER__
-/* Get version of the OS. */
-extern int _dl_discover_osversion (void) attribute_hidden;
-# define HAVE_DL_DISCOVER_OSVERSION 1
-#endif
-
#endif /* dl-sysdep.h */
diff --git a/libc/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h b/libc/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h
index c6fce1313..96f6a4e8a 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/ia64/sysdep.h
@@ -252,7 +252,7 @@
_retval; })
#undef INTERNAL_SYSCALL_DECL
-#define INTERNAL_SYSCALL_DECL(err) long int err
+#define INTERNAL_SYSCALL_DECL(err) long int err __attribute__ ((unused))
#undef INTERNAL_SYSCALL
#define INTERNAL_SYSCALL_NCS(name, err, nr, args...) \
@@ -264,7 +264,10 @@
INTERNAL_SYSCALL_NCS (__NR_##name, err, nr, ##args)
#undef INTERNAL_SYSCALL_ERROR_P
-#define INTERNAL_SYSCALL_ERROR_P(val, err) (err == -1)
+#define INTERNAL_SYSCALL_ERROR_P(val, err) \
+ ({ (void) (val); \
+ (err == -1); \
+ })
#undef INTERNAL_SYSCALL_ERRNO
#define INTERNAL_SYSCALL_ERRNO(val, err) (val)
diff --git a/libc/ports/sysdeps/unix/sysv/linux/m68k/bits/mman.h b/libc/ports/sysdeps/unix/sysv/linux/m68k/bits/mman.h
index d2fb69d83..b89011aee 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/m68k/bits/mman.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/m68k/bits/mman.h
@@ -23,36 +23,6 @@
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
-
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0
-# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-#endif
-
/* These are Linux-specific. */
#ifdef __USE_MISC
# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */
@@ -66,47 +36,5 @@
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
-/* Flags for `mlockall'. */
-#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
-#define MCL_FUTURE 2 /* Lock all additions to address
- space. */
-
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-# 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. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
-
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/libc/ports/sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libpthread.abilist b/libc/ports/sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libpthread.abilist
index 6c0bbde67..de8095a60 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libpthread.abilist
+++ b/libc/ports/sysdeps/unix/sysv/linux/m68k/coldfire/nptl/libpthread.abilist
@@ -83,7 +83,6 @@ GLIBC_2.4
pause F
pread F
pread64 F
- pthread_atfork F
pthread_attr_destroy F
pthread_attr_getaffinity_np F
pthread_attr_getdetachstate F
diff --git a/libc/ports/sysdeps/unix/sysv/linux/mips/bits/mman.h b/libc/ports/sysdeps/unix/sysv/linux/mips/bits/mman.h
index a13a90096..b327795f8 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/mips/bits/mman.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/mips/bits/mman.h
@@ -23,41 +23,9 @@
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
-
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0
-# define MAP_ANONYMOUS 0x0800 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-# define MAP_RENAME MAP_ANONYMOUS
-#endif
-
/* These are Linux-specific. */
#ifdef __USE_MISC
# define MAP_NORESERVE 0x0400 /* don't check for reservations */
-# define MAP_ANONYMOUS 0x0800 /* don't use a file */
# define MAP_GROWSDOWN 0x1000 /* stack-like segment */
# define MAP_DENYWRITE 0x2000 /* ETXTBSY */
# define MAP_EXECUTABLE 0x4000 /* mark it as an executable */
@@ -68,47 +36,11 @@
# define MAP_HUGETLB 0x80000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
-/* Flags for `mlockall'. */
-#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
-#define MCL_FUTURE 2 /* Lock all additions to address
- space. */
-
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
+#define __MAP_ANONYMOUS 0x0800
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-# 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. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
+#ifdef __USE_MISC
+# define MAP_RENAME MAP_ANONYMOUS
#endif
diff --git a/libc/ports/sysdeps/unix/sysv/linux/mips/bits/msq.h b/libc/ports/sysdeps/unix/sysv/linux/mips/bits/msq.h
index 8439069cd..e814bc722 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/mips/bits/msq.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/mips/bits/msq.h
@@ -25,6 +25,7 @@
#define MSG_NOERROR 010000 /* no error if message is too big */
#ifdef __USE_GNU
# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+# define MSG_COPY 040000 /* copy (not remove) all queue messages */
#endif
/* Types used in the structure definition. */
diff --git a/libc/ports/sysdeps/unix/sysv/linux/tile/bits/mman.h b/libc/ports/sysdeps/unix/sysv/linux/tile/bits/mman.h
index 7494ee5e5..02fddecc1 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/tile/bits/mman.h
+++ b/libc/ports/sysdeps/unix/sysv/linux/tile/bits/mman.h
@@ -23,36 +23,6 @@
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
-
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0
-# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-#endif
-
#ifdef __USE_MISC
/* These are Linux-specific. */
# define MAP_NONBLOCK 0x00080 /* Do not block on IO. */
@@ -66,47 +36,5 @@
# define MAP_HUGETLB 0x04000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
-/* Flags for `mlockall'. */
-#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
-#define MCL_FUTURE 2 /* Lock all additions to address
- space. */
-
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-# 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. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
-
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/libc/ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libpthread.abilist b/libc/ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libpthread.abilist
index 3ab004605..658c4bf99 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libpthread.abilist
+++ b/libc/ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/nptl/libpthread.abilist
@@ -73,7 +73,6 @@ GLIBC_2.12
pause F
pread F
pread64 F
- pthread_atfork F
pthread_attr_destroy F
pthread_attr_getaffinity_np F
pthread_attr_getdetachstate F
diff --git a/libc/ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libpthread.abilist b/libc/ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libpthread.abilist
index 3ab004605..658c4bf99 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libpthread.abilist
+++ b/libc/ports/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/nptl/libpthread.abilist
@@ -73,7 +73,6 @@ GLIBC_2.12
pause F
pread F
pread64 F
- pthread_atfork F
pthread_attr_destroy F
pthread_attr_getaffinity_np F
pthread_attr_getdetachstate F
diff --git a/libc/ports/sysdeps/unix/sysv/linux/tile/tilepro/nptl/libpthread.abilist b/libc/ports/sysdeps/unix/sysv/linux/tile/tilepro/nptl/libpthread.abilist
index 3ab004605..658c4bf99 100644
--- a/libc/ports/sysdeps/unix/sysv/linux/tile/tilepro/nptl/libpthread.abilist
+++ b/libc/ports/sysdeps/unix/sysv/linux/tile/tilepro/nptl/libpthread.abilist
@@ -73,7 +73,6 @@ GLIBC_2.12
pause F
pread F
pread64 F
- pthread_atfork F
pthread_attr_destroy F
pthread_attr_getaffinity_np F
pthread_attr_getdetachstate F
diff --git a/libc/posix/Makefile b/libc/posix/Makefile
index 489baab72..9936aa646 100644
--- a/libc/posix/Makefile
+++ b/libc/posix/Makefile
@@ -97,7 +97,8 @@ tests := tstgetopt testfnm runtests \
tst-execvp3 tst-execvp4 \
tst-fnmatch2 tst-cpucount tst-cpuset \
bug-getopt1 bug-getopt2 bug-getopt3 bug-getopt4 \
- bug-getopt5 tst-getopt_long1 bug-regex34 bug-regex35
+ bug-getopt5 tst-getopt_long1 bug-regex34 bug-regex35 \
+ tst-pathconf
tests-$(OPTION_EGLIBC_LOCALE_CODE) \
+= tst-fnmatch tst-regexloc bug-regex1 bug-regex5 \
bug-regex23 bug-regex25 bug-regex32 bug-regex33
@@ -242,11 +243,11 @@ bug-glob1-ARGS = "$(objpfx)"
tst-execvp3-ARGS = --test-dir=$(objpfx)
testcases.h: TESTS TESTS2C.sed
- sed -f TESTS2C.sed < $< > $@T
+ LC_ALL=C sed -f TESTS2C.sed < $< > $@T
mv -f $@T $@
ptestcases.h: PTESTS PTESTS2C.sed
- sed -f PTESTS2C.sed < $< > $@T
+ LC_ALL=C sed -f PTESTS2C.sed < $< > $@T
mv -f $@T $@
# Run a test on the header files we use.
diff --git a/libc/posix/tst-pathconf.c b/libc/posix/tst-pathconf.c
new file mode 100644
index 000000000..7627a24d8
--- /dev/null
+++ b/libc/posix/tst-pathconf.c
@@ -0,0 +1,176 @@
+/* Test that values of pathconf and fpathconf are consistent for a file.
+ Copyright (C) 2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+
+static void prepare (void);
+#define PREPARE(argc, argv) prepare ()
+
+static int do_test (void);
+#define TEST_FUNCTION do_test ()
+
+#include "../test-skeleton.c"
+
+static int dir_fd;
+static char *dirbuf;
+
+static void
+prepare (void)
+{
+ size_t test_dir_len = strlen (test_dir);
+ static const char dir_name[] = "/tst-pathconf.XXXXXX";
+
+ size_t dirbuflen = test_dir_len + sizeof (dir_name);
+ dirbuf = malloc (dirbuflen);
+ if (dirbuf == NULL)
+ {
+ puts ("Out of memory");
+ exit (1);
+ }
+
+ snprintf (dirbuf, dirbuflen, "%s%s", test_dir, dir_name);
+ if (mkdtemp (dirbuf) == NULL)
+ {
+ printf ("Cannot create temporary directory: %s\n", strerror (errno));
+ exit (1);
+ }
+
+ add_temp_file (dirbuf);
+
+ dir_fd = open (dirbuf, O_RDONLY);
+ if (dir_fd == -1)
+ {
+ printf ("Cannot open directory: %s\n", strerror (errno));
+ exit (1);
+ }
+}
+
+
+static int
+do_test (void)
+{
+ int ret = 0;
+ static const char *fifo_name = "some-fifo";
+
+ size_t filenamelen = strlen (dirbuf) + strlen (fifo_name) + 2;
+ char *filename = malloc (filenamelen);
+
+ snprintf (filename, filenamelen, "%s/%s", dirbuf, fifo_name);
+
+ /* Create a fifo in the directory. */
+ int e = mkfifo (filename, 0777);
+ if (e == -1)
+ {
+ printf ("fifo creation failed (%s)\n", strerror (errno));
+ ret = 1;
+ goto out_nofifo;
+ }
+
+ long dir_pathconf = pathconf (dirbuf, _PC_PIPE_BUF);
+
+ if (dir_pathconf < 0)
+ {
+ printf ("pathconf on directory failed: %s\n", strerror (errno));
+ ret = 1;
+ goto out_nofifo;
+ }
+
+ long fifo_pathconf = pathconf (filename, _PC_PIPE_BUF);
+
+ if (fifo_pathconf < 0)
+ {
+ printf ("pathconf on file failed: %s\n", strerror (errno));
+ ret = 1;
+ goto out_nofifo;
+ }
+
+ int fifo = open (filename, O_RDONLY | O_NONBLOCK);
+
+ if (fifo < 0)
+ {
+ printf ("fifo open failed (%s)\n", strerror (errno));
+ ret = 1;
+ goto out_nofifo;
+ }
+
+ long dir_fpathconf = fpathconf (dir_fd, _PC_PIPE_BUF);
+
+ if (dir_fpathconf < 0)
+ {
+ printf ("fpathconf on directory failed: %s\n", strerror (errno));
+ ret = 1;
+ goto out;
+ }
+
+ long fifo_fpathconf = fpathconf (fifo, _PC_PIPE_BUF);
+
+ if (fifo_fpathconf < 0)
+ {
+ printf ("fpathconf on file failed: %s\n", strerror (errno));
+ ret = 1;
+ goto out;
+ }
+
+ if (fifo_pathconf != fifo_fpathconf)
+ {
+ printf ("fifo pathconf (%ld) != fifo fpathconf (%ld)\n", fifo_pathconf,
+ fifo_fpathconf);
+ ret = 1;
+ goto out;
+ }
+
+ if (dir_pathconf != fifo_pathconf)
+ {
+ printf ("directory pathconf (%ld) != fifo pathconf (%ld)\n",
+ dir_pathconf, fifo_pathconf);
+ ret = 1;
+ goto out;
+ }
+
+ if (dir_fpathconf != fifo_fpathconf)
+ {
+ printf ("directory fpathconf (%ld) != fifo fpathconf (%ld)\n",
+ dir_fpathconf, fifo_fpathconf);
+ ret = 1;
+ goto out;
+ }
+
+out:
+ close (fifo);
+out_nofifo:
+ close (dir_fd);
+
+ if (unlink (filename) != 0)
+ {
+ printf ("Could not remove fifo (%s)\n", strerror (errno));
+ ret = 1;
+ }
+
+ if (rmdir (dirbuf) != 0)
+ {
+ printf ("Could not remove directory (%s)\n", strerror (errno));
+ ret = 1;
+ }
+
+ return ret;
+}
diff --git a/libc/scripts/bench.pl b/libc/scripts/bench.pl
new file mode 100755
index 000000000..bb7f64897
--- /dev/null
+++ b/libc/scripts/bench.pl
@@ -0,0 +1,93 @@
+#! /usr/bin/perl -w
+# Copyright (C) 2013 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, see
+# <http://www.gnu.org/licenses/>.
+
+
+use strict;
+use warnings;
+# Generate a benchmark source file for a given input.
+
+if (@ARGV < 2) {
+ die "Usage: bench.pl <function> <iterations> [parameter types] [return type]"
+}
+
+my $arg;
+my $func = $ARGV[0];
+my $iters = $ARGV[1];
+my @args;
+my $ret = "void";
+my $getret = "";
+my $retval = "";
+
+if (@ARGV >= 3) {
+ @args = split(':', $ARGV[2]);
+}
+
+if (@ARGV == 4) {
+ $ret = $ARGV[3];
+}
+
+my $decl = "extern $ret $func (";
+
+if (@args == 0 || $args[0] eq "void") {
+ print "$decl void);\n";
+ print "#define CALL_BENCH_FUNC(j) $func();\n";
+ print "#define NUM_SAMPLES (1)\n";
+}
+else {
+ my $num = 0;
+ my $bench_func = "#define CALL_BENCH_FUNC(j) $func (";
+ my $struct = "struct args {";
+
+ foreach $arg (@args) {
+ if ($num > 0) {
+ $bench_func = "$bench_func,";
+ $decl = "$decl,";
+ }
+
+ $struct = "$struct $arg arg$num;";
+ $bench_func = "$bench_func in[j].arg$num";
+ $decl = "$decl $arg";
+ $num = $num + 1;
+ }
+
+ print "$decl);\n";
+ print "$bench_func);\n";
+ print "$struct } in[] = {";
+
+ open INPUTS, "<$func-inputs" or die $!;
+
+ while (<INPUTS>) {
+ chomp;
+ print "{$_},\n";
+ }
+ print "};\n";
+ print "#define NUM_SAMPLES (sizeof (in) / sizeof (struct args))\n"
+}
+
+# In some cases not storing a return value seems to result in the function call
+# being optimized out.
+if ($ret ne "void") {
+ print "static volatile $ret ret = 0.0;\n";
+ $getret = "ret = ";
+}
+
+print "#define BENCH_FUNC(j) ({$getret CALL_BENCH_FUNC (j);})\n";
+
+print "#define ITER $iters\n";
+print "#define FUNCNAME \"$func\"\n";
+print "#include \"bench-skeleton.c\"\n";
diff --git a/libc/stdio-common/printf_fp.c b/libc/stdio-common/printf_fp.c
index 8d716f327..5bdc78981 100644
--- a/libc/stdio-common/printf_fp.c
+++ b/libc/stdio-common/printf_fp.c
@@ -134,9 +134,6 @@
#define MPN_GE(u,v) \
(u##size > v##size || (u##size == v##size && __mpn_cmp (u, v, u##size) >= 0))
-extern int __isinfl_internal (long double) attribute_hidden;
-extern int __isnanl_internal (long double) attribute_hidden;
-
extern mp_size_t __mpn_extract_double (mp_ptr res_ptr, mp_size_t size,
int *expt, int *is_neg,
double value);
diff --git a/libc/stdio-common/tstdiomisc.c b/libc/stdio-common/tstdiomisc.c
index d8bb09687..b93363189 100644
--- a/libc/stdio-common/tstdiomisc.c
+++ b/libc/stdio-common/tstdiomisc.c
@@ -47,9 +47,9 @@ t2 (void)
return result;
}
-volatile double nanval;
+volatile double qnanval;
volatile double infval;
-volatile long double lnanval;
+volatile long double lqnanval;
volatile long double linfval;
@@ -60,16 +60,17 @@ F (void)
wchar_t wbuf[40];
int result;
- nanval = NAN;
+ qnanval = NAN;
snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
- nanval, nanval, nanval, nanval, nanval, nanval, nanval, nanval);
+ qnanval, qnanval, qnanval, qnanval,
+ qnanval, qnanval, qnanval, qnanval);
result = strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
snprintf (buf, sizeof buf, "%a %A %e %E %f %F %g %G",
- -nanval, -nanval, -nanval, -nanval,
- -nanval, -nanval, -nanval, -nanval);
+ -qnanval, -qnanval, -qnanval, -qnanval,
+ -qnanval, -qnanval, -qnanval, -qnanval);
result = strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
buf);
@@ -90,13 +91,14 @@ F (void)
#if __OPTION_POSIX_C_LANG_WIDE_CHAR
swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
- nanval, nanval, nanval, nanval, nanval, nanval, nanval, nanval);
+ qnanval, qnanval, qnanval, qnanval,
+ qnanval, qnanval, qnanval, qnanval);
result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]), L"%a %A %e %E %f %F %g %G",
- -nanval, -nanval, -nanval, -nanval,
- -nanval, -nanval, -nanval, -nanval);
+ -qnanval, -qnanval, -qnanval, -qnanval,
+ -qnanval, -qnanval, -qnanval, -qnanval);
result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
wbuf);
@@ -114,17 +116,17 @@ F (void)
wbuf);
#endif /* __OPTION_POSIX_C_LANG_WIDE_CHAR */
- lnanval = NAN;
+ lqnanval = NAN;
snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
- lnanval, lnanval, lnanval, lnanval,
- lnanval, lnanval, lnanval, lnanval);
+ lqnanval, lqnanval, lqnanval, lqnanval,
+ lqnanval, lqnanval, lqnanval, lqnanval);
result = strcmp (buf, "nan NAN nan NAN nan NAN nan NAN") != 0;
printf ("expected \"nan NAN nan NAN nan NAN nan NAN\", got \"%s\"\n", buf);
snprintf (buf, sizeof buf, "%La %LA %Le %LE %Lf %LF %Lg %LG",
- -lnanval, -lnanval, -lnanval, -lnanval,
- -lnanval, -lnanval, -lnanval, -lnanval);
+ -lqnanval, -lqnanval, -lqnanval, -lqnanval,
+ -lqnanval, -lqnanval, -lqnanval, -lqnanval);
result = strcmp (buf, "-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
printf ("expected \"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got \"%s\"\n",
buf);
@@ -147,15 +149,15 @@ F (void)
#if __OPTION_POSIX_C_LANG_WIDE_CHAR
swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
L"%La %LA %Le %LE %Lf %LF %Lg %LG",
- lnanval, lnanval, lnanval, lnanval,
- lnanval, lnanval, lnanval, lnanval);
+ lqnanval, lqnanval, lqnanval, lqnanval,
+ lqnanval, lqnanval, lqnanval, lqnanval);
result |= wcscmp (wbuf, L"nan NAN nan NAN nan NAN nan NAN") != 0;
printf ("expected L\"nan NAN nan NAN nan NAN nan NAN\", got L\"%S\"\n", wbuf);
swprintf (wbuf, sizeof wbuf / sizeof (wbuf[0]),
L"%La %LA %Le %LE %Lf %LF %Lg %LG",
- -lnanval, -lnanval, -lnanval, -lnanval,
- -lnanval, -lnanval, -lnanval, -lnanval);
+ -lqnanval, -lqnanval, -lqnanval, -lqnanval,
+ -lqnanval, -lqnanval, -lqnanval, -lqnanval);
result |= wcscmp (wbuf, L"-nan -NAN -nan -NAN -nan -NAN -nan -NAN") != 0;
printf ("expected L\"-nan -NAN -nan -NAN -nan -NAN -nan -NAN\", got L\"%S\"\n",
wbuf);
diff --git a/libc/stdio-common/vfprintf.c b/libc/stdio-common/vfprintf.c
index b8e5d1b86..9fcfc9ba5 100644
--- a/libc/stdio-common/vfprintf.c
+++ b/libc/stdio-common/vfprintf.c
@@ -68,7 +68,7 @@
do { \
unsigned int _val = val; \
assert ((unsigned int) done < (unsigned int) INT_MAX); \
- if (__builtin_expect (INT_MAX - done < _val, 0)) \
+ if (__glibc_unlikely (INT_MAX - done < _val)) \
{ \
done = -1; \
__set_errno (EOVERFLOW); \
@@ -92,7 +92,7 @@
if (width > 0) \
{ \
unsigned int d = _IO_padn (s, (Padchar), width); \
- if (__builtin_expect (d == EOF, 0)) \
+ if (__glibc_unlikely (d == EOF)) \
{ \
done = -1; \
goto all_done; \
@@ -121,7 +121,7 @@
if (width > 0) \
{ \
unsigned int d = _IO_wpadn (s, (Padchar), width); \
- if (__builtin_expect (d == EOF, 0)) \
+ if (__glibc_unlikely (d == EOF)) \
{ \
done = -1; \
goto all_done; \
@@ -179,7 +179,7 @@
done = -1; \
goto all_done; \
} \
- if (__builtin_expect (INT_MAX - done < (Len), 0)) \
+ if (__glibc_unlikely (INT_MAX - done < (Len))) \
{ \
done = -1; \
__set_errno (EOVERFLOW); \
@@ -1121,7 +1121,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
outstring (string, len); \
if (left) \
PAD (L' '); \
- if (__builtin_expect (string_malloced, 0)) \
+ if (__glibc_unlikely (string_malloced)) \
free (string); \
} \
break;
@@ -1272,7 +1272,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
outstring (string, len); \
if (left) \
PAD (' '); \
- if (__builtin_expect (string_malloced, 0)) \
+ if (__glibc_unlikely (string_malloced)) \
free (string); \
} \
break;
@@ -1333,9 +1333,9 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
goto all_done;
/* Use the slow path in case any printf handler is registered. */
- if (__builtin_expect (__printf_function_table != NULL
+ if (__glibc_unlikely (__printf_function_table != NULL
|| __printf_modifier_table != NULL
- || __printf_va_arg_table != NULL, 0))
+ || __printf_va_arg_table != NULL))
goto do_positional;
/* Process whole format string. */
@@ -1472,7 +1472,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
left = 1;
}
- if (__builtin_expect (width >= INT_MAX / sizeof (CHAR_T) - 32, 0))
+ if (__glibc_unlikely (width >= INT_MAX / sizeof (CHAR_T) - 32))
{
__set_errno (EOVERFLOW);
done = -1;
@@ -1504,8 +1504,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
LABEL (width):
width = read_int (&f);
- if (__builtin_expect (width == -1
- || width >= INT_MAX / sizeof (CHAR_T) - 32, 0))
+ if (__glibc_unlikely (width == -1
+ || width >= INT_MAX / sizeof (CHAR_T) - 32))
{
__set_errno (EOVERFLOW);
done = -1;
@@ -1581,7 +1581,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
if (prec > width
&& prec > sizeof (work_buffer) / sizeof (work_buffer[0]) - 32)
{
- if (__builtin_expect (prec >= INT_MAX / sizeof (CHAR_T) - 32, 0))
+ if (__glibc_unlikely (prec >= INT_MAX / sizeof (CHAR_T) - 32))
{
__set_errno (EOVERFLOW);
done = -1;
@@ -1665,7 +1665,7 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
/* The format is correctly handled. */
++nspecs_done;
- if (__builtin_expect (workstart != NULL, 0))
+ if (__glibc_unlikely (workstart != NULL))
free (workstart);
workstart = NULL;
@@ -1711,7 +1711,8 @@ do_positional:
/* Just a counter. */
size_t cnt;
- free (workstart);
+ if (__glibc_unlikely (workstart != NULL))
+ free (workstart);
workstart = NULL;
if (! LOCALE_SUPPORT)
@@ -1758,7 +1759,7 @@ do_positional:
+ sizeof (*args_type));
/* Check for potential integer overflow. */
- if (__builtin_expect (nargs > INT_MAX / bytes_per_arg, 0))
+ if (__glibc_unlikely (nargs > INT_MAX / bytes_per_arg))
{
__set_errno (EOVERFLOW);
done = -1;
@@ -1863,7 +1864,7 @@ do_positional:
default:
if ((args_type[cnt] & PA_FLAG_PTR) != 0)
args_value[cnt].pa_pointer = va_arg (ap_save, void *);
- else if (__builtin_expect (__printf_va_arg_table != NULL, 0)
+ else if (__glibc_unlikely (__printf_va_arg_table != NULL)
&& __printf_va_arg_table[args_type[cnt] - PA_LAST] != NULL)
{
args_value[cnt].pa_user = alloca (args_size[cnt]);
@@ -1966,6 +1967,11 @@ do_positional:
{
workstart = (CHAR_T *) malloc ((MAX (prec, width) + 32)
* sizeof (CHAR_T));
+ if (workstart == NULL)
+ {
+ done = -1;
+ goto all_done;
+ }
workend = workstart + (MAX (prec, width) + 32);
}
}
@@ -2043,7 +2049,8 @@ do_positional:
break;
}
- free (workstart);
+ if (__glibc_unlikely (workstart != NULL))
+ free (workstart);
workstart = NULL;
/* Write the following constant string. */
@@ -2054,8 +2061,10 @@ do_positional:
}
all_done:
- free (args_malloced);
- free (workstart);
+ if (__glibc_unlikely (args_malloced != NULL))
+ free (args_malloced);
+ if (__glibc_unlikely (workstart != NULL))
+ free (workstart);
/* Unlock the stream. */
_IO_funlockfile (s);
_IO_cleanup_region_end (0);
diff --git a/libc/sysdeps/generic/ldsodefs.h b/libc/sysdeps/generic/ldsodefs.h
index 1781574a9..b89691a97 100644
--- a/libc/sysdeps/generic/ldsodefs.h
+++ b/libc/sysdeps/generic/ldsodefs.h
@@ -1018,6 +1018,13 @@ extern struct link_map *_dl_find_dso_for_object (const ElfW(Addr) addr)
internal_function;
rtld_hidden_proto (_dl_find_dso_for_object)
+/* Initialization which is normally done by the dynamic linker. */
+extern void _dl_non_dynamic_init (void) internal_function;
+
+/* Used by static binaries to check the auxiliary vector. */
+extern void _dl_aux_init (ElfW(auxv_t) *av) internal_function;
+
+
__END_DECLS
#endif /* ldsodefs.h */
diff --git a/libc/sysdeps/i386/fpu/libm-test-ulps b/libc/sysdeps/i386/fpu/libm-test-ulps
index fd0180ffd..6186c99af 100644
--- a/libc/sysdeps/i386/fpu/libm-test-ulps
+++ b/libc/sysdeps/i386/fpu/libm-test-ulps
@@ -2475,6 +2475,9 @@ ldouble: 2
Test "j0 (0x1.d7ce3ap+107) == 2.775523647291230802651040996274861694514e-17":
float: 1
ifloat: 1
+Test "j0 (0x1p16382) == -1.2193782500509000574176799046642541129387e-2466":
+ildouble: 1
+ldouble: 1
Test "j0 (10.0) == -0.245935764451348335197760862485328754":
double: 3
float: 1
@@ -2508,6 +2511,9 @@ ldouble: 1
Test "j1 (0x1.ff00000000002p+840) == 1.846591691699331493194965158699937660696e-127":
double: 1
idouble: 1
+Test "j1 (0x1p16382) == 8.0839224448726336195866026476176740513439e-2467":
+ildouble: 1
+ldouble: 1
Test "j1 (10.0) == 0.0434727461688614366697487680258592883":
double: 2
float: 1
@@ -3285,6 +3291,9 @@ idouble: 1
Test "y0 (0x1p-80) == -3.5375500319532942168707373066828113573541e+1":
double: 1
idouble: 1
+Test "y0 (0x1p16382) == 8.0839224448726336195866026476176740513439e-2467":
+ildouble: 1
+ldouble: 1
Test "y0 (1.0) == 0.0882569642156769579829267660235151628":
double: 2
float: 1
@@ -3329,6 +3338,9 @@ ldouble: 1
Test "y1 (0x1p-10) == -6.5190099301063115047395187618929589514382e+02":
float: 1
ifloat: 1
+Test "y1 (0x1p16382) == 1.2193782500509000574176799046642541129387e-2466":
+ildouble: 1
+ldouble: 1
Test "y1 (1.0) == -0.781212821300288716547150000047964821":
double: 1
idouble: 1
diff --git a/libc/sysdeps/ieee754/bits/nan.h b/libc/sysdeps/ieee754/bits/nan.h
index 935271a7c..41f47ba09 100644
--- a/libc/sysdeps/ieee754/bits/nan.h
+++ b/libc/sysdeps/ieee754/bits/nan.h
@@ -39,14 +39,14 @@
# include <endian.h>
# if __BYTE_ORDER == __BIG_ENDIAN
-# define __nan_bytes { 0x7f, 0xc0, 0, 0 }
+# define __qnan_bytes { 0x7f, 0xc0, 0, 0 }
# endif
# if __BYTE_ORDER == __LITTLE_ENDIAN
-# define __nan_bytes { 0, 0, 0xc0, 0x7f }
+# define __qnan_bytes { 0, 0, 0xc0, 0x7f }
# endif
-static union { unsigned char __c[4]; float __d; } __nan_union
- __attribute__ ((__unused__)) = { __nan_bytes };
-# define NAN (__nan_union.__d)
+static union { unsigned char __c[4]; float __d; } __qnan_union
+ __attribute__ ((__unused__)) = { __qnan_bytes };
+# define NAN (__qnan_union.__d)
#endif /* GCC. */
diff --git a/libc/sysdeps/ieee754/dbl-64/e_j0.c b/libc/sysdeps/ieee754/dbl-64/e_j0.c
index f393a762b..d641a0914 100644
--- a/libc/sysdeps/ieee754/dbl-64/e_j0.c
+++ b/libc/sysdeps/ieee754/dbl-64/e_j0.c
@@ -293,7 +293,8 @@ pzero(double x)
int32_t ix;
GET_HIGH_WORD(ix,x);
ix &= 0x7fffffff;
- if(ix>=0x40200000) {p = pR8; q= pS8;}
+ if (ix>=0x41b00000) {return one;}
+ else if(ix>=0x40200000){p = pR8; q= pS8;}
else if(ix>=0x40122E8B){p = pR5; q= pS5;}
else if(ix>=0x4006DB6D){p = pR3; q= pS3;}
else if(ix>=0x40000000){p = pR2; q= pS2;}
@@ -400,7 +401,8 @@ qzero(double x)
int32_t ix;
GET_HIGH_WORD(ix,x);
ix &= 0x7fffffff;
- if(ix>=0x40200000) {p = qR8; q= qS8;}
+ if (ix>=0x41b00000) {return -.125/x;}
+ else if(ix>=0x40200000){p = qR8; q= qS8;}
else if(ix>=0x40122E8B){p = qR5; q= qS5;}
else if(ix>=0x4006DB6D){p = qR3; q= qS3;}
else if(ix>=0x40000000){p = qR2; q= qS2;}
diff --git a/libc/sysdeps/ieee754/dbl-64/e_j1.c b/libc/sysdeps/ieee754/dbl-64/e_j1.c
index cba4d46b1..cca5f20b4 100644
--- a/libc/sysdeps/ieee754/dbl-64/e_j1.c
+++ b/libc/sysdeps/ieee754/dbl-64/e_j1.c
@@ -291,7 +291,8 @@ pone(double x)
int32_t ix;
GET_HIGH_WORD(ix,x);
ix &= 0x7fffffff;
- if(ix>=0x40200000) {p = pr8; q= ps8;}
+ if (ix>=0x41b00000) {return one;}
+ else if(ix>=0x40200000){p = pr8; q= ps8;}
else if(ix>=0x40122E8B){p = pr5; q= ps5;}
else if(ix>=0x4006DB6D){p = pr3; q= ps3;}
else if(ix>=0x40000000){p = pr2; q= ps2;}
@@ -399,7 +400,8 @@ qone(double x)
int32_t ix;
GET_HIGH_WORD(ix,x);
ix &= 0x7fffffff;
- if(ix>=0x40200000) {p = qr8; q= qs8;}
+ if (ix>=0x41b00000) {return .375/x;}
+ else if(ix>=0x40200000){p = qr8; q= qs8;}
else if(ix>=0x40122E8B){p = qr5; q= qs5;}
else if(ix>=0x4006DB6D){p = qr3; q= qs3;}
else if(ix>=0x40000000){p = qr2; q= qs2;}
diff --git a/libc/sysdeps/ieee754/dbl-64/mpa.c b/libc/sysdeps/ieee754/dbl-64/mpa.c
index 8fc2626f7..076647654 100644
--- a/libc/sysdeps/ieee754/dbl-64/mpa.c
+++ b/libc/sysdeps/ieee754/dbl-64/mpa.c
@@ -611,6 +611,7 @@ __sub (const mp_no *x, const mp_no *y, mp_no *z, int p)
}
}
+#ifndef NO__MUL
/* Multiply *X and *Y and store result in *Z. X and Y may overlap but not X
and Z or Y and Z. For P in [1, 2, 3], the exact result is truncated to P
digits. In case P > 3 the error is bounded by 1.001 ULP. */
@@ -761,7 +762,9 @@ __mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
EZ = e;
Z[0] = X[0] * Y[0];
}
+#endif
+#ifndef NO__SQR
/* Square *X and store result in *Y. X and Y may not overlap. For P in
[1, 2, 3], the exact result is truncated to P digits. In case P > 3 the
error is bounded by 1.001 ULP. This is a faster special case of
@@ -862,6 +865,7 @@ __sqr (const mp_no *x, mp_no *y, int p)
EY = e;
}
+#endif
/* Invert *X and store in *Y. Relative error bound:
- For P = 2: 1.001 * R ^ (1 - P)
diff --git a/libc/sysdeps/ieee754/dbl-64/slowexp.c b/libc/sysdeps/ieee754/dbl-64/slowexp.c
index c423fc311..8f353f634 100644
--- a/libc/sysdeps/ieee754/dbl-64/slowexp.c
+++ b/libc/sysdeps/ieee754/dbl-64/slowexp.c
@@ -27,20 +27,23 @@
/*Converting from double precision to Multi-precision and calculating */
/* e^x */
/**************************************************************************/
-#include "mpa.h"
#include <math_private.h>
+#ifndef USE_LONG_DOUBLE_FOR_MP
+# include "mpa.h"
+void __mpexp (mp_no *x, mp_no *y, int p);
+#endif
+
#ifndef SECTION
# define SECTION
#endif
-void __mpexp (mp_no *x, mp_no *y, int p);
-
/*Converting from double precision to Multi-precision and calculating e^x */
double
SECTION
__slowexp (double x)
{
+#ifndef USE_LONG_DOUBLE_FOR_MP
double w, z, res, eps = 3.0e-26;
int p;
mp_no mpx, mpy, mpz, mpw, mpeps, mpcor;
@@ -66,4 +69,7 @@ __slowexp (double x)
__mp_dbl (&mpy, &res, p);
return res;
}
+#else
+ return (double) __ieee754_expl((long double)x);
+#endif
}
diff --git a/libc/sysdeps/ieee754/dbl-64/slowpow.c b/libc/sysdeps/ieee754/dbl-64/slowpow.c
index cccc7e32c..a379728b1 100644
--- a/libc/sysdeps/ieee754/dbl-64/slowpow.c
+++ b/libc/sysdeps/ieee754/dbl-64/slowpow.c
@@ -59,6 +59,23 @@ __slowpow (double x, double y, double z)
if (res >= 0)
return res;
+ /* Compute pow as long double. This is currently only used by powerpc, where
+ one may get 106 bits of accuracy. */
+#ifdef USE_LONG_DOUBLE_FOR_MP
+ long double ldw, ldz, ldpp;
+ static const long double ldeps = 0x4.0p-96;
+
+ ldz = __ieee754_logl ((long double) x);
+ ldw = (long double) y *ldz;
+ ldpp = __ieee754_expl (ldw);
+ res = (double) (ldpp + ldeps);
+ res1 = (double) (ldpp - ldeps);
+
+ /* Return the result if it is accurate enough. */
+ if (res == res1)
+ return res;
+#endif
+
/* Or else, calculate using multiple precision. P = 10 implies accuracy of
240 bits accuracy, since MP_NO has a radix of 2^24. */
p = 10;
diff --git a/libc/sysdeps/ieee754/ldbl-128/e_j0l.c b/libc/sysdeps/ieee754/ldbl-128/e_j0l.c
index 1b1828958..9e7880c49 100644
--- a/libc/sysdeps/ieee754/ldbl-128/e_j0l.c
+++ b/libc/sysdeps/ieee754/ldbl-128/e_j0l.c
@@ -700,6 +700,25 @@ __ieee754_j0l (long double x)
return p;
}
+ /* X = x - pi/4
+ cos(X) = cos(x) cos(pi/4) + sin(x) sin(pi/4)
+ = 1/sqrt(2) * (cos(x) + sin(x))
+ sin(X) = sin(x) cos(pi/4) - cos(x) sin(pi/4)
+ = 1/sqrt(2) * (sin(x) - cos(x))
+ sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ cf. Fdlibm. */
+ __sincosl (xx, &s, &c);
+ ss = s - c;
+ cc = s + c;
+ z = -__cosl (xx + xx);
+ if ((s * c) < 0)
+ cc = z / ss;
+ else
+ ss = z / cc;
+
+ if (xx > 0x1p256L)
+ return ONEOSQPI * cc / __ieee754_sqrtl (xx);
+
xinv = 1.0L / xx;
z = xinv * xinv;
if (xinv <= 0.25)
@@ -761,21 +780,6 @@ __ieee754_j0l (long double x)
p = 1.0L + z * p;
q = z * xinv * q;
q = q - 0.125L * xinv;
- /* X = x - pi/4
- cos(X) = cos(x) cos(pi/4) + sin(x) sin(pi/4)
- = 1/sqrt(2) * (cos(x) + sin(x))
- sin(X) = sin(x) cos(pi/4) - cos(x) sin(pi/4)
- = 1/sqrt(2) * (sin(x) - cos(x))
- sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
- cf. Fdlibm. */
- __sincosl (xx, &s, &c);
- ss = s - c;
- cc = s + c;
- z = -__cosl (xx + xx);
- if ((s * c) < 0)
- cc = z / ss;
- else
- ss = z / cc;
z = ONEOSQPI * (p * cc - q * ss) / __ieee754_sqrtl (xx);
return z;
}
@@ -843,6 +847,25 @@ long double
return p;
}
+ /* X = x - pi/4
+ cos(X) = cos(x) cos(pi/4) + sin(x) sin(pi/4)
+ = 1/sqrt(2) * (cos(x) + sin(x))
+ sin(X) = sin(x) cos(pi/4) - cos(x) sin(pi/4)
+ = 1/sqrt(2) * (sin(x) - cos(x))
+ sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
+ cf. Fdlibm. */
+ __sincosl (x, &s, &c);
+ ss = s - c;
+ cc = s + c;
+ z = -__cosl (x + x);
+ if ((s * c) < 0)
+ cc = z / ss;
+ else
+ ss = z / cc;
+
+ if (xx > 0x1p256L)
+ return ONEOSQPI * ss / __ieee754_sqrtl (x);
+
xinv = 1.0L / xx;
z = xinv * xinv;
if (xinv <= 0.25)
@@ -904,21 +927,6 @@ long double
p = 1.0L + z * p;
q = z * xinv * q;
q = q - 0.125L * xinv;
- /* X = x - pi/4
- cos(X) = cos(x) cos(pi/4) + sin(x) sin(pi/4)
- = 1/sqrt(2) * (cos(x) + sin(x))
- sin(X) = sin(x) cos(pi/4) - cos(x) sin(pi/4)
- = 1/sqrt(2) * (sin(x) - cos(x))
- sin(x) +- cos(x) = -cos(2x)/(sin(x) -+ cos(x))
- cf. Fdlibm. */
- __sincosl (x, &s, &c);
- ss = s - c;
- cc = s + c;
- z = -__cosl (x + x);
- if ((s * c) < 0)
- cc = z / ss;
- else
- ss = z / cc;
z = ONEOSQPI * (p * ss + q * cc) / __ieee754_sqrtl (x);
return z;
}
diff --git a/libc/sysdeps/ieee754/ldbl-128/e_j1l.c b/libc/sysdeps/ieee754/ldbl-128/e_j1l.c
index f16343b26..95e01a39c 100644
--- a/libc/sysdeps/ieee754/ldbl-128/e_j1l.c
+++ b/libc/sysdeps/ieee754/ldbl-128/e_j1l.c
@@ -706,6 +706,29 @@ __ieee754_j1l (long double x)
return p;
}
+ /* X = x - 3 pi/4
+ cos(X) = cos(x) cos(3 pi/4) + sin(x) sin(3 pi/4)
+ = 1/sqrt(2) * (-cos(x) + sin(x))
+ sin(X) = sin(x) cos(3 pi/4) - cos(x) sin(3 pi/4)
+ = -1/sqrt(2) * (sin(x) + cos(x))
+ cf. Fdlibm. */
+ __sincosl (xx, &s, &c);
+ ss = -s - c;
+ cc = s - c;
+ z = __cosl (xx + xx);
+ if ((s * c) > 0)
+ cc = z / ss;
+ else
+ ss = z / cc;
+
+ if (xx > 0x1p256L)
+ {
+ z = ONEOSQPI * cc / __ieee754_sqrtl (xx);
+ if (x < 0)
+ z = -z;
+ return z;
+ }
+
xinv = 1.0L / xx;
z = xinv * xinv;
if (xinv <= 0.25)
@@ -767,20 +790,6 @@ __ieee754_j1l (long double x)
p = 1.0L + z * p;
q = z * q;
q = q * xinv + 0.375L * xinv;
- /* X = x - 3 pi/4
- cos(X) = cos(x) cos(3 pi/4) + sin(x) sin(3 pi/4)
- = 1/sqrt(2) * (-cos(x) + sin(x))
- sin(X) = sin(x) cos(3 pi/4) - cos(x) sin(3 pi/4)
- = -1/sqrt(2) * (sin(x) + cos(x))
- cf. Fdlibm. */
- __sincosl (xx, &s, &c);
- ss = -s - c;
- cc = s - c;
- z = __cosl (xx + xx);
- if ((s * c) > 0)
- cc = z / ss;
- else
- ss = z / cc;
z = ONEOSQPI * (p * cc - q * ss) / __ieee754_sqrtl (xx);
if (x < 0)
z = -z;
@@ -850,6 +859,24 @@ __ieee754_y1l (long double x)
return p;
}
+ /* X = x - 3 pi/4
+ cos(X) = cos(x) cos(3 pi/4) + sin(x) sin(3 pi/4)
+ = 1/sqrt(2) * (-cos(x) + sin(x))
+ sin(X) = sin(x) cos(3 pi/4) - cos(x) sin(3 pi/4)
+ = -1/sqrt(2) * (sin(x) + cos(x))
+ cf. Fdlibm. */
+ __sincosl (xx, &s, &c);
+ ss = -s - c;
+ cc = s - c;
+ z = __cosl (xx + xx);
+ if ((s * c) > 0)
+ cc = z / ss;
+ else
+ ss = z / cc;
+
+ if (xx > 0x1p256L)
+ return ONEOSQPI * ss / __ieee754_sqrtl (xx);
+
xinv = 1.0L / xx;
z = xinv * xinv;
if (xinv <= 0.25)
@@ -911,20 +938,6 @@ __ieee754_y1l (long double x)
p = 1.0L + z * p;
q = z * q;
q = q * xinv + 0.375L * xinv;
- /* X = x - 3 pi/4
- cos(X) = cos(x) cos(3 pi/4) + sin(x) sin(3 pi/4)
- = 1/sqrt(2) * (-cos(x) + sin(x))
- sin(X) = sin(x) cos(3 pi/4) - cos(x) sin(3 pi/4)
- = -1/sqrt(2) * (sin(x) + cos(x))
- cf. Fdlibm. */
- __sincosl (xx, &s, &c);
- ss = -s - c;
- cc = s - c;
- z = __cosl (xx + xx);
- if ((s * c) > 0)
- cc = z / ss;
- else
- ss = z / cc;
z = ONEOSQPI * (p * ss + q * cc) / __ieee754_sqrtl (xx);
return z;
}
diff --git a/libc/sysdeps/ieee754/ldbl-128ibm/e_acoshl.c b/libc/sysdeps/ieee754/ldbl-128ibm/e_acoshl.c
index 117bd0f05..abc78a35b 100644
--- a/libc/sysdeps/ieee754/ldbl-128ibm/e_acoshl.c
+++ b/libc/sysdeps/ieee754/ldbl-128ibm/e_acoshl.c
@@ -52,7 +52,7 @@ __ieee754_acoshl(long double x)
return __ieee754_logl(2.0*x-one/(x+__ieee754_sqrtl(t-one)));
} else { /* 1<x<2 */
t = x-one;
- return __log1p(t+__sqrtl(2.0*t+t*t));
+ return __log1p(t+__ieee754_sqrtl(2.0*t+t*t));
}
}
strong_alias (__ieee754_acoshl, __acoshl_finite)
diff --git a/libc/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h b/libc/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h
index be9ac71cb..1cce1fc4d 100644
--- a/libc/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h
+++ b/libc/sysdeps/ieee754/ldbl-128ibm/math_ldbl.h
@@ -125,7 +125,7 @@ ldbl_insert_mantissa (int sign, int exp, int64_t hi64, u_int64_t lo64)
/* Handy utility functions to pack/unpack/cononicalize and find the nearbyint
of long double implemented as double double. */
static inline long double
-ldbl_pack (double a, double aa)
+default_ldbl_pack (double a, double aa)
{
union ibm_extended_long_double u;
u.dd[0] = a;
@@ -134,7 +134,7 @@ ldbl_pack (double a, double aa)
}
static inline void
-ldbl_unpack (long double l, double *a, double *aa)
+default_ldbl_unpack (long double l, double *a, double *aa)
{
union ibm_extended_long_double u;
u.d = l;
@@ -142,6 +142,12 @@ ldbl_unpack (long double l, double *a, double *aa)
*aa = u.dd[1];
}
+#ifndef ldbl_pack
+# define ldbl_pack default_ldbl_pack
+#endif
+#ifndef ldbl_unpack
+# define ldbl_unpack default_ldbl_unpack
+#endif
/* Convert a finite long double to canonical form.
Does not handle +/-Inf properly. */
diff --git a/libc/sysdeps/ieee754/ldbl-96/e_j1l.c b/libc/sysdeps/ieee754/ldbl-96/e_j1l.c
index 785c0b067..4c13018ae 100644
--- a/libc/sysdeps/ieee754/ldbl-96/e_j1l.c
+++ b/libc/sysdeps/ieee754/ldbl-96/e_j1l.c
@@ -203,7 +203,7 @@ __ieee754_y1l (long double x)
__sincosl (x, &s, &c);
ss = -s - c;
cc = s - c;
- if (ix < 0x7fe00000)
+ if (ix < 0x7ffe)
{ /* make sure x+x not overflow */
z = __cosl (x + x);
if ((s * c) > zero)
diff --git a/libc/sysdeps/init_array/crti.S b/libc/sysdeps/init_array/crti.S
new file mode 100644
index 000000000..0a6e9fd95
--- /dev/null
+++ b/libc/sysdeps/init_array/crti.S
@@ -0,0 +1,13 @@
+/* Dummy crti file.
+
+ In this configuration, crti.o and crtn.o are both empty because the
+ .init_array/.fini_array sections are used exclusively.
+
+ Older ports cannot use this because even if the linker used to
+ build libc itself has .init_array support, we don't want to produce
+ a crt[in].o that presume a linker that new will be used to link
+ other things later.
+
+ But new configurations without compatibility concerns for
+ toolchains without .init_array support can use this to avoid the
+ superfluous .init and .fini boilerplate code. */
diff --git a/libc/sysdeps/init_array/crtn.S b/libc/sysdeps/init_array/crtn.S
new file mode 100644
index 000000000..6f70e7716
--- /dev/null
+++ b/libc/sysdeps/init_array/crtn.S
@@ -0,0 +1,13 @@
+/* Dummy crtn file.
+
+ In this configuration, crti.o and crtn.o are both empty because the
+ .init_array/.fini_array sections are used exclusively.
+
+ Older ports cannot use this because even if the linker used to
+ build libc itself has .init_array support, we don't want to produce
+ a crt[in].o that presume a linker that new will be used to link
+ other things later.
+
+ But new configurations without compatibility concerns for
+ toolchains without .init_array support can use this to avoid the
+ superfluous .init and .fini boilerplate code. */
diff --git a/libc/sysdeps/init_array/elf-init.c b/libc/sysdeps/init_array/elf-init.c
new file mode 100644
index 000000000..c6467aac8
--- /dev/null
+++ b/libc/sysdeps/init_array/elf-init.c
@@ -0,0 +1,37 @@
+/* Startup support for ELF initializers/finalizers in the main executable.
+ Copyright (C) 2013 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.
+
+ In addition to the permissions in the GNU Lesser General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file with other
+ programs, and to distribute those programs without any restriction
+ coming from the use of this file. (The GNU Lesser General Public
+ License restrictions do apply in other respects; for example, they
+ cover modification of the file, and distribution when not linked
+ into another program.)
+
+ Note that people who make modified versions of this file are not
+ obligated to grant this special exception for their modified
+ versions; it is their choice whether to do so. The GNU Lesser
+ General Public License gives permission to release a modified
+ version without this exception; this exception also makes it
+ possible to release a modified version which carries forward this
+ exception.
+
+ 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#define NO_INITFINI
+#include <csu/elf-init.c>
diff --git a/libc/sysdeps/init_array/gmon-start.c b/libc/sysdeps/init_array/gmon-start.c
new file mode 100644
index 000000000..6f2d6dc8b
--- /dev/null
+++ b/libc/sysdeps/init_array/gmon-start.c
@@ -0,0 +1,41 @@
+/* gmon startup hook using .preinit_array.
+ Copyright (C) 2013 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.
+
+ In addition to the permissions in the GNU Lesser General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file with other
+ programs, and to distribute those programs without any restriction
+ coming from the use of this file. (The GNU Lesser General Public
+ License restrictions do apply in other respects; for example, they
+ cover modification of the file, and distribution when not linked
+ into another program.)
+
+ Note that people who make modified versions of this file are not
+ obligated to grant this special exception for their modified
+ versions; it is their choice whether to do so. The GNU Lesser
+ General Public License gives permission to release a modified
+ version without this exception; this exception also makes it
+ possible to release a modified version which carries forward this
+ exception.
+
+ 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, see
+ <http://www.gnu.org/licenses/>. */
+
+/* Instead of defining __gmon_start__ globally in gcrt1.o, we make it
+ static and just put a pointer to it into the .preinit_array section. */
+
+#define GMON_START_ARRAY_SECTION ".preinit_array"
+
+#include <csu/gmon-start.c>
diff --git a/libc/sysdeps/powerpc/Implies b/libc/sysdeps/powerpc/Implies
index 7ccf9a7c4..78dba9510 100644
--- a/libc/sysdeps/powerpc/Implies
+++ b/libc/sysdeps/powerpc/Implies
@@ -1,4 +1,5 @@
# On PowerPC we use the IBM extended long double format.
ieee754/ldbl-128ibm
+ieee754/ldbl-opt
ieee754/dbl-64
ieee754/flt-32
diff --git a/libc/sysdeps/powerpc/bits/fenv.h b/libc/sysdeps/powerpc/bits/fenv.h
index 1054ba142..07cd3c8e5 100644
--- a/libc/sysdeps/powerpc/bits/fenv.h
+++ b/libc/sysdeps/powerpc/bits/fenv.h
@@ -123,7 +123,7 @@ enum
these bits is set. Note, though, that you can't disable or
enable these exceptions individually. */
- /* Operation with SNaN. */
+ /* Operation with a sNaN. */
FE_INVALID_SNAN =
# define FE_INVALID_SNAN (1 << (31 - 7))
FE_INVALID_SNAN,
@@ -148,7 +148,7 @@ enum
# define FE_INVALID_IMZ (1 << (31 - 11))
FE_INVALID_IMZ,
- /* Comparison with NaN or SNaN. */
+ /* Comparison with a NaN. */
FE_INVALID_COMPARE =
# define FE_INVALID_COMPARE (1 << (31 - 12))
FE_INVALID_COMPARE,
diff --git a/libc/sysdeps/powerpc/fpu/Makefile b/libc/sysdeps/powerpc/fpu/Makefile
index ffacf1a75..fda59f9fa 100644
--- a/libc/sysdeps/powerpc/fpu/Makefile
+++ b/libc/sysdeps/powerpc/fpu/Makefile
@@ -1,6 +1,5 @@
ifeq ($(subdir),math)
libm-support += fenv_const fe_nomask fe_mask t_sqrt
-libm-tests += test-powerpc-snan
# libm needs ld.so to access dl_hwcap
$(objpfx)libm.so: $(elfobjdir)/ld.so
diff --git a/libc/sysdeps/powerpc/fpu/fenv_libc.h b/libc/sysdeps/powerpc/fpu/fenv_libc.h
index abae2f3df..191095156 100644
--- a/libc/sysdeps/powerpc/fpu/fenv_libc.h
+++ b/libc/sysdeps/powerpc/fpu/fenv_libc.h
@@ -116,7 +116,7 @@ enum {
FPSCR_UX, /* underflow */
FPSCR_ZX, /* zero divide */
FPSCR_XX, /* inexact */
- FPSCR_VXSNAN, /* invalid operation for SNaN */
+ FPSCR_VXSNAN, /* invalid operation for sNaN */
FPSCR_VXISI, /* invalid operation for Inf-Inf */
FPSCR_VXIDI, /* invalid operation for Inf/Inf */
FPSCR_VXZDZ, /* invalid operation for 0/0 */
@@ -152,7 +152,7 @@ enum {
#endif /* _ARCH_PWR6 */
/* This operation (i) sets the appropriate FPSCR bits for its
- parameter, (ii) converts SNaN to the corresponding NaN, and (iii)
+ parameter, (ii) converts sNaN to the corresponding qNaN, and (iii)
otherwise passes its parameter through unchanged (in particular, -0
and +0 stay as they were). The `obvious' way to do this is optimised
out by gcc. */
diff --git a/libc/sysdeps/powerpc/fpu/math_ldbl.h b/libc/sysdeps/powerpc/fpu/math_ldbl.h
index 20224e664..36378c023 100644
--- a/libc/sysdeps/powerpc/fpu/math_ldbl.h
+++ b/libc/sysdeps/powerpc/fpu/math_ldbl.h
@@ -2,132 +2,12 @@
#error "Never use <math_ldbl.h> directly; include <math_private.h> instead."
#endif
-#include <sysdeps/ieee754/ldbl-128/math_ldbl.h>
-#include <ieee754.h>
-
-static inline void
-ldbl_extract_mantissa (int64_t *hi64, u_int64_t *lo64, int *exp, long double x)
-{
- /* We have 105 bits of mantissa plus one implicit digit. Since
- 106 bits are representable we use the first implicit digit for
- the number before the decimal point and the second implicit bit
- as bit 53 of the mantissa. */
- unsigned long long hi, lo;
- int ediff;
- union ibm_extended_long_double eldbl;
- eldbl.d = x;
- *exp = eldbl.ieee.exponent - IBM_EXTENDED_LONG_DOUBLE_BIAS;
-
- lo = ((long long)eldbl.ieee.mantissa2 << 32) | eldbl.ieee.mantissa3;
- hi = ((long long)eldbl.ieee.mantissa0 << 32) | eldbl.ieee.mantissa1;
- /* If the lower double is not a denomal or zero then set the hidden
- 53rd bit. */
- if (eldbl.ieee.exponent2 > 0x001)
- {
- lo |= (1ULL << 52);
- lo = lo << 7; /* pre-shift lo to match ieee854. */
- /* The lower double is normalized separately from the upper. We
- may need to adjust the lower mantissa to reflect this. */
- ediff = eldbl.ieee.exponent - eldbl.ieee.exponent2;
- if (ediff > 53)
- lo = lo >> (ediff-53);
- }
- hi |= (1ULL << 52);
-
- if ((eldbl.ieee.negative != eldbl.ieee.negative2)
- && ((eldbl.ieee.exponent2 != 0) && (lo != 0LL)))
- {
- hi--;
- lo = (1ULL << 60) - lo;
- if (hi < (1ULL << 52))
- {
- /* we have a borrow from the hidden bit, so shift left 1. */
- hi = (hi << 1) | (lo >> 59);
- lo = 0xfffffffffffffffLL & (lo << 1);
- *exp = *exp - 1;
- }
- }
- *lo64 = (hi << 60) | lo;
- *hi64 = hi >> 4;
-}
-
-static inline long double
-ldbl_insert_mantissa (int sign, int exp, int64_t hi64, u_int64_t lo64)
-{
- union ibm_extended_long_double u;
- unsigned long hidden2, lzcount;
- unsigned long long hi, lo;
-
- u.ieee.negative = sign;
- u.ieee.negative2 = sign;
- u.ieee.exponent = exp + IBM_EXTENDED_LONG_DOUBLE_BIAS;
- u.ieee.exponent2 = exp-53 + IBM_EXTENDED_LONG_DOUBLE_BIAS;
- /* Expect 113 bits (112 bits + hidden) right justified in two longs.
- The low order 53 bits (52 + hidden) go into the lower double */
- lo = (lo64 >> 7)& ((1ULL << 53) - 1);
- hidden2 = (lo64 >> 59) & 1ULL;
- /* The high order 53 bits (52 + hidden) go into the upper double */
- hi = (lo64 >> 60) & ((1ULL << 11) - 1);
- hi |= (hi64 << 4);
-
- if (lo != 0LL)
- {
- /* hidden2 bit of low double controls rounding of the high double.
- If hidden2 is '1' then round up hi and adjust lo (2nd mantissa)
- plus change the sign of the low double to compensate. */
- if (hidden2)
- {
- hi++;
- u.ieee.negative2 = !sign;
- lo = (1ULL << 53) - lo;
- }
- /* The hidden bit of the lo mantissa is zero so we need to
- normalize the it for the low double. Shift it left until the
- hidden bit is '1' then adjust the 2nd exponent accordingly. */
-
- if (sizeof (lo) == sizeof (long))
- lzcount = __builtin_clzl (lo);
- else if ((lo >> 32) != 0)
- lzcount = __builtin_clzl ((long) (lo >> 32));
- else
- lzcount = __builtin_clzl ((long) lo) + 32;
- lzcount = lzcount - 11;
- if (lzcount > 0)
- {
- int expnt2 = u.ieee.exponent2 - lzcount;
- if (expnt2 >= 1)
- {
- /* Not denormal. Normalize and set low exponent. */
- lo = lo << lzcount;
- u.ieee.exponent2 = expnt2;
- }
- else
- {
- /* Is denormal. */
- lo = lo << (lzcount + expnt2);
- u.ieee.exponent2 = 0;
- }
- }
- }
- else
- {
- u.ieee.negative2 = 0;
- u.ieee.exponent2 = 0;
- }
-
- u.ieee.mantissa3 = lo & ((1ULL << 32) - 1);
- u.ieee.mantissa2 = (lo >> 32) & ((1ULL << 20) - 1);
- u.ieee.mantissa1 = hi & ((1ULL << 32) - 1);
- u.ieee.mantissa0 = (hi >> 32) & ((1ULL << 20) - 1);
- return u.d;
-}
-
-/* gcc generates disgusting code to pack and unpack long doubles.
- This tells gcc that pack/unpack is really a nop. We use fr1/fr2
- because those are the regs used to pass/return a single
- long double arg. */
+/* GCC does not optimize the default ldbl_pack code to not spill register
+ in the stack. The following optimization tells gcc that pack/unpack
+ is really a nop. We use fr1/fr2 because those are the regs used to
+ pass/return a single long double arg. */
static inline long double
-ldbl_pack (double a, double aa)
+ldbl_pack_ppc (double a, double aa)
{
register long double x __asm__ ("fr1");
register double xh __asm__ ("fr1");
@@ -139,7 +19,7 @@ ldbl_pack (double a, double aa)
}
static inline void
-ldbl_unpack (long double l, double *a, double *aa)
+ldbl_unpack_ppc (long double l, double *a, double *aa)
{
register long double x __asm__ ("fr1");
register double xh __asm__ ("fr1");
@@ -150,40 +30,7 @@ ldbl_unpack (long double l, double *a, double *aa)
*aa = xl;
}
+#define ldbl_pack ldbl_pack_ppc
+#define ldbl_unpack ldbl_unpack_ppc
-/* Convert a finite long double to canonical form.
- Does not handle +/-Inf properly. */
-static inline void
-ldbl_canonicalize (double *a, double *aa)
-{
- double xh, xl;
-
- xh = *a + *aa;
- xl = (*a - xh) + *aa;
- *a = xh;
- *aa = xl;
-}
-
-/* Simple inline nearbyint (double) function .
- Only works in the default rounding mode
- but is useful in long double rounding functions. */
-static inline double
-ldbl_nearbyint (double a)
-{
- double two52 = 0x10000000000000LL;
-
- if (__builtin_expect ((__builtin_fabs (a) < two52), 1))
- {
- if (__builtin_expect ((a > 0.0), 1))
- {
- a += two52;
- a -= two52;
- }
- else if (__builtin_expect ((a < 0.0), 1))
- {
- a = two52 - a;
- a = -(a - two52);
- }
- }
- return a;
-}
+#include <sysdeps/ieee754/ldbl-128ibm/math_ldbl.h>
diff --git a/libc/sysdeps/powerpc/powerpc32/power4/fpu/Makefile b/libc/sysdeps/powerpc/power4/fpu/Makefile
index f487ed601..e17d32f30 100644
--- a/libc/sysdeps/powerpc/powerpc32/power4/fpu/Makefile
+++ b/libc/sysdeps/powerpc/power4/fpu/Makefile
@@ -2,4 +2,6 @@
ifeq ($(subdir),math)
CFLAGS-mpa.c += --param max-unroll-times=4 -funroll-loops -fpeel-loops
+CPPFLAGS-slowpow.c += -DUSE_LONG_DOUBLE_FOR_MP=1
+CPPFLAGS-slowexp.c += -DUSE_LONG_DOUBLE_FOR_MP=1
endif
diff --git a/libc/sysdeps/powerpc/power4/fpu/mpa.c b/libc/sysdeps/powerpc/power4/fpu/mpa.c
new file mode 100644
index 000000000..1858c9740
--- /dev/null
+++ b/libc/sysdeps/powerpc/power4/fpu/mpa.c
@@ -0,0 +1,214 @@
+
+/*
+ * IBM Accurate Mathematical Library
+ * written by International Business Machines Corp.
+ * Copyright (C) 2001-2013 Free Software Foundation, Inc.
+ *
+ * This program 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.
+ *
+ * This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/* Define __mul and __sqr and use the rest from generic code. */
+#define NO__MUL
+#define NO__SQR
+
+#include <sysdeps/ieee754/dbl-64/mpa.c>
+
+/* Multiply *X and *Y and store result in *Z. X and Y may overlap but not X
+ and Z or Y and Z. For P in [1, 2, 3], the exact result is truncated to P
+ digits. In case P > 3 the error is bounded by 1.001 ULP. */
+void
+__mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
+{
+ long i, i1, i2, j, k, k2;
+ long p2 = p;
+ double u, zk, zk2;
+
+ /* Is z=0? */
+ if (__glibc_unlikely (X[0] * Y[0] == ZERO))
+ {
+ Z[0] = ZERO;
+ return;
+ }
+
+ /* Multiply, add and carry */
+ k2 = (p2 < 3) ? p2 + p2 : p2 + 3;
+ zk = Z[k2] = ZERO;
+ for (k = k2; k > 1;)
+ {
+ if (k > p2)
+ {
+ i1 = k - p2;
+ i2 = p2 + 1;
+ }
+ else
+ {
+ i1 = 1;
+ i2 = k;
+ }
+#if 1
+ /* Rearrange this inner loop to allow the fmadd instructions to be
+ independent and execute in parallel on processors that have
+ dual symmetrical FP pipelines. */
+ if (i1 < (i2 - 1))
+ {
+ /* Make sure we have at least 2 iterations. */
+ if (((i2 - i1) & 1L) == 1L)
+ {
+ /* Handle the odd iterations case. */
+ zk2 = x->d[i2 - 1] * y->d[i1];
+ }
+ else
+ zk2 = 0.0;
+ /* Do two multiply/adds per loop iteration, using independent
+ accumulators; zk and zk2. */
+ for (i = i1, j = i2 - 1; i < i2 - 1; i += 2, j -= 2)
+ {
+ zk += x->d[i] * y->d[j];
+ zk2 += x->d[i + 1] * y->d[j - 1];
+ }
+ zk += zk2; /* Final sum. */
+ }
+ else
+ {
+ /* Special case when iterations is 1. */
+ zk += x->d[i1] * y->d[i1];
+ }
+#else
+ /* The original code. */
+ for (i = i1, j = i2 - 1; i < i2; i++, j--)
+ zk += X[i] * Y[j];
+#endif
+
+ u = (zk + CUTTER) - CUTTER;
+ if (u > zk)
+ u -= RADIX;
+ Z[k] = zk - u;
+ zk = u * RADIXI;
+ --k;
+ }
+ Z[k] = zk;
+
+ int e = EX + EY;
+ /* Is there a carry beyond the most significant digit? */
+ if (Z[1] == ZERO)
+ {
+ for (i = 1; i <= p2; i++)
+ Z[i] = Z[i + 1];
+ e--;
+ }
+
+ EZ = e;
+ Z[0] = X[0] * Y[0];
+}
+
+/* Square *X and store result in *Y. X and Y may not overlap. For P in
+ [1, 2, 3], the exact result is truncated to P digits. In case P > 3 the
+ error is bounded by 1.001 ULP. This is a faster special case of
+ multiplication. */
+void
+__sqr (const mp_no *x, mp_no *y, int p)
+{
+ long i, j, k, ip;
+ double u, yk;
+
+ /* Is z=0? */
+ if (__glibc_unlikely (X[0] == ZERO))
+ {
+ Y[0] = ZERO;
+ return;
+ }
+
+ /* We need not iterate through all X's since it's pointless to
+ multiply zeroes. */
+ for (ip = p; ip > 0; ip--)
+ if (X[ip] != ZERO)
+ break;
+
+ k = (__glibc_unlikely (p < 3)) ? p + p : p + 3;
+
+ while (k > 2 * ip + 1)
+ Y[k--] = ZERO;
+
+ yk = ZERO;
+
+ while (k > p)
+ {
+ double yk2 = 0.0;
+ long lim = k / 2;
+
+ if (k % 2 == 0)
+ {
+ yk += X[lim] * X[lim];
+ lim--;
+ }
+
+ /* In __mul, this loop (and the one within the next while loop) run
+ between a range to calculate the mantissa as follows:
+
+ Z[k] = X[k] * Y[n] + X[k+1] * Y[n-1] ... + X[n-1] * Y[k+1]
+ + X[n] * Y[k]
+
+ For X == Y, we can get away with summing halfway and doubling the
+ result. For cases where the range size is even, the mid-point needs
+ to be added separately (above). */
+ for (i = k - p, j = p; i <= lim; i++, j--)
+ yk2 += X[i] * X[j];
+
+ yk += 2.0 * yk2;
+
+ u = (yk + CUTTER) - CUTTER;
+ if (u > yk)
+ u -= RADIX;
+ Y[k--] = yk - u;
+ yk = u * RADIXI;
+ }
+
+ while (k > 1)
+ {
+ double yk2 = 0.0;
+ long lim = k / 2;
+
+ if (k % 2 == 0)
+ {
+ yk += X[lim] * X[lim];
+ lim--;
+ }
+
+ /* Likewise for this loop. */
+ for (i = 1, j = k - 1; i <= lim; i++, j--)
+ yk2 += X[i] * X[j];
+
+ yk += 2.0 * yk2;
+
+ u = (yk + CUTTER) - CUTTER;
+ if (u > yk)
+ u -= RADIX;
+ Y[k--] = yk - u;
+ yk = u * RADIXI;
+ }
+ Y[k] = yk;
+
+ /* Squares are always positive. */
+ Y[0] = 1.0;
+
+ int e = EX * 2;
+ /* Is there a carry beyond the most significant digit? */
+ if (__glibc_unlikely (Y[1] == ZERO))
+ {
+ for (i = 1; i <= p; i++)
+ Y[i] = Y[i + 1];
+ e--;
+ }
+ EY = e;
+}
diff --git a/libc/sysdeps/powerpc/powerpc32/power4/Implies b/libc/sysdeps/powerpc/powerpc32/power4/Implies
new file mode 100644
index 000000000..a372141bb
--- /dev/null
+++ b/libc/sysdeps/powerpc/powerpc32/power4/Implies
@@ -0,0 +1,2 @@
+powerpc/power4/fpu
+powerpc/power4
diff --git a/libc/sysdeps/powerpc/powerpc32/power4/fpu/mpa.c b/libc/sysdeps/powerpc/powerpc32/power4/fpu/mpa.c
deleted file mode 100644
index b22664772..000000000
--- a/libc/sysdeps/powerpc/powerpc32/power4/fpu/mpa.c
+++ /dev/null
@@ -1,837 +0,0 @@
-
-/*
- * IBM Accurate Mathematical Library
- * written by International Business Machines Corp.
- * Copyright (C) 2001-2013 Free Software Foundation, Inc.
- *
- * This program 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.
- *
- * This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
- */
-/************************************************************************/
-/* MODULE_NAME: mpa.c */
-/* */
-/* FUNCTIONS: */
-/* mcr */
-/* acr */
-/* cpy */
-/* norm */
-/* denorm */
-/* mp_dbl */
-/* dbl_mp */
-/* add_magnitudes */
-/* sub_magnitudes */
-/* add */
-/* sub */
-/* mul */
-/* inv */
-/* dvd */
-/* */
-/* Arithmetic functions for multiple precision numbers. */
-/* Relative errors are bounded */
-/************************************************************************/
-
-
-#include "endian.h"
-#include "mpa.h"
-#include <sys/param.h>
-
-const mp_no mpone = {1, {1.0, 1.0}};
-const mp_no mptwo = {1, {1.0, 2.0}};
-
-/* Compare mantissa of two multiple precision numbers regardless of the sign
- and exponent of the numbers. */
-static int
-mcr (const mp_no *x, const mp_no *y, int p)
-{
- long i;
- long p2 = p;
- for (i = 1; i <= p2; i++)
- {
- if (X[i] == Y[i])
- continue;
- else if (X[i] > Y[i])
- return 1;
- else
- return -1;
- }
- return 0;
-}
-
-/* Compare the absolute values of two multiple precision numbers. */
-int
-__acr (const mp_no *x, const mp_no *y, int p)
-{
- long i;
-
- if (X[0] == ZERO)
- {
- if (Y[0] == ZERO)
- i = 0;
- else
- i = -1;
- }
- else if (Y[0] == ZERO)
- i = 1;
- else
- {
- if (EX > EY)
- i = 1;
- else if (EX < EY)
- i = -1;
- else
- i = mcr (x, y, p);
- }
-
- return i;
-}
-
-/* Copy multiple precision number X into Y. They could be the same
- number. */
-void
-__cpy (const mp_no *x, mp_no *y, int p)
-{
- long i;
-
- EY = EX;
- for (i = 0; i <= p; i++)
- Y[i] = X[i];
-}
-
-/* Convert a multiple precision number *X into a double precision
- number *Y, normalized case (|x| >= 2**(-1022))). */
-static void
-norm (const mp_no *x, double *y, int p)
-{
-#define R RADIXI
- long i;
- double a, c, u, v, z[5];
- if (p < 5)
- {
- if (p == 1)
- c = X[1];
- else if (p == 2)
- c = X[1] + R * X[2];
- else if (p == 3)
- c = X[1] + R * (X[2] + R * X[3]);
- else if (p == 4)
- c = (X[1] + R * X[2]) + R * R * (X[3] + R * X[4]);
- }
- else
- {
- for (a = ONE, z[1] = X[1]; z[1] < TWO23;)
- {
- a *= TWO;
- z[1] *= TWO;
- }
-
- for (i = 2; i < 5; i++)
- {
- z[i] = X[i] * a;
- u = (z[i] + CUTTER) - CUTTER;
- if (u > z[i])
- u -= RADIX;
- z[i] -= u;
- z[i - 1] += u * RADIXI;
- }
-
- u = (z[3] + TWO71) - TWO71;
- if (u > z[3])
- u -= TWO19;
- v = z[3] - u;
-
- if (v == TWO18)
- {
- if (z[4] == ZERO)
- {
- for (i = 5; i <= p; i++)
- {
- if (X[i] == ZERO)
- continue;
- else
- {
- z[3] += ONE;
- break;
- }
- }
- }
- else
- z[3] += ONE;
- }
-
- c = (z[1] + R * (z[2] + R * z[3])) / a;
- }
-
- c *= X[0];
-
- for (i = 1; i < EX; i++)
- c *= RADIX;
- for (i = 1; i > EX; i--)
- c *= RADIXI;
-
- *y = c;
-#undef R
-}
-
-/* Convert a multiple precision number *X into a double precision
- number *Y, Denormal case (|x| < 2**(-1022))). */
-static void
-denorm (const mp_no *x, double *y, int p)
-{
- long i, k;
- long p2 = p;
- double c, u, z[5];
-
-#define R RADIXI
- if (EX < -44 || (EX == -44 && X[1] < TWO5))
- {
- *y = ZERO;
- return;
- }
-
- if (p2 == 1)
- {
- if (EX == -42)
- {
- z[1] = X[1] + TWO10;
- z[2] = ZERO;
- z[3] = ZERO;
- k = 3;
- }
- else if (EX == -43)
- {
- z[1] = TWO10;
- z[2] = X[1];
- z[3] = ZERO;
- k = 2;
- }
- else
- {
- z[1] = TWO10;
- z[2] = ZERO;
- z[3] = X[1];
- k = 1;
- }
- }
- else if (p2 == 2)
- {
- if (EX == -42)
- {
- z[1] = X[1] + TWO10;
- z[2] = X[2];
- z[3] = ZERO;
- k = 3;
- }
- else if (EX == -43)
- {
- z[1] = TWO10;
- z[2] = X[1];
- z[3] = X[2];
- k = 2;
- }
- else
- {
- z[1] = TWO10;
- z[2] = ZERO;
- z[3] = X[1];
- k = 1;
- }
- }
- else
- {
- if (EX == -42)
- {
- z[1] = X[1] + TWO10;
- z[2] = X[2];
- k = 3;
- }
- else if (EX == -43)
- {
- z[1] = TWO10;
- z[2] = X[1];
- k = 2;
- }
- else
- {
- z[1] = TWO10;
- z[2] = ZERO;
- k = 1;
- }
- z[3] = X[k];
- }
-
- u = (z[3] + TWO57) - TWO57;
- if (u > z[3])
- u -= TWO5;
-
- if (u == z[3])
- {
- for (i = k + 1; i <= p2; i++)
- {
- if (X[i] == ZERO)
- continue;
- else
- {
- z[3] += ONE;
- break;
- }
- }
- }
-
- c = X[0] * ((z[1] + R * (z[2] + R * z[3])) - TWO10);
-
- *y = c * TWOM1032;
-#undef R
-}
-
-/* Convert multiple precision number *X into double precision number *Y. The
- result is correctly rounded to the nearest/even. */
-void
-__mp_dbl (const mp_no *x, double *y, int p)
-{
- if (X[0] == ZERO)
- {
- *y = ZERO;
- return;
- }
-
- if (__glibc_likely (EX > -42 || (EX == -42 && X[1] >= TWO10)))
- norm (x, y, p);
- else
- denorm (x, y, p);
-}
-
-/* Get the multiple precision equivalent of X into *Y. If the precision is too
- small, the result is truncated. */
-void
-__dbl_mp (double x, mp_no *y, int p)
-{
- long i, n;
- long p2 = p;
- double u;
-
- /* Sign. */
- if (x == ZERO)
- {
- Y[0] = ZERO;
- return;
- }
- else if (x > ZERO)
- Y[0] = ONE;
- else
- {
- Y[0] = MONE;
- x = -x;
- }
-
- /* Exponent. */
- for (EY = ONE; x >= RADIX; EY += ONE)
- x *= RADIXI;
- for (; x < ONE; EY -= ONE)
- x *= RADIX;
-
- /* Digits. */
- n = MIN (p2, 4);
- for (i = 1; i <= n; i++)
- {
- u = (x + TWO52) - TWO52;
- if (u > x)
- u -= ONE;
- Y[i] = u;
- x -= u;
- x *= RADIX;
- }
- for (; i <= p2; i++)
- Y[i] = ZERO;
-}
-
-/* Add magnitudes of *X and *Y assuming that abs (*X) >= abs (*Y) > 0. The
- sign of the sum *Z is not changed. X and Y may overlap but not X and Z or
- Y and Z. No guard digit is used. The result equals the exact sum,
- truncated. */
-static void
-add_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- long i, j, k;
- long p2 = p;
- double zk;
-
- EZ = EX;
-
- i = p2;
- j = p2 + EY - EX;
- k = p2 + 1;
-
- if (__glibc_unlikely (j < 1))
- {
- __cpy (x, z, p);
- return;
- }
-
- zk = ZERO;
-
- for (; j > 0; i--, j--)
- {
- zk += X[i] + Y[j];
- if (zk >= RADIX)
- {
- Z[k--] = zk - RADIX;
- zk = ONE;
- }
- else
- {
- Z[k--] = zk;
- zk = ZERO;
- }
- }
-
- for (; i > 0; i--)
- {
- zk += X[i];
- if (zk >= RADIX)
- {
- Z[k--] = zk - RADIX;
- zk = ONE;
- }
- else
- {
- Z[k--] = zk;
- zk = ZERO;
- }
- }
-
- if (zk == ZERO)
- {
- for (i = 1; i <= p2; i++)
- Z[i] = Z[i + 1];
- }
- else
- {
- Z[1] = zk;
- EZ += ONE;
- }
-}
-
-/* Subtract the magnitudes of *X and *Y assuming that abs (*x) > abs (*y) > 0.
- The sign of the difference *Z is not changed. X and Y may overlap but not X
- and Z or Y and Z. One guard digit is used. The error is less than one
- ULP. */
-static void
-sub_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- long i, j, k;
- long p2 = p;
- double zk;
-
- EZ = EX;
- i = p2;
- j = p2 + EY - EX;
- k = p2;
-
- /* Y is too small compared to X, copy X over to the result. */
- if (__glibc_unlikely (j < 1))
- {
- __cpy (x, z, p);
- return;
- }
-
- /* The relevant least significant digit in Y is non-zero, so we factor it in
- to enhance accuracy. */
- if (j < p2 && Y[j + 1] > ZERO)
- {
- Z[k + 1] = RADIX - Y[j + 1];
- zk = MONE;
- }
- else
- zk = Z[k + 1] = ZERO;
-
- /* Subtract and borrow. */
- for (; j > 0; i--, j--)
- {
- zk += (X[i] - Y[j]);
- if (zk < ZERO)
- {
- Z[k--] = zk + RADIX;
- zk = MONE;
- }
- else
- {
- Z[k--] = zk;
- zk = ZERO;
- }
- }
-
- /* We're done with digits from Y, so it's just digits in X. */
- for (; i > 0; i--)
- {
- zk += X[i];
- if (zk < ZERO)
- {
- Z[k--] = zk + RADIX;
- zk = MONE;
- }
- else
- {
- Z[k--] = zk;
- zk = ZERO;
- }
- }
-
- /* Normalize. */
- for (i = 1; Z[i] == ZERO; i++);
- EZ = EZ - i + 1;
- for (k = 1; i <= p2 + 1;)
- Z[k++] = Z[i++];
- for (; k <= p2;)
- Z[k++] = ZERO;
-}
-
-/* Add *X and *Y and store the result in *Z. X and Y may overlap, but not X
- and Z or Y and Z. One guard digit is used. The error is less than one
- ULP. */
-void
-__add (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- int n;
-
- if (X[0] == ZERO)
- {
- __cpy (y, z, p);
- return;
- }
- else if (Y[0] == ZERO)
- {
- __cpy (x, z, p);
- return;
- }
-
- if (X[0] == Y[0])
- {
- if (__acr (x, y, p) > 0)
- {
- add_magnitudes (x, y, z, p);
- Z[0] = X[0];
- }
- else
- {
- add_magnitudes (y, x, z, p);
- Z[0] = Y[0];
- }
- }
- else
- {
- if ((n = __acr (x, y, p)) == 1)
- {
- sub_magnitudes (x, y, z, p);
- Z[0] = X[0];
- }
- else if (n == -1)
- {
- sub_magnitudes (y, x, z, p);
- Z[0] = Y[0];
- }
- else
- Z[0] = ZERO;
- }
-}
-
-/* Subtract *Y from *X and return the result in *Z. X and Y may overlap but
- not X and Z or Y and Z. One guard digit is used. The error is less than
- one ULP. */
-void
-__sub (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- int n;
-
- if (X[0] == ZERO)
- {
- __cpy (y, z, p);
- Z[0] = -Z[0];
- return;
- }
- else if (Y[0] == ZERO)
- {
- __cpy (x, z, p);
- return;
- }
-
- if (X[0] != Y[0])
- {
- if (__acr (x, y, p) > 0)
- {
- add_magnitudes (x, y, z, p);
- Z[0] = X[0];
- }
- else
- {
- add_magnitudes (y, x, z, p);
- Z[0] = -Y[0];
- }
- }
- else
- {
- if ((n = __acr (x, y, p)) == 1)
- {
- sub_magnitudes (x, y, z, p);
- Z[0] = X[0];
- }
- else if (n == -1)
- {
- sub_magnitudes (y, x, z, p);
- Z[0] = -Y[0];
- }
- else
- Z[0] = ZERO;
- }
-}
-
-/* Multiply *X and *Y and store result in *Z. X and Y may overlap but not X
- and Z or Y and Z. For P in [1, 2, 3], the exact result is truncated to P
- digits. In case P > 3 the error is bounded by 1.001 ULP. */
-void
-__mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- long i, i1, i2, j, k, k2;
- long p2 = p;
- double u, zk, zk2;
-
- /* Is z=0? */
- if (__glibc_unlikely (X[0] * Y[0] == ZERO))
- {
- Z[0] = ZERO;
- return;
- }
-
- /* Multiply, add and carry */
- k2 = (p2 < 3) ? p2 + p2 : p2 + 3;
- zk = Z[k2] = ZERO;
- for (k = k2; k > 1;)
- {
- if (k > p2)
- {
- i1 = k - p2;
- i2 = p2 + 1;
- }
- else
- {
- i1 = 1;
- i2 = k;
- }
-#if 1
- /* Rearrange this inner loop to allow the fmadd instructions to be
- independent and execute in parallel on processors that have
- dual symmetrical FP pipelines. */
- if (i1 < (i2 - 1))
- {
- /* Make sure we have at least 2 iterations. */
- if (((i2 - i1) & 1L) == 1L)
- {
- /* Handle the odd iterations case. */
- zk2 = x->d[i2 - 1] * y->d[i1];
- }
- else
- zk2 = 0.0;
- /* Do two multiply/adds per loop iteration, using independent
- accumulators; zk and zk2. */
- for (i = i1, j = i2 - 1; i < i2 - 1; i += 2, j -= 2)
- {
- zk += x->d[i] * y->d[j];
- zk2 += x->d[i + 1] * y->d[j - 1];
- }
- zk += zk2; /* Final sum. */
- }
- else
- {
- /* Special case when iterations is 1. */
- zk += x->d[i1] * y->d[i1];
- }
-#else
- /* The original code. */
- for (i = i1, j = i2 - 1; i < i2; i++, j--)
- zk += X[i] * Y[j];
-#endif
-
- u = (zk + CUTTER) - CUTTER;
- if (u > zk)
- u -= RADIX;
- Z[k] = zk - u;
- zk = u * RADIXI;
- --k;
- }
- Z[k] = zk;
-
- /* Is there a carry beyond the most significant digit? */
- if (Z[1] == ZERO)
- {
- for (i = 1; i <= p2; i++)
- Z[i] = Z[i + 1];
- EZ = EX + EY - 1;
- }
- else
- EZ = EX + EY;
-
- Z[0] = X[0] * Y[0];
-}
-
-/* Square *X and store result in *Y. X and Y may not overlap. For P in
- [1, 2, 3], the exact result is truncated to P digits. In case P > 3 the
- error is bounded by 1.001 ULP. This is a faster special case of
- multiplication. */
-void
-__sqr (const mp_no *x, mp_no *y, int p)
-{
- long i, j, k, ip;
- double u, yk;
-
- /* Is z=0? */
- if (__glibc_unlikely (X[0] == ZERO))
- {
- Y[0] = ZERO;
- return;
- }
-
- /* We need not iterate through all X's since it's pointless to
- multiply zeroes. */
- for (ip = p; ip > 0; ip--)
- if (X[ip] != ZERO)
- break;
-
- k = (__glibc_unlikely (p < 3)) ? p + p : p + 3;
-
- while (k > 2 * ip + 1)
- Y[k--] = ZERO;
-
- yk = ZERO;
-
- while (k > p)
- {
- double yk2 = 0.0;
- long lim = k / 2;
-
- if (k % 2 == 0)
- {
- yk += X[lim] * X[lim];
- lim--;
- }
-
- /* In __mul, this loop (and the one within the next while loop) run
- between a range to calculate the mantissa as follows:
-
- Z[k] = X[k] * Y[n] + X[k+1] * Y[n-1] ... + X[n-1] * Y[k+1]
- + X[n] * Y[k]
-
- For X == Y, we can get away with summing halfway and doubling the
- result. For cases where the range size is even, the mid-point needs
- to be added separately (above). */
- for (i = k - p, j = p; i <= lim; i++, j--)
- yk2 += X[i] * X[j];
-
- yk += 2.0 * yk2;
-
- u = (yk + CUTTER) - CUTTER;
- if (u > yk)
- u -= RADIX;
- Y[k--] = yk - u;
- yk = u * RADIXI;
- }
-
- while (k > 1)
- {
- double yk2 = 0.0;
- long lim = k / 2;
-
- if (k % 2 == 0)
- {
- yk += X[lim] * X[lim];
- lim--;
- }
-
- /* Likewise for this loop. */
- for (i = 1, j = k - 1; i <= lim; i++, j--)
- yk2 += X[i] * X[j];
-
- yk += 2.0 * yk2;
-
- u = (yk + CUTTER) - CUTTER;
- if (u > yk)
- u -= RADIX;
- Y[k--] = yk - u;
- yk = u * RADIXI;
- }
- Y[k] = yk;
-
- /* Squares are always positive. */
- Y[0] = 1.0;
-
- EY = 2 * EX;
- /* Is there a carry beyond the most significant digit? */
- if (__glibc_unlikely (Y[1] == ZERO))
- {
- for (i = 1; i <= p; i++)
- Y[i] = Y[i + 1];
- EY--;
- }
-}
-
-/* Invert *X and store in *Y. Relative error bound:
- - For P = 2: 1.001 * R ^ (1 - P)
- - For P = 3: 1.063 * R ^ (1 - P)
- - For P > 3: 2.001 * R ^ (1 - P)
-
- *X = 0 is not permissible. */
-static void
-__inv (const mp_no *x, mp_no *y, int p)
-{
- long i;
- double t;
- mp_no z, w;
- static const int np1[] =
- { 0, 0, 0, 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
- };
-
- __cpy (x, &z, p);
- z.e = 0;
- __mp_dbl (&z, &t, p);
- t = ONE / t;
- __dbl_mp (t, y, p);
- EY -= EX;
-
- for (i = 0; i < np1[p]; i++)
- {
- __cpy (y, &w, p);
- __mul (x, &w, y, p);
- __sub (&mptwo, y, &z, p);
- __mul (&w, &z, y, p);
- }
-}
-
-/* Divide *X by *Y and store result in *Z. X and Y may overlap but not X and Z
- or Y and Z. Relative error bound:
- - For P = 2: 2.001 * R ^ (1 - P)
- - For P = 3: 2.063 * R ^ (1 - P)
- - For P > 3: 3.001 * R ^ (1 - P)
-
- *X = 0 is not permissible. */
-void
-__dvd (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- mp_no w;
-
- if (X[0] == ZERO)
- Z[0] = ZERO;
- else
- {
- __inv (y, &w, p);
- __mul (x, &w, z, p);
- }
-}
diff --git a/libc/sysdeps/powerpc/powerpc32/power4/fpu/slowexp.c b/libc/sysdeps/powerpc/powerpc32/power4/fpu/slowexp.c
deleted file mode 100644
index d93f50544..000000000
--- a/libc/sysdeps/powerpc/powerpc32/power4/fpu/slowexp.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * IBM Accurate Mathematical Library
- * written by International Business Machines Corp.
- * Copyright (C) 2001-2013 Free Software Foundation, Inc.
- *
- * This program 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.
- *
- * This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
- */
-/**************************************************************************/
-/* MODULE_NAME:slowexp.c */
-/* */
-/* FUNCTION:slowexp */
-/* */
-/* FILES NEEDED:mpa.h */
-/* mpa.c mpexp.c */
-/* */
-/*Converting from double precision to Multi-precision and calculating */
-/* e^x */
-/**************************************************************************/
-#include <math_private.h>
-
-#ifdef NO_LONG_DOUBLE
-#include "mpa.h"
-void __mpexp(mp_no *x, mp_no *y, int p);
-#endif
-
-/*Converting from double precision to Multi-precision and calculating e^x */
-double __slowexp(double x) {
-#ifdef NO_LONG_DOUBLE
- double w,z,res,eps=3.0e-26;
- int p;
- mp_no mpx, mpy, mpz,mpw,mpeps,mpcor;
-
- p=6;
- __dbl_mp(x,&mpx,p); /* Convert a double precision number x */
- /* into a multiple precision number mpx with prec. p. */
- __mpexp(&mpx, &mpy, p); /* Multi-Precision exponential function */
- __dbl_mp(eps,&mpeps,p);
- __mul(&mpeps,&mpy,&mpcor,p);
- __add(&mpy,&mpcor,&mpw,p);
- __sub(&mpy,&mpcor,&mpz,p);
- __mp_dbl(&mpw, &w, p);
- __mp_dbl(&mpz, &z, p);
- if (w == z) return w;
- else { /* if calculating is not exactly */
- p = 32;
- __dbl_mp(x,&mpx,p);
- __mpexp(&mpx, &mpy, p);
- __mp_dbl(&mpy, &res, p);
- return res;
- }
-#else
- return (double) __ieee754_expl((long double)x);
-#endif
-}
diff --git a/libc/sysdeps/powerpc/powerpc32/power4/fpu/slowpow.c b/libc/sysdeps/powerpc/powerpc32/power4/fpu/slowpow.c
deleted file mode 100644
index 7c97d9581..000000000
--- a/libc/sysdeps/powerpc/powerpc32/power4/fpu/slowpow.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * IBM Accurate Mathematical Library
- * written by International Business Machines Corp.
- * Copyright (C) 2001-2013 Free Software Foundation, Inc.
- *
- * This program 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.
- *
- * This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
- */
-/*************************************************************************/
-/* MODULE_NAME:slowpow.c */
-/* */
-/* FUNCTION:slowpow */
-/* */
-/*FILES NEEDED:mpa.h */
-/* mpa.c mpexp.c mplog.c halfulp.c */
-/* */
-/* Given two IEEE double machine numbers y,x , routine computes the */
-/* correctly rounded (to nearest) value of x^y. Result calculated by */
-/* multiplication (in halfulp.c) or if result isn't accurate enough */
-/* then routine converts x and y into multi-precision doubles and */
-/* recompute. */
-/*************************************************************************/
-
-#include "mpa.h"
-#include <math_private.h>
-
-void __mpexp (mp_no * x, mp_no * y, int p);
-void __mplog (mp_no * x, mp_no * y, int p);
-double ulog (double);
-double __halfulp (double x, double y);
-
-double
-__slowpow (double x, double y, double z)
-{
- double res, res1;
- long double ldw, ldz, ldpp;
- static const long double ldeps = 0x4.0p-96;
-
- res = __halfulp (x, y); /* halfulp() returns -10 or x^y */
- if (res >= 0)
- return res; /* if result was really computed by halfulp */
- /* else, if result was not really computed by halfulp */
-
- /* Compute pow as long double, 106 bits */
- ldz = __ieee754_logl ((long double) x);
- ldw = (long double) y *ldz;
- ldpp = __ieee754_expl (ldw);
- res = (double) (ldpp + ldeps);
- res1 = (double) (ldpp - ldeps);
-
- if (res != res1) /* if result still not accurate enough */
- { /* use mpa for higher precision. */
- mp_no mpx, mpy, mpz, mpw, mpp, mpr, mpr1;
- static const mp_no eps = { -3, {1.0, 4.0} };
- int p;
-
- p = 10; /* p=precision 240 bits */
- __dbl_mp (x, &mpx, p);
- __dbl_mp (y, &mpy, p);
- __dbl_mp (z, &mpz, p);
- __mplog (&mpx, &mpz, p); /* log(x) = z */
- __mul (&mpy, &mpz, &mpw, p); /* y * z =w */
- __mpexp (&mpw, &mpp, p); /* e^w =pp */
- __add (&mpp, &eps, &mpr, p); /* pp+eps =r */
- __mp_dbl (&mpr, &res, p);
- __sub (&mpp, &eps, &mpr1, p); /* pp -eps =r1 */
- __mp_dbl (&mpr1, &res1, p); /* converting into double precision */
- if (res == res1)
- return res;
-
- /* if we get here result wasn't calculated exactly, continue for
- more exact calculation using 768 bits. */
- p = 32;
- __dbl_mp (x, &mpx, p);
- __dbl_mp (y, &mpy, p);
- __dbl_mp (z, &mpz, p);
- __mplog (&mpx, &mpz, p); /* log(c)=z */
- __mul (&mpy, &mpz, &mpw, p); /* y*z =w */
- __mpexp (&mpw, &mpp, p); /* e^w=pp */
- __mp_dbl (&mpp, &res, p); /* converting into double precision */
- }
- return res;
-}
diff --git a/libc/sysdeps/powerpc/powerpc32/power4/strncmp.S b/libc/sysdeps/powerpc/powerpc32/power4/strncmp.S
index b3a69975c..724d9084a 100644
--- a/libc/sysdeps/powerpc/powerpc32/power4/strncmp.S
+++ b/libc/sysdeps/powerpc/powerpc32/power4/strncmp.S
@@ -29,9 +29,6 @@ EALIGN (strncmp, 4, 0)
#define rSTR1 r3 /* first string arg */
#define rSTR2 r4 /* second string arg */
#define rN r5 /* max string length */
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers. */
#define rWORD1 r6 /* current word in s1 */
#define rWORD2 r7 /* current word in s2 */
#define rWORD3 r10
diff --git a/libc/sysdeps/powerpc/powerpc32/power7/strncmp.S b/libc/sysdeps/powerpc/powerpc32/power7/strncmp.S
index b58630e33..fdae44d26 100644
--- a/libc/sysdeps/powerpc/powerpc32/power7/strncmp.S
+++ b/libc/sysdeps/powerpc/powerpc32/power7/strncmp.S
@@ -31,9 +31,6 @@ EALIGN (strncmp,5,0)
#define rSTR1 r3 /* first string arg */
#define rSTR2 r4 /* second string arg */
#define rN r5 /* max string length */
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers. */
#define rWORD1 r6 /* current word in s1 */
#define rWORD2 r7 /* current word in s2 */
#define rWORD3 r10
diff --git a/libc/sysdeps/powerpc/powerpc32/strncmp.S b/libc/sysdeps/powerpc/powerpc32/strncmp.S
index 3cb6509e2..fa345d293 100644
--- a/libc/sysdeps/powerpc/powerpc32/strncmp.S
+++ b/libc/sysdeps/powerpc/powerpc32/strncmp.S
@@ -29,9 +29,6 @@ EALIGN (strncmp, 4, 0)
#define rSTR1 r3 /* first string arg */
#define rSTR2 r4 /* second string arg */
#define rN r5 /* max string length */
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers. */
#define rWORD1 r6 /* current word in s1 */
#define rWORD2 r7 /* current word in s2 */
#define rFEFE r8 /* constant 0xfefefeff (-0x01010101) */
diff --git a/libc/sysdeps/powerpc/powerpc64/__longjmp-common.S b/libc/sysdeps/powerpc/powerpc64/__longjmp-common.S
index 18032752b..70c370439 100644
--- a/libc/sysdeps/powerpc/powerpc64/__longjmp-common.S
+++ b/libc/sysdeps/powerpc/powerpc64/__longjmp-common.S
@@ -24,8 +24,6 @@
#else
# include <jmpbuf-offsets.h>
#endif
-#include <bp-sym.h>
-#include <bp-asm.h>
#ifndef __NO_VMX__
.section ".toc","aw"
@@ -45,9 +43,8 @@
#endif
.machine "altivec"
-ENTRY (BP_SYM (__longjmp))
+ENTRY (__longjmp)
CALL_MCOUNT 2
- CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
#ifndef __NO_VMX__
ld r5,.LC__dl_hwcap@toc(r2)
# ifdef SHARED
@@ -178,4 +175,4 @@ L(no_vmx):
lfd fp31,((JB_FPRS+17)*8)(r3)
mr r3,r4
blr
-END (BP_SYM (__longjmp))
+END (__longjmp)
diff --git a/libc/sysdeps/powerpc/powerpc64/a2/memcpy.S b/libc/sysdeps/powerpc/powerpc64/a2/memcpy.S
index 42ec5e375..84c82bb76 100644
--- a/libc/sysdeps/powerpc/powerpc64/a2/memcpy.S
+++ b/libc/sysdeps/powerpc/powerpc64/a2/memcpy.S
@@ -18,8 +18,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
#define PREFETCH_AHEAD 4 /* no cache lines SRC prefetching ahead */
#define ZERO_AHEAD 2 /* no cache lines DST zeroing ahead */
@@ -32,7 +30,7 @@
.machine a2
-EALIGN (BP_SYM (memcpy), 5, 0)
+EALIGN (memcpy, 5, 0)
CALL_MCOUNT 3
dcbt 0,r4 /* Prefetch ONE SRC cacheline */
@@ -522,5 +520,5 @@ L(endloop2_128):
b L(lessthancacheline)
-END_GEN_TB (BP_SYM (memcpy),TB_TOCLESS)
+END_GEN_TB (memcpy,TB_TOCLESS)
libc_hidden_builtin_def (memcpy)
diff --git a/libc/sysdeps/powerpc/powerpc64/bp-asm.h b/libc/sysdeps/powerpc/powerpc64/bp-asm.h
deleted file mode 100644
index 6c6c38735..000000000
--- a/libc/sysdeps/powerpc/powerpc64/bp-asm.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Bounded-pointer definitions for PowerPC64 assembler.
- Copyright (C) 2000-2013 Free Software Foundation, Inc.
- Contributed by Greg McGary <greg@mcgary.org>
-
- This file is part of the GNU C Library. Its master source is NOT part of
- the C library, however. The master source lives in the GNU MP Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public License as
- published by the Free Software Foundation; either version 2 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with the GNU C Library; see the file COPYING.LIB. If
- not, see <http://www.gnu.org/licenses/>. */
-
-#if __BOUNDED_POINTERS__
-
-/* Byte offsets of BP components. */
-# define oVALUE 0
-# define oLOW 4
-# define oHIGH 8
-
-/* Don't check bounds, just convert the BP register to its simple
- pointer value. */
-
-# define DISCARD_BOUNDS(rBP) \
- ld rBP, oVALUE(rBP)
-
-/* Check low bound, with the side effect that the BP register is converted
- its simple pointer value. Move the high bound into a register for
- later use. */
-
-# define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH) \
- ld rHIGH, oHIGH(rBP); \
- ld rLOW, oLOW(rBP); \
- ld rBP, oVALUE(rBP); \
- tdllt rBP, rLOW
-
-/* Check the high bound, which is in a register, using the given
- conditional trap instruction. */
-
-# define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc) \
- TWLcc rVALUE, rHIGH
-
-/* Check the high bound, which is stored at the return-value's high
- bound slot, using the given conditional trap instruction. */
-
-# define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc) \
- ld rHIGH, oHIGH(rRTN); \
- TWLcc rVALUE, rHIGH
-
-/* Check both bounds, with the side effect that the BP register is
- converted to its simple pointer value. */
-
-# define CHECK_BOUNDS_BOTH(rBP, rLOW, rHIGH) \
- CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH); \
- tdlge rBP, rHIGH
-
-/* Check bounds on a memory region of given length, with the side
- effect that the BP register is converted to its simple pointer
- value. */
-
-# define CHECK_BOUNDS_BOTH_WIDE(rBP, rLOW, rHIGH, rLENGTH) \
- CHECK_BOUNDS_LOW (rBP, rLOW, rHIGH); \
- sub rHIGH, rHIGH, rLENGTH; \
- tdlgt rBP, rHIGH
-
-# define CHECK_BOUNDS_BOTH_WIDE_LIT(rBP, rLOW, rHIGH, LENGTH) \
- CHECK_BOUNDS_LOW (rBP, rLOW, rHIGH); \
- subi rHIGH, rHIGH, LENGTH; \
- tdlgt rBP, rHIGH
-
-/* Store a pointer value register into the return-value's pointer
- value slot. */
-
-# define STORE_RETURN_VALUE(rVALUE) \
- std rVALUE, oVALUE(rRTN)
-
-/* Store a low and high bounds into the return-value's pointer bounds
- slots. */
-
-# define STORE_RETURN_BOUNDS(rLOW, rHIGH) \
- std rLOW, oLOW(rRTN); \
- std rHIGH, oHIGH(rRTN)
-
-/* Stuff zero value/low/high into the BP addressed by rRTN. */
-
-# define RETURN_NULL_BOUNDED_POINTER \
- li r4, 0; \
- STORE_RETURN_VALUE (r4); \
- STORE_RETURN_BOUNDS (r4, r4)
-
-#else
-
-# define DISCARD_BOUNDS(rBP)
-# define CHECK_BOUNDS_LOW(rBP, rLOW, rHIGH)
-# define CHECK_BOUNDS_HIGH(rVALUE, rHIGH, TWLcc)
-# define CHECK_BOUNDS_HIGH_RTN(rVALUE, rHIGH, TWLcc)
-# define CHECK_BOUNDS_BOTH(rBP, rLOW, rHIGH)
-# define CHECK_BOUNDS_BOTH_WIDE(rBP, rLOW, rHIGH, rLENGTH)
-# define CHECK_BOUNDS_BOTH_WIDE_LIT(rBP, rLOW, rHIGH, LENGTH)
-# define STORE_RETURN_VALUE(rVALUE)
-# define STORE_RETURN_BOUNDS(rLOW, rHIGH)
-
-# define RETURN_NULL_BOUNDED_POINTER li rRTN, 0
-
-#endif
diff --git a/libc/sysdeps/powerpc/powerpc64/cell/memcpy.S b/libc/sysdeps/powerpc/powerpc64/cell/memcpy.S
index 5ba4ebf62..a271965dd 100644
--- a/libc/sysdeps/powerpc/powerpc64/cell/memcpy.S
+++ b/libc/sysdeps/powerpc/powerpc64/cell/memcpy.S
@@ -17,8 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
#define PREFETCH_AHEAD 6 /* no cache lines SRC prefetching ahead */
#define ZERO_AHEAD 4 /* no cache lines DST zeroing ahead */
@@ -41,7 +39,7 @@
.align 7
-EALIGN (BP_SYM (memcpy), 5, 0)
+EALIGN (memcpy, 5, 0)
CALL_MCOUNT 3
dcbt 0,r4 /* Prefetch ONE SRC cacheline */
@@ -240,5 +238,5 @@ EALIGN (BP_SYM (memcpy), 5, 0)
stb r0,0(r6)
1: blr
-END_GEN_TB (BP_SYM (memcpy),TB_TOCLESS)
+END_GEN_TB (memcpy,TB_TOCLESS)
libc_hidden_builtin_def (memcpy)
diff --git a/libc/sysdeps/powerpc/powerpc64/memcpy.S b/libc/sysdeps/powerpc/powerpc64/memcpy.S
index 7c1b656be..b8c4cc8b1 100644
--- a/libc/sysdeps/powerpc/powerpc64/memcpy.S
+++ b/libc/sysdeps/powerpc/powerpc64/memcpy.S
@@ -17,8 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]);
Returns 'dst'.
@@ -35,7 +33,7 @@
possible when both source and destination are doubleword aligned.
Each case has a optimized unrolled loop. */
-EALIGN (BP_SYM (memcpy), 5, 0)
+EALIGN (memcpy, 5, 0)
CALL_MCOUNT 3
cmpldi cr1,5,31
@@ -364,5 +362,5 @@ EALIGN (BP_SYM (memcpy), 5, 0)
ld 31,-8(1)
ld 3,-16(1)
blr
-END_GEN_TB (BP_SYM (memcpy),TB_TOCLESS)
+END_GEN_TB (memcpy,TB_TOCLESS)
libc_hidden_builtin_def (memcpy)
diff --git a/libc/sysdeps/powerpc/powerpc64/memset.S b/libc/sysdeps/powerpc/powerpc64/memset.S
index f107f8b40..6acf149c8 100644
--- a/libc/sysdeps/powerpc/powerpc64/memset.S
+++ b/libc/sysdeps/powerpc/powerpc64/memset.S
@@ -17,8 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
.section ".toc","aw"
.LC0:
@@ -33,22 +31,15 @@
cache line (256 bits). There is a special case for setting cache lines
to 0, to take advantage of the dcbz instruction. */
-EALIGN (BP_SYM (memset), 5, 0)
+EALIGN (memset, 5, 0)
CALL_MCOUNT 3
#define rTMP r0
#define rRTN r3 /* Initial value of 1st argument. */
-#if __BOUNDED_POINTERS__
-# define rMEMP0 r4 /* Original value of 1st arg. */
-# define rCHR r5 /* Char to set in each byte. */
-# define rLEN r6 /* Length of region to set. */
-# define rMEMP r10 /* Address at which we are storing. */
-#else
-# define rMEMP0 r3 /* Original value of 1st arg. */
-# define rCHR r4 /* Char to set in each byte. */
-# define rLEN r5 /* Length of region to set. */
-# define rMEMP r6 /* Address at which we are storing. */
-#endif
+#define rMEMP0 r3 /* Original value of 1st arg. */
+#define rCHR r4 /* Char to set in each byte. */
+#define rLEN r5 /* Length of region to set. */
+#define rMEMP r6 /* Address at which we are storing. */
#define rALIGN r7 /* Number of bytes we are setting now (when aligning). */
#define rMEMP2 r8
@@ -56,14 +47,6 @@ EALIGN (BP_SYM (memset), 5, 0)
#define rCLS r8 /* Cache line size obtained from static. */
#define rCLM r9 /* Cache line size mask to check for cache alignment. */
L(_memset):
-#if __BOUNDED_POINTERS__
- cmpldi cr1, rRTN, 0
- CHECK_BOUNDS_BOTH_WIDE (rMEMP0, rTMP, rTMP2, rLEN)
- beq cr1, L(b0)
- STORE_RETURN_VALUE (rMEMP0)
- STORE_RETURN_BOUNDS (rTMP, rTMP2)
-L(b0):
-#endif
/* Take care of case for size <= 4. */
cmpldi cr1, rLEN, 8
andi. rALIGN, rMEMP0, 7
@@ -261,25 +244,16 @@ L(medium_27f):
L(medium_28t):
std rCHR, -8(rMEMP)
blr
-END_GEN_TB (BP_SYM (memset),TB_TOCLESS)
+END_GEN_TB (memset,TB_TOCLESS)
libc_hidden_builtin_def (memset)
/* Copied from bzero.S to prevent the linker from inserting a stub
between bzero and memset. */
-ENTRY (BP_SYM (__bzero))
+ENTRY (__bzero)
CALL_MCOUNT 3
-#if __BOUNDED_POINTERS__
- mr r6,r4
- li r5,0
- mr r4,r3
- /* Tell memset that we don't want a return value. */
- li r3,0
- b L(_memset)
-#else
mr r5,r4
li r4,0
b L(_memset)
-#endif
-END_GEN_TB (BP_SYM (__bzero),TB_TOCLESS)
+END_GEN_TB (__bzero,TB_TOCLESS)
-weak_alias (BP_SYM (__bzero), BP_SYM (bzero))
+weak_alias (__bzero, bzero)
diff --git a/libc/sysdeps/powerpc/powerpc64/power4/Implies b/libc/sysdeps/powerpc/powerpc64/power4/Implies
new file mode 100644
index 000000000..a372141bb
--- /dev/null
+++ b/libc/sysdeps/powerpc/powerpc64/power4/Implies
@@ -0,0 +1,2 @@
+powerpc/power4/fpu
+powerpc/power4
diff --git a/libc/sysdeps/powerpc/powerpc64/power4/fpu/Makefile b/libc/sysdeps/powerpc/powerpc64/power4/fpu/Makefile
deleted file mode 100644
index f8bb3ef04..000000000
--- a/libc/sysdeps/powerpc/powerpc64/power4/fpu/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-# Makefile fragment for POWER4/5/5+ platforms with FPU.
-
-ifeq ($(subdir),math)
-CFLAGS-mpa.c += --param max-unroll-times=4 -funroll-loops -fpeel-loops
-endif
diff --git a/libc/sysdeps/powerpc/powerpc64/power4/fpu/mpa.c b/libc/sysdeps/powerpc/powerpc64/power4/fpu/mpa.c
deleted file mode 100644
index b22664772..000000000
--- a/libc/sysdeps/powerpc/powerpc64/power4/fpu/mpa.c
+++ /dev/null
@@ -1,837 +0,0 @@
-
-/*
- * IBM Accurate Mathematical Library
- * written by International Business Machines Corp.
- * Copyright (C) 2001-2013 Free Software Foundation, Inc.
- *
- * This program 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.
- *
- * This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
- */
-/************************************************************************/
-/* MODULE_NAME: mpa.c */
-/* */
-/* FUNCTIONS: */
-/* mcr */
-/* acr */
-/* cpy */
-/* norm */
-/* denorm */
-/* mp_dbl */
-/* dbl_mp */
-/* add_magnitudes */
-/* sub_magnitudes */
-/* add */
-/* sub */
-/* mul */
-/* inv */
-/* dvd */
-/* */
-/* Arithmetic functions for multiple precision numbers. */
-/* Relative errors are bounded */
-/************************************************************************/
-
-
-#include "endian.h"
-#include "mpa.h"
-#include <sys/param.h>
-
-const mp_no mpone = {1, {1.0, 1.0}};
-const mp_no mptwo = {1, {1.0, 2.0}};
-
-/* Compare mantissa of two multiple precision numbers regardless of the sign
- and exponent of the numbers. */
-static int
-mcr (const mp_no *x, const mp_no *y, int p)
-{
- long i;
- long p2 = p;
- for (i = 1; i <= p2; i++)
- {
- if (X[i] == Y[i])
- continue;
- else if (X[i] > Y[i])
- return 1;
- else
- return -1;
- }
- return 0;
-}
-
-/* Compare the absolute values of two multiple precision numbers. */
-int
-__acr (const mp_no *x, const mp_no *y, int p)
-{
- long i;
-
- if (X[0] == ZERO)
- {
- if (Y[0] == ZERO)
- i = 0;
- else
- i = -1;
- }
- else if (Y[0] == ZERO)
- i = 1;
- else
- {
- if (EX > EY)
- i = 1;
- else if (EX < EY)
- i = -1;
- else
- i = mcr (x, y, p);
- }
-
- return i;
-}
-
-/* Copy multiple precision number X into Y. They could be the same
- number. */
-void
-__cpy (const mp_no *x, mp_no *y, int p)
-{
- long i;
-
- EY = EX;
- for (i = 0; i <= p; i++)
- Y[i] = X[i];
-}
-
-/* Convert a multiple precision number *X into a double precision
- number *Y, normalized case (|x| >= 2**(-1022))). */
-static void
-norm (const mp_no *x, double *y, int p)
-{
-#define R RADIXI
- long i;
- double a, c, u, v, z[5];
- if (p < 5)
- {
- if (p == 1)
- c = X[1];
- else if (p == 2)
- c = X[1] + R * X[2];
- else if (p == 3)
- c = X[1] + R * (X[2] + R * X[3]);
- else if (p == 4)
- c = (X[1] + R * X[2]) + R * R * (X[3] + R * X[4]);
- }
- else
- {
- for (a = ONE, z[1] = X[1]; z[1] < TWO23;)
- {
- a *= TWO;
- z[1] *= TWO;
- }
-
- for (i = 2; i < 5; i++)
- {
- z[i] = X[i] * a;
- u = (z[i] + CUTTER) - CUTTER;
- if (u > z[i])
- u -= RADIX;
- z[i] -= u;
- z[i - 1] += u * RADIXI;
- }
-
- u = (z[3] + TWO71) - TWO71;
- if (u > z[3])
- u -= TWO19;
- v = z[3] - u;
-
- if (v == TWO18)
- {
- if (z[4] == ZERO)
- {
- for (i = 5; i <= p; i++)
- {
- if (X[i] == ZERO)
- continue;
- else
- {
- z[3] += ONE;
- break;
- }
- }
- }
- else
- z[3] += ONE;
- }
-
- c = (z[1] + R * (z[2] + R * z[3])) / a;
- }
-
- c *= X[0];
-
- for (i = 1; i < EX; i++)
- c *= RADIX;
- for (i = 1; i > EX; i--)
- c *= RADIXI;
-
- *y = c;
-#undef R
-}
-
-/* Convert a multiple precision number *X into a double precision
- number *Y, Denormal case (|x| < 2**(-1022))). */
-static void
-denorm (const mp_no *x, double *y, int p)
-{
- long i, k;
- long p2 = p;
- double c, u, z[5];
-
-#define R RADIXI
- if (EX < -44 || (EX == -44 && X[1] < TWO5))
- {
- *y = ZERO;
- return;
- }
-
- if (p2 == 1)
- {
- if (EX == -42)
- {
- z[1] = X[1] + TWO10;
- z[2] = ZERO;
- z[3] = ZERO;
- k = 3;
- }
- else if (EX == -43)
- {
- z[1] = TWO10;
- z[2] = X[1];
- z[3] = ZERO;
- k = 2;
- }
- else
- {
- z[1] = TWO10;
- z[2] = ZERO;
- z[3] = X[1];
- k = 1;
- }
- }
- else if (p2 == 2)
- {
- if (EX == -42)
- {
- z[1] = X[1] + TWO10;
- z[2] = X[2];
- z[3] = ZERO;
- k = 3;
- }
- else if (EX == -43)
- {
- z[1] = TWO10;
- z[2] = X[1];
- z[3] = X[2];
- k = 2;
- }
- else
- {
- z[1] = TWO10;
- z[2] = ZERO;
- z[3] = X[1];
- k = 1;
- }
- }
- else
- {
- if (EX == -42)
- {
- z[1] = X[1] + TWO10;
- z[2] = X[2];
- k = 3;
- }
- else if (EX == -43)
- {
- z[1] = TWO10;
- z[2] = X[1];
- k = 2;
- }
- else
- {
- z[1] = TWO10;
- z[2] = ZERO;
- k = 1;
- }
- z[3] = X[k];
- }
-
- u = (z[3] + TWO57) - TWO57;
- if (u > z[3])
- u -= TWO5;
-
- if (u == z[3])
- {
- for (i = k + 1; i <= p2; i++)
- {
- if (X[i] == ZERO)
- continue;
- else
- {
- z[3] += ONE;
- break;
- }
- }
- }
-
- c = X[0] * ((z[1] + R * (z[2] + R * z[3])) - TWO10);
-
- *y = c * TWOM1032;
-#undef R
-}
-
-/* Convert multiple precision number *X into double precision number *Y. The
- result is correctly rounded to the nearest/even. */
-void
-__mp_dbl (const mp_no *x, double *y, int p)
-{
- if (X[0] == ZERO)
- {
- *y = ZERO;
- return;
- }
-
- if (__glibc_likely (EX > -42 || (EX == -42 && X[1] >= TWO10)))
- norm (x, y, p);
- else
- denorm (x, y, p);
-}
-
-/* Get the multiple precision equivalent of X into *Y. If the precision is too
- small, the result is truncated. */
-void
-__dbl_mp (double x, mp_no *y, int p)
-{
- long i, n;
- long p2 = p;
- double u;
-
- /* Sign. */
- if (x == ZERO)
- {
- Y[0] = ZERO;
- return;
- }
- else if (x > ZERO)
- Y[0] = ONE;
- else
- {
- Y[0] = MONE;
- x = -x;
- }
-
- /* Exponent. */
- for (EY = ONE; x >= RADIX; EY += ONE)
- x *= RADIXI;
- for (; x < ONE; EY -= ONE)
- x *= RADIX;
-
- /* Digits. */
- n = MIN (p2, 4);
- for (i = 1; i <= n; i++)
- {
- u = (x + TWO52) - TWO52;
- if (u > x)
- u -= ONE;
- Y[i] = u;
- x -= u;
- x *= RADIX;
- }
- for (; i <= p2; i++)
- Y[i] = ZERO;
-}
-
-/* Add magnitudes of *X and *Y assuming that abs (*X) >= abs (*Y) > 0. The
- sign of the sum *Z is not changed. X and Y may overlap but not X and Z or
- Y and Z. No guard digit is used. The result equals the exact sum,
- truncated. */
-static void
-add_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- long i, j, k;
- long p2 = p;
- double zk;
-
- EZ = EX;
-
- i = p2;
- j = p2 + EY - EX;
- k = p2 + 1;
-
- if (__glibc_unlikely (j < 1))
- {
- __cpy (x, z, p);
- return;
- }
-
- zk = ZERO;
-
- for (; j > 0; i--, j--)
- {
- zk += X[i] + Y[j];
- if (zk >= RADIX)
- {
- Z[k--] = zk - RADIX;
- zk = ONE;
- }
- else
- {
- Z[k--] = zk;
- zk = ZERO;
- }
- }
-
- for (; i > 0; i--)
- {
- zk += X[i];
- if (zk >= RADIX)
- {
- Z[k--] = zk - RADIX;
- zk = ONE;
- }
- else
- {
- Z[k--] = zk;
- zk = ZERO;
- }
- }
-
- if (zk == ZERO)
- {
- for (i = 1; i <= p2; i++)
- Z[i] = Z[i + 1];
- }
- else
- {
- Z[1] = zk;
- EZ += ONE;
- }
-}
-
-/* Subtract the magnitudes of *X and *Y assuming that abs (*x) > abs (*y) > 0.
- The sign of the difference *Z is not changed. X and Y may overlap but not X
- and Z or Y and Z. One guard digit is used. The error is less than one
- ULP. */
-static void
-sub_magnitudes (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- long i, j, k;
- long p2 = p;
- double zk;
-
- EZ = EX;
- i = p2;
- j = p2 + EY - EX;
- k = p2;
-
- /* Y is too small compared to X, copy X over to the result. */
- if (__glibc_unlikely (j < 1))
- {
- __cpy (x, z, p);
- return;
- }
-
- /* The relevant least significant digit in Y is non-zero, so we factor it in
- to enhance accuracy. */
- if (j < p2 && Y[j + 1] > ZERO)
- {
- Z[k + 1] = RADIX - Y[j + 1];
- zk = MONE;
- }
- else
- zk = Z[k + 1] = ZERO;
-
- /* Subtract and borrow. */
- for (; j > 0; i--, j--)
- {
- zk += (X[i] - Y[j]);
- if (zk < ZERO)
- {
- Z[k--] = zk + RADIX;
- zk = MONE;
- }
- else
- {
- Z[k--] = zk;
- zk = ZERO;
- }
- }
-
- /* We're done with digits from Y, so it's just digits in X. */
- for (; i > 0; i--)
- {
- zk += X[i];
- if (zk < ZERO)
- {
- Z[k--] = zk + RADIX;
- zk = MONE;
- }
- else
- {
- Z[k--] = zk;
- zk = ZERO;
- }
- }
-
- /* Normalize. */
- for (i = 1; Z[i] == ZERO; i++);
- EZ = EZ - i + 1;
- for (k = 1; i <= p2 + 1;)
- Z[k++] = Z[i++];
- for (; k <= p2;)
- Z[k++] = ZERO;
-}
-
-/* Add *X and *Y and store the result in *Z. X and Y may overlap, but not X
- and Z or Y and Z. One guard digit is used. The error is less than one
- ULP. */
-void
-__add (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- int n;
-
- if (X[0] == ZERO)
- {
- __cpy (y, z, p);
- return;
- }
- else if (Y[0] == ZERO)
- {
- __cpy (x, z, p);
- return;
- }
-
- if (X[0] == Y[0])
- {
- if (__acr (x, y, p) > 0)
- {
- add_magnitudes (x, y, z, p);
- Z[0] = X[0];
- }
- else
- {
- add_magnitudes (y, x, z, p);
- Z[0] = Y[0];
- }
- }
- else
- {
- if ((n = __acr (x, y, p)) == 1)
- {
- sub_magnitudes (x, y, z, p);
- Z[0] = X[0];
- }
- else if (n == -1)
- {
- sub_magnitudes (y, x, z, p);
- Z[0] = Y[0];
- }
- else
- Z[0] = ZERO;
- }
-}
-
-/* Subtract *Y from *X and return the result in *Z. X and Y may overlap but
- not X and Z or Y and Z. One guard digit is used. The error is less than
- one ULP. */
-void
-__sub (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- int n;
-
- if (X[0] == ZERO)
- {
- __cpy (y, z, p);
- Z[0] = -Z[0];
- return;
- }
- else if (Y[0] == ZERO)
- {
- __cpy (x, z, p);
- return;
- }
-
- if (X[0] != Y[0])
- {
- if (__acr (x, y, p) > 0)
- {
- add_magnitudes (x, y, z, p);
- Z[0] = X[0];
- }
- else
- {
- add_magnitudes (y, x, z, p);
- Z[0] = -Y[0];
- }
- }
- else
- {
- if ((n = __acr (x, y, p)) == 1)
- {
- sub_magnitudes (x, y, z, p);
- Z[0] = X[0];
- }
- else if (n == -1)
- {
- sub_magnitudes (y, x, z, p);
- Z[0] = -Y[0];
- }
- else
- Z[0] = ZERO;
- }
-}
-
-/* Multiply *X and *Y and store result in *Z. X and Y may overlap but not X
- and Z or Y and Z. For P in [1, 2, 3], the exact result is truncated to P
- digits. In case P > 3 the error is bounded by 1.001 ULP. */
-void
-__mul (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- long i, i1, i2, j, k, k2;
- long p2 = p;
- double u, zk, zk2;
-
- /* Is z=0? */
- if (__glibc_unlikely (X[0] * Y[0] == ZERO))
- {
- Z[0] = ZERO;
- return;
- }
-
- /* Multiply, add and carry */
- k2 = (p2 < 3) ? p2 + p2 : p2 + 3;
- zk = Z[k2] = ZERO;
- for (k = k2; k > 1;)
- {
- if (k > p2)
- {
- i1 = k - p2;
- i2 = p2 + 1;
- }
- else
- {
- i1 = 1;
- i2 = k;
- }
-#if 1
- /* Rearrange this inner loop to allow the fmadd instructions to be
- independent and execute in parallel on processors that have
- dual symmetrical FP pipelines. */
- if (i1 < (i2 - 1))
- {
- /* Make sure we have at least 2 iterations. */
- if (((i2 - i1) & 1L) == 1L)
- {
- /* Handle the odd iterations case. */
- zk2 = x->d[i2 - 1] * y->d[i1];
- }
- else
- zk2 = 0.0;
- /* Do two multiply/adds per loop iteration, using independent
- accumulators; zk and zk2. */
- for (i = i1, j = i2 - 1; i < i2 - 1; i += 2, j -= 2)
- {
- zk += x->d[i] * y->d[j];
- zk2 += x->d[i + 1] * y->d[j - 1];
- }
- zk += zk2; /* Final sum. */
- }
- else
- {
- /* Special case when iterations is 1. */
- zk += x->d[i1] * y->d[i1];
- }
-#else
- /* The original code. */
- for (i = i1, j = i2 - 1; i < i2; i++, j--)
- zk += X[i] * Y[j];
-#endif
-
- u = (zk + CUTTER) - CUTTER;
- if (u > zk)
- u -= RADIX;
- Z[k] = zk - u;
- zk = u * RADIXI;
- --k;
- }
- Z[k] = zk;
-
- /* Is there a carry beyond the most significant digit? */
- if (Z[1] == ZERO)
- {
- for (i = 1; i <= p2; i++)
- Z[i] = Z[i + 1];
- EZ = EX + EY - 1;
- }
- else
- EZ = EX + EY;
-
- Z[0] = X[0] * Y[0];
-}
-
-/* Square *X and store result in *Y. X and Y may not overlap. For P in
- [1, 2, 3], the exact result is truncated to P digits. In case P > 3 the
- error is bounded by 1.001 ULP. This is a faster special case of
- multiplication. */
-void
-__sqr (const mp_no *x, mp_no *y, int p)
-{
- long i, j, k, ip;
- double u, yk;
-
- /* Is z=0? */
- if (__glibc_unlikely (X[0] == ZERO))
- {
- Y[0] = ZERO;
- return;
- }
-
- /* We need not iterate through all X's since it's pointless to
- multiply zeroes. */
- for (ip = p; ip > 0; ip--)
- if (X[ip] != ZERO)
- break;
-
- k = (__glibc_unlikely (p < 3)) ? p + p : p + 3;
-
- while (k > 2 * ip + 1)
- Y[k--] = ZERO;
-
- yk = ZERO;
-
- while (k > p)
- {
- double yk2 = 0.0;
- long lim = k / 2;
-
- if (k % 2 == 0)
- {
- yk += X[lim] * X[lim];
- lim--;
- }
-
- /* In __mul, this loop (and the one within the next while loop) run
- between a range to calculate the mantissa as follows:
-
- Z[k] = X[k] * Y[n] + X[k+1] * Y[n-1] ... + X[n-1] * Y[k+1]
- + X[n] * Y[k]
-
- For X == Y, we can get away with summing halfway and doubling the
- result. For cases where the range size is even, the mid-point needs
- to be added separately (above). */
- for (i = k - p, j = p; i <= lim; i++, j--)
- yk2 += X[i] * X[j];
-
- yk += 2.0 * yk2;
-
- u = (yk + CUTTER) - CUTTER;
- if (u > yk)
- u -= RADIX;
- Y[k--] = yk - u;
- yk = u * RADIXI;
- }
-
- while (k > 1)
- {
- double yk2 = 0.0;
- long lim = k / 2;
-
- if (k % 2 == 0)
- {
- yk += X[lim] * X[lim];
- lim--;
- }
-
- /* Likewise for this loop. */
- for (i = 1, j = k - 1; i <= lim; i++, j--)
- yk2 += X[i] * X[j];
-
- yk += 2.0 * yk2;
-
- u = (yk + CUTTER) - CUTTER;
- if (u > yk)
- u -= RADIX;
- Y[k--] = yk - u;
- yk = u * RADIXI;
- }
- Y[k] = yk;
-
- /* Squares are always positive. */
- Y[0] = 1.0;
-
- EY = 2 * EX;
- /* Is there a carry beyond the most significant digit? */
- if (__glibc_unlikely (Y[1] == ZERO))
- {
- for (i = 1; i <= p; i++)
- Y[i] = Y[i + 1];
- EY--;
- }
-}
-
-/* Invert *X and store in *Y. Relative error bound:
- - For P = 2: 1.001 * R ^ (1 - P)
- - For P = 3: 1.063 * R ^ (1 - P)
- - For P > 3: 2.001 * R ^ (1 - P)
-
- *X = 0 is not permissible. */
-static void
-__inv (const mp_no *x, mp_no *y, int p)
-{
- long i;
- double t;
- mp_no z, w;
- static const int np1[] =
- { 0, 0, 0, 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
- };
-
- __cpy (x, &z, p);
- z.e = 0;
- __mp_dbl (&z, &t, p);
- t = ONE / t;
- __dbl_mp (t, y, p);
- EY -= EX;
-
- for (i = 0; i < np1[p]; i++)
- {
- __cpy (y, &w, p);
- __mul (x, &w, y, p);
- __sub (&mptwo, y, &z, p);
- __mul (&w, &z, y, p);
- }
-}
-
-/* Divide *X by *Y and store result in *Z. X and Y may overlap but not X and Z
- or Y and Z. Relative error bound:
- - For P = 2: 2.001 * R ^ (1 - P)
- - For P = 3: 2.063 * R ^ (1 - P)
- - For P > 3: 3.001 * R ^ (1 - P)
-
- *X = 0 is not permissible. */
-void
-__dvd (const mp_no *x, const mp_no *y, mp_no *z, int p)
-{
- mp_no w;
-
- if (X[0] == ZERO)
- Z[0] = ZERO;
- else
- {
- __inv (y, &w, p);
- __mul (x, &w, z, p);
- }
-}
diff --git a/libc/sysdeps/powerpc/powerpc64/power4/fpu/slowexp.c b/libc/sysdeps/powerpc/powerpc64/power4/fpu/slowexp.c
deleted file mode 100644
index d93f50544..000000000
--- a/libc/sysdeps/powerpc/powerpc64/power4/fpu/slowexp.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * IBM Accurate Mathematical Library
- * written by International Business Machines Corp.
- * Copyright (C) 2001-2013 Free Software Foundation, Inc.
- *
- * This program 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.
- *
- * This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
- */
-/**************************************************************************/
-/* MODULE_NAME:slowexp.c */
-/* */
-/* FUNCTION:slowexp */
-/* */
-/* FILES NEEDED:mpa.h */
-/* mpa.c mpexp.c */
-/* */
-/*Converting from double precision to Multi-precision and calculating */
-/* e^x */
-/**************************************************************************/
-#include <math_private.h>
-
-#ifdef NO_LONG_DOUBLE
-#include "mpa.h"
-void __mpexp(mp_no *x, mp_no *y, int p);
-#endif
-
-/*Converting from double precision to Multi-precision and calculating e^x */
-double __slowexp(double x) {
-#ifdef NO_LONG_DOUBLE
- double w,z,res,eps=3.0e-26;
- int p;
- mp_no mpx, mpy, mpz,mpw,mpeps,mpcor;
-
- p=6;
- __dbl_mp(x,&mpx,p); /* Convert a double precision number x */
- /* into a multiple precision number mpx with prec. p. */
- __mpexp(&mpx, &mpy, p); /* Multi-Precision exponential function */
- __dbl_mp(eps,&mpeps,p);
- __mul(&mpeps,&mpy,&mpcor,p);
- __add(&mpy,&mpcor,&mpw,p);
- __sub(&mpy,&mpcor,&mpz,p);
- __mp_dbl(&mpw, &w, p);
- __mp_dbl(&mpz, &z, p);
- if (w == z) return w;
- else { /* if calculating is not exactly */
- p = 32;
- __dbl_mp(x,&mpx,p);
- __mpexp(&mpx, &mpy, p);
- __mp_dbl(&mpy, &res, p);
- return res;
- }
-#else
- return (double) __ieee754_expl((long double)x);
-#endif
-}
diff --git a/libc/sysdeps/powerpc/powerpc64/power4/fpu/slowpow.c b/libc/sysdeps/powerpc/powerpc64/power4/fpu/slowpow.c
deleted file mode 100644
index 7c97d9581..000000000
--- a/libc/sysdeps/powerpc/powerpc64/power4/fpu/slowpow.c
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * IBM Accurate Mathematical Library
- * written by International Business Machines Corp.
- * Copyright (C) 2001-2013 Free Software Foundation, Inc.
- *
- * This program 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.
- *
- * This program 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 this program; if not, see <http://www.gnu.org/licenses/>.
- */
-/*************************************************************************/
-/* MODULE_NAME:slowpow.c */
-/* */
-/* FUNCTION:slowpow */
-/* */
-/*FILES NEEDED:mpa.h */
-/* mpa.c mpexp.c mplog.c halfulp.c */
-/* */
-/* Given two IEEE double machine numbers y,x , routine computes the */
-/* correctly rounded (to nearest) value of x^y. Result calculated by */
-/* multiplication (in halfulp.c) or if result isn't accurate enough */
-/* then routine converts x and y into multi-precision doubles and */
-/* recompute. */
-/*************************************************************************/
-
-#include "mpa.h"
-#include <math_private.h>
-
-void __mpexp (mp_no * x, mp_no * y, int p);
-void __mplog (mp_no * x, mp_no * y, int p);
-double ulog (double);
-double __halfulp (double x, double y);
-
-double
-__slowpow (double x, double y, double z)
-{
- double res, res1;
- long double ldw, ldz, ldpp;
- static const long double ldeps = 0x4.0p-96;
-
- res = __halfulp (x, y); /* halfulp() returns -10 or x^y */
- if (res >= 0)
- return res; /* if result was really computed by halfulp */
- /* else, if result was not really computed by halfulp */
-
- /* Compute pow as long double, 106 bits */
- ldz = __ieee754_logl ((long double) x);
- ldw = (long double) y *ldz;
- ldpp = __ieee754_expl (ldw);
- res = (double) (ldpp + ldeps);
- res1 = (double) (ldpp - ldeps);
-
- if (res != res1) /* if result still not accurate enough */
- { /* use mpa for higher precision. */
- mp_no mpx, mpy, mpz, mpw, mpp, mpr, mpr1;
- static const mp_no eps = { -3, {1.0, 4.0} };
- int p;
-
- p = 10; /* p=precision 240 bits */
- __dbl_mp (x, &mpx, p);
- __dbl_mp (y, &mpy, p);
- __dbl_mp (z, &mpz, p);
- __mplog (&mpx, &mpz, p); /* log(x) = z */
- __mul (&mpy, &mpz, &mpw, p); /* y * z =w */
- __mpexp (&mpw, &mpp, p); /* e^w =pp */
- __add (&mpp, &eps, &mpr, p); /* pp+eps =r */
- __mp_dbl (&mpr, &res, p);
- __sub (&mpp, &eps, &mpr1, p); /* pp -eps =r1 */
- __mp_dbl (&mpr1, &res1, p); /* converting into double precision */
- if (res == res1)
- return res;
-
- /* if we get here result wasn't calculated exactly, continue for
- more exact calculation using 768 bits. */
- p = 32;
- __dbl_mp (x, &mpx, p);
- __dbl_mp (y, &mpy, p);
- __dbl_mp (z, &mpz, p);
- __mplog (&mpx, &mpz, p); /* log(c)=z */
- __mul (&mpy, &mpz, &mpw, p); /* y*z =w */
- __mpexp (&mpw, &mpp, p); /* e^w=pp */
- __mp_dbl (&mpp, &res, p); /* converting into double precision */
- }
- return res;
-}
diff --git a/libc/sysdeps/powerpc/powerpc64/power4/memcmp.S b/libc/sysdeps/powerpc/powerpc64/power4/memcmp.S
index 7df52f810..6378ecb2d 100644
--- a/libc/sysdeps/powerpc/powerpc64/power4/memcmp.S
+++ b/libc/sysdeps/powerpc/powerpc64/power4/memcmp.S
@@ -17,13 +17,11 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* int [r3] memcmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */
.machine power4
-EALIGN (BP_SYM(memcmp), 4, 0)
+EALIGN (memcmp, 4, 0)
CALL_MCOUNT 3
#define rTMP r0
@@ -31,9 +29,6 @@ EALIGN (BP_SYM(memcmp), 4, 0)
#define rSTR1 r3 /* first string arg */
#define rSTR2 r4 /* second string arg */
#define rN r5 /* max string length */
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers. */
#define rWORD1 r6 /* current word in s1 */
#define rWORD2 r7 /* current word in s2 */
#define rWORD3 r8 /* next word in s1 */
@@ -976,6 +971,6 @@ L(duzeroLength):
li rRTN,0
blr
-END (BP_SYM (memcmp))
+END (memcmp)
libc_hidden_builtin_def (memcmp)
weak_alias (memcmp, bcmp)
diff --git a/libc/sysdeps/powerpc/powerpc64/power4/memcpy.S b/libc/sysdeps/powerpc/powerpc64/power4/memcpy.S
index 734434af0..c43d1d2e4 100644
--- a/libc/sysdeps/powerpc/powerpc64/power4/memcpy.S
+++ b/libc/sysdeps/powerpc/powerpc64/power4/memcpy.S
@@ -17,8 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]);
Returns 'dst'.
@@ -36,7 +34,7 @@
Each case has a optimized unrolled loop. */
.machine power4
-EALIGN (BP_SYM (memcpy), 5, 0)
+EALIGN (memcpy, 5, 0)
CALL_MCOUNT 3
cmpldi cr1,5,31
@@ -413,5 +411,5 @@ EALIGN (BP_SYM (memcpy), 5, 0)
ld 31,-8(1)
ld 3,-16(1)
blr
-END_GEN_TB (BP_SYM (memcpy),TB_TOCLESS)
+END_GEN_TB (memcpy,TB_TOCLESS)
libc_hidden_builtin_def (memcpy)
diff --git a/libc/sysdeps/powerpc/powerpc64/power4/memset.S b/libc/sysdeps/powerpc/powerpc64/power4/memset.S
index 198269272..dbecee8b9 100644
--- a/libc/sysdeps/powerpc/powerpc64/power4/memset.S
+++ b/libc/sysdeps/powerpc/powerpc64/power4/memset.S
@@ -17,8 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
Returns 's'.
@@ -28,22 +26,15 @@
to 0, to take advantage of the dcbz instruction. */
.machine power4
-EALIGN (BP_SYM (memset), 5, 0)
+EALIGN (memset, 5, 0)
CALL_MCOUNT 3
#define rTMP r0
#define rRTN r3 /* Initial value of 1st argument. */
-#if __BOUNDED_POINTERS__
-# define rMEMP0 r4 /* Original value of 1st arg. */
-# define rCHR r5 /* Char to set in each byte. */
-# define rLEN r6 /* Length of region to set. */
-# define rMEMP r10 /* Address at which we are storing. */
-#else
-# define rMEMP0 r3 /* Original value of 1st arg. */
-# define rCHR r4 /* Char to set in each byte. */
-# define rLEN r5 /* Length of region to set. */
-# define rMEMP r6 /* Address at which we are storing. */
-#endif
+#define rMEMP0 r3 /* Original value of 1st arg. */
+#define rCHR r4 /* Char to set in each byte. */
+#define rLEN r5 /* Length of region to set. */
+#define rMEMP r6 /* Address at which we are storing. */
#define rALIGN r7 /* Number of bytes we are setting now (when aligning). */
#define rMEMP2 r8
@@ -51,14 +42,6 @@ EALIGN (BP_SYM (memset), 5, 0)
#define rCLS r8 /* Cache line size obtained from static. */
#define rCLM r9 /* Cache line size mask to check for cache alignment. */
L(_memset):
-#if __BOUNDED_POINTERS__
- cmpldi cr1, rRTN, 0
- CHECK_BOUNDS_BOTH_WIDE (rMEMP0, rTMP, rTMP2, rLEN)
- beq cr1, L(b0)
- STORE_RETURN_VALUE (rMEMP0)
- STORE_RETURN_BOUNDS (rTMP, rTMP2)
-L(b0):
-#endif
/* Take care of case for size <= 4. */
cmpldi cr1, rLEN, 8
andi. rALIGN, rMEMP0, 7
@@ -249,25 +232,16 @@ L(medium_27f):
L(medium_28t):
std rCHR, -8(rMEMP)
blr
-END_GEN_TB (BP_SYM (memset),TB_TOCLESS)
+END_GEN_TB (memset,TB_TOCLESS)
libc_hidden_builtin_def (memset)
/* Copied from bzero.S to prevent the linker from inserting a stub
between bzero and memset. */
-ENTRY (BP_SYM (__bzero))
+ENTRY (__bzero)
CALL_MCOUNT 3
-#if __BOUNDED_POINTERS__
- mr r6,r4
- li r5,0
- mr r4,r3
- /* Tell memset that we don't want a return value. */
- li r3,0
- b L(_memset)
-#else
mr r5,r4
li r4,0
b L(_memset)
-#endif
-END_GEN_TB (BP_SYM (__bzero),TB_TOCLESS)
+END_GEN_TB (__bzero,TB_TOCLESS)
-weak_alias (BP_SYM (__bzero), BP_SYM (bzero))
+weak_alias (__bzero, bzero)
diff --git a/libc/sysdeps/powerpc/powerpc64/power4/strncmp.S b/libc/sysdeps/powerpc/powerpc64/power4/strncmp.S
index 19877fa78..1276e16a5 100644
--- a/libc/sysdeps/powerpc/powerpc64/power4/strncmp.S
+++ b/libc/sysdeps/powerpc/powerpc64/power4/strncmp.S
@@ -17,14 +17,12 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* See strlen.s for comments on how the end-of-string testing works. */
/* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */
-EALIGN (BP_SYM(strncmp), 4, 0)
+EALIGN (strncmp, 4, 0)
CALL_MCOUNT 3
#define rTMP r0
@@ -32,9 +30,6 @@ EALIGN (BP_SYM(strncmp), 4, 0)
#define rSTR1 r3 /* first string arg */
#define rSTR2 r4 /* second string arg */
#define rN r5 /* max string length */
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers. */
#define rWORD1 r6 /* current word in s1 */
#define rWORD2 r7 /* current word in s2 */
#define rWORD3 r10
@@ -175,5 +170,5 @@ L(u4): sub rRTN, rWORD1, rWORD2
L(ux):
li rRTN, 0
blr
-END (BP_SYM (strncmp))
+END (strncmp)
libc_hidden_builtin_def (strncmp)
diff --git a/libc/sysdeps/powerpc/powerpc64/power6/memcpy.S b/libc/sysdeps/powerpc/powerpc64/power6/memcpy.S
index 64f5b2f42..55c0d7118 100644
--- a/libc/sysdeps/powerpc/powerpc64/power6/memcpy.S
+++ b/libc/sysdeps/powerpc/powerpc64/power6/memcpy.S
@@ -17,8 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]);
Returns 'dst'.
@@ -43,7 +41,7 @@
for the destination. */
.machine "power6"
-EALIGN (BP_SYM (memcpy), 7, 0)
+EALIGN (memcpy, 7, 0)
CALL_MCOUNT 3
cmpldi cr1,5,31
@@ -1165,5 +1163,5 @@ L(du_done):
ld 31,-8(1)
ld 3,-16(1)
blr
-END_GEN_TB (BP_SYM (memcpy),TB_TOCLESS)
+END_GEN_TB (memcpy,TB_TOCLESS)
libc_hidden_builtin_def (memcpy)
diff --git a/libc/sysdeps/powerpc/powerpc64/power6/memset.S b/libc/sysdeps/powerpc/powerpc64/power6/memset.S
index a7913a10a..541a45fd3 100644
--- a/libc/sysdeps/powerpc/powerpc64/power6/memset.S
+++ b/libc/sysdeps/powerpc/powerpc64/power6/memset.S
@@ -17,8 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
Returns 's'.
@@ -28,34 +26,19 @@
to 0, to take advantage of the dcbz instruction. */
.machine power6
-EALIGN (BP_SYM (memset), 7, 0)
+EALIGN (memset, 7, 0)
CALL_MCOUNT 3
#define rTMP r0
#define rRTN r3 /* Initial value of 1st argument. */
-#if __BOUNDED_POINTERS__
-# define rMEMP0 r4 /* Original value of 1st arg. */
-# define rCHR r5 /* Char to set in each byte. */
-# define rLEN r6 /* Length of region to set. */
-# define rMEMP r10 /* Address at which we are storing. */
-#else
-# define rMEMP0 r3 /* Original value of 1st arg. */
-# define rCHR r4 /* Char to set in each byte. */
-# define rLEN r5 /* Length of region to set. */
-# define rMEMP r6 /* Address at which we are storing. */
-#endif
+#define rMEMP0 r3 /* Original value of 1st arg. */
+#define rCHR r4 /* Char to set in each byte. */
+#define rLEN r5 /* Length of region to set. */
+#define rMEMP r6 /* Address at which we are storing. */
#define rALIGN r7 /* Number of bytes we are setting now (when aligning). */
#define rMEMP2 r8
#define rMEMP3 r9 /* Alt mem pointer. */
L(_memset):
-#if __BOUNDED_POINTERS__
- cmpldi cr1, rRTN, 0
- CHECK_BOUNDS_BOTH_WIDE (rMEMP0, rTMP, rTMP2, rLEN)
- beq cr1, L(b0)
- STORE_RETURN_VALUE (rMEMP0)
- STORE_RETURN_BOUNDS (rTMP, rTMP2)
-L(b0):
-#endif
/* Take care of case for size <= 4. */
cmpldi cr1, rLEN, 8
andi. rALIGN, rMEMP0, 7
@@ -393,25 +376,16 @@ L(medium_27f):
L(medium_28t):
std rCHR, -8(rMEMP)
blr
-END_GEN_TB (BP_SYM (memset),TB_TOCLESS)
+END_GEN_TB (memset,TB_TOCLESS)
libc_hidden_builtin_def (memset)
/* Copied from bzero.S to prevent the linker from inserting a stub
between bzero and memset. */
-ENTRY (BP_SYM (__bzero))
+ENTRY (__bzero)
CALL_MCOUNT 3
-#if __BOUNDED_POINTERS__
- mr r6,r4
- li r5,0
- mr r4,r3
- /* Tell memset that we don't want a return value. */
- li r3,0
- b L(_memset)
-#else
mr r5,r4
li r4,0
b L(_memset)
-#endif
-END_GEN_TB (BP_SYM (__bzero),TB_TOCLESS)
+END_GEN_TB (__bzero,TB_TOCLESS)
-weak_alias (BP_SYM (__bzero), BP_SYM (bzero))
+weak_alias (__bzero, bzero)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/memchr.S b/libc/sysdeps/powerpc/powerpc64/power7/memchr.S
index 7b71a19e6..3416897f5 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/memchr.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/memchr.S
@@ -18,12 +18,10 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* int [r3] memchr (char *s [r3], int byte [r4], int size [r5]) */
.machine power7
-ENTRY (BP_SYM (__memchr))
+ENTRY (__memchr)
CALL_MCOUNT 2
dcbt 0,r3
clrrdi r8,r3,3
@@ -202,6 +200,6 @@ L(loop_small): /* loop_small has been unrolled. */
blr
-END (BP_SYM (__memchr))
-weak_alias (BP_SYM (__memchr), BP_SYM(memchr))
+END (__memchr)
+weak_alias (__memchr, memchr)
libc_hidden_builtin_def (memchr)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/memcmp.S b/libc/sysdeps/powerpc/powerpc64/power7/memcmp.S
index a7caa4894..f190c6461 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/memcmp.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/memcmp.S
@@ -17,15 +17,13 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* int [r3] memcmp (const char *s1 [r3],
const char *s2 [r4],
size_t size [r5]) */
.machine power7
-EALIGN (BP_SYM(memcmp),4,0)
+EALIGN (memcmp,4,0)
CALL_MCOUNT 3
#define rTMP r0
@@ -33,9 +31,6 @@ EALIGN (BP_SYM(memcmp),4,0)
#define rSTR1 r3 /* first string arg */
#define rSTR2 r4 /* second string arg */
#define rN r5 /* max string length */
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers. */
#define rWORD1 r6 /* current word in s1 */
#define rWORD2 r7 /* current word in s2 */
#define rWORD3 r8 /* next word in s1 */
@@ -978,6 +973,6 @@ L(duzeroLength):
li rRTN,0
blr
-END (BP_SYM (memcmp))
+END (memcmp)
libc_hidden_builtin_def (memcmp)
weak_alias (memcmp,bcmp)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/memcpy.S b/libc/sysdeps/powerpc/powerpc64/power7/memcpy.S
index aa0db8e15..800a9f1bb 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/memcpy.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/memcpy.S
@@ -18,15 +18,13 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* __ptr_t [r3] memcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]);
Returns 'dst'. */
.machine power7
-EALIGN (BP_SYM (memcpy), 5, 0)
+EALIGN (memcpy, 5, 0)
CALL_MCOUNT 3
cmpldi cr1,5,31
@@ -502,5 +500,5 @@ L(end_unaligned_loop):
ld 3,-16(1)
blr
-END_GEN_TB (BP_SYM (memcpy),TB_TOCLESS)
+END_GEN_TB (memcpy,TB_TOCLESS)
libc_hidden_builtin_def (memcpy)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/mempcpy.S b/libc/sysdeps/powerpc/powerpc64/power7/mempcpy.S
index 9993040ac..f20be938d 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/mempcpy.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/mempcpy.S
@@ -18,15 +18,13 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* __ptr_t [r3] __mempcpy (__ptr_t dst [r3], __ptr_t src [r4], size_t len [r5]);
Returns 'dst' + 'len'. */
.machine power7
-EALIGN (BP_SYM (__mempcpy), 5, 0)
+EALIGN (__mempcpy, 5, 0)
CALL_MCOUNT 3
cmpldi cr1,5,31
@@ -451,7 +449,7 @@ L(end_unaligned_loop):
add 3,3,5
blr
-END_GEN_TB (BP_SYM (__mempcpy),TB_TOCLESS)
-libc_hidden_def (BP_SYM (__mempcpy))
-weak_alias (BP_SYM (__mempcpy), BP_SYM (mempcpy))
+END_GEN_TB (__mempcpy,TB_TOCLESS)
+libc_hidden_def (__mempcpy)
+weak_alias (__mempcpy, mempcpy)
libc_hidden_builtin_def (mempcpy)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/memrchr.S b/libc/sysdeps/powerpc/powerpc64/power7/memrchr.S
index d3ffe4c08..d24fbbb1b 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/memrchr.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/memrchr.S
@@ -18,12 +18,10 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* int [r3] memrchr (char *s [r3], int byte [r4], int size [r5]) */
.machine power7
-ENTRY (BP_SYM (__memrchr))
+ENTRY (__memrchr)
CALL_MCOUNT
dcbt 0,r3
mr r7,r3
@@ -174,6 +172,6 @@ L(loop_small):
ble L(null)
b L(loop_small)
-END (BP_SYM (__memrchr))
-weak_alias (BP_SYM (__memrchr), BP_SYM(memrchr))
+END (__memrchr)
+weak_alias (__memrchr, memrchr)
libc_hidden_builtin_def (memrchr)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/memset.S b/libc/sysdeps/powerpc/powerpc64/power7/memset.S
index abb2d3528..b24cfa163 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/memset.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/memset.S
@@ -18,14 +18,12 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* __ptr_t [r3] memset (__ptr_t s [r3], int c [r4], size_t n [r5]));
Returns 's'. */
.machine power7
-EALIGN (BP_SYM (memset), 5, 0)
+EALIGN (memset, 5, 0)
CALL_MCOUNT 3
L(_memset):
@@ -382,16 +380,16 @@ L(small):
stw 4,4(10)
blr
-END_GEN_TB (BP_SYM (memset),TB_TOCLESS)
+END_GEN_TB (memset,TB_TOCLESS)
libc_hidden_builtin_def (memset)
/* Copied from bzero.S to prevent the linker from inserting a stub
between bzero and memset. */
-ENTRY (BP_SYM (__bzero))
+ENTRY (__bzero)
CALL_MCOUNT 3
mr r5,r4
li r4,0
b L(_memset)
-END_GEN_TB (BP_SYM (__bzero),TB_TOCLESS)
+END_GEN_TB (__bzero,TB_TOCLESS)
-weak_alias (BP_SYM (__bzero), BP_SYM (bzero))
+weak_alias (__bzero, bzero)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/rawmemchr.S b/libc/sysdeps/powerpc/powerpc64/power7/rawmemchr.S
index 5fc284de8..50a33d8fa 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/rawmemchr.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/rawmemchr.S
@@ -18,12 +18,10 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* int [r3] rawmemchr (void *s [r3], int c [r4]) */
.machine power7
-ENTRY (BP_SYM(__rawmemchr))
+ENTRY (__rawmemchr)
CALL_MCOUNT 2
dcbt 0,r3
clrrdi r8,r3,3 /* Align the address to doubleword boundary. */
@@ -97,6 +95,6 @@ L(done):
srdi r0,r0,3 /* Convert leading zeroes to bytes. */
add r3,r8,r0 /* Return address of the matching char. */
blr
-END (BP_SYM (__rawmemchr))
+END (__rawmemchr)
weak_alias (__rawmemchr,rawmemchr)
libc_hidden_builtin_def (__rawmemchr)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/strcasecmp.S b/libc/sysdeps/powerpc/powerpc64/power7/strcasecmp.S
index 6323154ea..9eee38469 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/strcasecmp.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/strcasecmp.S
@@ -17,8 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
#include <locale-defines.h>
/* int [r3] strcasecmp (const char *s1 [r3], const char *s2 [r4] )
@@ -33,7 +31,7 @@
# define STRCMP strcasecmp
#endif
-ENTRY (BP_SYM (__STRCMP))
+ENTRY (__STRCMP)
CALL_MCOUNT 2
#define rRTN r3 /* Return value */
@@ -118,7 +116,7 @@ L(done):
subf r0, rLWR2, rLWR1
extsw rRTN, r0
blr
-END (BP_SYM (__STRCMP))
+END (__STRCMP)
-weak_alias (BP_SYM (__STRCMP), BP_SYM (STRCMP))
+weak_alias (__STRCMP, STRCMP)
libc_hidden_builtin_def (__STRCMP)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/strchr.S b/libc/sysdeps/powerpc/powerpc64/power7/strchr.S
index 04b7d4f5e..3ffe7a188 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/strchr.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/strchr.S
@@ -18,12 +18,10 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* int [r3] strchr (char *s [r3], int c [r4]) */
.machine power7
-ENTRY (BP_SYM(strchr))
+ENTRY (strchr)
CALL_MCOUNT 2
dcbt 0,r3
clrrdi r8,r3,3 /* Align the address to doubleword boundary. */
@@ -198,6 +196,6 @@ L(done_null):
srdi r0,r0,3 /* Convert leading zeros to bytes. */
add r3,r8,r0 /* Return address of the matching null byte. */
blr
-END (BP_SYM (strchr))
-weak_alias (BP_SYM (strchr), BP_SYM (index))
+END (strchr)
+weak_alias (strchr, index)
libc_hidden_builtin_def (strchr)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/strchrnul.S b/libc/sysdeps/powerpc/powerpc64/power7/strchrnul.S
index 2b1e1c002..9dbc51b0d 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/strchrnul.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/strchrnul.S
@@ -18,12 +18,10 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* int [r3] strchrnul (char *s [r3], int c [r4]) */
.machine power7
-ENTRY (BP_SYM(__strchrnul))
+ENTRY (__strchrnul)
CALL_MCOUNT 2
dcbt 0,r3
clrrdi r8,r3,3 /* Align the address to doubleword boundary. */
@@ -112,6 +110,6 @@ L(done):
srdi r0,r0,3 /* Convert leading zeros to bytes. */
add r3,r8,r0 /* Return address of matching c/null byte. */
blr
-END (BP_SYM (__strchrnul))
+END (__strchrnul)
weak_alias (__strchrnul,strchrnul)
libc_hidden_builtin_def (__strchrnul)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/strlen.S b/libc/sysdeps/powerpc/powerpc64/power7/strlen.S
index a36aa7d97..343216952 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/strlen.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/strlen.S
@@ -18,12 +18,10 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* int [r3] strlen (char *s [r3]) */
.machine power7
-ENTRY (BP_SYM (strlen))
+ENTRY (strlen)
CALL_MCOUNT 1
dcbt 0,r3
clrrdi r4,r3,3 /* Align the address to doubleword boundary. */
@@ -94,5 +92,5 @@ L(done):
srdi r0,r0,3 /* Convert leading zeroes to bytes. */
add r3,r5,r0 /* Compute final length. */
blr
-END (BP_SYM (strlen))
+END (strlen)
libc_hidden_builtin_def (strlen)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/strncmp.S b/libc/sysdeps/powerpc/powerpc64/power7/strncmp.S
index 25a6baf47..77ecad5ab 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/strncmp.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/strncmp.S
@@ -17,8 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* See strlen.s for comments on how the end-of-string testing works. */
@@ -26,7 +24,7 @@
const char *s2 [r4],
size_t size [r5]) */
-EALIGN (BP_SYM(strncmp),5,0)
+EALIGN (strncmp,5,0)
CALL_MCOUNT 3
#define rTMP r0
@@ -34,9 +32,6 @@ EALIGN (BP_SYM(strncmp),5,0)
#define rSTR1 r3 /* first string arg */
#define rSTR2 r4 /* second string arg */
#define rN r5 /* max string length */
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers. */
#define rWORD1 r6 /* current word in s1 */
#define rWORD2 r7 /* current word in s2 */
#define rWORD3 r10
@@ -179,5 +174,5 @@ L(u4): sub rRTN,rWORD1,rWORD2
L(ux):
li rRTN,0
blr
-END (BP_SYM (strncmp))
+END (strncmp)
libc_hidden_builtin_def (strncmp)
diff --git a/libc/sysdeps/powerpc/powerpc64/power7/strnlen.S b/libc/sysdeps/powerpc/powerpc64/power7/strnlen.S
index 23e0a355c..37c7dbfe8 100644
--- a/libc/sysdeps/powerpc/powerpc64/power7/strnlen.S
+++ b/libc/sysdeps/powerpc/powerpc64/power7/strnlen.S
@@ -18,12 +18,10 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* int [r3] strnlen (char *s [r3], int size [r4]) */
.machine power7
-ENTRY (BP_SYM (__strnlen))
+ENTRY (__strnlen)
CALL_MCOUNT 2
dcbt 0,r3
clrrdi r8,r3,3
@@ -167,6 +165,6 @@ L(loop_small):
cmpld r9,r7
bge L(end_max)
b L(loop_small)
-END (BP_SYM (__strnlen))
-weak_alias (BP_SYM (__strnlen), BP_SYM(strnlen))
+END (__strnlen)
+weak_alias (__strnlen, strnlen)
libc_hidden_builtin_def (strnlen)
diff --git a/libc/sysdeps/powerpc/powerpc64/setjmp-common.S b/libc/sysdeps/powerpc/powerpc64/setjmp-common.S
index 8586c2d4e..58ec61062 100644
--- a/libc/sysdeps/powerpc/powerpc64/setjmp-common.S
+++ b/libc/sysdeps/powerpc/powerpc64/setjmp-common.S
@@ -23,8 +23,6 @@
#else
#include <jmpbuf-offsets.h>
#endif
-#include <bp-sym.h>
-#include <bp-asm.h>
#ifndef __NO_VMX__
.section ".toc","aw"
@@ -55,24 +53,23 @@ END (setjmp)
that saves r2 since the call won't go via a plt call stub. See
bugz #269. __GI__setjmp is used in csu/libc-start.c when
HAVE_CLEANUP_JMP_BUF is defined. */
-ENTRY (BP_SYM (__GI__setjmp))
+ENTRY (__GI__setjmp)
std r2,40(r1) /* Save the callers TOC in the save area. */
cfi_endproc
-END_2 (BP_SYM (__GI__setjmp))
+END_2 (__GI__setjmp)
/* Fall thru. */
#endif
-ENTRY (BP_SYM (_setjmp))
+ENTRY (_setjmp)
CALL_MCOUNT 1
li r4,0 /* Set second argument to 0. */
b JUMPTARGET (GLUE(__sigsetjmp,_ent))
-END (BP_SYM (_setjmp))
+END (_setjmp)
libc_hidden_def (_setjmp)
-ENTRY (BP_SYM (__sigsetjmp))
+ENTRY (__sigsetjmp)
CALL_MCOUNT 2
JUMPTARGET(GLUE(__sigsetjmp,_ent)):
- CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE)
#ifdef PTR_MANGLE
mr r5, r1
PTR_MANGLE (r5, r6)
@@ -219,18 +216,18 @@ L(no_vmx):
li r3,0
blr
#elif defined SHARED
- b JUMPTARGET (BP_SYM (__sigjmp_save))
+ b JUMPTARGET (__sigjmp_save)
#else
mflr r0
std r0,16(r1)
stdu r1,-112(r1)
cfi_adjust_cfa_offset(112)
cfi_offset(lr,16)
- bl JUMPTARGET (BP_SYM (__sigjmp_save))
+ bl JUMPTARGET (__sigjmp_save)
nop
ld r0,112+16(r1)
addi r1,r1,112
mtlr r0
blr
#endif
-END (BP_SYM (__sigsetjmp))
+END (__sigsetjmp)
diff --git a/libc/sysdeps/powerpc/powerpc64/start.S b/libc/sysdeps/powerpc/powerpc64/start.S
index 210779c84..ec0fd30e7 100644
--- a/libc/sysdeps/powerpc/powerpc64/start.S
+++ b/libc/sysdeps/powerpc/powerpc64/start.S
@@ -34,7 +34,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include "bp-sym.h"
/* These are the various addresses we require. */
#ifdef PIC
@@ -46,7 +45,7 @@
L(start_addresses):
.quad 0 /* was _SDA_BASE_ but not in 64-bit ABI*/
/* function descriptors so don't need JUMPTARGET */
- .quad BP_SYM(main)
+ .quad main
.quad __libc_csu_init
.quad __libc_csu_fini
@@ -71,7 +70,7 @@ ENTRY(_start)
ld r8,.L01(r2)
/* and continue in libc-start, in glibc. */
- b JUMPTARGET(BP_SYM(__libc_start_main))
+ b JUMPTARGET(__libc_start_main)
/* The linker needs this nop to recognize that it's OK to call via a
TOC adjusting stub. */
nop
diff --git a/libc/sysdeps/powerpc/powerpc64/stpcpy.S b/libc/sysdeps/powerpc/powerpc64/stpcpy.S
index d9cffe9ad..070cd4662 100644
--- a/libc/sysdeps/powerpc/powerpc64/stpcpy.S
+++ b/libc/sysdeps/powerpc/powerpc64/stpcpy.S
@@ -17,37 +17,24 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* See strlen.s for comments on how the end-of-string testing works. */
/* char * [r3] stpcpy (char *dest [r3], const char *src [r4]) */
-EALIGN (BP_SYM (__stpcpy), 4, 0)
+EALIGN (__stpcpy, 4, 0)
CALL_MCOUNT 2
#define rTMP r0
#define rRTN r3
-#if __BOUNDED_POINTERS__
-# define rDEST r4 /* pointer to previous word in dest */
-# define rSRC r5 /* pointer to previous word in src */
-# define rLOW r11
-# define rHIGH r12
-#else
-# define rDEST r3 /* pointer to previous word in dest */
-# define rSRC r4 /* pointer to previous word in src */
-#endif
+#define rDEST r3 /* pointer to previous word in dest */
+#define rSRC r4 /* pointer to previous word in src */
#define rWORD r6 /* current word from src */
#define rFEFE r7 /* 0xfefefeff */
#define r7F7F r8 /* 0x7f7f7f7f */
#define rNEG r9 /* ~(word in src | 0x7f7f7f7f) */
#define rALT r10 /* alternate word from src */
- CHECK_BOUNDS_LOW (rSRC, rLOW, rHIGH)
- CHECK_BOUNDS_LOW (rDEST, rLOW, rHIGH)
- STORE_RETURN_BOUNDS (rLOW, rHIGH)
-
or rTMP, rSRC, rDEST
clrldi. rTMP, rTMP, 62
addi rDEST, rDEST, -4
@@ -85,8 +72,6 @@ L(g1): rlwinm. rTMP, rALT, 8, 24, 31
stbu rTMP, 1(rDEST)
beqlr-
stbu rALT, 1(rDEST)
- CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
- STORE_RETURN_VALUE (rDEST)
blr
/* Oh well. In this case, we just do a byte-by-byte copy. */
@@ -108,15 +93,11 @@ L(u0): lbzu rALT, 1(rSRC)
cmpwi rWORD, 0
bne+ L(u0)
L(u2): stbu rWORD, 1(rDEST)
- CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
- STORE_RETURN_VALUE (rDEST)
blr
L(u1): stbu rALT, 1(rDEST)
- CHECK_BOUNDS_HIGH (rDEST, rHIGH, twlgt)
- STORE_RETURN_VALUE (rDEST)
blr
-END (BP_SYM (__stpcpy))
+END (__stpcpy)
-weak_alias (BP_SYM (__stpcpy), BP_SYM (stpcpy))
+weak_alias (__stpcpy, stpcpy)
libc_hidden_def (__stpcpy)
libc_hidden_builtin_def (stpcpy)
diff --git a/libc/sysdeps/powerpc/powerpc64/strchr.S b/libc/sysdeps/powerpc/powerpc64/strchr.S
index 3bd392949..d2d8cd361 100644
--- a/libc/sysdeps/powerpc/powerpc64/strchr.S
+++ b/libc/sysdeps/powerpc/powerpc64/strchr.S
@@ -17,32 +17,19 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* See strlen.s for comments on how this works. */
/* char * [r3] strchr (const char *s [r3] , int c [r4] ) */
-ENTRY (BP_SYM (strchr))
+ENTRY (strchr)
CALL_MCOUNT 2
#define rTMP1 r0
#define rRTN r3 /* outgoing result */
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Currently PPC gcc does not support -fbounds-check or -fbounded-pointers.
- These artifacts are left in the code as a reminder in case we need
- bounded pointer support in the future. */
-#if __BOUNDED_POINTERS__
-# define rSTR r4
-# define rCHR r5 /* byte we're looking for, spread over the whole word */
-# define rWORD r8 /* the current word */
-#else
-# define rSTR r8 /* current word pointer */
-# define rCHR r4 /* byte we're looking for, spread over the whole word */
-# define rWORD r5 /* the current word */
-#endif
+#define rSTR r8 /* current word pointer */
+#define rCHR r4 /* byte we're looking for, spread over the whole word */
+#define rWORD r5 /* the current word */
#define rCLZB rCHR /* leading zero byte count */
#define rFEFE r6 /* constant 0xfefefefefefefeff (-0x0101010101010101) */
#define r7F7F r7 /* constant 0x7f7f7f7f7f7f7f7f */
@@ -51,9 +38,6 @@ ENTRY (BP_SYM (strchr))
#define rMASK r11 /* mask with the bits to ignore set to 0 */
#define rTMP3 r12
- CHECK_BOUNDS_LOW (rSTR, rTMP1, rTMP2)
- STORE_RETURN_BOUNDS (rTMP1, rTMP2)
-
dcbt 0,rRTN
rlwimi rCHR, rCHR, 8, 16, 23
li rMASK, -1
@@ -101,7 +85,6 @@ L(loopentry):
L(missed):
and. rTMP1, rTMP1, rTMP2
li rRTN, 0
- STORE_RETURN_VALUE (rSTR)
beqlr
/* It did happen. Decide which one was first...
I'm not sure if this is actually faster than a sequence of
@@ -119,8 +102,6 @@ L(missed):
cntlzd rCLZB, rTMP2
srdi rCLZB, rCLZB, 3
add rRTN, rSTR, rCLZB
- CHECK_BOUNDS_HIGH_RTN (rSTR, rTMP2, tdlge)
- STORE_RETURN_VALUE (rSTR)
blr
L(foundit):
@@ -132,10 +113,8 @@ L(foundit):
subi rSTR, rSTR, 8
srdi rCLZB, rCLZB, 3
add rRTN, rSTR, rCLZB
- CHECK_BOUNDS_HIGH_RTN (rSTR, rTMP2, tdlge)
- STORE_RETURN_VALUE (rSTR)
blr
-END (BP_SYM (strchr))
+END (strchr)
-weak_alias (BP_SYM (strchr), BP_SYM (index))
+weak_alias (strchr, index)
libc_hidden_builtin_def (strchr)
diff --git a/libc/sysdeps/powerpc/powerpc64/strcmp.S b/libc/sysdeps/powerpc/powerpc64/strcmp.S
index 46600d5d0..c9d6dac12 100644
--- a/libc/sysdeps/powerpc/powerpc64/strcmp.S
+++ b/libc/sysdeps/powerpc/powerpc64/strcmp.S
@@ -17,29 +17,18 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* See strlen.s for comments on how the end-of-string testing works. */
/* int [r3] strcmp (const char *s1 [r3], const char *s2 [r4]) */
-EALIGN (BP_SYM(strcmp), 4, 0)
+EALIGN (strcmp, 4, 0)
CALL_MCOUNT 2
#define rTMP r0
#define rRTN r3
#define rSTR1 r3 /* first string arg */
#define rSTR2 r4 /* second string arg */
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers.
- These artifacts are left in the code as a reminder in case we need
- bounded pointer support in the future. */
-#if __BOUNDED_POINTERS__
-# define rHIGH1 r11
-# define rHIGH2 r12
-#endif
#define rWORD1 r5 /* current word in s1 */
#define rWORD2 r6 /* current word in s2 */
#define rFEFE r7 /* constant 0xfefefefefefefeff (-0x0101010101010101) */
@@ -47,9 +36,6 @@ EALIGN (BP_SYM(strcmp), 4, 0)
#define rNEG r9 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */
#define rBITDIF r10 /* bits that differ in s1 & s2 words */
- CHECK_BOUNDS_LOW (rSTR1, rTMP, rHIGH1)
- CHECK_BOUNDS_LOW (rSTR2, rTMP, rHIGH2)
-
dcbt 0,rSTR1
or rTMP, rSTR2, rSTR1
dcbt 0,rSTR2
@@ -98,7 +84,6 @@ L(endstring):
blr
L(equal):
li rRTN, 0
- /* GKM FIXME: check high bounds. */
blr
L(different):
@@ -113,7 +98,6 @@ L(highbit):
srdi rWORD2, rWORD2, 56
srdi rWORD1, rWORD1, 56
sub rRTN, rWORD1, rWORD2
- /* GKM FIXME: check high bounds. */
blr
@@ -137,11 +121,9 @@ L(u1): cmpwi cr1, rWORD1, 0
cmpd rWORD1, rWORD2
bne+ cr1, L(u0)
L(u3): sub rRTN, rWORD1, rWORD2
- /* GKM FIXME: check high bounds. */
blr
L(u4): lbz rWORD1, -1(rSTR1)
sub rRTN, rWORD1, rWORD2
- /* GKM FIXME: check high bounds. */
blr
-END (BP_SYM (strcmp))
+END (strcmp)
libc_hidden_builtin_def (strcmp)
diff --git a/libc/sysdeps/powerpc/powerpc64/strcpy.S b/libc/sysdeps/powerpc/powerpc64/strcpy.S
index 56845cf8f..4c6fd3f9d 100644
--- a/libc/sysdeps/powerpc/powerpc64/strcpy.S
+++ b/libc/sysdeps/powerpc/powerpc64/strcpy.S
@@ -17,50 +17,28 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* See strlen.s for comments on how the end-of-string testing works. */
/* char * [r3] strcpy (char *dest [r3], const char *src [r4]) */
-EALIGN (BP_SYM (strcpy), 4, 0)
+EALIGN (strcpy, 4, 0)
CALL_MCOUNT 2
#define rTMP r0
#define rRTN r3 /* incoming DEST arg preserved as result */
-/* Note. The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers.
- These artifacts are left in the code as a reminder in case we need
- bounded pointer support in the future. */
-#if __BOUNDED_POINTERS__
-# define rDEST r4 /* pointer to previous word in dest */
-# define rSRC r5 /* pointer to previous word in src */
-# define rLOW r11
-# define rHIGH r12
-#else
-# define rSRC r4 /* pointer to previous word in src */
-# define rDEST r5 /* pointer to previous word in dest */
-#endif
+#define rSRC r4 /* pointer to previous word in src */
+#define rDEST r5 /* pointer to previous word in dest */
#define rWORD r6 /* current word from src */
#define rFEFE r7 /* constant 0xfefefefefefefeff (-0x0101010101010101) */
#define r7F7F r8 /* constant 0x7f7f7f7f7f7f7f7f */
#define rNEG r9 /* ~(word in s1 | 0x7f7f7f7f7f7f7f7f) */
#define rALT r10 /* alternate word from src */
- CHECK_BOUNDS_LOW (rSRC, rLOW, rHIGH)
- CHECK_BOUNDS_LOW (rDEST, rLOW, rHIGH)
- STORE_RETURN_BOUNDS (rLOW, rHIGH)
-
dcbt 0,rSRC
or rTMP, rSRC, rRTN
clrldi. rTMP, rTMP, 61
-#if __BOUNDED_POINTERS__
- addi rDEST, rDEST, -8
-#else
addi rDEST, rRTN, -8
-#endif
dcbtst 0,rRTN
bne L(unaligned)
@@ -112,7 +90,6 @@ L(g1):
stb rTMP, 14(rDEST)
beqlr-
stb rALT, 15(rDEST)
- /* GKM FIXME: check high bound. */
blr
/* Oh well. In this case, we just do a byte-by-byte copy. */
@@ -134,11 +111,9 @@ L(u0): lbzu rALT, 1(rSRC)
cmpwi rWORD, 0
bne+ L(u0)
L(u2): stb rWORD, 1(rDEST)
- /* GKM FIXME: check high bound. */
blr
L(u1): stb rALT, 1(rDEST)
- /* GKM FIXME: check high bound. */
blr
-END (BP_SYM (strcpy))
+END (strcpy)
libc_hidden_builtin_def (strcpy)
diff --git a/libc/sysdeps/powerpc/powerpc64/strlen.S b/libc/sysdeps/powerpc/powerpc64/strlen.S
index 3ef4cc88e..dafd03387 100644
--- a/libc/sysdeps/powerpc/powerpc64/strlen.S
+++ b/libc/sysdeps/powerpc/powerpc64/strlen.S
@@ -17,8 +17,6 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* The algorithm here uses the following techniques:
@@ -77,7 +75,7 @@
/* int [r3] strlen (char *s [r3]) */
-ENTRY (BP_SYM (strlen))
+ENTRY (strlen)
CALL_MCOUNT 1
#define rTMP1 r0
@@ -94,13 +92,6 @@ ENTRY (BP_SYM (strlen))
#define rTMP3 r11
#define rTMP4 r12
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers.
- These artifacts are left in the code as a reminder in case we need
- bounded pointer support in the future. */
- CHECK_BOUNDS_LOW (rRTN, rTMP1, rTMP2)
-
dcbt 0,rRTN
clrrdi rSTR, rRTN, 3
lis r7F7F, 0x7f7f
@@ -168,7 +159,6 @@ L(done0):
subf rTMP1, rRTN, rSTR
srdi rTMP3, rTMP3, 3
add rRTN, rTMP1, rTMP3
- /* GKM FIXME: check high bound. */
blr
-END (BP_SYM (strlen))
+END (strlen)
libc_hidden_builtin_def (strlen)
diff --git a/libc/sysdeps/powerpc/powerpc64/strncmp.S b/libc/sysdeps/powerpc/powerpc64/strncmp.S
index 89a3246fd..e2726883f 100644
--- a/libc/sysdeps/powerpc/powerpc64/strncmp.S
+++ b/libc/sysdeps/powerpc/powerpc64/strncmp.S
@@ -17,14 +17,12 @@
<http://www.gnu.org/licenses/>. */
#include <sysdep.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
/* See strlen.s for comments on how the end-of-string testing works. */
/* int [r3] strncmp (const char *s1 [r3], const char *s2 [r4], size_t size [r5]) */
-EALIGN (BP_SYM(strncmp), 4, 0)
+EALIGN (strncmp, 4, 0)
CALL_MCOUNT 3
#define rTMP r0
@@ -32,9 +30,6 @@ EALIGN (BP_SYM(strncmp), 4, 0)
#define rSTR1 r3 /* first string arg */
#define rSTR2 r4 /* second string arg */
#define rN r5 /* max string length */
-/* Note: The Bounded pointer support in this code is broken. This code
- was inherited from PPC32 and that support was never completed.
- Current PPC gcc does not support -fbounds-check or -fbounded-pointers. */
#define rWORD1 r6 /* current word in s1 */
#define rWORD2 r7 /* current word in s2 */
#define rFEFE r8 /* constant 0xfefefefefefefeff (-0x0101010101010101) */
@@ -160,5 +155,5 @@ L(u1):
L(u2): lbzu rWORD1, -1(rSTR1)
L(u3): sub rRTN, rWORD1, rWORD2
blr
-END (BP_SYM (strncmp))
+END (strncmp)
libc_hidden_builtin_def (strncmp)
diff --git a/libc/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c b/libc/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c
index fcbd15e26..d57a907df 100644
--- a/libc/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c
+++ b/libc/sysdeps/s390/s390-32/multiarch/ifunc-resolve.c
@@ -34,9 +34,9 @@
\
/* Make the declarations of the optimized functions hidden in order
to prevent GOT slots being generated for them. */ \
- extern __attribute__((visibility("hidden"))) void *FUNC##_z196; \
- extern __attribute__((visibility("hidden"))) void *FUNC##_z10; \
- extern __attribute__((visibility("hidden"))) void *FUNC##_g5; \
+ extern void *FUNC##_z196 attribute_hidden; \
+ extern void *FUNC##_z10 attribute_hidden; \
+ extern void *FUNC##_g5 attribute_hidden; \
\
void *resolve_##FUNC (unsigned long int dl_hwcap) \
{ \
diff --git a/libc/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c b/libc/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c
index 256179b26..14d9c13eb 100644
--- a/libc/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c
+++ b/libc/sysdeps/s390/s390-64/multiarch/ifunc-resolve.c
@@ -34,9 +34,9 @@
\
/* Make the declarations of the optimized functions hidden in order
to prevent GOT slots being generated for them. */ \
- extern __attribute__((visibility("hidden"))) void *FUNC##_z196; \
- extern __attribute__((visibility("hidden"))) void *FUNC##_z10; \
- extern __attribute__((visibility("hidden"))) void *FUNC##_z900; \
+ extern void *FUNC##_z196 attribute_hidden; \
+ extern void *FUNC##_z10 attribute_hidden; \
+ extern void *FUNC##_z900 attribute_hidden; \
\
void *resolve_##FUNC (unsigned long int dl_hwcap) \
{ \
diff --git a/libc/sysdeps/sparc/fpu/libm-test-ulps b/libc/sysdeps/sparc/fpu/libm-test-ulps
index 6eee78843..bacac6e00 100644
--- a/libc/sysdeps/sparc/fpu/libm-test-ulps
+++ b/libc/sysdeps/sparc/fpu/libm-test-ulps
@@ -2637,6 +2637,9 @@ float: 2
ifloat: 2
ildouble: 1
ldouble: 1
+Test "j0 (0x1p16383) == 9.5859502826270374691362975419147645151233e-2467":
+ildouble: 2
+ldouble: 2
Test "j0 (10.0) == -0.245935764451348335197760862485328754":
double: 2
float: 1
@@ -2677,6 +2680,9 @@ double: 1
idouble: 1
ildouble: 1
ldouble: 1
+Test "j1 (0x1p16382) == 8.0839224448726336195866026476176740513439e-2467":
+ildouble: 1
+ldouble: 1
Test "j1 (1.0) == 0.440050585744933515959682203718914913":
ildouble: 1
ldouble: 1
@@ -3277,6 +3283,9 @@ double: 1
float: 1
idouble: 1
ifloat: 1
+Test "y0 (0x1p16382) == 8.0839224448726336195866026476176740513439e-2467":
+ildouble: 1
+ldouble: 1
Test "y0 (1.0) == 0.0882569642156769579829267660235151628":
double: 2
float: 1
@@ -3321,6 +3330,9 @@ ldouble: 1
Test "y1 (0x1p-30) == -6.8356527557643159612937462812258975438856e+08":
ildouble: 1
ldouble: 1
+Test "y1 (0x1p16383) == -9.5859502826270374691362975419147645151233e-2467":
+ildouble: 2
+ldouble: 2
Test "y1 (1.5) == -0.412308626973911295952829820633445323":
float: 1
ifloat: 1
@@ -4133,8 +4145,8 @@ double: 3
float: 2
idouble: 3
ifloat: 2
-ildouble: 1
-ldouble: 1
+ildouble: 2
+ldouble: 2
Function: "yn":
double: 3
diff --git a/libc/sysdeps/unix/sysv/linux/Makefile b/libc/sysdeps/unix/sysv/linux/Makefile
index ecd9c2c97..f82c94982 100644
--- a/libc/sysdeps/unix/sysv/linux/Makefile
+++ b/libc/sysdeps/unix/sysv/linux/Makefile
@@ -35,7 +35,8 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
bits/a.out.h sys/inotify.h sys/signalfd.h sys/eventfd.h \
sys/timerfd.h sys/fanotify.h bits/eventfd.h bits/inotify.h \
bits/signalfd.h bits/timerfd.h bits/epoll.h \
- bits/socket_type.h bits/syscall.h bits/sysctl.h
+ bits/socket_type.h bits/syscall.h bits/sysctl.h \
+ bits/mman-linux.h
tests += tst-clone
diff --git a/libc/sysdeps/unix/sysv/linux/bits/mman-linux.h b/libc/sysdeps/unix/sysv/linux/bits/mman-linux.h
new file mode 100644
index 000000000..05d2d9237
--- /dev/null
+++ b/libc/sysdeps/unix/sysv/linux/bits/mman-linux.h
@@ -0,0 +1,108 @@
+/* Definitions for POSIX memory map interface. Linux generic version.
+ Copyright (C) 2001-2013 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, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef _SYS_MMAN_H
+# error "Never use <bits/mman-linux.h> directly; include <sys/mman.h> instead."
+#endif
+
+/* The following definitions basically come from the kernel headers.
+ But the kernel header is not namespace clean. */
+
+
+/* Protections are chosen from these bits, OR'd together. The
+ implementation does not necessarily support PROT_EXEC or PROT_WRITE
+ without PROT_READ. The only guarantees are that no writing will be
+ allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
+
+#define PROT_READ 0x1 /* Page can be read. */
+#define PROT_WRITE 0x2 /* Page can be written. */
+#define PROT_EXEC 0x4 /* Page can be executed. */
+#define PROT_NONE 0x0 /* Page can not be accessed. */
+#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
+ growsdown vma (mprotect only). */
+#define PROT_GROWSUP 0x02000000 /* Extend change to start of
+ growsup vma (mprotect only). */
+
+/* Sharing types (must choose one and only one of these). */
+#define MAP_SHARED 0x01 /* Share changes. */
+#define MAP_PRIVATE 0x02 /* Changes are private. */
+#ifdef __USE_MISC
+# define MAP_TYPE 0x0f /* Mask for type of mapping. */
+#endif
+
+/* Other flags. */
+#define MAP_FIXED 0x10 /* Interpret addr exactly. */
+#ifdef __USE_MISC
+# define MAP_FILE 0
+# ifdef __MAP_ANONYMOUS
+# define MAP_ANONYMOUS __MAP_ANONYMOUS /* Don't use a file. */
+# else
+# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
+# endif
+# define MAP_ANON MAP_ANONYMOUS
+/* When MAP_HUGETLB is set bits [26:31] encode the log2 of the huge page size. */
+# define MAP_HUGE_SHIFT 26
+# define MAP_HUGE_MASK 0x3f
+#endif
+
+/* Flags to `msync'. */
+#define MS_ASYNC 1 /* Sync memory asynchronously. */
+#define MS_SYNC 4 /* Synchronous memory sync. */
+#define MS_INVALIDATE 2 /* Invalidate the caches. */
+
+/* Flags for `mremap'. */
+#ifdef __USE_GNU
+# define MREMAP_MAYMOVE 1
+# define MREMAP_FIXED 2
+#endif
+
+/* Advice to `madvise'. */
+#ifdef __USE_BSD
+# define MADV_NORMAL 0 /* No further special treatment. */
+# define MADV_RANDOM 1 /* Expect random page references. */
+# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define MADV_WILLNEED 3 /* Will need these pages. */
+# define MADV_DONTNEED 4 /* Don't need these pages. */
+# 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. */
+# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
+# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
+# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
+# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
+# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
+ overrides the coredump filter bits. */
+# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
+# define MADV_HWPOISON 100 /* Poison a page for testing. */
+#endif
+
+/* The POSIX people had to invent similar names for the same things. */
+#ifdef __USE_XOPEN2K
+# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
+# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
+# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
+# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
+#endif
+
+/* Flags for `mlockall'. */
+#ifndef MCL_CURRENT
+# define MCL_CURRENT 1 /* Lock all currently mapped pages. */
+# define MCL_FUTURE 2 /* Lock all additions to address
+ space. */
+#endif
diff --git a/libc/sysdeps/unix/sysv/linux/bits/msq.h b/libc/sysdeps/unix/sysv/linux/bits/msq.h
index bd005fb10..8f6eb8a7d 100644
--- a/libc/sysdeps/unix/sysv/linux/bits/msq.h
+++ b/libc/sysdeps/unix/sysv/linux/bits/msq.h
@@ -25,6 +25,7 @@
#define MSG_NOERROR 010000 /* no error if message is too big */
#ifdef __USE_GNU
# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+# define MSG_COPY 040000 /* copy (not remove) all queue messages */
#endif
/* Types used in the structure definition. */
diff --git a/libc/sysdeps/unix/sysv/linux/fpathconf.c b/libc/sysdeps/unix/sysv/linux/fpathconf.c
index c97164468..e8c4dc972 100644
--- a/libc/sysdeps/unix/sysv/linux/fpathconf.c
+++ b/libc/sysdeps/unix/sysv/linux/fpathconf.c
@@ -33,7 +33,6 @@ __fpathconf (fd, name)
int name;
{
struct statfs fsbuf;
- int r;
switch (name)
{
@@ -49,12 +48,6 @@ __fpathconf (fd, name)
case _PC_CHOWN_RESTRICTED:
return __statfs_chown_restricted (__fstatfs (fd, &fsbuf), &fsbuf);
- case _PC_PIPE_BUF:
- r = __fcntl (fd, F_GETPIPE_SZ);
- if (r > 0)
- return r;
- /* FALLTHROUGH */
-
default:
return posix_fpathconf (fd, name);
}
diff --git a/libc/sysdeps/unix/sysv/linux/internal_statvfs.c b/libc/sysdeps/unix/sysv/linux/internal_statvfs.c
index 4cd4f042c..45a66b83d 100644
--- a/libc/sysdeps/unix/sysv/linux/internal_statvfs.c
+++ b/libc/sysdeps/unix/sysv/linux/internal_statvfs.c
@@ -117,6 +117,12 @@ __statvfs_getflags (const char *name, int fstype, struct stat64 *st)
case LUSTRE_SUPER_MAGIC:
fsname = "lustre";
break;
+ case F2FS_SUPER_MAGIC:
+ fsname = "f2fs";
+ break;
+ case EFIVARFS_MAGIC:
+ fsname = "efivarfs";
+ break;
}
FILE *mtab = __setmntent ("/proc/mounts", "r");
diff --git a/libc/sysdeps/unix/sysv/linux/ldsodefs.h b/libc/sysdeps/unix/sysv/linux/ldsodefs.h
index 081fa01f8..18ff8528c 100644
--- a/libc/sysdeps/unix/sysv/linux/ldsodefs.h
+++ b/libc/sysdeps/unix/sysv/linux/ldsodefs.h
@@ -29,12 +29,6 @@
/* We have the auxiliary vector. */
#define HAVE_AUX_VECTOR
-/* Used by static binaries to check the auxiliary vector. */
-extern void _dl_aux_init (ElfW(auxv_t) *av) internal_function;
-
-/* Initialization which is normally done by the dynamic linker. */
-extern void _dl_non_dynamic_init (void) internal_function;
-
/* We can assume that the kernel always provides the AT_UID, AT_EUID,
AT_GID, and AT_EGID values in the auxiliary vector from 2.4.0 or so on. */
#define HAVE_AUX_XID
diff --git a/libc/sysdeps/unix/sysv/linux/linux_fsinfo.h b/libc/sysdeps/unix/sysv/linux/linux_fsinfo.h
index 1bcd9e2b2..2312b4702 100644
--- a/libc/sysdeps/unix/sysv/linux/linux_fsinfo.h
+++ b/libc/sysdeps/unix/sysv/linux/linux_fsinfo.h
@@ -61,9 +61,15 @@
#define EFS_SUPER_MAGIC 0x414a53
#define EFS_MAGIC 0x072959
+/* Constants that identifies the `evivar' filesystem. */
+#define EFIVARFS_MAGIC 0xde5e81e4
+
/* Constant that identifies the `ext2' and `ext3' filesystems. */
#define EXT2_SUPER_MAGIC 0xef53
+/* Constant that identifies the `f2fs' filesystem. */
+#define F2FS_SUPER_MAGIC 0xf2f52010
+
/* Constant that identifies the `hpfs' filesystem. */
#define HPFS_SUPER_MAGIC 0xf995e849
@@ -153,6 +159,7 @@
#define COH_LINK_MAX 10000
#define EXT2_LINK_MAX 32000
#define EXT4_LINK_MAX 65000
+#define F2FS_LINK_MAX 32000
#define LUSTRE_LINK_MAX EXT4_LINK_MAX
#define MINIX2_LINK_MAX 65530
#define MINIX_LINK_MAX 250
diff --git a/libc/sysdeps/unix/sysv/linux/pathconf.c b/libc/sysdeps/unix/sysv/linux/pathconf.c
index e86925f7d..de91a4541 100644
--- a/libc/sysdeps/unix/sysv/linux/pathconf.c
+++ b/libc/sysdeps/unix/sysv/linux/pathconf.c
@@ -39,8 +39,6 @@ long int
__pathconf (const char *file, int name)
{
struct statfs fsbuf;
- int fd;
- int flags;
switch (name)
{
@@ -56,21 +54,6 @@ __pathconf (const char *file, int name)
case _PC_CHOWN_RESTRICTED:
return __statfs_chown_restricted (__statfs (file, &fsbuf), &fsbuf);
- case _PC_PIPE_BUF:
- flags = O_RDONLY|O_NONBLOCK|O_NOCTTY;
-#ifdef O_CLOEXEC
- flags |= O_CLOEXEC;
-#endif
- fd = open_not_cancel_2 (file, flags);
- if (fd >= 0)
- {
- long int r = __fcntl (fd, F_GETPIPE_SZ);
- close_not_cancel_no_status (fd);
- if (r > 0)
- return r;
- }
- /* FALLTHROUGH */
-
default:
return posix_pathconf (file, name);
}
@@ -168,6 +151,9 @@ __statfs_link_max (int result, const struct statfs *fsbuf, const char *file,
the hard way. */
return distinguish_extX (fsbuf, file, fd);
+ case F2FS_SUPER_MAGIC:
+ return F2FS_LINK_MAX;
+
case MINIX_SUPER_MAGIC:
case MINIX_SUPER_MAGIC2:
return MINIX_LINK_MAX;
@@ -221,6 +207,9 @@ __statfs_filesize_max (int result, const struct statfs *fsbuf)
switch (fsbuf->f_type)
{
+ case F2FS_SUPER_MAGIC:
+ return 256;
+
case BTRFS_SUPER_MAGIC:
return 255;
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/Implies b/libc/sysdeps/unix/sysv/linux/powerpc/Implies
deleted file mode 100644
index ff27cdb56..000000000
--- a/libc/sysdeps/unix/sysv/linux/powerpc/Implies
+++ /dev/null
@@ -1,4 +0,0 @@
-# Make sure these routines come before ldbl-opt.
-ieee754/ldbl-128ibm
-# These supply the ABI compatibility for when long double was double.
-ieee754/ldbl-opt
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h b/libc/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h
index 545fda462..5f5fc1eb3 100644
--- a/libc/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h
+++ b/libc/sysdeps/unix/sysv/linux/powerpc/bits/libc-vdso.h
@@ -32,6 +32,16 @@ extern void *__vdso_get_tbfreq;
extern void *__vdso_getcpu;
+/* This macro is needed for PPC64 to return a skeleton OPD entry of a vDSO
+ symbol. This works because _dl_vdso_vsym always return the function
+ address, and no vDSO symbols use the TOC or chain pointers from the OPD
+ so we can allow them to be garbage. */
+#if defined(__PPC64__) || defined(__powerpc64__)
+#define VDSO_IFUNC_RET(value) &value
+#else
+#define VDSO_IFUNC_RET(value) value
+#endif
+
#endif
#endif /* _LIBC_VDSO_H */
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/bits/mman.h b/libc/sysdeps/unix/sysv/linux/powerpc/bits/mman.h
index a27018965..3f72c0335 100644
--- a/libc/sysdeps/unix/sysv/linux/powerpc/bits/mman.h
+++ b/libc/sysdeps/unix/sysv/linux/powerpc/bits/mman.h
@@ -17,42 +17,13 @@
<http://www.gnu.org/licenses/>. */
#ifndef _SYS_MMAN_H
-# error "Never use <bits/mman.h> directly; iclude <sys/mman.h> instead."
+# error "Never use <bits/mman.h> directly; include <sys/mman.h> instead."
#endif
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
-
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
#define PROT_SAO 0x10 /* Strong Access Ordering. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x001 /* Share changes. */
-#define MAP_PRIVATE 0x002 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x00f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x010 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0x000
-# define MAP_ANONYMOUS 0x020 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-#endif
/* These are Linux-specific. */
#ifdef __USE_MISC
@@ -67,48 +38,10 @@
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
/* Flags for `mlockall'. */
#define MCL_CURRENT 0x2000 /* Lock all currently mapped pages. */
#define MCL_FUTURE 0x4000 /* Lock all additions to address
space. */
-
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-# 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. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
-
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/bits/msq.h b/libc/sysdeps/unix/sysv/linux/powerpc/bits/msq.h
index b9811c656..59147c268 100644
--- a/libc/sysdeps/unix/sysv/linux/powerpc/bits/msq.h
+++ b/libc/sysdeps/unix/sysv/linux/powerpc/bits/msq.h
@@ -25,6 +25,7 @@
#define MSG_NOERROR 010000 /* no error if message is too big */
#ifdef __USE_GNU
# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+# define MSG_COPY 040000 /* copy (not remove) all queue messages */
#endif
/* Types used in the structure definition. */
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c b/libc/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
index f60748507..6506d75e6 100644
--- a/libc/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
+++ b/libc/sysdeps/unix/sysv/linux/powerpc/gettimeofday.c
@@ -15,25 +15,49 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <sysdep.h>
-#include <stddef.h>
+
#include <sys/time.h>
-#include <time.h>
-#include <hp-timing.h>
-#include <bits/libc-vdso.h>
+#ifdef SHARED
+
+# include <dl-vdso.h>
+# include <bits/libc-vdso.h>
+
+void *gettimeofday_ifunc (void) __asm__ ("__gettimeofday");
+
+static int
+__gettimeofday_syscall (struct timeval *tv, struct timezone *tz)
+{
+ return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
+}
+
+void *
+gettimeofday_ifunc (void)
+{
+ /* If the vDSO is not available we fall back syscall. */
+ return (__vdso_gettimeofday ? VDSO_IFUNC_RET (__vdso_gettimeofday)
+ : __gettimeofday_syscall);
+}
+asm (".type __gettimeofday, %gnu_indirect_function");
+
+/* This is doing "libc_hidden_def (__gettimeofday)" but the compiler won't
+ let us do it in C because it doesn't know we're defining __gettimeofday
+ here in this file. */
+asm (".globl __GI___gettimeofday\n"
+ "__GI___gettimeofday = __gettimeofday");
+
+#else
-/* Get the current time of day and timezone information,
- putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled.
- Returns 0 on success, -1 on errors. */
+# include <sysdep.h>
+# include <errno.h>
int
-__gettimeofday (tv, tz)
- struct timeval *tv;
- struct timezone *tz;
+__gettimeofday (struct timeval *tv, struct timezone *tz)
{
- return INLINE_VSYSCALL (gettimeofday, 2, tv, tz);
+ return INLINE_SYSCALL (gettimeofday, 2, tv, tz);
}
libc_hidden_def (__gettimeofday)
+
+#endif
weak_alias (__gettimeofday, gettimeofday)
libc_hidden_weak (gettimeofday)
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S
index 06596ce58..348aeb5ba 100644
--- a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S
+++ b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/brk.S
@@ -19,17 +19,14 @@
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
.comm __curbrk,8,8
.section ".toc","aw"
.LC__curbrk:
.tc __curbrk[TC],__curbrk
.section ".text"
-ENTRY (BP_SYM (__brk))
+ENTRY (__brk)
CALL_MCOUNT 1
- DISCARD_BOUNDS (r3) /* the bounds are meaningless, so toss 'em. */
std r3,48(r1)
DO_CALL(SYS_ify(brk))
@@ -41,6 +38,6 @@ ENTRY (BP_SYM (__brk))
blelr+
li r3,ENOMEM
TAIL_CALL_SYSCALL_ERROR
-END (BP_SYM (__brk))
+END (__brk)
-weak_alias (BP_SYM (__brk), BP_SYM (brk))
+weak_alias (__brk, brk)
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S
index f74dcae90..cf46856e1 100644
--- a/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S
+++ b/libc/sysdeps/unix/sysv/linux/powerpc/powerpc64/clone.S
@@ -19,8 +19,6 @@
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.h>
-#include <bp-sym.h>
-#include <bp-asm.h>
#define CLONE_VM 0x00000100
#define CLONE_THREAD 0x00010000
@@ -33,11 +31,8 @@
int flags [r5], void *arg [r6], void *parent_tid [r7],
void *tls [r8], void *child_tid [r9]); */
-ENTRY (BP_SYM (__clone))
+ENTRY (__clone)
CALL_MCOUNT 7
- /* GKM FIXME: add bounds checks, where sensible. */
- DISCARD_BOUNDS (r4)
- DISCARD_BOUNDS (r6)
/* Check for child_stack == NULL || fn == NULL. */
cmpdi cr0,r4,0
@@ -144,6 +139,6 @@ L(parent):
cfi_restore(r31)
PSEUDO_RET
-END (BP_SYM (__clone))
+END (__clone)
-weak_alias (BP_SYM (__clone), BP_SYM (clone))
+weak_alias (__clone, clone)
diff --git a/libc/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h b/libc/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h
index dfda1c889..e6e916b0f 100644
--- a/libc/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h
+++ b/libc/sysdeps/unix/sysv/linux/powerpc/sys/ptrace.h
@@ -136,7 +136,8 @@ enum __ptrace_setoptions
PTRACE_O_TRACEVFORKDONE = 0x00000020,
PTRACE_O_TRACEEXIT = 0x00000040,
PTRACE_O_TRACESECCOMP = 0x00000080,
- PTRACE_O_MASK = 0x000000ff
+ PTRACE_O_EXITKILL = 0x00100000,
+ PTRACE_O_MASK = 0x001000ff
};
/* Wait extended result codes for the above trace options. */
diff --git a/libc/sysdeps/unix/sysv/linux/s390/bits/mman.h b/libc/sysdeps/unix/sysv/linux/s390/bits/mman.h
index 3e7bf92f4..b788fa50d 100644
--- a/libc/sysdeps/unix/sysv/linux/s390/bits/mman.h
+++ b/libc/sysdeps/unix/sysv/linux/s390/bits/mman.h
@@ -24,39 +24,9 @@
But the kernel header is not namespace clean. */
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0
-# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-#endif
-
/* These are Linux-specific. */
#ifdef __USE_MISC
# define MAP_GROWSDOWN 0x00100 /* Stack-like segment. */
-# define MAP_GROWSUP 0x00200 /* Register stack-like segment */
# define MAP_DENYWRITE 0x00800 /* ETXTBSY */
# define MAP_EXECUTABLE 0x01000 /* Mark it as an executable. */
# define MAP_LOCKED 0x02000 /* Lock the mapping. */
@@ -67,47 +37,5 @@
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
-/* Flags for `mlockall'. */
-#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
-#define MCL_FUTURE 2 /* Lock all additions to address
- space. */
-
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-# 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. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
-
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/libc/sysdeps/unix/sysv/linux/s390/bits/msq.h b/libc/sysdeps/unix/sysv/linux/s390/bits/msq.h
index 5a1f6b29e..a5eaf89dd 100644
--- a/libc/sysdeps/unix/sysv/linux/s390/bits/msq.h
+++ b/libc/sysdeps/unix/sysv/linux/s390/bits/msq.h
@@ -26,6 +26,7 @@
#define MSG_NOERROR 010000 /* no error if message is too big */
#ifdef __USE_GNU
# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+# define MSG_COPY 040000 /* copy (not remove) all queue messages */
#endif
/* Types used in the structure definition. */
diff --git a/libc/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S b/libc/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S
index 1a3712d8c..0a2e63e78 100644
--- a/libc/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S
+++ b/libc/sysdeps/unix/sysv/linux/s390/s390-32/getcontext.S
@@ -31,41 +31,42 @@
other than the PRESERVED state. */
ENTRY(__getcontext)
- lr %r5,%r2
+ lr %r1,%r2
/* sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask). */
la %r2,SIG_BLOCK
slr %r3,%r3
- la %r4,SC_MASK(%r5)
+ la %r4,SC_MASK(%r1)
+ lhi %r5,_NSIG8
svc SYS_ify(rt_sigprocmask)
/* Store fpu context. */
- stfpc SC_FPC(%r5)
- std %f0,SC_FPRS(%r5)
- std %f1,SC_FPRS+8(%r5)
- std %f2,SC_FPRS+16(%r5)
- std %f3,SC_FPRS+24(%r5)
- std %f4,SC_FPRS+32(%r5)
- std %f5,SC_FPRS+40(%r5)
- std %f6,SC_FPRS+48(%r5)
- std %f7,SC_FPRS+56(%r5)
- std %f8,SC_FPRS+64(%r5)
- std %f9,SC_FPRS+72(%r5)
- std %f10,SC_FPRS+80(%r5)
- std %f11,SC_FPRS+88(%r5)
- std %f12,SC_FPRS+96(%r5)
- std %f13,SC_FPRS+104(%r5)
- std %f14,SC_FPRS+112(%r5)
- std %f15,SC_FPRS+120(%r5)
+ stfpc SC_FPC(%r1)
+ std %f0,SC_FPRS(%r1)
+ std %f1,SC_FPRS+8(%r1)
+ std %f2,SC_FPRS+16(%r1)
+ std %f3,SC_FPRS+24(%r1)
+ std %f4,SC_FPRS+32(%r1)
+ std %f5,SC_FPRS+40(%r1)
+ std %f6,SC_FPRS+48(%r1)
+ std %f7,SC_FPRS+56(%r1)
+ std %f8,SC_FPRS+64(%r1)
+ std %f9,SC_FPRS+72(%r1)
+ std %f10,SC_FPRS+80(%r1)
+ std %f11,SC_FPRS+88(%r1)
+ std %f12,SC_FPRS+96(%r1)
+ std %f13,SC_FPRS+104(%r1)
+ std %f14,SC_FPRS+112(%r1)
+ std %f15,SC_FPRS+120(%r1)
/* Set __getcontext return value to 0. */
slr %r2,%r2
/* Store access registers. */
- stam %a0,%a15,SC_ACRS(%r5)
+ stam %a0,%a15,SC_ACRS(%r1)
/* Store general purpose registers. */
- stm %r0,%r15,SC_GPRS(%r5)
+ stm %r0,%r15,SC_GPRS(%r1)
/* Return. */
br %r14
diff --git a/libc/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S b/libc/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S
index fe56c24aa..ac25bea50 100644
--- a/libc/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S
+++ b/libc/sysdeps/unix/sysv/linux/s390/s390-32/setcontext.S
@@ -31,38 +31,39 @@
other than the PRESERVED state. */
ENTRY(__setcontext)
- lr %r5,%r2
+ lr %r1,%r2
/* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */
la %r2,SIG_BLOCK
- la %r3,SC_MASK(%r5)
+ la %r3,SC_MASK(%r1)
slr %r4,%r4
+ lhi %r5,_NSIG8
svc SYS_ify(rt_sigprocmask)
/* Load fpu context. */
- lfpc SC_FPC(%r5)
- ld %f0,SC_FPRS(%r5)
- ld %f1,SC_FPRS+8(%r5)
- ld %f2,SC_FPRS+16(%r5)
- ld %f3,SC_FPRS+24(%r5)
- ld %f4,SC_FPRS+32(%r5)
- ld %f5,SC_FPRS+40(%r5)
- ld %f6,SC_FPRS+48(%r5)
- ld %f7,SC_FPRS+56(%r5)
- ld %f8,SC_FPRS+64(%r5)
- ld %f9,SC_FPRS+72(%r5)
- ld %f10,SC_FPRS+80(%r5)
- ld %f11,SC_FPRS+88(%r5)
- ld %f12,SC_FPRS+96(%r5)
- ld %f13,SC_FPRS+104(%r5)
- ld %f14,SC_FPRS+112(%r5)
- ld %f15,SC_FPRS+120(%r5)
+ lfpc SC_FPC(%r1)
+ ld %f0,SC_FPRS(%r1)
+ ld %f1,SC_FPRS+8(%r1)
+ ld %f2,SC_FPRS+16(%r1)
+ ld %f3,SC_FPRS+24(%r1)
+ ld %f4,SC_FPRS+32(%r1)
+ ld %f5,SC_FPRS+40(%r1)
+ ld %f6,SC_FPRS+48(%r1)
+ ld %f7,SC_FPRS+56(%r1)
+ ld %f8,SC_FPRS+64(%r1)
+ ld %f9,SC_FPRS+72(%r1)
+ ld %f10,SC_FPRS+80(%r1)
+ ld %f11,SC_FPRS+88(%r1)
+ ld %f12,SC_FPRS+96(%r1)
+ ld %f13,SC_FPRS+104(%r1)
+ ld %f14,SC_FPRS+112(%r1)
+ ld %f15,SC_FPRS+120(%r1)
/* Don't touch %a0, used for thread purposes. */
- lam %a1,%a15,SC_ACRS+4(%r5)
+ lam %a1,%a15,SC_ACRS+4(%r1)
/* Load general purpose registers. */
- lm %r0,%r15,SC_GPRS(%r5)
+ lm %r0,%r15,SC_GPRS(%r1)
/* Return. */
br %r14
diff --git a/libc/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S b/libc/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S
index 9a4b2b987..ecb0b3f80 100644
--- a/libc/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S
+++ b/libc/sysdeps/unix/sysv/linux/s390/s390-32/swapcontext.S
@@ -34,12 +34,13 @@
ENTRY(__swapcontext)
lr %r1,%r2
- lr %r5,%r3
+ lr %r0,%r3
/* sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask). */
la %r2,SIG_BLOCK
slr %r3,%r3
la %r4,SC_MASK(%r1)
+ lhi %r5,_NSIG8
svc SYS_ify(rt_sigprocmask)
/* Store fpu context. */
@@ -72,11 +73,14 @@ ENTRY(__swapcontext)
/* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */
la %r2,SIG_BLOCK
+ lr %r5,%r0
la %r3,SC_MASK(%r5)
slr %r4,%r4
+ lhi %r5,_NSIG8
svc SYS_ify(rt_sigprocmask)
/* Load fpu context. */
+ lr %r5,%r0
lfpc SC_FPC(%r5)
ld %f0,SC_FPRS(%r5)
ld %f1,SC_FPRS+8(%r5)
diff --git a/libc/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S b/libc/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S
index 68e89102a..7c406cb23 100644
--- a/libc/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S
+++ b/libc/sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S
@@ -31,41 +31,42 @@
other than the PRESERVED state. */
ENTRY(__getcontext)
- lgr %r5,%r2
+ lgr %r1,%r2
/* sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask). */
la %r2,SIG_BLOCK
slgr %r3,%r3
- la %r4,SC_MASK(%r5)
+ la %r4,SC_MASK(%r1)
+ lghi %r5,_NSIG8
svc SYS_ify(rt_sigprocmask)
/* Store fpu context. */
- stfpc SC_FPC(%r5)
- std %f0,SC_FPRS(%r5)
- std %f1,SC_FPRS+8(%r5)
- std %f2,SC_FPRS+16(%r5)
- std %f3,SC_FPRS+24(%r5)
- std %f4,SC_FPRS+32(%r5)
- std %f5,SC_FPRS+40(%r5)
- std %f6,SC_FPRS+48(%r5)
- std %f7,SC_FPRS+56(%r5)
- std %f8,SC_FPRS+64(%r5)
- std %f9,SC_FPRS+72(%r5)
- std %f10,SC_FPRS+80(%r5)
- std %f11,SC_FPRS+88(%r5)
- std %f12,SC_FPRS+96(%r5)
- std %f13,SC_FPRS+104(%r5)
- std %f14,SC_FPRS+112(%r5)
- std %f15,SC_FPRS+120(%r5)
+ stfpc SC_FPC(%r1)
+ std %f0,SC_FPRS(%r1)
+ std %f1,SC_FPRS+8(%r1)
+ std %f2,SC_FPRS+16(%r1)
+ std %f3,SC_FPRS+24(%r1)
+ std %f4,SC_FPRS+32(%r1)
+ std %f5,SC_FPRS+40(%r1)
+ std %f6,SC_FPRS+48(%r1)
+ std %f7,SC_FPRS+56(%r1)
+ std %f8,SC_FPRS+64(%r1)
+ std %f9,SC_FPRS+72(%r1)
+ std %f10,SC_FPRS+80(%r1)
+ std %f11,SC_FPRS+88(%r1)
+ std %f12,SC_FPRS+96(%r1)
+ std %f13,SC_FPRS+104(%r1)
+ std %f14,SC_FPRS+112(%r1)
+ std %f15,SC_FPRS+120(%r1)
/* Set __getcontext return value to 0. */
slgr %r2,%r2
/* Store access registers. */
- stam %a0,%a15,SC_ACRS(%r5)
+ stam %a0,%a15,SC_ACRS(%r1)
/* Store general purpose registers. */
- stmg %r0,%r15,SC_GPRS(%r5)
+ stmg %r0,%r15,SC_GPRS(%r1)
/* Return. */
br %r14
diff --git a/libc/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S b/libc/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S
index 7415bd938..8157327bf 100644
--- a/libc/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S
+++ b/libc/sysdeps/unix/sysv/linux/s390/s390-64/setcontext.S
@@ -31,38 +31,39 @@
other than the PRESERVED state. */
ENTRY(__setcontext)
- lgr %r5,%r2
+ lgr %r1,%r2
/* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */
la %r2,SIG_BLOCK
- la %r3,SC_MASK(%r5)
+ la %r3,SC_MASK(%r1)
slgr %r4,%r4
+ lghi %r5,_NSIG8
svc SYS_ify(rt_sigprocmask)
/* Load fpu context. */
- lfpc SC_FPC(%r5)
- ld %f0,SC_FPRS(%r5)
- ld %f1,SC_FPRS+8(%r5)
- ld %f2,SC_FPRS+16(%r5)
- ld %f3,SC_FPRS+24(%r5)
- ld %f4,SC_FPRS+32(%r5)
- ld %f5,SC_FPRS+40(%r5)
- ld %f6,SC_FPRS+48(%r5)
- ld %f7,SC_FPRS+56(%r5)
- ld %f8,SC_FPRS+64(%r5)
- ld %f9,SC_FPRS+72(%r5)
- ld %f10,SC_FPRS+80(%r5)
- ld %f11,SC_FPRS+88(%r5)
- ld %f12,SC_FPRS+96(%r5)
- ld %f13,SC_FPRS+104(%r5)
- ld %f14,SC_FPRS+112(%r5)
- ld %f15,SC_FPRS+120(%r5)
+ lfpc SC_FPC(%r1)
+ ld %f0,SC_FPRS(%r1)
+ ld %f1,SC_FPRS+8(%r1)
+ ld %f2,SC_FPRS+16(%r1)
+ ld %f3,SC_FPRS+24(%r1)
+ ld %f4,SC_FPRS+32(%r1)
+ ld %f5,SC_FPRS+40(%r1)
+ ld %f6,SC_FPRS+48(%r1)
+ ld %f7,SC_FPRS+56(%r1)
+ ld %f8,SC_FPRS+64(%r1)
+ ld %f9,SC_FPRS+72(%r1)
+ ld %f10,SC_FPRS+80(%r1)
+ ld %f11,SC_FPRS+88(%r1)
+ ld %f12,SC_FPRS+96(%r1)
+ ld %f13,SC_FPRS+104(%r1)
+ ld %f14,SC_FPRS+112(%r1)
+ ld %f15,SC_FPRS+120(%r1)
/* Don't touch %a0 and %a1, used for thread purposes. */
- lam %a2,%a15,SC_ACRS+8(%r5)
+ lam %a2,%a15,SC_ACRS+8(%r1)
/* Load general purpose registers. */
- lmg %r0,%r15,SC_GPRS(%r5)
+ lmg %r0,%r15,SC_GPRS(%r1)
/* Return. */
br %r14
diff --git a/libc/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S b/libc/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S
index 2d8f0d50e..a08e68cdd 100644
--- a/libc/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S
+++ b/libc/sysdeps/unix/sysv/linux/s390/s390-64/swapcontext.S
@@ -34,12 +34,13 @@
ENTRY(__swapcontext)
lgr %r1,%r2
- lgr %r5,%r3
+ lgr %r0,%r3
/* sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask). */
la %r2,SIG_BLOCK
slgr %r3,%r3
la %r4,SC_MASK(%r1)
+ lghi %r5,_NSIG8
svc SYS_ify(rt_sigprocmask)
/* Store fpu context. */
@@ -72,11 +73,14 @@ ENTRY(__swapcontext)
/* sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL). */
la %r2,SIG_BLOCK
+ lgr %r5,%r0
la %r3,SC_MASK(%r5)
+ lghi %r5,_NSIG8
slgr %r4,%r4
svc SYS_ify(rt_sigprocmask)
/* Load fpu context. */
+ lgr %r5,%r0
lfpc SC_FPC(%r5)
ld %f0,SC_FPRS(%r5)
ld %f1,SC_FPRS+8(%r5)
diff --git a/libc/sysdeps/unix/sysv/linux/s390/sys/ptrace.h b/libc/sysdeps/unix/sysv/linux/s390/sys/ptrace.h
index b9062dc1a..ca2ebb959 100644
--- a/libc/sysdeps/unix/sysv/linux/s390/sys/ptrace.h
+++ b/libc/sysdeps/unix/sysv/linux/s390/sys/ptrace.h
@@ -175,7 +175,8 @@ enum __ptrace_setoptions
PTRACE_O_TRACEVFORKDONE = 0x00000020,
PTRACE_O_TRACEEXIT = 0x00000040,
PTRACE_O_TRACESECCOMP = 0x00000080,
- PTRACE_O_MASK = 0x000000ff
+ PTRACE_O_EXITKILL = 0x00100000,
+ PTRACE_O_MASK = 0x001000ff
};
/* Wait extended result codes for the above trace options. */
diff --git a/libc/sysdeps/unix/sysv/linux/s390/ucontext_i.sym b/libc/sysdeps/unix/sysv/linux/s390/ucontext_i.sym
index 525b54300..6cc9f1962 100644
--- a/libc/sysdeps/unix/sysv/linux/s390/ucontext_i.sym
+++ b/libc/sysdeps/unix/sysv/linux/s390/ucontext_i.sym
@@ -8,6 +8,8 @@ SIG_BLOCK
SIG_UNBLOCK
SIG_SETMASK
+_NSIG8 (_NSIG / 8)
+
#define ucontext(member) offsetof (ucontext_t, member)
#define mcontext(member) ucontext (uc_mcontext.member)
diff --git a/libc/sysdeps/unix/sysv/linux/sh/bits/mman.h b/libc/sysdeps/unix/sysv/linux/sh/bits/mman.h
index 40da97e2f..396a9b918 100644
--- a/libc/sysdeps/unix/sysv/linux/sh/bits/mman.h
+++ b/libc/sysdeps/unix/sysv/linux/sh/bits/mman.h
@@ -23,36 +23,6 @@
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
-
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0
-# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-#endif
-
/* These are Linux-specific. */
#ifdef __USE_MISC
# define MAP_GROWSDOWN 0x0100 /* Stack-like segment. */
@@ -66,47 +36,5 @@
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
-/* Flags for `mlockall'. */
-#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
-#define MCL_FUTURE 2 /* Lock all additions to address
- space. */
-
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-# 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. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
-
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/libc/sysdeps/unix/sysv/linux/sparc/bits/mman.h b/libc/sysdeps/unix/sysv/linux/sparc/bits/mman.h
index 616e24333..ad0389ca3 100644
--- a/libc/sysdeps/unix/sysv/linux/sparc/bits/mman.h
+++ b/libc/sysdeps/unix/sysv/linux/sparc/bits/mman.h
@@ -24,36 +24,6 @@
But the kernel header is not namespace clean. */
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
-/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
-#ifdef __USE_MISC
-# define MAP_FILE 0x00
-# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
-# define MAP_RENAME MAP_ANONYMOUS
-#endif
-
/* These are Linux-specific. */
#ifdef __USE_MISC
# define MAP_GROWSDOWN 0x0200 /* Stack-like segment. */
@@ -68,48 +38,14 @@
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
/* Flags for `mlockall'. */
#define MCL_CURRENT 0x2000 /* Lock all currently mapped pages. */
#define MCL_FUTURE 0x4000 /* Lock all additions to address
space. */
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# 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 9 /* Remove these pages and resources. */
-# define MADV_DONTFORK 10 /* Do not inherit across fork. */
-# define MADV_DOFORK 11 /* Do inherit across fork. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
-
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
+/* Other flags. */
+#ifdef __USE_MISC
+# define MAP_RENAME MAP_ANONYMOUS
#endif
diff --git a/libc/sysdeps/unix/sysv/linux/sparc/bits/msq.h b/libc/sysdeps/unix/sysv/linux/sparc/bits/msq.h
index 84c4b858b..0a0192732 100644
--- a/libc/sysdeps/unix/sysv/linux/sparc/bits/msq.h
+++ b/libc/sysdeps/unix/sysv/linux/sparc/bits/msq.h
@@ -26,6 +26,7 @@
#define MSG_NOERROR 010000 /* no error if message is too big */
#ifdef __USE_GNU
# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+# define MSG_COPY 040000 /* copy (not remove) all queue messages */
#endif
/* Types used in the structure definition. */
diff --git a/libc/sysdeps/unix/sysv/linux/sparc/sys/ptrace.h b/libc/sysdeps/unix/sysv/linux/sparc/sys/ptrace.h
index bd6fd536d..7ba8f5f25 100644
--- a/libc/sysdeps/unix/sysv/linux/sparc/sys/ptrace.h
+++ b/libc/sysdeps/unix/sysv/linux/sparc/sys/ptrace.h
@@ -219,7 +219,8 @@ enum __ptrace_setoptions
PTRACE_O_TRACEVFORKDONE = 0x00000020,
PTRACE_O_TRACEEXIT = 0x00000040,
PTRACE_O_TRACESECCOMP = 0x00000080,
- PTRACE_O_MASK = 0x000000ff
+ PTRACE_O_EXITKILL = 0x00100000,
+ PTRACE_O_MASK = 0x001000ff
};
/* Wait extended result codes for the above trace options. */
diff --git a/libc/sysdeps/unix/sysv/linux/sys/ptrace.h b/libc/sysdeps/unix/sysv/linux/sys/ptrace.h
index d04fab599..08709bf64 100644
--- a/libc/sysdeps/unix/sysv/linux/sys/ptrace.h
+++ b/libc/sysdeps/unix/sysv/linux/sys/ptrace.h
@@ -166,7 +166,8 @@ enum __ptrace_setoptions
PTRACE_O_TRACEVFORKDONE = 0x00000020,
PTRACE_O_TRACEEXIT = 0x00000040,
PTRACE_O_TRACESECCOMP = 0x00000080,
- PTRACE_O_MASK = 0x000000ff
+ PTRACE_O_EXITKILL = 0x00100000,
+ PTRACE_O_MASK = 0x001000ff
};
/* Wait extended result codes for the above trace options. */
diff --git a/libc/sysdeps/unix/sysv/linux/times.c b/libc/sysdeps/unix/sysv/linux/times.c
index f3b5f014e..2a5caf2cd 100644
--- a/libc/sysdeps/unix/sysv/linux/times.c
+++ b/libc/sysdeps/unix/sysv/linux/times.c
@@ -26,13 +26,14 @@ __times (struct tms *buf)
INTERNAL_SYSCALL_DECL (err);
clock_t ret = INTERNAL_SYSCALL (times, err, 1, buf);
if (INTERNAL_SYSCALL_ERROR_P (ret, err)
- && __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0))
+ && __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0)
+ && buf)
{
/* This might be an error or not. For architectures which have
no separate return value and error indicators we cannot
distinguish a return value of -1 from an error. Do it the
- hard way. We crash applications which pass in an invalid BUF
- pointer. */
+ hard way. We crash applications which pass in an invalid
+ non-NULL BUF pointer. Linux allows BUF to be NULL. */
#define touch(v) \
do { \
clock_t temp = v; \
@@ -44,7 +45,8 @@ __times (struct tms *buf)
touch (buf->tms_cutime);
touch (buf->tms_cstime);
- /* If we come here the memory is valid and the kernel did not
+ /* If we come here the memory is valid (or BUF is NULL, which is
+ a valid condition for the kernel syscall) and the kernel did not
return an EFAULT error. Return the value given by the kernel. */
}
diff --git a/libc/sysdeps/unix/sysv/linux/x86/bits/mman.h b/libc/sysdeps/unix/sysv/linux/x86/bits/mman.h
index 591df139d..a2fa80879 100644
--- a/libc/sysdeps/unix/sysv/linux/x86/bits/mman.h
+++ b/libc/sysdeps/unix/sysv/linux/x86/bits/mman.h
@@ -23,34 +23,8 @@
/* The following definitions basically come from the kernel headers.
But the kernel header is not namespace clean. */
-
-/* Protections are chosen from these bits, OR'd together. The
- implementation does not necessarily support PROT_EXEC or PROT_WRITE
- without PROT_READ. The only guarantees are that no writing will be
- allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
-
-#define PROT_READ 0x1 /* Page can be read. */
-#define PROT_WRITE 0x2 /* Page can be written. */
-#define PROT_EXEC 0x4 /* Page can be executed. */
-#define PROT_NONE 0x0 /* Page can not be accessed. */
-#define PROT_GROWSDOWN 0x01000000 /* Extend change to start of
- growsdown vma (mprotect only). */
-#define PROT_GROWSUP 0x02000000 /* Extend change to start of
- growsup vma (mprotect only). */
-
-/* Sharing types (must choose one and only one of these). */
-#define MAP_SHARED 0x01 /* Share changes. */
-#define MAP_PRIVATE 0x02 /* Changes are private. */
-#ifdef __USE_MISC
-# define MAP_TYPE 0x0f /* Mask for type of mapping. */
-#endif
-
/* Other flags. */
-#define MAP_FIXED 0x10 /* Interpret addr exactly. */
#ifdef __USE_MISC
-# define MAP_FILE 0
-# define MAP_ANONYMOUS 0x20 /* Don't use a file. */
-# define MAP_ANON MAP_ANONYMOUS
# define MAP_32BIT 0x40 /* Only give out 32-bit addresses. */
#endif
@@ -67,47 +41,5 @@
# define MAP_HUGETLB 0x40000 /* Create huge page mapping. */
#endif
-/* Flags to `msync'. */
-#define MS_ASYNC 1 /* Sync memory asynchronously. */
-#define MS_SYNC 4 /* Synchronous memory sync. */
-#define MS_INVALIDATE 2 /* Invalidate the caches. */
-
-/* Flags for `mlockall'. */
-#define MCL_CURRENT 1 /* Lock all currently mapped pages. */
-#define MCL_FUTURE 2 /* Lock all additions to address
- space. */
-
-/* Flags for `mremap'. */
-#ifdef __USE_GNU
-# define MREMAP_MAYMOVE 1
-# define MREMAP_FIXED 2
-#endif
-
-/* Advice to `madvise'. */
-#ifdef __USE_BSD
-# define MADV_NORMAL 0 /* No further special treatment. */
-# define MADV_RANDOM 1 /* Expect random page references. */
-# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define MADV_WILLNEED 3 /* Will need these pages. */
-# define MADV_DONTNEED 4 /* Don't need these pages. */
-# 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. */
-# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
-# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
-# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
-# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
-# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
- overrides the coredump filter bits. */
-# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
-# define MADV_HWPOISON 100 /* Poison a page for testing. */
-#endif
-
-/* The POSIX people had to invent similar names for the same things. */
-#ifdef __USE_XOPEN2K
-# define POSIX_MADV_NORMAL 0 /* No further special treatment. */
-# define POSIX_MADV_RANDOM 1 /* Expect random page references. */
-# define POSIX_MADV_SEQUENTIAL 2 /* Expect sequential page references. */
-# define POSIX_MADV_WILLNEED 3 /* Will need these pages. */
-# define POSIX_MADV_DONTNEED 4 /* Don't need these pages. */
-#endif
+/* Include generic Linux declarations. */
+#include <bits/mman-linux.h>
diff --git a/libc/sysdeps/unix/sysv/linux/x86/bits/msq.h b/libc/sysdeps/unix/sysv/linux/x86/bits/msq.h
index ef5cc3868..9355e465d 100644
--- a/libc/sysdeps/unix/sysv/linux/x86/bits/msq.h
+++ b/libc/sysdeps/unix/sysv/linux/x86/bits/msq.h
@@ -25,6 +25,7 @@
#define MSG_NOERROR 010000 /* no error if message is too big */
#ifdef __USE_GNU
# define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+# define MSG_COPY 040000 /* copy (not remove) all queue messages */
#endif
/* Types used in the structure definition. */
diff --git a/libc/sysdeps/unix/sysv/linux/x86_64/x32/nptl/libpthread.abilist b/libc/sysdeps/unix/sysv/linux/x86_64/x32/nptl/libpthread.abilist
index ee6993291..b07d16f78 100644
--- a/libc/sysdeps/unix/sysv/linux/x86_64/x32/nptl/libpthread.abilist
+++ b/libc/sysdeps/unix/sysv/linux/x86_64/x32/nptl/libpthread.abilist
@@ -73,7 +73,6 @@ GLIBC_2.16
pause F
pread F
pread64 F
- pthread_atfork F
pthread_attr_destroy F
pthread_attr_getaffinity_np F
pthread_attr_getdetachstate F
diff --git a/libc/sysdeps/x86_64/fpu/libm-test-ulps b/libc/sysdeps/x86_64/fpu/libm-test-ulps
index b828774c7..f190ed881 100644
--- a/libc/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/libc/sysdeps/x86_64/fpu/libm-test-ulps
@@ -2390,6 +2390,9 @@ ifloat: 1
Test "j0 (0x1.d7ce3ap+107) == 2.775523647291230802651040996274861694514e-17":
float: 2
ifloat: 2
+Test "j0 (0x1p16382) == -1.2193782500509000574176799046642541129387e-2466":
+ildouble: 1
+ldouble: 1
Test "j0 (10.0) == -0.245935764451348335197760862485328754":
double: 2
float: 1
@@ -2420,6 +2423,9 @@ ldouble: 1
Test "j1 (0x1.ff00000000002p+840) == 1.846591691699331493194965158699937660696e-127":
double: 1
idouble: 1
+Test "j1 (0x1p16382) == 8.0839224448726336195866026476176740513439e-2467":
+ildouble: 1
+ldouble: 1
Test "j1 (10.0) == 0.0434727461688614366697487680258592883":
float: 2
ifloat: 2
@@ -3073,6 +3079,9 @@ double: 1
float: 1
idouble: 1
ifloat: 1
+Test "y0 (0x1p16382) == 8.0839224448726336195866026476176740513439e-2467":
+ildouble: 1
+ldouble: 1
Test "y0 (1.0) == 0.0882569642156769579829267660235151628":
double: 2
float: 1
@@ -3117,6 +3126,9 @@ ldouble: 1
Test "y1 (0x1p-10) == -6.5190099301063115047395187618929589514382e+02":
double: 1
idouble: 1
+Test "y1 (0x1p16382) == 1.2193782500509000574176799046642541129387e-2466":
+ildouble: 1
+ldouble: 1
Test "y1 (1.5) == -0.412308626973911295952829820633445323":
float: 1
ifloat: 1
diff --git a/libc/sysdeps/x86_64/memset.S b/libc/sysdeps/x86_64/memset.S
index f3a4d448d..b393efe44 100644
--- a/libc/sysdeps/x86_64/memset.S
+++ b/libc/sysdeps/x86_64/memset.S
@@ -23,7 +23,7 @@
#define __STOS_UPPER_BOUNDARY $65536
.text
-#if !defined NOT_IN_libc && !defined USE_MULTIARCH
+#if !defined NOT_IN_libc
ENTRY(__bzero)
mov %rsi,%rdx /* Adjust parameter. */
xorl %esi,%esi /* Fill with 0s. */
diff --git a/libc/sysdeps/x86_64/multiarch/Makefile b/libc/sysdeps/x86_64/multiarch/Makefile
index dd6c27d0b..86787ee6e 100644
--- a/libc/sysdeps/x86_64/multiarch/Makefile
+++ b/libc/sysdeps/x86_64/multiarch/Makefile
@@ -10,14 +10,12 @@ sysdep_routines += strncat-c stpncpy-c strncpy-c strcmp-ssse3 strncmp-ssse3 \
strend-sse4 memcmp-sse4 memcpy-ssse3 mempcpy-ssse3 \
memmove-ssse3 memcpy-ssse3-back mempcpy-ssse3-back \
memmove-ssse3-back strcasestr-nonascii strcasecmp_l-ssse3 \
- strncase_l-ssse3 strlen-sse4 strlen-sse2-no-bsf memset-x86-64 \
+ strncase_l-ssse3 strcat-ssse3 strncat-ssse3\
strcpy-ssse3 strncpy-ssse3 stpcpy-ssse3 stpncpy-ssse3 \
strcpy-sse2-unaligned strncpy-sse2-unaligned \
stpcpy-sse2-unaligned stpncpy-sse2-unaligned \
strcat-sse2-unaligned strncat-sse2-unaligned \
- strcat-ssse3 strncat-ssse3 strlen-sse2-pminub \
- strnlen-sse2-no-bsf strrchr-sse2-no-bsf strchr-sse2-no-bsf \
- memcmp-ssse3
+ strrchr-sse2-no-bsf strchr-sse2-no-bsf memcmp-ssse3
ifeq (yes,$(config-cflags-sse4))
sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c varshift
CFLAGS-varshift.c += -msse4
diff --git a/libc/sysdeps/x86_64/multiarch/bzero.S b/libc/sysdeps/x86_64/multiarch/bzero.S
deleted file mode 100644
index 88e96ea8e..000000000
--- a/libc/sysdeps/x86_64/multiarch/bzero.S
+++ /dev/null
@@ -1,28 +0,0 @@
-/* bzero. x86-64 version.
- Copyright (C) 2010-2013 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
- .text
-ENTRY(__bzero)
- mov %rsi,%rdx /* Adjust parameter. */
- xorl %esi,%esi /* Fill with 0s. */
- jmp __libc_memset /* Branch to IFUNC memset. */
-END(__bzero)
-weak_alias (__bzero, bzero)
diff --git a/libc/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/libc/sysdeps/x86_64/multiarch/ifunc-impl-list.c
index 643cb2dd0..05315fdd7 100644
--- a/libc/sysdeps/x86_64/multiarch/ifunc-impl-list.c
+++ b/libc/sysdeps/x86_64/multiarch/ifunc-impl-list.c
@@ -61,17 +61,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
__memmove_ssse3)
IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_sse2))
- /* Support sysdeps/x86_64/multiarch/memset_chk.S. */
- IFUNC_IMPL (i, name, __memset_chk,
- IFUNC_IMPL_ADD (array, i, __memset_chk, 1, __memset_chk_sse2)
- IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
- __memset_chk_x86_64))
-
- /* Support sysdeps/x86_64/multiarch/memset.S. */
- IFUNC_IMPL (i, name, memset,
- IFUNC_IMPL_ADD (array, i, memset, 1, __memset_sse2)
- IFUNC_IMPL_ADD (array, i, memset, 1, __memset_x86_64))
-
/* Support sysdeps/x86_64/multiarch/rawmemchr.S. */
IFUNC_IMPL (i, name, rawmemchr,
IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_SSE4_2,
@@ -187,11 +176,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
__strncpy_sse2_unaligned)
IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_sse2))
- /* Support sysdeps/x86_64/multiarch/strnlen.S. */
- IFUNC_IMPL (i, name, strnlen,
- IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_sse2_no_bsf)
- IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_sse2))
-
/* Support sysdeps/x86_64/multiarch/strpbrk.S. */
IFUNC_IMPL (i, name, strpbrk,
IFUNC_IMPL_ADD (array, i, strpbrk, HAS_SSE4_2,
@@ -262,14 +246,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
__mempcpy_ssse3)
IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_sse2))
- /* Support sysdeps/x86_64/multiarch/strlen.S. */
- IFUNC_IMPL (i, name, strlen,
- IFUNC_IMPL_ADD (array, i, strlen, HAS_SSE4_2, __strlen_sse42)
- IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2_pminub)
- IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2_no_bsf)
- IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2)
- IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2))
-
/* Support sysdeps/x86_64/multiarch/strncmp.S. */
IFUNC_IMPL (i, name, strncmp,
IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSE4_2,
diff --git a/libc/sysdeps/x86_64/multiarch/init-arch.c b/libc/sysdeps/x86_64/multiarch/init-arch.c
index 992cbfb75..7daaf4609 100644
--- a/libc/sysdeps/x86_64/multiarch/init-arch.c
+++ b/libc/sysdeps/x86_64/multiarch/init-arch.c
@@ -58,11 +58,6 @@ __init_cpu_features (void)
get_common_indeces (&family, &model);
- /* Intel processors prefer SSE instruction for memory/string
- routines if they are available. */
- __cpu_features.feature[index_Prefer_SSE_for_memop]
- |= bit_Prefer_SSE_for_memop;
-
unsigned int eax = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].eax;
unsigned int extended_family = (eax >> 20) & 0xff;
unsigned int extended_model = (eax >> 12) & 0xf0;
@@ -125,12 +120,6 @@ __init_cpu_features (void)
ecx = __cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx;
- /* AMD processors prefer SSE instructions for memory/string routines
- if they are available, otherwise they prefer integer instructions. */
- if ((ecx & 0x200))
- __cpu_features.feature[index_Prefer_SSE_for_memop]
- |= bit_Prefer_SSE_for_memop;
-
unsigned int eax;
__cpuid (0x80000000, eax, ebx, ecx, edx);
if (eax >= 0x80000001)
diff --git a/libc/sysdeps/x86_64/multiarch/init-arch.h b/libc/sysdeps/x86_64/multiarch/init-arch.h
index 0aece18de..28edbf7d0 100644
--- a/libc/sysdeps/x86_64/multiarch/init-arch.h
+++ b/libc/sysdeps/x86_64/multiarch/init-arch.h
@@ -18,7 +18,6 @@
#define bit_Fast_Rep_String (1 << 0)
#define bit_Fast_Copy_Backward (1 << 1)
#define bit_Slow_BSF (1 << 2)
-#define bit_Prefer_SSE_for_memop (1 << 3)
#define bit_Fast_Unaligned_Load (1 << 4)
#define bit_Prefer_PMINUB_for_stringop (1 << 5)
#define bit_AVX_Usable (1 << 6)
@@ -58,7 +57,6 @@
# define index_Fast_Rep_String FEATURE_INDEX_1*FEATURE_SIZE
# define index_Fast_Copy_Backward FEATURE_INDEX_1*FEATURE_SIZE
# define index_Slow_BSF FEATURE_INDEX_1*FEATURE_SIZE
-# define index_Prefer_SSE_for_memop FEATURE_INDEX_1*FEATURE_SIZE
# define index_Fast_Unaligned_Load FEATURE_INDEX_1*FEATURE_SIZE
# define index_Prefer_PMINUB_for_stringop FEATURE_INDEX_1*FEATURE_SIZE
# define index_AVX_Usable FEATURE_INDEX_1*FEATURE_SIZE
@@ -157,7 +155,6 @@ extern const struct cpu_features *__get_cpu_features (void)
# define index_Fast_Rep_String FEATURE_INDEX_1
# define index_Fast_Copy_Backward FEATURE_INDEX_1
# define index_Slow_BSF FEATURE_INDEX_1
-# define index_Prefer_SSE_for_memop FEATURE_INDEX_1
# define index_Fast_Unaligned_Load FEATURE_INDEX_1
# define index_AVX_Usable FEATURE_INDEX_1
# define index_FMA_Usable FEATURE_INDEX_1
@@ -169,7 +166,6 @@ extern const struct cpu_features *__get_cpu_features (void)
# define HAS_FAST_REP_STRING HAS_ARCH_FEATURE (Fast_Rep_String)
# define HAS_FAST_COPY_BACKWARD HAS_ARCH_FEATURE (Fast_Copy_Backward)
# define HAS_SLOW_BSF HAS_ARCH_FEATURE (Slow_BSF)
-# define HAS_PREFER_SSE_FOR_MEMOP HAS_ARCH_FEATURE (Prefer_SSE_for_memop)
# define HAS_FAST_UNALIGNED_LOAD HAS_ARCH_FEATURE (Fast_Unaligned_Load)
# define HAS_AVX HAS_ARCH_FEATURE (AVX_Usable)
# define HAS_FMA HAS_ARCH_FEATURE (FMA_Usable)
diff --git a/libc/sysdeps/x86_64/multiarch/memset-x86-64.S b/libc/sysdeps/x86_64/multiarch/memset-x86-64.S
deleted file mode 100644
index 551d105d2..000000000
--- a/libc/sysdeps/x86_64/multiarch/memset-x86-64.S
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <sysdep.h>
-
-#ifndef NOT_IN_libc
-# undef ENTRY_CHK
-# define ENTRY_CHK(name) \
- .type __memset_chk_x86_64, @function; \
- .globl __memset_chk_x86_64; \
- .p2align 4; \
- __memset_chk_x86_64: cfi_startproc; \
- CALL_MCOUNT
-# undef END_CHK
-# define END_CHK(name) \
- cfi_endproc; .size __memset_chk_x86_64, .-__memset_chk_x86_64
-
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)
-# define memset __memset_x86_64
-# include "../memset.S"
-#endif
diff --git a/libc/sysdeps/x86_64/multiarch/memset.S b/libc/sysdeps/x86_64/multiarch/memset.S
deleted file mode 100644
index 7f673faa7..000000000
--- a/libc/sysdeps/x86_64/multiarch/memset.S
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Multiple versions of memset
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2013 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-/* Define multiple versions only for the definition in lib. */
-#ifndef NOT_IN_libc
-ENTRY(memset)
- .type memset, @gnu_indirect_function
- cmpl $0, __cpu_features+KIND_OFFSET(%rip)
- jne 1f
- call __init_cpu_features
-1: leaq __memset_x86_64(%rip), %rax
- testl $bit_Prefer_SSE_for_memop, __cpu_features+FEATURE_OFFSET+index_Prefer_SSE_for_memop(%rip)
- jz 2f
- leaq __memset_sse2(%rip), %rax
-2: ret
-END(memset)
-
-/* Define internal IFUNC memset for bzero. */
- .globl __libc_memset
- .hidden __libc_memset
- __libc_memset = memset
-
-# define USE_SSE2 1
-
-# undef ENTRY
-# define ENTRY(name) \
- .type __memset_sse2, @function; \
- .globl __memset_sse2; \
- .p2align 4; \
- __memset_sse2: cfi_startproc; \
- CALL_MCOUNT
-# undef END
-# define END(name) \
- cfi_endproc; .size __memset_sse2, .-__memset_sse2
-
-# undef ENTRY_CHK
-# define ENTRY_CHK(name) \
- .type __memset_chk_sse2, @function; \
- .globl __memset_chk_sse2; \
- .p2align 4; \
- __memset_chk_sse2: cfi_startproc; \
- CALL_MCOUNT
-# undef END_CHK
-# define END_CHK(name) \
- cfi_endproc; .size __memset_chk_sse2, .-__memset_chk_sse2
-
-# ifdef SHARED
-# undef libc_hidden_builtin_def
-/* It doesn't make sense to send libc-internal memset calls through a PLT.
- The speedup we get from using GPR instruction is likely eaten away
- by the indirect call in the PLT. */
-# define libc_hidden_builtin_def(name) \
- .globl __GI_memset; __GI_memset = __memset_sse2
-# endif
-
-# undef strong_alias
-# define strong_alias(original, alias)
-#endif
-
-#include "../memset.S"
diff --git a/libc/sysdeps/x86_64/multiarch/memset_chk.S b/libc/sysdeps/x86_64/multiarch/memset_chk.S
deleted file mode 100644
index 55e263542..000000000
--- a/libc/sysdeps/x86_64/multiarch/memset_chk.S
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Multiple versions of __memset_chk
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2013 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-/* Define multiple versions only for the definition in lib. */
-#ifndef NOT_IN_libc
-# ifdef SHARED
-ENTRY(__memset_chk)
- .type __memset_chk, @gnu_indirect_function
- cmpl $0, __cpu_features+KIND_OFFSET(%rip)
- jne 1f
- call __init_cpu_features
-1: leaq __memset_chk_x86_64(%rip), %rax
- testl $bit_Prefer_SSE_for_memop, __cpu_features+FEATURE_OFFSET+index_Prefer_SSE_for_memop(%rip)
- jz 2f
- leaq __memset_chk_sse2(%rip), %rax
-2: ret
-END(__memset_chk)
-
-strong_alias (__memset_chk, __memset_zero_constant_len_parameter)
- .section .gnu.warning.__memset_zero_constant_len_parameter
- .string "memset used with constant zero length parameter; this could be due to transposed parameters"
-# else
-# include "../memset_chk.S"
-# endif
-#endif
diff --git a/libc/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S b/libc/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S
index 72bb60994..028c6d3d7 100644
--- a/libc/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S
+++ b/libc/sysdeps/x86_64/multiarch/strcat-sse2-unaligned.S
@@ -34,10 +34,236 @@ ENTRY (STRCAT)
mov %rdx, %r8
# endif
-# define RETURN jmp L(StartStrcpyPart)
-# include "strlen-sse2-pminub.S"
-# undef RETURN
+/* Inline corresponding strlen file, temporary until new strcpy
+ implementation gets merged. */
+ xor %rax, %rax
+ mov %edi, %ecx
+ and $0x3f, %ecx
+ pxor %xmm0, %xmm0
+ cmp $0x30, %ecx
+ ja L(next)
+ movdqu (%rdi), %xmm1
+ pcmpeqb %xmm1, %xmm0
+ pmovmskb %xmm0, %edx
+ test %edx, %edx
+ jnz L(exit_less16)
+ mov %rdi, %rax
+ and $-16, %rax
+ jmp L(align16_start)
+L(next):
+ mov %rdi, %rax
+ and $-16, %rax
+ pcmpeqb (%rax), %xmm0
+ mov $-1, %r10d
+ sub %rax, %rcx
+ shl %cl, %r10d
+ pmovmskb %xmm0, %edx
+ and %r10d, %edx
+ jnz L(exit)
+
+L(align16_start):
+ pxor %xmm0, %xmm0
+ pxor %xmm1, %xmm1
+ pxor %xmm2, %xmm2
+ pxor %xmm3, %xmm3
+ pcmpeqb 16(%rax), %xmm0
+ pmovmskb %xmm0, %edx
+ test %edx, %edx
+ jnz L(exit16)
+
+ pcmpeqb 32(%rax), %xmm1
+ pmovmskb %xmm1, %edx
+ test %edx, %edx
+ jnz L(exit32)
+
+ pcmpeqb 48(%rax), %xmm2
+ pmovmskb %xmm2, %edx
+ test %edx, %edx
+ jnz L(exit48)
+
+ pcmpeqb 64(%rax), %xmm3
+ pmovmskb %xmm3, %edx
+ test %edx, %edx
+ jnz L(exit64)
+
+ pcmpeqb 80(%rax), %xmm0
+ add $64, %rax
+ pmovmskb %xmm0, %edx
+ test %edx, %edx
+ jnz L(exit16)
+
+ pcmpeqb 32(%rax), %xmm1
+ pmovmskb %xmm1, %edx
+ test %edx, %edx
+ jnz L(exit32)
+
+ pcmpeqb 48(%rax), %xmm2
+ pmovmskb %xmm2, %edx
+ test %edx, %edx
+ jnz L(exit48)
+
+ pcmpeqb 64(%rax), %xmm3
+ pmovmskb %xmm3, %edx
+ test %edx, %edx
+ jnz L(exit64)
+
+ pcmpeqb 80(%rax), %xmm0
+ add $64, %rax
+ pmovmskb %xmm0, %edx
+ test %edx, %edx
+ jnz L(exit16)
+
+ pcmpeqb 32(%rax), %xmm1
+ pmovmskb %xmm1, %edx
+ test %edx, %edx
+ jnz L(exit32)
+
+ pcmpeqb 48(%rax), %xmm2
+ pmovmskb %xmm2, %edx
+ test %edx, %edx
+ jnz L(exit48)
+
+ pcmpeqb 64(%rax), %xmm3
+ pmovmskb %xmm3, %edx
+ test %edx, %edx
+ jnz L(exit64)
+
+ pcmpeqb 80(%rax), %xmm0
+ add $64, %rax
+ pmovmskb %xmm0, %edx
+ test %edx, %edx
+ jnz L(exit16)
+
+ pcmpeqb 32(%rax), %xmm1
+ pmovmskb %xmm1, %edx
+ test %edx, %edx
+ jnz L(exit32)
+
+ pcmpeqb 48(%rax), %xmm2
+ pmovmskb %xmm2, %edx
+ test %edx, %edx
+ jnz L(exit48)
+
+ pcmpeqb 64(%rax), %xmm3
+ pmovmskb %xmm3, %edx
+ test %edx, %edx
+ jnz L(exit64)
+
+ test $0x3f, %rax
+ jz L(align64_loop)
+
+ pcmpeqb 80(%rax), %xmm0
+ add $80, %rax
+ pmovmskb %xmm0, %edx
+ test %edx, %edx
+ jnz L(exit)
+
+ test $0x3f, %rax
+ jz L(align64_loop)
+
+ pcmpeqb 16(%rax), %xmm1
+ add $16, %rax
+ pmovmskb %xmm1, %edx
+ test %edx, %edx
+ jnz L(exit)
+
+ test $0x3f, %rax
+ jz L(align64_loop)
+
+ pcmpeqb 16(%rax), %xmm2
+ add $16, %rax
+ pmovmskb %xmm2, %edx
+ test %edx, %edx
+ jnz L(exit)
+
+ test $0x3f, %rax
+ jz L(align64_loop)
+
+ pcmpeqb 16(%rax), %xmm3
+ add $16, %rax
+ pmovmskb %xmm3, %edx
+ test %edx, %edx
+ jnz L(exit)
+
+ add $16, %rax
+ .p2align 4
+ L(align64_loop):
+ movaps (%rax), %xmm4
+ pminub 16(%rax), %xmm4
+ movaps 32(%rax), %xmm5
+ pminub 48(%rax), %xmm5
+ add $64, %rax
+ pminub %xmm4, %xmm5
+ pcmpeqb %xmm0, %xmm5
+ pmovmskb %xmm5, %edx
+ test %edx, %edx
+ jz L(align64_loop)
+
+ pcmpeqb -64(%rax), %xmm0
+ sub $80, %rax
+ pmovmskb %xmm0, %edx
+ test %edx, %edx
+ jnz L(exit16)
+
+ pcmpeqb 32(%rax), %xmm1
+ pmovmskb %xmm1, %edx
+ test %edx, %edx
+ jnz L(exit32)
+
+ pcmpeqb 48(%rax), %xmm2
+ pmovmskb %xmm2, %edx
+ test %edx, %edx
+ jnz L(exit48)
+
+ pcmpeqb 64(%rax), %xmm3
+ pmovmskb %xmm3, %edx
+ sub %rdi, %rax
+ bsf %rdx, %rdx
+ add %rdx, %rax
+ add $64, %rax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit):
+ sub %rdi, %rax
+L(exit_less16):
+ bsf %rdx, %rdx
+ add %rdx, %rax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit16):
+ sub %rdi, %rax
+ bsf %rdx, %rdx
+ add %rdx, %rax
+ add $16, %rax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit32):
+ sub %rdi, %rax
+ bsf %rdx, %rdx
+ add %rdx, %rax
+ add $32, %rax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit48):
+ sub %rdi, %rax
+ bsf %rdx, %rdx
+ add %rdx, %rax
+ add $48, %rax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit64):
+ sub %rdi, %rax
+ bsf %rdx, %rdx
+ add %rdx, %rax
+ add $64, %rax
+
+ .p2align 4
L(StartStrcpyPart):
lea (%r9, %rax), %rdi
mov %rsi, %rcx
diff --git a/libc/sysdeps/x86_64/multiarch/strcat-ssse3.S b/libc/sysdeps/x86_64/multiarch/strcat-ssse3.S
index fea9d11b4..8101b91e5 100644
--- a/libc/sysdeps/x86_64/multiarch/strcat-ssse3.S
+++ b/libc/sysdeps/x86_64/multiarch/strcat-ssse3.S
@@ -33,11 +33,321 @@ ENTRY (STRCAT)
mov %rdx, %r8
# endif
-# define RETURN jmp L(StartStrcpyPart)
-# include "strlen-sse2-no-bsf.S"
-# undef RETURN
+/* Inline corresponding strlen file, temporary until new strcpy
+ implementation gets merged. */
+
+ xor %eax, %eax
+ cmpb $0, (%rdi)
+ jz L(exit_tail0)
+ cmpb $0, 1(%rdi)
+ jz L(exit_tail1)
+ cmpb $0, 2(%rdi)
+ jz L(exit_tail2)
+ cmpb $0, 3(%rdi)
+ jz L(exit_tail3)
+
+ cmpb $0, 4(%rdi)
+ jz L(exit_tail4)
+ cmpb $0, 5(%rdi)
+ jz L(exit_tail5)
+ cmpb $0, 6(%rdi)
+ jz L(exit_tail6)
+ cmpb $0, 7(%rdi)
+ jz L(exit_tail7)
+
+ cmpb $0, 8(%rdi)
+ jz L(exit_tail8)
+ cmpb $0, 9(%rdi)
+ jz L(exit_tail9)
+ cmpb $0, 10(%rdi)
+ jz L(exit_tail10)
+ cmpb $0, 11(%rdi)
+ jz L(exit_tail11)
+
+ cmpb $0, 12(%rdi)
+ jz L(exit_tail12)
+ cmpb $0, 13(%rdi)
+ jz L(exit_tail13)
+ cmpb $0, 14(%rdi)
+ jz L(exit_tail14)
+ cmpb $0, 15(%rdi)
+ jz L(exit_tail15)
+ pxor %xmm0, %xmm0
+ lea 16(%rdi), %rcx
+ lea 16(%rdi), %rax
+ and $-16, %rax
+
+ pcmpeqb (%rax), %xmm0
+ pmovmskb %xmm0, %edx
+ pxor %xmm1, %xmm1
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm1
+ pmovmskb %xmm1, %edx
+ pxor %xmm2, %xmm2
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm2
+ pmovmskb %xmm2, %edx
+ pxor %xmm3, %xmm3
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm3
+ pmovmskb %xmm3, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm0
+ pmovmskb %xmm0, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm1
+ pmovmskb %xmm1, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm2
+ pmovmskb %xmm2, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm3
+ pmovmskb %xmm3, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm0
+ pmovmskb %xmm0, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm1
+ pmovmskb %xmm1, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm2
+ pmovmskb %xmm2, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm3
+ pmovmskb %xmm3, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm0
+ pmovmskb %xmm0, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm1
+ pmovmskb %xmm1, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm2
+ pmovmskb %xmm2, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ pcmpeqb (%rax), %xmm3
+ pmovmskb %xmm3, %edx
+ test %edx, %edx
+ lea 16(%rax), %rax
+ jnz L(exit)
+
+ and $-0x40, %rax
+ .p2align 4
+L(aligned_64):
+ pcmpeqb (%rax), %xmm0
+ pcmpeqb 16(%rax), %xmm1
+ pcmpeqb 32(%rax), %xmm2
+ pcmpeqb 48(%rax), %xmm3
+ pmovmskb %xmm0, %edx
+ pmovmskb %xmm1, %r11d
+ pmovmskb %xmm2, %r10d
+ pmovmskb %xmm3, %r9d
+ or %edx, %r9d
+ or %r11d, %r9d
+ or %r10d, %r9d
+ lea 64(%rax), %rax
+ jz L(aligned_64)
+
+ test %edx, %edx
+ jnz L(aligned_64_exit_16)
+ test %r11d, %r11d
+ jnz L(aligned_64_exit_32)
+ test %r10d, %r10d
+ jnz L(aligned_64_exit_48)
+
+L(aligned_64_exit_64):
+ pmovmskb %xmm3, %edx
+ jmp L(exit)
+
+L(aligned_64_exit_48):
+ lea -16(%rax), %rax
+ mov %r10d, %edx
+ jmp L(exit)
+
+L(aligned_64_exit_32):
+ lea -32(%rax), %rax
+ mov %r11d, %edx
+ jmp L(exit)
+
+L(aligned_64_exit_16):
+ lea -48(%rax), %rax
+
+L(exit):
+ sub %rcx, %rax
+ test %dl, %dl
+ jz L(exit_high)
+ test $0x01, %dl
+ jnz L(exit_tail0)
+
+ test $0x02, %dl
+ jnz L(exit_tail1)
+
+ test $0x04, %dl
+ jnz L(exit_tail2)
+
+ test $0x08, %dl
+ jnz L(exit_tail3)
+
+ test $0x10, %dl
+ jnz L(exit_tail4)
+
+ test $0x20, %dl
+ jnz L(exit_tail5)
+
+ test $0x40, %dl
+ jnz L(exit_tail6)
+ add $7, %eax
+L(exit_tail0):
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_high):
+ add $8, %eax
+ test $0x01, %dh
+ jnz L(exit_tail0)
+
+ test $0x02, %dh
+ jnz L(exit_tail1)
+
+ test $0x04, %dh
+ jnz L(exit_tail2)
+
+ test $0x08, %dh
+ jnz L(exit_tail3)
+
+ test $0x10, %dh
+ jnz L(exit_tail4)
+
+ test $0x20, %dh
+ jnz L(exit_tail5)
+
+ test $0x40, %dh
+ jnz L(exit_tail6)
+ add $7, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail1):
+ add $1, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail2):
+ add $2, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail3):
+ add $3, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail4):
+ add $4, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail5):
+ add $5, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail6):
+ add $6, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail7):
+ add $7, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail8):
+ add $8, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail9):
+ add $9, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail10):
+ add $10, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail11):
+ add $11, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail12):
+ add $12, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail13):
+ add $13, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail14):
+ add $14, %eax
+ jmp L(StartStrcpyPart)
+
+ .p2align 4
+L(exit_tail15):
+ add $15, %eax
+
+ .p2align 4
L(StartStrcpyPart):
mov %rsi, %rcx
lea (%rdi, %rax), %rdx
diff --git a/libc/sysdeps/x86_64/multiarch/strlen-sse2-no-bsf.S b/libc/sysdeps/x86_64/multiarch/strlen-sse2-no-bsf.S
deleted file mode 100644
index ff2ab7004..000000000
--- a/libc/sysdeps/x86_64/multiarch/strlen-sse2-no-bsf.S
+++ /dev/null
@@ -1,685 +0,0 @@
-/* strlen SSE2 without bsf
- Copyright (C) 2010-2013 Free Software Foundation, Inc.
- Contributed by Intel Corporation.
- 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, see
- <http://www.gnu.org/licenses/>. */
-
-/* only for strlen case we don't use optimized version for STATIC build just for SHARED */
-
-#if (defined SHARED || defined USE_AS_STRCAT || defined USE_AS_STRNLEN) && !defined NOT_IN_libc
-
-# ifndef USE_AS_STRCAT
-
-# include <sysdep.h>
-
-# define RETURN ret
-
-# ifndef STRLEN
-# define STRLEN __strlen_sse2_no_bsf
-# endif
-
- atom_text_section
-ENTRY (STRLEN)
-# endif
- xor %eax, %eax
-# ifdef USE_AS_STRNLEN
- mov %rsi, %r8
- sub $4, %rsi
- jbe L(len_less4_prolog)
-# endif
- cmpb $0, (%rdi)
- jz L(exit_tail0)
- cmpb $0, 1(%rdi)
- jz L(exit_tail1)
- cmpb $0, 2(%rdi)
- jz L(exit_tail2)
- cmpb $0, 3(%rdi)
- jz L(exit_tail3)
-
-# ifdef USE_AS_STRNLEN
- sub $4, %rsi
- jbe L(len_less8_prolog)
-# endif
-
- cmpb $0, 4(%rdi)
- jz L(exit_tail4)
- cmpb $0, 5(%rdi)
- jz L(exit_tail5)
- cmpb $0, 6(%rdi)
- jz L(exit_tail6)
- cmpb $0, 7(%rdi)
- jz L(exit_tail7)
-
-# ifdef USE_AS_STRNLEN
- sub $4, %rsi
- jbe L(len_less12_prolog)
-# endif
-
- cmpb $0, 8(%rdi)
- jz L(exit_tail8)
- cmpb $0, 9(%rdi)
- jz L(exit_tail9)
- cmpb $0, 10(%rdi)
- jz L(exit_tail10)
- cmpb $0, 11(%rdi)
- jz L(exit_tail11)
-
-# ifdef USE_AS_STRNLEN
- sub $4, %rsi
- jbe L(len_less16_prolog)
-# endif
-
- cmpb $0, 12(%rdi)
- jz L(exit_tail12)
- cmpb $0, 13(%rdi)
- jz L(exit_tail13)
- cmpb $0, 14(%rdi)
- jz L(exit_tail14)
- cmpb $0, 15(%rdi)
- jz L(exit_tail15)
- pxor %xmm0, %xmm0
- lea 16(%rdi), %rcx
- lea 16(%rdi), %rax
- and $-16, %rax
-
-# ifdef USE_AS_STRNLEN
- and $15, %rdi
- add %rdi, %rsi
- sub $64, %rsi
- jbe L(len_less64)
-# endif
-
- pcmpeqb (%rax), %xmm0
- pmovmskb %xmm0, %edx
- pxor %xmm1, %xmm1
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm1
- pmovmskb %xmm1, %edx
- pxor %xmm2, %xmm2
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm2
- pmovmskb %xmm2, %edx
- pxor %xmm3, %xmm3
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm3
- pmovmskb %xmm3, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
-# ifdef USE_AS_STRNLEN
- sub $64, %rsi
- jbe L(len_less64)
-# endif
-
- pcmpeqb (%rax), %xmm0
- pmovmskb %xmm0, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm1
- pmovmskb %xmm1, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm2
- pmovmskb %xmm2, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm3
- pmovmskb %xmm3, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
-# ifdef USE_AS_STRNLEN
- sub $64, %rsi
- jbe L(len_less64)
-# endif
-
- pcmpeqb (%rax), %xmm0
- pmovmskb %xmm0, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm1
- pmovmskb %xmm1, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm2
- pmovmskb %xmm2, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm3
- pmovmskb %xmm3, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
-# ifdef USE_AS_STRNLEN
- sub $64, %rsi
- jbe L(len_less64)
-# endif
-
- pcmpeqb (%rax), %xmm0
- pmovmskb %xmm0, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm1
- pmovmskb %xmm1, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm2
- pmovmskb %xmm2, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
- pcmpeqb (%rax), %xmm3
- pmovmskb %xmm3, %edx
- test %edx, %edx
- lea 16(%rax), %rax
- jnz L(exit)
-
-# ifdef USE_AS_STRNLEN
- mov %rax, %rdx
- and $63, %rdx
- add %rdx, %rsi
-# endif
-
- and $-0x40, %rax
-
- .p2align 4
-L(aligned_64):
-# ifdef USE_AS_STRNLEN
- sub $64, %rsi
- jbe L(len_less64)
-# endif
- pcmpeqb (%rax), %xmm0
- pcmpeqb 16(%rax), %xmm1
- pcmpeqb 32(%rax), %xmm2
- pcmpeqb 48(%rax), %xmm3
- pmovmskb %xmm0, %edx
- pmovmskb %xmm1, %r11d
- pmovmskb %xmm2, %r10d
- pmovmskb %xmm3, %r9d
- or %edx, %r9d
- or %r11d, %r9d
- or %r10d, %r9d
- lea 64(%rax), %rax
- jz L(aligned_64)
-
- test %edx, %edx
- jnz L(aligned_64_exit_16)
- test %r11d, %r11d
- jnz L(aligned_64_exit_32)
- test %r10d, %r10d
- jnz L(aligned_64_exit_48)
-L(aligned_64_exit_64):
- pmovmskb %xmm3, %edx
- jmp L(aligned_64_exit)
-L(aligned_64_exit_48):
- lea -16(%rax), %rax
- mov %r10d, %edx
- jmp L(aligned_64_exit)
-L(aligned_64_exit_32):
- lea -32(%rax), %rax
- mov %r11d, %edx
- jmp L(aligned_64_exit)
-L(aligned_64_exit_16):
- lea -48(%rax), %rax
-L(aligned_64_exit):
-L(exit):
- sub %rcx, %rax
- test %dl, %dl
- jz L(exit_high)
- test $0x01, %dl
- jnz L(exit_tail0)
-
- test $0x02, %dl
- jnz L(exit_tail1)
-
- test $0x04, %dl
- jnz L(exit_tail2)
-
- test $0x08, %dl
- jnz L(exit_tail3)
-
- test $0x10, %dl
- jnz L(exit_tail4)
-
- test $0x20, %dl
- jnz L(exit_tail5)
-
- test $0x40, %dl
- jnz L(exit_tail6)
- add $7, %eax
-L(exit_tail0):
- RETURN
-
-L(exit_high):
- add $8, %eax
- test $0x01, %dh
- jnz L(exit_tail0)
-
- test $0x02, %dh
- jnz L(exit_tail1)
-
- test $0x04, %dh
- jnz L(exit_tail2)
-
- test $0x08, %dh
- jnz L(exit_tail3)
-
- test $0x10, %dh
- jnz L(exit_tail4)
-
- test $0x20, %dh
- jnz L(exit_tail5)
-
- test $0x40, %dh
- jnz L(exit_tail6)
- add $7, %eax
- RETURN
-
-# ifdef USE_AS_STRNLEN
-
- .p2align 4
-L(len_less64):
- pxor %xmm0, %xmm0
- add $64, %rsi
-
- pcmpeqb (%rax), %xmm0
- pmovmskb %xmm0, %edx
- pxor %xmm1, %xmm1
- lea 16(%rax), %rax
- test %edx, %edx
- jnz L(strnlen_exit)
-
- sub $16, %rsi
- jbe L(return_start_len)
-
- pcmpeqb (%rax), %xmm1
- pmovmskb %xmm1, %edx
- lea 16(%rax), %rax
- test %edx, %edx
- jnz L(strnlen_exit)
-
- sub $16, %rsi
- jbe L(return_start_len)
-
- pcmpeqb (%rax), %xmm0
- pmovmskb %xmm0, %edx
- lea 16(%rax), %rax
- test %edx, %edx
- jnz L(strnlen_exit)
-
- sub $16, %rsi
- jbe L(return_start_len)
-
- pcmpeqb (%rax), %xmm1
- pmovmskb %xmm1, %edx
- lea 16(%rax), %rax
- test %edx, %edx
- jnz L(strnlen_exit)
-
- mov %r8, %rax
- ret
-
- .p2align 4
-L(strnlen_exit):
- sub %rcx, %rax
-
- test %dl, %dl
- jz L(strnlen_exit_high)
- mov %dl, %cl
- and $15, %cl
- jz L(strnlen_exit_8)
- test $0x01, %dl
- jnz L(exit_tail0)
- test $0x02, %dl
- jnz L(strnlen_exit_tail1)
- test $0x04, %dl
- jnz L(strnlen_exit_tail2)
- sub $4, %rsi
- jb L(return_start_len)
- lea 3(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_8):
- test $0x10, %dl
- jnz L(strnlen_exit_tail4)
- test $0x20, %dl
- jnz L(strnlen_exit_tail5)
- test $0x40, %dl
- jnz L(strnlen_exit_tail6)
- sub $8, %rsi
- jb L(return_start_len)
- lea 7(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_high):
- mov %dh, %ch
- and $15, %ch
- jz L(strnlen_exit_high_8)
- test $0x01, %dh
- jnz L(strnlen_exit_tail8)
- test $0x02, %dh
- jnz L(strnlen_exit_tail9)
- test $0x04, %dh
- jnz L(strnlen_exit_tail10)
- sub $12, %rsi
- jb L(return_start_len)
- lea 11(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_high_8):
- test $0x10, %dh
- jnz L(strnlen_exit_tail12)
- test $0x20, %dh
- jnz L(strnlen_exit_tail13)
- test $0x40, %dh
- jnz L(strnlen_exit_tail14)
- sub $16, %rsi
- jb L(return_start_len)
- lea 15(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail1):
- sub $2, %rsi
- jb L(return_start_len)
- lea 1(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail2):
- sub $3, %rsi
- jb L(return_start_len)
- lea 2(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail4):
- sub $5, %rsi
- jb L(return_start_len)
- lea 4(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail5):
- sub $6, %rsi
- jb L(return_start_len)
- lea 5(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail6):
- sub $7, %rsi
- jb L(return_start_len)
- lea 6(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail8):
- sub $9, %rsi
- jb L(return_start_len)
- lea 8(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail9):
- sub $10, %rsi
- jb L(return_start_len)
- lea 9(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail10):
- sub $11, %rsi
- jb L(return_start_len)
- lea 10(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail12):
- sub $13, %rsi
- jb L(return_start_len)
- lea 12(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail13):
- sub $14, %rsi
- jb L(return_start_len)
- lea 13(%eax), %eax
- ret
-
- .p2align 4
-L(strnlen_exit_tail14):
- sub $15, %rsi
- jb L(return_start_len)
- lea 14(%eax), %eax
- ret
-
- .p2align 4
-L(return_start_len):
- mov %r8, %rax
- ret
-
-/* for prolog only */
-
- .p2align 4
-L(len_less4_prolog):
- add $4, %rsi
- jz L(exit_tail0)
-
- cmpb $0, (%rdi)
- jz L(exit_tail0)
- cmp $1, %esi
- je L(exit_tail1)
-
- cmpb $0, 1(%rdi)
- jz L(exit_tail1)
- cmp $2, %esi
- je L(exit_tail2)
-
- cmpb $0, 2(%rdi)
- jz L(exit_tail2)
- cmp $3, %esi
- je L(exit_tail3)
-
- cmpb $0, 3(%rdi)
- jz L(exit_tail3)
- mov $4, %eax
- ret
-
- .p2align 4
-L(len_less8_prolog):
- add $4, %rsi
-
- cmpb $0, 4(%rdi)
- jz L(exit_tail4)
- cmp $1, %esi
- je L(exit_tail5)
-
- cmpb $0, 5(%rdi)
- jz L(exit_tail5)
- cmp $2, %esi
- je L(exit_tail6)
-
- cmpb $0, 6(%rdi)
- jz L(exit_tail6)
- cmp $3, %esi
- je L(exit_tail7)
-
- cmpb $0, 7(%rdi)
- jz L(exit_tail7)
- mov $8, %eax
- ret
-
- .p2align 4
-L(len_less12_prolog):
- add $4, %rsi
-
- cmpb $0, 8(%rdi)
- jz L(exit_tail8)
- cmp $1, %esi
- je L(exit_tail9)
-
- cmpb $0, 9(%rdi)
- jz L(exit_tail9)
- cmp $2, %esi
- je L(exit_tail10)
-
- cmpb $0, 10(%rdi)
- jz L(exit_tail10)
- cmp $3, %esi
- je L(exit_tail11)
-
- cmpb $0, 11(%rdi)
- jz L(exit_tail11)
- mov $12, %eax
- ret
-
- .p2align 4
-L(len_less16_prolog):
- add $4, %rsi
-
- cmpb $0, 12(%rdi)
- jz L(exit_tail12)
- cmp $1, %esi
- je L(exit_tail13)
-
- cmpb $0, 13(%rdi)
- jz L(exit_tail13)
- cmp $2, %esi
- je L(exit_tail14)
-
- cmpb $0, 14(%rdi)
- jz L(exit_tail14)
- cmp $3, %esi
- je L(exit_tail15)
-
- cmpb $0, 15(%rdi)
- jz L(exit_tail15)
- mov $16, %eax
- ret
-# endif
-
- .p2align 4
-L(exit_tail1):
- add $1, %eax
- RETURN
-
- .p2align 4
-L(exit_tail2):
- add $2, %eax
- RETURN
-
- .p2align 4
-L(exit_tail3):
- add $3, %eax
- RETURN
-
- .p2align 4
-L(exit_tail4):
- add $4, %eax
- RETURN
-
- .p2align 4
-L(exit_tail5):
- add $5, %eax
- RETURN
-
- .p2align 4
-L(exit_tail6):
- add $6, %eax
- RETURN
-
- .p2align 4
-L(exit_tail7):
- add $7, %eax
- RETURN
-
- .p2align 4
-L(exit_tail8):
- add $8, %eax
- RETURN
-
- .p2align 4
-L(exit_tail9):
- add $9, %eax
- RETURN
-
- .p2align 4
-L(exit_tail10):
- add $10, %eax
- RETURN
-
- .p2align 4
-L(exit_tail11):
- add $11, %eax
- RETURN
-
- .p2align 4
-L(exit_tail12):
- add $12, %eax
- RETURN
-
- .p2align 4
-L(exit_tail13):
- add $13, %eax
- RETURN
-
- .p2align 4
-L(exit_tail14):
- add $14, %eax
- RETURN
-
- .p2align 4
-L(exit_tail15):
- add $15, %eax
-# ifndef USE_AS_STRCAT
- RETURN
-END (STRLEN)
-# endif
-#endif
diff --git a/libc/sysdeps/x86_64/multiarch/strlen-sse2-pminub.S b/libc/sysdeps/x86_64/multiarch/strlen-sse2-pminub.S
deleted file mode 100644
index cc4bb57e9..000000000
--- a/libc/sysdeps/x86_64/multiarch/strlen-sse2-pminub.S
+++ /dev/null
@@ -1,259 +0,0 @@
-/* strlen SSE2
- Copyright (C) 2011-2013 Free Software Foundation, Inc.
- Contributed by Intel Corporation.
- 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, see
- <http://www.gnu.org/licenses/>. */
-
-#if !defined NOT_IN_libc && (defined SHARED || defined USE_AS_STRCAT)
-
-# ifndef USE_AS_STRCAT
-
-# include <sysdep.h>
-
-# define RETURN ret
-
- .section .text.sse2,"ax",@progbits
-ENTRY (__strlen_sse2_pminub)
-
-# endif
- xor %rax, %rax
- mov %edi, %ecx
- and $0x3f, %ecx
- pxor %xmm0, %xmm0
- cmp $0x30, %ecx
- ja L(next)
- movdqu (%rdi), %xmm1
- pcmpeqb %xmm1, %xmm0
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jnz L(exit_less16)
- mov %rdi, %rax
- and $-16, %rax
- jmp L(align16_start)
-L(next):
- mov %rdi, %rax
- and $-16, %rax
- pcmpeqb (%rax), %xmm0
- mov $-1, %r10d
- sub %rax, %rcx
- shl %cl, %r10d
- pmovmskb %xmm0, %edx
- and %r10d, %edx
- jnz L(exit)
-L(align16_start):
- pxor %xmm0, %xmm0
- pxor %xmm1, %xmm1
- pxor %xmm2, %xmm2
- pxor %xmm3, %xmm3
- pcmpeqb 16(%rax), %xmm0
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jnz L(exit16)
-
- pcmpeqb 32(%rax), %xmm1
- pmovmskb %xmm1, %edx
- test %edx, %edx
- jnz L(exit32)
-
- pcmpeqb 48(%rax), %xmm2
- pmovmskb %xmm2, %edx
- test %edx, %edx
- jnz L(exit48)
-
- pcmpeqb 64(%rax), %xmm3
- pmovmskb %xmm3, %edx
- test %edx, %edx
- jnz L(exit64)
-
- pcmpeqb 80(%rax), %xmm0
- add $64, %rax
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jnz L(exit16)
-
- pcmpeqb 32(%rax), %xmm1
- pmovmskb %xmm1, %edx
- test %edx, %edx
- jnz L(exit32)
-
- pcmpeqb 48(%rax), %xmm2
- pmovmskb %xmm2, %edx
- test %edx, %edx
- jnz L(exit48)
-
- pcmpeqb 64(%rax), %xmm3
- pmovmskb %xmm3, %edx
- test %edx, %edx
- jnz L(exit64)
-
- pcmpeqb 80(%rax), %xmm0
- add $64, %rax
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jnz L(exit16)
-
- pcmpeqb 32(%rax), %xmm1
- pmovmskb %xmm1, %edx
- test %edx, %edx
- jnz L(exit32)
-
- pcmpeqb 48(%rax), %xmm2
- pmovmskb %xmm2, %edx
- test %edx, %edx
- jnz L(exit48)
-
- pcmpeqb 64(%rax), %xmm3
- pmovmskb %xmm3, %edx
- test %edx, %edx
- jnz L(exit64)
-
- pcmpeqb 80(%rax), %xmm0
- add $64, %rax
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jnz L(exit16)
-
- pcmpeqb 32(%rax), %xmm1
- pmovmskb %xmm1, %edx
- test %edx, %edx
- jnz L(exit32)
-
- pcmpeqb 48(%rax), %xmm2
- pmovmskb %xmm2, %edx
- test %edx, %edx
- jnz L(exit48)
-
- pcmpeqb 64(%rax), %xmm3
- pmovmskb %xmm3, %edx
- test %edx, %edx
- jnz L(exit64)
-
-
- test $0x3f, %rax
- jz L(align64_loop)
-
- pcmpeqb 80(%rax), %xmm0
- add $80, %rax
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jnz L(exit)
-
- test $0x3f, %rax
- jz L(align64_loop)
-
- pcmpeqb 16(%rax), %xmm1
- add $16, %rax
- pmovmskb %xmm1, %edx
- test %edx, %edx
- jnz L(exit)
-
- test $0x3f, %rax
- jz L(align64_loop)
-
- pcmpeqb 16(%rax), %xmm2
- add $16, %rax
- pmovmskb %xmm2, %edx
- test %edx, %edx
- jnz L(exit)
-
- test $0x3f, %rax
- jz L(align64_loop)
-
- pcmpeqb 16(%rax), %xmm3
- add $16, %rax
- pmovmskb %xmm3, %edx
- test %edx, %edx
- jnz L(exit)
-
- add $16, %rax
- .p2align 4
- L(align64_loop):
- movaps (%rax), %xmm4
- pminub 16(%rax), %xmm4
- movaps 32(%rax), %xmm5
- pminub 48(%rax), %xmm5
- add $64, %rax
- pminub %xmm4, %xmm5
- pcmpeqb %xmm0, %xmm5
- pmovmskb %xmm5, %edx
- test %edx, %edx
- jz L(align64_loop)
-
-
- pcmpeqb -64(%rax), %xmm0
- sub $80, %rax
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jnz L(exit16)
-
- pcmpeqb 32(%rax), %xmm1
- pmovmskb %xmm1, %edx
- test %edx, %edx
- jnz L(exit32)
-
- pcmpeqb 48(%rax), %xmm2
- pmovmskb %xmm2, %edx
- test %edx, %edx
- jnz L(exit48)
-
- pcmpeqb 64(%rax), %xmm3
- pmovmskb %xmm3, %edx
- sub %rdi, %rax
- bsf %rdx, %rdx
- add %rdx, %rax
- add $64, %rax
- RETURN
-
- .p2align 4
-L(exit):
- sub %rdi, %rax
-L(exit_less16):
- bsf %rdx, %rdx
- add %rdx, %rax
- RETURN
- .p2align 4
-L(exit16):
- sub %rdi, %rax
- bsf %rdx, %rdx
- add %rdx, %rax
- add $16, %rax
- RETURN
- .p2align 4
-L(exit32):
- sub %rdi, %rax
- bsf %rdx, %rdx
- add %rdx, %rax
- add $32, %rax
- RETURN
- .p2align 4
-L(exit48):
- sub %rdi, %rax
- bsf %rdx, %rdx
- add %rdx, %rax
- add $48, %rax
- RETURN
- .p2align 4
-L(exit64):
- sub %rdi, %rax
- bsf %rdx, %rdx
- add %rdx, %rax
- add $64, %rax
-# ifndef USE_AS_STRCAT
- RETURN
-
-END (__strlen_sse2_pminub)
-# endif
-#endif
diff --git a/libc/sysdeps/x86_64/multiarch/strlen-sse4.S b/libc/sysdeps/x86_64/multiarch/strlen-sse4.S
deleted file mode 100644
index 8d685df0c..000000000
--- a/libc/sysdeps/x86_64/multiarch/strlen-sse4.S
+++ /dev/null
@@ -1,84 +0,0 @@
-/* strlen with SSE4
- Copyright (C) 2009-2013 Free Software Foundation, Inc.
- Contributed by Ulrich Drepper <drepper@redhat.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, see
- <http://www.gnu.org/licenses/>. */
-
-#if defined SHARED && !defined NOT_IN_libc
-
-#include <sysdep.h>
-
- .section .text.sse4.2,"ax",@progbits
-ENTRY (__strlen_sse42)
- pxor %xmm1, %xmm1
- movl %edi, %ecx
- movq %rdi, %r8
- andq $~15, %rdi
- xor %edi, %ecx
- pcmpeqb (%rdi), %xmm1
- pmovmskb %xmm1, %edx
- shrl %cl, %edx
- shll %cl, %edx
- andl %edx, %edx
- jnz L(less16bytes)
- pxor %xmm1, %xmm1
-
- .p2align 4
-L(more64bytes_loop):
- pcmpistri $0x08, 16(%rdi), %xmm1
- jz L(more32bytes)
-
- pcmpistri $0x08, 32(%rdi), %xmm1
- jz L(more48bytes)
-
- pcmpistri $0x08, 48(%rdi), %xmm1
- jz L(more64bytes)
-
- add $64, %rdi
- pcmpistri $0x08, (%rdi), %xmm1
- jnz L(more64bytes_loop)
- leaq (%rdi,%rcx), %rax
- subq %r8, %rax
- ret
-
- .p2align 4
-L(more32bytes):
- leaq 16(%rdi,%rcx, 1), %rax
- subq %r8, %rax
- ret
-
- .p2align 4
-L(more48bytes):
- leaq 32(%rdi,%rcx, 1), %rax
- subq %r8, %rax
- ret
-
- .p2align 4
-L(more64bytes):
- leaq 48(%rdi,%rcx, 1), %rax
- subq %r8, %rax
- ret
-
- .p2align 4
-L(less16bytes):
- subq %r8, %rdi
- bsfl %edx, %eax
- addq %rdi, %rax
- ret
-
-END (__strlen_sse42)
-
-#endif
diff --git a/libc/sysdeps/x86_64/multiarch/strlen.S b/libc/sysdeps/x86_64/multiarch/strlen.S
deleted file mode 100644
index ab29ceff2..000000000
--- a/libc/sysdeps/x86_64/multiarch/strlen.S
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Multiple versions of strlen(str) -- determine the length of the string STR.
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2009-2013 Free Software Foundation, Inc.
- Contributed by Ulrich Drepper <drepper@redhat.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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-
-/* Define multiple versions only for the definition in libc and for
- the DSO. In static binaries we need strlen before the initialization
- happened. */
-#if defined SHARED && !defined NOT_IN_libc
- .text
-ENTRY(strlen)
- .type strlen, @gnu_indirect_function
- cmpl $0, __cpu_features+KIND_OFFSET(%rip)
- jne 1f
- call __init_cpu_features
-1: leaq __strlen_sse2_pminub(%rip), %rax
- testl $bit_Prefer_PMINUB_for_stringop, __cpu_features+FEATURE_OFFSET+index_Prefer_PMINUB_for_stringop(%rip)
- jnz 2f
- leaq __strlen_sse2(%rip), %rax
- testl $bit_SSE4_2, __cpu_features+CPUID_OFFSET+index_SSE4_2(%rip)
- jz 2f
- leaq __strlen_sse42(%rip), %rax
- ret
-2: testl $bit_Slow_BSF, __cpu_features+FEATURE_OFFSET+index_Slow_BSF(%rip)
- jz 3f
- leaq __strlen_sse2_no_bsf(%rip), %rax
-3: ret
-END(strlen)
-
-# undef ENTRY
-# define ENTRY(name) \
- .type __strlen_sse2, @function; \
- .align 16; \
- .globl __strlen_sse2; \
- .hidden __strlen_sse2; \
- __strlen_sse2: cfi_startproc; \
- CALL_MCOUNT
-# undef END
-# define END(name) \
- cfi_endproc; .size __strlen_sse2, .-__strlen_sse2
-# undef libc_hidden_builtin_def
-/* It doesn't make sense to send libc-internal strlen calls through a PLT.
- The speedup we get from using SSE4.2 instruction is likely eaten away
- by the indirect call in the PLT. */
-# define libc_hidden_builtin_def(name) \
- .globl __GI_strlen; __GI_strlen = __strlen_sse2
-#endif
-
-#include "../strlen.S"
diff --git a/libc/sysdeps/x86_64/multiarch/strnlen-sse2-no-bsf.S b/libc/sysdeps/x86_64/multiarch/strnlen-sse2-no-bsf.S
deleted file mode 100644
index 248328d99..000000000
--- a/libc/sysdeps/x86_64/multiarch/strnlen-sse2-no-bsf.S
+++ /dev/null
@@ -1,3 +0,0 @@
-#define USE_AS_STRNLEN
-#define STRLEN __strnlen_sse2_no_bsf
-#include "strlen-sse2-no-bsf.S"
diff --git a/libc/sysdeps/x86_64/multiarch/strnlen.S b/libc/sysdeps/x86_64/multiarch/strnlen.S
deleted file mode 100644
index 124f8458a..000000000
--- a/libc/sysdeps/x86_64/multiarch/strnlen.S
+++ /dev/null
@@ -1,57 +0,0 @@
-/* multiple version of strnlen
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2011-2013 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <init-arch.h>
-
-
-/* Define multiple versions only for the definition in libc. */
-#ifndef NOT_IN_libc
-
- .text
-ENTRY(__strnlen)
- .type __strnlen, @gnu_indirect_function
- cmpl $0, __cpu_features+KIND_OFFSET(%rip)
- jne 1f
- call __init_cpu_features
-1: leaq __strnlen_sse2(%rip), %rax
- testl $bit_Slow_BSF, __cpu_features+FEATURE_OFFSET+index_Slow_BSF(%rip)
- jz 2f
- leaq __strnlen_sse2_no_bsf(%rip), %rax
-2: ret
-END(__strnlen)
-
-# undef ENTRY
-# define ENTRY(name) \
- .type __strnlen_sse2, @function; \
- .align 16; \
- .globl __strnlen_sse2; \
- .hidden __strnlen_sse2; \
- __strnlen_sse2: cfi_startproc; \
- CALL_MCOUNT
-# undef END
-# define END(name) \
- cfi_endproc; .size __strnlen_sse2, .-__strnlen_sse2
-
-# undef libc_hidden_def
-# define libc_hidden_def(name) \
- .globl __GI_strnlen; __GI_strnlen = __strnlen_sse2
-#endif
-
-#include "../strnlen.S"
diff --git a/libc/sysdeps/x86_64/preconfigure b/libc/sysdeps/x86_64/preconfigure
index ca9de7584..d5abba882 100644
--- a/libc/sysdeps/x86_64/preconfigure
+++ b/libc/sysdeps/x86_64/preconfigure
@@ -1,123 +1,3 @@
-
-# as_fn_set_status STATUS
-# -----------------------
-# Set $? to STATUS, without forking.
-as_fn_set_status ()
-{
- return $1
-} # as_fn_set_status
-
-# as_fn_exit STATUS
-# -----------------
-# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
-as_fn_exit ()
-{
- set +e
- as_fn_set_status $1
- exit $1
-} # as_fn_exit
-if expr a : '\(a\)' >/dev/null 2>&1 &&
- test "X`expr 00001 : '.*\(...\)'`" = X001; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
- as_basename=basename
-else
- as_basename=false
-fi
-
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{
- s//\1/
- q
- }
- /^X\/\(\/\/\)$/{
- s//\1/
- q
- }
- /^X\/\(\/\).*/{
- s//\1/
- q
- }
- s/.*/./; q'`
-
-
- as_lineno_1=$LINENO as_lineno_1a=$LINENO
- as_lineno_2=$LINENO as_lineno_2a=$LINENO
- eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
- test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
- # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
- sed -n '
- p
- /[$]LINENO/=
- ' <$as_myself |
- sed '
- s/[$]LINENO.*/&-/
- t lineno
- b
- :lineno
- N
- :loop
- s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
- t loop
- s/-\n.*//
- ' >$as_me.lineno &&
- chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
-
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensitive to this).
- . "./$as_me.lineno"
- # Exit status is that of the last command.
- exit
-}
-
-
-# ac_fn_c_try_compile LINENO
-# --------------------------
-# Try to compile conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
- if { { ac_try="$ac_compile"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_compile") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && {
- test -z "$ac_c_werror_flag" ||
- test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_compile
# This file is generated from configure.in by Autoconf. DO NOT EDIT!
# Local preconfigure fragment for sysdeps/x86_64
diff --git a/libc/sysdeps/x86_64/strcat.S b/libc/sysdeps/x86_64/strcat.S
index 287ffd24c..8bea6fb5d 100644
--- a/libc/sysdeps/x86_64/strcat.S
+++ b/libc/sysdeps/x86_64/strcat.S
@@ -21,6 +21,7 @@
#include <sysdep.h>
#include "asm-syntax.h"
+/* Will be removed when new strcpy implementation gets merged. */
.text
ENTRY (strcat)
diff --git a/libc/sysdeps/x86_64/strlen.S b/libc/sysdeps/x86_64/strlen.S
index 4bdca0a45..eeb109221 100644
--- a/libc/sysdeps/x86_64/strlen.S
+++ b/libc/sysdeps/x86_64/strlen.S
@@ -1,6 +1,5 @@
-/* strlen(str) -- determine the length of the string STR.
- Copyright (C) 2009-2013 Free Software Foundation, Inc.
- Contributed by Ulrich Drepper <drepper@redhat.com>.
+/* SSE2 version of strlen.
+ Copyright (C) 2012-2013 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
@@ -19,83 +18,222 @@
#include <sysdep.h>
+/* Long lived register in strlen(s), strnlen(s, n) are:
- .text
+ %xmm11 - zero
+ %rdi - s
+ %r10 (s+n) & (~(64-1))
+ %r11 s+n
+*/
+
+
+.text
ENTRY(strlen)
+
+/* Test 64 bytes from %rax for zero. Save result as bitmask in %rdx. */
+#define FIND_ZERO \
+ pcmpeqb (%rax), %xmm8; \
+ pcmpeqb 16(%rax), %xmm9; \
+ pcmpeqb 32(%rax), %xmm10; \
+ pcmpeqb 48(%rax), %xmm11; \
+ pmovmskb %xmm8, %esi; \
+ pmovmskb %xmm9, %edx; \
+ pmovmskb %xmm10, %r8d; \
+ pmovmskb %xmm11, %ecx; \
+ salq $16, %rdx; \
+ salq $16, %rcx; \
+ orq %rsi, %rdx; \
+ orq %r8, %rcx; \
+ salq $32, %rcx; \
+ orq %rcx, %rdx;
+
+#ifdef AS_STRNLEN
+/* Do not read anything when n==0. */
+ test %rsi, %rsi
+ jne L(n_nonzero)
xor %rax, %rax
- mov %edi, %ecx
- and $0x3f, %ecx
- pxor %xmm0, %xmm0
- cmp $0x30, %ecx
- ja L(next)
- movdqu (%rdi), %xmm1
- pcmpeqb %xmm1, %xmm0
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jnz L(exit_less16)
- mov %rdi, %rax
- and $-16, %rax
- jmp L(align16_start)
-L(next):
- mov %rdi, %rax
- and $-16, %rax
- pcmpeqb (%rax), %xmm0
- mov $-1, %esi
- sub %rax, %rcx
- shl %cl, %esi
- pmovmskb %xmm0, %edx
- and %esi, %edx
- jnz L(exit)
-L(align16_start):
- pxor %xmm0, %xmm0
- pxor %xmm1, %xmm1
- pxor %xmm2, %xmm2
- pxor %xmm3, %xmm3
- .p2align 4
-L(align16_loop):
- pcmpeqb 16(%rax), %xmm0
- pmovmskb %xmm0, %edx
- test %edx, %edx
- jnz L(exit16)
+ ret
+L(n_nonzero):
- pcmpeqb 32(%rax), %xmm1
- pmovmskb %xmm1, %edx
- test %edx, %edx
- jnz L(exit32)
+/* Initialize long lived registers. */
- pcmpeqb 48(%rax), %xmm2
- pmovmskb %xmm2, %edx
- test %edx, %edx
- jnz L(exit48)
+ add %rdi, %rsi
+ mov %rsi, %r10
+ and $-64, %r10
+ mov %rsi, %r11
+#endif
- pcmpeqb 64(%rax), %xmm3
- pmovmskb %xmm3, %edx
- lea 64(%rax), %rax
+ pxor %xmm8, %xmm8
+ pxor %xmm9, %xmm9
+ pxor %xmm10, %xmm10
+ pxor %xmm11, %xmm11
+ movq %rdi, %rax
+ movq %rdi, %rcx
+ andq $4095, %rcx
+/* Offsets 4032-4047 will be aligned into 4032 thus fit into page. */
+ cmpq $4047, %rcx
+/* We cannot unify this branching as it would be ~6 cycles slower. */
+ ja L(cross_page)
+
+#ifdef AS_STRNLEN
+/* Test if end is among first 64 bytes. */
+# define STRNLEN_PROLOG \
+ mov %r11, %rsi; \
+ subq %rax, %rsi; \
+ andq $-64, %rax; \
+ testq $-64, %rsi; \
+ je L(strnlen_ret)
+#else
+# define STRNLEN_PROLOG andq $-64, %rax;
+#endif
+
+/* Ignore bits in mask that come before start of string. */
+#define PROLOG(lab) \
+ movq %rdi, %rcx; \
+ xorq %rax, %rcx; \
+ STRNLEN_PROLOG; \
+ sarq %cl, %rdx; \
+ test %rdx, %rdx; \
+ je L(lab); \
+ bsfq %rdx, %rax; \
+ ret
+
+#ifdef AS_STRNLEN
+ andq $-16, %rax
+ FIND_ZERO
+#else
+ /* Test first 16 bytes unaligned. */
+ movdqu (%rax), %xmm12
+ pcmpeqb %xmm8, %xmm12
+ pmovmskb %xmm12, %edx
test %edx, %edx
- jz L(align16_loop)
-L(exit):
- sub %rdi, %rax
-L(exit_less16):
- bsf %rdx, %rdx
- add %rdx, %rax
+ je L(next48_bytes)
+ bsf %edx, %eax /* If eax is zeroed 16bit bsf can be used. */
+ ret
+
+L(next48_bytes):
+/* Same as FIND_ZERO except we do not check first 16 bytes. */
+ andq $-16, %rax
+ pcmpeqb 16(%rax), %xmm9
+ pcmpeqb 32(%rax), %xmm10
+ pcmpeqb 48(%rax), %xmm11
+ pmovmskb %xmm9, %edx
+ pmovmskb %xmm10, %r8d
+ pmovmskb %xmm11, %ecx
+ salq $16, %rdx
+ salq $16, %rcx
+ orq %r8, %rcx
+ salq $32, %rcx
+ orq %rcx, %rdx
+#endif
+
+ /* When no zero byte is found xmm9-11 are zero so we do not have to
+ zero them. */
+ PROLOG(loop)
+
+ .p2align 4
+L(cross_page):
+ andq $-64, %rax
+ FIND_ZERO
+ PROLOG(loop_init)
+
+#ifdef AS_STRNLEN
+/* We must do this check to correctly handle strnlen (s, -1). */
+L(strnlen_ret):
+ bts %rsi, %rdx
+ sarq %cl, %rdx
+ test %rdx, %rdx
+ je L(loop_init)
+ bsfq %rdx, %rax
ret
+#endif
+ .p2align 4
+L(loop_init):
+ pxor %xmm9, %xmm9
+ pxor %xmm10, %xmm10
+ pxor %xmm11, %xmm11
+#ifdef AS_STRNLEN
+ .p2align 4
+L(loop):
+
+ addq $64, %rax
+ cmpq %rax, %r10
+ je L(exit_end)
+
+ movdqa (%rax), %xmm8
+ pminub 16(%rax), %xmm8
+ pminub 32(%rax), %xmm8
+ pminub 48(%rax), %xmm8
+ pcmpeqb %xmm11, %xmm8
+ pmovmskb %xmm8, %edx
+ testl %edx, %edx
+ jne L(exit)
+ jmp L(loop)
+
.p2align 4
-L(exit16):
- sub %rdi, %rax
- bsf %rdx, %rdx
- lea 16(%rdx,%rax), %rax
+L(exit_end):
+ cmp %rax, %r11
+ je L(first) /* Do not read when end is at page boundary. */
+ pxor %xmm8, %xmm8
+ FIND_ZERO
+
+L(first):
+ bts %r11, %rdx
+ bsfq %rdx, %rdx
+ addq %rdx, %rax
+ subq %rdi, %rax
ret
+
.p2align 4
-L(exit32):
- sub %rdi, %rax
- bsf %rdx, %rdx
- lea 32(%rdx,%rax), %rax
+L(exit):
+ pxor %xmm8, %xmm8
+ FIND_ZERO
+
+ bsfq %rdx, %rdx
+ addq %rdx, %rax
+ subq %rdi, %rax
ret
+
+#else
+
+ /* Main loop. Unrolled twice to improve L2 cache performance on core2. */
+ .p2align 4
+L(loop):
+
+ movdqa 64(%rax), %xmm8
+ pminub 80(%rax), %xmm8
+ pminub 96(%rax), %xmm8
+ pminub 112(%rax), %xmm8
+ pcmpeqb %xmm11, %xmm8
+ pmovmskb %xmm8, %edx
+ testl %edx, %edx
+ jne L(exit64)
+
+ subq $-128, %rax
+
+ movdqa (%rax), %xmm8
+ pminub 16(%rax), %xmm8
+ pminub 32(%rax), %xmm8
+ pminub 48(%rax), %xmm8
+ pcmpeqb %xmm11, %xmm8
+ pmovmskb %xmm8, %edx
+ testl %edx, %edx
+ jne L(exit0)
+ jmp L(loop)
+
.p2align 4
-L(exit48):
- sub %rdi, %rax
- bsf %rdx, %rdx
- lea 48(%rdx,%rax), %rax
+L(exit64):
+ addq $64, %rax
+L(exit0):
+ pxor %xmm8, %xmm8
+ FIND_ZERO
+
+ bsfq %rdx, %rdx
+ addq %rdx, %rax
+ subq %rdi, %rax
ret
+
+#endif
+
END(strlen)
libc_hidden_builtin_def (strlen)
diff --git a/libc/sysdeps/x86_64/strnlen.S b/libc/sysdeps/x86_64/strnlen.S
index 6e5350306..d3c43ac48 100644
--- a/libc/sysdeps/x86_64/strnlen.S
+++ b/libc/sysdeps/x86_64/strnlen.S
@@ -1,63 +1,6 @@
-/* strnlen(str,maxlen) -- determine the length of the string STR up to MAXLEN.
- Copyright (C) 2010-2013 Free Software Foundation, Inc.
- Contributed by Ulrich Drepper <drepper@redhat.com>.
- This file is part of the GNU C Library.
+#define AS_STRNLEN
+#define strlen __strnlen
+#include "strlen.S"
- 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, see
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-
-
- .text
-ENTRY(__strnlen)
- movq %rsi, %rax
- testq %rsi, %rsi
- jz 3f
- pxor %xmm2, %xmm2
- movq %rdi, %rcx
- movq %rdi, %r8
- movq $16, %r9
- andq $~15, %rdi
- movdqa %xmm2, %xmm1
- pcmpeqb (%rdi), %xmm2
- orl $0xffffffff, %r10d
- subq %rdi, %rcx
- shll %cl, %r10d
- subq %rcx, %r9
- pmovmskb %xmm2, %edx
- andl %r10d, %edx
- jnz 1f
- subq %r9, %rsi
- jbe 3f
-
-2: movdqa 16(%rdi), %xmm0
- leaq 16(%rdi), %rdi
- pcmpeqb %xmm1, %xmm0
- pmovmskb %xmm0, %edx
- testl %edx, %edx
- jnz 1f
- subq $16, %rsi
- jnbe 2b
-3: ret
-
-1: subq %r8, %rdi
- bsfl %edx, %edx
- addq %rdi, %rdx
- cmpq %rdx, %rax
- cmovnbq %rdx, %rax
- ret
-END(__strnlen)
-weak_alias (__strnlen, strnlen)
-libc_hidden_def (strnlen)
+weak_alias (__strnlen, strnlen);
+libc_hidden_builtin_def (strnlen)
diff --git a/libc/timezone/zic.c b/libc/timezone/zic.c
index a5202a1ac..91f0d20cc 100644
--- a/libc/timezone/zic.c
+++ b/libc/timezone/zic.c
@@ -1748,7 +1748,7 @@ stringoffset(char *result, long offset)
minutes = offset % MINSPERHOUR;
offset /= MINSPERHOUR;
hours = offset;
- if (hours >= HOURSPERDAY) {
+ if (hours > HOURSPERDAY) {
result[0] = '\0';
return -1;
}
@@ -1851,7 +1851,9 @@ stringzone(char *result, const struct zone *const zpfirst, const int zonecount)
rp = &zp->z_rules[i];
if (stdrp == NULL || rp->r_hiyear > stdrp->r_hiyear ||
(rp->r_hiyear == stdrp->r_hiyear &&
- rp->r_month > stdrp->r_month))
+ (rp->r_month > stdrp->r_month ||
+ (rp->r_month == stdrp->r_month &&
+ rp->r_dayofmonth > stdrp->r_dayofmonth))))
stdrp = rp;
}
if (stdrp != NULL && stdrp->r_stdoff != 0)