From ca34d7a7c77fa8dc823fd05439870e5a96610c5a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Thu, 14 Aug 1997 01:54:13 +0000 Subject: Update. 1997-08-14 03:14 Ulrich Drepper * elf/dl-minimal.c: Don't use relative #include paths. (malloc): Don't try to initialize _dl_pagesize, it already is. (__sigjmp_save, longjmp): Reformat. * sysdeps/generic/dl-sysdep.c: Implement _dl_show_auxv function to show content of auxiliary array. (_dl_sysdep_start): Remember start of auxiliary vector. * sysdeps/mach/hurd/dl-sysdep.c: (_dl_show_auxv): New dummy function. * elf/link.h: Add prototype for _dl_show_auxv. * elf/rtld.c (dl_main): Call _dl_show_auxv if LD_SHOW_AUXV envvar is present. * libio/iofdopen.c: Better prepare for use in libstdc++. * libio/iofflush.c: Likewise. * libio/iofgetpos.c: Likewise. * libio/iofgets.c: Likewise. * libio/iofopen.c: Likewise. * libio/iofputs.c: Likewise. * libio/iofread.c: Likewise. * libio/iofsetpos.c: Likewise. * libio/ioftell.c: Likewise. * libio/iofwrite.c: Likewise. * libio/iogetdelim.c: Likewise. * libio/iogets.c: Likewise. * libio/iopopen.c: Likewise. * libio/ioputs.c: Likewise. * libio/iosetbuffer.c: Likewise. * libio/iosetvbuf.c: Likewise. * libio/ioungetc.c: Likewise. * libio/iovsprintf.c: Likewise. * libio/iovsscanf.c: Likewise. * manual/creature.texi: Mention _XOPEN_SOURCE_EXTENDED in correct place. * manual/math.texi: Add comment to sincos decsription to say it's a GNU extension. Fix description of random function. * posix/fnmatch.h: Recognize Windog by _WINDOWS32 not WIN32. * posix/glob.c: Likewise. Handle stupid system headers on SunOS. Add casts for all __alloca calls. * posix/glob.h: Recognize Windog by _WINDOWS32 not WIN32. Declare additional GLOB_* constants also if _GNU_SOURCE is defined. Patches by Paul D. Smith . * stdio-common/_itoa.c: Don't use relateive #include paths. * sysdeps/i386/fpu/bits/mathinline.h: Enable optimizations even for gcc 2.7. (atan): Loading 1.0 from memory does not pay off. (asinh): Fix typo. 1997-08-13 09:44 Philip Blundell * sysdeps/stub/accept.c: Use socklen_t where necessary. * sysdeps/stub/bind.c: Likewise. * sysdeps/stub/connect.c: Likewise. * sysdeps/stub/getsockname.c: Likewise. * sysdeps/stub/getsockopt.c: Likewise. * sysdeps/stub/recvfrom.c: Likewise. * sysdeps/stub/sendto.c: Likewise. * sysdeps/stub/setsockopt.c: Likewise. 1997-08-11 Andreas Schwab * io/ftw.c (object_compare): Avoid memcmp when comparing scalar types. 1997-08-12 Andreas Schwab * math/libm-test.c (cbrt_test): Add epsilon for long double to `cbrt (-0.001)'. 1997-08-11 Andreas Schwab * sysdeps/stub/bits/string.h: Fix comment. 1997-08-01 Andreas Schwab * elf/Makefile (routines): Remove dl-version. (dl-routines): Add it here instead. This removes dead code from libc.so. 1997-08-12 17:17 Wolfram Gloger * malloc/thread-m.h (thread_atfork, thread_atfork_static): New macros to encapsulate pthread_atfork's functionality. * malloc/malloc.c (ptmalloc_lock_all, ptmalloc_unlock_all): New functions, registered via thread_atfork in the initialization routine or via thread_atfork_static in global scope. This ensures a consistent state of all locks across fork(). 1997-08-11 23:00:32 1997 Mark Kettenis * login/programs/xtmp.c (compare_entry): Partially undo patch made by Klaus Espenlaub. There was no xtmp/utmp typo. Added comment to cclarify this. * login/programs/xtmp.h: Likewise. * posix/getopt.c: Recognize Windog by _WINDOWS32 not WIN32. Patch by Paul D. Smith . 1997-08-12 13:51 Ulrich Drepper * login/getutid.c: Rename to __getutid and make getutid and getutxid weak aliases. Patch by ir. Mark M._Kettenis . 1997-08-11 23:55 Ulrich Drepper * sysdeps/unix/sysv/linux/Makefile [subdir=misc] (sysdep_headers): Add bits/mman.h. 1997-08-11 08:51:21 1997 H.J. Lu * stdlib/fmtmsg.c (fmtmsg): Add static to __libc_once_define macro. * libc.map (__progname_full, __progname): Added. 1997-08-04 08:31 H.J. Lu * sysdeps/unix/sysv/linux/if_index.c (if_nametoindex): Return 0 if SIOGIFINDEX is not defined. (if_indextoname): Initialize "result" to NULL. (if_nametoindex, if_nameindex): Fix ENOSYS setting. 1997-08-11 11:58 Richard Henderson Sparc ISO C 9x exception handling: * sysdeps/sparc/fpu/bits/mathdef.h: New file. * sysdeps/sparc/fpu/fclrexcpt.c: New file. * sysdeps/sparc/fpu/fegetenv.c: New file. * sysdeps/sparc/fpu/fegetround.c: New file. * sysdeps/sparc/fpu/feholdexcpt.c: New file. * sysdeps/sparc/fpu/fesetenv.c: New file. * sysdeps/sparc/fpu/fesetround.c: New file. * sysdeps/sparc/fpu/feupdateenv.c: New file. * sysdeps/sparc/fpu/fgetexcptflg.c: New file. * sysdeps/sparc/fpu/fraiseexcpt.c: New file. * sysdeps/sparc/fpu/fsetexcptflg.c: New file. * sysdeps/sparc/fpu/ftestexcept.c: New file. * sysdeps/sparc/sparc32/fpu/bits/fenv.h: New file. * sysdeps/sparc/sparc64/fpu/bits/fenv.h: New file. 1997-08-11 11:58 Richard Henderson Sparc64 merge: * configure.in: Change up subdirectories, rename sparc8->sparcv8. * csu/Makefile: Nuke need-nopic-initfini bits. The problem was that sparc64 ld did not recognize pic relocs at all. * elf/dl-deps.c: Include . * elf/do-rel.h (elf_dynamic_do_rel): Take reloc address and size directly instead of the DT names to get them from. * elf/dynamic-link.h (_ELF_DYNAMIC_DO_RELOC): New macro distilled from ELF_DYNAMIC_DO_REL{,A}. Define a second version that accounts for the possibility that DT_RELA and DT_JMPPLT overlap, as such is the case on the Sparc. * elf/elf.h: Stub out Elf64_Ver*, and make them the same as the Elf32_Ver* bits. The linker does not even know to differentiate between the word sizes. Someone should examine this and figure out what the proper sizes of things should be for 64-bit hosts before the sparc64 libraries are distributed. * shlib-versions: Rename sparc64 ld.so to not conflict with sparc32 on the same machine. Move old sysdeps/sparc contents to sysdeps/sparc/sparc32, rename sparc8 subdir to sparcv8, move sysdeps/sparc64 content to sysdeps/sparc/sparc64. Same for sysdeps/unix/sysv/linux/sparc. * sysdeps/sparc/Implies: Do ieee754 here. * sysdeps/sparc/configure.in: Move from sparc32/. * sysdeps/sparc/sparc32/Implies: Do wordsize here. * sysdeps/sparc/sparc64/Implies: Likewise. * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_load_address): Use uninitialized .got to find load address instead of AT_BASE, as the later does not exist when running ld.so directly. * sysdeps/sparc/sparc32/fpu/fpu_control.h: Move from ../. * sysdeps/sparc/sparc64/fpu/fpu_control.h: Likewise. * sysdeps/sparc/sparc32/udiv_qrnnd.S: Clean up PIC support. * sysdeps/sparc/sparc64/Makefile (sysdep_routines): Add s_finitel and s_signbitl for stdio. * sysdeps/sparc/sparc64/configure.in: Remove, we no longer need nopic_initfini. * sysdeps/sparc/sparc64/bsd-_setjmp.S: Remove. * sysdeps/sparc/sparc64/bsd-setjmp.S: Remove. * sysdeps/unix/sysv/linux/sparc/sparc64/bsd-_setjmp.S: New empty file. * sysdeps/unix/sysv/linux/sparc/sparc64/bsd-setjmp.S: New empty file. * sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S: Add __longjmp alias. * sysdeps/unix/sysv/linux/sparc/sparc64/setjmp.S: Add weak _setjmp and setjmp entry points. * sysdeps/sparc/sparc64/dl-machine.h: Finish real implementation. * sysdeps/sparc/sparc64/elf/crtbegin.S: Add copyright, fix PIC. * sysdeps/sparc/sparc64/elf/crtend.S: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/sigaction.h (struct sigaction): Fix sa_flags size for sparc64; add sa_restorer for kernel. * sysdeps/unix/sysv/linux/sparc/sparc64/brk.S: Fix PIC. * sysdeps/unix/sysv/linux/sparc/sparc64/clone.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: New file. 1997-08-10 18:29:08 1997 Mark Kettenis * login/login.c (login): Check for correct return value of utmpname. 1997-08-11 16:49 Ulrich Drepper * time/tzset.c (__tzset_internal): Correctly handle TZ strings following incorrect old POSIX specs. Patch by Paul Eggert . * sysdeps/generic/bits/sigaction.h: Correct comment for SA_RESTART. * sysdeps/unix/bsd/osf/bits/sigaction.h: Likewise. * sysdeps/unix/sysv/linux/alpha/bits/sigaction.h: Likewise. * sysdeps/unix/sysv/linux/bits/sigaction.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/sigaction.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/sigaction.h: Likewise. * sysdeps/unix/sysv/minix/bits/sigaction.h: Likewise. * sysdeps/unix/sysv/sysv4/bits/sigaction.h: Likewise. Reported by NIIBE Yutaka . 1997-08-09 Andreas Schwab * manual/math.texi: Define the macros @mul and @infinity and use them to format the multiplication and infinity signs. (FP Comparison Functions): Use @code, not @math, for C code examples. * elf/dl-profile.c: Add descriptions and implement reading of --- ChangeLog | 249 +++++++++++++- bits/sigaction.h | 6 +- configure | 117 +++---- configure.in | 9 +- csu/Makefile | 36 +- elf/Makefile | 4 +- elf/dl-deps.c | 2 +- elf/dl-minimal.c | 15 +- elf/do-rel.h | 7 +- elf/dynamic-link.h | 81 ++++- elf/elf.h | 51 +++ elf/link.h | 4 + elf/rtld.c | 5 + io/ftw.c | 4 +- libc.map | 4 +- libio/iofdopen.c | 2 + libio/iofflush.c | 2 + libio/iofgetpos.c | 2 + libio/iofgets.c | 2 + libio/iofopen.c | 2 + libio/iofputs.c | 2 + libio/iofread.c | 3 + libio/iofsetpos.c | 2 + libio/ioftell.c | 2 + libio/iofwrite.c | 2 + libio/iogetdelim.c | 2 + libio/iogets.c | 2 + libio/iopopen.c | 2 + libio/ioputs.c | 3 + libio/iosetbuffer.c | 2 + libio/iosetvbuf.c | 2 + libio/ioungetc.c | 2 + libio/iovsprintf.c | 2 + libio/iovsscanf.c | 3 + login/getutid.c | 6 +- login/login.c | 2 +- login/programs/xtmp.c | 29 +- login/programs/xtmp.h | 3 +- malloc/malloc.c | 124 ++++++- malloc/thread-m.h | 21 ++ manual/creature.texi | 1 + manual/math.texi | 200 ++++------- math/libm-test.c | 7 +- posix/fnmatch.h | 4 +- posix/getopt.c | 2 +- posix/glob.c | 41 +-- posix/glob.h | 4 +- shlib-versions | 2 +- stdio-common/_itoa.c | 6 +- stdlib/fmtmsg.c | 2 +- stdlib/strtod.c | 6 +- sysdeps/generic/bits/sigaction.h | 6 +- sysdeps/generic/dl-sysdep.c | 77 ++++- sysdeps/i386/fpu/bits/mathinline.h | 13 +- sysdeps/mach/hurd/dl-sysdep.c | 7 + sysdeps/sparc/Dist | 4 - sysdeps/sparc/Implies | 1 - sysdeps/sparc/Makefile | 51 --- sysdeps/sparc/__longjmp.S | 59 ---- sysdeps/sparc/add_n.S | 226 ------------- sysdeps/sparc/addmul_1.S | 147 -------- sysdeps/sparc/alloca.S | 32 -- sysdeps/sparc/bits/endian.h | 3 - sysdeps/sparc/bits/setjmp.h | 16 - sysdeps/sparc/bsd-_setjmp.S | 40 --- sysdeps/sparc/bsd-setjmp.S | 40 --- sysdeps/sparc/divrem.m4 | 238 ------------- sysdeps/sparc/dl-machine.h | 347 ------------------- sysdeps/sparc/dotmul.S | 123 ------- sysdeps/sparc/e_sqrt.c | 34 -- sysdeps/sparc/elf/Makefile | 4 - sysdeps/sparc/elf/start.c | 68 ---- sysdeps/sparc/fpu/bits/mathdef.h | 64 ++++ sysdeps/sparc/fpu/fclrexcpt.c | 32 ++ sysdeps/sparc/fpu/fegetenv.c | 26 ++ sysdeps/sparc/fpu/fegetround.c | 30 ++ sysdeps/sparc/fpu/feholdexcpt.c | 35 ++ sysdeps/sparc/fpu/fesetenv.c | 43 +++ sysdeps/sparc/fpu/fesetround.c | 37 +++ sysdeps/sparc/fpu/feupdateenv.c | 38 +++ sysdeps/sparc/fpu/fgetexcptflg.c | 31 ++ sysdeps/sparc/fpu/fraiseexcpt.c | 66 ++++ sysdeps/sparc/fpu/fsetexcptflg.c | 34 ++ sysdeps/sparc/fpu/ftestexcept.c | 30 ++ sysdeps/sparc/fpu_control.h | 69 ---- sysdeps/sparc/lshift.S | 95 ------ sysdeps/sparc/memcopy.h | 21 -- sysdeps/sparc/mul_1.S | 199 ----------- sysdeps/sparc/rem.S | 369 --------------------- sysdeps/sparc/rshift.S | 92 ----- sysdeps/sparc/sdiv.S | 369 --------------------- sysdeps/sparc/setjmp.S | 54 --- sysdeps/sparc/sparc32/Dist | 4 + sysdeps/sparc/sparc32/Implies | 1 + sysdeps/sparc/sparc32/Makefile | 51 +++ sysdeps/sparc/sparc32/__longjmp.S | 59 ++++ sysdeps/sparc/sparc32/add_n.S | 226 +++++++++++++ sysdeps/sparc/sparc32/addmul_1.S | 147 ++++++++ sysdeps/sparc/sparc32/alloca.S | 32 ++ sysdeps/sparc/sparc32/bits/endian.h | 3 + sysdeps/sparc/sparc32/bits/setjmp.h | 16 + sysdeps/sparc/sparc32/bsd-_setjmp.S | 40 +++ sysdeps/sparc/sparc32/bsd-setjmp.S | 40 +++ sysdeps/sparc/sparc32/divrem.m4 | 238 +++++++++++++ sysdeps/sparc/sparc32/dl-machine.h | 363 ++++++++++++++++++++ sysdeps/sparc/sparc32/dotmul.S | 123 +++++++ sysdeps/sparc/sparc32/e_sqrt.c | 34 ++ sysdeps/sparc/sparc32/elf/Makefile | 4 + sysdeps/sparc/sparc32/elf/start.c | 68 ++++ sysdeps/sparc/sparc32/fpu/bits/fenv.h | 76 +++++ sysdeps/sparc/sparc32/fpu/fpu_control.h | 69 ++++ sysdeps/sparc/sparc32/lshift.S | 95 ++++++ sysdeps/sparc/sparc32/memcopy.h | 21 ++ sysdeps/sparc/sparc32/mul_1.S | 199 +++++++++++ sysdeps/sparc/sparc32/rem.S | 369 +++++++++++++++++++++ sysdeps/sparc/sparc32/rshift.S | 92 +++++ sysdeps/sparc/sparc32/sdiv.S | 369 +++++++++++++++++++++ sysdeps/sparc/sparc32/setjmp.S | 54 +++ sysdeps/sparc/sparc32/sparcv8/addmul_1.S | 124 +++++++ sysdeps/sparc/sparc32/sparcv8/mul_1.S | 99 ++++++ sysdeps/sparc/sparc32/sparcv8/submul_1.S | 58 ++++ sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S | 186 +++++++++++ sysdeps/sparc/sparc32/sub_n.S | 311 +++++++++++++++++ sysdeps/sparc/sparc32/submul_1.S | 147 ++++++++ sysdeps/sparc/sparc32/udiv.S | 352 ++++++++++++++++++++ sysdeps/sparc/sparc32/udiv_qrnnd.S | 165 +++++++++ sysdeps/sparc/sparc32/umul.S | 153 +++++++++ sysdeps/sparc/sparc32/urem.S | 352 ++++++++++++++++++++ sysdeps/sparc/sparc64/Implies | 1 + sysdeps/sparc/sparc64/Makefile | 11 + sysdeps/sparc/sparc64/add_n.S | 58 ++++ sysdeps/sparc/sparc64/addmul_1.S | 88 +++++ sysdeps/sparc/sparc64/bits/endian.h | 8 + sysdeps/sparc/sparc64/dl-machine.h | 353 ++++++++++++++++++++ sysdeps/sparc/sparc64/elf/Dist | 4 + sysdeps/sparc/sparc64/elf/Makefile | 10 + sysdeps/sparc/sparc64/elf/crtbegin.S | 69 ++++ sysdeps/sparc/sparc64/elf/crtbeginS.S | 1 + sysdeps/sparc/sparc64/elf/crtend.S | 70 ++++ sysdeps/sparc/sparc64/elf/crtendS.S | 1 + sysdeps/sparc/sparc64/elf/start.S | 93 ++++++ sysdeps/sparc/sparc64/fpu/bits/fenv.h | 76 +++++ sysdeps/sparc/sparc64/fpu/fpu_control.h | 69 ++++ sysdeps/sparc/sparc64/gmp-mparam.h | 27 ++ sysdeps/sparc/sparc64/lshift.S | 96 ++++++ sysdeps/sparc/sparc64/mul_1.S | 84 +++++ sysdeps/sparc/sparc64/rshift.S | 93 ++++++ sysdeps/sparc/sparc64/sub_n.S | 55 +++ sysdeps/sparc/sparc64/submul_1.S | 87 +++++ sysdeps/sparc/sparc8/addmul_1.S | 124 ------- sysdeps/sparc/sparc8/mul_1.S | 99 ------ sysdeps/sparc/sparc8/submul_1.S | 58 ---- sysdeps/sparc/sparc8/udiv_qrnnd.S | 186 ----------- sysdeps/sparc/sub_n.S | 311 ----------------- sysdeps/sparc/submul_1.S | 147 -------- sysdeps/sparc/udiv.S | 352 -------------------- sysdeps/sparc/udiv_qrnnd.S | 164 --------- sysdeps/sparc/umul.S | 153 --------- sysdeps/sparc/urem.S | 352 -------------------- sysdeps/sparc64/Implies | 3 - sysdeps/sparc64/Makefile | 11 - sysdeps/sparc64/add_n.S | 58 ---- sysdeps/sparc64/addmul_1.S | 88 ----- sysdeps/sparc64/bits/endian.h | 8 - sysdeps/sparc64/bsd-_setjmp.S | 43 --- sysdeps/sparc64/bsd-setjmp.S | 41 --- sysdeps/sparc64/configure | 3 - sysdeps/sparc64/configure.in | 7 - sysdeps/sparc64/dl-machine.h | 306 ----------------- sysdeps/sparc64/elf/Dist | 4 - sysdeps/sparc64/elf/Makefile | 10 - sysdeps/sparc64/elf/crtbegin.S | 49 --- sysdeps/sparc64/elf/crtbeginS.S | 1 - sysdeps/sparc64/elf/crtend.S | 50 --- sysdeps/sparc64/elf/crtendS.S | 1 - sysdeps/sparc64/elf/start.S | 93 ------ sysdeps/sparc64/fpu_control.h | 69 ---- sysdeps/sparc64/gmp-mparam.h | 27 -- sysdeps/sparc64/lshift.S | 96 ------ sysdeps/sparc64/mul_1.S | 84 ----- sysdeps/sparc64/rshift.S | 93 ------ sysdeps/sparc64/sub_n.S | 55 --- sysdeps/sparc64/submul_1.S | 87 ----- sysdeps/stub/accept.c | 2 +- sysdeps/stub/bind.c | 2 +- sysdeps/stub/bits/string.h | 2 +- sysdeps/stub/connect.c | 3 +- sysdeps/stub/getsockname.c | 2 +- sysdeps/stub/getsockopt.c | 3 +- sysdeps/stub/recvfrom.c | 3 +- sysdeps/stub/sendto.c | 3 +- sysdeps/stub/setsockopt.c | 3 +- sysdeps/unix/bsd/osf/bits/sigaction.h | 8 +- sysdeps/unix/sysv/linux/Makefile | 2 +- sysdeps/unix/sysv/linux/alpha/bits/sigaction.h | 24 +- sysdeps/unix/sysv/linux/bits/sigaction.h | 26 +- sysdeps/unix/sysv/linux/if_index.c | 17 +- sysdeps/unix/sysv/linux/m68k/bits/mman.h | 75 +++++ sysdeps/unix/sysv/linux/mips/bits/sigaction.h | 28 +- sysdeps/unix/sysv/linux/sparc/Dist | 8 - sysdeps/unix/sysv/linux/sparc/Makefile | 12 - sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S | 143 -------- sysdeps/unix/sysv/linux/sparc/bits/mman.h | 77 ----- sysdeps/unix/sysv/linux/sparc/bits/sigaction.h | 29 +- sysdeps/unix/sysv/linux/sparc/brk.c | 56 ---- sysdeps/unix/sysv/linux/sparc/clone.S | 70 ---- sysdeps/unix/sysv/linux/sparc/fork.S | 33 -- sysdeps/unix/sysv/linux/sparc/init-first.h | 52 --- sysdeps/unix/sysv/linux/sparc/kernel_stat.h | 28 -- sysdeps/unix/sysv/linux/sparc/pipe.S | 37 --- sysdeps/unix/sysv/linux/sparc/profil-counter.h | 26 -- sysdeps/unix/sysv/linux/sparc/sigaction.c | 136 -------- sysdeps/unix/sysv/linux/sparc/socket.S | 58 ---- sysdeps/unix/sysv/linux/sparc/sparc32/Dist | 8 + sysdeps/unix/sysv/linux/sparc/sparc32/Makefile | 12 + .../sysv/linux/sparc/sparc32/__sigtrampoline.S | 143 ++++++++ sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h | 77 +++++ sysdeps/unix/sysv/linux/sparc/sparc32/brk.c | 56 ++++ sysdeps/unix/sysv/linux/sparc/sparc32/clone.S | 70 ++++ sysdeps/unix/sysv/linux/sparc/sparc32/fork.S | 33 ++ sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h | 52 +++ .../unix/sysv/linux/sparc/sparc32/kernel_stat.h | 28 ++ sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S | 37 +++ .../unix/sysv/linux/sparc/sparc32/profil-counter.h | 26 ++ sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c | 136 ++++++++ sysdeps/unix/sysv/linux/sparc/sparc32/socket.S | 58 ++++ sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S | 41 +++ .../unix/sysv/linux/sparc/sparc32/syscalls.list | 3 + sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S | 3 + sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h | 80 +++++ sysdeps/unix/sysv/linux/sparc/sparc64/Dist | 7 + sysdeps/unix/sysv/linux/sparc/sparc64/Makefile | 4 + sysdeps/unix/sysv/linux/sparc/sparc64/__longjmp.S | 1 + sysdeps/unix/sysv/linux/sparc/sparc64/bits/mman.h | 77 +++++ .../unix/sysv/linux/sparc/sparc64/bits/setjmp.h | 26 ++ sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h | 95 ++++++ sysdeps/unix/sysv/linux/sparc/sparc64/brk.S | 97 ++++++ .../unix/sysv/linux/sparc/sparc64/bsd-_setjmp.S | 1 + sysdeps/unix/sysv/linux/sparc/sparc64/bsd-setjmp.S | 1 + sysdeps/unix/sysv/linux/sparc/sparc64/clone.S | 89 +++++ sysdeps/unix/sysv/linux/sparc/sparc64/fork.S | 33 ++ sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S | 30 ++ sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h | 92 +++++ .../unix/sysv/linux/sparc/sparc64/kernel_stat.h | 22 ++ sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S | 46 +++ sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S | 37 +++ .../unix/sysv/linux/sparc/sparc64/profil-counter.h | 26 ++ sysdeps/unix/sysv/linux/sparc/sparc64/setcontext.S | 33 ++ sysdeps/unix/sysv/linux/sparc/sparc64/setjmp.S | 67 ++++ sysdeps/unix/sysv/linux/sparc/sparc64/sigjmp.S | 1 + sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S | 39 +++ .../unix/sysv/linux/sparc/sparc64/syscalls.list | 26 ++ sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.S | 31 ++ sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h | 138 ++++++++ sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h | 67 ++++ sysdeps/unix/sysv/linux/sparc/syscall.S | 41 --- sysdeps/unix/sysv/linux/sparc/syscalls.list | 3 - sysdeps/unix/sysv/linux/sparc/sysdep.S | 3 - sysdeps/unix/sysv/linux/sparc/sysdep.h | 80 ----- sysdeps/unix/sysv/linux/sparc64/Dist | 7 - sysdeps/unix/sysv/linux/sparc64/Makefile | 4 - sysdeps/unix/sysv/linux/sparc64/__longjmp.S | 1 - sysdeps/unix/sysv/linux/sparc64/bits/mman.h | 77 ----- sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h | 26 -- sysdeps/unix/sysv/linux/sparc64/bits/types.h | 95 ------ sysdeps/unix/sysv/linux/sparc64/brk.S | 97 ------ sysdeps/unix/sysv/linux/sparc64/clone.S | 89 ----- sysdeps/unix/sysv/linux/sparc64/fork.S | 33 -- sysdeps/unix/sysv/linux/sparc64/getcontext.S | 30 -- sysdeps/unix/sysv/linux/sparc64/init-first.h | 92 ----- sysdeps/unix/sysv/linux/sparc64/kernel_stat.h | 22 -- sysdeps/unix/sysv/linux/sparc64/longjmp.S | 44 --- sysdeps/unix/sysv/linux/sparc64/pipe.S | 37 --- sysdeps/unix/sysv/linux/sparc64/profil-counter.h | 26 -- sysdeps/unix/sysv/linux/sparc64/setcontext.S | 33 -- sysdeps/unix/sysv/linux/sparc64/setjmp.S | 48 --- sysdeps/unix/sysv/linux/sparc64/sigjmp.S | 1 - sysdeps/unix/sysv/linux/sparc64/syscalls.list | 26 -- sysdeps/unix/sysv/linux/sparc64/sysdep.S | 31 -- sysdeps/unix/sysv/linux/sparc64/sysdep.h | 116 ------- sysdeps/unix/sysv/linux/sparc64/ucontext.h | 67 ---- sysdeps/unix/sysv/minix/bits/sigaction.h | 16 +- sysdeps/unix/sysv/sysv4/bits/sigaction.h | 12 +- time/tzset.c | 9 +- 284 files changed, 9549 insertions(+), 8226 deletions(-) delete mode 100644 sysdeps/sparc/Dist delete mode 100644 sysdeps/sparc/Makefile delete mode 100644 sysdeps/sparc/__longjmp.S delete mode 100644 sysdeps/sparc/add_n.S delete mode 100644 sysdeps/sparc/addmul_1.S delete mode 100644 sysdeps/sparc/alloca.S delete mode 100644 sysdeps/sparc/bits/endian.h delete mode 100644 sysdeps/sparc/bits/setjmp.h delete mode 100644 sysdeps/sparc/bsd-_setjmp.S delete mode 100644 sysdeps/sparc/bsd-setjmp.S delete mode 100644 sysdeps/sparc/divrem.m4 delete mode 100644 sysdeps/sparc/dl-machine.h delete mode 100644 sysdeps/sparc/dotmul.S delete mode 100644 sysdeps/sparc/e_sqrt.c delete mode 100644 sysdeps/sparc/elf/Makefile delete mode 100644 sysdeps/sparc/elf/start.c create mode 100644 sysdeps/sparc/fpu/bits/mathdef.h create mode 100644 sysdeps/sparc/fpu/fclrexcpt.c create mode 100644 sysdeps/sparc/fpu/fegetenv.c create mode 100644 sysdeps/sparc/fpu/fegetround.c create mode 100644 sysdeps/sparc/fpu/feholdexcpt.c create mode 100644 sysdeps/sparc/fpu/fesetenv.c create mode 100644 sysdeps/sparc/fpu/fesetround.c create mode 100644 sysdeps/sparc/fpu/feupdateenv.c create mode 100644 sysdeps/sparc/fpu/fgetexcptflg.c create mode 100644 sysdeps/sparc/fpu/fraiseexcpt.c create mode 100644 sysdeps/sparc/fpu/fsetexcptflg.c create mode 100644 sysdeps/sparc/fpu/ftestexcept.c delete mode 100644 sysdeps/sparc/fpu_control.h delete mode 100644 sysdeps/sparc/lshift.S delete mode 100644 sysdeps/sparc/memcopy.h delete mode 100644 sysdeps/sparc/mul_1.S delete mode 100644 sysdeps/sparc/rem.S delete mode 100644 sysdeps/sparc/rshift.S delete mode 100644 sysdeps/sparc/sdiv.S delete mode 100644 sysdeps/sparc/setjmp.S create mode 100644 sysdeps/sparc/sparc32/Dist create mode 100644 sysdeps/sparc/sparc32/Implies create mode 100644 sysdeps/sparc/sparc32/Makefile create mode 100644 sysdeps/sparc/sparc32/__longjmp.S create mode 100644 sysdeps/sparc/sparc32/add_n.S create mode 100644 sysdeps/sparc/sparc32/addmul_1.S create mode 100644 sysdeps/sparc/sparc32/alloca.S create mode 100644 sysdeps/sparc/sparc32/bits/endian.h create mode 100644 sysdeps/sparc/sparc32/bits/setjmp.h create mode 100644 sysdeps/sparc/sparc32/bsd-_setjmp.S create mode 100644 sysdeps/sparc/sparc32/bsd-setjmp.S create mode 100644 sysdeps/sparc/sparc32/divrem.m4 create mode 100644 sysdeps/sparc/sparc32/dl-machine.h create mode 100644 sysdeps/sparc/sparc32/dotmul.S create mode 100644 sysdeps/sparc/sparc32/e_sqrt.c create mode 100644 sysdeps/sparc/sparc32/elf/Makefile create mode 100644 sysdeps/sparc/sparc32/elf/start.c create mode 100644 sysdeps/sparc/sparc32/fpu/bits/fenv.h create mode 100644 sysdeps/sparc/sparc32/fpu/fpu_control.h create mode 100644 sysdeps/sparc/sparc32/lshift.S create mode 100644 sysdeps/sparc/sparc32/memcopy.h create mode 100644 sysdeps/sparc/sparc32/mul_1.S create mode 100644 sysdeps/sparc/sparc32/rem.S create mode 100644 sysdeps/sparc/sparc32/rshift.S create mode 100644 sysdeps/sparc/sparc32/sdiv.S create mode 100644 sysdeps/sparc/sparc32/setjmp.S create mode 100644 sysdeps/sparc/sparc32/sparcv8/addmul_1.S create mode 100644 sysdeps/sparc/sparc32/sparcv8/mul_1.S create mode 100644 sysdeps/sparc/sparc32/sparcv8/submul_1.S create mode 100644 sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S create mode 100644 sysdeps/sparc/sparc32/sub_n.S create mode 100644 sysdeps/sparc/sparc32/submul_1.S create mode 100644 sysdeps/sparc/sparc32/udiv.S create mode 100644 sysdeps/sparc/sparc32/udiv_qrnnd.S create mode 100644 sysdeps/sparc/sparc32/umul.S create mode 100644 sysdeps/sparc/sparc32/urem.S create mode 100644 sysdeps/sparc/sparc64/Implies create mode 100644 sysdeps/sparc/sparc64/Makefile create mode 100644 sysdeps/sparc/sparc64/add_n.S create mode 100644 sysdeps/sparc/sparc64/addmul_1.S create mode 100644 sysdeps/sparc/sparc64/bits/endian.h create mode 100644 sysdeps/sparc/sparc64/dl-machine.h create mode 100644 sysdeps/sparc/sparc64/elf/Dist create mode 100644 sysdeps/sparc/sparc64/elf/Makefile create mode 100644 sysdeps/sparc/sparc64/elf/crtbegin.S create mode 100644 sysdeps/sparc/sparc64/elf/crtbeginS.S create mode 100644 sysdeps/sparc/sparc64/elf/crtend.S create mode 100644 sysdeps/sparc/sparc64/elf/crtendS.S create mode 100644 sysdeps/sparc/sparc64/elf/start.S create mode 100644 sysdeps/sparc/sparc64/fpu/bits/fenv.h create mode 100644 sysdeps/sparc/sparc64/fpu/fpu_control.h create mode 100644 sysdeps/sparc/sparc64/gmp-mparam.h create mode 100644 sysdeps/sparc/sparc64/lshift.S create mode 100644 sysdeps/sparc/sparc64/mul_1.S create mode 100644 sysdeps/sparc/sparc64/rshift.S create mode 100644 sysdeps/sparc/sparc64/sub_n.S create mode 100644 sysdeps/sparc/sparc64/submul_1.S delete mode 100644 sysdeps/sparc/sparc8/addmul_1.S delete mode 100644 sysdeps/sparc/sparc8/mul_1.S delete mode 100644 sysdeps/sparc/sparc8/submul_1.S delete mode 100644 sysdeps/sparc/sparc8/udiv_qrnnd.S delete mode 100644 sysdeps/sparc/sub_n.S delete mode 100644 sysdeps/sparc/submul_1.S delete mode 100644 sysdeps/sparc/udiv.S delete mode 100644 sysdeps/sparc/udiv_qrnnd.S delete mode 100644 sysdeps/sparc/umul.S delete mode 100644 sysdeps/sparc/urem.S delete mode 100644 sysdeps/sparc64/Implies delete mode 100644 sysdeps/sparc64/Makefile delete mode 100644 sysdeps/sparc64/add_n.S delete mode 100644 sysdeps/sparc64/addmul_1.S delete mode 100644 sysdeps/sparc64/bits/endian.h delete mode 100644 sysdeps/sparc64/bsd-_setjmp.S delete mode 100644 sysdeps/sparc64/bsd-setjmp.S delete mode 100755 sysdeps/sparc64/configure delete mode 100644 sysdeps/sparc64/configure.in delete mode 100644 sysdeps/sparc64/dl-machine.h delete mode 100644 sysdeps/sparc64/elf/Dist delete mode 100644 sysdeps/sparc64/elf/Makefile delete mode 100644 sysdeps/sparc64/elf/crtbegin.S delete mode 100644 sysdeps/sparc64/elf/crtbeginS.S delete mode 100644 sysdeps/sparc64/elf/crtend.S delete mode 100644 sysdeps/sparc64/elf/crtendS.S delete mode 100644 sysdeps/sparc64/elf/start.S delete mode 100644 sysdeps/sparc64/fpu_control.h delete mode 100644 sysdeps/sparc64/gmp-mparam.h delete mode 100644 sysdeps/sparc64/lshift.S delete mode 100644 sysdeps/sparc64/mul_1.S delete mode 100644 sysdeps/sparc64/rshift.S delete mode 100644 sysdeps/sparc64/sub_n.S delete mode 100644 sysdeps/sparc64/submul_1.S create mode 100644 sysdeps/unix/sysv/linux/m68k/bits/mman.h delete mode 100644 sysdeps/unix/sysv/linux/sparc/Dist delete mode 100644 sysdeps/unix/sysv/linux/sparc/Makefile delete mode 100644 sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S delete mode 100644 sysdeps/unix/sysv/linux/sparc/bits/mman.h delete mode 100644 sysdeps/unix/sysv/linux/sparc/brk.c delete mode 100644 sysdeps/unix/sysv/linux/sparc/clone.S delete mode 100644 sysdeps/unix/sysv/linux/sparc/fork.S delete mode 100644 sysdeps/unix/sysv/linux/sparc/init-first.h delete mode 100644 sysdeps/unix/sysv/linux/sparc/kernel_stat.h delete mode 100644 sysdeps/unix/sysv/linux/sparc/pipe.S delete mode 100644 sysdeps/unix/sysv/linux/sparc/profil-counter.h delete mode 100644 sysdeps/unix/sysv/linux/sparc/sigaction.c delete mode 100644 sysdeps/unix/sysv/linux/sparc/socket.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/Dist create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/Makefile create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/brk.c create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/clone.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/fork.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/socket.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/Dist create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/Makefile create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/__longjmp.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/bits/mman.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/brk.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/bsd-_setjmp.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/bsd-setjmp.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/clone.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/fork.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/kernel_stat.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/setcontext.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/setjmp.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/sigjmp.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.S create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h create mode 100644 sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h delete mode 100644 sysdeps/unix/sysv/linux/sparc/syscall.S delete mode 100644 sysdeps/unix/sysv/linux/sparc/syscalls.list delete mode 100644 sysdeps/unix/sysv/linux/sparc/sysdep.S delete mode 100644 sysdeps/unix/sysv/linux/sparc/sysdep.h delete mode 100644 sysdeps/unix/sysv/linux/sparc64/Dist delete mode 100644 sysdeps/unix/sysv/linux/sparc64/Makefile delete mode 100644 sysdeps/unix/sysv/linux/sparc64/__longjmp.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/bits/mman.h delete mode 100644 sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h delete mode 100644 sysdeps/unix/sysv/linux/sparc64/bits/types.h delete mode 100644 sysdeps/unix/sysv/linux/sparc64/brk.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/clone.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/fork.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/getcontext.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/init-first.h delete mode 100644 sysdeps/unix/sysv/linux/sparc64/kernel_stat.h delete mode 100644 sysdeps/unix/sysv/linux/sparc64/longjmp.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/pipe.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/profil-counter.h delete mode 100644 sysdeps/unix/sysv/linux/sparc64/setcontext.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/setjmp.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/sigjmp.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/syscalls.list delete mode 100644 sysdeps/unix/sysv/linux/sparc64/sysdep.S delete mode 100644 sysdeps/unix/sysv/linux/sparc64/sysdep.h delete mode 100644 sysdeps/unix/sysv/linux/sparc64/ucontext.h diff --git a/ChangeLog b/ChangeLog index 86057602b4..bdcdeb974e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,250 @@ +1997-08-14 03:14 Ulrich Drepper + + * elf/dl-minimal.c: Don't use relative #include paths. + (malloc): Don't try to initialize _dl_pagesize, it already is. + (__sigjmp_save, longjmp): Reformat. + + * sysdeps/generic/dl-sysdep.c: Implement _dl_show_auxv function to + show content of auxiliary array. + (_dl_sysdep_start): Remember start of auxiliary vector. + * sysdeps/mach/hurd/dl-sysdep.c: (_dl_show_auxv): New dummy function. + * elf/link.h: Add prototype for _dl_show_auxv. + * elf/rtld.c (dl_main): Call _dl_show_auxv if LD_SHOW_AUXV envvar + is present. + + * libio/iofdopen.c: Better prepare for use in libstdc++. + * libio/iofflush.c: Likewise. + * libio/iofgetpos.c: Likewise. + * libio/iofgets.c: Likewise. + * libio/iofopen.c: Likewise. + * libio/iofputs.c: Likewise. + * libio/iofread.c: Likewise. + * libio/iofsetpos.c: Likewise. + * libio/ioftell.c: Likewise. + * libio/iofwrite.c: Likewise. + * libio/iogetdelim.c: Likewise. + * libio/iogets.c: Likewise. + * libio/iopopen.c: Likewise. + * libio/ioputs.c: Likewise. + * libio/iosetbuffer.c: Likewise. + * libio/iosetvbuf.c: Likewise. + * libio/ioungetc.c: Likewise. + * libio/iovsprintf.c: Likewise. + * libio/iovsscanf.c: Likewise. + + * manual/creature.texi: Mention _XOPEN_SOURCE_EXTENDED in correct + place. + + * manual/math.texi: Add comment to sincos decsription to say it's a + GNU extension. + Fix description of random function. + + * posix/fnmatch.h: Recognize Windog by _WINDOWS32 not WIN32. + * posix/glob.c: Likewise. Handle stupid system headers on SunOS. + Add casts for all __alloca calls. + * posix/glob.h: Recognize Windog by _WINDOWS32 not WIN32. + Declare additional GLOB_* constants also if _GNU_SOURCE is defined. + Patches by Paul D. Smith . + + * stdio-common/_itoa.c: Don't use relateive #include paths. + + * sysdeps/i386/fpu/bits/mathinline.h: Enable optimizations even for + gcc 2.7. + (atan): Loading 1.0 from memory does not pay off. + (asinh): Fix typo. + +1997-08-13 09:44 Philip Blundell + + * sysdeps/stub/accept.c: Use socklen_t where necessary. + * sysdeps/stub/bind.c: Likewise. + * sysdeps/stub/connect.c: Likewise. + * sysdeps/stub/getsockname.c: Likewise. + * sysdeps/stub/getsockopt.c: Likewise. + * sysdeps/stub/recvfrom.c: Likewise. + * sysdeps/stub/sendto.c: Likewise. + * sysdeps/stub/setsockopt.c: Likewise. + +1997-08-11 Andreas Schwab + + * io/ftw.c (object_compare): Avoid memcmp when comparing scalar + types. + +1997-08-12 Andreas Schwab + + * math/libm-test.c (cbrt_test): Add epsilon for long double to + `cbrt (-0.001)'. + +1997-08-11 Andreas Schwab + + * sysdeps/stub/bits/string.h: Fix comment. + +1997-08-01 Andreas Schwab + + * elf/Makefile (routines): Remove dl-version. + (dl-routines): Add it here instead. This removes dead code from + libc.so. + +1997-08-12 17:17 Wolfram Gloger + + * malloc/thread-m.h (thread_atfork, thread_atfork_static): New + macros to encapsulate pthread_atfork's functionality. + * malloc/malloc.c (ptmalloc_lock_all, ptmalloc_unlock_all): New + functions, registered via thread_atfork in the initialization + routine or via thread_atfork_static in global scope. This + ensures a consistent state of all locks across fork(). + +1997-08-11 23:00:32 1997 Mark Kettenis + + * login/programs/xtmp.c (compare_entry): + Partially undo patch made by Klaus Espenlaub. There + was no xtmp/utmp typo. Added comment to cclarify this. + * login/programs/xtmp.h: Likewise. + + * posix/getopt.c: Recognize Windog by _WINDOWS32 not WIN32. + Patch by Paul D. Smith . + +1997-08-12 13:51 Ulrich Drepper + + * login/getutid.c: Rename to __getutid and make getutid and getutxid + weak aliases. + Patch by ir. Mark M._Kettenis . + +1997-08-11 23:55 Ulrich Drepper + + * sysdeps/unix/sysv/linux/Makefile [subdir=misc] (sysdep_headers): + Add bits/mman.h. + +1997-08-11 08:51:21 1997 H.J. Lu + + * stdlib/fmtmsg.c (fmtmsg): Add static to + __libc_once_define macro. + + * libc.map (__progname_full, __progname): Added. + +1997-08-04 08:31 H.J. Lu + + * sysdeps/unix/sysv/linux/if_index.c (if_nametoindex): Return 0 + if SIOGIFINDEX is not defined. + (if_indextoname): Initialize "result" to NULL. + (if_nametoindex, if_nameindex): Fix ENOSYS setting. + +1997-08-11 11:58 Richard Henderson + + Sparc ISO C 9x exception handling: + * sysdeps/sparc/fpu/bits/mathdef.h: New file. + * sysdeps/sparc/fpu/fclrexcpt.c: New file. + * sysdeps/sparc/fpu/fegetenv.c: New file. + * sysdeps/sparc/fpu/fegetround.c: New file. + * sysdeps/sparc/fpu/feholdexcpt.c: New file. + * sysdeps/sparc/fpu/fesetenv.c: New file. + * sysdeps/sparc/fpu/fesetround.c: New file. + * sysdeps/sparc/fpu/feupdateenv.c: New file. + * sysdeps/sparc/fpu/fgetexcptflg.c: New file. + * sysdeps/sparc/fpu/fraiseexcpt.c: New file. + * sysdeps/sparc/fpu/fsetexcptflg.c: New file. + * sysdeps/sparc/fpu/ftestexcept.c: New file. + * sysdeps/sparc/sparc32/fpu/bits/fenv.h: New file. + * sysdeps/sparc/sparc64/fpu/bits/fenv.h: New file. + +1997-08-11 11:58 Richard Henderson + + Sparc64 merge: + * configure.in: Change up subdirectories, rename sparc8->sparcv8. + + * csu/Makefile: Nuke need-nopic-initfini bits. The problem was + that sparc64 ld did not recognize pic relocs at all. + + * elf/dl-deps.c: Include . + * elf/do-rel.h (elf_dynamic_do_rel): Take reloc address and size + directly instead of the DT names to get them from. + * elf/dynamic-link.h (_ELF_DYNAMIC_DO_RELOC): New macro distilled + from ELF_DYNAMIC_DO_REL{,A}. Define a second version that accounts + for the possibility that DT_RELA and DT_JMPPLT overlap, as such is + the case on the Sparc. + + * elf/elf.h: Stub out Elf64_Ver*, and make them the same as the + Elf32_Ver* bits. The linker does not even know to differentiate + between the word sizes. Someone should examine this and figure + out what the proper sizes of things should be for 64-bit hosts + before the sparc64 libraries are distributed. + + * shlib-versions: Rename sparc64 ld.so to not conflict with sparc32 + on the same machine. + + Move old sysdeps/sparc contents to sysdeps/sparc/sparc32, + rename sparc8 subdir to sparcv8, move sysdeps/sparc64 content to + sysdeps/sparc/sparc64. Same for sysdeps/unix/sysv/linux/sparc. + + * sysdeps/sparc/Implies: Do ieee754 here. + * sysdeps/sparc/configure.in: Move from sparc32/. + * sysdeps/sparc/sparc32/Implies: Do wordsize here. + * sysdeps/sparc/sparc64/Implies: Likewise. + + * sysdeps/sparc/sparc32/dl-machine.h (elf_machine_load_address): + Use uninitialized .got to find load address instead of AT_BASE, as + the later does not exist when running ld.so directly. + + * sysdeps/sparc/sparc32/fpu/fpu_control.h: Move from ../. + * sysdeps/sparc/sparc64/fpu/fpu_control.h: Likewise. + + * sysdeps/sparc/sparc32/udiv_qrnnd.S: Clean up PIC support. + + * sysdeps/sparc/sparc64/Makefile (sysdep_routines): Add s_finitel + and s_signbitl for stdio. + * sysdeps/sparc/sparc64/configure.in: Remove, we no longer need + nopic_initfini. + + * sysdeps/sparc/sparc64/bsd-_setjmp.S: Remove. + * sysdeps/sparc/sparc64/bsd-setjmp.S: Remove. + * sysdeps/unix/sysv/linux/sparc/sparc64/bsd-_setjmp.S: New empty file. + * sysdeps/unix/sysv/linux/sparc/sparc64/bsd-setjmp.S: New empty file. + * sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S: Add __longjmp alias. + * sysdeps/unix/sysv/linux/sparc/sparc64/setjmp.S: Add weak _setjmp + and setjmp entry points. + + * sysdeps/sparc/sparc64/dl-machine.h: Finish real implementation. + + * sysdeps/sparc/sparc64/elf/crtbegin.S: Add copyright, fix PIC. + * sysdeps/sparc/sparc64/elf/crtend.S: Likewise. + + * sysdeps/unix/sysv/linux/sparc/bits/sigaction.h (struct sigaction): + Fix sa_flags size for sparc64; add sa_restorer for kernel. + + * sysdeps/unix/sysv/linux/sparc/sparc64/brk.S: Fix PIC. + * sysdeps/unix/sysv/linux/sparc/sparc64/clone.S: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Likewise. + + * sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S: New file. + +1997-08-10 18:29:08 1997 Mark Kettenis + + * login/login.c (login): Check for correct return value of + utmpname. + +1997-08-11 16:49 Ulrich Drepper + + * time/tzset.c (__tzset_internal): Correctly handle TZ strings + following incorrect old POSIX specs. + Patch by Paul Eggert . + + * sysdeps/generic/bits/sigaction.h: Correct comment for SA_RESTART. + * sysdeps/unix/bsd/osf/bits/sigaction.h: Likewise. + * sysdeps/unix/sysv/linux/alpha/bits/sigaction.h: Likewise. + * sysdeps/unix/sysv/linux/bits/sigaction.h: Likewise. + * sysdeps/unix/sysv/linux/mips/bits/sigaction.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/bits/sigaction.h: Likewise. + * sysdeps/unix/sysv/minix/bits/sigaction.h: Likewise. + * sysdeps/unix/sysv/sysv4/bits/sigaction.h: Likewise. + Reported by NIIBE Yutaka . + +1997-08-09 Andreas Schwab + + * manual/math.texi: Define the macros @mul and @infinity and use + them to format the multiplication and infinity signs. + (FP Comparison Functions): Use @code, not @math, for C code + examples. + 1997-08-10 18:48 Ulrich Drepper * Makeconfig: Define build-programs to no if not set and $(config-os) @@ -49,7 +296,7 @@ * gmon/sys/gmon.h: Add prototype for write_profiling. - * elf/dl-profile.c: Add decsriptions and implement reading of + * elf/dl-profile.c: Add descriptions and implement reading of existing data in profiling file. * gmon/sys/gmon_out.h (GMON_SHOBJ_VERSION): New macro for shared lib profiling data. diff --git a/bits/sigaction.h b/bits/sigaction.h index e5f661db80..e89479bd1c 100644 --- a/bits/sigaction.h +++ b/bits/sigaction.h @@ -37,9 +37,9 @@ struct sigaction /* Bits in `sa_flags'. */ #ifdef __USE_BSD -#define SA_ONSTACK 0x1 /* Take signal on signal stack. */ -#define SA_RESTART 0x2 /* Don't restart syscall on signal return. */ -#define SA_DISABLE 0x4 /* Disable alternate signal stack. */ +# define SA_ONSTACK 0x1 /* Take signal on signal stack. */ +# define SA_RESTART 0x2 /* Restart syscall on signal return. */ +# define SA_DISABLE 0x4 /* Disable alternate signal stack. */ #endif #define SA_NOCLDSTOP 0x8 /* Don't send SIGCHLD when children stop. */ diff --git a/configure b/configure index e2f2b78b1c..cd07ec9b8f 100755 --- a/configure +++ b/configure @@ -826,9 +826,12 @@ m88???) base_machine=m88k machine=m88k/$machine ;; m88k) base_machine=m88k machine=m88k/m88100 ;; mips64*) base_machine=mips64 machine=mips/mips64/$machine ;; mips*) base_machine=mips machine=mips/$machine ;; -sparc[6789]) base_machine=sparc machine=sparc/$machine ;; -supersparc) base_machine=sparc machine=sparc/sparc8 ;; -sparc64) base_machine=sparc64 machine=sparc64/$machine ;; +sparc | sparcv[67]) + base_machine=sparc machine=sparc/sparc32 ;; +sparcv8 | supersparc | hypersparc) + base_machine=sparc machine=sparc/sparc32/sparcv8 ;; +sparc64 | ultrasparc) + base_machine=sparc machine=sparc/sparc64 ;; esac @@ -836,7 +839,7 @@ esac # This can take a while to compute. sysdep_dir=$srcdir/sysdeps echo $ac_n "checking sysdep dirs""... $ac_c" 1>&6 -echo "configure:840: checking sysdep dirs" >&5 +echo "configure:843: checking sysdep dirs" >&5 # Make sco3.2v4 become sco3.2.4 and sunos4.1.1_U1 become sunos4.1.1.U1. os="`echo $os | sed 's/\([0-9A-Z]\)[v_]\([0-9A-Z]\)/\1.\2/g'`" @@ -1037,7 +1040,7 @@ echo "$ac_t""sysdeps/generic sysdeps/stub" 1>&6 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:1041: checking for a BSD compatible install" >&5 +echo "configure:1044: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1091,7 +1094,7 @@ if test "$INSTALL" = "${srcdir}/install-sh -c"; then INSTALL='$(..)./install-sh -c' fi echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 -echo "configure:1095: checking whether ln -s works" >&5 +echo "configure:1098: checking whether ln -s works" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1116,7 +1119,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1120: checking for $ac_word" >&5 +echo "configure:1123: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_MSGFMT'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1149,7 +1152,7 @@ test -n "$MSGFMT" || MSGFMT=":" # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1153: checking for $ac_word" >&5 +echo "configure:1156: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1178,7 +1181,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1182: checking for $ac_word" >&5 +echo "configure:1185: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1226,7 +1229,7 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1230: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:1233: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1236,11 +1239,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1247: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1263,13 +1266,13 @@ else cross_linkable=yes fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1267: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "configure:1270: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1273: checking whether we are using GNU C" >&5 +echo "configure:1276: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1278,7 +1281,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1282: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1285: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1295,7 +1298,7 @@ if test $ac_cv_prog_gcc = yes; then yes; #endif EOF - if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1299: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1302: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then if test -z "$CFLAGS"; then CFLAGS="-g -O2" fi @@ -1307,7 +1310,7 @@ else fi echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:1311: checking build system type" >&5 +echo "configure:1314: checking build system type" >&5 build_alias=$build case "$build_alias" in @@ -1330,7 +1333,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1334: checking for $ac_word" >&5 +echo "configure:1337: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_BUILD_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1361,7 +1364,7 @@ done fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1365: checking how to run the C preprocessor" >&5 +echo "configure:1368: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -1376,13 +1379,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1386: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1389: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1393,13 +1396,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1403: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1406: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -1430,7 +1433,7 @@ fi # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1434: checking for $ac_word" >&5 +echo "configure:1437: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1461,7 +1464,7 @@ fi # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1465: checking for $ac_word" >&5 +echo "configure:1468: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1492,7 +1495,7 @@ if test -n "$ac_tool_prefix"; then # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1496: checking for $ac_word" >&5 +echo "configure:1499: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1527,7 +1530,7 @@ fi # Extract the first word of "bash", so it can be a program name with args. set dummy bash; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1531: checking for $ac_word" >&5 +echo "configure:1534: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_BASH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1568,7 +1571,7 @@ if test "$BASH" = no; then # Extract the first word of "ksh", so it can be a program name with args. set dummy ksh; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1572: checking for $ac_word" >&5 +echo "configure:1575: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_KSH'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1610,7 +1613,7 @@ fi echo $ac_n "checking for signed size_t type""... $ac_c" 1>&6 -echo "configure:1614: checking for signed size_t type" >&5 +echo "configure:1617: checking for signed size_t type" >&5 if eval "test \"`echo '$''{'libc_cv_signed_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1634,12 +1637,12 @@ EOF fi echo $ac_n "checking for libc-friendly stddef.h""... $ac_c" 1>&6 -echo "configure:1638: checking for libc-friendly stddef.h" >&5 +echo "configure:1641: checking for libc-friendly stddef.h" >&5 if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1661: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libc_cv_friendly_stddef=yes else @@ -1673,7 +1676,7 @@ override stddef.h = # The installed seems to be libc-friendly." fi echo $ac_n "checking whether we need to use -P to assemble .S files""... $ac_c" 1>&6 -echo "configure:1677: checking whether we need to use -P to assemble .S files" >&5 +echo "configure:1680: checking whether we need to use -P to assemble .S files" >&5 if eval "test \"`echo '$''{'libc_cv_need_minus_P'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1696,7 +1699,7 @@ asm-CPPFLAGS = -P # The assembler can't grok cpp's # line directives." fi echo $ac_n "checking for assembler global-symbol directive""... $ac_c" 1>&6 -echo "configure:1700: checking for assembler global-symbol directive" >&5 +echo "configure:1703: checking for assembler global-symbol directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_global_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1726,7 +1729,7 @@ EOF fi echo $ac_n "checking for .set assembler directive""... $ac_c" 1>&6 -echo "configure:1730: checking for .set assembler directive" >&5 +echo "configure:1733: checking for .set assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_set_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1760,7 +1763,7 @@ EOF fi echo $ac_n "checking for .symver assembler directive""... $ac_c" 1>&6 -echo "configure:1764: checking for .symver assembler directive" >&5 +echo "configure:1767: checking for .symver assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_symver_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1779,7 +1782,7 @@ fi echo "$ac_t""$libc_cv_asm_symver_directive" 1>&6 echo $ac_n "checking for ld --version-script""... $ac_c" 1>&6 -echo "configure:1783: checking for ld --version-script" >&5 +echo "configure:1786: checking for ld --version-script" >&5 if eval "test \"`echo '$''{'libc_cv_ld_version_script_option'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1798,7 +1801,7 @@ EOF if { ac_try='${CC-cc} $CFLAGS -shared -o conftest.so conftest.o -nostartfiles -nostdlib -Wl,--version-script,conftest.map - 1>&5'; { (eval echo configure:1802: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; + 1>&5'; { (eval echo configure:1805: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_ld_version_script_option=yes else @@ -1828,7 +1831,7 @@ fi if test $elf = yes; then echo $ac_n "checking for .previous assembler directive""... $ac_c" 1>&6 -echo "configure:1832: checking for .previous assembler directive" >&5 +echo "configure:1835: checking for .previous assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_previous_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1836,7 +1839,7 @@ else .section foo_section .previous EOF - if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1840: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_asm_previous_directive=yes else libc_cv_asm_previous_directive=no @@ -1852,7 +1855,7 @@ EOF else echo $ac_n "checking for .popsection assembler directive""... $ac_c" 1>&6 -echo "configure:1856: checking for .popsection assembler directive" >&5 +echo "configure:1859: checking for .popsection assembler directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_popsection_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1860,7 +1863,7 @@ else .pushsection foo_section .popsection EOF - if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1864: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1867: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_asm_popsection_directive=yes else libc_cv_asm_popsection_directive=no @@ -1880,12 +1883,12 @@ fi if test $elf != yes; then echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6 -echo "configure:1884: checking for .init and .fini sections" >&5 +echo "configure:1887: checking for .init and .fini sections" >&5 if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1901: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* libc_cv_have_initfini=yes else @@ -1919,19 +1922,19 @@ if test $elf = yes; then libc_cv_asm_underscores=no else echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6 -echo "configure:1923: checking for _ prefix on C symbol names" >&5 +echo "configure:1926: checking for _ prefix on C symbol names" >&5 if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1938: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* libc_cv_asm_underscores=yes else @@ -1958,7 +1961,7 @@ if test $elf = yes; then libc_cv_asm_weakext_directive=no else echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6 -echo "configure:1962: checking for assembler .weak directive" >&5 +echo "configure:1965: checking for assembler .weak directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1981,7 +1984,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6 if test $libc_cv_asm_weak_directive = no; then echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6 -echo "configure:1985: checking for assembler .weakext directive" >&5 +echo "configure:1988: checking for assembler .weakext directive" >&5 if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2018,7 +2021,7 @@ EOF fi echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6 -echo "configure:2022: checking for ld --no-whole-archive" >&5 +echo "configure:2025: checking for ld --no-whole-archive" >&5 if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2029,7 +2032,7 @@ __throw () {} EOF if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles -Wl,--no-whole-archive - -o conftest conftest.c 1>&5'; { (eval echo configure:2033: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + -o conftest conftest.c 1>&5'; { (eval echo configure:2036: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_ld_no_whole_archive=yes else libc_cv_ld_no_whole_archive=no @@ -2040,7 +2043,7 @@ fi echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6 echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6 -echo "configure:2044: checking for gcc -fno-exceptions" >&5 +echo "configure:2047: checking for gcc -fno-exceptions" >&5 if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2051,7 +2054,7 @@ __throw () {} EOF if { ac_try='${CC-cc} $CFLAGS -nostdlib -nostartfiles -fno-exceptions - -o conftest conftest.c 1>&5'; { (eval echo configure:2055: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + -o conftest conftest.c 1>&5'; { (eval echo configure:2058: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then libc_cv_gcc_no_exceptions=yes else libc_cv_gcc_no_exceptions=no @@ -2103,7 +2106,7 @@ if test "$uname" = "sysdeps/generic"; then fi echo $ac_n "checking OS release for uname""... $ac_c" 1>&6 -echo "configure:2107: checking OS release for uname" >&5 +echo "configure:2110: checking OS release for uname" >&5 if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2125,7 +2128,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6 uname_release="$libc_cv_uname_release" echo $ac_n "checking OS version for uname""... $ac_c" 1>&6 -echo "configure:2129: checking OS version for uname" >&5 +echo "configure:2132: checking OS version for uname" >&5 if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -2147,7 +2150,7 @@ else fi echo $ac_n "checking stdio selection""... $ac_c" 1>&6 -echo "configure:2151: checking stdio selection" >&5 +echo "configure:2154: checking stdio selection" >&5 case $stdio in libio) cat >> confdefs.h <<\EOF diff --git a/configure.in b/configure.in index ba8b413452..481a1e3003 100644 --- a/configure.in +++ b/configure.in @@ -159,9 +159,12 @@ m88???) base_machine=m88k machine=m88k/$machine ;; m88k) base_machine=m88k machine=m88k/m88100 ;; mips64*) base_machine=mips64 machine=mips/mips64/$machine ;; mips*) base_machine=mips machine=mips/$machine ;; -sparc[6789]) base_machine=sparc machine=sparc/$machine ;; -supersparc) base_machine=sparc machine=sparc/sparc8 ;; -sparc64) base_machine=sparc64 machine=sparc64/$machine ;; +sparc | sparcv[67]) + base_machine=sparc machine=sparc/sparc32 ;; +sparcv8 | supersparc | hypersparc) + base_machine=sparc machine=sparc/sparc32/sparcv8 ;; +sparc64 | ultrasparc) + base_machine=sparc machine=sparc/sparc64 ;; esac changequote([,])dnl AC_SUBST(base_machine) diff --git a/csu/Makefile b/csu/Makefile index 4c343541ae..6c8c87723b 100644 --- a/csu/Makefile +++ b/csu/Makefile @@ -52,42 +52,21 @@ CPPFLAGS += -DHAVE_INITFINI # "functions" _init and _fini to run the .init and .fini sections. crtstuff = crti crtn -# If we need separate startup code, require separate code. -ifeq ($(need-nopic-initfini),yes) -crtstuff += crtiS crtnS -endif - install-lib += $(crtstuff:=.o) extra-objs += $(crtstuff:=.o) -generated += $(crtstuff:=.S) initfini.s initfiniS.s align.h end.h +generated += $(crtstuff:=.S) initfini.s align.h end.h omit-deps += $(crtstuff) # Special rules for the building of crti.o and crtn.o $(objpfx)crt%.o: $(objpfx)crt%.S $(objpfx)defs.h - $(compile.S) -g0 -o $@ + $(compile.S) -g0 $(ASFLAGS-.so) -o $@ $(objpfx)initfini.s: initfini.c - $(compile.c) -g0 -S -finhibit-size-directive \ - $(no-exceptions) -o $@ - -$(objpfx)initfiniS.s: initfini.c $(compile.c) -g0 -S -fPIC -finhibit-size-directive \ $(no-exceptions) -o $@ -ifneq ($(need-nopic-initfini),yes) # We only have one kind of startup code files. Static binaries and # shared libraries are build using the PIC version. -$(objpfx)crti.S: $(objpfx)initfiniS.s - sed -n -e '1,/@HEADER_ENDS/p' \ - -e '/@_.*_PROLOG_BEGINS/,/@_.*_PROLOG_ENDS/p' \ - -e '/@TRAILER_BEGINS/,$$p' $< > $@ - -$(objpfx)crtn.S: $(objpfx)initfiniS.s - sed -n -e '1,/@HEADER_ENDS/p' \ - -e '/@_.*_EPILOG_BEGINS/,/@_.*_EPILOG_ENDS/p' \ - -e '/@TRAILER_BEGINS/,$$p' $< > $@ -else -# We have to build two versions, one with one without PIC code. $(objpfx)crti.S: $(objpfx)initfini.s sed -n -e '1,/@HEADER_ENDS/p' \ -e '/@_.*_PROLOG_BEGINS/,/@_.*_PROLOG_ENDS/p' \ @@ -98,17 +77,6 @@ $(objpfx)crtn.S: $(objpfx)initfini.s -e '/@_.*_EPILOG_BEGINS/,/@_.*_EPILOG_ENDS/p' \ -e '/@TRAILER_BEGINS/,$$p' $< > $@ -$(objpfx)crtiS.S: $(objpfx)initfiniS.s - sed -n -e '1,/@HEADER_ENDS/p' \ - -e '/@_.*_PROLOG_BEGINS/,/@_.*_PROLOG_ENDS/p' \ - -e '/@TRAILER_BEGINS/,$$p' $< > $@ - -$(objpfx)crtnS.S: $(objpfx)initfiniS.s - sed -n -e '1,/@HEADER_ENDS/p' \ - -e '/@_.*_EPILOG_BEGINS/,/@_.*_EPILOG_ENDS/p' \ - -e '/@TRAILER_BEGINS/,$$p' $< > $@ -endif - $(objpfx)defs.h: $(objpfx)initfini.s sed -n -e '/@TESTS_BEGIN/,/@TESTS_END/p' $< | \ awk -f defs.awk > $@ diff --git a/elf/Makefile b/elf/Makefile index 904099cbeb..f8dc9d0ef2 100644 --- a/elf/Makefile +++ b/elf/Makefile @@ -22,13 +22,13 @@ subdir := elf headers = elf.h bits/elfclass.h bits/dlfcn.h link.h dlfcn.h routines = $(dl-routines) dl-open dl-close dl-symbol dl-support \ - dl-version enbl-secure + enbl-secure # The core dynamic linking functions are in libc for the static and # profiled libraries. dl-routines = $(addprefix dl-,load cache lookup object reloc deps \ runtime error init fini debug misc \ - profile) + version profile) # But they are absent from the shared libc, because that code is in ld.so. elide-routines.so = $(dl-routines) dl-support enbl-secure diff --git a/elf/dl-deps.c b/elf/dl-deps.c index e990d6965b..3fbb3dbf92 100644 --- a/elf/dl-deps.c +++ b/elf/dl-deps.c @@ -21,7 +21,7 @@ #include #include #include - +#include #include /* Whether an shared object references one or more auxiliary objects diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c index 486e5bc608..a76e01dcb8 100644 --- a/elf/dl-minimal.c +++ b/elf/dl-minimal.c @@ -23,7 +23,7 @@ #include #include #include -#include "../stdio-common/_itoa.h" +#include /* Minimal `malloc' allocator for use while loading shared libraries. Only small blocks are allocated, and none are ever freed. */ @@ -43,9 +43,6 @@ malloc (size_t n) #define MAP_ANON 0 #endif - if (_dl_pagesize == 0) - _dl_pagesize = __getpagesize (); - if (alloc_end == 0) { /* Consume any unused space in the last page of our data segment. */ @@ -115,10 +112,16 @@ realloc (void *ptr, size_t n) int weak_function __sigjmp_save (sigjmp_buf env, int savemask) -{ env[0].__mask_was_saved = savemask; return 0; } +{ + env[0].__mask_was_saved = savemask; + return 0; +} void weak_function -longjmp (jmp_buf env, int val) { __longjmp (env[0].__jmpbuf, val); } +longjmp (jmp_buf env, int val) +{ + __longjmp (env[0].__jmpbuf, val); +} /* Define our own stub for the localization function used by strerror. English-only in the dynamic linker keeps it smaller. */ diff --git a/elf/do-rel.h b/elf/do-rel.h index 7f4b1259a2..2e0f26bd05 100644 --- a/elf/do-rel.h +++ b/elf/do-rel.h @@ -37,12 +37,11 @@ static inline void elf_dynamic_do_rel (struct link_map *map, - int reltag, int sztag, + ElfW(Addr) reladdr, ElfW(Addr) relsize, int lazy) { - const ElfW(Rel) *r - = (const ElfW(Rel) *) (map->l_addr + map->l_info[reltag]->d_un.d_ptr); - const ElfW(Rel) *end = &r[map->l_info[sztag]->d_un.d_val / sizeof *r]; + const ElfW(Rel) *r = (const ElfW(Rel) *)(map->l_addr + reladdr); + const ElfW(Rel) *end = (const ElfW(Rel) *)(map->l_addr + reladdr + relsize); if (lazy) /* Doing lazy PLT relocations; they need very little info. */ diff --git a/elf/dynamic-link.h b/elf/dynamic-link.h index 4a946f8ad8..64b5f78bc7 100644 --- a/elf/dynamic-link.h +++ b/elf/dynamic-link.h @@ -75,14 +75,75 @@ elf_get_dynamic_info (ElfW(Dyn) *dyn, duplicating their code. It cannot be done in a more general function because we must be able to completely inline. */ +/* On some machines, notably Sparc, DT_REL* includes DT_JMPREL in its + range. Note that according to the ELF spec, this is completely legal! + But conditionally define things so that on machines we know this will + not happen we do something more optimal. */ + +#ifdef ELF_MACHINE_PLTREL_OVERLAP +#define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, lazy) \ + do { \ + ElfW(Addr) r_addr, r_size, p_addr, p_size; \ + if ((map)->l_info[DT_##RELOC]) \ + { \ + r_addr = (map)->l_info[DT_##RELOC]->d_un.d_ptr; \ + r_size = (map)->l_info[DT_##RELOC##SZ]->d_un.d_val; \ + if ((map)->l_info[DT_PLTREL] && \ + (map)->l_info[DT_PLTREL]->d_un.d_val == DT_##RELOC) \ + { \ + p_addr = (map)->l_info[DT_JMPREL]->d_un.d_ptr; \ + p_size = (map)->l_info[DT_PLTRELSZ]->d_un.d_val; \ + if (r_addr <= p_addr && r_addr+r_size > p_addr) \ + { \ + ElfW(Addr) r2_addr, r2_size; \ + r2_addr = p_addr+p_size; \ + if (r2_addr < r_addr+r_size) \ + { \ + r2_size = r_addr+r_size - r2_addr; \ + elf_dynamic_do_##reloc ((map), r2_addr, r2_size, 0); \ + } \ + r_size = p_addr - r_addr; \ + } \ + } \ + \ + elf_dynamic_do_##reloc ((map), r_addr, r_size, 0); \ + if (p_addr) \ + elf_dynamic_do_##reloc ((map), p_addr, p_size, (lazy)); \ + } \ + else if ((map)->l_info[DT_PLTREL] && \ + (map)->l_info[DT_PLTREL]->d_un.d_val == DT_##RELOC) \ + { \ + p_addr = (map)->l_info[DT_JMPREL]->d_un.d_ptr; \ + p_size = (map)->l_info[DT_PLTRELSZ]->d_un.d_val; \ + \ + elf_dynamic_do_##reloc ((map), p_addr, p_size, (lazy)); \ + } \ + } while (0) +#else +#define _ELF_DYNAMIC_DO_RELOC(RELOC, reloc, map, lazy) \ + do { \ + if ((map)->l_info[DT_##RELOC]) \ + { \ + ElfW(Addr) r_addr, r_size; \ + r_addr = (map)->l_info[DT_##RELOC]->d_un.d_ptr; \ + r_size = (map)->l_info[DT_##RELOC##SZ]->d_un.d_val; \ + elf_dynamic_do_##reloc ((map), r_addr, r_size, 0); \ + } \ + if ((map)->l_info[DT_PLTREL] && \ + (map)->l_info[DT_PLTREL]->d_un.d_val == DT_##RELOC) \ + { \ + ElfW(Addr) p_addr, p_size; \ + p_addr = (map)->l_info[DT_JMPREL]->d_un.d_ptr; \ + p_size = (map)->l_info[DT_PLTRELSZ]->d_un.d_val; \ + elf_dynamic_do_##reloc ((map), p_addr, p_size, (lazy)); \ + } \ + } while (0) +#endif + #if ! ELF_MACHINE_NO_REL #include "do-rel.h" -#define ELF_DYNAMIC_DO_REL(map, lazy) \ - if ((map)->l_info[DT_REL]) \ - elf_dynamic_do_rel ((map), DT_REL, DT_RELSZ, 0); \ - if ((map)->l_info[DT_PLTREL] && \ - (map)->l_info[DT_PLTREL]->d_un.d_val == DT_REL) \ - elf_dynamic_do_rel ((map), DT_JMPREL, DT_PLTRELSZ, (lazy)); +#define ELF_DYNAMIC_DO_REL(map, lazy) \ + _ELF_DYNAMIC_DO_RELOC (REL, rel, map, lazy) #else #define ELF_DYNAMIC_DO_REL(map, lazy) /* Nothing to do. */ #endif @@ -90,12 +151,8 @@ elf_get_dynamic_info (ElfW(Dyn) *dyn, #if ! ELF_MACHINE_NO_RELA #define DO_RELA #include "do-rel.h" -#define ELF_DYNAMIC_DO_RELA(map, lazy) \ - if ((map)->l_info[DT_RELA]) \ - elf_dynamic_do_rela ((map), DT_RELA, DT_RELASZ, 0); \ - if ((map)->l_info[DT_PLTREL] && \ - (map)->l_info[DT_PLTREL]->d_un.d_val == DT_RELA) \ - elf_dynamic_do_rela ((map), DT_JMPREL, DT_PLTRELSZ, (lazy)); +#define ELF_DYNAMIC_DO_RELA(map, lazy) \ + _ELF_DYNAMIC_DO_RELOC (RELA, rela, map, lazy) #else #define ELF_DYNAMIC_DO_RELA(map, lazy) /* Nothing to do. */ #endif diff --git a/elf/elf.h b/elf/elf.h index 02d092ffac..e78bcb5102 100644 --- a/elf/elf.h +++ b/elf/elf.h @@ -505,6 +505,7 @@ typedef struct entry */ } Elf32_Verdef; +#if 0 /* XXX We have no information what types should be used for 64 bit architectures. What is following is only an intelligent guess. */ typedef struct @@ -518,6 +519,11 @@ typedef struct Elf64_Word vd_next; /* Offset in bytes to next verdef entry */ } Elf64_Verdef; +#else +/* The linker doesn't even parameterize the version info swapping + routines. I wonder if it should or is this good enough. */ +typedef Elf32_Verdef Elf64_Verdef; +#endif /* Legal values for vd_version (version revision). */ #define VER_DEF_NONE 0 /* No version */ @@ -537,6 +543,7 @@ typedef struct entry */ } Elf32_Verdaux; +#if 0 /* XXX We have no information what types should be used for 64 bit architectures. What is following is only an intelligent guess. */ typedef struct @@ -545,6 +552,10 @@ typedef struct Elf64_Word vda_next; /* Offset in bytes to next verdaux entry */ } Elf64_Verdaux; +#else +/* The linker doesn't even parameterize this -- should it? */ +typedef Elf32_Verdaux Elf64_Verdaux; +#endif /* Version dependency section. */ @@ -559,6 +570,7 @@ typedef struct entry */ } Elf32_Verneed; +#if 0 /* XXX We have no information what types should be used for 64 bit architectures. What is following is only an intelligent guess. */ typedef struct @@ -571,6 +583,10 @@ typedef struct Elf64_Word vn_next; /* Offset in bytes to next verneed entry */ } Elf64_Verneed; +#else +/* The linker doesn't even parameterize this -- should it? */ +typedef Elf32_Verneed Elf64_Verneed; +#endif /* Legal values for vn_version (version revision). */ #define VER_NEED_NONE 0 /* No version */ @@ -589,6 +605,7 @@ typedef struct entry */ } Elf32_Vernaux; +#if 0 /* XXX We have no information what types should be used for 64 bit architectures. What is following is only an intelligent guess. */ typedef struct @@ -600,6 +617,10 @@ typedef struct Elf64_Word vna_next; /* Offset in bytes to next vernaux entry */ } Elf64_Vernaux; +#else +/* The linker doesn't even parameterize these -- should it? */ +typedef Elf32_Vernaux Elf64_Vernaux; +#endif /* Legal values for vna_flags. */ #define VER_FLG_WEAK 0x2 /* Weak verison identifier */ @@ -732,6 +753,36 @@ typedef struct #define R_SPARC_RELATIVE 22 /* Adjust by program base */ #define R_SPARC_UA32 23 /* Direct 32 bit unaligned */ +/* Additional Sparc64 relocs. */ + +#define R_SPARC_PLT32 24 /* Direct 32 bit ref to PLT entry */ +#define R_SPARC_HIPLT22 25 /* High 22 bit PLT entry */ +#define R_SPARC_LOPLT10 26 /* Truncated 10 bit PLT entry */ +#define R_SPARC_PCPLT32 27 /* PC rel 32 bit ref to PLT entry */ +#define R_SPARC_PCPLT22 28 /* PC rel high 22 bit PLT entry */ +#define R_SPARC_PCPLT10 29 /* PC rel trunc 10 bit PLT entry */ +#define R_SPARC_10 30 /* Direct 10 bit */ +#define R_SPARC_11 31 /* Direct 11 bit */ +#define R_SPARC_64 32 /* Direct 64 bit */ +#define R_SPARC_OLO10 33 /* ?? */ +#define R_SPARC_HH22 34 /* Top 22 bits of direct 64 bit */ +#define R_SPARC_HM10 35 /* High middle 10 bits of ... */ +#define R_SPARC_LM22 36 /* Low middle 22 bits of ... */ +#define R_SPARC_PC_HH22 37 /* Top 22 bits of pc rel 64 bit */ +#define R_SPARC_PC_HM10 38 /* High middle 10 bit of ... */ +#define R_SPARC_PC_LM22 39 /* Low miggle 22 bits of ... */ +#define R_SPARC_WDISP16 40 /* PC relative 16 bit shifted */ +#define R_SPARC_WDISP19 41 /* PC relative 19 bit shifted */ +#define R_SPARC_GLOB_JMP 42 /* ?? */ +#define R_SPARC_7 43 /* Direct 7 bit */ +#define R_SPARC_5 44 /* Direct 5 bit */ +#define R_SPARC_6 45 /* Direct 6 bit */ + +/* For Sparc64, legal values for d_tag of Elf64_Dyn. */ + +#define DT_SPARC_PLTFMT 0x70000001 /* .plt format version/type */ +#define DT_SPARC_NUM 2 + /* MIPS R3000 specific definitions. */ /* Legal values for e_flags field of Elf32_Ehdr. */ diff --git a/elf/link.h b/elf/link.h index 38a7c88d9a..a90854a2ea 100644 --- a/elf/link.h +++ b/elf/link.h @@ -444,6 +444,10 @@ extern void _dl_start_profile (struct link_map *map, const char *output_dir); /* The actual functions used to keep book on the calls. */ extern void _dl_mcount (ElfW(Addr) frompc, ElfW(Addr) selfpc); + +/* Show the member of the auxiliry aray passed up from the kernel. */ +extern void _dl_show_auxv (void); + __END_DECLS #endif /* link.h */ diff --git a/elf/rtld.c b/elf/rtld.c index 726463c882..c3d81e198f 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -261,6 +261,11 @@ dl_main (const ElfW(Phdr) *phdr, char *file; int has_interp = 0; + /* Test whether we want to see the content of the auxiliary array passed + up from the kernel. */ + if (getenv ("LD_SHOW_AUXV") != NULL) + _dl_show_auxv (); + mode = getenv ("LD_TRACE_LOADED_OBJECTS") != NULL ? trace : normal; _dl_verbose = *(getenv ("LD_WARN") ?: "") == '\0' ? 0 : 1; diff --git a/io/ftw.c b/io/ftw.c index a89055e8c7..8cccbacd37 100644 --- a/io/ftw.c +++ b/io/ftw.c @@ -105,10 +105,10 @@ object_compare (const void *p1, const void *p2) accidentally compare `holes' in the structure. */ const struct known_object *kp1 = p1, *kp2 = p2; int cmp1; - cmp1 = memcmp(&kp1->dev, &kp2->dev, sizeof(kp1->dev)); + cmp1 = (kp1->dev > kp2->dev) - (kp1->dev < kp2->dev); if (cmp1 != 0) return cmp1; - return memcmp (&kp1->ino, &kp2->ino, sizeof (kp1->ino)); + return (kp1->ino > kp2->ino) - (kp1->ino < kp2->ino); } diff --git a/libc.map b/libc.map index a3567b674e..e503c9c060 100644 --- a/libc.map +++ b/libc.map @@ -11,7 +11,8 @@ GLIBC_2.0 { _nl_current_LC_COLLATE; __collate_element_hash; __collate_element_strings; __collate_symbol_classes; __collate_symbol_hash; __collate_symbol_strings; - _obstack; + _obstack; _libio_using_thunks; + __progname_full; __progname; # helper functions __errno_location; __libc_init_first; __h_errno_location; @@ -84,6 +85,7 @@ GLIBC_2.0 { _IO_str_underflow; _IO_str_init_static; _IO_str_init_readonly; _IO_str_seekoff; _IO_str_pbackfail; _IO_list_all; _IO_file_jumps; _IO_peekc_locked; + __vsscanf; __vfscanf; __vsnprintf; _rpc_dtablesize; _null_auth; _seterr_reply; __res_randomid; diff --git a/libio/iofdopen.c b/libio/iofdopen.c index 67c629c583..4ec9a1cbce 100644 --- a/libio/iofdopen.c +++ b/libio/iofdopen.c @@ -128,4 +128,6 @@ _IO_fdopen (fd, mode) return (_IO_FILE *) &new_f->fp; } +#ifdef weak_alias weak_alias (_IO_fdopen, fdopen) +#endif diff --git a/libio/iofflush.c b/libio/iofflush.c index 96cb49b2dc..082988875f 100644 --- a/libio/iofflush.c +++ b/libio/iofflush.c @@ -43,4 +43,6 @@ _IO_fflush (fp) } } +#ifdef weak_alias weak_alias (_IO_fflush, fflush) +#endif diff --git a/libio/iofgetpos.c b/libio/iofgetpos.c index 53a359ee76..9682af96ae 100644 --- a/libio/iofgetpos.c +++ b/libio/iofgetpos.c @@ -49,4 +49,6 @@ _IO_fgetpos (fp, posp) return 0; } +#ifdef weak_alias weak_alias (_IO_fgetpos, fgetpos) +#endif diff --git a/libio/iofgets.c b/libio/iofgets.c index 7a1044f801..c8ec289bd1 100644 --- a/libio/iofgets.c +++ b/libio/iofgets.c @@ -50,4 +50,6 @@ _IO_fgets (buf, n, fp) return result; } +#ifdef weak_alias weak_alias (_IO_fgets, fgets) +#endif diff --git a/libio/iofopen.c b/libio/iofopen.c index cea2415218..acf034cd22 100644 --- a/libio/iofopen.c +++ b/libio/iofopen.c @@ -58,4 +58,6 @@ _IO_fopen (filename, mode) return NULL; } +#ifdef weak_alias weak_alias (_IO_fopen, fopen) +#endif diff --git a/libio/iofputs.c b/libio/iofputs.c index 9ce3caa194..7c76ac6336 100644 --- a/libio/iofputs.c +++ b/libio/iofputs.c @@ -43,4 +43,6 @@ _IO_fputs (str, fp) return result; } +#ifdef weak_alias weak_alias (_IO_fputs, fputs) +#endif diff --git a/libio/iofread.c b/libio/iofread.c index 5fed0d8d7d..ad7e4845a8 100644 --- a/libio/iofread.c +++ b/libio/iofread.c @@ -42,4 +42,7 @@ _IO_fread (buf, size, count, fp) _IO_cleanup_region_end (1); return bytes_requested == bytes_read ? count : bytes_read / size; } + +#ifdef weak_alias weak_alias (_IO_fread, fread) +#endif diff --git a/libio/iofsetpos.c b/libio/iofsetpos.c index 2d29fa7cbb..2f71d79708 100644 --- a/libio/iofsetpos.c +++ b/libio/iofsetpos.c @@ -50,4 +50,6 @@ _IO_fsetpos (fp, posp) return result; } +#ifdef weak_alias weak_alias (_IO_fsetpos, fsetpos) +#endif diff --git a/libio/ioftell.c b/libio/ioftell.c index 7fe18f890b..37156bb22c 100644 --- a/libio/ioftell.c +++ b/libio/ioftell.c @@ -47,4 +47,6 @@ _IO_ftell (fp) return _IO_pos_as_off (pos); } +#ifdef weak_alias weak_alias (_IO_ftell, ftell) +#endif diff --git a/libio/iofwrite.c b/libio/iofwrite.c index 542fa77f2e..3f098e078e 100644 --- a/libio/iofwrite.c +++ b/libio/iofwrite.c @@ -48,4 +48,6 @@ _IO_fwrite (buf, size, count, fp) return written/size; } +#ifdef weak_alias weak_alias (_IO_fwrite, fwrite) +#endif diff --git a/libio/iogetdelim.c b/libio/iogetdelim.c index b1662e4c90..8e87511c12 100644 --- a/libio/iogetdelim.c +++ b/libio/iogetdelim.c @@ -118,5 +118,7 @@ unlock_return: return result; } +#ifdef weak_alias weak_alias (_IO_getdelim, __getdelim) weak_alias (_IO_getdelim, getdelim) +#endif diff --git a/libio/iogets.c b/libio/iogets.c index 0e87504107..ed078763c4 100644 --- a/libio/iogets.c +++ b/libio/iogets.c @@ -61,7 +61,9 @@ unlock_return: return retval; } +#ifdef weak_alias weak_alias (_IO_gets, gets) +#endif #ifdef _LIBC link_warning (gets, "the `gets' function is dangerous and should not be used.") diff --git a/libio/iopopen.c b/libio/iopopen.c index 5703c99d47..0768321281 100644 --- a/libio/iopopen.c +++ b/libio/iopopen.c @@ -177,7 +177,9 @@ DEFUN(_IO_popen, (command, mode), return NULL; } +#ifdef strong_alias strong_alias (_IO_popen, popen); +#endif int DEFUN(_IO_proc_close, (fp), diff --git a/libio/ioputs.c b/libio/ioputs.c index c35ceb8015..fcc296a45c 100644 --- a/libio/ioputs.c +++ b/libio/ioputs.c @@ -41,4 +41,7 @@ _IO_puts (str) _IO_cleanup_region_end (1); return result; } + +#ifdef weak_alias weak_alias (_IO_puts, puts) +#endif diff --git a/libio/iosetbuffer.c b/libio/iosetbuffer.c index 09751afdab..8921887985 100644 --- a/libio/iosetbuffer.c +++ b/libio/iosetbuffer.c @@ -40,4 +40,6 @@ _IO_setbuffer (fp, buf, size) _IO_cleanup_region_end (1); } +#ifdef weak_alias weak_alias (_IO_setbuffer, setbuffer) +#endif diff --git a/libio/iosetvbuf.c b/libio/iosetvbuf.c index 0bd6025128..3e105f3b79 100644 --- a/libio/iosetvbuf.c +++ b/libio/iosetvbuf.c @@ -94,4 +94,6 @@ unlock_return: return result; } +#ifdef weak_alias weak_alias (_IO_setvbuf, setvbuf) +#endif diff --git a/libio/ioungetc.c b/libio/ioungetc.c index d36b07a394..866cba642d 100644 --- a/libio/ioungetc.c +++ b/libio/ioungetc.c @@ -40,4 +40,6 @@ _IO_ungetc (c, fp) return result; } +#ifdef weak_alias weak_alias (_IO_ungetc, ungetc) +#endif diff --git a/libio/iovsprintf.c b/libio/iovsprintf.c index 099863c2f1..25bae66d93 100644 --- a/libio/iovsprintf.c +++ b/libio/iovsprintf.c @@ -51,4 +51,6 @@ _IO_vsprintf (string, format, args) return ret; } +#ifdef weak_alias weak_alias (_IO_vsprintf, vsprintf) +#endif diff --git a/libio/iovsscanf.c b/libio/iovsscanf.c index c0c2ef0bf1..e9376fe03d 100644 --- a/libio/iovsscanf.c +++ b/libio/iovsscanf.c @@ -44,5 +44,8 @@ DEFUN(_IO_vsscanf, (string, format, args), _IO_cleanup_region_end (1); return ret; } + +#ifdef weak_alias weak_alias (_IO_vsscanf, __vsscanf) weak_alias (_IO_vsscanf, vsscanf) +#endif diff --git a/login/getutid.c b/login/getutid.c index d3d3b5d068..98e8e4adc3 100644 --- a/login/getutid.c +++ b/login/getutid.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -25,7 +25,7 @@ static struct utmp buffer; struct utmp * -getutid (const struct utmp *id) +__getutid (const struct utmp *id) { struct utmp *result; @@ -34,3 +34,5 @@ getutid (const struct utmp *id) return result; } +weak_alias (__getutid, getutid) +weak_alias (__getutid, getutxid) diff --git a/login/login.c b/login/login.c index 075ef15056..4d08dbb472 100644 --- a/login/login.c +++ b/login/login.c @@ -115,7 +115,7 @@ login (const struct utmp *ut) strncpy (copy.ut_line, ttyp, UT_LINESIZE); /* Tell that we want to use the UTMP file. */ - if (utmpname (_PATH_UTMP) != 0) + if (utmpname (_PATH_UTMP) == 0) { struct utmp *old; diff --git a/login/programs/xtmp.c b/login/programs/xtmp.c index 105145b01d..e27e1a8a86 100644 --- a/login/programs/xtmp.c +++ b/login/programs/xtmp.c @@ -85,30 +85,37 @@ utmp_to_xtmp (const struct utmp *utmp, struct xtmp *xtmp) /* Compare an old style entry XTMP with a new style entry UTMP. The function returns 1 if the information that is in both old and new - style entries is identical. Otherwise this function returns 0. */ + style entries is identical. Otherwise this function returns 0. + + The type of the argument `xtmp' is `struct utmp *', not `struct + utmp *'. This is intentional! We convert from and to `struct + xtmp' directly when we read and write an old style entry. But + since XTMP is converted from an old style entry, we compare only + those elements of the structure that are common to both the new and + the old style entry. */ int -compare_entry (const struct xtmp *xtmp, const struct utmp *utmp) +compare_entry (const struct utmp *xtmp, const struct utmp *utmp) { return ( #if _HAVE_XT_TYPE - 0 - xtmp->xt_type == utmp->ut_type + xtmp->ut_type == utmp->ut_type #endif #if _HAVE_XT_PID - 0 - && xtmp->xt_pid == utmp->ut_pid + && xtmp->ut_pid == utmp->ut_pid #endif - && !strncmp (xtmp->xt_line, utmp->ut_line, XT_LINESIZE - 1) + && !strncmp (xtmp->ut_line, utmp->ut_line, XT_LINESIZE - 1) #if _HAVE_XT_ID - 0 - && !strncmp (xtmp->xt_id, utmp->ut_id, sizeof utmp->ut_id) + && !strncmp (xtmp->ut_id, utmp->ut_id, sizeof utmp->ut_id) #endif #if _HAVE_UT_TV - 0 - && xtmp->xt_time == utmp->ut_tv.tv_sec + && xtmp->ut_tv.tv_sec == utmp->ut_tv.tv_sec #else - && xtmp->xt_time == utmp->ut_time + && xtmp->ut_time == utmp->ut_time #endif - && !strncmp (xtmp->xt_user, utmp->ut_user, XT_NAMESIZE) + && !strncmp (xtmp->ut_user, utmp->ut_user, XT_NAMESIZE) #if _HAVE_XT_HOST - 0 - && !strncmp (xtmp->xt_host, utmp->ut_host, XT_HOSTSIZE - 1) + && !strncmp (xtmp->ut_host, utmp->ut_host, XT_HOSTSIZE - 1) #endif - && xtmp->xt_addr == utmp->ut_addr); + && xtmp->ut_addr == utmp->ut_addr); } diff --git a/login/programs/xtmp.h b/login/programs/xtmp.h index 508993248a..25949ef6dd 100644 --- a/login/programs/xtmp.h +++ b/login/programs/xtmp.h @@ -20,7 +20,6 @@ #ifndef _XTMP_H #define _XTMP_H 1 -#include #include #include @@ -50,7 +49,7 @@ struct xtmp extern void xtmp_to_utmp (const struct xtmp *xtmp, struct utmp *utmp); extern void utmp_to_xtmp (const struct utmp *utmp, struct xtmp *xtmp); -extern int compare_entry (const struct xtmp *xtmp, +extern int compare_entry (const struct utmp *xtmp, const struct utmp *utmp); #endif /* xtmp.h */ diff --git a/malloc/malloc.c b/malloc/malloc.c index 1a5c886b6c..fb51483279 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -1185,6 +1185,8 @@ static Void_t* realloc_check(Void_t* oldmem, size_t bytes); static Void_t* memalign_check(size_t alignment, size_t bytes); static Void_t* malloc_starter(size_t sz); static void free_starter(Void_t* mem); +static Void_t* malloc_atfork(size_t sz); +static void free_atfork(Void_t* mem); #endif #else @@ -1204,6 +1206,8 @@ static Void_t* realloc_check(); static Void_t* memalign_check(); static Void_t* malloc_starter(); static void free_starter(); +static Void_t* malloc_atfork(); +static void free_atfork(); #endif #endif @@ -1510,6 +1514,58 @@ static unsigned long max_mmapped_mem = 0; int __malloc_initialized = 0; +/* The following two functions are registered via thread_atfork() to + make sure that the mutexes remain in a consistent state in the + fork()ed version of a thread. Also adapt the malloc and free hooks + temporarily, because the `atfork' handler mechanism may use + malloc/free internally (e.g. in LinuxThreads). */ + +#if defined(_LIBC) || defined(MALLOC_HOOKS) +static __malloc_ptr_t (*save_malloc_hook) __MALLOC_P ((size_t __size)); +static void (*save_free_hook) __MALLOC_P ((__malloc_ptr_t __ptr)); +static Void_t* save_arena; +#endif + +static void +ptmalloc_lock_all __MALLOC_P((void)) +{ + arena *ar_ptr; + + (void)mutex_lock(&list_lock); + for(ar_ptr = &main_arena;;) { + (void)mutex_lock(&ar_ptr->mutex); + ar_ptr = ar_ptr->next; + if(ar_ptr == &main_arena) break; + } +#if defined(_LIBC) || defined(MALLOC_HOOKS) + save_malloc_hook = __malloc_hook; + save_free_hook = __free_hook; + __malloc_hook = malloc_atfork; + __free_hook = free_atfork; + /* Only the current thread may perform malloc/free calls now. */ + tsd_getspecific(arena_key, save_arena); + tsd_setspecific(arena_key, (Void_t*)0); +#endif +} + +static void +ptmalloc_unlock_all __MALLOC_P((void)) +{ + arena *ar_ptr; + +#if defined(_LIBC) || defined(MALLOC_HOOKS) + tsd_setspecific(arena_key, save_arena); + __malloc_hook = save_malloc_hook; + __free_hook = save_free_hook; +#endif + for(ar_ptr = &main_arena;;) { + (void)mutex_unlock(&ar_ptr->mutex); + ar_ptr = ar_ptr->next; + if(ar_ptr == &main_arena) break; + } + (void)mutex_unlock(&list_lock); +} + /* Initialization routine. */ #if defined(_LIBC) #if 0 @@ -1524,8 +1580,6 @@ ptmalloc_init __MALLOC_P((void)) #endif { #if defined(_LIBC) || defined(MALLOC_HOOKS) - __malloc_ptr_t (*save_malloc_hook) __MALLOC_P ((size_t __size)); - void (*save_free_hook) __MALLOC_P ((__malloc_ptr_t __ptr)); const char* s; #endif @@ -1550,6 +1604,7 @@ ptmalloc_init __MALLOC_P((void)) mutex_init(&list_lock); tsd_key_create(&arena_key, NULL); tsd_setspecific(arena_key, (Void_t *)&main_arena); + thread_atfork(ptmalloc_lock_all, ptmalloc_unlock_all, ptmalloc_unlock_all); #endif #if defined(_LIBC) || defined(MALLOC_HOOKS) if((s = getenv("MALLOC_TRIM_THRESHOLD_"))) @@ -1572,6 +1627,12 @@ ptmalloc_init __MALLOC_P((void)) #endif } +/* There are platforms (e.g. Hurd) with a link-time hook mechanism. */ +#ifdef thread_atfork_static +thread_atfork_static(ptmalloc_lock_all, ptmalloc_unlock_all, \ + ptmalloc_unlock_all) +#endif + #if defined(_LIBC) || defined(MALLOC_HOOKS) /* Hooks for debugging versions. The initial hooks just call the @@ -4240,6 +4301,65 @@ free_starter(mem) Void_t* mem; chunk_free(&main_arena, p); } +/* The following hooks are used while the `atfork' handling mechanism + is active. */ + +static Void_t* +#if __STD_C +malloc_atfork(size_t sz) +#else +malloc_atfork(sz) size_t sz; +#endif +{ + Void_t *vptr = NULL; + + tsd_getspecific(arena_key, vptr); + if(!vptr) { + mchunkptr victim = chunk_alloc(&main_arena, request2size(sz)); + return victim ? chunk2mem(victim) : 0; + } else { + /* Suspend the thread until the `atfork' handlers have completed. + By that time, the hooks will have been reset as well, so that + mALLOc() can be used again. */ + (void)mutex_lock(&list_lock); + (void)mutex_unlock(&list_lock); + return mALLOc(sz); + } +} + +static void +#if __STD_C +free_atfork(Void_t* mem) +#else +free_atfork(mem) Void_t* mem; +#endif +{ + Void_t *vptr = NULL; + arena *ar_ptr; + mchunkptr p; /* chunk corresponding to mem */ + + if (mem == 0) /* free(0) has no effect */ + return; + + p = mem2chunk(mem); + +#if HAVE_MMAP + if (chunk_is_mmapped(p)) /* release mmapped memory. */ + { + munmap_chunk(p); + return; + } +#endif + + ar_ptr = arena_for_ptr(p); + tsd_getspecific(arena_key, vptr); + if(vptr) + (void)mutex_lock(&ar_ptr->mutex); + chunk_free(ar_ptr, p); + if(vptr) + (void)mutex_unlock(&ar_ptr->mutex); +} + #endif /* defined(_LIBC) || defined(MALLOC_HOOKS) */ diff --git a/malloc/thread-m.h b/malloc/thread-m.h index 9afd058ccb..24d95dfb31 100644 --- a/malloc/thread-m.h +++ b/malloc/thread-m.h @@ -26,6 +26,8 @@ #ifndef _THREAD_M_H #define _THREAD_M_H +#undef thread_atfork_static + #if defined(_LIBC) /* The GNU C library, a special case of Posix threads */ #include @@ -65,6 +67,9 @@ static Void_t *malloc_key_data; #define mutex_unlock(m) \ (__pthread_mutex_unlock != NULL ? __pthread_mutex_unlock (m) : 0) +#define thread_atfork(prepare, parent, child) \ + (__pthread_atfork != NULL ? __pthread_atfork(prepare, parent, child) : 0) + #elif defined(MUTEX_INITIALIZER) /* Assume hurd, with cthreads */ @@ -95,6 +100,12 @@ static int tsd_keys_alloced = 0; #define tsd_getspecific(key, vptr) \ ((vptr) = (void *)*__hurd_threadvar_location (_HURD_THREADVAR_MALLOC)) +#define thread_atfork(prepare, parent, child) do {} while(0) +#define thread_atfork_static(prepare, parent, child) \ + text_set_element(_hurd_fork_prepare_hook, prepare); \ + text_set_element(_hurd_fork_parent_hook, parent); \ + text_set_element(_hurd_fork_child_hook, child); + /* No we're *not* using pthreads. */ #define __pthread_initialize ((void (*)(void))0) @@ -126,6 +137,10 @@ typedef pthread_key_t tsd_key_t; #define tsd_setspecific(key, data) pthread_setspecific(key, data) #define tsd_getspecific(key, vptr) (vptr = pthread_getspecific(key)) +/* at fork */ +#define thread_atfork(prepare, parent, child) \ + pthread_atfork(prepare, parent, child) + #elif USE_THR /* Solaris threads */ #include @@ -147,6 +162,8 @@ typedef void *tsd_key_t[256]; #define tsd_setspecific(key, data) (key[(unsigned)thr_self() % 256] = (data)) #define tsd_getspecific(key, vptr) (vptr = key[(unsigned)thr_self() % 256]) +#define thread_atfork(prepare, parent, child) do {} while(0) + #elif USE_SPROC /* SGI sproc() threads */ #include @@ -170,6 +187,8 @@ int tsd_key_next; #define tsd_setspecific(key, data) (((void **)(&PRDA->usr_prda))[key] = data) #define tsd_getspecific(key, vptr) (vptr = ((void **)(&PRDA->usr_prda))[key]) +#define thread_atfork(prepare, parent, child) do {} while(0) + #else /* no _LIBC or USE_... are defined */ #define NO_THREADS @@ -193,6 +212,8 @@ typedef void *tsd_key_t; #define tsd_setspecific(key, data) do {} while(0) #define tsd_getspecific(key, vptr) (vptr = NULL) +#define thread_atfork(prepare, parent, child) do {} while(0) + #endif /* defined(NO_THREADS) */ #endif /* !defined(_THREAD_M_H) */ diff --git a/manual/creature.texi b/manual/creature.texi index 5eb665d2ef..edac770f6c 100644 --- a/manual/creature.texi +++ b/manual/creature.texi @@ -73,6 +73,7 @@ included as well as the @w{ISO C}, POSIX.1, POSIX.2, and X/Open material. @comment (none) @comment XOPEN @defvr Macro _XOPEN_SOURCE +@defvrx Macro _XOPEN_SOURCE_EXTENDED If you define this macro, functionality described in the X/Open Portability Guide is included. This is a superset of the POSIX.1 and POSIX.2 functionality and in fact @code{_POSIX_SOURCE} and diff --git a/manual/math.texi b/manual/math.texi index 71b365151f..a703e890a2 100644 --- a/manual/math.texi +++ b/manual/math.texi @@ -1,10 +1,25 @@ @c We need some definitions here. -@iftex -@set TEXFORMULAS -@end iftex @ifhtml @set cdot · @end ifhtml +@iftex +@set cdot @cdot +@end iftex +@ifclear cdot +@set cdot x +@end ifclear +@iftex +@set infty @infty +@end iftex +@ifclear infty +@set infty oo +@end ifclear +@macro mul +@value{cdot} +@end macro +@macro infinity +@value{infty} +@end macro @node Mathematics, Arithmetic, Low-Level Terminal Interface, Top @chapter Mathematics @@ -53,7 +68,7 @@ in case of double using @code{double} is a good compromise. @cindex domain error Many of the functions listed in this chapter are defined mathematically over a domain that is only a subset of real numbers. For example, the -@code{acos} function is defined over the domain between @code{-1} and +@code{acos} function is defined over the domain between @code{@minus{}1} and @code{1}. If you pass an argument to one of these functions that is outside the domain over which it is defined, the function sets @code{errno} to @code{EDOM} to indicate a @dfn{domain error}. On @@ -73,7 +88,7 @@ be representable as a floating point number. If magnitude of the correct result is too large to be represented, the function sets @code{errno} to @code{ERANGE} to indicate a @dfn{range error}, and returns a particular very large value (named by the macro -@code{HUGE_VAL}) or its negation (@w{@code{- HUGE_VAL}}). +@code{HUGE_VAL}) or its negation (@code{@minus{}HUGE_VAL}). If the magnitude of the result is too small, a value of zero is returned instead. In this case, @code{errno} might or might not be @@ -191,46 +206,19 @@ operation to be performed. Examples are Any operation on a signalling NaN. @item Addition or subtraction; magnitude subtraction of infinities such as -@iftex -@tex -$(+\infty) + (-\infty)$. -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{(+oo) + (-oo)}. -@end ifclear +@math{(+@infinity{}) + (-@infinity{})}. @item Multiplication: -@iftex -@tex -$0 \cdot \infty$. -@end tex -@end iftex -@ifclear TEXFORMULAS -@ifset cdot -@math{0 @value{cdot} oo}. -@end ifset -@ifclear cdot -@math{0 x oo}. -@end ifclear -@end ifclear +@math{0 @mul{} @infinity{}}. @item -Division: @math{0/0} or -@iftex -@tex -$\infty/\infty$. -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{oo/oo}. -@end ifclear +Division: @math{0/0} or @math{@infinity{}/@infinity{}}. @item Remainder: @math{x} REM @math{y}, where @math{y} is zero or @math{x} is infinite. @item -Squre root if the operand is less then zero. +Square root if the operand is less then zero. @item Conversion of an internal floating-point number to an integer or to a decimal string when overflow, infinity, or NaN precludes a faithful @@ -249,24 +237,7 @@ of the operation is taken as a quiet NaN. @item Division by Zero This exception is raised if the devisor is zero and the dividend is a finite nonzero number. If no trap occurs the result is either -@iftex -@tex -$\infty$ -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{+oo} -@end ifclear -or -@iftex -@tex -$-\infty$ -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{-oo} -@end ifclear -, depending on the +@math{+@infinity{}} or @math{-@infinity{}}, depending on the signs of the operands. @item Overflow @@ -276,61 +247,20 @@ occurs the result depends on the sign of the intermediate result and the current rounding mode (@w{IEEE 754}, @w{section 7.3}): @enumerate @item -Round to nearest carries all overflows to -@iftex -@tex -$\infty$ -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{oo} -@end ifclear +Round to nearest carries all overflows to @math{@infinity{}} with the sign of the intermediate result. @item -Round towards @math{0} carries all overflows to the precision's largest +Round toward @math{0} carries all overflows to the precision's largest finite number with the sign of the intermediate result. @item -Round towards -@iftex -@tex -$-\infty$ -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{-oo} -@end ifclear -carries positive overflows to the +Round toward @math{-@infinity{}} carries positive overflows to the precision's largest finite number and carries negative overflows to -@iftex -@tex -$-\infty$. -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{-oo}. -@end ifclear +@math{-@infinity{}}. @item -Round towards -@iftex -@tex -$\infty$ -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{oo} -@end ifclear -carries negative overflows to the +Round toward @math{@infinity{}} carries negative overflows to the precision's most negative finite number and carries positive overflows -to -@iftex -@tex -$\infty$. -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{oo}. -@end ifclear +to @math{@infinity{}}. @end enumerate @item Underflow @@ -565,9 +495,10 @@ unwanted exception and raise the remaining exceptions. mode is supported by the floating-point implementation the corresponding of the following macros is defined: -@vtable @code +@table @code @comment fenv.h @comment ISO +@vindex FE_TONEAREST @item FE_TONEAREST Round to nearest. This is the default mode and should always be used except when a different mode is explicitely required. Only rounding to @@ -575,35 +506,22 @@ nearest guarantees numeric stability of the computations. @comment fenv.h @comment ISO +@vindex FE_UPWARD @item FE_UPWARD -Round toward -@iftex -@tex -$+\infty$. -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{+oo}. -@end ifclear +Round toward @math{+@infinity{}}. @comment fenv.h @comment ISO +@vindex FE_DOWNWARD @item FE_DOWNWARD -Round toward -@iftex -@tex -$-\infty$. -@end tex -@end iftex -@ifclear TEXFORMULAS -@math{-oo}. -@end ifclear +Round toward @math{-@infinity{}}. @comment fenv.h @comment ISO +@vindex FE_TOWARDZERO @item FE_TOWARDZERO Round toward zero. -@end vtable +@end table At any time one of the above four rounding modes is selected. To get information about the currently selected mode one can use this function: @@ -682,10 +600,10 @@ The value is the square root of the value of the number pi. The value is the reziprocal of the square root of the value of the number pi. @end vtable -ALl values are defined as @code{long double} values unless the compiler +All values are defined as @code{long double} values unless the compiler does not support this type or @code{__STDC__} is not defined (both is unlikely). Historically the numbers were @code{double} values and some -old code still relies on this so you might want to add explizit casts if +old code still relies on this so you might want to add explicit casts if the extra precision of the @code{long double} value is not needed. One critical case are functions with a variable number of arguments, such as @code{printf}. @@ -697,7 +615,7 @@ book about his C++ programming language where this value is used in examples (and perhaps some AT&T headers contain this value). But due to possible name space problems (@code{PI} is a quite frequently used name) this value is not added to @file{math.h}. Every program should use -@code{M_PI} instead or add on the the compiler command line +@code{M_PI} instead or add on the compiler command line @code{-DPI=M_PI}. @@ -727,15 +645,15 @@ double} type. @comment ISO @deftypefn {Macro} int isgreater (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) This macro determines whether the argument @var{x} is greater than -@var{y}. This is equivalent to @math{(x) > (y)} but no exception is -raised if @var{x} or @var{y} are unordered. +@var{y}. This is equivalent to @code{(@var{x}) > (@var{y})} but no +exception is raised if @var{x} or @var{y} are unordered. @end deftypefn @comment math.h @comment ISO @deftypefn {Macro} int isgreaterequal (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) This macro determines whether the argument @var{x} is greater than or -equal to @var{y}. This is equivalent to @math{(x) >= (y)} but no +equal to @var{y}. This is equivalent to @code{(@var{x}) >= (@var{y})} but no exception is raised if @var{x} or @var{y} are unordered. @end deftypefn @@ -743,7 +661,7 @@ exception is raised if @var{x} or @var{y} are unordered. @comment ISO @deftypefn {Macro} int isless (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) This macro determines whether the argument @var{x} is less than @var{y}. -This is equivalent @math{(x) < (y)} but no exception is raised if +This is equivalent @code{(@var{x}) < (@var{y})} but no exception is raised if @var{x} or @var{y} are unordered. @end deftypefn @@ -751,17 +669,18 @@ This is equivalent @math{(x) < (y)} but no exception is raised if @comment ISO @deftypefn {Macro} int islessequal (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) This macro determines whether the argument @var{x} is less than or equal -to @var{y}. This is equivalent to @math{(x) <= (y)} but no exception -is raised if @var{x} or @var{y} are unordered. +to @var{y}. This is equivalent to @code{(@var{x}) <= (@var{y})} but no +exception is raised if @var{x} or @var{y} are unordered. @end deftypefn @comment math.h @comment ISO @deftypefn {Macro} int islessgreater (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) This macro determines whether the argument @var{x} is less or greater -than @var{y}. This is equivalent to @math{(x) < (y) || (x) > (y)} -(except that @var{x} and @var{y} are only evaluated once) but no -exception is raised if @var{x} or @var{y} are unordered. +than @var{y}. This is equivalent to @code{(@var{x}) < (@var{y}) || +(@var{x}) > (@var{y})} (except that @var{x} and @var{y} are only +evaluated once) but no exception is raised if @var{x} or @var{y} are +unordered. @end deftypefn @comment math.h @@ -774,7 +693,7 @@ All the macros are defined in a way to ensure that both arguments are evaluated exactly once and so they can be used exactly like the builtin operators. -On several platform these macros are mapped to very efficient functions +On several platform these macros are mapped to efficient instructions the processor understands. But on machines missing these functions, the macros above might be rather slow. So it is best to use the builtin operators unless it is necessary to use unordered comparisons. @@ -855,6 +774,10 @@ These functions return the sine of @var{x} in @code{*@var{sinx}} and the cosine of @var{x} in @code{*@var{cos}}, where @var{x} is given in radians. Both values, @code{*@var{sinx}} and @code{*@var{cosx}}, are in the range of @code{-1} to @code{1}. + +This function is a GNU extension. It should be used whenever both sine +and cosine are needed but in protable applications there should be a +fallback method for systems without this function. @end deftypefun @cindex complex trigonometric functions @@ -1533,7 +1456,7 @@ may be as low as @code{32767}. @comment stdlib.h @comment ISO -@deftypefun int rand () +@deftypefun int rand (void) The @code{rand} function returns the next pseudo-random number in the series. The value is in the range from @code{0} to @code{RAND_MAX}. @end deftypefun @@ -1562,9 +1485,14 @@ The prototypes for these functions are in @file{stdlib.h}. @comment stdlib.h @comment BSD -@deftypefun {long int} random () +@deftypefun {int32_t} random (void) This function returns the next pseudo-random number in the sequence. The range of values returned is from @code{0} to @code{RAND_MAX}. + +@strong{Please note:} Historically this function returned a @code{long +int} value. But with the appearence of 64bit machines this could lead +to severe compatibility problems and therefore the type now explicitly +limits the return value to 32bit. @end deftypefun @comment stdlib.h diff --git a/math/libm-test.c b/math/libm-test.c index 5b773d6bd8..7e4e144c4c 100644 --- a/math/libm-test.c +++ b/math/libm-test.c @@ -999,7 +999,8 @@ cbrt_test (void) check_isinfn ("cbrt (-inf) == -inf", FUNC(cbrt) (minus_infty)); check_isnan ("cbrt (NaN) == NaN", FUNC(cbrt) (nan_value)); #endif - check ("cbrt (-0.001) == -0.1", FUNC(cbrt) (-0.001), -0.1); + check_eps ("cbrt (-0.001) == -0.1", FUNC(cbrt) (-0.001), -0.1, + CHOOSE (5e-18L, 0, 0)); check_eps ("cbrt (8) == 2", FUNC(cbrt) (8), 2, CHOOSE (5e-17L, 0, 0)); check_eps ("cbrt (-27) == -3", FUNC(cbrt) (-27.0), -3.0, CHOOSE (3e-16L, 0, 0)); @@ -1120,10 +1121,12 @@ static void expm1_test (void) { check ("expm1 (+0) == 0", FUNC(expm1) (0), 0); +#ifndef TEST_INLINE check ("expm1 (-0) == -0", FUNC(expm1) (minus_zero), minus_zero); check_isinfp ("expm1 (+inf) == +inf", FUNC(expm1) (plus_infty)); check ("expm1 (-inf) == -1", FUNC(expm1) (minus_infty), -1); +#endif check_eps ("expm1 (1) == e-1", FUNC(expm1) (1), M_E - 1.0, CHOOSE (4e-18L, 0, 0)); @@ -4652,6 +4655,7 @@ identities1_test (MATHTYPE x, MATHTYPE epsilon) static void identities2_test (MATHTYPE x, MATHTYPE epsilon) { +#ifndef TEST_INLINE MATHTYPE res1, res2, res3, res4, diff; int result; @@ -4668,6 +4672,7 @@ identities2_test (MATHTYPE x, MATHTYPE epsilon) result = check_equal (res4, res3, epsilon, &diff); output_result_ext ("sin/cos == tan", result, res4, res3, diff, x, PRINT, PRINT); +#endif } diff --git a/posix/fnmatch.h b/posix/fnmatch.h index 58880eceec..38b7255f4d 100644 --- a/posix/fnmatch.h +++ b/posix/fnmatch.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1992, 1993, 1996 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -24,7 +24,7 @@ extern "C" { #endif #if (defined (__cplusplus) || (defined (__STDC__) && __STDC__) \ - || defined (WIN32)) + || defined (WINDOWS32)) #undef __P #define __P(protos) protos #else /* Not C++ or ANSI C. */ diff --git a/posix/getopt.c b/posix/getopt.c index 59b51cd679..c5574eab69 100644 --- a/posix/getopt.c +++ b/posix/getopt.c @@ -76,7 +76,7 @@ #endif #endif -#if defined (WIN32) && !defined (__CYGWIN32__) +#if defined (_WINDOWS32) && !defined (__CYGWIN32__) /* It's not Unix, really. See? Capital letters. */ #include #define getpid() GetCurrentProcessId() diff --git a/posix/glob.c b/posix/glob.c index 6d9af102f8..6a82fe0254 100644 --- a/posix/glob.c +++ b/posix/glob.c @@ -37,6 +37,8 @@ /* #define NDEBUG 1 */ #include +#include /* Needed on stupid SunOS for assert. */ + /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C @@ -69,7 +71,7 @@ #endif #endif -#if !defined (_AMIGA) && !defined (VMS) && !defined(WIN32) +#if !defined (_AMIGA) && !defined (VMS) && !defined(WINDOWS32) #include #endif @@ -113,7 +115,7 @@ extern int errno; #endif -#if (defined (POSIX) || defined (WIN32)) && !defined (__GNU_LIBRARY__) +#if (defined (POSIX) || defined (WINDOWS32)) && !defined (__GNU_LIBRARY__) /* Posix does not require that the d_ino field be present, and some systems do not provide it. */ #define REAL_DIR_ENTRY(dp) 1 @@ -173,7 +175,7 @@ extern void bcopy (); __inline #endif #ifndef __SASC -#ifdef WIN32 +#ifdef WINDOWS32 static void * #else static char * @@ -203,11 +205,11 @@ my_realloc (p, n) #include #else /* Not HAVE_ALLOCA_H. */ #ifndef _AIX -#ifdef WIN32 +#ifdef WINDOWS32 #include #else extern char *alloca (); -#endif /* WIN32 */ +#endif /* WINDOWS32 */ #endif /* Not _AIX. */ #endif /* sparc or HAVE_ALLOCA_H. */ #endif /* GCC. */ @@ -265,7 +267,8 @@ static inline #endif const char * -next_brace_sub (const char *begin) +next_brace_sub (begin) + const char *begin; { unsigned int depth = 0; const char *cp = begin; @@ -504,17 +507,15 @@ glob (pattern, flags, errfunc, pglob) if (home_dir == NULL || home_dir[0] == '\0') home_dir = "SYS:"; #else -#ifdef WIN32 +#ifdef WINDOWS32 if (home_dir == NULL || home_dir[0] == '\0') home_dir = "c:/users/default"; /* poor default */ #else if (home_dir == NULL || home_dir[0] == '\0') { - extern char *getlogin __P ((void)); - extern int getlogin_r __P ((char *, size_t)); int success; - #if defined HAVE_GETLOGIN_R || defined _LIBC + extern int getlogin_r __P ((char *, size_t)); size_t buflen = sysconf (_SC_LOGIN_NAME_MAX) + 1; char *name; @@ -522,11 +523,13 @@ glob (pattern, flags, errfunc, pglob) /* `sysconf' does not support _SC_LOGIN_NAME_MAX. Try a moderate value. */ buflen = 16; - name = __alloca (buflen); + name = (char *) __alloca (buflen); success = getlogin_r (name, buflen) >= 0; #else + extern char *getlogin __P ((void)); char *name; + success = (name = getlogin ()) != NULL; #endif if (success) @@ -536,7 +539,7 @@ glob (pattern, flags, errfunc, pglob) char *pwtmpbuf; struct passwd pwbuf, *p; - pwtmpbuf = __alloca (pwbuflen); + pwtmpbuf = (char *) __alloca (pwbuflen); success = (__getpwnam_r (name, &pwbuf, pwtmpbuf, pwbuflen, &p) >= 0); @@ -550,7 +553,7 @@ glob (pattern, flags, errfunc, pglob) } if (home_dir == NULL || home_dir[0] == '\0') home_dir = (char *) "~"; /* No luck. */ -#endif /* WIN32 */ +#endif /* WINDOWS32 */ #endif /* Now construct the full directory. */ if (dirname[1] == '\0') @@ -559,13 +562,13 @@ glob (pattern, flags, errfunc, pglob) { char *newp; size_t home_len = strlen (home_dir); - newp = __alloca (home_len + dirlen); + newp = (char *) __alloca (home_len + dirlen); memcpy (newp, home_dir, home_len); memcpy (&newp[home_len], &dirname[1], dirlen); dirname = newp; } } -#if !defined _AMIGA && !defined WIN32 +#if !defined _AMIGA && !defined WINDOWS32 else { char *end_name = strchr (dirname, '/'); @@ -576,7 +579,7 @@ glob (pattern, flags, errfunc, pglob) user_name = dirname + 1; else { - user_name = __alloca (end_name - dirname); + user_name = (char *) __alloca (end_name - dirname); memcpy (user_name, dirname + 1, end_name - dirname); user_name[end_name - dirname - 1] = '\0'; } @@ -585,7 +588,7 @@ glob (pattern, flags, errfunc, pglob) { #if defined HAVE_GETPWNAM_R || defined _LIBC size_t buflen = sysconf (_SC_GETPW_R_SIZE_MAX); - char *pwtmpbuf = __alloca (buflen); + char *pwtmpbuf = (char *) __alloca (buflen); struct passwd pwbuf, *p; if (__getpwnam_r (user_name, &pwbuf, pwtmpbuf, buflen, &p) >= 0) home_dir = p->pw_dir; @@ -605,14 +608,14 @@ glob (pattern, flags, errfunc, pglob) char *newp; size_t home_len = strlen (home_dir); size_t rest_len = end_name == NULL ? 0 : strlen (end_name); - newp = __alloca (home_len + rest_len + 1); + newp = (char *) __alloca (home_len + rest_len + 1); memcpy (newp, home_dir, home_len); memcpy (&newp[home_len], end_name, rest_len); newp[home_len + rest_len] = '\0'; dirname = newp; } } -#endif /* Not Amiga && not Win32. */ +#endif /* Not Amiga && not WINDOWS32. */ } #endif /* Not VMS. */ diff --git a/posix/glob.h b/posix/glob.h index db44f7a69c..515514a4c2 100644 --- a/posix/glob.h +++ b/posix/glob.h @@ -28,7 +28,7 @@ extern "C" #undef __ptr_t #if (defined (__cplusplus) || (defined (__STDC__) && __STDC__) \ - || defined (WIN32)) + || defined (WINDOWS32)) #undef __P #define __P(protos) protos #define __ptr_t void * @@ -54,7 +54,7 @@ extern "C" GLOB_PERIOD|GLOB_ALTDIRFUNC|GLOB_BRACE| \ GLOB_NOMAGIC|GLOB_TILDE) -#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_BSD_SOURCE) +#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_BSD_SOURCE) || defined (_GNU_SOURCE) #define GLOB_MAGCHAR (1 << 8)/* Set in gl_flags if any metachars seen. */ #define GLOB_ALTDIRFUNC (1 << 9)/* Use gl_opendir et al functions. */ #define GLOB_BRACE (1 << 10)/* Expand "{a,b}" to "a" "b". */ diff --git a/shlib-versions b/shlib-versions index e1a9f9a3a8..f7c913a4a6 100644 --- a/shlib-versions +++ b/shlib-versions @@ -34,7 +34,7 @@ alpha-.*-linux.* libc=6.1 # The dynamic loader also requires different names. i.86-.*-linux.* ld=ld-linux.so.2 sparc-.*-linux.* ld=ld-linux.so.2 -sparc64-.*-linux.* ld=ld-linux.so.2 +sparc64-.*-linux.* ld=ld-linux64.so.2 alpha-.*-linux.* ld=ld-linux.so.2 # We use the ELF ABI standard name for the default. .*-.*-.* ld=ld.so.1 diff --git a/stdio-common/_itoa.c b/stdio-common/_itoa.c index 77181d940a..91bc8a83d0 100644 --- a/stdio-common/_itoa.c +++ b/stdio-common/_itoa.c @@ -20,9 +20,9 @@ Boston, MA 02111-1307, USA. */ #include -#include "../stdlib/gmp.h" -#include "../stdlib/gmp-impl.h" -#include "../stdlib/longlong.h" +#include +#include +#include #include "_itoa.h" diff --git a/stdlib/fmtmsg.c b/stdlib/fmtmsg.c index 9945ab9400..101beb7f73 100644 --- a/stdlib/fmtmsg.c +++ b/stdlib/fmtmsg.c @@ -99,7 +99,7 @@ int fmtmsg (long int classification, const char *label, int severity, const char *text, const char *action, const char *tag) { - __libc_once_define (once); + __libc_once_define (static, once); int result = MM_OK; struct severity_info *severity_rec; diff --git a/stdlib/strtod.c b/stdlib/strtod.c index 0618b30e4e..d35dc2d5ac 100644 --- a/stdlib/strtod.c +++ b/stdlib/strtod.c @@ -63,10 +63,10 @@ /* The gmp headers need some configuration frobs. */ #define HAVE_ALLOCA 1 -#include "gmp.h" -#include "gmp-impl.h" +#include +#include #include -#include "longlong.h" +#include #include "fpioconst.h" #define NDEBUG 1 diff --git a/sysdeps/generic/bits/sigaction.h b/sysdeps/generic/bits/sigaction.h index e5f661db80..e89479bd1c 100644 --- a/sysdeps/generic/bits/sigaction.h +++ b/sysdeps/generic/bits/sigaction.h @@ -37,9 +37,9 @@ struct sigaction /* Bits in `sa_flags'. */ #ifdef __USE_BSD -#define SA_ONSTACK 0x1 /* Take signal on signal stack. */ -#define SA_RESTART 0x2 /* Don't restart syscall on signal return. */ -#define SA_DISABLE 0x4 /* Disable alternate signal stack. */ +# define SA_ONSTACK 0x1 /* Take signal on signal stack. */ +# define SA_RESTART 0x2 /* Restart syscall on signal return. */ +# define SA_DISABLE 0x4 /* Disable alternate signal stack. */ #endif #define SA_NOCLDSTOP 0x8 /* Don't send SIGCHLD when children stop. */ diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c index 4f97f8547b..fd79bc4b81 100644 --- a/sysdeps/generic/dl-sysdep.c +++ b/sysdeps/generic/dl-sysdep.c @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -40,6 +41,7 @@ extern void ENTRY_POINT (void); int __libc_enable_secure; int __libc_multiple_libcs; /* Defining this here avoids the inclusion of init-first. */ +static ElfW(auxv_t) *_dl_auxv; ElfW(Addr) _dl_sysdep_start (void **start_argptr, @@ -68,7 +70,7 @@ _dl_sysdep_start (void **start_argptr, seen = 0; #define M(type) (1 << (type)) - for (av = (void *) ++start_argptr; + for (av = _dl_auxv = (void *) ++start_argptr; av->a_type != AT_NULL; seen |= M ((++av)->a_type)) switch (av->a_type) @@ -148,3 +150,76 @@ void _dl_sysdep_start_cleanup (void) { } + +void +_dl_show_auxv (void) +{ + char buf[64]; + ElfW(auxv_t) *av; + + /* Terminate string. */ + buf[63] = '\0'; + + for (av = _dl_auxv; av->a_type != AT_NULL; ++av) + switch (av->a_type) + { + case AT_PHDR: + _dl_sysdep_message ("AT_PHDR: 0x", + _itoa_word (av->a_un.a_val, buf + sizeof buf - 1, + 16, 0), + "\n", NULL); + break; + case AT_PHNUM: + _dl_sysdep_message ("AT_PHNUM: ", + _itoa_word (av->a_un.a_val, buf + sizeof buf - 1, + 10, 0), + "\n", NULL); + break; + case AT_PAGESZ: + _dl_sysdep_message ("AT_PAGESZ: ", + _itoa_word (av->a_un.a_val, buf + sizeof buf - 1, + 10, 0), + "\n", NULL); + break; + case AT_ENTRY: + _dl_sysdep_message ("AT_ENTRY: 0x", + _itoa_word (av->a_un.a_val, buf + sizeof buf - 1, + 16, 0), + "\n", NULL); + break; + case AT_UID: + _dl_sysdep_message ("AT_UID: ", + _itoa_word (av->a_un.a_val, buf + sizeof buf - 1, + 10, 0), + "\n", NULL); + break; + case AT_GID: + _dl_sysdep_message ("AT_GID: ", + _itoa_word (av->a_un.a_val, buf + sizeof buf - 1, + 10, 0), + "\n", NULL); + break; + case AT_EUID: + _dl_sysdep_message ("AT_EUID: ", + _itoa_word (av->a_un.a_val, buf + sizeof buf - 1, + 10, 0), + "\n", NULL); + break; + case AT_EGID: + _dl_sysdep_message ("AT_EGID: ", + _itoa_word (av->a_un.a_val, buf + sizeof buf - 1, + 10, 0), + "\n", NULL); + break; + case AT_PLATFORM: + _dl_sysdep_message ("AT_PLATFORM: ", av->a_un.a_ptr, NULL); + break; + case AT_HWCAP: + /* Well, what shall we use? A string or an integer with bits? */ + _dl_sysdep_message ("AT_HWCAP: ", + _itoa_word (av->a_un.a_val, buf + sizeof buf - 1, + 10, 0), + "\n", NULL); + break; + } +} diff --git a/sysdeps/i386/fpu/bits/mathinline.h b/sysdeps/i386/fpu/bits/mathinline.h index b3736f8417..c6b9331f9a 100644 --- a/sysdeps/i386/fpu/bits/mathinline.h +++ b/sysdeps/i386/fpu/bits/mathinline.h @@ -70,15 +70,6 @@ #endif -#if defined __GNUC__ && \ - (__GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ <= 7)) -/* gcc 2.7.2 and 2.7.2.1 have problems with inlining `long double' - functions so we disable this now. */ -# undef __NO_MATH_INLINES -# define __NO_MATH_INLINES -#endif - - #ifdef __GNUC__ #if !defined __NO_MATH_INLINES && defined __OPTIMIZE__ @@ -301,7 +292,7 @@ __inline_mathop (sin, "fsin") /* The argument range of this inline version is reduced. */ __inline_mathop (cos, "fcos") -__inline_mathop_decl (atan, "fpatan", "u" (__x), "0" (1.0) : "st(1)") +__inline_mathop (atan, "fld1; fpatan") __inline_mathop (log, "fldln2; fxch; fyl2x") __inline_mathop (log10, "fldlg2; fxch; fyl2x") @@ -390,7 +381,7 @@ __inline_mathcode (log1p, __x, \ __inline_mathcode (asinh, __x, \ register long double __y = __fabsl (__x); \ return (log1pl (__y * __y / (__sqrtl (__y * __y + 1.0) + 1.0) + __y) \ - * __sgn1l (__x)) + * __sgn1l (__x))) __inline_mathcode (acosh, __x, \ return logl (__x + __sqrtl (__x - 1.0) * __sqrtl (__x + 1.0))) diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c index 69dd55ad39..88918c517f 100644 --- a/sysdeps/mach/hurd/dl-sysdep.c +++ b/sysdeps/mach/hurd/dl-sysdep.c @@ -713,3 +713,10 @@ _hurd_intr_rpc_mach_msg (mach_msg_header_t *msg, return __mach_msg (msg, option, send_size, rcv_size, rcv_name, timeout, notify); } + + +void +_dl_show_auxv (void) +{ + /* There is nothing to print. Hurd has no auxiliary vector. */ +} diff --git a/sysdeps/sparc/Dist b/sysdeps/sparc/Dist deleted file mode 100644 index 6c3b23baa5..0000000000 --- a/sysdeps/sparc/Dist +++ /dev/null @@ -1,4 +0,0 @@ -dotmul.S umul.S -divrem.m4 sdiv.S udiv.S rem.S urem.S -alloca.S -sys/trap.h diff --git a/sysdeps/sparc/Implies b/sysdeps/sparc/Implies index 8a2007c5ce..da719e1707 100644 --- a/sysdeps/sparc/Implies +++ b/sysdeps/sparc/Implies @@ -1,3 +1,2 @@ -wordsize-32 # SPARC uses IEEE 754 floating point. ieee754 diff --git a/sysdeps/sparc/Makefile b/sysdeps/sparc/Makefile deleted file mode 100644 index deec2f8145..0000000000 --- a/sysdeps/sparc/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 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, -# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -ifeq ($(subdir),gnulib) -routines = dotmul umul $(divrem) alloca -endif # gnulib - -# We distribute these files, even though they are generated, -# so as to avoid the need for a functioning m4 to build the library. -divrem := sdiv udiv rem urem - -+divrem-NAME-sdiv := div -+divrem-NAME-udiv := udiv -+divrem-NAME-rem := rem -+divrem-NAME-urem := urem -+divrem-NAME = $(+divrem-NAME-$(basename $(notdir $@))) -+divrem-OP-div := div -+divrem-OP-udiv := div -+divrem-OP-rem := rem -+divrem-OP-urem := rem -+divrem-S-div := true -+divrem-S-rem := true -+divrem-S-udiv := false -+divrem-S-urem := false -$(divrem:%=$(sysdep_dir)/sparc/%.S): $(sysdep_dir)/sparc/divrem.m4 - (echo "define(NAME,\`.$(+divrem-NAME)')\ - define(OP,\`$(+divrem-OP-$(+divrem-NAME))')\ - define(S,\`$(+divrem-S-$(+divrem-NAME))')\ - /* This file is generated from divrem.m4; DO NOT EDIT! */"; \ - cat $<) | $(M4) > $@-tmp -# Make it unwritable so noone will edit it by mistake. - -chmod a-w $@-tmp - mv -f $@-tmp $@ - test ! -d CVS || cvs commit -m'Regenerated from $<' $@ - -sysdep-realclean := $(sysdep-realclean) $(divrem:%=sysdeps/sparc/%.S) diff --git a/sysdeps/sparc/__longjmp.S b/sysdeps/sparc/__longjmp.S deleted file mode 100644 index 36e1c170dd..0000000000 --- a/sysdeps/sparc/__longjmp.S +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 1991, 1993, 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -#define _ASM 1 -#include -#define ENV(reg) [%g1 + (reg * 4)] - -ENTRY (__longjmp) - /* Store our arguments in global registers so we can still - use them while unwinding frames and their register windows. */ - mov %o0, %g1 /* ENV in %g1 */ - orcc %o1, %g0, %g6 /* VAL in %g6 */ - be,a 0f /* Branch if zero; else skip delay slot. */ - mov 1, %g6 /* Delay slot only hit if zero: VAL = 1. */ -0: - - /* Cache target FP in register %g7. */ - ld ENV (JB_FP), %g7 - - /* Now we will loop, unwinding the register windows up the stack - until the restored %fp value matches the target value in %g7. */ - -loop: cmp %fp, %g7 /* Have we reached the target frame? */ - bl,a loop /* Loop while current fp is below target. */ - restore /* Unwind register window in delay slot. */ - be,a found /* Better have hit it exactly. */ - ld ENV (JB_SP), %o0 /* Delay slot: extract target SP. */ - -bogus: /* Get here only if the jmp_buf or stack is clobbered. */ - call C_SYMBOL_NAME (abort) - nop - unimp 0 - -found: /* We have unwound register windows so %fp matches the target. */ - cmp %o0, %sp /* Check jmp_buf SP vs register window. */ - bge,a sp_ok /* Saved must not be deeper than register. */ - mov %o0, %sp /* OK, install new SP. */ - b,a bogus /* Bogus, we lose. */ - -sp_ok: ld ENV (JB_PC), %o0 /* Extract target return PC. */ - jmp %o0 + 8 /* Return there. */ - mov %g6, %o0 /* Delay slot: set return value. */ diff --git a/sysdeps/sparc/add_n.S b/sysdeps/sparc/add_n.S deleted file mode 100644 index 9852c256aa..0000000000 --- a/sysdeps/sparc/add_n.S +++ /dev/null @@ -1,226 +0,0 @@ -! SPARC __mpn_add_n -- Add two limb vectors of the same length > 0 and store -! sum in a third limb vector. - -! Copyright (C) 1995, 1996 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -#define res_ptr %o0 -#define s1_ptr %o1 -#define s2_ptr %o2 -#define size %o3 - -#include "sysdep.h" - - .text - .align 4 - .global C_SYMBOL_NAME(__mpn_add_n) -C_SYMBOL_NAME(__mpn_add_n): - xor s2_ptr,res_ptr,%g1 - andcc %g1,4,%g0 - bne L1 ! branch if alignment differs - nop -! ** V1a ** -L0: andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0 - be L_v1 ! if no, branch - nop -/* Add least significant limb separately to align res_ptr and s2_ptr */ - ld [s1_ptr],%g4 - add s1_ptr,4,s1_ptr - ld [s2_ptr],%g2 - add s2_ptr,4,s2_ptr - add size,-1,size - addcc %g4,%g2,%o4 - st %o4,[res_ptr] - add res_ptr,4,res_ptr -L_v1: addx %g0,%g0,%o4 ! save cy in register - cmp size,2 ! if size < 2 ... - bl Lend2 ! ... branch to tail code - subcc %g0,%o4,%g0 ! restore cy - - ld [s1_ptr+0],%g4 - addcc size,-10,size - ld [s1_ptr+4],%g1 - ldd [s2_ptr+0],%g2 - blt Lfin1 - subcc %g0,%o4,%g0 ! restore cy -/* Add blocks of 8 limbs until less than 8 limbs remain */ -Loop1: addxcc %g4,%g2,%o4 - ld [s1_ptr+8],%g4 - addxcc %g1,%g3,%o5 - ld [s1_ptr+12],%g1 - ldd [s2_ptr+8],%g2 - std %o4,[res_ptr+0] - addxcc %g4,%g2,%o4 - ld [s1_ptr+16],%g4 - addxcc %g1,%g3,%o5 - ld [s1_ptr+20],%g1 - ldd [s2_ptr+16],%g2 - std %o4,[res_ptr+8] - addxcc %g4,%g2,%o4 - ld [s1_ptr+24],%g4 - addxcc %g1,%g3,%o5 - ld [s1_ptr+28],%g1 - ldd [s2_ptr+24],%g2 - std %o4,[res_ptr+16] - addxcc %g4,%g2,%o4 - ld [s1_ptr+32],%g4 - addxcc %g1,%g3,%o5 - ld [s1_ptr+36],%g1 - ldd [s2_ptr+32],%g2 - std %o4,[res_ptr+24] - addx %g0,%g0,%o4 ! save cy in register - addcc size,-8,size - add s1_ptr,32,s1_ptr - add s2_ptr,32,s2_ptr - add res_ptr,32,res_ptr - bge Loop1 - subcc %g0,%o4,%g0 ! restore cy - -Lfin1: addcc size,8-2,size - blt Lend1 - subcc %g0,%o4,%g0 ! restore cy -/* Add blocks of 2 limbs until less than 2 limbs remain */ -Loope1: addxcc %g4,%g2,%o4 - ld [s1_ptr+8],%g4 - addxcc %g1,%g3,%o5 - ld [s1_ptr+12],%g1 - ldd [s2_ptr+8],%g2 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 ! save cy in register - addcc size,-2,size - add s1_ptr,8,s1_ptr - add s2_ptr,8,s2_ptr - add res_ptr,8,res_ptr - bge Loope1 - subcc %g0,%o4,%g0 ! restore cy -Lend1: addxcc %g4,%g2,%o4 - addxcc %g1,%g3,%o5 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 ! save cy in register - - andcc size,1,%g0 - be Lret1 - subcc %g0,%o4,%g0 ! restore cy -/* Add last limb */ - ld [s1_ptr+8],%g4 - ld [s2_ptr+8],%g2 - addxcc %g4,%g2,%o4 - st %o4,[res_ptr+8] - -Lret1: retl - addx %g0,%g0,%o0 ! return carry-out from most sign. limb - -L1: xor s1_ptr,res_ptr,%g1 - andcc %g1,4,%g0 - bne L2 - nop -! ** V1b ** - mov s2_ptr,%g1 - mov s1_ptr,s2_ptr - b L0 - mov %g1,s1_ptr - -! ** V2 ** -/* If we come here, the alignment of s1_ptr and res_ptr as well as the - alignment of s2_ptr and res_ptr differ. Since there are only two ways - things can be aligned (that we care about) we now know that the alignment - of s1_ptr and s2_ptr are the same. */ - -L2: cmp size,1 - be Ljone - nop - andcc s1_ptr,4,%g0 ! s1_ptr unaligned? Side effect: cy=0 - be L_v2 ! if no, branch - nop -/* Add least significant limb separately to align s1_ptr and s2_ptr */ - ld [s1_ptr],%g4 - add s1_ptr,4,s1_ptr - ld [s2_ptr],%g2 - add s2_ptr,4,s2_ptr - add size,-1,size - addcc %g4,%g2,%o4 - st %o4,[res_ptr] - add res_ptr,4,res_ptr - -L_v2: addx %g0,%g0,%o4 ! save cy in register - addcc size,-8,size - blt Lfin2 - subcc %g0,%o4,%g0 ! restore cy -/* Add blocks of 8 limbs until less than 8 limbs remain */ -Loop2: ldd [s1_ptr+0],%g2 - ldd [s2_ptr+0],%o4 - addxcc %g2,%o4,%g2 - st %g2,[res_ptr+0] - addxcc %g3,%o5,%g3 - st %g3,[res_ptr+4] - ldd [s1_ptr+8],%g2 - ldd [s2_ptr+8],%o4 - addxcc %g2,%o4,%g2 - st %g2,[res_ptr+8] - addxcc %g3,%o5,%g3 - st %g3,[res_ptr+12] - ldd [s1_ptr+16],%g2 - ldd [s2_ptr+16],%o4 - addxcc %g2,%o4,%g2 - st %g2,[res_ptr+16] - addxcc %g3,%o5,%g3 - st %g3,[res_ptr+20] - ldd [s1_ptr+24],%g2 - ldd [s2_ptr+24],%o4 - addxcc %g2,%o4,%g2 - st %g2,[res_ptr+24] - addxcc %g3,%o5,%g3 - st %g3,[res_ptr+28] - addx %g0,%g0,%o4 ! save cy in register - addcc size,-8,size - add s1_ptr,32,s1_ptr - add s2_ptr,32,s2_ptr - add res_ptr,32,res_ptr - bge Loop2 - subcc %g0,%o4,%g0 ! restore cy - -Lfin2: addcc size,8-2,size - blt Lend2 - subcc %g0,%o4,%g0 ! restore cy -Loope2: ldd [s1_ptr+0],%g2 - ldd [s2_ptr+0],%o4 - addxcc %g2,%o4,%g2 - st %g2,[res_ptr+0] - addxcc %g3,%o5,%g3 - st %g3,[res_ptr+4] - addx %g0,%g0,%o4 ! save cy in register - addcc size,-2,size - add s1_ptr,8,s1_ptr - add s2_ptr,8,s2_ptr - add res_ptr,8,res_ptr - bge Loope2 - subcc %g0,%o4,%g0 ! restore cy -Lend2: andcc size,1,%g0 - be Lret2 - subcc %g0,%o4,%g0 ! restore cy -/* Add last limb */ -Ljone: ld [s1_ptr],%g4 - ld [s2_ptr],%g2 - addxcc %g4,%g2,%o4 - st %o4,[res_ptr] - -Lret2: retl - addx %g0,%g0,%o0 ! return carry-out from most sign. limb diff --git a/sysdeps/sparc/addmul_1.S b/sysdeps/sparc/addmul_1.S deleted file mode 100644 index 375d25db6b..0000000000 --- a/sysdeps/sparc/addmul_1.S +++ /dev/null @@ -1,147 +0,0 @@ -! SPARC __mpn_addmul_1 -- Multiply a limb vector with a limb and add -! the result to a second limb vector. - -! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr o0 -! s1_ptr o1 -! size o2 -! s2_limb o3 - -#include "sysdep.h" - -.text - .align 4 - .global C_SYMBOL_NAME(__mpn_addmul_1) -C_SYMBOL_NAME(__mpn_addmul_1): - ! Make S1_PTR and RES_PTR point at the end of their blocks - ! and put (- 4 x SIZE) in index/loop counter. - sll %o2,2,%o2 - add %o0,%o2,%o4 ! RES_PTR in o4 since o0 is retval - add %o1,%o2,%o1 - sub %g0,%o2,%o2 - - cmp %o3,0xfff - bgu Large - nop - - ld [%o1+%o2],%o5 - mov 0,%o0 - b L0 - add %o4,-4,%o4 -Loop0: - addcc %o5,%g1,%g1 - ld [%o1+%o2],%o5 - addx %o0,%g0,%o0 - st %g1,[%o4+%o2] -L0: wr %g0,%o3,%y - sra %o5,31,%g2 - and %o3,%g2,%g2 - andcc %g1,0,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,0,%g1 - sra %g1,20,%g4 - sll %g1,12,%g1 - rd %y,%g3 - srl %g3,20,%g3 - or %g1,%g3,%g1 - - addcc %g1,%o0,%g1 - addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb - addcc %o2,4,%o2 ! loop counter - bne Loop0 - ld [%o4+%o2],%o5 - - addcc %o5,%g1,%g1 - addx %o0,%g0,%o0 - retl - st %g1,[%o4+%o2] - - -Large: ld [%o1+%o2],%o5 - mov 0,%o0 - sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0 - b L1 - add %o4,-4,%o4 -Loop: - addcc %o5,%g3,%g3 - ld [%o1+%o2],%o5 - addx %o0,%g0,%o0 - st %g3,[%o4+%o2] -L1: wr %g0,%o5,%y - and %o5,%g4,%g2 - andcc %g0,%g0,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%g0,%g1 - rd %y,%g3 - addcc %g3,%o0,%g3 - addx %g2,%g1,%o0 - addcc %o2,4,%o2 - bne Loop - ld [%o4+%o2],%o5 - - addcc %o5,%g3,%g3 - addx %o0,%g0,%o0 - retl - st %g3,[%o4+%o2] diff --git a/sysdeps/sparc/alloca.S b/sysdeps/sparc/alloca.S deleted file mode 100644 index dcbd171163..0000000000 --- a/sysdeps/sparc/alloca.S +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include "sysdep.h" - -/* Code produced by Sun's C compiler calls this function with two extra - arguments which it makes relocatable symbols but seem always to be - the constant 96; I have no idea what they are for. */ - -#ifndef NO_UNDERSCORES -#define __builtin_alloca ___builtin_alloca -#endif - -ENTRY (__builtin_alloca) - sub %sp, %o0, %sp /* Push some stack space. */ - retl /* Return; the returned buffer leaves 96 */ - add %sp, 96, %o0 /* bytes of register save area at the top. */ diff --git a/sysdeps/sparc/bits/endian.h b/sysdeps/sparc/bits/endian.h deleted file mode 100644 index f1a75c0652..0000000000 --- a/sysdeps/sparc/bits/endian.h +++ /dev/null @@ -1,3 +0,0 @@ -/* SPARC is big-endian. */ - -#define __BYTE_ORDER __BIG_ENDIAN diff --git a/sysdeps/sparc/bits/setjmp.h b/sysdeps/sparc/bits/setjmp.h deleted file mode 100644 index 43bae1a496..0000000000 --- a/sysdeps/sparc/bits/setjmp.h +++ /dev/null @@ -1,16 +0,0 @@ -/* Define the machine-dependent type `jmp_buf'. SPARC version. */ - -#if defined (__USE_MISC) || defined (_ASM) -#define JB_SP 0 -#define JB_FP 1 -#define JB_PC 2 -#endif - -#ifndef _ASM -typedef int __jmp_buf[3]; -#endif - -/* Test if longjmp to JMPBUF would unwind the frame - containing a local variable at ADDRESS. */ -#define _JMPBUF_UNWINDS(jmpbuf, address) \ - ((int) (address) < (jmpbuf)[JB_SP]) diff --git a/sysdeps/sparc/bsd-_setjmp.S b/sysdeps/sparc/bsd-_setjmp.S deleted file mode 100644 index bf49765f4d..0000000000 --- a/sysdeps/sparc/bsd-_setjmp.S +++ /dev/null @@ -1,40 +0,0 @@ -/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Sparc version. - Copyright (C) 1994, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -ENTRY (_setjmp) - -#ifdef PIC - save %sp, -64, %sp -1: call 2f - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 -2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 - add %g1, %o7, %g1 - sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g2 - restore - or %g2, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g2 - ld [%g1+%g2], %g1 -#else - sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1 - or %g1, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1 -#endif - - jmp %g1 - mov %g0, %o1 /* Pass second argument of zero. */ diff --git a/sysdeps/sparc/bsd-setjmp.S b/sysdeps/sparc/bsd-setjmp.S deleted file mode 100644 index 16dc260765..0000000000 --- a/sysdeps/sparc/bsd-setjmp.S +++ /dev/null @@ -1,40 +0,0 @@ -/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Sparc version. - Copyright (C) 1994, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -ENTRY (setjmp) - -#ifdef PIC - save %sp, -64, %sp -1: call 2f - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 -2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 - add %g1, %o7, %g1 - sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g2 - restore - or %g2, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g2 - ld [%g1+%g2], %g1 -#else - sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1 - or %g1, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1 -#endif - - jmp %g1 - mov 1, %o1 /* Pass second argument of one. */ diff --git a/sysdeps/sparc/divrem.m4 b/sysdeps/sparc/divrem.m4 deleted file mode 100644 index 665abf11ae..0000000000 --- a/sysdeps/sparc/divrem.m4 +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Division and remainder, from Appendix E of the Sparc Version 8 - * Architecture Manual, with fixes from Gordon Irlam. - */ - -/* - * Input: dividend and divisor in %o0 and %o1 respectively. - * - * m4 parameters: - * NAME name of function to generate - * OP OP=div => %o0 / %o1; OP=rem => %o0 % %o1 - * S S=true => signed; S=false => unsigned - * - * Algorithm parameters: - * N how many bits per iteration we try to get (4) - * WORDSIZE total number of bits (32) - * - * Derived constants: - * TOPBITS number of bits in the top `decade' of a number - * - * Important variables: - * Q the partial quotient under development (initially 0) - * R the remainder so far, initially the dividend - * ITER number of main division loop iterations required; - * equal to ceil(log2(quotient) / N). Note that this - * is the log base (2^N) of the quotient. - * V the current comparand, initially divisor*2^(ITER*N-1) - * - * Cost: - * Current estimate for non-large dividend is - * ceil(log2(quotient) / N) * (10 + 7N/2) + C - * A large dividend is one greater than 2^(31-TOPBITS) and takes a - * different path, as the upper bits of the quotient must be developed - * one bit at a time. - */ - -define(N, `4')dnl -define(WORDSIZE, `32')dnl -define(TOPBITS, eval(WORDSIZE - N*((WORDSIZE-1)/N)))dnl -dnl -define(dividend, `%o0')dnl -define(divisor, `%o1')dnl -define(Q, `%o2')dnl -define(R, `%o3')dnl -define(ITER, `%o4')dnl -define(V, `%o5')dnl -dnl -dnl m4 reminder: ifelse(a,b,c,d) => if a is b, then c, else d -define(T, `%g1')dnl -define(SC, `%g7')dnl -ifelse(S, `true', `define(SIGN, `%g6')')dnl - -dnl -dnl This is the recursive definition for developing quotient digits. -dnl -dnl Parameters: -dnl $1 the current depth, 1 <= $1 <= N -dnl $2 the current accumulation of quotient bits -dnl N max depth -dnl -dnl We add a new bit to $2 and either recurse or insert the bits in -dnl the quotient. R, Q, and V are inputs and outputs as defined above; -dnl the condition codes are expected to reflect the input R, and are -dnl modified to reflect the output R. -dnl -define(DEVELOP_QUOTIENT_BITS, -` ! depth $1, accumulated bits $2 - bl L.$1.eval(2**N+$2) - srl V,1,V - ! remainder is positive - subcc R,V,R - ifelse($1, N, - ` b 9f - add Q, ($2*2+1), Q - ', ` DEVELOP_QUOTIENT_BITS(incr($1), `eval(2*$2+1)')') -L.$1.eval(2**N+$2): - ! remainder is negative - addcc R,V,R - ifelse($1, N, - ` b 9f - add Q, ($2*2-1), Q - ', ` DEVELOP_QUOTIENT_BITS(incr($1), `eval(2*$2-1)')') - ifelse($1, 1, `9:')')dnl - -#include "sysdep.h" -#ifdef __linux__ -#include -#else -#ifdef __svr4__ -#include -#else -#include -#endif -#endif - -FUNC(NAME) -ifelse(S, `true', -` ! compute sign of result; if neither is negative, no problem - orcc divisor, dividend, %g0 ! either negative? - bge 2f ! no, go do the divide -ifelse(OP, `div', -` xor divisor, dividend, SIGN ! compute sign in any case', -` mov dividend, SIGN ! sign of remainder matches dividend') - tst divisor - bge 1f - tst dividend - ! divisor is definitely negative; dividend might also be negative - bge 2f ! if dividend not negative... - sub %g0, divisor, divisor ! in any case, make divisor nonneg -1: ! dividend is negative, divisor is nonnegative - sub %g0, dividend, dividend ! make dividend nonnegative -2: -') - ! Ready to divide. Compute size of quotient; scale comparand. - orcc divisor, %g0, V - bne 1f - mov dividend, R - - ! Divide by zero trap. If it returns, return 0 (about as - ! wrong as possible, but that is what SunOS does...). - ta ST_DIV0 - retl - clr %o0 - -1: - cmp R, V ! if divisor exceeds dividend, done - blu Lgot_result ! (and algorithm fails otherwise) - clr Q - sethi %hi(1 << (WORDSIZE - TOPBITS - 1)), T - cmp R, T - blu Lnot_really_big - clr ITER - - ! `Here the dividend is >= 2**(31-N) or so. We must be careful here, - ! as our usual N-at-a-shot divide step will cause overflow and havoc. - ! The number of bits in the result here is N*ITER+SC, where SC <= N. - ! Compute ITER in an unorthodox manner: know we need to shift V into - ! the top decade: so do not even bother to compare to R.' - 1: - cmp V, T - bgeu 3f - mov 1, SC - sll V, N, V - b 1b - add ITER, 1, ITER - - ! Now compute SC. - 2: addcc V, V, V - bcc Lnot_too_big - add SC, 1, SC - - ! We get here if the divisor overflowed while shifting. - ! This means that R has the high-order bit set. - ! Restore V and subtract from R. - sll T, TOPBITS, T ! high order bit - srl V, 1, V ! rest of V - add V, T, V - b Ldo_single_div - sub SC, 1, SC - - Lnot_too_big: - 3: cmp V, R - blu 2b - nop - be Ldo_single_div - nop - /* NB: these are commented out in the V8-Sparc manual as well */ - /* (I do not understand this) */ - ! V > R: went too far: back up 1 step - ! srl V, 1, V - ! dec SC - ! do single-bit divide steps - ! - ! We have to be careful here. We know that R >= V, so we can do the - ! first divide step without thinking. BUT, the others are conditional, - ! and are only done if R >= 0. Because both R and V may have the high- - ! order bit set in the first step, just falling into the regular - ! division loop will mess up the first time around. - ! So we unroll slightly... - Ldo_single_div: - subcc SC, 1, SC - bl Lend_regular_divide - nop - sub R, V, R - mov 1, Q - b Lend_single_divloop - nop - Lsingle_divloop: - sll Q, 1, Q - bl 1f - srl V, 1, V - ! R >= 0 - sub R, V, R - b 2f - add Q, 1, Q - 1: ! R < 0 - add R, V, R - sub Q, 1, Q - 2: - Lend_single_divloop: - subcc SC, 1, SC - bge Lsingle_divloop - tst R - b,a Lend_regular_divide - -Lnot_really_big: -1: - sll V, N, V - cmp V, R - bleu 1b - addcc ITER, 1, ITER - be Lgot_result - sub ITER, 1, ITER - - tst R ! set up for initial iteration -Ldivloop: - sll Q, N, Q - DEVELOP_QUOTIENT_BITS(1, 0) -Lend_regular_divide: - subcc ITER, 1, ITER - bge Ldivloop - tst R - bl,a Lgot_result - ! non-restoring fixup here (one instruction only!) -ifelse(OP, `div', -` sub Q, 1, Q -', ` add R, divisor, R -') - -Lgot_result: -ifelse(S, `true', -` ! check to see if answer should be < 0 - tst SIGN - bl,a 1f - ifelse(OP, `div', `sub %g0, Q, Q', `sub %g0, R, R') -1:') - retl - ifelse(OP, `div', `mov Q, %o0', `mov R, %o0') diff --git a/sysdeps/sparc/dl-machine.h b/sysdeps/sparc/dl-machine.h deleted file mode 100644 index dc38e17292..0000000000 --- a/sysdeps/sparc/dl-machine.h +++ /dev/null @@ -1,347 +0,0 @@ -/* Machine-dependent ELF dynamic relocation inline functions. SPARC version. - Copyright (C) 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, write to the Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define ELF_MACHINE_NAME "sparc" - -#include -#include -#include -#include - - -/* Some SPARC opcodes we need to use for self-modifying code. */ -#define OPCODE_NOP 0x01000000 /* nop */ -#define OPCODE_CALL 0x40000000 /* call ?; add PC-rel word address */ -#define OPCODE_SETHI_G1 0x03000000 /* sethi ?, %g1; add value>>10 */ -#define OPCODE_JMP_G1 0x81c06000 /* jmp %g1+?; add lo 10 bits of value */ -#define OPCODE_SAVE_SP64 0x9de3bfc0 /* save %sp, -64, %sp */ - - -/* Return nonzero iff E_MACHINE is compatible with the running host. */ -static inline int -elf_machine_matches_host (Elf32_Half e_machine) -{ - return e_machine == EM_SPARC; -} - - -/* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. This must be inlined in a function which - uses global data. */ -static inline Elf32_Addr -elf_machine_dynamic (void) -{ - register Elf32_Addr *got asm ("%l7"); - return *got; -} - - -/* Return the run-time load address of the shared object. */ -static inline Elf32_Addr -elf_machine_load_address (void) -{ - Elf32_Addr addr; - - asm ( - "add %%fp,0x44,%%o2\n\t" /* o2 = point to argc */ - "ld [%%o2 - 4],%%o0\n\t" /* o0 = load argc */ - "sll %%o0, 2, %%o0\n\t" /* o0 = argc * sizeof (int) */ - "add %%o2,%%o0,%%o2\n\t" /* o2 = skip over argv */ - "add %%o2,4,%%o2\n\t" /* skip over null after argv */ - - /* Now %o2 is pointing to env, skip over that as well. */ - "1:\n\t" - "ld [%%o2],%%o0\n\t" - "cmp %%o0,0\n\t" - "bnz 1b\n\t" - "add %%o2,4,%%o2\n\t" - - /* Note that above, we want to advance the NULL after envp so - we always add 4. */ - - /* Now, search for the AT_BASE property. */ - "2:\n\t" - "ld [%%o2],%%o0\n\t" - "cmp %%o0,0\n\t" - "be,a 3f\n\t" - "or %%g0,%%g0,%0\n\t" - "cmp %%o0,7\n\t" /* AT_BASE = 7 */ - "be,a 3f\n\t" - "ld [%%o2+4],%0\n\t" - "b 2b\n\t" - "add %%o2,8,%%o2\n\t" - /* At this point %0 has the load address for the interpreter */ - "3:\n\t" - : "=r" (addr) - : /* no inputs */ - : "o0", "o2"); - return addr; -} - -#ifdef RESOLVE -/* Perform the relocation specified by RELOC and SYM (which is fully resolved). - MAP is the object containing the reloc. */ - -static inline void -elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, - const Elf32_Sym *sym, const struct r_found_version *version, - Elf32_Addr *const reloc_addr) -{ - Elf32_Addr loadbase; - - if (ELF32_R_TYPE (reloc->r_info) == R_SPARC_RELATIVE) - { -#ifndef RTLD_BOOTSTRAP - if (map != &_dl_rtld_map) /* Already done in rtld itself. */ -#endif - *reloc_addr += map->l_addr + reloc->r_addend; - } - else - { - const Elf32_Sym *const refsym = sym; - Elf32_Addr value; - if (sym->st_shndx != SHN_UNDEF && - ELF32_ST_BIND (sym->st_info) == STB_LOCAL) - value = map->l_addr; - else - { - value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info)); - if (sym) - value += sym->st_value; - } - value += reloc->r_addend; /* Assume copy relocs have zero addend. */ - - switch (ELF32_R_TYPE (reloc->r_info)) - { - case R_SPARC_COPY: - if (sym->st_size > refsym->st_size - || (_dl_verbose && sym->st_size < refsym->st_size)) - { - extern char **_dl_argv; - const char *strtab; - - strtab = ((void *) map->l_addr - + map->l_info[DT_STRTAB]->d_un.d_ptr); - _dl_sysdep_error (_dl_argv[0] ?: "", - ": Symbol `", strtab + refsym->st_name, - "' has different size in shared object, " - "consider re-linking\n", NULL); - } - memcpy (reloc_addr, (void *) value, MIN (sym->st_size, - refsym->st_size)); - break; - case R_SPARC_GLOB_DAT: - case R_SPARC_32: - *reloc_addr = value; - break; - case R_SPARC_JMP_SLOT: - reloc_addr[1] = OPCODE_SETHI_G1 | (value >> 10); - reloc_addr[2] = OPCODE_JMP_G1 | (value & 0x3ff); - break; - case R_SPARC_8: - *(char *) reloc_addr = value; - break; - case R_SPARC_16: - *(short *) reloc_addr = value; - break; - case R_SPARC_DISP8: - *(char *) reloc_addr = (value - (Elf32_Addr) reloc_addr); - break; - case R_SPARC_DISP16: - *(short *) reloc_addr = (value - (Elf32_Addr) reloc_addr); - break; - case R_SPARC_DISP32: - *reloc_addr = (value - (Elf32_Addr) reloc_addr); - break; - case R_SPARC_LO10: - *reloc_addr = (*reloc_addr & ~0x3ff) | (value & 0x3ff); - break; - case R_SPARC_WDISP30: - *reloc_addr = ((*reloc_addr & 0xc0000000) - | ((value - (unsigned int) reloc_addr) >> 2)); - break; - case R_SPARC_HI22: - *reloc_addr = (*reloc_addr & 0xffc00000) | (value >> 10); - break; - case R_SPARC_NONE: /* Alright, Wilbur. */ - break; - default: - assert (! "unexpected dynamic reloc type"); - break; - } - } -} - -static inline void -elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc) -{ - switch (ELF32_R_TYPE (reloc->r_info)) - { - case R_SPARC_NONE: - break; - case R_SPARC_JMP_SLOT: - break; - default: - assert (! "unexpected PLT reloc type"); - break; - } -} - -#endif /* RESOLVE */ - -/* Nonzero iff TYPE should not be allowed to resolve to one of - the main executable's symbols, as for a COPY reloc. */ -#define elf_machine_lookup_noexec_p(type) ((type) == R_SPARC_COPY) - -/* Nonzero iff TYPE describes relocation of a PLT entry, so - PLT entries should not be allowed to define the value. */ -#define elf_machine_lookup_noplt_p(type) ((type) == R_SPARC_JMP_SLOT) - -/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ -#define ELF_MACHINE_RELOC_NOPLT R_SPARC_JMP_SLOT - -/* The SPARC never uses Elf32_Rel relocations. */ -#define ELF_MACHINE_NO_REL 1 - - -/* Set up the loaded object described by L so its unrelocated PLT - entries will jump to the on-demand fixup code in dl-runtime.c. */ - -static inline int -elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) -{ - Elf32_Addr *plt; - extern void _dl_runtime_resolve (Elf32_Word); - - if (l->l_info[DT_JMPREL] && lazy) - { - /* The entries for functions in the PLT have not yet been filled in. - Their initial contents will arrange when called to set the high 22 - bits of %g1 with an offset into the .rela.plt section and jump to - the beginning of the PLT. */ - plt = (Elf32_Addr *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr); - - /* The beginning of the PLT does: - - save %sp, -64, %sp - pltpc: call _dl_runtime_resolve - nop - .word MAP - - This saves the register window containing the arguments, and the - PC value (pltpc) implicitly saved in %o7 by the call points near the - location where we store the link_map pointer for this object. */ - - plt[0] = OPCODE_SAVE_SP64; /* save %sp, -64, %sp */ - /* Construct PC-relative word address. */ - plt[1] = OPCODE_CALL | (((Elf32_Addr) &_dl_runtime_resolve - - (Elf32_Addr) &plt[1]) >> 2); - plt[2] = OPCODE_NOP; /* Fill call delay slot. */ - plt[3] = (Elf32_Addr *) l; - } - - return lazy; -} - -/* This code is used in dl-runtime.c to call the `fixup' function - and then redirect to the address it returns. */ -#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ -# Trampoline for _dl_runtime_resolver - .globl _dl_runtime_resolve - .type _dl_runtime_resolve, @function -_dl_runtime_resolve: - t 1 - #call %g0 - # Pass two args to fixup: the PLT address computed from the PC saved - # in the PLT's call insn, and the reloc offset passed in %g1. - #ld [%o7 + 8], %o1 | Second arg, loaded from PLTPC[2]. - #call fixup - #shrl %g1, 22, %o0 | First arg, set in delay slot of call. - # Jump to the real function. - #jmpl %o0, %g0 - # In the delay slot of that jump, restore the register window - # saved by the first insn of the PLT. - #restore - .size _dl_runtime_resolve, . - _dl_runtime_resolve -"); - -/* The PLT uses Elf32_Rela relocs. */ -#define elf_machine_relplt elf_machine_rela - - -/* Mask identifying addresses reserved for the user program, - where the dynamic linker should not map anything. */ -#define ELF_MACHINE_USER_ADDRESS_MASK ??? - -/* Initial entry point code for the dynamic linker. - The C function `_dl_start' is the real entry point; - its return value is the user program's entry point. */ - -#define RTLD_START __asm__ ( \ -".text\n\ - .globl _start\n\ - .type _start,@function\n\ -_start:\n\ - /* Pass pointer to argument block to _dl_start. */\n\ - add %sp,64,%o0\n\ - call _dl_start\n\ - nop\n\ - \n\ - mov %o0,%l0\n\ - \n\ -2:\n\ - call 1f\n\ - nop\n\ -1:\n\ - sethi %hi(_GLOBAL_OFFSET_TABLE_-(2b-.)),%l2\n\ - sethi %hi(_dl_default_scope),%l3\n\ - or %l2,%lo(_GLOBAL_OFFSET_TABLE_-(2b-.)),%l2\n\ - or %l3,%lo(_dl_default_scope),%l3\n\ - add %o7,%l2,%l1\n\ - # %l1 has the GOT. %l3 has _dl_default_scope GOT offset\n\ - ld [%l1+%l3],%l4\n\ - # %l4 has pointer to _dl_default_scope. Now, load _dl_default_scope [2]\n\ - ld [%l4+8],%l4\n\ - # %l4 has _dl_default_scope [2]\n\ - # call _dl_init_next until it returns 0, pass _dl_default_scope [2]\n\ -3:\n\ - call _dl_init_next\n\ - mov %l4,%o0\n\ - cmp %o0,%g0\n\ - bz,a 4f\n\ - nop\n\ - call %o0\n\ - /* Pass pointer to argument block to this init function */\n\ - add %sp,64,%o0\n\ - b,a 3b\n\ -4:\n\ - # Clear the _dl_starting_up variable and pass _dl_fini in %g1 as per ELF ABI.\n\ - sethi %hi(_dl_starting_up),%l4\n\ - sethi %hi(_dl_fini),%l3\n\ - or %l4,%lo(_dl_starting_up),%l4\n\ - or %l3,%lo(_dl_fini),%l3\n\ - # clear _dl_starting_up\n\ - ld [%l1+%l4],%l5\n\ - st %g0,[%l5]\n\ - # load out fini function for atexit in %g1\n\ - ld [%l3+%l1],%g1\n\ - # jump to the user program entry point.\n\ - jmpl %l0,%g0\n\ - nop\n\ -"); diff --git a/sysdeps/sparc/dotmul.S b/sysdeps/sparc/dotmul.S deleted file mode 100644 index 7ce695cb7a..0000000000 --- a/sysdeps/sparc/dotmul.S +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Signed multiply, from Appendix E of the Sparc Version 8 - * Architecture Manual. - */ - -/* - * Returns %o0 * %o1 in %o1%o0 (i.e., %o1 holds the upper 32 bits of - * the 64-bit product). - * - * This code optimizes short (less than 13-bit) multiplies. - */ - -#include "sysdep.h" -ENTRY(.mul) - mov %o0, %y ! multiplier -> Y - andncc %o0, 0xfff, %g0 ! test bits 12..31 - be Lmul_shortway ! if zero, can do it the short way - andcc %g0, %g0, %o4 ! zero the partial product and clear N and V - - /* - * Long multiply. 32 steps, followed by a final shift step. - */ - mulscc %o4, %o1, %o4 ! 1 - mulscc %o4, %o1, %o4 ! 2 - mulscc %o4, %o1, %o4 ! 3 - mulscc %o4, %o1, %o4 ! 4 - mulscc %o4, %o1, %o4 ! 5 - mulscc %o4, %o1, %o4 ! 6 - mulscc %o4, %o1, %o4 ! 7 - mulscc %o4, %o1, %o4 ! 8 - mulscc %o4, %o1, %o4 ! 9 - mulscc %o4, %o1, %o4 ! 10 - mulscc %o4, %o1, %o4 ! 11 - mulscc %o4, %o1, %o4 ! 12 - mulscc %o4, %o1, %o4 ! 13 - mulscc %o4, %o1, %o4 ! 14 - mulscc %o4, %o1, %o4 ! 15 - mulscc %o4, %o1, %o4 ! 16 - mulscc %o4, %o1, %o4 ! 17 - mulscc %o4, %o1, %o4 ! 18 - mulscc %o4, %o1, %o4 ! 19 - mulscc %o4, %o1, %o4 ! 20 - mulscc %o4, %o1, %o4 ! 21 - mulscc %o4, %o1, %o4 ! 22 - mulscc %o4, %o1, %o4 ! 23 - mulscc %o4, %o1, %o4 ! 24 - mulscc %o4, %o1, %o4 ! 25 - mulscc %o4, %o1, %o4 ! 26 - mulscc %o4, %o1, %o4 ! 27 - mulscc %o4, %o1, %o4 ! 28 - mulscc %o4, %o1, %o4 ! 29 - mulscc %o4, %o1, %o4 ! 30 - mulscc %o4, %o1, %o4 ! 31 - mulscc %o4, %o1, %o4 ! 32 - mulscc %o4, %g0, %o4 ! final shift - - ! If %o0 was negative, the result is - ! (%o0 * %o1) + (%o1 << 32)) - ! We fix that here. - -#if 0 - tst %o0 - bge 1f - rd %y, %o0 - - ! %o0 was indeed negative; fix upper 32 bits of result by subtracting - ! %o1 (i.e., return %o4 - %o1 in %o1). - retl - sub %o4, %o1, %o1 - -1: - retl - mov %o4, %o1 -#else - /* Faster code adapted from tege@sics.se's code for umul.S. */ - sra %o0, 31, %o2 ! make mask from sign bit - and %o1, %o2, %o2 ! %o2 = 0 or %o1, depending on sign of %o0 - rd %y, %o0 ! get lower half of product - retl - sub %o4, %o2, %o1 ! subtract compensation - ! and put upper half in place -#endif - -Lmul_shortway: - /* - * Short multiply. 12 steps, followed by a final shift step. - * The resulting bits are off by 12 and (32-12) = 20 bit positions, - * but there is no problem with %o0 being negative (unlike above). - */ - mulscc %o4, %o1, %o4 ! 1 - mulscc %o4, %o1, %o4 ! 2 - mulscc %o4, %o1, %o4 ! 3 - mulscc %o4, %o1, %o4 ! 4 - mulscc %o4, %o1, %o4 ! 5 - mulscc %o4, %o1, %o4 ! 6 - mulscc %o4, %o1, %o4 ! 7 - mulscc %o4, %o1, %o4 ! 8 - mulscc %o4, %o1, %o4 ! 9 - mulscc %o4, %o1, %o4 ! 10 - mulscc %o4, %o1, %o4 ! 11 - mulscc %o4, %o1, %o4 ! 12 - mulscc %o4, %g0, %o4 ! final shift - - /* - * %o4 has 20 of the bits that should be in the low part of the - * result; %y has the bottom 12 (as %y's top 12). That is: - * - * %o4 %y - * +----------------+----------------+ - * | -12- | -20- | -12- | -20- | - * +------(---------+------)---------+ - * --hi-- ----low-part---- - * - * The upper 12 bits of %o4 should be sign-extended to form the - * high part of the product (i.e., highpart = %o4 >> 20). - */ - - rd %y, %o5 - sll %o4, 12, %o0 ! shift middle bits left 12 - srl %o5, 20, %o5 ! shift low bits right 20, zero fill at left - or %o5, %o0, %o0 ! construct low part of result - retl - sra %o4, 20, %o1 ! ... and extract high part of result diff --git a/sysdeps/sparc/e_sqrt.c b/sysdeps/sparc/e_sqrt.c deleted file mode 100644 index a98ae21ace..0000000000 --- a/sysdeps/sparc/e_sqrt.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include - -#ifndef __GNUC__ - #error This file uses GNU C extensions; you must compile with GCC. -#endif - -/* Return the square root of X. */ -double -__ieee754_sqrt (x) - double x; -{ - register double result; - asm ("fsqrtd %1, %0" : "=f" (result) : "f" (x)); - return result; -} diff --git a/sysdeps/sparc/elf/Makefile b/sysdeps/sparc/elf/Makefile deleted file mode 100644 index 319fbdef10..0000000000 --- a/sysdeps/sparc/elf/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -# Sparc/ELF specific definitions. - -# The assembler on SPARC needs the -fPIC flag even when it's assembler code. -ASFLAGS-.so = -fPIC diff --git a/sysdeps/sparc/elf/start.c b/sysdeps/sparc/elf/start.c deleted file mode 100644 index f1e80195ca..0000000000 --- a/sysdeps/sparc/elf/start.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include -#include -#include - -extern char **__environ; - -extern void __libc_init_first __P ((int argc, char **argv, char **envp)); -extern int main __P ((int argc, char **argv, char **envp)); - -register long int sp asm("%sp"), fp asm("%fp"); - -void -_start (void) -{ - /* It is important that these be declared `register'. - Otherwise, when compiled without optimization, they are put on the - stack, which loses completely after we zero the FP. */ - register int argc; - register char **argv, **envp; - register long int g1 asm ("%g1"); - unsigned long int copy_g1 = g1; - - /* Unwind the frame built when we entered the function. */ - asm("restore"); - if (copy_g1) - atexit (copy_g1); - - /* And clear the frame pointer. */ - fp = 0; - - /* The argument info starts after one register - window (64 bytes) past the SP. */ - argc = ((int *) sp)[16]; - argv = (char **) &((int *) sp)[17]; - envp = &argv[argc + 1]; - __environ = envp; - - /* Allocate 24 bytes of stack space for the register save area. */ - sp -= 24; - __libc_init_first (argc, argv, envp); -#ifdef ELF_INIT_FINI - { - extern void _fini (void); - _init (); - atexit (_fini); - } -#endif - exit (main (argc, argv, envp)); -} diff --git a/sysdeps/sparc/fpu/bits/mathdef.h b/sysdeps/sparc/fpu/bits/mathdef.h new file mode 100644 index 0000000000..0bc9c94ecc --- /dev/null +++ b/sysdeps/sparc/fpu/bits/mathdef.h @@ -0,0 +1,64 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _MATH_H +#error "Never use directly; include instead" +#endif + +/* FIXME! This file describes properties of the compiler, not the machine; + it should not be part of libc! */ + +#ifdef __GNUC__ +#if __STDC__ == 1 + +/* In GNU or ANSI mode, gcc leaves `float' expressions as-is. */ +typedef float float_t; +typedef double double_t; + +/* Signal that types stay as they were declared. */ +#define FLT_EVAL_METHOD 0 + +/* Define `INFINITY' as value of type `float_t'. */ +#define INFINITY HUGE_VALF + +#else + +/* For `gcc -traditional', `float' expressions are evaluated as `double'. */ +typedef double float_t; +typedef double double_t; + +/* Signal that both types are `double'. */ +#define FLT_EVAL_METHOD 1 + +/* Define `INFINITY' as value of type `float_t'. */ +#define INFINITY HUGE_VAL + +#endif +#else + +/* Wild guess at types for float_t and double_t. */ +typedef double float_t; +typedef double double_t; + +/* Strange compiler, we don't know how it works. */ +#define FLT_EVAL_METHOD -1 + +/* Define `INFINITY' as value of type `float_t'. */ +#define INFINITY HUGE_VAL + +#endif diff --git a/sysdeps/sparc/fpu/fclrexcpt.c b/sysdeps/sparc/fpu/fclrexcpt.c new file mode 100644 index 0000000000..8dc68e84e9 --- /dev/null +++ b/sysdeps/sparc/fpu/fclrexcpt.c @@ -0,0 +1,32 @@ +/* Clear given exceptions in current floating-point environment. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +void +feclearexcept (int excepts) +{ + fenv_t tmp; + + __fenv_stfsr (tmp); + + tmp &= ~(excepts & FE_ALL_EXCEPT); + + __fenv_ldfsr (tmp); +} diff --git a/sysdeps/sparc/fpu/fegetenv.c b/sysdeps/sparc/fpu/fegetenv.c new file mode 100644 index 0000000000..a796ccb731 --- /dev/null +++ b/sysdeps/sparc/fpu/fegetenv.c @@ -0,0 +1,26 @@ +/* Store current floating-point environment. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +void +fegetenv (fenv_t *envp) +{ + __fenv_stfsr (*envp); +} diff --git a/sysdeps/sparc/fpu/fegetround.c b/sysdeps/sparc/fpu/fegetround.c new file mode 100644 index 0000000000..ea1df2b6d8 --- /dev/null +++ b/sysdeps/sparc/fpu/fegetround.c @@ -0,0 +1,30 @@ +/* Return current rounding direction. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +int +fegetround (void) +{ + fenv_t tmp; + + __fenv_stfsr (tmp); + + return tmp & __FE_ROUND_MASK; +} diff --git a/sysdeps/sparc/fpu/feholdexcpt.c b/sysdeps/sparc/fpu/feholdexcpt.c new file mode 100644 index 0000000000..9b4c2134f7 --- /dev/null +++ b/sysdeps/sparc/fpu/feholdexcpt.c @@ -0,0 +1,35 @@ +/* Store current floating-point environment and clear exceptions. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +int +feholdexcept (fenv_t *envp) +{ + fenv_t tmp; + + __fenv_stfsr (*envp); + + /* Set all exceptions to non-stop. */ + tmp = *envp | (0x1f << 23); + + __fenv_ldfsr (tmp); + + return 1; +} diff --git a/sysdeps/sparc/fpu/fesetenv.c b/sysdeps/sparc/fpu/fesetenv.c new file mode 100644 index 0000000000..44c5b2629c --- /dev/null +++ b/sysdeps/sparc/fpu/fesetenv.c @@ -0,0 +1,43 @@ +/* Install given floating-point environment. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +void +fesetenv (const fenv_t *envp) +{ + fenv_t dummy; + + /* Put these constants in memory explicitly, so as to cope with a + -fPIC bug as of gcc 970624. Making them automatic is quicker + than loading up the pic register in this instance. */ + + if (envp == FE_DFL_ENV) + { + dummy = 0; + envp = &dummy; + } + else if (envp == FE_NOMASK_ENV) + { + dummy = 0x1f << 23; + envp = &dummy; + } + + __fenv_ldfsr (*envp); +} diff --git a/sysdeps/sparc/fpu/fesetround.c b/sysdeps/sparc/fpu/fesetround.c new file mode 100644 index 0000000000..74963d7573 --- /dev/null +++ b/sysdeps/sparc/fpu/fesetround.c @@ -0,0 +1,37 @@ +/* Set current rounding direction. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +int +fesetround (int round) +{ + fenv_t tmp; + + if ((round & ~__FE_ROUND_MASK) != 0) + /* ROUND is no valid rounding mode. */ + return 0; + + __fenv_stfsr (tmp); + tmp &= ~__FE_ROUND_MASK; + tmp |= round; + __fenv_ldfsr (tmp); + + return 1; +} diff --git a/sysdeps/sparc/fpu/feupdateenv.c b/sysdeps/sparc/fpu/feupdateenv.c new file mode 100644 index 0000000000..0fba9975f8 --- /dev/null +++ b/sysdeps/sparc/fpu/feupdateenv.c @@ -0,0 +1,38 @@ +/* Install given floating-point environment and raise exceptions. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +void +feupdateenv (const fenv_t *envp) +{ + fexcept_t tmp; + + /* Save current exceptions. */ + __fenv_stfsr (tmp); + tmp &= FE_ALL_EXCEPT; + + /* Install new environment. */ + fesetenv (envp); + + /* Raise the safed exception. Incidently for us the implementation + defined format of the values in objects of type fexcept_t is the + same as the ones specified using the FE_* constants. */ + feraiseexcept ((int) tmp); +} diff --git a/sysdeps/sparc/fpu/fgetexcptflg.c b/sysdeps/sparc/fpu/fgetexcptflg.c new file mode 100644 index 0000000000..977c93e2ca --- /dev/null +++ b/sysdeps/sparc/fpu/fgetexcptflg.c @@ -0,0 +1,31 @@ +/* Store current representation for exceptions. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +void +fegetexceptflag (fexcept_t *flagp, int excepts) +{ + fexcept_t tmp; + + /* Get the current exceptions. */ + __fenv_stfsr (tmp); + + *flagp = tmp & excepts & FE_ALL_EXCEPT; +} diff --git a/sysdeps/sparc/fpu/fraiseexcpt.c b/sysdeps/sparc/fpu/fraiseexcpt.c new file mode 100644 index 0000000000..308c9b2e7f --- /dev/null +++ b/sysdeps/sparc/fpu/fraiseexcpt.c @@ -0,0 +1,66 @@ +/* Raise given exceptions. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +static void +ignore_me(double foo) +{ +} + +void +feraiseexcept (int excepts) +{ + /* Raise exceptions represented by EXPECTS. But we must raise only + one signal at a time. It is important the if the overflow/underflow + exception and the inexact exception are given at the same time, + the overflow/underflow exception follows the inexact exception. */ + + /* First: invalid exception. */ + if ((FE_INVALID & excepts) != 0) + { + /* One example of a invalid operation is 0/0. */ + ignore_me (0.0 / 0.0); + } + + /* Next: division by zero. */ + if ((FE_DIVBYZERO & excepts) != 0) + { + ignore_me (1.0 / 0.0); + } + + /* Next: overflow. */ + if ((FE_OVERFLOW & excepts) != 0) + { + ignore_me (LDBL_MAX * LDBL_MAX); + } + + /* Next: underflow. */ + if ((FE_UNDERFLOW & excepts) != 0) + { + ignore_me (LDBL_MIN / 16.0); + } + + /* Last: inexact. */ + if ((FE_INEXACT & excepts) != 0) + { + ignore_me (1.0 / M_PI); + } +} diff --git a/sysdeps/sparc/fpu/fsetexcptflg.c b/sysdeps/sparc/fpu/fsetexcptflg.c new file mode 100644 index 0000000000..1029cde03d --- /dev/null +++ b/sysdeps/sparc/fpu/fsetexcptflg.c @@ -0,0 +1,34 @@ +/* Set floating-point environment exception handling. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +void +fesetexceptflag (const fexcept_t *flagp, int excepts) +{ + fenv_t tmp; + + __fenv_stfsr (tmp); + + tmp &= ~(excepts & FE_ALL_EXCEPT); + tmp |= *flagp & excepts & FE_ALL_EXCEPT; + + __fenv_ldfsr (tmp); +} diff --git a/sysdeps/sparc/fpu/ftestexcept.c b/sysdeps/sparc/fpu/ftestexcept.c new file mode 100644 index 0000000000..3efe9e896b --- /dev/null +++ b/sysdeps/sparc/fpu/ftestexcept.c @@ -0,0 +1,30 @@ +/* Test exception in current environment. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +int +fetestexcept (int excepts) +{ + int tmp; + + __fenv_stfsr (tmp); + + return tmp & excepts & FE_ALL_EXCEPT; +} diff --git a/sysdeps/sparc/fpu_control.h b/sysdeps/sparc/fpu_control.h deleted file mode 100644 index 5ef3824702..0000000000 --- a/sysdeps/sparc/fpu_control.h +++ /dev/null @@ -1,69 +0,0 @@ -/* FPU control word bits. SPARC version. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _FPU_CONTROL_H -#define _FPU_CONTROL_H 1 - - -#include - -/* precision control */ -#define _FPU_EXTENDED 0x00000000 /* RECOMMENDED */ -#define _FPU_DOUBLE 0x20000000 -#define _FPU_80BIT 0x30000000 -#define _FPU_SINGLE 0x10000000 /* DO NOT USE */ - -/* rounding control / Sparc */ -#define _FPU_RC_DOWN 0xc0000000 -#define _FPU_RC_UP 0x80000000 -#define _FPU_RC_ZERO 0x40000000 -#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */ - -#define _FPU_RESERVED 0x30300000 /* Reserved bits in cw */ - - -/* Now two recommended cw */ - -/* Linux default: - - extended precision - - rounding to nearest - - exceptions on overflow, zero divide and NaN */ -#define _FPU_DEFAULT 0x1e - -/* IEEE: same as above, but exceptions */ -#define _FPU_IEEE 0x0 - -/* Type of the control word. */ -typedef unsigned int fpu_control_t; - -#define _FPU_GETCW(cw) __asm__ ("st %%fsr,%0" : "=m" (*&cw)) -#define _FPU_SETCW(cw) __asm__ ("ld %0,%%fsr" : : "m" (*&cw)) - -/* Default control word set at startup. */ -extern fpu_control_t __fpu_control; - -__BEGIN_DECLS - -/* Called at startup. It can be used to manipulate fpu control register. */ -extern void __setfpucw __P ((fpu_control_t)); - -__END_DECLS - -#endif /* fpu_control.h */ diff --git a/sysdeps/sparc/lshift.S b/sysdeps/sparc/lshift.S deleted file mode 100644 index 4f0595f2fb..0000000000 --- a/sysdeps/sparc/lshift.S +++ /dev/null @@ -1,95 +0,0 @@ -! sparc __mpn_lshift -- - -! Copyright (C) 1995, 1996 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr %o0 -! src_ptr %o1 -! size %o2 -! cnt %o3 - -#include "sysdep.h" - - .text - .align 4 - .global C_SYMBOL_NAME(__mpn_lshift) -C_SYMBOL_NAME(__mpn_lshift): - sll %o2,2,%g1 - add %o1,%g1,%o1 ! make %o1 point at end of src - ld [%o1-4],%g2 ! load first limb - sub %g0,%o3,%o5 ! negate shift count - add %o0,%g1,%o0 ! make %o0 point at end of res - add %o2,-1,%o2 - andcc %o2,4-1,%g4 ! number of limbs in first loop - srl %g2,%o5,%g1 ! compute function result - be L0 ! if multiple of 4 limbs, skip first loop - st %g1,[%sp+80] - - sub %o2,%g4,%o2 ! adjust count for main loop - -Loop0: ld [%o1-8],%g3 - add %o0,-4,%o0 - add %o1,-4,%o1 - addcc %g4,-1,%g4 - sll %g2,%o3,%o4 - srl %g3,%o5,%g1 - mov %g3,%g2 - or %o4,%g1,%o4 - bne Loop0 - st %o4,[%o0+0] - -L0: tst %o2 - be Lend - nop - -Loop: ld [%o1-8],%g3 - add %o0,-16,%o0 - addcc %o2,-4,%o2 - sll %g2,%o3,%o4 - srl %g3,%o5,%g1 - - ld [%o1-12],%g2 - sll %g3,%o3,%g4 - or %o4,%g1,%o4 - st %o4,[%o0+12] - srl %g2,%o5,%g1 - - ld [%o1-16],%g3 - sll %g2,%o3,%o4 - or %g4,%g1,%g4 - st %g4,[%o0+8] - srl %g3,%o5,%g1 - - ld [%o1-20],%g2 - sll %g3,%o3,%g4 - or %o4,%g1,%o4 - st %o4,[%o0+4] - srl %g2,%o5,%g1 - - add %o1,-16,%o1 - or %g4,%g1,%g4 - bne Loop - st %g4,[%o0+0] - -Lend: sll %g2,%o3,%g2 - st %g2,[%o0-4] - retl - ld [%sp+80],%o0 diff --git a/sysdeps/sparc/memcopy.h b/sysdeps/sparc/memcopy.h deleted file mode 100644 index ff73f453da..0000000000 --- a/sysdeps/sparc/memcopy.h +++ /dev/null @@ -1,21 +0,0 @@ -/* Copyright (C) 1991, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#undef reg_char -#define reg_char int diff --git a/sysdeps/sparc/mul_1.S b/sysdeps/sparc/mul_1.S deleted file mode 100644 index 142fd8ba2a..0000000000 --- a/sysdeps/sparc/mul_1.S +++ /dev/null @@ -1,199 +0,0 @@ -! SPARC __mpn_mul_1 -- Multiply a limb vector with a limb and store -! the result in a second limb vector. - -! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr o0 -! s1_ptr o1 -! size o2 -! s2_limb o3 - -! ADD CODE FOR SMALL MULTIPLIERS! -!1: ld -! st -! -!2: ld ,a -! addxcc a,a,x -! st x, -! -!3_unrolled: -! ld ,a -! addxcc a,a,x1 ! 2a + cy -! addx %g0,%g0,x2 -! addcc a,x1,x ! 3a + c -! st x, -! -! ld ,a -! addxcc a,a,y1 -! addx %g0,%g0,y2 -! addcc a,y1,x -! st x, -! -!4_unrolled: -! ld ,a -! srl a,2,x1 ! 4a -! addxcc y2,x1,x -! sll a,30,x2 -! st x, -! -! ld ,a -! srl a,2,y1 -! addxcc x2,y1,y -! sll a,30,y2 -! st x, -! -!5_unrolled: -! ld ,a -! srl a,2,x1 ! 4a -! addxcc a,x1,x ! 5a + c -! sll a,30,x2 -! addx %g0,x2,x2 -! st x, -! -! ld ,a -! srl a,2,y1 -! addxcc a,y1,x -! sll a,30,y2 -! addx %g0,y2,y2 -! st x, -! -!8_unrolled: -! ld ,a -! srl a,3,x1 ! 8a -! addxcc y2,x1,x -! sll a,29,x2 -! st x, -! -! ld ,a -! srl a,3,y1 -! addxcc x2,y1,y -! sll a,29,y2 -! st x, - -#include "sysdep.h" - -.text - .align 4 - .global C_SYMBOL_NAME(__mpn_mul_1) -C_SYMBOL_NAME(__mpn_mul_1): - ! Make S1_PTR and RES_PTR point at the end of their blocks - ! and put (- 4 x SIZE) in index/loop counter. - sll %o2,2,%o2 - add %o0,%o2,%o4 ! RES_PTR in o4 since o0 is retval - add %o1,%o2,%o1 - sub %g0,%o2,%o2 - - cmp %o3,0xfff - bgu Large - nop - - ld [%o1+%o2],%o5 - mov 0,%o0 - b L0 - add %o4,-4,%o4 -Loop0: - st %g1,[%o4+%o2] -L0: wr %g0,%o3,%y - sra %o5,31,%g2 - and %o3,%g2,%g2 - andcc %g1,0,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,0,%g1 - sra %g1,20,%g4 - sll %g1,12,%g1 - rd %y,%g3 - srl %g3,20,%g3 - or %g1,%g3,%g1 - - addcc %g1,%o0,%g1 - addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb - addcc %o2,4,%o2 ! loop counter - bne,a Loop0 - ld [%o1+%o2],%o5 - - retl - st %g1,[%o4+%o2] - - -Large: ld [%o1+%o2],%o5 - mov 0,%o0 - sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0 - b L1 - add %o4,-4,%o4 -Loop: - st %g3,[%o4+%o2] -L1: wr %g0,%o5,%y - and %o5,%g4,%g2 ! g2 = S1_LIMB iff S2_LIMB < 0, else 0 - andcc %g0,%g0,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%g0,%g1 - rd %y,%g3 - addcc %g3,%o0,%g3 - addx %g2,%g1,%o0 ! add sign-compensation and cy to hi limb - addcc %o2,4,%o2 ! loop counter - bne,a Loop - ld [%o1+%o2],%o5 - - retl - st %g3,[%o4+%o2] diff --git a/sysdeps/sparc/rem.S b/sysdeps/sparc/rem.S deleted file mode 100644 index d50f1af630..0000000000 --- a/sysdeps/sparc/rem.S +++ /dev/null @@ -1,369 +0,0 @@ - /* This file is generated from divrem.m4; DO NOT EDIT! */ -/* - * Division and remainder, from Appendix E of the Sparc Version 8 - * Architecture Manual, with fixes from Gordon Irlam. - */ - -/* - * Input: dividend and divisor in %o0 and %o1 respectively. - * - * m4 parameters: - * .rem name of function to generate - * rem rem=div => %o0 / %o1; rem=rem => %o0 % %o1 - * true true=true => signed; true=false => unsigned - * - * Algorithm parameters: - * N how many bits per iteration we try to get (4) - * WORDSIZE total number of bits (32) - * - * Derived constants: - * TOPBITS number of bits in the top decade of a number - * - * Important variables: - * Q the partial quotient under development (initially 0) - * R the remainder so far, initially the dividend - * ITER number of main division loop iterations required; - * equal to ceil(log2(quotient) / N). Note that this - * is the log base (2^N) of the quotient. - * V the current comparand, initially divisor*2^(ITER*N-1) - * - * Cost: - * Current estimate for non-large dividend is - * ceil(log2(quotient) / N) * (10 + 7N/2) + C - * A large dividend is one greater than 2^(31-TOPBITS) and takes a - * different path, as the upper bits of the quotient must be developed - * one bit at a time. - */ - - - -#include "sysdep.h" -#ifdef __linux__ -#include -#else -#ifdef __svr4__ -#include -#else -#include -#endif -#endif - -ENTRY(.rem) - ! compute sign of result; if neither is negative, no problem - orcc %o1, %o0, %g0 ! either negative? - bge 2f ! no, go do the divide - mov %o0, %g6 ! sign of remainder matches %o0 - tst %o1 - bge 1f - tst %o0 - ! %o1 is definitely negative; %o0 might also be negative - bge 2f ! if %o0 not negative... - sub %g0, %o1, %o1 ! in any case, make %o1 nonneg -1: ! %o0 is negative, %o1 is nonnegative - sub %g0, %o0, %o0 ! make %o0 nonnegative -2: - - ! Ready to divide. Compute size of quotient; scale comparand. - orcc %o1, %g0, %o5 - bne 1f - mov %o0, %o3 - - ! Divide by zero trap. If it returns, return 0 (about as - ! wrong as possible, but that is what SunOS does...). - ta ST_DIV0 - retl - clr %o0 - -1: - cmp %o3, %o5 ! if %o1 exceeds %o0, done - blu Lgot_result ! (and algorithm fails otherwise) - clr %o2 - sethi %hi(1 << (32 - 4 - 1)), %g1 - cmp %o3, %g1 - blu Lnot_really_big - clr %o4 - - ! Here the dividend is >= 2**(31-N) or so. We must be careful here, - ! as our usual N-at-a-shot divide step will cause overflow and havoc. - ! The number of bits in the result here is N*ITER+SC, where SC <= N. - ! Compute ITER in an unorthodox manner: know we need to shift V into - ! the top decade: so do not even bother to compare to R. - 1: - cmp %o5, %g1 - bgeu 3f - mov 1, %g7 - sll %o5, 4, %o5 - b 1b - add %o4, 1, %o4 - - ! Now compute %g7. - 2: addcc %o5, %o5, %o5 - bcc Lnot_too_big - add %g7, 1, %g7 - - ! We get here if the %o1 overflowed while shifting. - ! This means that %o3 has the high-order bit set. - ! Restore %o5 and subtract from %o3. - sll %g1, 4, %g1 ! high order bit - srl %o5, 1, %o5 ! rest of %o5 - add %o5, %g1, %o5 - b Ldo_single_div - sub %g7, 1, %g7 - - Lnot_too_big: - 3: cmp %o5, %o3 - blu 2b - nop - be Ldo_single_div - nop - /* NB: these are commented out in the V8-Sparc manual as well */ - /* (I do not understand this) */ - ! %o5 > %o3: went too far: back up 1 step - ! srl %o5, 1, %o5 - ! dec %g7 - ! do single-bit divide steps - ! - ! We have to be careful here. We know that %o3 >= %o5, so we can do the - ! first divide step without thinking. BUT, the others are conditional, - ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- - ! order bit set in the first step, just falling into the regular - ! division loop will mess up the first time around. - ! So we unroll slightly... - Ldo_single_div: - subcc %g7, 1, %g7 - bl Lend_regular_divide - nop - sub %o3, %o5, %o3 - mov 1, %o2 - b Lend_single_divloop - nop - Lsingle_divloop: - sll %o2, 1, %o2 - bl 1f - srl %o5, 1, %o5 - ! %o3 >= 0 - sub %o3, %o5, %o3 - b 2f - add %o2, 1, %o2 - 1: ! %o3 < 0 - add %o3, %o5, %o3 - sub %o2, 1, %o2 - 2: - Lend_single_divloop: - subcc %g7, 1, %g7 - bge Lsingle_divloop - tst %o3 - b,a Lend_regular_divide - -Lnot_really_big: -1: - sll %o5, 4, %o5 - cmp %o5, %o3 - bleu 1b - addcc %o4, 1, %o4 - be Lgot_result - sub %o4, 1, %o4 - - tst %o3 ! set up for initial iteration -Ldivloop: - sll %o2, 4, %o2 - ! depth 1, accumulated bits 0 - bl L.1.16 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 2, accumulated bits 1 - bl L.2.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits 3 - bl L.3.19 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 7 - bl L.4.23 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (7*2+1), %o2 - -L.4.23: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (7*2-1), %o2 - - -L.3.19: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 5 - bl L.4.21 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (5*2+1), %o2 - -L.4.21: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (5*2-1), %o2 - - - -L.2.17: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits 1 - bl L.3.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 3 - bl L.4.19 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (3*2+1), %o2 - -L.4.19: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (3*2-1), %o2 - - -L.3.17: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 1 - bl L.4.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (1*2+1), %o2 - -L.4.17: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (1*2-1), %o2 - - - - -L.1.16: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 2, accumulated bits -1 - bl L.2.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits -1 - bl L.3.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -1 - bl L.4.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2+1), %o2 - -L.4.15: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2-1), %o2 - - -L.3.15: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -3 - bl L.4.13 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2+1), %o2 - -L.4.13: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2-1), %o2 - - - -L.2.15: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits -3 - bl L.3.13 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -5 - bl L.4.11 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2+1), %o2 - -L.4.11: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2-1), %o2 - - -L.3.13: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -7 - bl L.4.9 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2+1), %o2 - -L.4.9: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2-1), %o2 - - - - - 9: -Lend_regular_divide: - subcc %o4, 1, %o4 - bge Ldivloop - tst %o3 - bl,a Lgot_result - ! non-restoring fixup here (one instruction only!) - add %o3, %o1, %o3 - - -Lgot_result: - ! check to see if answer should be < 0 - tst %g6 - bl,a 1f - sub %g0, %o3, %o3 -1: - retl - mov %o3, %o0 diff --git a/sysdeps/sparc/rshift.S b/sysdeps/sparc/rshift.S deleted file mode 100644 index fea4f3b926..0000000000 --- a/sysdeps/sparc/rshift.S +++ /dev/null @@ -1,92 +0,0 @@ -! sparc __mpn_rshift -- - -! Copyright (C) 1995, 1996 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr %o0 -! src_ptr %o1 -! size %o2 -! cnt %o3 - -#include "sysdep.h" - - .text - .align 4 - .global C_SYMBOL_NAME(__mpn_rshift) -C_SYMBOL_NAME(__mpn_rshift): - ld [%o1],%g2 ! load first limb - sub %g0,%o3,%o5 ! negate shift count - add %o2,-1,%o2 - andcc %o2,4-1,%g4 ! number of limbs in first loop - sll %g2,%o5,%g1 ! compute function result - be L0 ! if multiple of 4 limbs, skip first loop - st %g1,[%sp+80] - - sub %o2,%g4,%o2 ! adjust count for main loop - -Loop0: ld [%o1+4],%g3 - add %o0,4,%o0 - add %o1,4,%o1 - addcc %g4,-1,%g4 - srl %g2,%o3,%o4 - sll %g3,%o5,%g1 - mov %g3,%g2 - or %o4,%g1,%o4 - bne Loop0 - st %o4,[%o0-4] - -L0: tst %o2 - be Lend - nop - -Loop: ld [%o1+4],%g3 - add %o0,16,%o0 - addcc %o2,-4,%o2 - srl %g2,%o3,%o4 - sll %g3,%o5,%g1 - - ld [%o1+8],%g2 - srl %g3,%o3,%g4 - or %o4,%g1,%o4 - st %o4,[%o0-16] - sll %g2,%o5,%g1 - - ld [%o1+12],%g3 - srl %g2,%o3,%o4 - or %g4,%g1,%g4 - st %g4,[%o0-12] - sll %g3,%o5,%g1 - - ld [%o1+16],%g2 - srl %g3,%o3,%g4 - or %o4,%g1,%o4 - st %o4,[%o0-8] - sll %g2,%o5,%g1 - - add %o1,16,%o1 - or %g4,%g1,%g4 - bne Loop - st %g4,[%o0-4] - -Lend: srl %g2,%o3,%g2 - st %g2,[%o0-0] - retl - ld [%sp+80],%o0 diff --git a/sysdeps/sparc/sdiv.S b/sysdeps/sparc/sdiv.S deleted file mode 100644 index 02ed2e973c..0000000000 --- a/sysdeps/sparc/sdiv.S +++ /dev/null @@ -1,369 +0,0 @@ - /* This file is generated from divrem.m4; DO NOT EDIT! */ -/* - * Division and remainder, from Appendix E of the Sparc Version 8 - * Architecture Manual, with fixes from Gordon Irlam. - */ - -/* - * Input: dividend and divisor in %o0 and %o1 respectively. - * - * m4 parameters: - * .div name of function to generate - * div div=div => %o0 / %o1; div=rem => %o0 % %o1 - * true true=true => signed; true=false => unsigned - * - * Algorithm parameters: - * N how many bits per iteration we try to get (4) - * WORDSIZE total number of bits (32) - * - * Derived constants: - * TOPBITS number of bits in the top decade of a number - * - * Important variables: - * Q the partial quotient under development (initially 0) - * R the remainder so far, initially the dividend - * ITER number of main division loop iterations required; - * equal to ceil(log2(quotient) / N). Note that this - * is the log base (2^N) of the quotient. - * V the current comparand, initially divisor*2^(ITER*N-1) - * - * Cost: - * Current estimate for non-large dividend is - * ceil(log2(quotient) / N) * (10 + 7N/2) + C - * A large dividend is one greater than 2^(31-TOPBITS) and takes a - * different path, as the upper bits of the quotient must be developed - * one bit at a time. - */ - - - -#include "sysdep.h" -#ifdef __linux__ -#include -#else -#ifdef __svr4__ -#include -#else -#include -#endif -#endif - -ENTRY(.div) - ! compute sign of result; if neither is negative, no problem - orcc %o1, %o0, %g0 ! either negative? - bge 2f ! no, go do the divide - xor %o1, %o0, %g6 ! compute sign in any case - tst %o1 - bge 1f - tst %o0 - ! %o1 is definitely negative; %o0 might also be negative - bge 2f ! if %o0 not negative... - sub %g0, %o1, %o1 ! in any case, make %o1 nonneg -1: ! %o0 is negative, %o1 is nonnegative - sub %g0, %o0, %o0 ! make %o0 nonnegative -2: - - ! Ready to divide. Compute size of quotient; scale comparand. - orcc %o1, %g0, %o5 - bne 1f - mov %o0, %o3 - - ! Divide by zero trap. If it returns, return 0 (about as - ! wrong as possible, but that is what SunOS does...). - ta ST_DIV0 - retl - clr %o0 - -1: - cmp %o3, %o5 ! if %o1 exceeds %o0, done - blu Lgot_result ! (and algorithm fails otherwise) - clr %o2 - sethi %hi(1 << (32 - 4 - 1)), %g1 - cmp %o3, %g1 - blu Lnot_really_big - clr %o4 - - ! Here the dividend is >= 2**(31-N) or so. We must be careful here, - ! as our usual N-at-a-shot divide step will cause overflow and havoc. - ! The number of bits in the result here is N*ITER+SC, where SC <= N. - ! Compute ITER in an unorthodox manner: know we need to shift V into - ! the top decade: so do not even bother to compare to R. - 1: - cmp %o5, %g1 - bgeu 3f - mov 1, %g7 - sll %o5, 4, %o5 - b 1b - add %o4, 1, %o4 - - ! Now compute %g7. - 2: addcc %o5, %o5, %o5 - bcc Lnot_too_big - add %g7, 1, %g7 - - ! We get here if the %o1 overflowed while shifting. - ! This means that %o3 has the high-order bit set. - ! Restore %o5 and subtract from %o3. - sll %g1, 4, %g1 ! high order bit - srl %o5, 1, %o5 ! rest of %o5 - add %o5, %g1, %o5 - b Ldo_single_div - sub %g7, 1, %g7 - - Lnot_too_big: - 3: cmp %o5, %o3 - blu 2b - nop - be Ldo_single_div - nop - /* NB: these are commented out in the V8-Sparc manual as well */ - /* (I do not understand this) */ - ! %o5 > %o3: went too far: back up 1 step - ! srl %o5, 1, %o5 - ! dec %g7 - ! do single-bit divide steps - ! - ! We have to be careful here. We know that %o3 >= %o5, so we can do the - ! first divide step without thinking. BUT, the others are conditional, - ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- - ! order bit set in the first step, just falling into the regular - ! division loop will mess up the first time around. - ! So we unroll slightly... - Ldo_single_div: - subcc %g7, 1, %g7 - bl Lend_regular_divide - nop - sub %o3, %o5, %o3 - mov 1, %o2 - b Lend_single_divloop - nop - Lsingle_divloop: - sll %o2, 1, %o2 - bl 1f - srl %o5, 1, %o5 - ! %o3 >= 0 - sub %o3, %o5, %o3 - b 2f - add %o2, 1, %o2 - 1: ! %o3 < 0 - add %o3, %o5, %o3 - sub %o2, 1, %o2 - 2: - Lend_single_divloop: - subcc %g7, 1, %g7 - bge Lsingle_divloop - tst %o3 - b,a Lend_regular_divide - -Lnot_really_big: -1: - sll %o5, 4, %o5 - cmp %o5, %o3 - bleu 1b - addcc %o4, 1, %o4 - be Lgot_result - sub %o4, 1, %o4 - - tst %o3 ! set up for initial iteration -Ldivloop: - sll %o2, 4, %o2 - ! depth 1, accumulated bits 0 - bl L.1.16 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 2, accumulated bits 1 - bl L.2.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits 3 - bl L.3.19 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 7 - bl L.4.23 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (7*2+1), %o2 - -L.4.23: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (7*2-1), %o2 - - -L.3.19: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 5 - bl L.4.21 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (5*2+1), %o2 - -L.4.21: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (5*2-1), %o2 - - - -L.2.17: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits 1 - bl L.3.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 3 - bl L.4.19 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (3*2+1), %o2 - -L.4.19: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (3*2-1), %o2 - - -L.3.17: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 1 - bl L.4.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (1*2+1), %o2 - -L.4.17: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (1*2-1), %o2 - - - - -L.1.16: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 2, accumulated bits -1 - bl L.2.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits -1 - bl L.3.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -1 - bl L.4.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2+1), %o2 - -L.4.15: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2-1), %o2 - - -L.3.15: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -3 - bl L.4.13 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2+1), %o2 - -L.4.13: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2-1), %o2 - - - -L.2.15: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits -3 - bl L.3.13 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -5 - bl L.4.11 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2+1), %o2 - -L.4.11: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2-1), %o2 - - -L.3.13: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -7 - bl L.4.9 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2+1), %o2 - -L.4.9: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2-1), %o2 - - - - - 9: -Lend_regular_divide: - subcc %o4, 1, %o4 - bge Ldivloop - tst %o3 - bl,a Lgot_result - ! non-restoring fixup here (one instruction only!) - sub %o2, 1, %o2 - - -Lgot_result: - ! check to see if answer should be < 0 - tst %g6 - bl,a 1f - sub %g0, %o2, %o2 -1: - retl - mov %o2, %o0 diff --git a/sysdeps/sparc/setjmp.S b/sysdeps/sparc/setjmp.S deleted file mode 100644 index 772ec723a3..0000000000 --- a/sysdeps/sparc/setjmp.S +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (C) 1991, 1993, 1994, 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include - -#define _ASM 1 -#include - -ENTRY (__sigsetjmp) - /* Save our SP and FP; in the delay slot of the jump, save our - return PC. Save the signal mask if requested with a tail-call - for simplicity; it always returns zero. */ - ta ST_FLUSH_WINDOWS -#ifdef PIC - mov %o7,%g1 -2: - call 1f - nop -1: - sethi %hi(_GLOBAL_OFFSET_TABLE_-(2b-.)),%g2 - or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(2b-.)),%g2 - add %g2,%o7,%g2 - sethi %hi(C_SYMBOL_NAME (__sigjmp_save)), %g3 - or %g3,%lo(C_SYMBOL_NAME (__sigjmp_save)), %g3 - st %sp, [%o0 + (JB_SP * 4)] - st %fp, [%o0 + (JB_FP * 4)] - mov %g1,%o7 - ld [%g2+%g3],%g1 - jmp %g1 - st %o7, [%o0+(JB_PC*4)] -#else - sethi %hi(C_SYMBOL_NAME (__sigjmp_save)), %g1 - st %sp, [%o0 + (JB_SP*4)] - or %lo(C_SYMBOL_NAME (__sigjmp_save)), %g1, %g1 - st %fp, [%o0 + (JB_FP*4)] - jmp %g1 - st %o7, [%o0 + (JB_PC*4)] -#endif /* PIC */ diff --git a/sysdeps/sparc/sparc32/Dist b/sysdeps/sparc/sparc32/Dist new file mode 100644 index 0000000000..6c3b23baa5 --- /dev/null +++ b/sysdeps/sparc/sparc32/Dist @@ -0,0 +1,4 @@ +dotmul.S umul.S +divrem.m4 sdiv.S udiv.S rem.S urem.S +alloca.S +sys/trap.h diff --git a/sysdeps/sparc/sparc32/Implies b/sysdeps/sparc/sparc32/Implies new file mode 100644 index 0000000000..39a34c5f57 --- /dev/null +++ b/sysdeps/sparc/sparc32/Implies @@ -0,0 +1 @@ +wordsize-32 diff --git a/sysdeps/sparc/sparc32/Makefile b/sysdeps/sparc/sparc32/Makefile new file mode 100644 index 0000000000..deec2f8145 --- /dev/null +++ b/sysdeps/sparc/sparc32/Makefile @@ -0,0 +1,51 @@ +# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 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, +# write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +ifeq ($(subdir),gnulib) +routines = dotmul umul $(divrem) alloca +endif # gnulib + +# We distribute these files, even though they are generated, +# so as to avoid the need for a functioning m4 to build the library. +divrem := sdiv udiv rem urem + ++divrem-NAME-sdiv := div ++divrem-NAME-udiv := udiv ++divrem-NAME-rem := rem ++divrem-NAME-urem := urem ++divrem-NAME = $(+divrem-NAME-$(basename $(notdir $@))) ++divrem-OP-div := div ++divrem-OP-udiv := div ++divrem-OP-rem := rem ++divrem-OP-urem := rem ++divrem-S-div := true ++divrem-S-rem := true ++divrem-S-udiv := false ++divrem-S-urem := false +$(divrem:%=$(sysdep_dir)/sparc/%.S): $(sysdep_dir)/sparc/divrem.m4 + (echo "define(NAME,\`.$(+divrem-NAME)')\ + define(OP,\`$(+divrem-OP-$(+divrem-NAME))')\ + define(S,\`$(+divrem-S-$(+divrem-NAME))')\ + /* This file is generated from divrem.m4; DO NOT EDIT! */"; \ + cat $<) | $(M4) > $@-tmp +# Make it unwritable so noone will edit it by mistake. + -chmod a-w $@-tmp + mv -f $@-tmp $@ + test ! -d CVS || cvs commit -m'Regenerated from $<' $@ + +sysdep-realclean := $(sysdep-realclean) $(divrem:%=sysdeps/sparc/%.S) diff --git a/sysdeps/sparc/sparc32/__longjmp.S b/sysdeps/sparc/sparc32/__longjmp.S new file mode 100644 index 0000000000..36e1c170dd --- /dev/null +++ b/sysdeps/sparc/sparc32/__longjmp.S @@ -0,0 +1,59 @@ +/* Copyright (C) 1991, 1993, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#define _ASM 1 +#include +#define ENV(reg) [%g1 + (reg * 4)] + +ENTRY (__longjmp) + /* Store our arguments in global registers so we can still + use them while unwinding frames and their register windows. */ + mov %o0, %g1 /* ENV in %g1 */ + orcc %o1, %g0, %g6 /* VAL in %g6 */ + be,a 0f /* Branch if zero; else skip delay slot. */ + mov 1, %g6 /* Delay slot only hit if zero: VAL = 1. */ +0: + + /* Cache target FP in register %g7. */ + ld ENV (JB_FP), %g7 + + /* Now we will loop, unwinding the register windows up the stack + until the restored %fp value matches the target value in %g7. */ + +loop: cmp %fp, %g7 /* Have we reached the target frame? */ + bl,a loop /* Loop while current fp is below target. */ + restore /* Unwind register window in delay slot. */ + be,a found /* Better have hit it exactly. */ + ld ENV (JB_SP), %o0 /* Delay slot: extract target SP. */ + +bogus: /* Get here only if the jmp_buf or stack is clobbered. */ + call C_SYMBOL_NAME (abort) + nop + unimp 0 + +found: /* We have unwound register windows so %fp matches the target. */ + cmp %o0, %sp /* Check jmp_buf SP vs register window. */ + bge,a sp_ok /* Saved must not be deeper than register. */ + mov %o0, %sp /* OK, install new SP. */ + b,a bogus /* Bogus, we lose. */ + +sp_ok: ld ENV (JB_PC), %o0 /* Extract target return PC. */ + jmp %o0 + 8 /* Return there. */ + mov %g6, %o0 /* Delay slot: set return value. */ diff --git a/sysdeps/sparc/sparc32/add_n.S b/sysdeps/sparc/sparc32/add_n.S new file mode 100644 index 0000000000..9852c256aa --- /dev/null +++ b/sysdeps/sparc/sparc32/add_n.S @@ -0,0 +1,226 @@ +! SPARC __mpn_add_n -- Add two limb vectors of the same length > 0 and store +! sum in a third limb vector. + +! Copyright (C) 1995, 1996 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA. + + +! INPUT PARAMETERS +#define res_ptr %o0 +#define s1_ptr %o1 +#define s2_ptr %o2 +#define size %o3 + +#include "sysdep.h" + + .text + .align 4 + .global C_SYMBOL_NAME(__mpn_add_n) +C_SYMBOL_NAME(__mpn_add_n): + xor s2_ptr,res_ptr,%g1 + andcc %g1,4,%g0 + bne L1 ! branch if alignment differs + nop +! ** V1a ** +L0: andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0 + be L_v1 ! if no, branch + nop +/* Add least significant limb separately to align res_ptr and s2_ptr */ + ld [s1_ptr],%g4 + add s1_ptr,4,s1_ptr + ld [s2_ptr],%g2 + add s2_ptr,4,s2_ptr + add size,-1,size + addcc %g4,%g2,%o4 + st %o4,[res_ptr] + add res_ptr,4,res_ptr +L_v1: addx %g0,%g0,%o4 ! save cy in register + cmp size,2 ! if size < 2 ... + bl Lend2 ! ... branch to tail code + subcc %g0,%o4,%g0 ! restore cy + + ld [s1_ptr+0],%g4 + addcc size,-10,size + ld [s1_ptr+4],%g1 + ldd [s2_ptr+0],%g2 + blt Lfin1 + subcc %g0,%o4,%g0 ! restore cy +/* Add blocks of 8 limbs until less than 8 limbs remain */ +Loop1: addxcc %g4,%g2,%o4 + ld [s1_ptr+8],%g4 + addxcc %g1,%g3,%o5 + ld [s1_ptr+12],%g1 + ldd [s2_ptr+8],%g2 + std %o4,[res_ptr+0] + addxcc %g4,%g2,%o4 + ld [s1_ptr+16],%g4 + addxcc %g1,%g3,%o5 + ld [s1_ptr+20],%g1 + ldd [s2_ptr+16],%g2 + std %o4,[res_ptr+8] + addxcc %g4,%g2,%o4 + ld [s1_ptr+24],%g4 + addxcc %g1,%g3,%o5 + ld [s1_ptr+28],%g1 + ldd [s2_ptr+24],%g2 + std %o4,[res_ptr+16] + addxcc %g4,%g2,%o4 + ld [s1_ptr+32],%g4 + addxcc %g1,%g3,%o5 + ld [s1_ptr+36],%g1 + ldd [s2_ptr+32],%g2 + std %o4,[res_ptr+24] + addx %g0,%g0,%o4 ! save cy in register + addcc size,-8,size + add s1_ptr,32,s1_ptr + add s2_ptr,32,s2_ptr + add res_ptr,32,res_ptr + bge Loop1 + subcc %g0,%o4,%g0 ! restore cy + +Lfin1: addcc size,8-2,size + blt Lend1 + subcc %g0,%o4,%g0 ! restore cy +/* Add blocks of 2 limbs until less than 2 limbs remain */ +Loope1: addxcc %g4,%g2,%o4 + ld [s1_ptr+8],%g4 + addxcc %g1,%g3,%o5 + ld [s1_ptr+12],%g1 + ldd [s2_ptr+8],%g2 + std %o4,[res_ptr+0] + addx %g0,%g0,%o4 ! save cy in register + addcc size,-2,size + add s1_ptr,8,s1_ptr + add s2_ptr,8,s2_ptr + add res_ptr,8,res_ptr + bge Loope1 + subcc %g0,%o4,%g0 ! restore cy +Lend1: addxcc %g4,%g2,%o4 + addxcc %g1,%g3,%o5 + std %o4,[res_ptr+0] + addx %g0,%g0,%o4 ! save cy in register + + andcc size,1,%g0 + be Lret1 + subcc %g0,%o4,%g0 ! restore cy +/* Add last limb */ + ld [s1_ptr+8],%g4 + ld [s2_ptr+8],%g2 + addxcc %g4,%g2,%o4 + st %o4,[res_ptr+8] + +Lret1: retl + addx %g0,%g0,%o0 ! return carry-out from most sign. limb + +L1: xor s1_ptr,res_ptr,%g1 + andcc %g1,4,%g0 + bne L2 + nop +! ** V1b ** + mov s2_ptr,%g1 + mov s1_ptr,s2_ptr + b L0 + mov %g1,s1_ptr + +! ** V2 ** +/* If we come here, the alignment of s1_ptr and res_ptr as well as the + alignment of s2_ptr and res_ptr differ. Since there are only two ways + things can be aligned (that we care about) we now know that the alignment + of s1_ptr and s2_ptr are the same. */ + +L2: cmp size,1 + be Ljone + nop + andcc s1_ptr,4,%g0 ! s1_ptr unaligned? Side effect: cy=0 + be L_v2 ! if no, branch + nop +/* Add least significant limb separately to align s1_ptr and s2_ptr */ + ld [s1_ptr],%g4 + add s1_ptr,4,s1_ptr + ld [s2_ptr],%g2 + add s2_ptr,4,s2_ptr + add size,-1,size + addcc %g4,%g2,%o4 + st %o4,[res_ptr] + add res_ptr,4,res_ptr + +L_v2: addx %g0,%g0,%o4 ! save cy in register + addcc size,-8,size + blt Lfin2 + subcc %g0,%o4,%g0 ! restore cy +/* Add blocks of 8 limbs until less than 8 limbs remain */ +Loop2: ldd [s1_ptr+0],%g2 + ldd [s2_ptr+0],%o4 + addxcc %g2,%o4,%g2 + st %g2,[res_ptr+0] + addxcc %g3,%o5,%g3 + st %g3,[res_ptr+4] + ldd [s1_ptr+8],%g2 + ldd [s2_ptr+8],%o4 + addxcc %g2,%o4,%g2 + st %g2,[res_ptr+8] + addxcc %g3,%o5,%g3 + st %g3,[res_ptr+12] + ldd [s1_ptr+16],%g2 + ldd [s2_ptr+16],%o4 + addxcc %g2,%o4,%g2 + st %g2,[res_ptr+16] + addxcc %g3,%o5,%g3 + st %g3,[res_ptr+20] + ldd [s1_ptr+24],%g2 + ldd [s2_ptr+24],%o4 + addxcc %g2,%o4,%g2 + st %g2,[res_ptr+24] + addxcc %g3,%o5,%g3 + st %g3,[res_ptr+28] + addx %g0,%g0,%o4 ! save cy in register + addcc size,-8,size + add s1_ptr,32,s1_ptr + add s2_ptr,32,s2_ptr + add res_ptr,32,res_ptr + bge Loop2 + subcc %g0,%o4,%g0 ! restore cy + +Lfin2: addcc size,8-2,size + blt Lend2 + subcc %g0,%o4,%g0 ! restore cy +Loope2: ldd [s1_ptr+0],%g2 + ldd [s2_ptr+0],%o4 + addxcc %g2,%o4,%g2 + st %g2,[res_ptr+0] + addxcc %g3,%o5,%g3 + st %g3,[res_ptr+4] + addx %g0,%g0,%o4 ! save cy in register + addcc size,-2,size + add s1_ptr,8,s1_ptr + add s2_ptr,8,s2_ptr + add res_ptr,8,res_ptr + bge Loope2 + subcc %g0,%o4,%g0 ! restore cy +Lend2: andcc size,1,%g0 + be Lret2 + subcc %g0,%o4,%g0 ! restore cy +/* Add last limb */ +Ljone: ld [s1_ptr],%g4 + ld [s2_ptr],%g2 + addxcc %g4,%g2,%o4 + st %o4,[res_ptr] + +Lret2: retl + addx %g0,%g0,%o0 ! return carry-out from most sign. limb diff --git a/sysdeps/sparc/sparc32/addmul_1.S b/sysdeps/sparc/sparc32/addmul_1.S new file mode 100644 index 0000000000..375d25db6b --- /dev/null +++ b/sysdeps/sparc/sparc32/addmul_1.S @@ -0,0 +1,147 @@ +! SPARC __mpn_addmul_1 -- Multiply a limb vector with a limb and add +! the result to a second limb vector. + +! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA. + + +! INPUT PARAMETERS +! res_ptr o0 +! s1_ptr o1 +! size o2 +! s2_limb o3 + +#include "sysdep.h" + +.text + .align 4 + .global C_SYMBOL_NAME(__mpn_addmul_1) +C_SYMBOL_NAME(__mpn_addmul_1): + ! Make S1_PTR and RES_PTR point at the end of their blocks + ! and put (- 4 x SIZE) in index/loop counter. + sll %o2,2,%o2 + add %o0,%o2,%o4 ! RES_PTR in o4 since o0 is retval + add %o1,%o2,%o1 + sub %g0,%o2,%o2 + + cmp %o3,0xfff + bgu Large + nop + + ld [%o1+%o2],%o5 + mov 0,%o0 + b L0 + add %o4,-4,%o4 +Loop0: + addcc %o5,%g1,%g1 + ld [%o1+%o2],%o5 + addx %o0,%g0,%o0 + st %g1,[%o4+%o2] +L0: wr %g0,%o3,%y + sra %o5,31,%g2 + and %o3,%g2,%g2 + andcc %g1,0,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,0,%g1 + sra %g1,20,%g4 + sll %g1,12,%g1 + rd %y,%g3 + srl %g3,20,%g3 + or %g1,%g3,%g1 + + addcc %g1,%o0,%g1 + addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb + addcc %o2,4,%o2 ! loop counter + bne Loop0 + ld [%o4+%o2],%o5 + + addcc %o5,%g1,%g1 + addx %o0,%g0,%o0 + retl + st %g1,[%o4+%o2] + + +Large: ld [%o1+%o2],%o5 + mov 0,%o0 + sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0 + b L1 + add %o4,-4,%o4 +Loop: + addcc %o5,%g3,%g3 + ld [%o1+%o2],%o5 + addx %o0,%g0,%o0 + st %g3,[%o4+%o2] +L1: wr %g0,%o5,%y + and %o5,%g4,%g2 + andcc %g0,%g0,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%g0,%g1 + rd %y,%g3 + addcc %g3,%o0,%g3 + addx %g2,%g1,%o0 + addcc %o2,4,%o2 + bne Loop + ld [%o4+%o2],%o5 + + addcc %o5,%g3,%g3 + addx %o0,%g0,%o0 + retl + st %g3,[%o4+%o2] diff --git a/sysdeps/sparc/sparc32/alloca.S b/sysdeps/sparc/sparc32/alloca.S new file mode 100644 index 0000000000..dcbd171163 --- /dev/null +++ b/sysdeps/sparc/sparc32/alloca.S @@ -0,0 +1,32 @@ +/* Copyright (C) 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "sysdep.h" + +/* Code produced by Sun's C compiler calls this function with two extra + arguments which it makes relocatable symbols but seem always to be + the constant 96; I have no idea what they are for. */ + +#ifndef NO_UNDERSCORES +#define __builtin_alloca ___builtin_alloca +#endif + +ENTRY (__builtin_alloca) + sub %sp, %o0, %sp /* Push some stack space. */ + retl /* Return; the returned buffer leaves 96 */ + add %sp, 96, %o0 /* bytes of register save area at the top. */ diff --git a/sysdeps/sparc/sparc32/bits/endian.h b/sysdeps/sparc/sparc32/bits/endian.h new file mode 100644 index 0000000000..f1a75c0652 --- /dev/null +++ b/sysdeps/sparc/sparc32/bits/endian.h @@ -0,0 +1,3 @@ +/* SPARC is big-endian. */ + +#define __BYTE_ORDER __BIG_ENDIAN diff --git a/sysdeps/sparc/sparc32/bits/setjmp.h b/sysdeps/sparc/sparc32/bits/setjmp.h new file mode 100644 index 0000000000..43bae1a496 --- /dev/null +++ b/sysdeps/sparc/sparc32/bits/setjmp.h @@ -0,0 +1,16 @@ +/* Define the machine-dependent type `jmp_buf'. SPARC version. */ + +#if defined (__USE_MISC) || defined (_ASM) +#define JB_SP 0 +#define JB_FP 1 +#define JB_PC 2 +#endif + +#ifndef _ASM +typedef int __jmp_buf[3]; +#endif + +/* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ +#define _JMPBUF_UNWINDS(jmpbuf, address) \ + ((int) (address) < (jmpbuf)[JB_SP]) diff --git a/sysdeps/sparc/sparc32/bsd-_setjmp.S b/sysdeps/sparc/sparc32/bsd-_setjmp.S new file mode 100644 index 0000000000..bf49765f4d --- /dev/null +++ b/sysdeps/sparc/sparc32/bsd-_setjmp.S @@ -0,0 +1,40 @@ +/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Sparc version. + Copyright (C) 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +ENTRY (_setjmp) + +#ifdef PIC + save %sp, -64, %sp +1: call 2f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 +2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 + add %g1, %o7, %g1 + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g2 + restore + or %g2, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g2 + ld [%g1+%g2], %g1 +#else + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1 + or %g1, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1 +#endif + + jmp %g1 + mov %g0, %o1 /* Pass second argument of zero. */ diff --git a/sysdeps/sparc/sparc32/bsd-setjmp.S b/sysdeps/sparc/sparc32/bsd-setjmp.S new file mode 100644 index 0000000000..16dc260765 --- /dev/null +++ b/sysdeps/sparc/sparc32/bsd-setjmp.S @@ -0,0 +1,40 @@ +/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Sparc version. + Copyright (C) 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +ENTRY (setjmp) + +#ifdef PIC + save %sp, -64, %sp +1: call 2f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 +2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %g1 + add %g1, %o7, %g1 + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g2 + restore + or %g2, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g2 + ld [%g1+%g2], %g1 +#else + sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1 + or %g1, %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1 +#endif + + jmp %g1 + mov 1, %o1 /* Pass second argument of one. */ diff --git a/sysdeps/sparc/sparc32/divrem.m4 b/sysdeps/sparc/sparc32/divrem.m4 new file mode 100644 index 0000000000..665abf11ae --- /dev/null +++ b/sysdeps/sparc/sparc32/divrem.m4 @@ -0,0 +1,238 @@ +/* + * Division and remainder, from Appendix E of the Sparc Version 8 + * Architecture Manual, with fixes from Gordon Irlam. + */ + +/* + * Input: dividend and divisor in %o0 and %o1 respectively. + * + * m4 parameters: + * NAME name of function to generate + * OP OP=div => %o0 / %o1; OP=rem => %o0 % %o1 + * S S=true => signed; S=false => unsigned + * + * Algorithm parameters: + * N how many bits per iteration we try to get (4) + * WORDSIZE total number of bits (32) + * + * Derived constants: + * TOPBITS number of bits in the top `decade' of a number + * + * Important variables: + * Q the partial quotient under development (initially 0) + * R the remainder so far, initially the dividend + * ITER number of main division loop iterations required; + * equal to ceil(log2(quotient) / N). Note that this + * is the log base (2^N) of the quotient. + * V the current comparand, initially divisor*2^(ITER*N-1) + * + * Cost: + * Current estimate for non-large dividend is + * ceil(log2(quotient) / N) * (10 + 7N/2) + C + * A large dividend is one greater than 2^(31-TOPBITS) and takes a + * different path, as the upper bits of the quotient must be developed + * one bit at a time. + */ + +define(N, `4')dnl +define(WORDSIZE, `32')dnl +define(TOPBITS, eval(WORDSIZE - N*((WORDSIZE-1)/N)))dnl +dnl +define(dividend, `%o0')dnl +define(divisor, `%o1')dnl +define(Q, `%o2')dnl +define(R, `%o3')dnl +define(ITER, `%o4')dnl +define(V, `%o5')dnl +dnl +dnl m4 reminder: ifelse(a,b,c,d) => if a is b, then c, else d +define(T, `%g1')dnl +define(SC, `%g7')dnl +ifelse(S, `true', `define(SIGN, `%g6')')dnl + +dnl +dnl This is the recursive definition for developing quotient digits. +dnl +dnl Parameters: +dnl $1 the current depth, 1 <= $1 <= N +dnl $2 the current accumulation of quotient bits +dnl N max depth +dnl +dnl We add a new bit to $2 and either recurse or insert the bits in +dnl the quotient. R, Q, and V are inputs and outputs as defined above; +dnl the condition codes are expected to reflect the input R, and are +dnl modified to reflect the output R. +dnl +define(DEVELOP_QUOTIENT_BITS, +` ! depth $1, accumulated bits $2 + bl L.$1.eval(2**N+$2) + srl V,1,V + ! remainder is positive + subcc R,V,R + ifelse($1, N, + ` b 9f + add Q, ($2*2+1), Q + ', ` DEVELOP_QUOTIENT_BITS(incr($1), `eval(2*$2+1)')') +L.$1.eval(2**N+$2): + ! remainder is negative + addcc R,V,R + ifelse($1, N, + ` b 9f + add Q, ($2*2-1), Q + ', ` DEVELOP_QUOTIENT_BITS(incr($1), `eval(2*$2-1)')') + ifelse($1, 1, `9:')')dnl + +#include "sysdep.h" +#ifdef __linux__ +#include +#else +#ifdef __svr4__ +#include +#else +#include +#endif +#endif + +FUNC(NAME) +ifelse(S, `true', +` ! compute sign of result; if neither is negative, no problem + orcc divisor, dividend, %g0 ! either negative? + bge 2f ! no, go do the divide +ifelse(OP, `div', +` xor divisor, dividend, SIGN ! compute sign in any case', +` mov dividend, SIGN ! sign of remainder matches dividend') + tst divisor + bge 1f + tst dividend + ! divisor is definitely negative; dividend might also be negative + bge 2f ! if dividend not negative... + sub %g0, divisor, divisor ! in any case, make divisor nonneg +1: ! dividend is negative, divisor is nonnegative + sub %g0, dividend, dividend ! make dividend nonnegative +2: +') + ! Ready to divide. Compute size of quotient; scale comparand. + orcc divisor, %g0, V + bne 1f + mov dividend, R + + ! Divide by zero trap. If it returns, return 0 (about as + ! wrong as possible, but that is what SunOS does...). + ta ST_DIV0 + retl + clr %o0 + +1: + cmp R, V ! if divisor exceeds dividend, done + blu Lgot_result ! (and algorithm fails otherwise) + clr Q + sethi %hi(1 << (WORDSIZE - TOPBITS - 1)), T + cmp R, T + blu Lnot_really_big + clr ITER + + ! `Here the dividend is >= 2**(31-N) or so. We must be careful here, + ! as our usual N-at-a-shot divide step will cause overflow and havoc. + ! The number of bits in the result here is N*ITER+SC, where SC <= N. + ! Compute ITER in an unorthodox manner: know we need to shift V into + ! the top decade: so do not even bother to compare to R.' + 1: + cmp V, T + bgeu 3f + mov 1, SC + sll V, N, V + b 1b + add ITER, 1, ITER + + ! Now compute SC. + 2: addcc V, V, V + bcc Lnot_too_big + add SC, 1, SC + + ! We get here if the divisor overflowed while shifting. + ! This means that R has the high-order bit set. + ! Restore V and subtract from R. + sll T, TOPBITS, T ! high order bit + srl V, 1, V ! rest of V + add V, T, V + b Ldo_single_div + sub SC, 1, SC + + Lnot_too_big: + 3: cmp V, R + blu 2b + nop + be Ldo_single_div + nop + /* NB: these are commented out in the V8-Sparc manual as well */ + /* (I do not understand this) */ + ! V > R: went too far: back up 1 step + ! srl V, 1, V + ! dec SC + ! do single-bit divide steps + ! + ! We have to be careful here. We know that R >= V, so we can do the + ! first divide step without thinking. BUT, the others are conditional, + ! and are only done if R >= 0. Because both R and V may have the high- + ! order bit set in the first step, just falling into the regular + ! division loop will mess up the first time around. + ! So we unroll slightly... + Ldo_single_div: + subcc SC, 1, SC + bl Lend_regular_divide + nop + sub R, V, R + mov 1, Q + b Lend_single_divloop + nop + Lsingle_divloop: + sll Q, 1, Q + bl 1f + srl V, 1, V + ! R >= 0 + sub R, V, R + b 2f + add Q, 1, Q + 1: ! R < 0 + add R, V, R + sub Q, 1, Q + 2: + Lend_single_divloop: + subcc SC, 1, SC + bge Lsingle_divloop + tst R + b,a Lend_regular_divide + +Lnot_really_big: +1: + sll V, N, V + cmp V, R + bleu 1b + addcc ITER, 1, ITER + be Lgot_result + sub ITER, 1, ITER + + tst R ! set up for initial iteration +Ldivloop: + sll Q, N, Q + DEVELOP_QUOTIENT_BITS(1, 0) +Lend_regular_divide: + subcc ITER, 1, ITER + bge Ldivloop + tst R + bl,a Lgot_result + ! non-restoring fixup here (one instruction only!) +ifelse(OP, `div', +` sub Q, 1, Q +', ` add R, divisor, R +') + +Lgot_result: +ifelse(S, `true', +` ! check to see if answer should be < 0 + tst SIGN + bl,a 1f + ifelse(OP, `div', `sub %g0, Q, Q', `sub %g0, R, R') +1:') + retl + ifelse(OP, `div', `mov Q, %o0', `mov R, %o0') diff --git a/sysdeps/sparc/sparc32/dl-machine.h b/sysdeps/sparc/sparc32/dl-machine.h new file mode 100644 index 0000000000..f7bcba0c2f --- /dev/null +++ b/sysdeps/sparc/sparc32/dl-machine.h @@ -0,0 +1,363 @@ +/* Machine-dependent ELF dynamic relocation inline functions. SPARC version. + Copyright (C) 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#define ELF_MACHINE_NAME "sparc" + +#include +#include +#include +#include + + +/* Some SPARC opcodes we need to use for self-modifying code. */ +#define OPCODE_NOP 0x01000000 /* nop */ +#define OPCODE_CALL 0x40000000 /* call ?; add PC-rel word address */ +#define OPCODE_SETHI_G1 0x03000000 /* sethi ?, %g1; add value>>10 */ +#define OPCODE_JMP_G1 0x81c06000 /* jmp %g1+?; add lo 10 bits of value */ +#define OPCODE_SAVE_SP64 0x9de3bfc0 /* save %sp, -64, %sp */ + + +/* Return nonzero iff E_MACHINE is compatible with the running host. */ +static inline int +elf_machine_matches_host (Elf32_Half e_machine) +{ + return e_machine == EM_SPARC; +} + + +/* Return the link-time address of _DYNAMIC. Conveniently, this is the + first element of the GOT. This must be inlined in a function which + uses global data. */ +static inline Elf32_Addr +elf_machine_dynamic (void) +{ + register Elf32_Addr *got asm ("%l7"); + return *got; +} + +/* Return the run-time load address of the shared object. */ +static inline Elf32_Addr +elf_machine_load_address (void) +{ + register Elf32_Addr pc __asm("%o7"), got; + + /* Utilize the fact that a local .got entry will be partially + initialized at startup awaiting its RELATIVE fixup. */ + + __asm("sethi %%hi(.Load_address),%1\n" + ".Load_address:\n\t" + "call 1f\n\t" + "or %1,%%lo(.Load_address),%1\n" + "1:\tld [%%l7+%1],%1" + : "=r"(pc), "=r"(got)); + + return pc - got; +} + + Elf32_Addr addr; + + asm ( + "add %%fp,0x44,%%o2\n\t" /* o2 = point to argc */ + "ld [%%o2 - 4],%%o0\n\t" /* o0 = load argc */ + "sll %%o0, 2, %%o0\n\t" /* o0 = argc * sizeof (int) */ + "add %%o2,%%o0,%%o2\n\t" /* o2 = skip over argv */ + "add %%o2,4,%%o2\n\t" /* skip over null after argv */ + + /* Now %o2 is pointing to env, skip over that as well. */ + "1:\n\t" + "ld [%%o2],%%o0\n\t" + "cmp %%o0,0\n\t" + "bnz 1b\n\t" + "add %%o2,4,%%o2\n\t" + + /* Note that above, we want to advance the NULL after envp so + we always add 4. */ + + /* Now, search for the AT_BASE property. */ + "2:\n\t" + "ld [%%o2],%%o0\n\t" + "cmp %%o0,0\n\t" + "be,a 3f\n\t" + "or %%g0,%%g0,%0\n\t" + "cmp %%o0,7\n\t" /* AT_BASE = 7 */ + "be,a 3f\n\t" + "ld [%%o2+4],%0\n\t" + "b 2b\n\t" + "add %%o2,8,%%o2\n\t" + /* At this point %0 has the load address for the interpreter */ + "3:\n\t" + : "=r" (addr) + : /* no inputs */ + : "o0", "o2"); + return addr; +} + +#ifdef RESOLVE +/* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +static inline void +elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + Elf32_Addr *const reloc_addr) +{ + Elf32_Addr loadbase; + + if (ELF32_R_TYPE (reloc->r_info) == R_SPARC_RELATIVE) + { +#ifndef RTLD_BOOTSTRAP + if (map != &_dl_rtld_map) /* Already done in rtld itself. */ +#endif + *reloc_addr += map->l_addr + reloc->r_addend; + } + else + { + const Elf32_Sym *const refsym = sym; + Elf32_Addr value; + if (sym->st_shndx != SHN_UNDEF && + ELF32_ST_BIND (sym->st_info) == STB_LOCAL) + value = map->l_addr; + else + { + value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info)); + if (sym) + value += sym->st_value; + } + value += reloc->r_addend; /* Assume copy relocs have zero addend. */ + + switch (ELF32_R_TYPE (reloc->r_info)) + { + case R_SPARC_COPY: + if (sym->st_size > refsym->st_size + || (_dl_verbose && sym->st_size < refsym->st_size)) + { + extern char **_dl_argv; + const char *strtab; + + strtab = ((void *) map->l_addr + + map->l_info[DT_STRTAB]->d_un.d_ptr); + _dl_sysdep_error (_dl_argv[0] ?: "", + ": Symbol `", strtab + refsym->st_name, + "' has different size in shared object, " + "consider re-linking\n", NULL); + } + memcpy (reloc_addr, (void *) value, MIN (sym->st_size, + refsym->st_size)); + break; + case R_SPARC_GLOB_DAT: + case R_SPARC_32: + *reloc_addr = value; + break; + case R_SPARC_JMP_SLOT: + reloc_addr[1] = OPCODE_SETHI_G1 | (value >> 10); + reloc_addr[2] = OPCODE_JMP_G1 | (value & 0x3ff); + break; + case R_SPARC_8: + *(char *) reloc_addr = value; + break; + case R_SPARC_16: + *(short *) reloc_addr = value; + break; + case R_SPARC_DISP8: + *(char *) reloc_addr = (value - (Elf32_Addr) reloc_addr); + break; + case R_SPARC_DISP16: + *(short *) reloc_addr = (value - (Elf32_Addr) reloc_addr); + break; + case R_SPARC_DISP32: + *reloc_addr = (value - (Elf32_Addr) reloc_addr); + break; + case R_SPARC_LO10: + *reloc_addr = (*reloc_addr & ~0x3ff) | (value & 0x3ff); + break; + case R_SPARC_WDISP30: + *reloc_addr = ((*reloc_addr & 0xc0000000) + | ((value - (unsigned int) reloc_addr) >> 2)); + break; + case R_SPARC_HI22: + *reloc_addr = (*reloc_addr & 0xffc00000) | (value >> 10); + break; + case R_SPARC_NONE: /* Alright, Wilbur. */ + break; + default: + assert (! "unexpected dynamic reloc type"); + break; + } + } +} + +static inline void +elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc) +{ + switch (ELF32_R_TYPE (reloc->r_info)) + { + case R_SPARC_NONE: + break; + case R_SPARC_JMP_SLOT: + break; + default: + assert (! "unexpected PLT reloc type"); + break; + } +} + +#endif /* RESOLVE */ + +/* Nonzero iff TYPE should not be allowed to resolve to one of + the main executable's symbols, as for a COPY reloc. */ +#define elf_machine_lookup_noexec_p(type) ((type) == R_SPARC_COPY) + +/* Nonzero iff TYPE describes relocation of a PLT entry, so + PLT entries should not be allowed to define the value. */ +#define elf_machine_lookup_noplt_p(type) ((type) == R_SPARC_JMP_SLOT) + +/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ +#define ELF_MACHINE_RELOC_NOPLT R_SPARC_JMP_SLOT + +/* The SPARC never uses Elf32_Rel relocations. */ +#define ELF_MACHINE_NO_REL 1 + +/* The SPARC overlaps DT_RELA and DT_PLTREL. */ +#define ELF_MACHINE_PLTREL_OVERLAP 1 + +/* Set up the loaded object described by L so its unrelocated PLT + entries will jump to the on-demand fixup code in dl-runtime.c. */ + +static inline int +elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) +{ + Elf32_Addr *plt; + extern void _dl_runtime_resolve (Elf32_Word); + + if (l->l_info[DT_JMPREL] && lazy) + { + /* The entries for functions in the PLT have not yet been filled in. + Their initial contents will arrange when called to set the high 22 + bits of %g1 with an offset into the .rela.plt section and jump to + the beginning of the PLT. */ + plt = (Elf32_Addr *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr); + + /* The beginning of the PLT does: + + save %sp, -64, %sp + pltpc: call _dl_runtime_resolve + nop + .word MAP + + This saves the register window containing the arguments, and the + PC value (pltpc) implicitly saved in %o7 by the call points near the + location where we store the link_map pointer for this object. */ + + plt[0] = OPCODE_SAVE_SP64; /* save %sp, -64, %sp */ + /* Construct PC-relative word address. */ + plt[1] = OPCODE_CALL | (((Elf32_Addr) &_dl_runtime_resolve - + (Elf32_Addr) &plt[1]) >> 2); + plt[2] = OPCODE_NOP; /* Fill call delay slot. */ + plt[3] = (Elf32_Addr *) l; + } + + return lazy; +} + +/* This code is used in dl-runtime.c to call the `fixup' function + and then redirect to the address it returns. */ +#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ +# Trampoline for _dl_runtime_resolver + .globl _dl_runtime_resolve + .type _dl_runtime_resolve, @function +_dl_runtime_resolve: + t 1 + #call %g0 + # Pass two args to fixup: the PLT address computed from the PC saved + # in the PLT's call insn, and the reloc offset passed in %g1. + #ld [%o7 + 8], %o1 | Second arg, loaded from PLTPC[2]. + #call fixup + #shrl %g1, 22, %o0 | First arg, set in delay slot of call. + # Jump to the real function. + #jmpl %o0, %g0 + # In the delay slot of that jump, restore the register window + # saved by the first insn of the PLT. + #restore + .size _dl_runtime_resolve, . - _dl_runtime_resolve +"); + +/* The PLT uses Elf32_Rela relocs. */ +#define elf_machine_relplt elf_machine_rela + + +/* Mask identifying addresses reserved for the user program, + where the dynamic linker should not map anything. */ +#define ELF_MACHINE_USER_ADDRESS_MASK ??? + +/* Initial entry point code for the dynamic linker. + The C function `_dl_start' is the real entry point; + its return value is the user program's entry point. */ + +#define RTLD_START __asm__ ( \ +".text\n\ + .globl _start\n\ + .type _start,@function\n\ +_start:\n\ + /* Pass pointer to argument block to _dl_start. */\n\ + add %sp,64,%o0\n\ + call _dl_start\n\ + nop\n\ + \n\ + mov %o0,%l0\n\ + \n\ +2:\n\ + call 1f\n\ + nop\n\ +1:\n\ + sethi %hi(_GLOBAL_OFFSET_TABLE_-(2b-.)),%l2\n\ + sethi %hi(_dl_default_scope),%l3\n\ + or %l2,%lo(_GLOBAL_OFFSET_TABLE_-(2b-.)),%l2\n\ + or %l3,%lo(_dl_default_scope),%l3\n\ + add %o7,%l2,%l1\n\ + # %l1 has the GOT. %l3 has _dl_default_scope GOT offset\n\ + ld [%l1+%l3],%l4\n\ + # %l4 has pointer to _dl_default_scope. Now, load _dl_default_scope [2]\n\ + ld [%l4+8],%l4\n\ + # %l4 has _dl_default_scope [2]\n\ + # call _dl_init_next until it returns 0, pass _dl_default_scope [2]\n\ +3:\n\ + call _dl_init_next\n\ + mov %l4,%o0\n\ + cmp %o0,%g0\n\ + bz,a 4f\n\ + nop\n\ + call %o0\n\ + /* Pass pointer to argument block to this init function */\n\ + add %sp,64,%o0\n\ + b,a 3b\n\ +4:\n\ + # Clear the _dl_starting_up variable and pass _dl_fini in %g1 as per ELF ABI.\n\ + sethi %hi(_dl_starting_up),%l4\n\ + sethi %hi(_dl_fini),%l3\n\ + or %l4,%lo(_dl_starting_up),%l4\n\ + or %l3,%lo(_dl_fini),%l3\n\ + # clear _dl_starting_up\n\ + ld [%l1+%l4],%l5\n\ + st %g0,[%l5]\n\ + # load out fini function for atexit in %g1\n\ + ld [%l3+%l1],%g1\n\ + # jump to the user program entry point.\n\ + jmpl %l0,%g0\n\ + nop\n\ +"); diff --git a/sysdeps/sparc/sparc32/dotmul.S b/sysdeps/sparc/sparc32/dotmul.S new file mode 100644 index 0000000000..7ce695cb7a --- /dev/null +++ b/sysdeps/sparc/sparc32/dotmul.S @@ -0,0 +1,123 @@ +/* + * Signed multiply, from Appendix E of the Sparc Version 8 + * Architecture Manual. + */ + +/* + * Returns %o0 * %o1 in %o1%o0 (i.e., %o1 holds the upper 32 bits of + * the 64-bit product). + * + * This code optimizes short (less than 13-bit) multiplies. + */ + +#include "sysdep.h" +ENTRY(.mul) + mov %o0, %y ! multiplier -> Y + andncc %o0, 0xfff, %g0 ! test bits 12..31 + be Lmul_shortway ! if zero, can do it the short way + andcc %g0, %g0, %o4 ! zero the partial product and clear N and V + + /* + * Long multiply. 32 steps, followed by a final shift step. + */ + mulscc %o4, %o1, %o4 ! 1 + mulscc %o4, %o1, %o4 ! 2 + mulscc %o4, %o1, %o4 ! 3 + mulscc %o4, %o1, %o4 ! 4 + mulscc %o4, %o1, %o4 ! 5 + mulscc %o4, %o1, %o4 ! 6 + mulscc %o4, %o1, %o4 ! 7 + mulscc %o4, %o1, %o4 ! 8 + mulscc %o4, %o1, %o4 ! 9 + mulscc %o4, %o1, %o4 ! 10 + mulscc %o4, %o1, %o4 ! 11 + mulscc %o4, %o1, %o4 ! 12 + mulscc %o4, %o1, %o4 ! 13 + mulscc %o4, %o1, %o4 ! 14 + mulscc %o4, %o1, %o4 ! 15 + mulscc %o4, %o1, %o4 ! 16 + mulscc %o4, %o1, %o4 ! 17 + mulscc %o4, %o1, %o4 ! 18 + mulscc %o4, %o1, %o4 ! 19 + mulscc %o4, %o1, %o4 ! 20 + mulscc %o4, %o1, %o4 ! 21 + mulscc %o4, %o1, %o4 ! 22 + mulscc %o4, %o1, %o4 ! 23 + mulscc %o4, %o1, %o4 ! 24 + mulscc %o4, %o1, %o4 ! 25 + mulscc %o4, %o1, %o4 ! 26 + mulscc %o4, %o1, %o4 ! 27 + mulscc %o4, %o1, %o4 ! 28 + mulscc %o4, %o1, %o4 ! 29 + mulscc %o4, %o1, %o4 ! 30 + mulscc %o4, %o1, %o4 ! 31 + mulscc %o4, %o1, %o4 ! 32 + mulscc %o4, %g0, %o4 ! final shift + + ! If %o0 was negative, the result is + ! (%o0 * %o1) + (%o1 << 32)) + ! We fix that here. + +#if 0 + tst %o0 + bge 1f + rd %y, %o0 + + ! %o0 was indeed negative; fix upper 32 bits of result by subtracting + ! %o1 (i.e., return %o4 - %o1 in %o1). + retl + sub %o4, %o1, %o1 + +1: + retl + mov %o4, %o1 +#else + /* Faster code adapted from tege@sics.se's code for umul.S. */ + sra %o0, 31, %o2 ! make mask from sign bit + and %o1, %o2, %o2 ! %o2 = 0 or %o1, depending on sign of %o0 + rd %y, %o0 ! get lower half of product + retl + sub %o4, %o2, %o1 ! subtract compensation + ! and put upper half in place +#endif + +Lmul_shortway: + /* + * Short multiply. 12 steps, followed by a final shift step. + * The resulting bits are off by 12 and (32-12) = 20 bit positions, + * but there is no problem with %o0 being negative (unlike above). + */ + mulscc %o4, %o1, %o4 ! 1 + mulscc %o4, %o1, %o4 ! 2 + mulscc %o4, %o1, %o4 ! 3 + mulscc %o4, %o1, %o4 ! 4 + mulscc %o4, %o1, %o4 ! 5 + mulscc %o4, %o1, %o4 ! 6 + mulscc %o4, %o1, %o4 ! 7 + mulscc %o4, %o1, %o4 ! 8 + mulscc %o4, %o1, %o4 ! 9 + mulscc %o4, %o1, %o4 ! 10 + mulscc %o4, %o1, %o4 ! 11 + mulscc %o4, %o1, %o4 ! 12 + mulscc %o4, %g0, %o4 ! final shift + + /* + * %o4 has 20 of the bits that should be in the low part of the + * result; %y has the bottom 12 (as %y's top 12). That is: + * + * %o4 %y + * +----------------+----------------+ + * | -12- | -20- | -12- | -20- | + * +------(---------+------)---------+ + * --hi-- ----low-part---- + * + * The upper 12 bits of %o4 should be sign-extended to form the + * high part of the product (i.e., highpart = %o4 >> 20). + */ + + rd %y, %o5 + sll %o4, 12, %o0 ! shift middle bits left 12 + srl %o5, 20, %o5 ! shift low bits right 20, zero fill at left + or %o5, %o0, %o0 ! construct low part of result + retl + sra %o4, 20, %o1 ! ... and extract high part of result diff --git a/sysdeps/sparc/sparc32/e_sqrt.c b/sysdeps/sparc/sparc32/e_sqrt.c new file mode 100644 index 0000000000..a98ae21ace --- /dev/null +++ b/sysdeps/sparc/sparc32/e_sqrt.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#ifndef __GNUC__ + #error This file uses GNU C extensions; you must compile with GCC. +#endif + +/* Return the square root of X. */ +double +__ieee754_sqrt (x) + double x; +{ + register double result; + asm ("fsqrtd %1, %0" : "=f" (result) : "f" (x)); + return result; +} diff --git a/sysdeps/sparc/sparc32/elf/Makefile b/sysdeps/sparc/sparc32/elf/Makefile new file mode 100644 index 0000000000..319fbdef10 --- /dev/null +++ b/sysdeps/sparc/sparc32/elf/Makefile @@ -0,0 +1,4 @@ +# Sparc/ELF specific definitions. + +# The assembler on SPARC needs the -fPIC flag even when it's assembler code. +ASFLAGS-.so = -fPIC diff --git a/sysdeps/sparc/sparc32/elf/start.c b/sysdeps/sparc/sparc32/elf/start.c new file mode 100644 index 0000000000..f1e80195ca --- /dev/null +++ b/sysdeps/sparc/sparc32/elf/start.c @@ -0,0 +1,68 @@ +/* Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include + +extern char **__environ; + +extern void __libc_init_first __P ((int argc, char **argv, char **envp)); +extern int main __P ((int argc, char **argv, char **envp)); + +register long int sp asm("%sp"), fp asm("%fp"); + +void +_start (void) +{ + /* It is important that these be declared `register'. + Otherwise, when compiled without optimization, they are put on the + stack, which loses completely after we zero the FP. */ + register int argc; + register char **argv, **envp; + register long int g1 asm ("%g1"); + unsigned long int copy_g1 = g1; + + /* Unwind the frame built when we entered the function. */ + asm("restore"); + if (copy_g1) + atexit (copy_g1); + + /* And clear the frame pointer. */ + fp = 0; + + /* The argument info starts after one register + window (64 bytes) past the SP. */ + argc = ((int *) sp)[16]; + argv = (char **) &((int *) sp)[17]; + envp = &argv[argc + 1]; + __environ = envp; + + /* Allocate 24 bytes of stack space for the register save area. */ + sp -= 24; + __libc_init_first (argc, argv, envp); +#ifdef ELF_INIT_FINI + { + extern void _fini (void); + _init (); + atexit (_fini); + } +#endif + exit (main (argc, argv, envp)); +} diff --git a/sysdeps/sparc/sparc32/fpu/bits/fenv.h b/sysdeps/sparc/sparc32/fpu/bits/fenv.h new file mode 100644 index 0000000000..0560dd99b8 --- /dev/null +++ b/sysdeps/sparc/sparc32/fpu/bits/fenv.h @@ -0,0 +1,76 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _FENV_H +#error "Never use directly; include instead." +#endif + + +/* Define bits representing the exception. We use the bit positions + of the appropriate accrued exception bits from the FSR. */ +enum + { + FE_INVALID = (1 << 9), +#define FE_INVALID FE_INVALID + FE_OVERFLOW = (1 << 8), +#define FE_OVERFLOW FE_OVERFLOW + FE_UNDERFLOW = (1 << 7), +#define FE_UNDERFLOW FE_UNDERFLOW + FE_DIVBYZERO = (1 << 6), +#define FE_DIVBYZERO FE_DIVBYZERO + FE_INEXACT = (1 << 5) +#define FE_INEXACT FE_INEXACT + }; + +#define FE_ALL_EXCEPT \ + (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID) + +/* The Sparc FPU supports all of the four defined rounding modes. We + use again the bit positions in the FPU control word as the values + for the appropriate macros. */ +enum + { + FE_TONEAREST = (0U << 30), +#define FE_TONEAREST FE_TONEAREST + FE_TOWARDSZERO = (1U << 30), +#define FE_TOWARDSZERO FE_TOWARDSZERO + FE_UPWARD = (2U << 30), +#define FE_UPWARD FE_UPWARD + FE_DOWNWARD = (3U << 30) +#define FE_DOWNWARD FE_DOWNWARD + }; + +#define __FE_ROUND_MASK (3U << 30) + +/* Type representing exception flags. */ +typedef unsigned int fexcept_t; + +/* Type representing floating-point environment. */ +typedef unsigned int fenv_t; + +/* If the default argument is used we use this value. */ +#define FE_DFL_ENV ((fenv_t *) -1) + +#ifdef __USE_GNU +/* Floating-point environment where none of the exception is masked. */ +# define FE_NOMASK_ENV ((fenv_t *) -2) +#endif + +/* For internal use only: access the fp state register. */ +#define __fenv_stfsr(X) __asm__("stfsr %0" : "=m"(X)) +#define __fenv_ldfsr(X) __asm__ __volatile__("ldfsr %0" : : "m"(X)) diff --git a/sysdeps/sparc/sparc32/fpu/fpu_control.h b/sysdeps/sparc/sparc32/fpu/fpu_control.h new file mode 100644 index 0000000000..5ef3824702 --- /dev/null +++ b/sysdeps/sparc/sparc32/fpu/fpu_control.h @@ -0,0 +1,69 @@ +/* FPU control word bits. SPARC version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _FPU_CONTROL_H +#define _FPU_CONTROL_H 1 + + +#include + +/* precision control */ +#define _FPU_EXTENDED 0x00000000 /* RECOMMENDED */ +#define _FPU_DOUBLE 0x20000000 +#define _FPU_80BIT 0x30000000 +#define _FPU_SINGLE 0x10000000 /* DO NOT USE */ + +/* rounding control / Sparc */ +#define _FPU_RC_DOWN 0xc0000000 +#define _FPU_RC_UP 0x80000000 +#define _FPU_RC_ZERO 0x40000000 +#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */ + +#define _FPU_RESERVED 0x30300000 /* Reserved bits in cw */ + + +/* Now two recommended cw */ + +/* Linux default: + - extended precision + - rounding to nearest + - exceptions on overflow, zero divide and NaN */ +#define _FPU_DEFAULT 0x1e + +/* IEEE: same as above, but exceptions */ +#define _FPU_IEEE 0x0 + +/* Type of the control word. */ +typedef unsigned int fpu_control_t; + +#define _FPU_GETCW(cw) __asm__ ("st %%fsr,%0" : "=m" (*&cw)) +#define _FPU_SETCW(cw) __asm__ ("ld %0,%%fsr" : : "m" (*&cw)) + +/* Default control word set at startup. */ +extern fpu_control_t __fpu_control; + +__BEGIN_DECLS + +/* Called at startup. It can be used to manipulate fpu control register. */ +extern void __setfpucw __P ((fpu_control_t)); + +__END_DECLS + +#endif /* fpu_control.h */ diff --git a/sysdeps/sparc/sparc32/lshift.S b/sysdeps/sparc/sparc32/lshift.S new file mode 100644 index 0000000000..4f0595f2fb --- /dev/null +++ b/sysdeps/sparc/sparc32/lshift.S @@ -0,0 +1,95 @@ +! sparc __mpn_lshift -- + +! Copyright (C) 1995, 1996 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA. + + +! INPUT PARAMETERS +! res_ptr %o0 +! src_ptr %o1 +! size %o2 +! cnt %o3 + +#include "sysdep.h" + + .text + .align 4 + .global C_SYMBOL_NAME(__mpn_lshift) +C_SYMBOL_NAME(__mpn_lshift): + sll %o2,2,%g1 + add %o1,%g1,%o1 ! make %o1 point at end of src + ld [%o1-4],%g2 ! load first limb + sub %g0,%o3,%o5 ! negate shift count + add %o0,%g1,%o0 ! make %o0 point at end of res + add %o2,-1,%o2 + andcc %o2,4-1,%g4 ! number of limbs in first loop + srl %g2,%o5,%g1 ! compute function result + be L0 ! if multiple of 4 limbs, skip first loop + st %g1,[%sp+80] + + sub %o2,%g4,%o2 ! adjust count for main loop + +Loop0: ld [%o1-8],%g3 + add %o0,-4,%o0 + add %o1,-4,%o1 + addcc %g4,-1,%g4 + sll %g2,%o3,%o4 + srl %g3,%o5,%g1 + mov %g3,%g2 + or %o4,%g1,%o4 + bne Loop0 + st %o4,[%o0+0] + +L0: tst %o2 + be Lend + nop + +Loop: ld [%o1-8],%g3 + add %o0,-16,%o0 + addcc %o2,-4,%o2 + sll %g2,%o3,%o4 + srl %g3,%o5,%g1 + + ld [%o1-12],%g2 + sll %g3,%o3,%g4 + or %o4,%g1,%o4 + st %o4,[%o0+12] + srl %g2,%o5,%g1 + + ld [%o1-16],%g3 + sll %g2,%o3,%o4 + or %g4,%g1,%g4 + st %g4,[%o0+8] + srl %g3,%o5,%g1 + + ld [%o1-20],%g2 + sll %g3,%o3,%g4 + or %o4,%g1,%o4 + st %o4,[%o0+4] + srl %g2,%o5,%g1 + + add %o1,-16,%o1 + or %g4,%g1,%g4 + bne Loop + st %g4,[%o0+0] + +Lend: sll %g2,%o3,%g2 + st %g2,[%o0-4] + retl + ld [%sp+80],%o0 diff --git a/sysdeps/sparc/sparc32/memcopy.h b/sysdeps/sparc/sparc32/memcopy.h new file mode 100644 index 0000000000..ff73f453da --- /dev/null +++ b/sysdeps/sparc/sparc32/memcopy.h @@ -0,0 +1,21 @@ +/* Copyright (C) 1991, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#undef reg_char +#define reg_char int diff --git a/sysdeps/sparc/sparc32/mul_1.S b/sysdeps/sparc/sparc32/mul_1.S new file mode 100644 index 0000000000..142fd8ba2a --- /dev/null +++ b/sysdeps/sparc/sparc32/mul_1.S @@ -0,0 +1,199 @@ +! SPARC __mpn_mul_1 -- Multiply a limb vector with a limb and store +! the result in a second limb vector. + +! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA. + + +! INPUT PARAMETERS +! res_ptr o0 +! s1_ptr o1 +! size o2 +! s2_limb o3 + +! ADD CODE FOR SMALL MULTIPLIERS! +!1: ld +! st +! +!2: ld ,a +! addxcc a,a,x +! st x, +! +!3_unrolled: +! ld ,a +! addxcc a,a,x1 ! 2a + cy +! addx %g0,%g0,x2 +! addcc a,x1,x ! 3a + c +! st x, +! +! ld ,a +! addxcc a,a,y1 +! addx %g0,%g0,y2 +! addcc a,y1,x +! st x, +! +!4_unrolled: +! ld ,a +! srl a,2,x1 ! 4a +! addxcc y2,x1,x +! sll a,30,x2 +! st x, +! +! ld ,a +! srl a,2,y1 +! addxcc x2,y1,y +! sll a,30,y2 +! st x, +! +!5_unrolled: +! ld ,a +! srl a,2,x1 ! 4a +! addxcc a,x1,x ! 5a + c +! sll a,30,x2 +! addx %g0,x2,x2 +! st x, +! +! ld ,a +! srl a,2,y1 +! addxcc a,y1,x +! sll a,30,y2 +! addx %g0,y2,y2 +! st x, +! +!8_unrolled: +! ld ,a +! srl a,3,x1 ! 8a +! addxcc y2,x1,x +! sll a,29,x2 +! st x, +! +! ld ,a +! srl a,3,y1 +! addxcc x2,y1,y +! sll a,29,y2 +! st x, + +#include "sysdep.h" + +.text + .align 4 + .global C_SYMBOL_NAME(__mpn_mul_1) +C_SYMBOL_NAME(__mpn_mul_1): + ! Make S1_PTR and RES_PTR point at the end of their blocks + ! and put (- 4 x SIZE) in index/loop counter. + sll %o2,2,%o2 + add %o0,%o2,%o4 ! RES_PTR in o4 since o0 is retval + add %o1,%o2,%o1 + sub %g0,%o2,%o2 + + cmp %o3,0xfff + bgu Large + nop + + ld [%o1+%o2],%o5 + mov 0,%o0 + b L0 + add %o4,-4,%o4 +Loop0: + st %g1,[%o4+%o2] +L0: wr %g0,%o3,%y + sra %o5,31,%g2 + and %o3,%g2,%g2 + andcc %g1,0,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,0,%g1 + sra %g1,20,%g4 + sll %g1,12,%g1 + rd %y,%g3 + srl %g3,20,%g3 + or %g1,%g3,%g1 + + addcc %g1,%o0,%g1 + addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb + addcc %o2,4,%o2 ! loop counter + bne,a Loop0 + ld [%o1+%o2],%o5 + + retl + st %g1,[%o4+%o2] + + +Large: ld [%o1+%o2],%o5 + mov 0,%o0 + sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0 + b L1 + add %o4,-4,%o4 +Loop: + st %g3,[%o4+%o2] +L1: wr %g0,%o5,%y + and %o5,%g4,%g2 ! g2 = S1_LIMB iff S2_LIMB < 0, else 0 + andcc %g0,%g0,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%g0,%g1 + rd %y,%g3 + addcc %g3,%o0,%g3 + addx %g2,%g1,%o0 ! add sign-compensation and cy to hi limb + addcc %o2,4,%o2 ! loop counter + bne,a Loop + ld [%o1+%o2],%o5 + + retl + st %g3,[%o4+%o2] diff --git a/sysdeps/sparc/sparc32/rem.S b/sysdeps/sparc/sparc32/rem.S new file mode 100644 index 0000000000..d50f1af630 --- /dev/null +++ b/sysdeps/sparc/sparc32/rem.S @@ -0,0 +1,369 @@ + /* This file is generated from divrem.m4; DO NOT EDIT! */ +/* + * Division and remainder, from Appendix E of the Sparc Version 8 + * Architecture Manual, with fixes from Gordon Irlam. + */ + +/* + * Input: dividend and divisor in %o0 and %o1 respectively. + * + * m4 parameters: + * .rem name of function to generate + * rem rem=div => %o0 / %o1; rem=rem => %o0 % %o1 + * true true=true => signed; true=false => unsigned + * + * Algorithm parameters: + * N how many bits per iteration we try to get (4) + * WORDSIZE total number of bits (32) + * + * Derived constants: + * TOPBITS number of bits in the top decade of a number + * + * Important variables: + * Q the partial quotient under development (initially 0) + * R the remainder so far, initially the dividend + * ITER number of main division loop iterations required; + * equal to ceil(log2(quotient) / N). Note that this + * is the log base (2^N) of the quotient. + * V the current comparand, initially divisor*2^(ITER*N-1) + * + * Cost: + * Current estimate for non-large dividend is + * ceil(log2(quotient) / N) * (10 + 7N/2) + C + * A large dividend is one greater than 2^(31-TOPBITS) and takes a + * different path, as the upper bits of the quotient must be developed + * one bit at a time. + */ + + + +#include "sysdep.h" +#ifdef __linux__ +#include +#else +#ifdef __svr4__ +#include +#else +#include +#endif +#endif + +ENTRY(.rem) + ! compute sign of result; if neither is negative, no problem + orcc %o1, %o0, %g0 ! either negative? + bge 2f ! no, go do the divide + mov %o0, %g6 ! sign of remainder matches %o0 + tst %o1 + bge 1f + tst %o0 + ! %o1 is definitely negative; %o0 might also be negative + bge 2f ! if %o0 not negative... + sub %g0, %o1, %o1 ! in any case, make %o1 nonneg +1: ! %o0 is negative, %o1 is nonnegative + sub %g0, %o0, %o0 ! make %o0 nonnegative +2: + + ! Ready to divide. Compute size of quotient; scale comparand. + orcc %o1, %g0, %o5 + bne 1f + mov %o0, %o3 + + ! Divide by zero trap. If it returns, return 0 (about as + ! wrong as possible, but that is what SunOS does...). + ta ST_DIV0 + retl + clr %o0 + +1: + cmp %o3, %o5 ! if %o1 exceeds %o0, done + blu Lgot_result ! (and algorithm fails otherwise) + clr %o2 + sethi %hi(1 << (32 - 4 - 1)), %g1 + cmp %o3, %g1 + blu Lnot_really_big + clr %o4 + + ! Here the dividend is >= 2**(31-N) or so. We must be careful here, + ! as our usual N-at-a-shot divide step will cause overflow and havoc. + ! The number of bits in the result here is N*ITER+SC, where SC <= N. + ! Compute ITER in an unorthodox manner: know we need to shift V into + ! the top decade: so do not even bother to compare to R. + 1: + cmp %o5, %g1 + bgeu 3f + mov 1, %g7 + sll %o5, 4, %o5 + b 1b + add %o4, 1, %o4 + + ! Now compute %g7. + 2: addcc %o5, %o5, %o5 + bcc Lnot_too_big + add %g7, 1, %g7 + + ! We get here if the %o1 overflowed while shifting. + ! This means that %o3 has the high-order bit set. + ! Restore %o5 and subtract from %o3. + sll %g1, 4, %g1 ! high order bit + srl %o5, 1, %o5 ! rest of %o5 + add %o5, %g1, %o5 + b Ldo_single_div + sub %g7, 1, %g7 + + Lnot_too_big: + 3: cmp %o5, %o3 + blu 2b + nop + be Ldo_single_div + nop + /* NB: these are commented out in the V8-Sparc manual as well */ + /* (I do not understand this) */ + ! %o5 > %o3: went too far: back up 1 step + ! srl %o5, 1, %o5 + ! dec %g7 + ! do single-bit divide steps + ! + ! We have to be careful here. We know that %o3 >= %o5, so we can do the + ! first divide step without thinking. BUT, the others are conditional, + ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- + ! order bit set in the first step, just falling into the regular + ! division loop will mess up the first time around. + ! So we unroll slightly... + Ldo_single_div: + subcc %g7, 1, %g7 + bl Lend_regular_divide + nop + sub %o3, %o5, %o3 + mov 1, %o2 + b Lend_single_divloop + nop + Lsingle_divloop: + sll %o2, 1, %o2 + bl 1f + srl %o5, 1, %o5 + ! %o3 >= 0 + sub %o3, %o5, %o3 + b 2f + add %o2, 1, %o2 + 1: ! %o3 < 0 + add %o3, %o5, %o3 + sub %o2, 1, %o2 + 2: + Lend_single_divloop: + subcc %g7, 1, %g7 + bge Lsingle_divloop + tst %o3 + b,a Lend_regular_divide + +Lnot_really_big: +1: + sll %o5, 4, %o5 + cmp %o5, %o3 + bleu 1b + addcc %o4, 1, %o4 + be Lgot_result + sub %o4, 1, %o4 + + tst %o3 ! set up for initial iteration +Ldivloop: + sll %o2, 4, %o2 + ! depth 1, accumulated bits 0 + bl L.1.16 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 2, accumulated bits 1 + bl L.2.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 3, accumulated bits 3 + bl L.3.19 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits 7 + bl L.4.23 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (7*2+1), %o2 + +L.4.23: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (7*2-1), %o2 + + +L.3.19: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits 5 + bl L.4.21 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (5*2+1), %o2 + +L.4.21: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (5*2-1), %o2 + + + +L.2.17: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 3, accumulated bits 1 + bl L.3.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits 3 + bl L.4.19 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (3*2+1), %o2 + +L.4.19: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (3*2-1), %o2 + + +L.3.17: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits 1 + bl L.4.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (1*2+1), %o2 + +L.4.17: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (1*2-1), %o2 + + + + +L.1.16: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 2, accumulated bits -1 + bl L.2.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 3, accumulated bits -1 + bl L.3.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits -1 + bl L.4.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-1*2+1), %o2 + +L.4.15: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-1*2-1), %o2 + + +L.3.15: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits -3 + bl L.4.13 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-3*2+1), %o2 + +L.4.13: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-3*2-1), %o2 + + + +L.2.15: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 3, accumulated bits -3 + bl L.3.13 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits -5 + bl L.4.11 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-5*2+1), %o2 + +L.4.11: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-5*2-1), %o2 + + +L.3.13: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits -7 + bl L.4.9 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-7*2+1), %o2 + +L.4.9: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-7*2-1), %o2 + + + + + 9: +Lend_regular_divide: + subcc %o4, 1, %o4 + bge Ldivloop + tst %o3 + bl,a Lgot_result + ! non-restoring fixup here (one instruction only!) + add %o3, %o1, %o3 + + +Lgot_result: + ! check to see if answer should be < 0 + tst %g6 + bl,a 1f + sub %g0, %o3, %o3 +1: + retl + mov %o3, %o0 diff --git a/sysdeps/sparc/sparc32/rshift.S b/sysdeps/sparc/sparc32/rshift.S new file mode 100644 index 0000000000..fea4f3b926 --- /dev/null +++ b/sysdeps/sparc/sparc32/rshift.S @@ -0,0 +1,92 @@ +! sparc __mpn_rshift -- + +! Copyright (C) 1995, 1996 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA. + + +! INPUT PARAMETERS +! res_ptr %o0 +! src_ptr %o1 +! size %o2 +! cnt %o3 + +#include "sysdep.h" + + .text + .align 4 + .global C_SYMBOL_NAME(__mpn_rshift) +C_SYMBOL_NAME(__mpn_rshift): + ld [%o1],%g2 ! load first limb + sub %g0,%o3,%o5 ! negate shift count + add %o2,-1,%o2 + andcc %o2,4-1,%g4 ! number of limbs in first loop + sll %g2,%o5,%g1 ! compute function result + be L0 ! if multiple of 4 limbs, skip first loop + st %g1,[%sp+80] + + sub %o2,%g4,%o2 ! adjust count for main loop + +Loop0: ld [%o1+4],%g3 + add %o0,4,%o0 + add %o1,4,%o1 + addcc %g4,-1,%g4 + srl %g2,%o3,%o4 + sll %g3,%o5,%g1 + mov %g3,%g2 + or %o4,%g1,%o4 + bne Loop0 + st %o4,[%o0-4] + +L0: tst %o2 + be Lend + nop + +Loop: ld [%o1+4],%g3 + add %o0,16,%o0 + addcc %o2,-4,%o2 + srl %g2,%o3,%o4 + sll %g3,%o5,%g1 + + ld [%o1+8],%g2 + srl %g3,%o3,%g4 + or %o4,%g1,%o4 + st %o4,[%o0-16] + sll %g2,%o5,%g1 + + ld [%o1+12],%g3 + srl %g2,%o3,%o4 + or %g4,%g1,%g4 + st %g4,[%o0-12] + sll %g3,%o5,%g1 + + ld [%o1+16],%g2 + srl %g3,%o3,%g4 + or %o4,%g1,%o4 + st %o4,[%o0-8] + sll %g2,%o5,%g1 + + add %o1,16,%o1 + or %g4,%g1,%g4 + bne Loop + st %g4,[%o0-4] + +Lend: srl %g2,%o3,%g2 + st %g2,[%o0-0] + retl + ld [%sp+80],%o0 diff --git a/sysdeps/sparc/sparc32/sdiv.S b/sysdeps/sparc/sparc32/sdiv.S new file mode 100644 index 0000000000..02ed2e973c --- /dev/null +++ b/sysdeps/sparc/sparc32/sdiv.S @@ -0,0 +1,369 @@ + /* This file is generated from divrem.m4; DO NOT EDIT! */ +/* + * Division and remainder, from Appendix E of the Sparc Version 8 + * Architecture Manual, with fixes from Gordon Irlam. + */ + +/* + * Input: dividend and divisor in %o0 and %o1 respectively. + * + * m4 parameters: + * .div name of function to generate + * div div=div => %o0 / %o1; div=rem => %o0 % %o1 + * true true=true => signed; true=false => unsigned + * + * Algorithm parameters: + * N how many bits per iteration we try to get (4) + * WORDSIZE total number of bits (32) + * + * Derived constants: + * TOPBITS number of bits in the top decade of a number + * + * Important variables: + * Q the partial quotient under development (initially 0) + * R the remainder so far, initially the dividend + * ITER number of main division loop iterations required; + * equal to ceil(log2(quotient) / N). Note that this + * is the log base (2^N) of the quotient. + * V the current comparand, initially divisor*2^(ITER*N-1) + * + * Cost: + * Current estimate for non-large dividend is + * ceil(log2(quotient) / N) * (10 + 7N/2) + C + * A large dividend is one greater than 2^(31-TOPBITS) and takes a + * different path, as the upper bits of the quotient must be developed + * one bit at a time. + */ + + + +#include "sysdep.h" +#ifdef __linux__ +#include +#else +#ifdef __svr4__ +#include +#else +#include +#endif +#endif + +ENTRY(.div) + ! compute sign of result; if neither is negative, no problem + orcc %o1, %o0, %g0 ! either negative? + bge 2f ! no, go do the divide + xor %o1, %o0, %g6 ! compute sign in any case + tst %o1 + bge 1f + tst %o0 + ! %o1 is definitely negative; %o0 might also be negative + bge 2f ! if %o0 not negative... + sub %g0, %o1, %o1 ! in any case, make %o1 nonneg +1: ! %o0 is negative, %o1 is nonnegative + sub %g0, %o0, %o0 ! make %o0 nonnegative +2: + + ! Ready to divide. Compute size of quotient; scale comparand. + orcc %o1, %g0, %o5 + bne 1f + mov %o0, %o3 + + ! Divide by zero trap. If it returns, return 0 (about as + ! wrong as possible, but that is what SunOS does...). + ta ST_DIV0 + retl + clr %o0 + +1: + cmp %o3, %o5 ! if %o1 exceeds %o0, done + blu Lgot_result ! (and algorithm fails otherwise) + clr %o2 + sethi %hi(1 << (32 - 4 - 1)), %g1 + cmp %o3, %g1 + blu Lnot_really_big + clr %o4 + + ! Here the dividend is >= 2**(31-N) or so. We must be careful here, + ! as our usual N-at-a-shot divide step will cause overflow and havoc. + ! The number of bits in the result here is N*ITER+SC, where SC <= N. + ! Compute ITER in an unorthodox manner: know we need to shift V into + ! the top decade: so do not even bother to compare to R. + 1: + cmp %o5, %g1 + bgeu 3f + mov 1, %g7 + sll %o5, 4, %o5 + b 1b + add %o4, 1, %o4 + + ! Now compute %g7. + 2: addcc %o5, %o5, %o5 + bcc Lnot_too_big + add %g7, 1, %g7 + + ! We get here if the %o1 overflowed while shifting. + ! This means that %o3 has the high-order bit set. + ! Restore %o5 and subtract from %o3. + sll %g1, 4, %g1 ! high order bit + srl %o5, 1, %o5 ! rest of %o5 + add %o5, %g1, %o5 + b Ldo_single_div + sub %g7, 1, %g7 + + Lnot_too_big: + 3: cmp %o5, %o3 + blu 2b + nop + be Ldo_single_div + nop + /* NB: these are commented out in the V8-Sparc manual as well */ + /* (I do not understand this) */ + ! %o5 > %o3: went too far: back up 1 step + ! srl %o5, 1, %o5 + ! dec %g7 + ! do single-bit divide steps + ! + ! We have to be careful here. We know that %o3 >= %o5, so we can do the + ! first divide step without thinking. BUT, the others are conditional, + ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- + ! order bit set in the first step, just falling into the regular + ! division loop will mess up the first time around. + ! So we unroll slightly... + Ldo_single_div: + subcc %g7, 1, %g7 + bl Lend_regular_divide + nop + sub %o3, %o5, %o3 + mov 1, %o2 + b Lend_single_divloop + nop + Lsingle_divloop: + sll %o2, 1, %o2 + bl 1f + srl %o5, 1, %o5 + ! %o3 >= 0 + sub %o3, %o5, %o3 + b 2f + add %o2, 1, %o2 + 1: ! %o3 < 0 + add %o3, %o5, %o3 + sub %o2, 1, %o2 + 2: + Lend_single_divloop: + subcc %g7, 1, %g7 + bge Lsingle_divloop + tst %o3 + b,a Lend_regular_divide + +Lnot_really_big: +1: + sll %o5, 4, %o5 + cmp %o5, %o3 + bleu 1b + addcc %o4, 1, %o4 + be Lgot_result + sub %o4, 1, %o4 + + tst %o3 ! set up for initial iteration +Ldivloop: + sll %o2, 4, %o2 + ! depth 1, accumulated bits 0 + bl L.1.16 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 2, accumulated bits 1 + bl L.2.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 3, accumulated bits 3 + bl L.3.19 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits 7 + bl L.4.23 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (7*2+1), %o2 + +L.4.23: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (7*2-1), %o2 + + +L.3.19: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits 5 + bl L.4.21 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (5*2+1), %o2 + +L.4.21: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (5*2-1), %o2 + + + +L.2.17: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 3, accumulated bits 1 + bl L.3.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits 3 + bl L.4.19 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (3*2+1), %o2 + +L.4.19: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (3*2-1), %o2 + + +L.3.17: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits 1 + bl L.4.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (1*2+1), %o2 + +L.4.17: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (1*2-1), %o2 + + + + +L.1.16: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 2, accumulated bits -1 + bl L.2.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 3, accumulated bits -1 + bl L.3.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits -1 + bl L.4.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-1*2+1), %o2 + +L.4.15: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-1*2-1), %o2 + + +L.3.15: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits -3 + bl L.4.13 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-3*2+1), %o2 + +L.4.13: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-3*2-1), %o2 + + + +L.2.15: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 3, accumulated bits -3 + bl L.3.13 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits -5 + bl L.4.11 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-5*2+1), %o2 + +L.4.11: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-5*2-1), %o2 + + +L.3.13: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits -7 + bl L.4.9 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-7*2+1), %o2 + +L.4.9: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-7*2-1), %o2 + + + + + 9: +Lend_regular_divide: + subcc %o4, 1, %o4 + bge Ldivloop + tst %o3 + bl,a Lgot_result + ! non-restoring fixup here (one instruction only!) + sub %o2, 1, %o2 + + +Lgot_result: + ! check to see if answer should be < 0 + tst %g6 + bl,a 1f + sub %g0, %o2, %o2 +1: + retl + mov %o2, %o0 diff --git a/sysdeps/sparc/sparc32/setjmp.S b/sysdeps/sparc/sparc32/setjmp.S new file mode 100644 index 0000000000..772ec723a3 --- /dev/null +++ b/sysdeps/sparc/sparc32/setjmp.S @@ -0,0 +1,54 @@ +/* Copyright (C) 1991, 1993, 1994, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#define _ASM 1 +#include + +ENTRY (__sigsetjmp) + /* Save our SP and FP; in the delay slot of the jump, save our + return PC. Save the signal mask if requested with a tail-call + for simplicity; it always returns zero. */ + ta ST_FLUSH_WINDOWS +#ifdef PIC + mov %o7,%g1 +2: + call 1f + nop +1: + sethi %hi(_GLOBAL_OFFSET_TABLE_-(2b-.)),%g2 + or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(2b-.)),%g2 + add %g2,%o7,%g2 + sethi %hi(C_SYMBOL_NAME (__sigjmp_save)), %g3 + or %g3,%lo(C_SYMBOL_NAME (__sigjmp_save)), %g3 + st %sp, [%o0 + (JB_SP * 4)] + st %fp, [%o0 + (JB_FP * 4)] + mov %g1,%o7 + ld [%g2+%g3],%g1 + jmp %g1 + st %o7, [%o0+(JB_PC*4)] +#else + sethi %hi(C_SYMBOL_NAME (__sigjmp_save)), %g1 + st %sp, [%o0 + (JB_SP*4)] + or %lo(C_SYMBOL_NAME (__sigjmp_save)), %g1, %g1 + st %fp, [%o0 + (JB_FP*4)] + jmp %g1 + st %o7, [%o0 + (JB_PC*4)] +#endif /* PIC */ diff --git a/sysdeps/sparc/sparc32/sparcv8/addmul_1.S b/sysdeps/sparc/sparc32/sparcv8/addmul_1.S new file mode 100644 index 0000000000..fb9ea7cf0e --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv8/addmul_1.S @@ -0,0 +1,124 @@ +! SPARC v8 __mpn_addmul_1 -- Multiply a limb vector with a limb and +! add the result to a second limb vector. + +! Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA. + + +! INPUT PARAMETERS +! res_ptr o0 +! s1_ptr o1 +! size o2 +! s2_limb o3 + +#include "sysdep.h" + +.text + .align 4 + .global C_SYMBOL_NAME(__mpn_addmul_1) +C_SYMBOL_NAME(__mpn_addmul_1): + orcc %g0,%g0,%g2 + ld [%o1+0],%o4 ! 1 + + sll %o2,4,%g1 + and %g1,(4-1)<<4,%g1 +#if PIC + mov %o7,%g4 ! Save return address register + call 1f + add %o7,LL-1f,%g3 +1: mov %g4,%o7 ! Restore return address register +#else + sethi %hi(LL),%g3 + or %g3,%lo(LL),%g3 +#endif + jmp %g3+%g1 + nop +LL: +LL00: add %o0,-4,%o0 + b Loop00 /* 4, 8, 12, ... */ + add %o1,-4,%o1 + nop +LL01: b Loop01 /* 1, 5, 9, ... */ + nop + nop + nop +LL10: add %o0,-12,%o0 /* 2, 6, 10, ... */ + b Loop10 + add %o1,4,%o1 + nop +LL11: add %o0,-8,%o0 /* 3, 7, 11, ... */ + b Loop11 + add %o1,-8,%o1 + nop + +1: addcc %g3,%g2,%g3 ! 1 + ld [%o1+4],%o4 ! 2 + rd %y,%g2 ! 1 + addx %g0,%g2,%g2 + ld [%o0+0],%g1 ! 2 + addcc %g1,%g3,%g3 + st %g3,[%o0+0] ! 1 +Loop00: umul %o4,%o3,%g3 ! 2 + ld [%o0+4],%g1 ! 2 + addxcc %g3,%g2,%g3 ! 2 + ld [%o1+8],%o4 ! 3 + rd %y,%g2 ! 2 + addx %g0,%g2,%g2 + nop + addcc %g1,%g3,%g3 + st %g3,[%o0+4] ! 2 +Loop11: umul %o4,%o3,%g3 ! 3 + addxcc %g3,%g2,%g3 ! 3 + ld [%o1+12],%o4 ! 4 + rd %y,%g2 ! 3 + add %o1,16,%o1 + addx %g0,%g2,%g2 + ld [%o0+8],%g1 ! 2 + addcc %g1,%g3,%g3 + st %g3,[%o0+8] ! 3 +Loop10: umul %o4,%o3,%g3 ! 4 + addxcc %g3,%g2,%g3 ! 4 + ld [%o1+0],%o4 ! 1 + rd %y,%g2 ! 4 + addx %g0,%g2,%g2 + ld [%o0+12],%g1 ! 2 + addcc %g1,%g3,%g3 + st %g3,[%o0+12] ! 4 + add %o0,16,%o0 + addx %g0,%g2,%g2 +Loop01: addcc %o2,-4,%o2 + bg 1b + umul %o4,%o3,%g3 ! 1 + + addcc %g3,%g2,%g3 ! 4 + rd %y,%g2 ! 4 + addx %g0,%g2,%g2 + ld [%o0+0],%g1 ! 2 + addcc %g1,%g3,%g3 + st %g3,[%o0+0] ! 4 + addx %g0,%g2,%o0 + + retl + nop + + +! umul, ld, addxcc, rd, st + +! umul, ld, addxcc, rd, ld, addcc, st, addx + diff --git a/sysdeps/sparc/sparc32/sparcv8/mul_1.S b/sysdeps/sparc/sparc32/sparcv8/mul_1.S new file mode 100644 index 0000000000..b641feb453 --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv8/mul_1.S @@ -0,0 +1,99 @@ +! SPARC v8 __mpn_mul_1 -- Multiply a limb vector with a single limb and +! store the product in a second limb vector. + +! Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA. + + +! INPUT PARAMETERS +! res_ptr o0 +! s1_ptr o1 +! size o2 +! s2_limb o3 + +#include "sysdep.h" + +.text + .align 8 + .global C_SYMBOL_NAME(__mpn_mul_1) +C_SYMBOL_NAME(__mpn_mul_1): + sll %o2,4,%g1 + and %g1,(4-1)<<4,%g1 +#if PIC + mov %o7,%g4 ! Save return address register + call 1f + add %o7,LL-1f,%g3 +1: mov %g4,%o7 ! Restore return address register +#else + sethi %hi(LL),%g3 + or %g3,%lo(LL),%g3 +#endif + jmp %g3+%g1 + ld [%o1+0],%o4 ! 1 +LL: +LL00: add %o0,-4,%o0 + add %o1,-4,%o1 + b Loop00 /* 4, 8, 12, ... */ + orcc %g0,%g0,%g2 +LL01: b Loop01 /* 1, 5, 9, ... */ + orcc %g0,%g0,%g2 + nop + nop +LL10: add %o0,-12,%o0 /* 2, 6, 10, ... */ + add %o1,4,%o1 + b Loop10 + orcc %g0,%g0,%g2 + nop +LL11: add %o0,-8,%o0 /* 3, 7, 11, ... */ + add %o1,-8,%o1 + b Loop11 + orcc %g0,%g0,%g2 + +Loop: addcc %g3,%g2,%g3 ! 1 + ld [%o1+4],%o4 ! 2 + st %g3,[%o0+0] ! 1 + rd %y,%g2 ! 1 +Loop00: umul %o4,%o3,%g3 ! 2 + addxcc %g3,%g2,%g3 ! 2 + ld [%o1+8],%o4 ! 3 + st %g3,[%o0+4] ! 2 + rd %y,%g2 ! 2 +Loop11: umul %o4,%o3,%g3 ! 3 + addxcc %g3,%g2,%g3 ! 3 + ld [%o1+12],%o4 ! 4 + add %o1,16,%o1 + st %g3,[%o0+8] ! 3 + rd %y,%g2 ! 3 +Loop10: umul %o4,%o3,%g3 ! 4 + addxcc %g3,%g2,%g3 ! 4 + ld [%o1+0],%o4 ! 1 + st %g3,[%o0+12] ! 4 + add %o0,16,%o0 + rd %y,%g2 ! 4 + addx %g0,%g2,%g2 +Loop01: addcc %o2,-4,%o2 + bg Loop + umul %o4,%o3,%g3 ! 1 + + addcc %g3,%g2,%g3 ! 4 + st %g3,[%o0+0] ! 4 + rd %y,%g2 ! 4 + + retl + addx %g0,%g2,%o0 diff --git a/sysdeps/sparc/sparc32/sparcv8/submul_1.S b/sysdeps/sparc/sparc32/sparcv8/submul_1.S new file mode 100644 index 0000000000..e40119d011 --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv8/submul_1.S @@ -0,0 +1,58 @@ +! SPARC v8 __mpn_submul_1 -- Multiply a limb vector with a limb and +! subtract the result from a second limb vector. + +! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA. + + +! INPUT PARAMETERS +! res_ptr o0 +! s1_ptr o1 +! size o2 +! s2_limb o3 + +#include "sysdep.h" + +.text + .align 4 + .global C_SYMBOL_NAME(__mpn_submul_1) +C_SYMBOL_NAME(__mpn_submul_1): + sub %g0,%o2,%o2 ! negate ... + sll %o2,2,%o2 ! ... and scale size + sub %o1,%o2,%o1 ! o1 is offset s1_ptr + sub %o0,%o2,%g1 ! g1 is offset res_ptr + + mov 0,%o0 ! clear cy_limb + +Loop: ld [%o1+%o2],%o4 + ld [%g1+%o2],%g2 + umul %o4,%o3,%o5 + rd %y,%g3 + addcc %o5,%o0,%o5 + addx %g3,0,%o0 + subcc %g2,%o5,%g2 + addx %o0,0,%o0 + st %g2,[%g1+%o2] + + addcc %o2,4,%o2 + bne Loop + nop + + retl + nop diff --git a/sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S b/sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S new file mode 100644 index 0000000000..49c2398806 --- /dev/null +++ b/sysdeps/sparc/sparc32/sparcv8/udiv_qrnnd.S @@ -0,0 +1,186 @@ +! SPARC __udiv_qrnnd division support, used from longlong.h. + +! Copyright (C) 1993, 1994 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + +! INPUT PARAMETERS +! rem_ptr o0 +! n1 o1 +! n0 o2 +! d o3 + +#include "sysdep.h" + + .text + .align 4 + .global C_SYMBOL_NAME(__udiv_qrnnd) +C_SYMBOL_NAME(__udiv_qrnnd): + tst %o3 + bneg Largedivisor + mov 8,%g1 + + b Lp1 + addxcc %o2,%o2,%o2 + +Lplop: bcc Ln1 + addxcc %o2,%o2,%o2 +Lp1: addx %o1,%o1,%o1 + subcc %o1,%o3,%o4 + bcc Ln2 + addxcc %o2,%o2,%o2 +Lp2: addx %o1,%o1,%o1 + subcc %o1,%o3,%o4 + bcc Ln3 + addxcc %o2,%o2,%o2 +Lp3: addx %o1,%o1,%o1 + subcc %o1,%o3,%o4 + bcc Ln4 + addxcc %o2,%o2,%o2 +Lp4: addx %o1,%o1,%o1 + addcc %g1,-1,%g1 + bne Lplop + subcc %o1,%o3,%o4 + bcc Ln5 + addxcc %o2,%o2,%o2 +Lp5: st %o1,[%o0] + retl + xnor %g0,%o2,%o0 + +Lnlop: bcc Lp1 + addxcc %o2,%o2,%o2 +Ln1: addx %o4,%o4,%o4 + subcc %o4,%o3,%o1 + bcc Lp2 + addxcc %o2,%o2,%o2 +Ln2: addx %o4,%o4,%o4 + subcc %o4,%o3,%o1 + bcc Lp3 + addxcc %o2,%o2,%o2 +Ln3: addx %o4,%o4,%o4 + subcc %o4,%o3,%o1 + bcc Lp4 + addxcc %o2,%o2,%o2 +Ln4: addx %o4,%o4,%o4 + addcc %g1,-1,%g1 + bne Lnlop + subcc %o4,%o3,%o1 + bcc Lp5 + addxcc %o2,%o2,%o2 +Ln5: st %o4,[%o0] + retl + xnor %g0,%o2,%o0 + +Largedivisor: + and %o2,1,%o5 ! %o5 = n0 & 1 + + srl %o2,1,%o2 + sll %o1,31,%g2 + or %g2,%o2,%o2 ! %o2 = lo(n1n0 >> 1) + srl %o1,1,%o1 ! %o1 = hi(n1n0 >> 1) + + and %o3,1,%g2 + srl %o3,1,%g3 ! %g3 = floor(d / 2) + add %g3,%g2,%g3 ! %g3 = ceil(d / 2) + + b LLp1 + addxcc %o2,%o2,%o2 + +LLplop: bcc LLn1 + addxcc %o2,%o2,%o2 +LLp1: addx %o1,%o1,%o1 + subcc %o1,%g3,%o4 + bcc LLn2 + addxcc %o2,%o2,%o2 +LLp2: addx %o1,%o1,%o1 + subcc %o1,%g3,%o4 + bcc LLn3 + addxcc %o2,%o2,%o2 +LLp3: addx %o1,%o1,%o1 + subcc %o1,%g3,%o4 + bcc LLn4 + addxcc %o2,%o2,%o2 +LLp4: addx %o1,%o1,%o1 + addcc %g1,-1,%g1 + bne LLplop + subcc %o1,%g3,%o4 + bcc LLn5 + addxcc %o2,%o2,%o2 +LLp5: add %o1,%o1,%o1 ! << 1 + tst %g2 + bne Oddp + add %o5,%o1,%o1 + st %o1,[%o0] + retl + xnor %g0,%o2,%o0 + +LLnlop: bcc LLp1 + addxcc %o2,%o2,%o2 +LLn1: addx %o4,%o4,%o4 + subcc %o4,%g3,%o1 + bcc LLp2 + addxcc %o2,%o2,%o2 +LLn2: addx %o4,%o4,%o4 + subcc %o4,%g3,%o1 + bcc LLp3 + addxcc %o2,%o2,%o2 +LLn3: addx %o4,%o4,%o4 + subcc %o4,%g3,%o1 + bcc LLp4 + addxcc %o2,%o2,%o2 +LLn4: addx %o4,%o4,%o4 + addcc %g1,-1,%g1 + bne LLnlop + subcc %o4,%g3,%o1 + bcc LLp5 + addxcc %o2,%o2,%o2 +LLn5: add %o4,%o4,%o4 ! << 1 + tst %g2 + bne Oddn + add %o5,%o4,%o4 + st %o4,[%o0] + retl + xnor %g0,%o2,%o0 + +Oddp: xnor %g0,%o2,%o2 + ! q' in %o2. r' in %o1 + addcc %o1,%o2,%o1 + bcc LLp6 + addx %o2,0,%o2 + sub %o1,%o3,%o1 +LLp6: subcc %o1,%o3,%g0 + bcs LLp7 + subx %o2,-1,%o2 + sub %o1,%o3,%o1 +LLp7: st %o1,[%o0] + retl + mov %o2,%o0 + +Oddn: xnor %g0,%o2,%o2 + ! q' in %o2. r' in %o4 + addcc %o4,%o2,%o4 + bcc LLn6 + addx %o2,0,%o2 + sub %o4,%o3,%o4 +LLn6: subcc %o4,%o3,%g0 + bcs LLn7 + subx %o2,-1,%o2 + sub %o4,%o3,%o4 +LLn7: st %o4,[%o0] + retl + mov %o2,%o0 diff --git a/sysdeps/sparc/sparc32/sub_n.S b/sysdeps/sparc/sparc32/sub_n.S new file mode 100644 index 0000000000..b7a11958e2 --- /dev/null +++ b/sysdeps/sparc/sparc32/sub_n.S @@ -0,0 +1,311 @@ +! SPARC __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and +! store difference in a third limb vector. + +! Copyright (C) 1995, 1996 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA. + + +! INPUT PARAMETERS +#define res_ptr %o0 +#define s1_ptr %o1 +#define s2_ptr %o2 +#define size %o3 + +#include "sysdep.h" + + .text + .align 4 + .global C_SYMBOL_NAME(__mpn_sub_n) +C_SYMBOL_NAME(__mpn_sub_n): + xor s2_ptr,res_ptr,%g1 + andcc %g1,4,%g0 + bne L1 ! branch if alignment differs + nop +! ** V1a ** + andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0 + be L_v1 ! if no, branch + nop +/* Add least significant limb separately to align res_ptr and s2_ptr */ + ld [s1_ptr],%g4 + add s1_ptr,4,s1_ptr + ld [s2_ptr],%g2 + add s2_ptr,4,s2_ptr + add size,-1,size + subcc %g4,%g2,%o4 + st %o4,[res_ptr] + add res_ptr,4,res_ptr +L_v1: addx %g0,%g0,%o4 ! save cy in register + cmp size,2 ! if size < 2 ... + bl Lend2 ! ... branch to tail code + subcc %g0,%o4,%g0 ! restore cy + + ld [s1_ptr+0],%g4 + addcc size,-10,size + ld [s1_ptr+4],%g1 + ldd [s2_ptr+0],%g2 + blt Lfin1 + subcc %g0,%o4,%g0 ! restore cy +/* Add blocks of 8 limbs until less than 8 limbs remain */ +Loop1: subxcc %g4,%g2,%o4 + ld [s1_ptr+8],%g4 + subxcc %g1,%g3,%o5 + ld [s1_ptr+12],%g1 + ldd [s2_ptr+8],%g2 + std %o4,[res_ptr+0] + subxcc %g4,%g2,%o4 + ld [s1_ptr+16],%g4 + subxcc %g1,%g3,%o5 + ld [s1_ptr+20],%g1 + ldd [s2_ptr+16],%g2 + std %o4,[res_ptr+8] + subxcc %g4,%g2,%o4 + ld [s1_ptr+24],%g4 + subxcc %g1,%g3,%o5 + ld [s1_ptr+28],%g1 + ldd [s2_ptr+24],%g2 + std %o4,[res_ptr+16] + subxcc %g4,%g2,%o4 + ld [s1_ptr+32],%g4 + subxcc %g1,%g3,%o5 + ld [s1_ptr+36],%g1 + ldd [s2_ptr+32],%g2 + std %o4,[res_ptr+24] + addx %g0,%g0,%o4 ! save cy in register + addcc size,-8,size + add s1_ptr,32,s1_ptr + add s2_ptr,32,s2_ptr + add res_ptr,32,res_ptr + bge Loop1 + subcc %g0,%o4,%g0 ! restore cy + +Lfin1: addcc size,8-2,size + blt Lend1 + subcc %g0,%o4,%g0 ! restore cy +/* Add blocks of 2 limbs until less than 2 limbs remain */ +Loope1: subxcc %g4,%g2,%o4 + ld [s1_ptr+8],%g4 + subxcc %g1,%g3,%o5 + ld [s1_ptr+12],%g1 + ldd [s2_ptr+8],%g2 + std %o4,[res_ptr+0] + addx %g0,%g0,%o4 ! save cy in register + addcc size,-2,size + add s1_ptr,8,s1_ptr + add s2_ptr,8,s2_ptr + add res_ptr,8,res_ptr + bge Loope1 + subcc %g0,%o4,%g0 ! restore cy +Lend1: subxcc %g4,%g2,%o4 + subxcc %g1,%g3,%o5 + std %o4,[res_ptr+0] + addx %g0,%g0,%o4 ! save cy in register + + andcc size,1,%g0 + be Lret1 + subcc %g0,%o4,%g0 ! restore cy +/* Add last limb */ + ld [s1_ptr+8],%g4 + ld [s2_ptr+8],%g2 + subxcc %g4,%g2,%o4 + st %o4,[res_ptr+8] + +Lret1: retl + addx %g0,%g0,%o0 ! return carry-out from most sign. limb + +L1: xor s1_ptr,res_ptr,%g1 + andcc %g1,4,%g0 + bne L2 + nop +! ** V1b ** + andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0 + be L_v1b ! if no, branch + nop +/* Add least significant limb separately to align res_ptr and s1_ptr */ + ld [s2_ptr],%g4 + add s2_ptr,4,s2_ptr + ld [s1_ptr],%g2 + add s1_ptr,4,s1_ptr + add size,-1,size + subcc %g2,%g4,%o4 + st %o4,[res_ptr] + add res_ptr,4,res_ptr +L_v1b: addx %g0,%g0,%o4 ! save cy in register + cmp size,2 ! if size < 2 ... + bl Lend2 ! ... branch to tail code + subcc %g0,%o4,%g0 ! restore cy + + ld [s2_ptr+0],%g4 + addcc size,-10,size + ld [s2_ptr+4],%g1 + ldd [s1_ptr+0],%g2 + blt Lfin1b + subcc %g0,%o4,%g0 ! restore cy +/* Add blocks of 8 limbs until less than 8 limbs remain */ +Loop1b: subxcc %g2,%g4,%o4 + ld [s2_ptr+8],%g4 + subxcc %g3,%g1,%o5 + ld [s2_ptr+12],%g1 + ldd [s1_ptr+8],%g2 + std %o4,[res_ptr+0] + subxcc %g2,%g4,%o4 + ld [s2_ptr+16],%g4 + subxcc %g3,%g1,%o5 + ld [s2_ptr+20],%g1 + ldd [s1_ptr+16],%g2 + std %o4,[res_ptr+8] + subxcc %g2,%g4,%o4 + ld [s2_ptr+24],%g4 + subxcc %g3,%g1,%o5 + ld [s2_ptr+28],%g1 + ldd [s1_ptr+24],%g2 + std %o4,[res_ptr+16] + subxcc %g2,%g4,%o4 + ld [s2_ptr+32],%g4 + subxcc %g3,%g1,%o5 + ld [s2_ptr+36],%g1 + ldd [s1_ptr+32],%g2 + std %o4,[res_ptr+24] + addx %g0,%g0,%o4 ! save cy in register + addcc size,-8,size + add s1_ptr,32,s1_ptr + add s2_ptr,32,s2_ptr + add res_ptr,32,res_ptr + bge Loop1b + subcc %g0,%o4,%g0 ! restore cy + +Lfin1b: addcc size,8-2,size + blt Lend1b + subcc %g0,%o4,%g0 ! restore cy +/* Add blocks of 2 limbs until less than 2 limbs remain */ +Loope1b:subxcc %g2,%g4,%o4 + ld [s2_ptr+8],%g4 + subxcc %g3,%g1,%o5 + ld [s2_ptr+12],%g1 + ldd [s1_ptr+8],%g2 + std %o4,[res_ptr+0] + addx %g0,%g0,%o4 ! save cy in register + addcc size,-2,size + add s1_ptr,8,s1_ptr + add s2_ptr,8,s2_ptr + add res_ptr,8,res_ptr + bge Loope1b + subcc %g0,%o4,%g0 ! restore cy +Lend1b: subxcc %g2,%g4,%o4 + subxcc %g3,%g1,%o5 + std %o4,[res_ptr+0] + addx %g0,%g0,%o4 ! save cy in register + + andcc size,1,%g0 + be Lret1b + subcc %g0,%o4,%g0 ! restore cy +/* Add last limb */ + ld [s2_ptr+8],%g4 + ld [s1_ptr+8],%g2 + subxcc %g2,%g4,%o4 + st %o4,[res_ptr+8] + +Lret1b: retl + addx %g0,%g0,%o0 ! return carry-out from most sign. limb + +! ** V2 ** +/* If we come here, the alignment of s1_ptr and res_ptr as well as the + alignment of s2_ptr and res_ptr differ. Since there are only two ways + things can be aligned (that we care about) we now know that the alignment + of s1_ptr and s2_ptr are the same. */ + +L2: cmp size,1 + be Ljone + nop + andcc s1_ptr,4,%g0 ! s1_ptr unaligned? Side effect: cy=0 + be L_v2 ! if no, branch + nop +/* Add least significant limb separately to align s1_ptr and s2_ptr */ + ld [s1_ptr],%g4 + add s1_ptr,4,s1_ptr + ld [s2_ptr],%g2 + add s2_ptr,4,s2_ptr + add size,-1,size + subcc %g4,%g2,%o4 + st %o4,[res_ptr] + add res_ptr,4,res_ptr + +L_v2: addx %g0,%g0,%o4 ! save cy in register + addcc size,-8,size + blt Lfin2 + subcc %g0,%o4,%g0 ! restore cy +/* Add blocks of 8 limbs until less than 8 limbs remain */ +Loop2: ldd [s1_ptr+0],%g2 + ldd [s2_ptr+0],%o4 + subxcc %g2,%o4,%g2 + st %g2,[res_ptr+0] + subxcc %g3,%o5,%g3 + st %g3,[res_ptr+4] + ldd [s1_ptr+8],%g2 + ldd [s2_ptr+8],%o4 + subxcc %g2,%o4,%g2 + st %g2,[res_ptr+8] + subxcc %g3,%o5,%g3 + st %g3,[res_ptr+12] + ldd [s1_ptr+16],%g2 + ldd [s2_ptr+16],%o4 + subxcc %g2,%o4,%g2 + st %g2,[res_ptr+16] + subxcc %g3,%o5,%g3 + st %g3,[res_ptr+20] + ldd [s1_ptr+24],%g2 + ldd [s2_ptr+24],%o4 + subxcc %g2,%o4,%g2 + st %g2,[res_ptr+24] + subxcc %g3,%o5,%g3 + st %g3,[res_ptr+28] + addx %g0,%g0,%o4 ! save cy in register + addcc size,-8,size + add s1_ptr,32,s1_ptr + add s2_ptr,32,s2_ptr + add res_ptr,32,res_ptr + bge Loop2 + subcc %g0,%o4,%g0 ! restore cy + +Lfin2: addcc size,8-2,size + blt Lend2 + subcc %g0,%o4,%g0 ! restore cy +Loope2: ldd [s1_ptr+0],%g2 + ldd [s2_ptr+0],%o4 + subxcc %g2,%o4,%g2 + st %g2,[res_ptr+0] + subxcc %g3,%o5,%g3 + st %g3,[res_ptr+4] + addx %g0,%g0,%o4 ! save cy in register + addcc size,-2,size + add s1_ptr,8,s1_ptr + add s2_ptr,8,s2_ptr + add res_ptr,8,res_ptr + bge Loope2 + subcc %g0,%o4,%g0 ! restore cy +Lend2: andcc size,1,%g0 + be Lret2 + subcc %g0,%o4,%g0 ! restore cy +/* Add last limb */ +Ljone: ld [s1_ptr],%g4 + ld [s2_ptr],%g2 + subxcc %g4,%g2,%o4 + st %o4,[res_ptr] + +Lret2: retl + addx %g0,%g0,%o0 ! return carry-out from most sign. limb diff --git a/sysdeps/sparc/sparc32/submul_1.S b/sysdeps/sparc/sparc32/submul_1.S new file mode 100644 index 0000000000..a8ebd501a7 --- /dev/null +++ b/sysdeps/sparc/sparc32/submul_1.S @@ -0,0 +1,147 @@ +! SPARC __mpn_submul_1 -- Multiply a limb vector with a limb and subtract +! the result from a second limb vector. + +! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +! MA 02111-1307, USA. + + +! INPUT PARAMETERS +! res_ptr o0 +! s1_ptr o1 +! size o2 +! s2_limb o3 + +#include "sysdep.h" + +.text + .align 4 + .global C_SYMBOL_NAME(__mpn_submul_1) +C_SYMBOL_NAME(__mpn_submul_1): + ! Make S1_PTR and RES_PTR point at the end of their blocks + ! and put (- 4 x SIZE) in index/loop counter. + sll %o2,2,%o2 + add %o0,%o2,%o4 ! RES_PTR in o4 since o0 is retval + add %o1,%o2,%o1 + sub %g0,%o2,%o2 + + cmp %o3,0xfff + bgu Large + nop + + ld [%o1+%o2],%o5 + mov 0,%o0 + b L0 + add %o4,-4,%o4 +Loop0: + subcc %o5,%g1,%g1 + ld [%o1+%o2],%o5 + addx %o0,%g0,%o0 + st %g1,[%o4+%o2] +L0: wr %g0,%o3,%y + sra %o5,31,%g2 + and %o3,%g2,%g2 + andcc %g1,0,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,%o5,%g1 + mulscc %g1,0,%g1 + sra %g1,20,%g4 + sll %g1,12,%g1 + rd %y,%g3 + srl %g3,20,%g3 + or %g1,%g3,%g1 + + addcc %g1,%o0,%g1 + addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb + addcc %o2,4,%o2 ! loop counter + bne Loop0 + ld [%o4+%o2],%o5 + + subcc %o5,%g1,%g1 + addx %o0,%g0,%o0 + retl + st %g1,[%o4+%o2] + + +Large: ld [%o1+%o2],%o5 + mov 0,%o0 + sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0 + b L1 + add %o4,-4,%o4 +Loop: + subcc %o5,%g3,%g3 + ld [%o1+%o2],%o5 + addx %o0,%g0,%o0 + st %g3,[%o4+%o2] +L1: wr %g0,%o5,%y + and %o5,%g4,%g2 + andcc %g0,%g0,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%o3,%g1 + mulscc %g1,%g0,%g1 + rd %y,%g3 + addcc %g3,%o0,%g3 + addx %g2,%g1,%o0 + addcc %o2,4,%o2 + bne Loop + ld [%o4+%o2],%o5 + + subcc %o5,%g3,%g3 + addx %o0,%g0,%o0 + retl + st %g3,[%o4+%o2] diff --git a/sysdeps/sparc/sparc32/udiv.S b/sysdeps/sparc/sparc32/udiv.S new file mode 100644 index 0000000000..4a7d1526b0 --- /dev/null +++ b/sysdeps/sparc/sparc32/udiv.S @@ -0,0 +1,352 @@ + /* This file is generated from divrem.m4; DO NOT EDIT! */ +/* + * Division and remainder, from Appendix E of the Sparc Version 8 + * Architecture Manual, with fixes from Gordon Irlam. + */ + +/* + * Input: dividend and divisor in %o0 and %o1 respectively. + * + * m4 parameters: + * .udiv name of function to generate + * div div=div => %o0 / %o1; div=rem => %o0 % %o1 + * false false=true => signed; false=false => unsigned + * + * Algorithm parameters: + * N how many bits per iteration we try to get (4) + * WORDSIZE total number of bits (32) + * + * Derived constants: + * TOPBITS number of bits in the top decade of a number + * + * Important variables: + * Q the partial quotient under development (initially 0) + * R the remainder so far, initially the dividend + * ITER number of main division loop iterations required; + * equal to ceil(log2(quotient) / N). Note that this + * is the log base (2^N) of the quotient. + * V the current comparand, initially divisor*2^(ITER*N-1) + * + * Cost: + * Current estimate for non-large dividend is + * ceil(log2(quotient) / N) * (10 + 7N/2) + C + * A large dividend is one greater than 2^(31-TOPBITS) and takes a + * different path, as the upper bits of the quotient must be developed + * one bit at a time. + */ + + + +#include "sysdep.h" +#ifdef __linux__ +#include +#else +#ifdef __svr4__ +#include +#else +#include +#endif +#endif + +ENTRY(.udiv) + + ! Ready to divide. Compute size of quotient; scale comparand. + orcc %o1, %g0, %o5 + bne 1f + mov %o0, %o3 + + ! Divide by zero trap. If it returns, return 0 (about as + ! wrong as possible, but that is what SunOS does...). + ta ST_DIV0 + retl + clr %o0 + +1: + cmp %o3, %o5 ! if %o1 exceeds %o0, done + blu Lgot_result ! (and algorithm fails otherwise) + clr %o2 + sethi %hi(1 << (32 - 4 - 1)), %g1 + cmp %o3, %g1 + blu Lnot_really_big + clr %o4 + + ! Here the dividend is >= 2**(31-N) or so. We must be careful here, + ! as our usual N-at-a-shot divide step will cause overflow and havoc. + ! The number of bits in the result here is N*ITER+SC, where SC <= N. + ! Compute ITER in an unorthodox manner: know we need to shift V into + ! the top decade: so do not even bother to compare to R. + 1: + cmp %o5, %g1 + bgeu 3f + mov 1, %g7 + sll %o5, 4, %o5 + b 1b + add %o4, 1, %o4 + + ! Now compute %g7. + 2: addcc %o5, %o5, %o5 + bcc Lnot_too_big + add %g7, 1, %g7 + + ! We get here if the %o1 overflowed while shifting. + ! This means that %o3 has the high-order bit set. + ! Restore %o5 and subtract from %o3. + sll %g1, 4, %g1 ! high order bit + srl %o5, 1, %o5 ! rest of %o5 + add %o5, %g1, %o5 + b Ldo_single_div + sub %g7, 1, %g7 + + Lnot_too_big: + 3: cmp %o5, %o3 + blu 2b + nop + be Ldo_single_div + nop + /* NB: these are commented out in the V8-Sparc manual as well */ + /* (I do not understand this) */ + ! %o5 > %o3: went too far: back up 1 step + ! srl %o5, 1, %o5 + ! dec %g7 + ! do single-bit divide steps + ! + ! We have to be careful here. We know that %o3 >= %o5, so we can do the + ! first divide step without thinking. BUT, the others are conditional, + ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- + ! order bit set in the first step, just falling into the regular + ! division loop will mess up the first time around. + ! So we unroll slightly... + Ldo_single_div: + subcc %g7, 1, %g7 + bl Lend_regular_divide + nop + sub %o3, %o5, %o3 + mov 1, %o2 + b Lend_single_divloop + nop + Lsingle_divloop: + sll %o2, 1, %o2 + bl 1f + srl %o5, 1, %o5 + ! %o3 >= 0 + sub %o3, %o5, %o3 + b 2f + add %o2, 1, %o2 + 1: ! %o3 < 0 + add %o3, %o5, %o3 + sub %o2, 1, %o2 + 2: + Lend_single_divloop: + subcc %g7, 1, %g7 + bge Lsingle_divloop + tst %o3 + b,a Lend_regular_divide + +Lnot_really_big: +1: + sll %o5, 4, %o5 + cmp %o5, %o3 + bleu 1b + addcc %o4, 1, %o4 + be Lgot_result + sub %o4, 1, %o4 + + tst %o3 ! set up for initial iteration +Ldivloop: + sll %o2, 4, %o2 + ! depth 1, accumulated bits 0 + bl L.1.16 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 2, accumulated bits 1 + bl L.2.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 3, accumulated bits 3 + bl L.3.19 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits 7 + bl L.4.23 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (7*2+1), %o2 + +L.4.23: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (7*2-1), %o2 + + +L.3.19: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits 5 + bl L.4.21 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (5*2+1), %o2 + +L.4.21: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (5*2-1), %o2 + + + +L.2.17: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 3, accumulated bits 1 + bl L.3.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits 3 + bl L.4.19 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (3*2+1), %o2 + +L.4.19: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (3*2-1), %o2 + + +L.3.17: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits 1 + bl L.4.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (1*2+1), %o2 + +L.4.17: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (1*2-1), %o2 + + + + +L.1.16: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 2, accumulated bits -1 + bl L.2.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 3, accumulated bits -1 + bl L.3.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits -1 + bl L.4.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-1*2+1), %o2 + +L.4.15: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-1*2-1), %o2 + + +L.3.15: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits -3 + bl L.4.13 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-3*2+1), %o2 + +L.4.13: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-3*2-1), %o2 + + + +L.2.15: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 3, accumulated bits -3 + bl L.3.13 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits -5 + bl L.4.11 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-5*2+1), %o2 + +L.4.11: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-5*2-1), %o2 + + +L.3.13: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits -7 + bl L.4.9 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-7*2+1), %o2 + +L.4.9: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-7*2-1), %o2 + + + + + 9: +Lend_regular_divide: + subcc %o4, 1, %o4 + bge Ldivloop + tst %o3 + bl,a Lgot_result + ! non-restoring fixup here (one instruction only!) + sub %o2, 1, %o2 + + +Lgot_result: + + retl + mov %o2, %o0 diff --git a/sysdeps/sparc/sparc32/udiv_qrnnd.S b/sysdeps/sparc/sparc32/udiv_qrnnd.S new file mode 100644 index 0000000000..5b67f874c3 --- /dev/null +++ b/sysdeps/sparc/sparc32/udiv_qrnnd.S @@ -0,0 +1,165 @@ +! SPARC __udiv_qrnnd division support, used from longlong.h. + +! Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc. + +! This file is part of the GNU MP Library. + +! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +! Added PIC support - May/96, Miguel de Icaza + +! INPUT PARAMETERS +! rem_ptr i0 +! n1 i1 +! n0 i2 +! d i3 + +#include "sysdep.h" +#undef ret /* Kludge for glibc */ + + .text + .align 8 + + .type two_to_32,@object +two_to_32: + .double 0r4294967296 + .size two_to_32,8 + + .type two_to_31,@object +two_to_31: + .double 0r2147483648 + .size two_to_31,8 + + .align 4 + .global __udiv_qrnnd + .type __udiv_qrnnd,@function +ENTRY(__udiv_qrnnd) + !#PROLOGUE# 0 + save %sp,-104,%sp + !#PROLOGUE# 1 + st %i1,[%fp-8] + ld [%fp-8],%f10 +#ifdef PIC +.Lbase: call 1f + fitod %f10,%f4 +1: ldd [%o7-(.Lbase-two_to_32)],%f8 +#else + sethi %hi(two_to_32),%o7 + fitod %f10,%f4 + ldd [%o7+%lo(two_to_32)],%f8 +#endif + cmp %i1,0 + bge L248 + mov %i0,%i5 + faddd %f4,%f8,%f4 +.L248: + st %i2,[%fp-8] + ld [%fp-8],%f10 + fmuld %f4,%f8,%f6 + cmp %i2,0 + bge L249 + fitod %f10,%f2 + faddd %f2,%f8,%f2 +.L249: + st %i3,[%fp-8] + faddd %f6,%f2,%f2 + ld [%fp-8],%f10 + cmp %i3,0 + bge L250 + fitod %f10,%f4 + faddd %f4,%f8,%f4 +.L250: + fdivd %f2,%f4,%f2 +#ifdef PIC + ldd [%o7-(.Lbase-two_to_31)],%f4 +#else + sethi %hi(two_to_31),%o7 + ldd [%o7+%lo(two_to_31)],%f4 +#endif + fcmped %f2,%f4 + nop + fbge,a L251 + fsubd %f2,%f4,%f2 + fdtoi %f2,%f2 + st %f2,[%fp-8] + b L252 + ld [%fp-8],%i4 +.L251: + fdtoi %f2,%f2 + st %f2,[%fp-8] + ld [%fp-8],%i4 + sethi %hi(-2147483648),%g2 + xor %i4,%g2,%i4 +.L252: + wr %g0,%i4,%y + sra %i3,31,%g2 + and %i4,%g2,%g2 + andcc %g0,0,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,%i3,%g1 + mulscc %g1,0,%g1 + add %g1,%g2,%i0 + rd %y,%g3 + subcc %i2,%g3,%o7 + subxcc %i1,%i0,%g0 + be L253 + cmp %o7,%i3 + + add %i4,-1,%i0 + add %o7,%i3,%o7 + st %o7,[%i5] + ret + restore +.L253: + blu L246 + mov %i4,%i0 + add %i4,1,%i0 + sub %o7,%i3,%o7 +.L246: + st %o7,[%i5] + ret + restore + + .size __udiv_qrnnd, .-__udiv_qrnnd diff --git a/sysdeps/sparc/sparc32/umul.S b/sysdeps/sparc/sparc32/umul.S new file mode 100644 index 0000000000..7a26c295cb --- /dev/null +++ b/sysdeps/sparc/sparc32/umul.S @@ -0,0 +1,153 @@ +/* + * Unsigned multiply. Returns %o0 * %o1 in %o1%o0 (i.e., %o1 holds the + * upper 32 bits of the 64-bit product). + * + * This code optimizes short (less than 13-bit) multiplies. Short + * multiplies require 25 instruction cycles, and long ones require + * 45 instruction cycles. + * + * On return, overflow has occurred (%o1 is not zero) if and only if + * the Z condition code is clear, allowing, e.g., the following: + * + * call .umul + * nop + * bnz overflow (or tnz) + */ + +#include "DEFS.h" +FUNC(.umul) + or %o0, %o1, %o4 + mov %o0, %y ! multiplier -> Y + andncc %o4, 0xfff, %g0 ! test bits 12..31 of *both* args + be Lmul_shortway ! if zero, can do it the short way + andcc %g0, %g0, %o4 ! zero the partial product and clear N and V + + /* + * Long multiply. 32 steps, followed by a final shift step. + */ + mulscc %o4, %o1, %o4 ! 1 + mulscc %o4, %o1, %o4 ! 2 + mulscc %o4, %o1, %o4 ! 3 + mulscc %o4, %o1, %o4 ! 4 + mulscc %o4, %o1, %o4 ! 5 + mulscc %o4, %o1, %o4 ! 6 + mulscc %o4, %o1, %o4 ! 7 + mulscc %o4, %o1, %o4 ! 8 + mulscc %o4, %o1, %o4 ! 9 + mulscc %o4, %o1, %o4 ! 10 + mulscc %o4, %o1, %o4 ! 11 + mulscc %o4, %o1, %o4 ! 12 + mulscc %o4, %o1, %o4 ! 13 + mulscc %o4, %o1, %o4 ! 14 + mulscc %o4, %o1, %o4 ! 15 + mulscc %o4, %o1, %o4 ! 16 + mulscc %o4, %o1, %o4 ! 17 + mulscc %o4, %o1, %o4 ! 18 + mulscc %o4, %o1, %o4 ! 19 + mulscc %o4, %o1, %o4 ! 20 + mulscc %o4, %o1, %o4 ! 21 + mulscc %o4, %o1, %o4 ! 22 + mulscc %o4, %o1, %o4 ! 23 + mulscc %o4, %o1, %o4 ! 24 + mulscc %o4, %o1, %o4 ! 25 + mulscc %o4, %o1, %o4 ! 26 + mulscc %o4, %o1, %o4 ! 27 + mulscc %o4, %o1, %o4 ! 28 + mulscc %o4, %o1, %o4 ! 29 + mulscc %o4, %o1, %o4 ! 30 + mulscc %o4, %o1, %o4 ! 31 + mulscc %o4, %o1, %o4 ! 32 + mulscc %o4, %g0, %o4 ! final shift + + + /* + * Normally, with the shift-and-add approach, if both numbers are + * positive you get the correct result. With 32-bit two's-complement + * numbers, -x is represented as + * + * x 32 + * ( 2 - ------ ) mod 2 * 2 + * 32 + * 2 + * + * (the `mod 2' subtracts 1 from 1.bbbb). To avoid lots of 2^32s, + * we can treat this as if the radix point were just to the left + * of the sign bit (multiply by 2^32), and get + * + * -x = (2 - x) mod 2 + * + * Then, ignoring the `mod 2's for convenience: + * + * x * y = xy + * -x * y = 2y - xy + * x * -y = 2x - xy + * -x * -y = 4 - 2x - 2y + xy + * + * For signed multiplies, we subtract (x << 32) from the partial + * product to fix this problem for negative multipliers (see mul.s). + * Because of the way the shift into the partial product is calculated + * (N xor V), this term is automatically removed for the multiplicand, + * so we don't have to adjust. + * + * But for unsigned multiplies, the high order bit wasn't a sign bit, + * and the correction is wrong. So for unsigned multiplies where the + * high order bit is one, we end up with xy - (y << 32). To fix it + * we add y << 32. + */ +#if 0 + tst %o1 + bl,a 1f ! if %o1 < 0 (high order bit = 1), + add %o4, %o0, %o4 ! %o4 += %o0 (add y to upper half) +1: rd %y, %o0 ! get lower half of product + retl + addcc %o4, %g0, %o1 ! put upper half in place and set Z for %o1==0 +#else + /* Faster code from tege@sics.se. */ + sra %o1, 31, %o2 ! make mask from sign bit + and %o0, %o2, %o2 ! %o2 = 0 or %o0, depending on sign of %o1 + rd %y, %o0 ! get lower half of product + retl + addcc %o4, %o2, %o1 ! add compensation and put upper half in place +#endif + +Lmul_shortway: + /* + * Short multiply. 12 steps, followed by a final shift step. + * The resulting bits are off by 12 and (32-12) = 20 bit positions, + * but there is no problem with %o0 being negative (unlike above), + * and overflow is impossible (the answer is at most 24 bits long). + */ + mulscc %o4, %o1, %o4 ! 1 + mulscc %o4, %o1, %o4 ! 2 + mulscc %o4, %o1, %o4 ! 3 + mulscc %o4, %o1, %o4 ! 4 + mulscc %o4, %o1, %o4 ! 5 + mulscc %o4, %o1, %o4 ! 6 + mulscc %o4, %o1, %o4 ! 7 + mulscc %o4, %o1, %o4 ! 8 + mulscc %o4, %o1, %o4 ! 9 + mulscc %o4, %o1, %o4 ! 10 + mulscc %o4, %o1, %o4 ! 11 + mulscc %o4, %o1, %o4 ! 12 + mulscc %o4, %g0, %o4 ! final shift + + /* + * %o4 has 20 of the bits that should be in the result; %y has + * the bottom 12 (as %y's top 12). That is: + * + * %o4 %y + * +----------------+----------------+ + * | -12- | -20- | -12- | -20- | + * +------(---------+------)---------+ + * -----result----- + * + * The 12 bits of %o4 left of the `result' area are all zero; + * in fact, all top 20 bits of %o4 are zero. + */ + + rd %y, %o5 + sll %o4, 12, %o0 ! shift middle bits left 12 + srl %o5, 20, %o5 ! shift low bits right 20 + or %o5, %o0, %o0 + retl + addcc %g0, %g0, %o1 ! %o1 = zero, and set Z diff --git a/sysdeps/sparc/sparc32/urem.S b/sysdeps/sparc/sparc32/urem.S new file mode 100644 index 0000000000..e72c33dd63 --- /dev/null +++ b/sysdeps/sparc/sparc32/urem.S @@ -0,0 +1,352 @@ + /* This file is generated from divrem.m4; DO NOT EDIT! */ +/* + * Division and remainder, from Appendix E of the Sparc Version 8 + * Architecture Manual, with fixes from Gordon Irlam. + */ + +/* + * Input: dividend and divisor in %o0 and %o1 respectively. + * + * m4 parameters: + * .urem name of function to generate + * rem rem=div => %o0 / %o1; rem=rem => %o0 % %o1 + * false false=true => signed; false=false => unsigned + * + * Algorithm parameters: + * N how many bits per iteration we try to get (4) + * WORDSIZE total number of bits (32) + * + * Derived constants: + * TOPBITS number of bits in the top decade of a number + * + * Important variables: + * Q the partial quotient under development (initially 0) + * R the remainder so far, initially the dividend + * ITER number of main division loop iterations required; + * equal to ceil(log2(quotient) / N). Note that this + * is the log base (2^N) of the quotient. + * V the current comparand, initially divisor*2^(ITER*N-1) + * + * Cost: + * Current estimate for non-large dividend is + * ceil(log2(quotient) / N) * (10 + 7N/2) + C + * A large dividend is one greater than 2^(31-TOPBITS) and takes a + * different path, as the upper bits of the quotient must be developed + * one bit at a time. + */ + + + +#include "sysdep.h" +#ifdef __linux__ +#include +#else +#ifdef __svr4__ +#include +#else +#include +#endif +#endif + +ENTRY(.urem) + + ! Ready to divide. Compute size of quotient; scale comparand. + orcc %o1, %g0, %o5 + bne 1f + mov %o0, %o3 + + ! Divide by zero trap. If it returns, return 0 (about as + ! wrong as possible, but that is what SunOS does...). + ta ST_DIV0 + retl + clr %o0 + +1: + cmp %o3, %o5 ! if %o1 exceeds %o0, done + blu Lgot_result ! (and algorithm fails otherwise) + clr %o2 + sethi %hi(1 << (32 - 4 - 1)), %g1 + cmp %o3, %g1 + blu Lnot_really_big + clr %o4 + + ! Here the dividend is >= 2**(31-N) or so. We must be careful here, + ! as our usual N-at-a-shot divide step will cause overflow and havoc. + ! The number of bits in the result here is N*ITER+SC, where SC <= N. + ! Compute ITER in an unorthodox manner: know we need to shift V into + ! the top decade: so do not even bother to compare to R. + 1: + cmp %o5, %g1 + bgeu 3f + mov 1, %g7 + sll %o5, 4, %o5 + b 1b + add %o4, 1, %o4 + + ! Now compute %g7. + 2: addcc %o5, %o5, %o5 + bcc Lnot_too_big + add %g7, 1, %g7 + + ! We get here if the %o1 overflowed while shifting. + ! This means that %o3 has the high-order bit set. + ! Restore %o5 and subtract from %o3. + sll %g1, 4, %g1 ! high order bit + srl %o5, 1, %o5 ! rest of %o5 + add %o5, %g1, %o5 + b Ldo_single_div + sub %g7, 1, %g7 + + Lnot_too_big: + 3: cmp %o5, %o3 + blu 2b + nop + be Ldo_single_div + nop + /* NB: these are commented out in the V8-Sparc manual as well */ + /* (I do not understand this) */ + ! %o5 > %o3: went too far: back up 1 step + ! srl %o5, 1, %o5 + ! dec %g7 + ! do single-bit divide steps + ! + ! We have to be careful here. We know that %o3 >= %o5, so we can do the + ! first divide step without thinking. BUT, the others are conditional, + ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- + ! order bit set in the first step, just falling into the regular + ! division loop will mess up the first time around. + ! So we unroll slightly... + Ldo_single_div: + subcc %g7, 1, %g7 + bl Lend_regular_divide + nop + sub %o3, %o5, %o3 + mov 1, %o2 + b Lend_single_divloop + nop + Lsingle_divloop: + sll %o2, 1, %o2 + bl 1f + srl %o5, 1, %o5 + ! %o3 >= 0 + sub %o3, %o5, %o3 + b 2f + add %o2, 1, %o2 + 1: ! %o3 < 0 + add %o3, %o5, %o3 + sub %o2, 1, %o2 + 2: + Lend_single_divloop: + subcc %g7, 1, %g7 + bge Lsingle_divloop + tst %o3 + b,a Lend_regular_divide + +Lnot_really_big: +1: + sll %o5, 4, %o5 + cmp %o5, %o3 + bleu 1b + addcc %o4, 1, %o4 + be Lgot_result + sub %o4, 1, %o4 + + tst %o3 ! set up for initial iteration +Ldivloop: + sll %o2, 4, %o2 + ! depth 1, accumulated bits 0 + bl L.1.16 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 2, accumulated bits 1 + bl L.2.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 3, accumulated bits 3 + bl L.3.19 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits 7 + bl L.4.23 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (7*2+1), %o2 + +L.4.23: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (7*2-1), %o2 + + +L.3.19: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits 5 + bl L.4.21 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (5*2+1), %o2 + +L.4.21: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (5*2-1), %o2 + + + +L.2.17: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 3, accumulated bits 1 + bl L.3.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits 3 + bl L.4.19 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (3*2+1), %o2 + +L.4.19: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (3*2-1), %o2 + + +L.3.17: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits 1 + bl L.4.17 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (1*2+1), %o2 + +L.4.17: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (1*2-1), %o2 + + + + +L.1.16: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 2, accumulated bits -1 + bl L.2.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 3, accumulated bits -1 + bl L.3.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits -1 + bl L.4.15 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-1*2+1), %o2 + +L.4.15: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-1*2-1), %o2 + + +L.3.15: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits -3 + bl L.4.13 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-3*2+1), %o2 + +L.4.13: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-3*2-1), %o2 + + + +L.2.15: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 3, accumulated bits -3 + bl L.3.13 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + ! depth 4, accumulated bits -5 + bl L.4.11 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-5*2+1), %o2 + +L.4.11: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-5*2-1), %o2 + + +L.3.13: + ! remainder is negative + addcc %o3,%o5,%o3 + ! depth 4, accumulated bits -7 + bl L.4.9 + srl %o5,1,%o5 + ! remainder is positive + subcc %o3,%o5,%o3 + b 9f + add %o2, (-7*2+1), %o2 + +L.4.9: + ! remainder is negative + addcc %o3,%o5,%o3 + b 9f + add %o2, (-7*2-1), %o2 + + + + + 9: +Lend_regular_divide: + subcc %o4, 1, %o4 + bge Ldivloop + tst %o3 + bl,a Lgot_result + ! non-restoring fixup here (one instruction only!) + add %o3, %o1, %o3 + + +Lgot_result: + + retl + mov %o3, %o0 diff --git a/sysdeps/sparc/sparc64/Implies b/sysdeps/sparc/sparc64/Implies new file mode 100644 index 0000000000..a8cae95f9d --- /dev/null +++ b/sysdeps/sparc/sparc64/Implies @@ -0,0 +1 @@ +wordsize-64 diff --git a/sysdeps/sparc/sparc64/Makefile b/sysdeps/sparc/sparc64/Makefile new file mode 100644 index 0000000000..656274d75c --- /dev/null +++ b/sysdeps/sparc/sparc64/Makefile @@ -0,0 +1,11 @@ +# The Sparc`long double' is a distinct type we support. +#long-double-fcts = yes + +# But the support for ieee quads is so bad we just skip the whole thing. +# XXX This is only a temporary hack. +omit-long-double-fcts = yes + +# But we do need these few functions to even link stdio proggies +ifeq ($(subdir),math) +sysdep_routines += s_isinfl s_isnanl s_finitel s_signbitl +endif diff --git a/sysdeps/sparc/sparc64/add_n.S b/sysdeps/sparc/sparc64/add_n.S new file mode 100644 index 0000000000..68bb008a7d --- /dev/null +++ b/sysdeps/sparc/sparc64/add_n.S @@ -0,0 +1,58 @@ +/* SPARC v9 __mpn_add_n -- Add two limb vectors of the same length > 0 and + store sum in a third limb vector. + + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + + +#include + + +/* INPUT PARAMETERS + res_ptr %o0 + s1_ptr %o1 + s2_ptr %o2 + size %o3 */ + + +ENTRY(__mpn_add_n) + + sub %g0,%o3,%g3 + sllx %o3,3,%g1 + add %o1,%g1,%o1 ! make s1_ptr point at end + add %o2,%g1,%o2 ! make s2_ptr point at end + add %o0,%g1,%o0 ! make res_ptr point at end + mov 0,%o4 ! clear carry variable + sllx %g3,3,%o5 ! compute initial address index + +1: ldx [%o2+%o5],%g1 ! load s2 limb + add %g3,1,%g3 ! increment loop count + ldx [%o1+%o5],%g2 ! load s1 limb + addcc %g1,%o4,%g1 ! add s2 limb and carry variable + movcc %xcc,0,%o4 ! if carry-out, o4 was 1; clear it + addcc %g1,%g2,%g1 ! add s1 limb to sum + stx %g1,[%o0+%o5] ! store result + add %o5,8,%o5 ! increment address index + brnz,pt %g3,1b + movcs %xcc,1,%o4 ! if s1 add gave carry, record it + + retl + mov %o4,%o0 + +END(__mpn_add_n) diff --git a/sysdeps/sparc/sparc64/addmul_1.S b/sysdeps/sparc/sparc64/addmul_1.S new file mode 100644 index 0000000000..260481230f --- /dev/null +++ b/sysdeps/sparc/sparc64/addmul_1.S @@ -0,0 +1,88 @@ +/* SPARC v9 __mpn_addmul_1 -- Multiply a limb vector with a single limb and + add the product to a second limb vector. + + Copyright (C) 1996 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include + + +/* INPUT PARAMETERS + res_ptr o0 + s1_ptr o1 + size o2 + s2_limb o3 */ + + +ENTRY(__mpn_addmul_1) + !#PROLOGUE# 0 + save %sp,-128,%sp + !#PROLOGUE# 1 + + sub %g0,%i2,%o7 + sllx %o7,3,%g5 + sub %i1,%g5,%o3 + sub %i0,%g5,%o4 + mov 0,%o0 ! zero cy_limb + + srl %i3,0,%o1 ! extract low 32 bits of s2_limb + srlx %i3,32,%i3 ! extract high 32 bits of s2_limb + mov 1,%o2 + sllx %o2,32,%o2 ! o2 = 0x100000000 + + ! hi ! + ! mid-1 ! + ! mid-2 ! + ! lo ! +1: + sllx %o7,3,%g1 + ldx [%o3+%g1],%g5 + srl %g5,0,%i0 ! zero hi bits + srlx %g5,32,%g5 + mulx %o1,%i0,%i4 ! lo product + mulx %i3,%i0,%i1 ! mid-1 product + mulx %o1,%g5,%l2 ! mid-2 product + mulx %i3,%g5,%i5 ! hi product + srlx %i4,32,%i0 ! extract high 32 bits of lo product... + add %i1,%i0,%i1 ! ...and add it to the mid-1 product + addcc %i1,%l2,%i1 ! add mid products + mov 0,%l0 ! we need the carry from that add... + movcs %xcc,%o2,%l0 ! ...compute it and... + add %i5,%l0,%i5 ! ...add to bit 32 of the hi product + sllx %i1,32,%i0 ! align low bits of mid product + srl %i4,0,%g5 ! zero high 32 bits of lo product + add %i0,%g5,%i0 ! combine into low 64 bits of result + srlx %i1,32,%i1 ! extract high bits of mid product... + add %i5,%i1,%i1 ! ...and add them to the high result + addcc %i0,%o0,%i0 ! add cy_limb to low 64 bits of result + mov 0,%g5 + movcs %xcc,1,%g5 + add %o7,1,%o7 + ldx [%o4+%g1],%l1 + addcc %l1,%i0,%i0 + movcs %xcc,1,%g5 + stx %i0,[%o4+%g1] + brnz %o7,1b + add %i1,%g5,%o0 ! compute new cy_limb + + mov %o0,%i0 + jmpl %i7+8, %g0 + restore + +END(__mpn_addmul_1) diff --git a/sysdeps/sparc/sparc64/bits/endian.h b/sysdeps/sparc/sparc64/bits/endian.h new file mode 100644 index 0000000000..a2ab07249a --- /dev/null +++ b/sysdeps/sparc/sparc64/bits/endian.h @@ -0,0 +1,8 @@ +/* Sparc is big-endian, but v9 supports endian conversion on loads/stores + and GCC supports such a mode. Be prepared. */ + +#ifdef __LITTLE_ENDIAN__ +#define __BYTE_ORDER __LITTLE_ENDIAN +#else +#define __BYTE_ORDER __BIG_ENDIAN +#endif diff --git a/sysdeps/sparc/sparc64/dl-machine.h b/sysdeps/sparc/sparc64/dl-machine.h new file mode 100644 index 0000000000..eb46ba92be --- /dev/null +++ b/sysdeps/sparc/sparc64/dl-machine.h @@ -0,0 +1,353 @@ +/* Machine-dependent ELF dynamic relocation inline functions. Sparc64 version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#define ELF_MACHINE_NAME "sparc64" + +#include +#include +#include +#include +#include + + +/* Translate a processor-specific dynamic tag to the index into l_info. */ +#define DT_SPARC(x) (DT_SPARC_##x - DT_LOPROC + DT_NUM) + +/* Return nonzero iff E_MACHINE is compatible with the running host. */ +static inline int +elf_machine_matches_host (Elf64_Half e_machine) +{ + return e_machine == EM_SPARC64; +} + +/* Return the link-time address of _DYNAMIC. Conveniently, this is the + first element of the GOT. This must be inlined in a function which + uses global data. */ +static inline Elf64_Addr +elf_machine_dynamic (void) +{ + register Elf64_Addr elf_pic_register __asm__("%l7"); + + return *(Elf64_Addr *)elf_pic_register; +} + + +/* Return the run-time load address of the shared object. */ +static inline Elf64_Addr +elf_machine_load_address (void) +{ + register Elf64_Addr elf_pic_register __asm__("%l7"); + Elf64_Addr pc, la; + + /* Utilize the fact that a local .got entry will be partially + initialized at startup awaiting its RELATIVE fixup. */ + + __asm("sethi %%hi(.Load_address), %1\n" + ".Load_address:\n\t" + "rd %%pc, %0\n\t" + "or %1, %%lo(.Load_address), %1\n\t" + : "=r"(pc), "=r"(la)); + + return pc - *(Elf64_Addr *)(elf_pic_register + la); +} + +#ifdef RESOLVE +/* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +static inline void +elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, + const Elf64_Sym *sym, const struct r_found_version *version, + Elf64_Addr *const reloc_addr) +{ +#ifndef RTLD_BOOTSTRAP + /* This is defined in rtld.c, but nowhere in the static libc.a; make the + reference weak so static programs can still link. This declaration + cannot be done when compiling rtld.c (i.e. #ifdef RTLD_BOOTSTRAP) + because rtld.c contains the common defn for _dl_rtld_map, which is + incompatible with a weak decl in the same file. */ + weak_extern (_dl_rtld_map); +#endif + + if (ELF64_R_TYPE (reloc->r_info) == R_SPARC_RELATIVE) + { +#ifndef RTLD_BOOTSTRAP + if (map != &_dl_rtld_map) /* Already done in rtld itself. */ +#endif + *reloc_addr = map->l_addr + reloc->r_addend; + } + else + { + const Elf64_Sym *const refsym = sym; + Elf64_Addr value; + if (sym->st_shndx != SHN_UNDEF && + ELF64_ST_BIND (sym->st_info) == STB_LOCAL) + value = map->l_addr; + else + { + value = RESOLVE (&sym, version, ELF64_R_TYPE (reloc->r_info)); + if (sym) + value += sym->st_value; + } + value += reloc->r_addend; /* Assume copy relocs have zero addend. */ + + switch (ELF64_R_TYPE (reloc->r_info)) + { + case R_SPARC_COPY: + if (sym->st_size > refsym->st_size + || (_dl_verbose && sym->st_size < refsym->st_size)) + { + extern char **_dl_argv; + const char *strtab; + + strtab = ((void *) map->l_addr + + map->l_info[DT_STRTAB]->d_un.d_ptr); + _dl_sysdep_error (_dl_argv[0] ?: "", + ": Symbol `", strtab + refsym->st_name, + "' has different size in shared object, " + "consider re-linking\n", NULL); + } + memcpy (reloc_addr, (void *) value, MIN (sym->st_size, + refsym->st_size)); + break; + + case R_SPARC_64: + case R_SPARC_GLOB_DAT: + *reloc_addr = value; + break; + case R_SPARC_8: + *(char *) reloc_addr = value; + break; + case R_SPARC_16: + *(short *) reloc_addr = value; + break; + case R_SPARC_DISP8: + *(char *) reloc_addr = (value - (Elf64_Addr) reloc_addr); + break; + case R_SPARC_DISP16: + *(short *) reloc_addr = (value - (Elf64_Addr) reloc_addr); + break; + case R_SPARC_DISP32: + *(unsigned int *)reloc_addr = (value - (Elf64_Addr) reloc_addr); + break; + case R_SPARC_LO10: + *(unsigned *)reloc_addr = (*(unsigned *)reloc_addr & ~0x3ff) + | (value & 0x3ff); + break; + case R_SPARC_WDISP30: + *(unsigned *)reloc_addr = ((*(unsigned *)reloc_addr & 0xc0000000) + | ((value - (Elf64_Addr) reloc_addr) >> 2)); + break; + case R_SPARC_HI22: + *(unsigned *)reloc_addr = (*(unsigned *)reloc_addr & 0xffc00000) + | (value >> 10); + break; + + case R_SPARC_JMP_SLOT: + { + Elf64_Dyn *pltfmt = map->l_info[DT_SPARC(PLTFMT)]; + switch (pltfmt ? pltfmt->d_un.d_val : 0) + { + case 1: /* .got.plt with absolute addresses */ + *reloc_addr = value; + break; + case 2: /* .got.plt with got-relative addresses */ + *reloc_addr = value - (map->l_info[DT_PLTGOT]->d_un.d_ptr + + map->l_addr); + break; + default: + assert (! "unexpected .plt format type"); + } + } + break; + + case R_SPARC_NONE: /* Alright, Wilbur. */ + break; + default: + assert (! "unexpected dynamic reloc type"); + break; + } + } +} + +static inline void +elf_machine_lazy_rel (struct link_map *map, const Elf64_Rela *reloc) +{ + switch (ELF64_R_TYPE (reloc->r_info)) + { + case R_SPARC_NONE: + break; + case R_SPARC_JMP_SLOT: + break; + default: + assert (! "unexpected PLT reloc type"); + break; + } +} + +#endif /* RESOLVE */ + +/* Nonzero iff TYPE should not be allowed to resolve to one of + the main executable's symbols, as for a COPY reloc. */ +#define elf_machine_lookup_noexec_p(type) ((type) == R_SPARC_COPY) + +/* Nonzero iff TYPE describes relocation of a PLT entry, so + PLT entries should not be allowed to define the value. */ +#define elf_machine_lookup_noplt_p(type) ((type) == R_SPARC_JMP_SLOT) + +/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ +#define ELF_MACHINE_RELOC_NOPLT R_SPARC_JMP_SLOT + +/* The SPARC never uses Elf64_Rel relocations. */ +#define ELF_MACHINE_NO_REL 1 + +/* The SPARC overlaps DT_RELA and DT_PLTREL. */ +#define ELF_MACHINE_PLTREL_OVERLAP 1 + +/* Set up the loaded object described by L so its unrelocated PLT + entries will jump to the on-demand fixup code in dl-runtime.c. */ + +static inline int +elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) +{ + Elf64_Addr *got; + extern void _dl_runtime_resolve (void); + + if (l->l_info[DT_JMPREL] && lazy) + { + got = (Elf64_Addr *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr); + got[1] = (Elf64_Addr) l; /* Identify this shared object. */ + /* This function will get called to fix up the GOT entry indicated by + the offset on the stack, and then jump to the resolved address. */ + got[2] = (Elf64_Addr) &_dl_runtime_resolve; + } + + return lazy; +} + +/* This code is used in dl-runtime.c to call the `fixup' function + and then redirect to the address it returns. */ +#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ + .globl _dl_runtime_resolve + .type _dl_runtime_resolve, @function +_dl_runtime_resolve: + save %sp, -160, %sp + mov %g5, %o0 + call fixup + mov %g6, %o1 + jmp %o0 + restore + .size _dl_runtime_resolve, .-_dl_runtime_resolve +"); + +/* The PLT uses Elf64_Rela relocs. */ +#define elf_machine_relplt elf_machine_rela + + +/* Initial entry point code for the dynamic linker. + The C function `_dl_start' is the real entry point; + its return value is the user program's entry point. */ + +#define __S1(x) #x +#define __S(x) __S1(x) + +#define RTLD_START __asm__ ( "\ + .global _start + .type _start, @function +_start: + /* Make room for functions to drop their arguments on the stack. */ + sub %sp, 6*8, %sp + /* Pass pointer to argument block to _dl_start. */ + call _dl_start + add %sp," __S(STACK_BIAS) "+22*8,%o0 + /* FALLTHRU */ + .size _start, .-_start + + .global _dl_start_user + .type _dl_start_user, @function +_dl_start_user: + /* Load the GOT register. */ +1: call 11f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 +11: or %l7,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 + add %l7,%o7,%l7 + /* Save the user entry point address in %l0. */ + mov %o0,%l0 + /* See if we were run as a command with the executable file name as an + extra leading argument. If so, we must shift things around since we + must keep the stack doubleword aligned. */ + sethi %hi(_dl_skip_args), %g2 + or %g2, %lo(_dl_skip_args), %g2 + ldx [%l7+%g2], %i0 + ld [%i0], %i0 + brz,pt %i0, 2f + nop + /* Find out how far to shift. */ + ldx [%sp+" __S(STACK_BIAS) "+22*8], %i1 + sub %i1, %i0, %i1 + sllx %i0, 3, %i2 + stx %i1, [%sp+" __S(STACK_BIAS) "+22*8] + add %sp, " __S(STACK_BIAS) "+23*8, %i1 + add %i1, %i2, %i2 + /* Copy down argv. */ +12: ldx [%i2], %i3 + add %i2, 8, %i2 + stx %i3, [%i1] + brnz,pt %i3, 12b + add %i1, 8, %i1 + /* Copy down envp. */ +13: ldx [%i2], %i3 + add %i2, 8, %i2 + stx %i3, [%i1] + brnz,pt %i3, 13b + add %i1, 8, %i1 + /* Copy down auxiliary table. */ +14: ldx [%i2], %i3 + ldx [%i2+8], %i4 + add %i2, 16, %i2 + stx %i3, [%i1] + stx %i4, [%i1+8] + brnz,pt %i3, 13b + add %i1, 16, %i1 + /* Load _dl_default_scope[2] to pass to _dl_init_next. */ +2: sethi %hi(_dl_default_scope), %g2 + or %g2, %lo(_dl_default_scope), %g2 + ldx [%l7+%g2], %g2 + ldx [%g2+2*8], %l1 + /* Call _dl_init_next to return the address of an initializer to run. */ +3: call _dl_init_next + mov %l1, %o0 + brz,pn %o0, 4f + nop + jmpl %o0, %o7 + nop + ba,a 3b + /* Clear the startup flag. */ +4: sethi %hi(_dl_starting_up), %g2 + or %g2, %lo(_dl_starting_up), %g2 + ldx [%l7+%g2], %g2 + st %g0, [%g2] + /* Pass our finalizer function to the user in %g1. */ + sethi %hi(_dl_fini), %g1 + or %g1, %lo(_dl_fini), %g1 + ldx [%l7+%g1], %g1 + /* Jump to the user's entry point & undo the allocation of the xtra regs. */ + jmp %l0 + add %sp, 6*8, %sp + .size _dl_start_user, .-_dl_start_user"); diff --git a/sysdeps/sparc/sparc64/elf/Dist b/sysdeps/sparc/sparc64/elf/Dist new file mode 100644 index 0000000000..d9338c8fd6 --- /dev/null +++ b/sysdeps/sparc/sparc64/elf/Dist @@ -0,0 +1,4 @@ +crtbegin.S +crtbeginS.S +crtend.S +crtendS.S diff --git a/sysdeps/sparc/sparc64/elf/Makefile b/sysdeps/sparc/sparc64/elf/Makefile new file mode 100644 index 0000000000..1b38355b38 --- /dev/null +++ b/sysdeps/sparc/sparc64/elf/Makefile @@ -0,0 +1,10 @@ +# The assembler on SPARC needs the -fPIC flag even when it's assembler code. +ASFLAGS-.so = -fPIC + +ifeq ($(subdir), csu) +extra-objs += crtbegin.o crtend.o crtbeginS.o crtendS.o +install-lib += crtbegin.o crtend.o crtbeginS.o crtendS.o + +CPPFLAGS-crtbeginS.S = -fPIC -DPIC +CPPFLAGS-crtendS.S = -fPIC -DPIC +endif diff --git a/sysdeps/sparc/sparc64/elf/crtbegin.S b/sysdeps/sparc/sparc64/elf/crtbegin.S new file mode 100644 index 0000000000..318e7a6a3f --- /dev/null +++ b/sysdeps/sparc/sparc64/elf/crtbegin.S @@ -0,0 +1,69 @@ +/* Destructor cleanup code for elf64-sparc + Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +.section ".ctors",#alloc,#write + + .align 8 +__CTOR_LIST__: + .xword -1 + +.section ".dtors",#alloc,#write + + .align 8 +__DTOR_LIST__: + .xword -1 + +.section ".fini",#alloc,#execinstr + + call __do_global_dtors_aux + nop + +.text + + .align 4 + .type __do_global_dtors_aux,#function +__do_global_dtors_aux: + save %sp,-160,%sp + +#ifdef PIC +1: call 11f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 +11: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + add %l7, %o7, %l7 + sethi %hi(__DTOR_LIST__), %l0 + or %l0, %lo(__DTOR_LIST__), %l0 + ldx [%l7+%l0], %l0 +#else + sethi %hi(__DTOR_LIST__), %l0 + or %l0, %lo(__DTOR_LIST__), %l0 + add %l0, %g4, %l0 +#endif + + ba 3f + ldx [%l0+8], %l1 +2: jmpl %l1, %o7 + ldx [%l0+8], %l1 +3: brnz,pt %l1, 2b + add %l0, 8, %l0 + + ret + restore + + .size __do_global_dtors_aux,.-__do_global_dtors_aux diff --git a/sysdeps/sparc/sparc64/elf/crtbeginS.S b/sysdeps/sparc/sparc64/elf/crtbeginS.S new file mode 100644 index 0000000000..7db4bc590e --- /dev/null +++ b/sysdeps/sparc/sparc64/elf/crtbeginS.S @@ -0,0 +1 @@ +#include "crtbegin.S" diff --git a/sysdeps/sparc/sparc64/elf/crtend.S b/sysdeps/sparc/sparc64/elf/crtend.S new file mode 100644 index 0000000000..7a5c067b07 --- /dev/null +++ b/sysdeps/sparc/sparc64/elf/crtend.S @@ -0,0 +1,70 @@ +/* Constructor startup code for elf64-sparc + Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +.section ".ctors",#alloc,#write + + .align 8 +__CTOR_END__: + .xword 0 + +.section ".dtors",#alloc,#write + + .align 8 +__DTOR_END__: + .xword 0 + +.section ".init",#alloc,#execinstr + + call __do_global_ctors_aux + nop + +.text + + .align 4 + .type __do_global_ctors_aux,#function +__do_global_ctors_aux: + save %sp,-160,%sp + +#ifdef PIC +1: call 11f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 +11: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + add %l7, %o7, %l7 + sethi %hi(__CTOR_END__), %l0 + or %l0, %lo(__CTOR_END__), %l0 + ldx [%l7+%l0], %l0 +#else + sethi %hi(__CTOR_END__), %l0 + or %l0, %lo(__CTOR_END__), %l0 + add %l0, %g4, %l0 +#endif + + ba 3f + ldx [%l0+8], %l1 +2: jmpl %l1, %o7 + ldx [%l0+8], %l1 +3: addcc %l1, 1, %g0 + bnz,pt %xcc, 2b + add %l0, 8, %l0 + + ret + restore + + .size __do_global_ctors_aux,.-__do_global_ctors_aux diff --git a/sysdeps/sparc/sparc64/elf/crtendS.S b/sysdeps/sparc/sparc64/elf/crtendS.S new file mode 100644 index 0000000000..56532f567d --- /dev/null +++ b/sysdeps/sparc/sparc64/elf/crtendS.S @@ -0,0 +1 @@ +#include "crtend.S" diff --git a/sysdeps/sparc/sparc64/elf/start.S b/sysdeps/sparc/sparc64/elf/start.S new file mode 100644 index 0000000000..73f42367ee --- /dev/null +++ b/sysdeps/sparc/sparc64/elf/start.S @@ -0,0 +1,93 @@ +/* Startup code for elf64-sparc + Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + + + .section ".text" + .align 4 + .global _start + .type _start,#function +_start: + + /* First order of business is to load %g4 with our base address. */ + sethi %uhi(_start), %g4 + or %g4, %ulo(_start), %g4 + sllx %g4, 32, %g4 + + /* Terminate the stack frame, and reserve space for functions to + drop their arguments. */ + mov %g0, %fp + sub %sp, 6*8, %sp + + /* Save %g1. When starting a binary via the dynamic linker, %g1 + contains the address of the shared library termination function, + which we will register below with atexit() to be called by exit(). + If we are statically linked, this will be NULL. */ + + /* Do essential libc initialization (sp points to argc, argv, and envp) */ + call __libc_init_first + mov %g1, %l0 + + /* Now that we have the proper stack frame, register library termination + function, if there is any: */ + + brz,pn %l0, 1f + nop + call atexit + mov %l0, %o0 +1: + + /* Extract the arguments and environment as encoded on the stack. The + argument info starts after one register window (16 words) past the SP, + plus the bias we added, plus the magic v9 STACK_BIAS. */ + ldx [%sp+STACK_BIAS+22*8], %o0 + add %sp, STACK_BIAS+23*8, %o1 + sllx %o0, 3, %o2 + add %o2, %o1, %o2 + sethi %hi(__environ), %g2 + add %o2, 8, %o2 + add %g2, %g4, %g2 + stx %o2, [%g2+%lo(__environ)] + + mov %o0, %l0 /* tuck them away */ + mov %o1, %l1 + + /* Call _init, the entry point to our own .init section. */ + call _init + mov %o2, %l2 + + /* Register our .fini section with atexit. */ + sethi %hi(_fini), %o0 + add %o0, %g4, %o0 + call atexit + add %o0, %lo(_fini), %o0 + + /* Call the user's main and exit with its return value. */ + mov %l0, %o0 + mov %l1, %o1 + call main + mov %l2, %o2 + call exit + nop + + /* Die very horribly if exit returns. */ + illtrap 0 + + .size _start,.-_start diff --git a/sysdeps/sparc/sparc64/fpu/bits/fenv.h b/sysdeps/sparc/sparc64/fpu/bits/fenv.h new file mode 100644 index 0000000000..802c58bdce --- /dev/null +++ b/sysdeps/sparc/sparc64/fpu/bits/fenv.h @@ -0,0 +1,76 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _FENV_H +#error "Never use directly; include instead." +#endif + + +/* Define bits representing the exception. We use the bit positions + of the appropriate accrued exception bits from the FSR. */ +enum + { + FE_INVALID = (1 << 9), +#define FE_INVALID FE_INVALID + FE_OVERFLOW = (1 << 8), +#define FE_OVERFLOW FE_OVERFLOW + FE_UNDERFLOW = (1 << 7), +#define FE_UNDERFLOW FE_UNDERFLOW + FE_DIVBYZERO = (1 << 6), +#define FE_DIVBYZERO FE_DIVBYZERO + FE_INEXACT = (1 << 5) +#define FE_INEXACT FE_INEXACT + }; + +#define FE_ALL_EXCEPT \ + (FE_INEXACT | FE_DIVBYZERO | FE_UNDERFLOW | FE_OVERFLOW | FE_INVALID) + +/* The Sparc FPU supports all of the four defined rounding modes. We + use again the bit positions in the FPU control word as the values + for the appropriate macros. */ +enum + { + FE_TONEAREST = (0U << 30), +#define FE_TONEAREST FE_TONEAREST + FE_TOWARDSZERO = (1U << 30), +#define FE_TOWARDSZERO FE_TOWARDSZERO + FE_UPWARD = (2U << 30), +#define FE_UPWARD FE_UPWARD + FE_DOWNWARD = (3U << 30) +#define FE_DOWNWARD FE_DOWNWARD + }; + +#define __FE_ROUND_MASK (3U << 30) + +/* Type representing exception flags. */ +typedef unsigned long fexcept_t; + +/* Type representing floating-point environment. */ +typedef unsigned long fenv_t; + +/* If the default argument is used we use this value. */ +#define FE_DFL_ENV ((fenv_t *) -1) + +#ifdef __USE_GNU +/* Floating-point environment where none of the exception is masked. */ +# define FE_NOMASK_ENV ((fenv_t *) -2) +#endif + +/* For internal use only: access the fp state register. */ +#define __fenv_stfsr(X) __asm__("stx %%fsr,%0" : "=m"(X)) +#define __fenv_ldfsr(X) __asm__ __volatile__("ldx %0,%%fsr" : : "m"(X)) diff --git a/sysdeps/sparc/sparc64/fpu/fpu_control.h b/sysdeps/sparc/sparc64/fpu/fpu_control.h new file mode 100644 index 0000000000..fd8abb19f1 --- /dev/null +++ b/sysdeps/sparc/sparc64/fpu/fpu_control.h @@ -0,0 +1,69 @@ +/* FPU control word bits. SPARC v9 version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _FPU_CONTROL_H +#define _FPU_CONTROL_H 1 + + +#include + +/* precision control */ +#define _FPU_EXTENDED 0x00000000 /* RECOMMENDED */ +#define _FPU_DOUBLE 0x20000000 +#define _FPU_80BIT 0x30000000 +#define _FPU_SINGLE 0x10000000 /* DO NOT USE */ + +/* rounding control / Sparc */ +#define _FPU_RC_DOWN 0xc0000000 +#define _FPU_RC_UP 0x80000000 +#define _FPU_RC_ZERO 0x40000000 +#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */ + +#define _FPU_RESERVED 0x30300000 /* Reserved bits in cw */ + + +/* Now two recommended cw */ + +/* Linux default: + - extended precision + - rounding to nearest + - no exceptions */ +#define _FPU_DEFAULT 0x0 + +/* IEEE: same as above */ +#define _FPU_IEEE 0x0 + +/* Type of the control word. */ +typedef unsigned long fpu_control_t; + +#define _FPU_GETCW(cw) __asm__ ("stx %%fsr,%0" : "=m" (*&cw)) +#define _FPU_SETCW(cw) __asm__ ("ldx %0,%%fsr" : : "m" (*&cw)) + +/* Default control word set at startup. */ +extern fpu_control_t __fpu_control; + +__BEGIN_DECLS + +/* Called at startup. It can be used to manipulate fpu control register. */ +extern void __setfpucw __P ((fpu_control_t)); + +__END_DECLS + +#endif /* fpu_control.h */ diff --git a/sysdeps/sparc/sparc64/gmp-mparam.h b/sysdeps/sparc/sparc64/gmp-mparam.h new file mode 100644 index 0000000000..a3c66974de --- /dev/null +++ b/sysdeps/sparc/sparc64/gmp-mparam.h @@ -0,0 +1,27 @@ +/* gmp-mparam.h -- Compiler/machine parameter header file. + +Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +MA 02111-1307, USA. */ + +#define BITS_PER_MP_LIMB 64 +#define BYTES_PER_MP_LIMB 8 +#define BITS_PER_LONGINT 64 +#define BITS_PER_INT 32 +#define BITS_PER_SHORTINT 16 +#define BITS_PER_CHAR 8 diff --git a/sysdeps/sparc/sparc64/lshift.S b/sysdeps/sparc/sparc64/lshift.S new file mode 100644 index 0000000000..1678991529 --- /dev/null +++ b/sysdeps/sparc/sparc64/lshift.S @@ -0,0 +1,96 @@ +/* SPARC v9 __mpn_lshift -- + + Copyright (C) 1996 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include + +/* INPUT PARAMETERS + res_ptr %i0 + src_ptr %i1 + size %i2 + cnt %i3 */ + +ENTRY(__mpn_lshift) + save %sp, -128, %sp + + sllx %i2,3,%g1 + add %i1,%g1,%i1 ! make %i1 point at end of src + ldx [%i1-8],%g2 ! load first limb + sub %g0,%i3,%i5 ! negate shift count + add %i0,%g1,%i0 ! make %i0 point at end of res + add %i2,-1,%i2 + and %i2,4-1,%l4 ! number of limbs in first loop + srlx %g2,%i5,%g1 ! compute function result + brz,pn %l4,.L0 ! if multiple of 4 limbs, skip first loop + mov %g1,%l1 + + sub %i2,%l4,%i2 ! adjust count for main loop + +.Loop0: ldx [%i1-16],%g3 + add %i0,-8,%i0 + add %i1,-8,%i1 + add %l4,-1,%l4 + sllx %g2,%i3,%i4 + srlx %g3,%i5,%g1 + mov %g3,%g2 + or %i4,%g1,%i4 + brnz,pt %l4,.Loop0 + stx %i4,[%i0+0] + +.L0: brz,pn %i2,.Lend + nop + +.Loop: ldx [%i1-16],%g3 + add %i0,-32,%i0 + add %i2,-4,%i2 + sllx %g2,%i3,%i4 + srlx %g3,%i5,%g1 + + ldx [%i1-24],%g2 + sllx %g3,%i3,%l4 + or %i4,%g1,%i4 + stx %i4,[%i0+24] + srlx %g2,%i5,%g1 + + ldx [%i1-32],%g3 + sllx %g2,%i3,%i4 + or %l4,%g1,%l4 + stx %l4,[%i0+16] + srlx %g3,%i5,%g1 + + ldx [%i1-40],%g2 + sllx %g3,%i3,%l4 + or %i4,%g1,%i4 + stx %i4,[%i0+8] + srlx %g2,%i5,%g1 + + add %i1,-32,%i1 + or %l4,%g1,%l4 + brnz,pt %i2,.Loop + stx %l4,[%i0+0] + +.Lend: sllx %g2,%i3,%g2 + stx %g2,[%i0-8] + + mov %l1,%i0 + jmpl %i7+8, %g0 + restore + +END(__mpn_lshift) diff --git a/sysdeps/sparc/sparc64/mul_1.S b/sysdeps/sparc/sparc64/mul_1.S new file mode 100644 index 0000000000..87e441d7eb --- /dev/null +++ b/sysdeps/sparc/sparc64/mul_1.S @@ -0,0 +1,84 @@ +/* SPARC v9 __mpn_mul_1 -- Multiply a limb vector with a single limb and + store the product in a second limb vector. + + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include + + +/* INPUT PARAMETERS + res_ptr o0 + s1_ptr o1 + size o2 + s2_limb o3 */ + +ENTRY(__mpn_mul_1) + !#PROLOGUE# 0 + save %sp,-128,%sp + !#PROLOGUE# 1 + + sub %g0,%i2,%o7 + sllx %o7,3,%g5 + sub %i1,%g5,%o3 + sub %i0,%g5,%o4 + mov 0,%o0 ! zero cy_limb + + srl %i3,0,%o1 ! extract low 32 bits of s2_limb + srlx %i3,32,%i3 ! extract high 32 bits of s2_limb + mov 1,%o2 + sllx %o2,32,%o2 ! o2 = 0x100000000 + + ! hi ! + ! mid-1 ! + ! mid-2 ! + ! lo ! +.Loop: + sllx %o7,3,%g1 + ldx [%o3+%g1],%g5 + srl %g5,0,%i0 ! zero hi bits + srlx %g5,32,%g5 + mulx %o1,%i0,%i4 ! lo product + mulx %i3,%i0,%i1 ! mid-1 product + mulx %o1,%g5,%l2 ! mid-2 product + mulx %i3,%g5,%i5 ! hi product + srlx %i4,32,%i0 ! extract high 32 bits of lo product... + add %i1,%i0,%i1 ! ...and add it to the mid-1 product + addcc %i1,%l2,%i1 ! add mid products + mov 0,%l0 ! we need the carry from that add... + movcs %xcc,%o2,%l0 ! ...compute it and... + add %i5,%l0,%i5 ! ...add to bit 32 of the hi product + sllx %i1,32,%i0 ! align low bits of mid product + srl %i4,0,%g5 ! zero high 32 bits of lo product + add %i0,%g5,%i0 ! combine into low 64 bits of result + srlx %i1,32,%i1 ! extract high bits of mid product... + add %i5,%i1,%i1 ! ...and add them to the high result + addcc %i0,%o0,%i0 ! add cy_limb to low 64 bits of result + mov 0,%g5 + movcs %xcc,1,%g5 + add %o7,1,%o7 + stx %i0,[%o4+%g1] + brnz %o7,.Loop + add %i1,%g5,%o0 ! compute new cy_limb + + mov %o0,%i0 + jmpl %i7+8,%g0 + restore + +END(__mpn_mul_1) diff --git a/sysdeps/sparc/sparc64/rshift.S b/sysdeps/sparc/sparc64/rshift.S new file mode 100644 index 0000000000..e1b3aca112 --- /dev/null +++ b/sysdeps/sparc/sparc64/rshift.S @@ -0,0 +1,93 @@ +/* SPARC v9 __mpn_rshift -- + + Copyright (C) 1996 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include + +/* INPUT PARAMETERS + res_ptr %i0 + src_ptr %i1 + size %i2 + cnt %i3 */ + +ENTRY(__mpn_rshift) + save %sp, -128, %sp + + ldx [%i1],%g2 ! load first limb + sub %g0,%i3,%i5 ! negate shift count + add %i2,-1,%i2 + and %i2,4-1,%l4 ! number of limbs in first loop + sllx %g2,%i5,%g1 ! compute function result + brz,pn %l4,.L0 ! if multiple of 4 limbs, skip first loop + mov %g1,%l1 + + sub %i2,%l4,%i2 ! adjust count for main loop + +.Loop0: ldx [%i1+8],%g3 + add %i0,8,%i0 + add %i1,8,%i1 + add %l4,-1,%l4 + srlx %g2,%i3,%i4 + sllx %g3,%i5,%g1 + mov %g3,%g2 + or %i4,%g1,%i4 + brnz,pt %l4,.Loop0 + stx %i4,[%i0-8] + +.L0: brz,pn %i2,.Lend + nop + +.Loop: ldx [%i1+8],%g3 + add %i0,32,%i0 + add %i2,-4,%i2 + srlx %g2,%i3,%i4 + sllx %g3,%i5,%g1 + + ldx [%i1+16],%g2 + srlx %g3,%i3,%l4 + or %i4,%g1,%i4 + stx %i4,[%i0-32] + sllx %g2,%i5,%g1 + + ldx [%i1+24],%g3 + srlx %g2,%i3,%i4 + or %l4,%g1,%l4 + stx %l4,[%i0-24] + sllx %g3,%i5,%g1 + + ldx [%i1+32],%g2 + srlx %g3,%i3,%l4 + or %i4,%g1,%i4 + stx %i4,[%i0-16] + sllx %g2,%i5,%g1 + + add %i1,32,%i1 + or %l4,%g1,%l4 + brnz %i2,.Loop + stx %l4,[%i0-8] + +.Lend: srlx %g2,%i3,%g2 + stx %g2,[%i0-0] + + mov %l1,%i0 + jmpl %i7+8,%g0 + restore + +END(__mpn_rshift) diff --git a/sysdeps/sparc/sparc64/sub_n.S b/sysdeps/sparc/sparc64/sub_n.S new file mode 100644 index 0000000000..93f8a8235d --- /dev/null +++ b/sysdeps/sparc/sparc64/sub_n.S @@ -0,0 +1,55 @@ +/* SPARC v9 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 + and store difference in a third limb vector. + + Copyright (C) 1995, 1996 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include + +/* INPUT PARAMETERS + res_ptr %o0 + s1_ptr %o1 + s2_ptr %o2 + size %o3 */ + +ENTRY(__mpn_sub_n) + + sub %g0,%o3,%g3 + sllx %o3,3,%g1 + add %o1,%g1,%o1 ! make s1_ptr point at end + add %o2,%g1,%o2 ! make s2_ptr point at end + add %o0,%g1,%o0 ! make res_ptr point at end + mov 0,%o4 ! clear carry variable + sllx %g3,3,%o5 ! compute initial address index + +1: ldx [%o2+%o5],%g1 ! load s2 limb + add %g3,1,%g3 ! increment loop count + ldx [%o1+%o5],%g2 ! load s1 limb + addcc %g1,%o4,%g1 ! add s2 limb and carry variable + movcc %xcc,0,%o4 ! if carry-out, o4 was 1; clear it + subcc %g1,%g2,%g1 ! subtract s1 limb from sum + stx %g1,[%o0+%o5] ! store result + add %o5,8,%o5 ! increment address index + brnz,pt %g3,1b + movcs %xcc,1,%o4 ! if s1 subtract gave carry, record it + + retl + mov %o4,%o0 + +END(__mpn_sub_n) diff --git a/sysdeps/sparc/sparc64/submul_1.S b/sysdeps/sparc/sparc64/submul_1.S new file mode 100644 index 0000000000..3cc0e3bb08 --- /dev/null +++ b/sysdeps/sparc/sparc64/submul_1.S @@ -0,0 +1,87 @@ +/* SPARC v9 __mpn_submul_1 -- Multiply a limb vector with a single limb and + subtract the product from a second limb vector. + + Copyright (C) 1996 Free Software Foundation, Inc. + + This file is part of the GNU MP Library. + + The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + MA 02111-1307, USA. */ + +#include + + +/* INPUT PARAMETERS + res_ptr o0 + s1_ptr o1 + size o2 + s2_limb o3 */ + +ENTRY(__mpn_submul_1) + !#PROLOGUE# 0 + save %sp,-128,%sp + !#PROLOGUE# 1 + + sub %g0,%i2,%o7 + sllx %o7,3,%g5 + sub %i1,%g5,%o3 + sub %i0,%g5,%o4 + mov 0,%o0 ! zero cy_limb + + srl %i3,0,%o1 ! extract low 32 bits of s2_limb + srlx %i3,32,%i3 ! extract high 32 bits of s2_limb + mov 1,%o2 + sllx %o2,32,%o2 ! o2 = 0x100000000 + + ! hi ! + ! mid-1 ! + ! mid-2 ! + ! lo ! +.Loop: + sllx %o7,3,%g1 + ldx [%o3+%g1],%g5 + srl %g5,0,%i0 ! zero hi bits + srlx %g5,32,%g5 + mulx %o1,%i0,%i4 ! lo product + mulx %i3,%i0,%i1 ! mid-1 product + mulx %o1,%g5,%l2 ! mid-2 product + mulx %i3,%g5,%i5 ! hi product + srlx %i4,32,%i0 ! extract high 32 bits of lo product... + add %i1,%i0,%i1 ! ...and add it to the mid-1 product + addcc %i1,%l2,%i1 ! add mid products + mov 0,%l0 ! we need the carry from that add... + movcs %xcc,%o2,%l0 ! ...compute it and... + add %i5,%l0,%i5 ! ...add to bit 32 of the hi product + sllx %i1,32,%i0 ! align low bits of mid product + srl %i4,0,%g5 ! zero high 32 bits of lo product + add %i0,%g5,%i0 ! combine into low 64 bits of result + srlx %i1,32,%i1 ! extract high bits of mid product... + add %i5,%i1,%i1 ! ...and add them to the high result + addcc %i0,%o0,%i0 ! add cy_limb to low 64 bits of result + mov 0,%g5 + movcs %xcc,1,%g5 + add %o7,1,%o7 + ldx [%o4+%g1],%l1 + subcc %l1,%i0,%i0 + movcs %xcc,1,%g5 + stx %i0,[%o4+%g1] + brnz %o7,.Loop + add %i1,%g5,%o0 ! compute new cy_limb + + mov %o0,%i0 + jmpl %i7+8,%g0 + restore + +END(__mpn_submul_1) diff --git a/sysdeps/sparc/sparc8/addmul_1.S b/sysdeps/sparc/sparc8/addmul_1.S deleted file mode 100644 index fb9ea7cf0e..0000000000 --- a/sysdeps/sparc/sparc8/addmul_1.S +++ /dev/null @@ -1,124 +0,0 @@ -! SPARC v8 __mpn_addmul_1 -- Multiply a limb vector with a limb and -! add the result to a second limb vector. - -! Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr o0 -! s1_ptr o1 -! size o2 -! s2_limb o3 - -#include "sysdep.h" - -.text - .align 4 - .global C_SYMBOL_NAME(__mpn_addmul_1) -C_SYMBOL_NAME(__mpn_addmul_1): - orcc %g0,%g0,%g2 - ld [%o1+0],%o4 ! 1 - - sll %o2,4,%g1 - and %g1,(4-1)<<4,%g1 -#if PIC - mov %o7,%g4 ! Save return address register - call 1f - add %o7,LL-1f,%g3 -1: mov %g4,%o7 ! Restore return address register -#else - sethi %hi(LL),%g3 - or %g3,%lo(LL),%g3 -#endif - jmp %g3+%g1 - nop -LL: -LL00: add %o0,-4,%o0 - b Loop00 /* 4, 8, 12, ... */ - add %o1,-4,%o1 - nop -LL01: b Loop01 /* 1, 5, 9, ... */ - nop - nop - nop -LL10: add %o0,-12,%o0 /* 2, 6, 10, ... */ - b Loop10 - add %o1,4,%o1 - nop -LL11: add %o0,-8,%o0 /* 3, 7, 11, ... */ - b Loop11 - add %o1,-8,%o1 - nop - -1: addcc %g3,%g2,%g3 ! 1 - ld [%o1+4],%o4 ! 2 - rd %y,%g2 ! 1 - addx %g0,%g2,%g2 - ld [%o0+0],%g1 ! 2 - addcc %g1,%g3,%g3 - st %g3,[%o0+0] ! 1 -Loop00: umul %o4,%o3,%g3 ! 2 - ld [%o0+4],%g1 ! 2 - addxcc %g3,%g2,%g3 ! 2 - ld [%o1+8],%o4 ! 3 - rd %y,%g2 ! 2 - addx %g0,%g2,%g2 - nop - addcc %g1,%g3,%g3 - st %g3,[%o0+4] ! 2 -Loop11: umul %o4,%o3,%g3 ! 3 - addxcc %g3,%g2,%g3 ! 3 - ld [%o1+12],%o4 ! 4 - rd %y,%g2 ! 3 - add %o1,16,%o1 - addx %g0,%g2,%g2 - ld [%o0+8],%g1 ! 2 - addcc %g1,%g3,%g3 - st %g3,[%o0+8] ! 3 -Loop10: umul %o4,%o3,%g3 ! 4 - addxcc %g3,%g2,%g3 ! 4 - ld [%o1+0],%o4 ! 1 - rd %y,%g2 ! 4 - addx %g0,%g2,%g2 - ld [%o0+12],%g1 ! 2 - addcc %g1,%g3,%g3 - st %g3,[%o0+12] ! 4 - add %o0,16,%o0 - addx %g0,%g2,%g2 -Loop01: addcc %o2,-4,%o2 - bg 1b - umul %o4,%o3,%g3 ! 1 - - addcc %g3,%g2,%g3 ! 4 - rd %y,%g2 ! 4 - addx %g0,%g2,%g2 - ld [%o0+0],%g1 ! 2 - addcc %g1,%g3,%g3 - st %g3,[%o0+0] ! 4 - addx %g0,%g2,%o0 - - retl - nop - - -! umul, ld, addxcc, rd, st - -! umul, ld, addxcc, rd, ld, addcc, st, addx - diff --git a/sysdeps/sparc/sparc8/mul_1.S b/sysdeps/sparc/sparc8/mul_1.S deleted file mode 100644 index b641feb453..0000000000 --- a/sysdeps/sparc/sparc8/mul_1.S +++ /dev/null @@ -1,99 +0,0 @@ -! SPARC v8 __mpn_mul_1 -- Multiply a limb vector with a single limb and -! store the product in a second limb vector. - -! Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr o0 -! s1_ptr o1 -! size o2 -! s2_limb o3 - -#include "sysdep.h" - -.text - .align 8 - .global C_SYMBOL_NAME(__mpn_mul_1) -C_SYMBOL_NAME(__mpn_mul_1): - sll %o2,4,%g1 - and %g1,(4-1)<<4,%g1 -#if PIC - mov %o7,%g4 ! Save return address register - call 1f - add %o7,LL-1f,%g3 -1: mov %g4,%o7 ! Restore return address register -#else - sethi %hi(LL),%g3 - or %g3,%lo(LL),%g3 -#endif - jmp %g3+%g1 - ld [%o1+0],%o4 ! 1 -LL: -LL00: add %o0,-4,%o0 - add %o1,-4,%o1 - b Loop00 /* 4, 8, 12, ... */ - orcc %g0,%g0,%g2 -LL01: b Loop01 /* 1, 5, 9, ... */ - orcc %g0,%g0,%g2 - nop - nop -LL10: add %o0,-12,%o0 /* 2, 6, 10, ... */ - add %o1,4,%o1 - b Loop10 - orcc %g0,%g0,%g2 - nop -LL11: add %o0,-8,%o0 /* 3, 7, 11, ... */ - add %o1,-8,%o1 - b Loop11 - orcc %g0,%g0,%g2 - -Loop: addcc %g3,%g2,%g3 ! 1 - ld [%o1+4],%o4 ! 2 - st %g3,[%o0+0] ! 1 - rd %y,%g2 ! 1 -Loop00: umul %o4,%o3,%g3 ! 2 - addxcc %g3,%g2,%g3 ! 2 - ld [%o1+8],%o4 ! 3 - st %g3,[%o0+4] ! 2 - rd %y,%g2 ! 2 -Loop11: umul %o4,%o3,%g3 ! 3 - addxcc %g3,%g2,%g3 ! 3 - ld [%o1+12],%o4 ! 4 - add %o1,16,%o1 - st %g3,[%o0+8] ! 3 - rd %y,%g2 ! 3 -Loop10: umul %o4,%o3,%g3 ! 4 - addxcc %g3,%g2,%g3 ! 4 - ld [%o1+0],%o4 ! 1 - st %g3,[%o0+12] ! 4 - add %o0,16,%o0 - rd %y,%g2 ! 4 - addx %g0,%g2,%g2 -Loop01: addcc %o2,-4,%o2 - bg Loop - umul %o4,%o3,%g3 ! 1 - - addcc %g3,%g2,%g3 ! 4 - st %g3,[%o0+0] ! 4 - rd %y,%g2 ! 4 - - retl - addx %g0,%g2,%o0 diff --git a/sysdeps/sparc/sparc8/submul_1.S b/sysdeps/sparc/sparc8/submul_1.S deleted file mode 100644 index e40119d011..0000000000 --- a/sysdeps/sparc/sparc8/submul_1.S +++ /dev/null @@ -1,58 +0,0 @@ -! SPARC v8 __mpn_submul_1 -- Multiply a limb vector with a limb and -! subtract the result from a second limb vector. - -! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr o0 -! s1_ptr o1 -! size o2 -! s2_limb o3 - -#include "sysdep.h" - -.text - .align 4 - .global C_SYMBOL_NAME(__mpn_submul_1) -C_SYMBOL_NAME(__mpn_submul_1): - sub %g0,%o2,%o2 ! negate ... - sll %o2,2,%o2 ! ... and scale size - sub %o1,%o2,%o1 ! o1 is offset s1_ptr - sub %o0,%o2,%g1 ! g1 is offset res_ptr - - mov 0,%o0 ! clear cy_limb - -Loop: ld [%o1+%o2],%o4 - ld [%g1+%o2],%g2 - umul %o4,%o3,%o5 - rd %y,%g3 - addcc %o5,%o0,%o5 - addx %g3,0,%o0 - subcc %g2,%o5,%g2 - addx %o0,0,%o0 - st %g2,[%g1+%o2] - - addcc %o2,4,%o2 - bne Loop - nop - - retl - nop diff --git a/sysdeps/sparc/sparc8/udiv_qrnnd.S b/sysdeps/sparc/sparc8/udiv_qrnnd.S deleted file mode 100644 index 49c2398806..0000000000 --- a/sysdeps/sparc/sparc8/udiv_qrnnd.S +++ /dev/null @@ -1,186 +0,0 @@ -! SPARC __udiv_qrnnd division support, used from longlong.h. - -! Copyright (C) 1993, 1994 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -! INPUT PARAMETERS -! rem_ptr o0 -! n1 o1 -! n0 o2 -! d o3 - -#include "sysdep.h" - - .text - .align 4 - .global C_SYMBOL_NAME(__udiv_qrnnd) -C_SYMBOL_NAME(__udiv_qrnnd): - tst %o3 - bneg Largedivisor - mov 8,%g1 - - b Lp1 - addxcc %o2,%o2,%o2 - -Lplop: bcc Ln1 - addxcc %o2,%o2,%o2 -Lp1: addx %o1,%o1,%o1 - subcc %o1,%o3,%o4 - bcc Ln2 - addxcc %o2,%o2,%o2 -Lp2: addx %o1,%o1,%o1 - subcc %o1,%o3,%o4 - bcc Ln3 - addxcc %o2,%o2,%o2 -Lp3: addx %o1,%o1,%o1 - subcc %o1,%o3,%o4 - bcc Ln4 - addxcc %o2,%o2,%o2 -Lp4: addx %o1,%o1,%o1 - addcc %g1,-1,%g1 - bne Lplop - subcc %o1,%o3,%o4 - bcc Ln5 - addxcc %o2,%o2,%o2 -Lp5: st %o1,[%o0] - retl - xnor %g0,%o2,%o0 - -Lnlop: bcc Lp1 - addxcc %o2,%o2,%o2 -Ln1: addx %o4,%o4,%o4 - subcc %o4,%o3,%o1 - bcc Lp2 - addxcc %o2,%o2,%o2 -Ln2: addx %o4,%o4,%o4 - subcc %o4,%o3,%o1 - bcc Lp3 - addxcc %o2,%o2,%o2 -Ln3: addx %o4,%o4,%o4 - subcc %o4,%o3,%o1 - bcc Lp4 - addxcc %o2,%o2,%o2 -Ln4: addx %o4,%o4,%o4 - addcc %g1,-1,%g1 - bne Lnlop - subcc %o4,%o3,%o1 - bcc Lp5 - addxcc %o2,%o2,%o2 -Ln5: st %o4,[%o0] - retl - xnor %g0,%o2,%o0 - -Largedivisor: - and %o2,1,%o5 ! %o5 = n0 & 1 - - srl %o2,1,%o2 - sll %o1,31,%g2 - or %g2,%o2,%o2 ! %o2 = lo(n1n0 >> 1) - srl %o1,1,%o1 ! %o1 = hi(n1n0 >> 1) - - and %o3,1,%g2 - srl %o3,1,%g3 ! %g3 = floor(d / 2) - add %g3,%g2,%g3 ! %g3 = ceil(d / 2) - - b LLp1 - addxcc %o2,%o2,%o2 - -LLplop: bcc LLn1 - addxcc %o2,%o2,%o2 -LLp1: addx %o1,%o1,%o1 - subcc %o1,%g3,%o4 - bcc LLn2 - addxcc %o2,%o2,%o2 -LLp2: addx %o1,%o1,%o1 - subcc %o1,%g3,%o4 - bcc LLn3 - addxcc %o2,%o2,%o2 -LLp3: addx %o1,%o1,%o1 - subcc %o1,%g3,%o4 - bcc LLn4 - addxcc %o2,%o2,%o2 -LLp4: addx %o1,%o1,%o1 - addcc %g1,-1,%g1 - bne LLplop - subcc %o1,%g3,%o4 - bcc LLn5 - addxcc %o2,%o2,%o2 -LLp5: add %o1,%o1,%o1 ! << 1 - tst %g2 - bne Oddp - add %o5,%o1,%o1 - st %o1,[%o0] - retl - xnor %g0,%o2,%o0 - -LLnlop: bcc LLp1 - addxcc %o2,%o2,%o2 -LLn1: addx %o4,%o4,%o4 - subcc %o4,%g3,%o1 - bcc LLp2 - addxcc %o2,%o2,%o2 -LLn2: addx %o4,%o4,%o4 - subcc %o4,%g3,%o1 - bcc LLp3 - addxcc %o2,%o2,%o2 -LLn3: addx %o4,%o4,%o4 - subcc %o4,%g3,%o1 - bcc LLp4 - addxcc %o2,%o2,%o2 -LLn4: addx %o4,%o4,%o4 - addcc %g1,-1,%g1 - bne LLnlop - subcc %o4,%g3,%o1 - bcc LLp5 - addxcc %o2,%o2,%o2 -LLn5: add %o4,%o4,%o4 ! << 1 - tst %g2 - bne Oddn - add %o5,%o4,%o4 - st %o4,[%o0] - retl - xnor %g0,%o2,%o0 - -Oddp: xnor %g0,%o2,%o2 - ! q' in %o2. r' in %o1 - addcc %o1,%o2,%o1 - bcc LLp6 - addx %o2,0,%o2 - sub %o1,%o3,%o1 -LLp6: subcc %o1,%o3,%g0 - bcs LLp7 - subx %o2,-1,%o2 - sub %o1,%o3,%o1 -LLp7: st %o1,[%o0] - retl - mov %o2,%o0 - -Oddn: xnor %g0,%o2,%o2 - ! q' in %o2. r' in %o4 - addcc %o4,%o2,%o4 - bcc LLn6 - addx %o2,0,%o2 - sub %o4,%o3,%o4 -LLn6: subcc %o4,%o3,%g0 - bcs LLn7 - subx %o2,-1,%o2 - sub %o4,%o3,%o4 -LLn7: st %o4,[%o0] - retl - mov %o2,%o0 diff --git a/sysdeps/sparc/sub_n.S b/sysdeps/sparc/sub_n.S deleted file mode 100644 index b7a11958e2..0000000000 --- a/sysdeps/sparc/sub_n.S +++ /dev/null @@ -1,311 +0,0 @@ -! SPARC __mpn_sub_n -- Subtract two limb vectors of the same length > 0 and -! store difference in a third limb vector. - -! Copyright (C) 1995, 1996 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -#define res_ptr %o0 -#define s1_ptr %o1 -#define s2_ptr %o2 -#define size %o3 - -#include "sysdep.h" - - .text - .align 4 - .global C_SYMBOL_NAME(__mpn_sub_n) -C_SYMBOL_NAME(__mpn_sub_n): - xor s2_ptr,res_ptr,%g1 - andcc %g1,4,%g0 - bne L1 ! branch if alignment differs - nop -! ** V1a ** - andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0 - be L_v1 ! if no, branch - nop -/* Add least significant limb separately to align res_ptr and s2_ptr */ - ld [s1_ptr],%g4 - add s1_ptr,4,s1_ptr - ld [s2_ptr],%g2 - add s2_ptr,4,s2_ptr - add size,-1,size - subcc %g4,%g2,%o4 - st %o4,[res_ptr] - add res_ptr,4,res_ptr -L_v1: addx %g0,%g0,%o4 ! save cy in register - cmp size,2 ! if size < 2 ... - bl Lend2 ! ... branch to tail code - subcc %g0,%o4,%g0 ! restore cy - - ld [s1_ptr+0],%g4 - addcc size,-10,size - ld [s1_ptr+4],%g1 - ldd [s2_ptr+0],%g2 - blt Lfin1 - subcc %g0,%o4,%g0 ! restore cy -/* Add blocks of 8 limbs until less than 8 limbs remain */ -Loop1: subxcc %g4,%g2,%o4 - ld [s1_ptr+8],%g4 - subxcc %g1,%g3,%o5 - ld [s1_ptr+12],%g1 - ldd [s2_ptr+8],%g2 - std %o4,[res_ptr+0] - subxcc %g4,%g2,%o4 - ld [s1_ptr+16],%g4 - subxcc %g1,%g3,%o5 - ld [s1_ptr+20],%g1 - ldd [s2_ptr+16],%g2 - std %o4,[res_ptr+8] - subxcc %g4,%g2,%o4 - ld [s1_ptr+24],%g4 - subxcc %g1,%g3,%o5 - ld [s1_ptr+28],%g1 - ldd [s2_ptr+24],%g2 - std %o4,[res_ptr+16] - subxcc %g4,%g2,%o4 - ld [s1_ptr+32],%g4 - subxcc %g1,%g3,%o5 - ld [s1_ptr+36],%g1 - ldd [s2_ptr+32],%g2 - std %o4,[res_ptr+24] - addx %g0,%g0,%o4 ! save cy in register - addcc size,-8,size - add s1_ptr,32,s1_ptr - add s2_ptr,32,s2_ptr - add res_ptr,32,res_ptr - bge Loop1 - subcc %g0,%o4,%g0 ! restore cy - -Lfin1: addcc size,8-2,size - blt Lend1 - subcc %g0,%o4,%g0 ! restore cy -/* Add blocks of 2 limbs until less than 2 limbs remain */ -Loope1: subxcc %g4,%g2,%o4 - ld [s1_ptr+8],%g4 - subxcc %g1,%g3,%o5 - ld [s1_ptr+12],%g1 - ldd [s2_ptr+8],%g2 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 ! save cy in register - addcc size,-2,size - add s1_ptr,8,s1_ptr - add s2_ptr,8,s2_ptr - add res_ptr,8,res_ptr - bge Loope1 - subcc %g0,%o4,%g0 ! restore cy -Lend1: subxcc %g4,%g2,%o4 - subxcc %g1,%g3,%o5 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 ! save cy in register - - andcc size,1,%g0 - be Lret1 - subcc %g0,%o4,%g0 ! restore cy -/* Add last limb */ - ld [s1_ptr+8],%g4 - ld [s2_ptr+8],%g2 - subxcc %g4,%g2,%o4 - st %o4,[res_ptr+8] - -Lret1: retl - addx %g0,%g0,%o0 ! return carry-out from most sign. limb - -L1: xor s1_ptr,res_ptr,%g1 - andcc %g1,4,%g0 - bne L2 - nop -! ** V1b ** - andcc res_ptr,4,%g0 ! res_ptr unaligned? Side effect: cy=0 - be L_v1b ! if no, branch - nop -/* Add least significant limb separately to align res_ptr and s1_ptr */ - ld [s2_ptr],%g4 - add s2_ptr,4,s2_ptr - ld [s1_ptr],%g2 - add s1_ptr,4,s1_ptr - add size,-1,size - subcc %g2,%g4,%o4 - st %o4,[res_ptr] - add res_ptr,4,res_ptr -L_v1b: addx %g0,%g0,%o4 ! save cy in register - cmp size,2 ! if size < 2 ... - bl Lend2 ! ... branch to tail code - subcc %g0,%o4,%g0 ! restore cy - - ld [s2_ptr+0],%g4 - addcc size,-10,size - ld [s2_ptr+4],%g1 - ldd [s1_ptr+0],%g2 - blt Lfin1b - subcc %g0,%o4,%g0 ! restore cy -/* Add blocks of 8 limbs until less than 8 limbs remain */ -Loop1b: subxcc %g2,%g4,%o4 - ld [s2_ptr+8],%g4 - subxcc %g3,%g1,%o5 - ld [s2_ptr+12],%g1 - ldd [s1_ptr+8],%g2 - std %o4,[res_ptr+0] - subxcc %g2,%g4,%o4 - ld [s2_ptr+16],%g4 - subxcc %g3,%g1,%o5 - ld [s2_ptr+20],%g1 - ldd [s1_ptr+16],%g2 - std %o4,[res_ptr+8] - subxcc %g2,%g4,%o4 - ld [s2_ptr+24],%g4 - subxcc %g3,%g1,%o5 - ld [s2_ptr+28],%g1 - ldd [s1_ptr+24],%g2 - std %o4,[res_ptr+16] - subxcc %g2,%g4,%o4 - ld [s2_ptr+32],%g4 - subxcc %g3,%g1,%o5 - ld [s2_ptr+36],%g1 - ldd [s1_ptr+32],%g2 - std %o4,[res_ptr+24] - addx %g0,%g0,%o4 ! save cy in register - addcc size,-8,size - add s1_ptr,32,s1_ptr - add s2_ptr,32,s2_ptr - add res_ptr,32,res_ptr - bge Loop1b - subcc %g0,%o4,%g0 ! restore cy - -Lfin1b: addcc size,8-2,size - blt Lend1b - subcc %g0,%o4,%g0 ! restore cy -/* Add blocks of 2 limbs until less than 2 limbs remain */ -Loope1b:subxcc %g2,%g4,%o4 - ld [s2_ptr+8],%g4 - subxcc %g3,%g1,%o5 - ld [s2_ptr+12],%g1 - ldd [s1_ptr+8],%g2 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 ! save cy in register - addcc size,-2,size - add s1_ptr,8,s1_ptr - add s2_ptr,8,s2_ptr - add res_ptr,8,res_ptr - bge Loope1b - subcc %g0,%o4,%g0 ! restore cy -Lend1b: subxcc %g2,%g4,%o4 - subxcc %g3,%g1,%o5 - std %o4,[res_ptr+0] - addx %g0,%g0,%o4 ! save cy in register - - andcc size,1,%g0 - be Lret1b - subcc %g0,%o4,%g0 ! restore cy -/* Add last limb */ - ld [s2_ptr+8],%g4 - ld [s1_ptr+8],%g2 - subxcc %g2,%g4,%o4 - st %o4,[res_ptr+8] - -Lret1b: retl - addx %g0,%g0,%o0 ! return carry-out from most sign. limb - -! ** V2 ** -/* If we come here, the alignment of s1_ptr and res_ptr as well as the - alignment of s2_ptr and res_ptr differ. Since there are only two ways - things can be aligned (that we care about) we now know that the alignment - of s1_ptr and s2_ptr are the same. */ - -L2: cmp size,1 - be Ljone - nop - andcc s1_ptr,4,%g0 ! s1_ptr unaligned? Side effect: cy=0 - be L_v2 ! if no, branch - nop -/* Add least significant limb separately to align s1_ptr and s2_ptr */ - ld [s1_ptr],%g4 - add s1_ptr,4,s1_ptr - ld [s2_ptr],%g2 - add s2_ptr,4,s2_ptr - add size,-1,size - subcc %g4,%g2,%o4 - st %o4,[res_ptr] - add res_ptr,4,res_ptr - -L_v2: addx %g0,%g0,%o4 ! save cy in register - addcc size,-8,size - blt Lfin2 - subcc %g0,%o4,%g0 ! restore cy -/* Add blocks of 8 limbs until less than 8 limbs remain */ -Loop2: ldd [s1_ptr+0],%g2 - ldd [s2_ptr+0],%o4 - subxcc %g2,%o4,%g2 - st %g2,[res_ptr+0] - subxcc %g3,%o5,%g3 - st %g3,[res_ptr+4] - ldd [s1_ptr+8],%g2 - ldd [s2_ptr+8],%o4 - subxcc %g2,%o4,%g2 - st %g2,[res_ptr+8] - subxcc %g3,%o5,%g3 - st %g3,[res_ptr+12] - ldd [s1_ptr+16],%g2 - ldd [s2_ptr+16],%o4 - subxcc %g2,%o4,%g2 - st %g2,[res_ptr+16] - subxcc %g3,%o5,%g3 - st %g3,[res_ptr+20] - ldd [s1_ptr+24],%g2 - ldd [s2_ptr+24],%o4 - subxcc %g2,%o4,%g2 - st %g2,[res_ptr+24] - subxcc %g3,%o5,%g3 - st %g3,[res_ptr+28] - addx %g0,%g0,%o4 ! save cy in register - addcc size,-8,size - add s1_ptr,32,s1_ptr - add s2_ptr,32,s2_ptr - add res_ptr,32,res_ptr - bge Loop2 - subcc %g0,%o4,%g0 ! restore cy - -Lfin2: addcc size,8-2,size - blt Lend2 - subcc %g0,%o4,%g0 ! restore cy -Loope2: ldd [s1_ptr+0],%g2 - ldd [s2_ptr+0],%o4 - subxcc %g2,%o4,%g2 - st %g2,[res_ptr+0] - subxcc %g3,%o5,%g3 - st %g3,[res_ptr+4] - addx %g0,%g0,%o4 ! save cy in register - addcc size,-2,size - add s1_ptr,8,s1_ptr - add s2_ptr,8,s2_ptr - add res_ptr,8,res_ptr - bge Loope2 - subcc %g0,%o4,%g0 ! restore cy -Lend2: andcc size,1,%g0 - be Lret2 - subcc %g0,%o4,%g0 ! restore cy -/* Add last limb */ -Ljone: ld [s1_ptr],%g4 - ld [s2_ptr],%g2 - subxcc %g4,%g2,%o4 - st %o4,[res_ptr] - -Lret2: retl - addx %g0,%g0,%o0 ! return carry-out from most sign. limb diff --git a/sysdeps/sparc/submul_1.S b/sysdeps/sparc/submul_1.S deleted file mode 100644 index a8ebd501a7..0000000000 --- a/sysdeps/sparc/submul_1.S +++ /dev/null @@ -1,147 +0,0 @@ -! SPARC __mpn_submul_1 -- Multiply a limb vector with a limb and subtract -! the result from a second limb vector. - -! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -! MA 02111-1307, USA. - - -! INPUT PARAMETERS -! res_ptr o0 -! s1_ptr o1 -! size o2 -! s2_limb o3 - -#include "sysdep.h" - -.text - .align 4 - .global C_SYMBOL_NAME(__mpn_submul_1) -C_SYMBOL_NAME(__mpn_submul_1): - ! Make S1_PTR and RES_PTR point at the end of their blocks - ! and put (- 4 x SIZE) in index/loop counter. - sll %o2,2,%o2 - add %o0,%o2,%o4 ! RES_PTR in o4 since o0 is retval - add %o1,%o2,%o1 - sub %g0,%o2,%o2 - - cmp %o3,0xfff - bgu Large - nop - - ld [%o1+%o2],%o5 - mov 0,%o0 - b L0 - add %o4,-4,%o4 -Loop0: - subcc %o5,%g1,%g1 - ld [%o1+%o2],%o5 - addx %o0,%g0,%o0 - st %g1,[%o4+%o2] -L0: wr %g0,%o3,%y - sra %o5,31,%g2 - and %o3,%g2,%g2 - andcc %g1,0,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,%o5,%g1 - mulscc %g1,0,%g1 - sra %g1,20,%g4 - sll %g1,12,%g1 - rd %y,%g3 - srl %g3,20,%g3 - or %g1,%g3,%g1 - - addcc %g1,%o0,%g1 - addx %g2,%g4,%o0 ! add sign-compensation and cy to hi limb - addcc %o2,4,%o2 ! loop counter - bne Loop0 - ld [%o4+%o2],%o5 - - subcc %o5,%g1,%g1 - addx %o0,%g0,%o0 - retl - st %g1,[%o4+%o2] - - -Large: ld [%o1+%o2],%o5 - mov 0,%o0 - sra %o3,31,%g4 ! g4 = mask of ones iff S2_LIMB < 0 - b L1 - add %o4,-4,%o4 -Loop: - subcc %o5,%g3,%g3 - ld [%o1+%o2],%o5 - addx %o0,%g0,%o0 - st %g3,[%o4+%o2] -L1: wr %g0,%o5,%y - and %o5,%g4,%g2 - andcc %g0,%g0,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%o3,%g1 - mulscc %g1,%g0,%g1 - rd %y,%g3 - addcc %g3,%o0,%g3 - addx %g2,%g1,%o0 - addcc %o2,4,%o2 - bne Loop - ld [%o4+%o2],%o5 - - subcc %o5,%g3,%g3 - addx %o0,%g0,%o0 - retl - st %g3,[%o4+%o2] diff --git a/sysdeps/sparc/udiv.S b/sysdeps/sparc/udiv.S deleted file mode 100644 index 4a7d1526b0..0000000000 --- a/sysdeps/sparc/udiv.S +++ /dev/null @@ -1,352 +0,0 @@ - /* This file is generated from divrem.m4; DO NOT EDIT! */ -/* - * Division and remainder, from Appendix E of the Sparc Version 8 - * Architecture Manual, with fixes from Gordon Irlam. - */ - -/* - * Input: dividend and divisor in %o0 and %o1 respectively. - * - * m4 parameters: - * .udiv name of function to generate - * div div=div => %o0 / %o1; div=rem => %o0 % %o1 - * false false=true => signed; false=false => unsigned - * - * Algorithm parameters: - * N how many bits per iteration we try to get (4) - * WORDSIZE total number of bits (32) - * - * Derived constants: - * TOPBITS number of bits in the top decade of a number - * - * Important variables: - * Q the partial quotient under development (initially 0) - * R the remainder so far, initially the dividend - * ITER number of main division loop iterations required; - * equal to ceil(log2(quotient) / N). Note that this - * is the log base (2^N) of the quotient. - * V the current comparand, initially divisor*2^(ITER*N-1) - * - * Cost: - * Current estimate for non-large dividend is - * ceil(log2(quotient) / N) * (10 + 7N/2) + C - * A large dividend is one greater than 2^(31-TOPBITS) and takes a - * different path, as the upper bits of the quotient must be developed - * one bit at a time. - */ - - - -#include "sysdep.h" -#ifdef __linux__ -#include -#else -#ifdef __svr4__ -#include -#else -#include -#endif -#endif - -ENTRY(.udiv) - - ! Ready to divide. Compute size of quotient; scale comparand. - orcc %o1, %g0, %o5 - bne 1f - mov %o0, %o3 - - ! Divide by zero trap. If it returns, return 0 (about as - ! wrong as possible, but that is what SunOS does...). - ta ST_DIV0 - retl - clr %o0 - -1: - cmp %o3, %o5 ! if %o1 exceeds %o0, done - blu Lgot_result ! (and algorithm fails otherwise) - clr %o2 - sethi %hi(1 << (32 - 4 - 1)), %g1 - cmp %o3, %g1 - blu Lnot_really_big - clr %o4 - - ! Here the dividend is >= 2**(31-N) or so. We must be careful here, - ! as our usual N-at-a-shot divide step will cause overflow and havoc. - ! The number of bits in the result here is N*ITER+SC, where SC <= N. - ! Compute ITER in an unorthodox manner: know we need to shift V into - ! the top decade: so do not even bother to compare to R. - 1: - cmp %o5, %g1 - bgeu 3f - mov 1, %g7 - sll %o5, 4, %o5 - b 1b - add %o4, 1, %o4 - - ! Now compute %g7. - 2: addcc %o5, %o5, %o5 - bcc Lnot_too_big - add %g7, 1, %g7 - - ! We get here if the %o1 overflowed while shifting. - ! This means that %o3 has the high-order bit set. - ! Restore %o5 and subtract from %o3. - sll %g1, 4, %g1 ! high order bit - srl %o5, 1, %o5 ! rest of %o5 - add %o5, %g1, %o5 - b Ldo_single_div - sub %g7, 1, %g7 - - Lnot_too_big: - 3: cmp %o5, %o3 - blu 2b - nop - be Ldo_single_div - nop - /* NB: these are commented out in the V8-Sparc manual as well */ - /* (I do not understand this) */ - ! %o5 > %o3: went too far: back up 1 step - ! srl %o5, 1, %o5 - ! dec %g7 - ! do single-bit divide steps - ! - ! We have to be careful here. We know that %o3 >= %o5, so we can do the - ! first divide step without thinking. BUT, the others are conditional, - ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- - ! order bit set in the first step, just falling into the regular - ! division loop will mess up the first time around. - ! So we unroll slightly... - Ldo_single_div: - subcc %g7, 1, %g7 - bl Lend_regular_divide - nop - sub %o3, %o5, %o3 - mov 1, %o2 - b Lend_single_divloop - nop - Lsingle_divloop: - sll %o2, 1, %o2 - bl 1f - srl %o5, 1, %o5 - ! %o3 >= 0 - sub %o3, %o5, %o3 - b 2f - add %o2, 1, %o2 - 1: ! %o3 < 0 - add %o3, %o5, %o3 - sub %o2, 1, %o2 - 2: - Lend_single_divloop: - subcc %g7, 1, %g7 - bge Lsingle_divloop - tst %o3 - b,a Lend_regular_divide - -Lnot_really_big: -1: - sll %o5, 4, %o5 - cmp %o5, %o3 - bleu 1b - addcc %o4, 1, %o4 - be Lgot_result - sub %o4, 1, %o4 - - tst %o3 ! set up for initial iteration -Ldivloop: - sll %o2, 4, %o2 - ! depth 1, accumulated bits 0 - bl L.1.16 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 2, accumulated bits 1 - bl L.2.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits 3 - bl L.3.19 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 7 - bl L.4.23 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (7*2+1), %o2 - -L.4.23: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (7*2-1), %o2 - - -L.3.19: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 5 - bl L.4.21 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (5*2+1), %o2 - -L.4.21: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (5*2-1), %o2 - - - -L.2.17: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits 1 - bl L.3.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 3 - bl L.4.19 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (3*2+1), %o2 - -L.4.19: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (3*2-1), %o2 - - -L.3.17: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 1 - bl L.4.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (1*2+1), %o2 - -L.4.17: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (1*2-1), %o2 - - - - -L.1.16: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 2, accumulated bits -1 - bl L.2.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits -1 - bl L.3.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -1 - bl L.4.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2+1), %o2 - -L.4.15: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2-1), %o2 - - -L.3.15: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -3 - bl L.4.13 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2+1), %o2 - -L.4.13: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2-1), %o2 - - - -L.2.15: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits -3 - bl L.3.13 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -5 - bl L.4.11 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2+1), %o2 - -L.4.11: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2-1), %o2 - - -L.3.13: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -7 - bl L.4.9 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2+1), %o2 - -L.4.9: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2-1), %o2 - - - - - 9: -Lend_regular_divide: - subcc %o4, 1, %o4 - bge Ldivloop - tst %o3 - bl,a Lgot_result - ! non-restoring fixup here (one instruction only!) - sub %o2, 1, %o2 - - -Lgot_result: - - retl - mov %o2, %o0 diff --git a/sysdeps/sparc/udiv_qrnnd.S b/sysdeps/sparc/udiv_qrnnd.S deleted file mode 100644 index 437d66e9ea..0000000000 --- a/sysdeps/sparc/udiv_qrnnd.S +++ /dev/null @@ -1,164 +0,0 @@ -! SPARC __udiv_qrnnd division support, used from longlong.h. - -! Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc. - -! This file is part of the GNU MP Library. - -! The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -! -! Added PIC support - May/96, Miguel de Icaza - -! INPUT PARAMETERS -! rem_ptr i0 -! n1 i1 -! n0 i2 -! d i3 - -#include "sysdep.h" -#undef ret /* Kludge for glibc */ - - .text - .align 8 -LC0: .double 0r4294967296 -LC1: .double 0r2147483648 - - .align 4 - .global __udiv_qrnnd - .type __udiv_qrnnd,@function -ENTRY(__udiv_qrnnd) - !#PROLOGUE# 0 - save %sp,-104,%sp - !#PROLOGUE# 1 - st %i1,[%fp-8] - ld [%fp-8],%f10 -#ifdef PIC -._XL11: - call ._XL1 - fitod %f10,%f4 -._XL1: - sub %o7,(._XL11-LC0),%o7 - ldd [%o7],%f8 -#else - sethi %hi(LC0),%o7 - fitod %f10,%f4 - ldd [%o7+%lo(LC0)],%f8 -#endif - cmp %i1,0 - bge L248 - mov %i0,%i5 - faddd %f4,%f8,%f4 -L248: - st %i2,[%fp-8] - ld [%fp-8],%f10 - fmuld %f4,%f8,%f6 - cmp %i2,0 - bge L249 - fitod %f10,%f2 - faddd %f2,%f8,%f2 -L249: - st %i3,[%fp-8] - faddd %f6,%f2,%f2 - ld [%fp-8],%f10 - cmp %i3,0 - bge L250 - fitod %f10,%f4 - faddd %f4,%f8,%f4 -L250: - fdivd %f2,%f4,%f2 -#ifdef PIC -._XL22: - call ._XL2 - nop -._XL2: - sub %o7,(._XL22-LC1),%o7 - ldd [%o7],%f4 -#else - sethi %hi(LC1),%o7 - ldd [%o7+%lo(LC1)],%f4 -#endif - fcmped %f2,%f4 - nop - fbge,a L251 - fsubd %f2,%f4,%f2 - fdtoi %f2,%f2 - st %f2,[%fp-8] - b L252 - ld [%fp-8],%i4 -L251: - fdtoi %f2,%f2 - st %f2,[%fp-8] - ld [%fp-8],%i4 - sethi %hi(-2147483648),%g2 - xor %i4,%g2,%i4 -L252: - wr %g0,%i4,%y - sra %i3,31,%g2 - and %i4,%g2,%g2 - andcc %g0,0,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,%i3,%g1 - mulscc %g1,0,%g1 - add %g1,%g2,%i0 - rd %y,%g3 - subcc %i2,%g3,%o7 - subxcc %i1,%i0,%g0 - be L253 - cmp %o7,%i3 - - add %i4,-1,%i0 - add %o7,%i3,%o7 - st %o7,[%i5] - ret - restore -L253: - blu L246 - mov %i4,%i0 - add %i4,1,%i0 - sub %o7,%i3,%o7 -L246: - st %o7,[%i5] - ret - restore diff --git a/sysdeps/sparc/umul.S b/sysdeps/sparc/umul.S deleted file mode 100644 index 7a26c295cb..0000000000 --- a/sysdeps/sparc/umul.S +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Unsigned multiply. Returns %o0 * %o1 in %o1%o0 (i.e., %o1 holds the - * upper 32 bits of the 64-bit product). - * - * This code optimizes short (less than 13-bit) multiplies. Short - * multiplies require 25 instruction cycles, and long ones require - * 45 instruction cycles. - * - * On return, overflow has occurred (%o1 is not zero) if and only if - * the Z condition code is clear, allowing, e.g., the following: - * - * call .umul - * nop - * bnz overflow (or tnz) - */ - -#include "DEFS.h" -FUNC(.umul) - or %o0, %o1, %o4 - mov %o0, %y ! multiplier -> Y - andncc %o4, 0xfff, %g0 ! test bits 12..31 of *both* args - be Lmul_shortway ! if zero, can do it the short way - andcc %g0, %g0, %o4 ! zero the partial product and clear N and V - - /* - * Long multiply. 32 steps, followed by a final shift step. - */ - mulscc %o4, %o1, %o4 ! 1 - mulscc %o4, %o1, %o4 ! 2 - mulscc %o4, %o1, %o4 ! 3 - mulscc %o4, %o1, %o4 ! 4 - mulscc %o4, %o1, %o4 ! 5 - mulscc %o4, %o1, %o4 ! 6 - mulscc %o4, %o1, %o4 ! 7 - mulscc %o4, %o1, %o4 ! 8 - mulscc %o4, %o1, %o4 ! 9 - mulscc %o4, %o1, %o4 ! 10 - mulscc %o4, %o1, %o4 ! 11 - mulscc %o4, %o1, %o4 ! 12 - mulscc %o4, %o1, %o4 ! 13 - mulscc %o4, %o1, %o4 ! 14 - mulscc %o4, %o1, %o4 ! 15 - mulscc %o4, %o1, %o4 ! 16 - mulscc %o4, %o1, %o4 ! 17 - mulscc %o4, %o1, %o4 ! 18 - mulscc %o4, %o1, %o4 ! 19 - mulscc %o4, %o1, %o4 ! 20 - mulscc %o4, %o1, %o4 ! 21 - mulscc %o4, %o1, %o4 ! 22 - mulscc %o4, %o1, %o4 ! 23 - mulscc %o4, %o1, %o4 ! 24 - mulscc %o4, %o1, %o4 ! 25 - mulscc %o4, %o1, %o4 ! 26 - mulscc %o4, %o1, %o4 ! 27 - mulscc %o4, %o1, %o4 ! 28 - mulscc %o4, %o1, %o4 ! 29 - mulscc %o4, %o1, %o4 ! 30 - mulscc %o4, %o1, %o4 ! 31 - mulscc %o4, %o1, %o4 ! 32 - mulscc %o4, %g0, %o4 ! final shift - - - /* - * Normally, with the shift-and-add approach, if both numbers are - * positive you get the correct result. With 32-bit two's-complement - * numbers, -x is represented as - * - * x 32 - * ( 2 - ------ ) mod 2 * 2 - * 32 - * 2 - * - * (the `mod 2' subtracts 1 from 1.bbbb). To avoid lots of 2^32s, - * we can treat this as if the radix point were just to the left - * of the sign bit (multiply by 2^32), and get - * - * -x = (2 - x) mod 2 - * - * Then, ignoring the `mod 2's for convenience: - * - * x * y = xy - * -x * y = 2y - xy - * x * -y = 2x - xy - * -x * -y = 4 - 2x - 2y + xy - * - * For signed multiplies, we subtract (x << 32) from the partial - * product to fix this problem for negative multipliers (see mul.s). - * Because of the way the shift into the partial product is calculated - * (N xor V), this term is automatically removed for the multiplicand, - * so we don't have to adjust. - * - * But for unsigned multiplies, the high order bit wasn't a sign bit, - * and the correction is wrong. So for unsigned multiplies where the - * high order bit is one, we end up with xy - (y << 32). To fix it - * we add y << 32. - */ -#if 0 - tst %o1 - bl,a 1f ! if %o1 < 0 (high order bit = 1), - add %o4, %o0, %o4 ! %o4 += %o0 (add y to upper half) -1: rd %y, %o0 ! get lower half of product - retl - addcc %o4, %g0, %o1 ! put upper half in place and set Z for %o1==0 -#else - /* Faster code from tege@sics.se. */ - sra %o1, 31, %o2 ! make mask from sign bit - and %o0, %o2, %o2 ! %o2 = 0 or %o0, depending on sign of %o1 - rd %y, %o0 ! get lower half of product - retl - addcc %o4, %o2, %o1 ! add compensation and put upper half in place -#endif - -Lmul_shortway: - /* - * Short multiply. 12 steps, followed by a final shift step. - * The resulting bits are off by 12 and (32-12) = 20 bit positions, - * but there is no problem with %o0 being negative (unlike above), - * and overflow is impossible (the answer is at most 24 bits long). - */ - mulscc %o4, %o1, %o4 ! 1 - mulscc %o4, %o1, %o4 ! 2 - mulscc %o4, %o1, %o4 ! 3 - mulscc %o4, %o1, %o4 ! 4 - mulscc %o4, %o1, %o4 ! 5 - mulscc %o4, %o1, %o4 ! 6 - mulscc %o4, %o1, %o4 ! 7 - mulscc %o4, %o1, %o4 ! 8 - mulscc %o4, %o1, %o4 ! 9 - mulscc %o4, %o1, %o4 ! 10 - mulscc %o4, %o1, %o4 ! 11 - mulscc %o4, %o1, %o4 ! 12 - mulscc %o4, %g0, %o4 ! final shift - - /* - * %o4 has 20 of the bits that should be in the result; %y has - * the bottom 12 (as %y's top 12). That is: - * - * %o4 %y - * +----------------+----------------+ - * | -12- | -20- | -12- | -20- | - * +------(---------+------)---------+ - * -----result----- - * - * The 12 bits of %o4 left of the `result' area are all zero; - * in fact, all top 20 bits of %o4 are zero. - */ - - rd %y, %o5 - sll %o4, 12, %o0 ! shift middle bits left 12 - srl %o5, 20, %o5 ! shift low bits right 20 - or %o5, %o0, %o0 - retl - addcc %g0, %g0, %o1 ! %o1 = zero, and set Z diff --git a/sysdeps/sparc/urem.S b/sysdeps/sparc/urem.S deleted file mode 100644 index e72c33dd63..0000000000 --- a/sysdeps/sparc/urem.S +++ /dev/null @@ -1,352 +0,0 @@ - /* This file is generated from divrem.m4; DO NOT EDIT! */ -/* - * Division and remainder, from Appendix E of the Sparc Version 8 - * Architecture Manual, with fixes from Gordon Irlam. - */ - -/* - * Input: dividend and divisor in %o0 and %o1 respectively. - * - * m4 parameters: - * .urem name of function to generate - * rem rem=div => %o0 / %o1; rem=rem => %o0 % %o1 - * false false=true => signed; false=false => unsigned - * - * Algorithm parameters: - * N how many bits per iteration we try to get (4) - * WORDSIZE total number of bits (32) - * - * Derived constants: - * TOPBITS number of bits in the top decade of a number - * - * Important variables: - * Q the partial quotient under development (initially 0) - * R the remainder so far, initially the dividend - * ITER number of main division loop iterations required; - * equal to ceil(log2(quotient) / N). Note that this - * is the log base (2^N) of the quotient. - * V the current comparand, initially divisor*2^(ITER*N-1) - * - * Cost: - * Current estimate for non-large dividend is - * ceil(log2(quotient) / N) * (10 + 7N/2) + C - * A large dividend is one greater than 2^(31-TOPBITS) and takes a - * different path, as the upper bits of the quotient must be developed - * one bit at a time. - */ - - - -#include "sysdep.h" -#ifdef __linux__ -#include -#else -#ifdef __svr4__ -#include -#else -#include -#endif -#endif - -ENTRY(.urem) - - ! Ready to divide. Compute size of quotient; scale comparand. - orcc %o1, %g0, %o5 - bne 1f - mov %o0, %o3 - - ! Divide by zero trap. If it returns, return 0 (about as - ! wrong as possible, but that is what SunOS does...). - ta ST_DIV0 - retl - clr %o0 - -1: - cmp %o3, %o5 ! if %o1 exceeds %o0, done - blu Lgot_result ! (and algorithm fails otherwise) - clr %o2 - sethi %hi(1 << (32 - 4 - 1)), %g1 - cmp %o3, %g1 - blu Lnot_really_big - clr %o4 - - ! Here the dividend is >= 2**(31-N) or so. We must be careful here, - ! as our usual N-at-a-shot divide step will cause overflow and havoc. - ! The number of bits in the result here is N*ITER+SC, where SC <= N. - ! Compute ITER in an unorthodox manner: know we need to shift V into - ! the top decade: so do not even bother to compare to R. - 1: - cmp %o5, %g1 - bgeu 3f - mov 1, %g7 - sll %o5, 4, %o5 - b 1b - add %o4, 1, %o4 - - ! Now compute %g7. - 2: addcc %o5, %o5, %o5 - bcc Lnot_too_big - add %g7, 1, %g7 - - ! We get here if the %o1 overflowed while shifting. - ! This means that %o3 has the high-order bit set. - ! Restore %o5 and subtract from %o3. - sll %g1, 4, %g1 ! high order bit - srl %o5, 1, %o5 ! rest of %o5 - add %o5, %g1, %o5 - b Ldo_single_div - sub %g7, 1, %g7 - - Lnot_too_big: - 3: cmp %o5, %o3 - blu 2b - nop - be Ldo_single_div - nop - /* NB: these are commented out in the V8-Sparc manual as well */ - /* (I do not understand this) */ - ! %o5 > %o3: went too far: back up 1 step - ! srl %o5, 1, %o5 - ! dec %g7 - ! do single-bit divide steps - ! - ! We have to be careful here. We know that %o3 >= %o5, so we can do the - ! first divide step without thinking. BUT, the others are conditional, - ! and are only done if %o3 >= 0. Because both %o3 and %o5 may have the high- - ! order bit set in the first step, just falling into the regular - ! division loop will mess up the first time around. - ! So we unroll slightly... - Ldo_single_div: - subcc %g7, 1, %g7 - bl Lend_regular_divide - nop - sub %o3, %o5, %o3 - mov 1, %o2 - b Lend_single_divloop - nop - Lsingle_divloop: - sll %o2, 1, %o2 - bl 1f - srl %o5, 1, %o5 - ! %o3 >= 0 - sub %o3, %o5, %o3 - b 2f - add %o2, 1, %o2 - 1: ! %o3 < 0 - add %o3, %o5, %o3 - sub %o2, 1, %o2 - 2: - Lend_single_divloop: - subcc %g7, 1, %g7 - bge Lsingle_divloop - tst %o3 - b,a Lend_regular_divide - -Lnot_really_big: -1: - sll %o5, 4, %o5 - cmp %o5, %o3 - bleu 1b - addcc %o4, 1, %o4 - be Lgot_result - sub %o4, 1, %o4 - - tst %o3 ! set up for initial iteration -Ldivloop: - sll %o2, 4, %o2 - ! depth 1, accumulated bits 0 - bl L.1.16 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 2, accumulated bits 1 - bl L.2.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits 3 - bl L.3.19 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 7 - bl L.4.23 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (7*2+1), %o2 - -L.4.23: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (7*2-1), %o2 - - -L.3.19: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 5 - bl L.4.21 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (5*2+1), %o2 - -L.4.21: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (5*2-1), %o2 - - - -L.2.17: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits 1 - bl L.3.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits 3 - bl L.4.19 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (3*2+1), %o2 - -L.4.19: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (3*2-1), %o2 - - -L.3.17: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits 1 - bl L.4.17 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (1*2+1), %o2 - -L.4.17: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (1*2-1), %o2 - - - - -L.1.16: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 2, accumulated bits -1 - bl L.2.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 3, accumulated bits -1 - bl L.3.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -1 - bl L.4.15 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2+1), %o2 - -L.4.15: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-1*2-1), %o2 - - -L.3.15: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -3 - bl L.4.13 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2+1), %o2 - -L.4.13: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-3*2-1), %o2 - - - -L.2.15: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 3, accumulated bits -3 - bl L.3.13 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - ! depth 4, accumulated bits -5 - bl L.4.11 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2+1), %o2 - -L.4.11: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-5*2-1), %o2 - - -L.3.13: - ! remainder is negative - addcc %o3,%o5,%o3 - ! depth 4, accumulated bits -7 - bl L.4.9 - srl %o5,1,%o5 - ! remainder is positive - subcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2+1), %o2 - -L.4.9: - ! remainder is negative - addcc %o3,%o5,%o3 - b 9f - add %o2, (-7*2-1), %o2 - - - - - 9: -Lend_regular_divide: - subcc %o4, 1, %o4 - bge Ldivloop - tst %o3 - bl,a Lgot_result - ! non-restoring fixup here (one instruction only!) - add %o3, %o1, %o3 - - -Lgot_result: - - retl - mov %o3, %o0 diff --git a/sysdeps/sparc64/Implies b/sysdeps/sparc64/Implies deleted file mode 100644 index 1d793f9fb1..0000000000 --- a/sysdeps/sparc64/Implies +++ /dev/null @@ -1,3 +0,0 @@ -wordsize-64 -# SPARC uses IEEE 754 floating point. -ieee754 diff --git a/sysdeps/sparc64/Makefile b/sysdeps/sparc64/Makefile deleted file mode 100644 index 48a86c6acb..0000000000 --- a/sysdeps/sparc64/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# The Sparc`long double' is a distinct type we support. -#long-double-fcts = yes - -# But the support for ieee quads is so bad we just skip the whole thing. -# XXX This is only a temporary hack. -omit-long-double-fcts = yes - -# But we do need these few functions to even link stdio proggies -ifeq ($(subdir),math) -sysdep_routines += s_isinfl s_isnanl -endif diff --git a/sysdeps/sparc64/add_n.S b/sysdeps/sparc64/add_n.S deleted file mode 100644 index 68bb008a7d..0000000000 --- a/sysdeps/sparc64/add_n.S +++ /dev/null @@ -1,58 +0,0 @@ -/* SPARC v9 __mpn_add_n -- Add two limb vectors of the same length > 0 and - store sum in a third limb vector. - - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. - - This file is part of the GNU MP Library. - - The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. */ - - -#include - - -/* INPUT PARAMETERS - res_ptr %o0 - s1_ptr %o1 - s2_ptr %o2 - size %o3 */ - - -ENTRY(__mpn_add_n) - - sub %g0,%o3,%g3 - sllx %o3,3,%g1 - add %o1,%g1,%o1 ! make s1_ptr point at end - add %o2,%g1,%o2 ! make s2_ptr point at end - add %o0,%g1,%o0 ! make res_ptr point at end - mov 0,%o4 ! clear carry variable - sllx %g3,3,%o5 ! compute initial address index - -1: ldx [%o2+%o5],%g1 ! load s2 limb - add %g3,1,%g3 ! increment loop count - ldx [%o1+%o5],%g2 ! load s1 limb - addcc %g1,%o4,%g1 ! add s2 limb and carry variable - movcc %xcc,0,%o4 ! if carry-out, o4 was 1; clear it - addcc %g1,%g2,%g1 ! add s1 limb to sum - stx %g1,[%o0+%o5] ! store result - add %o5,8,%o5 ! increment address index - brnz,pt %g3,1b - movcs %xcc,1,%o4 ! if s1 add gave carry, record it - - retl - mov %o4,%o0 - -END(__mpn_add_n) diff --git a/sysdeps/sparc64/addmul_1.S b/sysdeps/sparc64/addmul_1.S deleted file mode 100644 index 260481230f..0000000000 --- a/sysdeps/sparc64/addmul_1.S +++ /dev/null @@ -1,88 +0,0 @@ -/* SPARC v9 __mpn_addmul_1 -- Multiply a limb vector with a single limb and - add the product to a second limb vector. - - Copyright (C) 1996 Free Software Foundation, Inc. - - This file is part of the GNU MP Library. - - The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. */ - -#include - - -/* INPUT PARAMETERS - res_ptr o0 - s1_ptr o1 - size o2 - s2_limb o3 */ - - -ENTRY(__mpn_addmul_1) - !#PROLOGUE# 0 - save %sp,-128,%sp - !#PROLOGUE# 1 - - sub %g0,%i2,%o7 - sllx %o7,3,%g5 - sub %i1,%g5,%o3 - sub %i0,%g5,%o4 - mov 0,%o0 ! zero cy_limb - - srl %i3,0,%o1 ! extract low 32 bits of s2_limb - srlx %i3,32,%i3 ! extract high 32 bits of s2_limb - mov 1,%o2 - sllx %o2,32,%o2 ! o2 = 0x100000000 - - ! hi ! - ! mid-1 ! - ! mid-2 ! - ! lo ! -1: - sllx %o7,3,%g1 - ldx [%o3+%g1],%g5 - srl %g5,0,%i0 ! zero hi bits - srlx %g5,32,%g5 - mulx %o1,%i0,%i4 ! lo product - mulx %i3,%i0,%i1 ! mid-1 product - mulx %o1,%g5,%l2 ! mid-2 product - mulx %i3,%g5,%i5 ! hi product - srlx %i4,32,%i0 ! extract high 32 bits of lo product... - add %i1,%i0,%i1 ! ...and add it to the mid-1 product - addcc %i1,%l2,%i1 ! add mid products - mov 0,%l0 ! we need the carry from that add... - movcs %xcc,%o2,%l0 ! ...compute it and... - add %i5,%l0,%i5 ! ...add to bit 32 of the hi product - sllx %i1,32,%i0 ! align low bits of mid product - srl %i4,0,%g5 ! zero high 32 bits of lo product - add %i0,%g5,%i0 ! combine into low 64 bits of result - srlx %i1,32,%i1 ! extract high bits of mid product... - add %i5,%i1,%i1 ! ...and add them to the high result - addcc %i0,%o0,%i0 ! add cy_limb to low 64 bits of result - mov 0,%g5 - movcs %xcc,1,%g5 - add %o7,1,%o7 - ldx [%o4+%g1],%l1 - addcc %l1,%i0,%i0 - movcs %xcc,1,%g5 - stx %i0,[%o4+%g1] - brnz %o7,1b - add %i1,%g5,%o0 ! compute new cy_limb - - mov %o0,%i0 - jmpl %i7+8, %g0 - restore - -END(__mpn_addmul_1) diff --git a/sysdeps/sparc64/bits/endian.h b/sysdeps/sparc64/bits/endian.h deleted file mode 100644 index a2ab07249a..0000000000 --- a/sysdeps/sparc64/bits/endian.h +++ /dev/null @@ -1,8 +0,0 @@ -/* Sparc is big-endian, but v9 supports endian conversion on loads/stores - and GCC supports such a mode. Be prepared. */ - -#ifdef __LITTLE_ENDIAN__ -#define __BYTE_ORDER __LITTLE_ENDIAN -#else -#define __BYTE_ORDER __BIG_ENDIAN -#endif diff --git a/sysdeps/sparc64/bsd-_setjmp.S b/sysdeps/sparc64/bsd-_setjmp.S deleted file mode 100644 index 1388c4c238..0000000000 --- a/sysdeps/sparc64/bsd-_setjmp.S +++ /dev/null @@ -1,43 +0,0 @@ -/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Sparc64 version. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -ENTRY(_setjmp) - -#ifdef PIC -1: rd %pc,%g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2 - or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2 - add %g1,%g2,%g1 - sethi %hi(C_SYMBOL_NAME(__sigsetjmp)),%g2 - or %g2,%lo(C_SYMBOL_NAME(__sigsetjmp)),%g2 - ld [%g1+%g2], %g1 -#else - sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1 - or %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1, %g1 - add %g1, %g4, %g1 -#endif - - jmp %g1 - mov %g0, %o1 /* Pass second argument of zero. */ - -END(_setjmp) - -strong_alias(_setjmp, __setjmp) diff --git a/sysdeps/sparc64/bsd-setjmp.S b/sysdeps/sparc64/bsd-setjmp.S deleted file mode 100644 index c42123fc42..0000000000 --- a/sysdeps/sparc64/bsd-setjmp.S +++ /dev/null @@ -1,41 +0,0 @@ -/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Sparc64 version. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -ENTRY(setjmp) - -#ifdef PIC -1: rd %pc,%g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2 - or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%g2 - add %g1,%g2,%g1 - sethi %hi(C_SYMBOL_NAME(__sigsetjmp)),%g2 - or %g2,%lo(C_SYMBOL_NAME(__sigsetjmp)),%g2 - ld [%g1+%g2], %g1 -#else - sethi %hi(C_SYMBOL_NAME(__sigsetjmp)), %g1 - or %lo(C_SYMBOL_NAME(__sigsetjmp)), %g1, %g1 - add %g1, %g4, %g1 -#endif - - jmp %g1 - mov 1, %o1 /* Pass second argument of one. */ - -END(setjmp) diff --git a/sysdeps/sparc64/configure b/sysdeps/sparc64/configure deleted file mode 100755 index 099f5b0470..0000000000 --- a/sysdeps/sparc64/configure +++ /dev/null @@ -1,3 +0,0 @@ - # Local configure fragment for sysdeps/sparc64 - -nopic_initfini=yes diff --git a/sysdeps/sparc64/configure.in b/sysdeps/sparc64/configure.in deleted file mode 100644 index 5f74b82de3..0000000000 --- a/sysdeps/sparc64/configure.in +++ /dev/null @@ -1,7 +0,0 @@ -sinclude(./aclocal.m4)dnl Autoconf lossage -GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. -# Local configure fragment for sysdeps/sparc64 - -dnl We need to have separate crt? files for static linking which does -dnl not use PIC. -nopic_initfini=yes diff --git a/sysdeps/sparc64/dl-machine.h b/sysdeps/sparc64/dl-machine.h deleted file mode 100644 index df09c8fc85..0000000000 --- a/sysdeps/sparc64/dl-machine.h +++ /dev/null @@ -1,306 +0,0 @@ -/* Machine-dependent ELF dynamic relocation inline functions. Sparc64 version. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, write to the Free Software Foundation, Inc., - 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#define ELF_MACHINE_NAME "sparc64" - -#include -#include -#include -#include -#include - - -/* Return nonzero iff E_MACHINE is compatible with the running host. */ -static inline int -elf_machine_matches_host (Elf64_Half e_machine) -{ - return e_machine == EM_SPARC64; -} - - -/* Return the link-time address of _DYNAMIC. Conveniently, this is the - first element of the GOT. This must be inlined in a function which - uses global data. */ -static inline Elf64_Addr -elf_machine_dynamic (void) -{ - register Elf64_Addr *got asm ("%l7"); - return *got; -} - - -/* Return the run-time load address of the shared object. */ -static inline Elf64_Addr -elf_machine_load_address (void) -{ - Elf64_Addr here; - - __asm("rd %pc,%0\n\t" - "ba 1f\n\t" - " add %0,12,%0\n\t" - ".weak __load_address_undefined\n\t" - "call __load_address_undefined\n" - "1:" - : "=r"(here)); - - return here + (*(int *)here << 2); -} - -#ifdef RESOLVE -/* Perform the relocation specified by RELOC and SYM (which is fully resolved). - MAP is the object containing the reloc. */ - -static inline void -elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, - const Elf64_Sym *sym, const struct r_found_version *version, - Elf64_Addr *const reloc_addr) -{ - Elf64_Addr loadbase; - -#ifndef RTLD_BOOTSTRAP - /* This is defined in rtld.c, but nowhere in the static libc.a; make the - reference weak so static programs can still link. This declaration - cannot be done when compiling rtld.c (i.e. #ifdef RTLD_BOOTSTRAP) - because rtld.c contains the common defn for _dl_rtld_map, which is - incompatible with a weak decl in the same file. */ - weak_extern (_dl_rtld_map); -#endif - - if (ELF64_R_TYPE (reloc->r_info) == R_SPARC_RELATIVE) - { -#ifndef RTLD_BOOTSTRAP - if (map != &_dl_rtld_map) /* Already done in rtld itself. */ -#endif - *reloc_addr += map->l_addr + reloc->r_addend; - } - else - { - const Elf64_Sym *const refsym = sym; - Elf64_Addr value; - if (sym->st_shndx != SHN_UNDEF && - ELF64_ST_BIND (sym->st_info) == STB_LOCAL) - value = map->l_addr; - else - { - value = RESOLVE (&sym, version, ELF64_R_TYPE (reloc->r_info)); - if (sym) - value += sym->st_value; - } - value += reloc->r_addend; /* Assume copy relocs have zero addend. */ - - switch (ELF64_R_TYPE (reloc->r_info)) - { - case R_SPARC_COPY: - if (sym->st_size > refsym->st_size - || (_dl_verbose && sym->st_size < refsym->st_size)) - { - extern char **_dl_argv; - const char *strtab; - - strtab = ((void *) map->l_addr - + map->l_info[DT_STRTAB]->d_un.d_ptr); - _dl_sysdep_error (_dl_argv[0] ?: "", - ": Symbol `", strtab + refsym->st_name, - "' has different size in shared object, " - "consider re-linking\n", NULL); - } - memcpy (reloc_addr, (void *) value, MIN (sym->st_size, - refsym->st_size)); - break; - case R_SPARC_GLOB_DAT: - /* case R_SPARC_64: */ - case R_SPARC_JMP_SLOT: - *reloc_addr = value; - break; - case R_SPARC_8: - *(char *) reloc_addr = value; - break; - case R_SPARC_16: - *(short *) reloc_addr = value; - break; - case R_SPARC_DISP8: - *(char *) reloc_addr = (value - (Elf64_Addr) reloc_addr); - break; - case R_SPARC_DISP16: - *(short *) reloc_addr = (value - (Elf64_Addr) reloc_addr); - break; - case R_SPARC_DISP32: - *(unsigned int *)reloc_addr = (value - (Elf64_Addr) reloc_addr); - break; - case R_SPARC_LO10: - *(unsigned *)reloc_addr = (*(unsigned *)reloc_addr & ~0x3ff) - | (value & 0x3ff); - break; - case R_SPARC_WDISP30: - *(unsigned *)reloc_addr = ((*(unsigned *)reloc_addr & 0xc0000000) - | ((value - (Elf64_Addr) reloc_addr) >> 2)); - break; - case R_SPARC_HI22: - *(unsigned *)reloc_addr = (*(unsigned *)reloc_addr & 0xffc00000) - | (value >> 10); - break; - case R_SPARC_NONE: /* Alright, Wilbur. */ - break; - default: - assert (! "unexpected dynamic reloc type"); - break; - } - } -} - -static inline void -elf_machine_lazy_rel (struct link_map *map, const Elf64_Rela *reloc) -{ - switch (ELF64_R_TYPE (reloc->r_info)) - { - case R_SPARC_NONE: - break; - case R_SPARC_JMP_SLOT: - break; - default: - assert (! "unexpected PLT reloc type"); - break; - } -} - -#endif /* RESOLVE */ - -/* Nonzero iff TYPE should not be allowed to resolve to one of - the main executable's symbols, as for a COPY reloc. */ -#define elf_machine_lookup_noexec_p(type) ((type) == R_SPARC_COPY) - -/* Nonzero iff TYPE describes relocation of a PLT entry, so - PLT entries should not be allowed to define the value. */ -#define elf_machine_lookup_noplt_p(type) ((type) == R_SPARC_JMP_SLOT) - -/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */ -#define ELF_MACHINE_RELOC_NOPLT R_SPARC_JMP_SLOT - -/* The SPARC never uses Elf64_Rel relocations. */ -#define ELF_MACHINE_NO_REL 1 - - -/* Set up the loaded object described by L so its unrelocated PLT - entries will jump to the on-demand fixup code in dl-runtime.c. */ - -static inline int -elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) -{ - Elf64_Addr *got; - extern void _dl_runtime_resolve (Elf64_Word); - - if (l->l_info[DT_JMPREL] && lazy) - { - got = (Elf64_Addr *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr); - got[1] = (Elf64_Addr) l; /* Identify this shared object. */ - /* This function will get called to fix up the GOT entry indicated by - the offset on the stack, and then jump to the resolved address. */ - got[2] = (Elf64_Addr) &_dl_runtime_resolve; - } - - return lazy; -} - -/* This code is used in dl-runtime.c to call the `fixup' function - and then redirect to the address it returns. */ -#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ - .globl _dl_runtime_resolve - .type _dl_runtime_resolve, @function -_dl_runtime_resolve: - save %sp, -160, %sp - mov %g1, %o1 - call fixup - mov %g2, %o0 - jmp %o0 - restore - .size _dl_runtime_resolve, .-_dl_runtime_resolve -"); - -/* The PLT uses Elf64_Rela relocs. */ -#define elf_machine_relplt elf_machine_rela - - -/* Mask identifying addresses reserved for the user program, - where the dynamic linker should not map anything. */ -#define ELF_MACHINE_USER_ADDRESS_MASK ??? - -/* Initial entry point code for the dynamic linker. - The C function `_dl_start' is the real entry point; - its return value is the user program's entry point. */ - -#define __S1(x) #x -#define __S(x) __S1(x) - -#define RTLD_START __asm__ ( "\ - .global _start - .type _start, @function -_start: - /* Make room for functions to drop their arguments on the stack. */ - sub %sp, 6*8, %sp - /* Pass pointer to argument block to _dl_start. */ - call _dl_start - add %sp," __S(STACK_BIAS) "+22*8,%o0 - /* FALLTHRU */ - - .global _dl_start_user - .type _dl_start_user, @function -_dl_start_user: - /* Load the GOT register. */ -1: rd %pc,%g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 - or %l2,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7 - add %l7,%g1,%l7 - /* Save the user entry point address in %l0. */ - mov %o0,%l0 - /* See if we were run as a command with the executable file name as an - extra leading argument. If so, adjust the stack pointer. */ - sethi %hi(_dl_skip_args), %g2 - or %g2, %lo(_dl_skip_args), %g2 - ld [%l7+%g2], %i0 - brz,pt %i0, 2f - ldx [%sp+" __S(STACK_BIAS) "+22*8], %i1 - sub %i1, %i0, %i1 - sllx %i0, 3, %i2 - add %sp, %i2, %sp - stx %i1, [%sp+" __S(STACK_BIAS) "+22*8] - /* Load _dl_default_scope[2] to pass to _dl_init_next. */ -2: sethi %hi(_dl_default_scope), %g2 - or %g2, %lo(_dl_defalt_scope), %g2 - add %g2, 2*8, %g2 - ldx [%l7+%g2], %l1 - /* Call _dl_init_next to return the address of an initializer to run. */ -3: call _dl_init_next - mov %l1, %o0 - brz,pn %o0, 4f - nop - jmpl %o0, %o7 - nop - ba,a 3b - /* Clear the startup flag. */ -4: sethi %hi(_dl_starting_up), %g2 - or %g2, %lo(_dl_starting_up), %g2 - st %g0, [%l7+%g2] - /* Pass our finalizer function to the user in %g1 - sethi %hi(_dl_fini), %g1 - or %g1, %lo(_dl_fini), %g1 - ldx [%l7+%g1], %g1 - /* Jump to the user's entry point & undo the allocation of the xtra regs. */ - jmp %l0 - add %sp, 6*8, %sp - .size _dl_start_user, .-_dl_start_user"); diff --git a/sysdeps/sparc64/elf/Dist b/sysdeps/sparc64/elf/Dist deleted file mode 100644 index d9338c8fd6..0000000000 --- a/sysdeps/sparc64/elf/Dist +++ /dev/null @@ -1,4 +0,0 @@ -crtbegin.S -crtbeginS.S -crtend.S -crtendS.S diff --git a/sysdeps/sparc64/elf/Makefile b/sysdeps/sparc64/elf/Makefile deleted file mode 100644 index 1b38355b38..0000000000 --- a/sysdeps/sparc64/elf/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# The assembler on SPARC needs the -fPIC flag even when it's assembler code. -ASFLAGS-.so = -fPIC - -ifeq ($(subdir), csu) -extra-objs += crtbegin.o crtend.o crtbeginS.o crtendS.o -install-lib += crtbegin.o crtend.o crtbeginS.o crtendS.o - -CPPFLAGS-crtbeginS.S = -fPIC -DPIC -CPPFLAGS-crtendS.S = -fPIC -DPIC -endif diff --git a/sysdeps/sparc64/elf/crtbegin.S b/sysdeps/sparc64/elf/crtbegin.S deleted file mode 100644 index fbd731cad0..0000000000 --- a/sysdeps/sparc64/elf/crtbegin.S +++ /dev/null @@ -1,49 +0,0 @@ -.section ".ctors",#alloc,#write - - .align 8 -__CTOR_LIST__: - .xword -1 - -.section ".dtors",#alloc,#write - - .align 8 -__DTOR_LIST__: - .xword -1 - -.section ".fini",#alloc,#execinstr - - call __do_global_dtors_aux - nop - -.text - - .align 4 - .type __do_global_dtors_aux,#function -__do_global_dtors_aux: - save %sp,-160,%sp - -#ifdef PIC -1: rd %pc, %g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 - or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 - add %l7, %g1, %l7 - sethi %hi(__DTOR_LIST__), %l0 - or %l0, %lo(__DTOR_LIST__), %l0 - ldx [%l7+%l0], %l0 -#else - sethi %hi(__DTOR_LIST__), %l0 - or %l0, %lo(__DTOR_LIST__), %l0 - add %l0, %g4, %l0 -#endif - - ba 3f - ldx [%l0+8], %l1 -2: jmpl %l1, %o7 - ldx [%l0+8], %l1 -3: brnz,pt %l1, 2b - add %l0, 8, %l0 - - ret - restore - - .size __do_global_dtors_aux,.-__do_global_dtors_aux diff --git a/sysdeps/sparc64/elf/crtbeginS.S b/sysdeps/sparc64/elf/crtbeginS.S deleted file mode 100644 index 7db4bc590e..0000000000 --- a/sysdeps/sparc64/elf/crtbeginS.S +++ /dev/null @@ -1 +0,0 @@ -#include "crtbegin.S" diff --git a/sysdeps/sparc64/elf/crtend.S b/sysdeps/sparc64/elf/crtend.S deleted file mode 100644 index ea69083d69..0000000000 --- a/sysdeps/sparc64/elf/crtend.S +++ /dev/null @@ -1,50 +0,0 @@ -.section ".ctors",#alloc,#write - - .align 8 -__CTOR_END__: - .xword 0 - -.section ".dtors",#alloc,#write - - .align 8 -__DTOR_END__: - .xword 0 - -.section ".init",#alloc,#execinstr - - call __do_global_ctors_aux - nop - -.text - - .align 4 - .type __do_global_ctors_aux,#function -__do_global_ctors_aux: - save %sp,-160,%sp - -#ifdef PIC -1: rd %pc, %g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 - or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 - add %l7, %g1, %l7 - sethi %hi(__CTOR_END__), %l0 - or %l0, %lo(__CTOR_END__), %l0 - ldx [%l7+%l0], %l0 -#else - sethi %hi(__CTOR_END__), %l0 - or %l0, %lo(__CTOR_END__), %l0 - add %l0, %g4, %l0 -#endif - - ba 3f - ldx [%l0+8], %l1 -2: jmpl %l1, %o7 - ldx [%l0+8], %l1 -3: addcc %l1, 1, %g0 - bnz,pt %xcc, 2b - add %l0, 8, %l0 - - ret - restore - - .size __do_global_ctors_aux,.-__do_global_ctors_aux diff --git a/sysdeps/sparc64/elf/crtendS.S b/sysdeps/sparc64/elf/crtendS.S deleted file mode 100644 index 56532f567d..0000000000 --- a/sysdeps/sparc64/elf/crtendS.S +++ /dev/null @@ -1 +0,0 @@ -#include "crtend.S" diff --git a/sysdeps/sparc64/elf/start.S b/sysdeps/sparc64/elf/start.S deleted file mode 100644 index 73f42367ee..0000000000 --- a/sysdeps/sparc64/elf/start.S +++ /dev/null @@ -1,93 +0,0 @@ -/* Startup code for elf64-sparc - Copyright (C) 1997 Free Software Foundation, Inc. - Contributed by Richard Henderson , 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - - - .section ".text" - .align 4 - .global _start - .type _start,#function -_start: - - /* First order of business is to load %g4 with our base address. */ - sethi %uhi(_start), %g4 - or %g4, %ulo(_start), %g4 - sllx %g4, 32, %g4 - - /* Terminate the stack frame, and reserve space for functions to - drop their arguments. */ - mov %g0, %fp - sub %sp, 6*8, %sp - - /* Save %g1. When starting a binary via the dynamic linker, %g1 - contains the address of the shared library termination function, - which we will register below with atexit() to be called by exit(). - If we are statically linked, this will be NULL. */ - - /* Do essential libc initialization (sp points to argc, argv, and envp) */ - call __libc_init_first - mov %g1, %l0 - - /* Now that we have the proper stack frame, register library termination - function, if there is any: */ - - brz,pn %l0, 1f - nop - call atexit - mov %l0, %o0 -1: - - /* Extract the arguments and environment as encoded on the stack. The - argument info starts after one register window (16 words) past the SP, - plus the bias we added, plus the magic v9 STACK_BIAS. */ - ldx [%sp+STACK_BIAS+22*8], %o0 - add %sp, STACK_BIAS+23*8, %o1 - sllx %o0, 3, %o2 - add %o2, %o1, %o2 - sethi %hi(__environ), %g2 - add %o2, 8, %o2 - add %g2, %g4, %g2 - stx %o2, [%g2+%lo(__environ)] - - mov %o0, %l0 /* tuck them away */ - mov %o1, %l1 - - /* Call _init, the entry point to our own .init section. */ - call _init - mov %o2, %l2 - - /* Register our .fini section with atexit. */ - sethi %hi(_fini), %o0 - add %o0, %g4, %o0 - call atexit - add %o0, %lo(_fini), %o0 - - /* Call the user's main and exit with its return value. */ - mov %l0, %o0 - mov %l1, %o1 - call main - mov %l2, %o2 - call exit - nop - - /* Die very horribly if exit returns. */ - illtrap 0 - - .size _start,.-_start diff --git a/sysdeps/sparc64/fpu_control.h b/sysdeps/sparc64/fpu_control.h deleted file mode 100644 index fd8abb19f1..0000000000 --- a/sysdeps/sparc64/fpu_control.h +++ /dev/null @@ -1,69 +0,0 @@ -/* FPU control word bits. SPARC v9 version. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _FPU_CONTROL_H -#define _FPU_CONTROL_H 1 - - -#include - -/* precision control */ -#define _FPU_EXTENDED 0x00000000 /* RECOMMENDED */ -#define _FPU_DOUBLE 0x20000000 -#define _FPU_80BIT 0x30000000 -#define _FPU_SINGLE 0x10000000 /* DO NOT USE */ - -/* rounding control / Sparc */ -#define _FPU_RC_DOWN 0xc0000000 -#define _FPU_RC_UP 0x80000000 -#define _FPU_RC_ZERO 0x40000000 -#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */ - -#define _FPU_RESERVED 0x30300000 /* Reserved bits in cw */ - - -/* Now two recommended cw */ - -/* Linux default: - - extended precision - - rounding to nearest - - no exceptions */ -#define _FPU_DEFAULT 0x0 - -/* IEEE: same as above */ -#define _FPU_IEEE 0x0 - -/* Type of the control word. */ -typedef unsigned long fpu_control_t; - -#define _FPU_GETCW(cw) __asm__ ("stx %%fsr,%0" : "=m" (*&cw)) -#define _FPU_SETCW(cw) __asm__ ("ldx %0,%%fsr" : : "m" (*&cw)) - -/* Default control word set at startup. */ -extern fpu_control_t __fpu_control; - -__BEGIN_DECLS - -/* Called at startup. It can be used to manipulate fpu control register. */ -extern void __setfpucw __P ((fpu_control_t)); - -__END_DECLS - -#endif /* fpu_control.h */ diff --git a/sysdeps/sparc64/gmp-mparam.h b/sysdeps/sparc64/gmp-mparam.h deleted file mode 100644 index a3c66974de..0000000000 --- a/sysdeps/sparc64/gmp-mparam.h +++ /dev/null @@ -1,27 +0,0 @@ -/* gmp-mparam.h -- Compiler/machine parameter header file. - -Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc. - -This file is part of the GNU MP Library. - -The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#define BITS_PER_MP_LIMB 64 -#define BYTES_PER_MP_LIMB 8 -#define BITS_PER_LONGINT 64 -#define BITS_PER_INT 32 -#define BITS_PER_SHORTINT 16 -#define BITS_PER_CHAR 8 diff --git a/sysdeps/sparc64/lshift.S b/sysdeps/sparc64/lshift.S deleted file mode 100644 index 1678991529..0000000000 --- a/sysdeps/sparc64/lshift.S +++ /dev/null @@ -1,96 +0,0 @@ -/* SPARC v9 __mpn_lshift -- - - Copyright (C) 1996 Free Software Foundation, Inc. - - This file is part of the GNU MP Library. - - The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. */ - -#include - -/* INPUT PARAMETERS - res_ptr %i0 - src_ptr %i1 - size %i2 - cnt %i3 */ - -ENTRY(__mpn_lshift) - save %sp, -128, %sp - - sllx %i2,3,%g1 - add %i1,%g1,%i1 ! make %i1 point at end of src - ldx [%i1-8],%g2 ! load first limb - sub %g0,%i3,%i5 ! negate shift count - add %i0,%g1,%i0 ! make %i0 point at end of res - add %i2,-1,%i2 - and %i2,4-1,%l4 ! number of limbs in first loop - srlx %g2,%i5,%g1 ! compute function result - brz,pn %l4,.L0 ! if multiple of 4 limbs, skip first loop - mov %g1,%l1 - - sub %i2,%l4,%i2 ! adjust count for main loop - -.Loop0: ldx [%i1-16],%g3 - add %i0,-8,%i0 - add %i1,-8,%i1 - add %l4,-1,%l4 - sllx %g2,%i3,%i4 - srlx %g3,%i5,%g1 - mov %g3,%g2 - or %i4,%g1,%i4 - brnz,pt %l4,.Loop0 - stx %i4,[%i0+0] - -.L0: brz,pn %i2,.Lend - nop - -.Loop: ldx [%i1-16],%g3 - add %i0,-32,%i0 - add %i2,-4,%i2 - sllx %g2,%i3,%i4 - srlx %g3,%i5,%g1 - - ldx [%i1-24],%g2 - sllx %g3,%i3,%l4 - or %i4,%g1,%i4 - stx %i4,[%i0+24] - srlx %g2,%i5,%g1 - - ldx [%i1-32],%g3 - sllx %g2,%i3,%i4 - or %l4,%g1,%l4 - stx %l4,[%i0+16] - srlx %g3,%i5,%g1 - - ldx [%i1-40],%g2 - sllx %g3,%i3,%l4 - or %i4,%g1,%i4 - stx %i4,[%i0+8] - srlx %g2,%i5,%g1 - - add %i1,-32,%i1 - or %l4,%g1,%l4 - brnz,pt %i2,.Loop - stx %l4,[%i0+0] - -.Lend: sllx %g2,%i3,%g2 - stx %g2,[%i0-8] - - mov %l1,%i0 - jmpl %i7+8, %g0 - restore - -END(__mpn_lshift) diff --git a/sysdeps/sparc64/mul_1.S b/sysdeps/sparc64/mul_1.S deleted file mode 100644 index 87e441d7eb..0000000000 --- a/sysdeps/sparc64/mul_1.S +++ /dev/null @@ -1,84 +0,0 @@ -/* SPARC v9 __mpn_mul_1 -- Multiply a limb vector with a single limb and - store the product in a second limb vector. - - Copyright (C) 1995, 1996 Free Software Foundation, Inc. - - This file is part of the GNU MP Library. - - The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. */ - -#include - - -/* INPUT PARAMETERS - res_ptr o0 - s1_ptr o1 - size o2 - s2_limb o3 */ - -ENTRY(__mpn_mul_1) - !#PROLOGUE# 0 - save %sp,-128,%sp - !#PROLOGUE# 1 - - sub %g0,%i2,%o7 - sllx %o7,3,%g5 - sub %i1,%g5,%o3 - sub %i0,%g5,%o4 - mov 0,%o0 ! zero cy_limb - - srl %i3,0,%o1 ! extract low 32 bits of s2_limb - srlx %i3,32,%i3 ! extract high 32 bits of s2_limb - mov 1,%o2 - sllx %o2,32,%o2 ! o2 = 0x100000000 - - ! hi ! - ! mid-1 ! - ! mid-2 ! - ! lo ! -.Loop: - sllx %o7,3,%g1 - ldx [%o3+%g1],%g5 - srl %g5,0,%i0 ! zero hi bits - srlx %g5,32,%g5 - mulx %o1,%i0,%i4 ! lo product - mulx %i3,%i0,%i1 ! mid-1 product - mulx %o1,%g5,%l2 ! mid-2 product - mulx %i3,%g5,%i5 ! hi product - srlx %i4,32,%i0 ! extract high 32 bits of lo product... - add %i1,%i0,%i1 ! ...and add it to the mid-1 product - addcc %i1,%l2,%i1 ! add mid products - mov 0,%l0 ! we need the carry from that add... - movcs %xcc,%o2,%l0 ! ...compute it and... - add %i5,%l0,%i5 ! ...add to bit 32 of the hi product - sllx %i1,32,%i0 ! align low bits of mid product - srl %i4,0,%g5 ! zero high 32 bits of lo product - add %i0,%g5,%i0 ! combine into low 64 bits of result - srlx %i1,32,%i1 ! extract high bits of mid product... - add %i5,%i1,%i1 ! ...and add them to the high result - addcc %i0,%o0,%i0 ! add cy_limb to low 64 bits of result - mov 0,%g5 - movcs %xcc,1,%g5 - add %o7,1,%o7 - stx %i0,[%o4+%g1] - brnz %o7,.Loop - add %i1,%g5,%o0 ! compute new cy_limb - - mov %o0,%i0 - jmpl %i7+8,%g0 - restore - -END(__mpn_mul_1) diff --git a/sysdeps/sparc64/rshift.S b/sysdeps/sparc64/rshift.S deleted file mode 100644 index e1b3aca112..0000000000 --- a/sysdeps/sparc64/rshift.S +++ /dev/null @@ -1,93 +0,0 @@ -/* SPARC v9 __mpn_rshift -- - - Copyright (C) 1996 Free Software Foundation, Inc. - - This file is part of the GNU MP Library. - - The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. */ - -#include - -/* INPUT PARAMETERS - res_ptr %i0 - src_ptr %i1 - size %i2 - cnt %i3 */ - -ENTRY(__mpn_rshift) - save %sp, -128, %sp - - ldx [%i1],%g2 ! load first limb - sub %g0,%i3,%i5 ! negate shift count - add %i2,-1,%i2 - and %i2,4-1,%l4 ! number of limbs in first loop - sllx %g2,%i5,%g1 ! compute function result - brz,pn %l4,.L0 ! if multiple of 4 limbs, skip first loop - mov %g1,%l1 - - sub %i2,%l4,%i2 ! adjust count for main loop - -.Loop0: ldx [%i1+8],%g3 - add %i0,8,%i0 - add %i1,8,%i1 - add %l4,-1,%l4 - srlx %g2,%i3,%i4 - sllx %g3,%i5,%g1 - mov %g3,%g2 - or %i4,%g1,%i4 - brnz,pt %l4,.Loop0 - stx %i4,[%i0-8] - -.L0: brz,pn %i2,.Lend - nop - -.Loop: ldx [%i1+8],%g3 - add %i0,32,%i0 - add %i2,-4,%i2 - srlx %g2,%i3,%i4 - sllx %g3,%i5,%g1 - - ldx [%i1+16],%g2 - srlx %g3,%i3,%l4 - or %i4,%g1,%i4 - stx %i4,[%i0-32] - sllx %g2,%i5,%g1 - - ldx [%i1+24],%g3 - srlx %g2,%i3,%i4 - or %l4,%g1,%l4 - stx %l4,[%i0-24] - sllx %g3,%i5,%g1 - - ldx [%i1+32],%g2 - srlx %g3,%i3,%l4 - or %i4,%g1,%i4 - stx %i4,[%i0-16] - sllx %g2,%i5,%g1 - - add %i1,32,%i1 - or %l4,%g1,%l4 - brnz %i2,.Loop - stx %l4,[%i0-8] - -.Lend: srlx %g2,%i3,%g2 - stx %g2,[%i0-0] - - mov %l1,%i0 - jmpl %i7+8,%g0 - restore - -END(__mpn_rshift) diff --git a/sysdeps/sparc64/sub_n.S b/sysdeps/sparc64/sub_n.S deleted file mode 100644 index 93f8a8235d..0000000000 --- a/sysdeps/sparc64/sub_n.S +++ /dev/null @@ -1,55 +0,0 @@ -/* SPARC v9 __mpn_sub_n -- Subtract two limb vectors of the same length > 0 - and store difference in a third limb vector. - - Copyright (C) 1995, 1996 Free Software Foundation, Inc. - - This file is part of the GNU MP Library. - - The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. */ - -#include - -/* INPUT PARAMETERS - res_ptr %o0 - s1_ptr %o1 - s2_ptr %o2 - size %o3 */ - -ENTRY(__mpn_sub_n) - - sub %g0,%o3,%g3 - sllx %o3,3,%g1 - add %o1,%g1,%o1 ! make s1_ptr point at end - add %o2,%g1,%o2 ! make s2_ptr point at end - add %o0,%g1,%o0 ! make res_ptr point at end - mov 0,%o4 ! clear carry variable - sllx %g3,3,%o5 ! compute initial address index - -1: ldx [%o2+%o5],%g1 ! load s2 limb - add %g3,1,%g3 ! increment loop count - ldx [%o1+%o5],%g2 ! load s1 limb - addcc %g1,%o4,%g1 ! add s2 limb and carry variable - movcc %xcc,0,%o4 ! if carry-out, o4 was 1; clear it - subcc %g1,%g2,%g1 ! subtract s1 limb from sum - stx %g1,[%o0+%o5] ! store result - add %o5,8,%o5 ! increment address index - brnz,pt %g3,1b - movcs %xcc,1,%o4 ! if s1 subtract gave carry, record it - - retl - mov %o4,%o0 - -END(__mpn_sub_n) diff --git a/sysdeps/sparc64/submul_1.S b/sysdeps/sparc64/submul_1.S deleted file mode 100644 index 3cc0e3bb08..0000000000 --- a/sysdeps/sparc64/submul_1.S +++ /dev/null @@ -1,87 +0,0 @@ -/* SPARC v9 __mpn_submul_1 -- Multiply a limb vector with a single limb and - subtract the product from a second limb vector. - - Copyright (C) 1996 Free Software Foundation, Inc. - - This file is part of the GNU MP Library. - - The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to - the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. */ - -#include - - -/* INPUT PARAMETERS - res_ptr o0 - s1_ptr o1 - size o2 - s2_limb o3 */ - -ENTRY(__mpn_submul_1) - !#PROLOGUE# 0 - save %sp,-128,%sp - !#PROLOGUE# 1 - - sub %g0,%i2,%o7 - sllx %o7,3,%g5 - sub %i1,%g5,%o3 - sub %i0,%g5,%o4 - mov 0,%o0 ! zero cy_limb - - srl %i3,0,%o1 ! extract low 32 bits of s2_limb - srlx %i3,32,%i3 ! extract high 32 bits of s2_limb - mov 1,%o2 - sllx %o2,32,%o2 ! o2 = 0x100000000 - - ! hi ! - ! mid-1 ! - ! mid-2 ! - ! lo ! -.Loop: - sllx %o7,3,%g1 - ldx [%o3+%g1],%g5 - srl %g5,0,%i0 ! zero hi bits - srlx %g5,32,%g5 - mulx %o1,%i0,%i4 ! lo product - mulx %i3,%i0,%i1 ! mid-1 product - mulx %o1,%g5,%l2 ! mid-2 product - mulx %i3,%g5,%i5 ! hi product - srlx %i4,32,%i0 ! extract high 32 bits of lo product... - add %i1,%i0,%i1 ! ...and add it to the mid-1 product - addcc %i1,%l2,%i1 ! add mid products - mov 0,%l0 ! we need the carry from that add... - movcs %xcc,%o2,%l0 ! ...compute it and... - add %i5,%l0,%i5 ! ...add to bit 32 of the hi product - sllx %i1,32,%i0 ! align low bits of mid product - srl %i4,0,%g5 ! zero high 32 bits of lo product - add %i0,%g5,%i0 ! combine into low 64 bits of result - srlx %i1,32,%i1 ! extract high bits of mid product... - add %i5,%i1,%i1 ! ...and add them to the high result - addcc %i0,%o0,%i0 ! add cy_limb to low 64 bits of result - mov 0,%g5 - movcs %xcc,1,%g5 - add %o7,1,%o7 - ldx [%o4+%g1],%l1 - subcc %l1,%i0,%i0 - movcs %xcc,1,%g5 - stx %i0,[%o4+%g1] - brnz %o7,.Loop - add %i1,%g5,%o0 ! compute new cy_limb - - mov %o0,%i0 - jmpl %i7+8,%g0 - restore - -END(__mpn_submul_1) diff --git a/sysdeps/stub/accept.c b/sysdeps/stub/accept.c index 8f65f5fe7b..c27070c0b1 100644 --- a/sysdeps/stub/accept.c +++ b/sysdeps/stub/accept.c @@ -28,7 +28,7 @@ int accept (fd, addr, addr_len) int fd; __SOCKADDR_ARG addr; - size_t *addr_len; + socklen_t *addr_len; { __set_errno (ENOSYS); return -1; diff --git a/sysdeps/stub/bind.c b/sysdeps/stub/bind.c index bfd2888138..7e7f0d70b7 100644 --- a/sysdeps/stub/bind.c +++ b/sysdeps/stub/bind.c @@ -24,7 +24,7 @@ int bind (fd, addr, len) int fd; __CONST_SOCKADDR_ARG addr; - size_t len; + socklen_t len; { __set_errno (ENOSYS); return -1; diff --git a/sysdeps/stub/bits/string.h b/sysdeps/stub/bits/string.h index bd1b77409d..ad68b038b6 100644 --- a/sysdeps/stub/bits/string.h +++ b/sysdeps/stub/bits/string.h @@ -1,4 +1,4 @@ -/* This file should provide inline versions of math functions. +/* This file should provide inline versions of string functions. Surround GCC-specific parts with #ifdef __GNUC__, and use `extern __inline'. diff --git a/sysdeps/stub/connect.c b/sysdeps/stub/connect.c index 9152a9449c..fb8b50341a 100644 --- a/sysdeps/stub/connect.c +++ b/sysdeps/stub/connect.c @@ -27,12 +27,11 @@ int __connect (fd, addr, len) int fd; __CONST_SOCKADDR_ARG addr; - size_t len; + socklen_t len; { __set_errno (ENOSYS); return -1; } weak_alias (__connect, connect) - stub_warning (connect) diff --git a/sysdeps/stub/getsockname.c b/sysdeps/stub/getsockname.c index 0706e59b8f..f0d46dbc3c 100644 --- a/sysdeps/stub/getsockname.c +++ b/sysdeps/stub/getsockname.c @@ -24,7 +24,7 @@ int getsockname (fd, addr, len) int fd; __SOCKADDR_ARG addr; - size_t *len; + socklen_t *len; { __set_errno (ENOSYS); return -1; diff --git a/sysdeps/stub/getsockopt.c b/sysdeps/stub/getsockopt.c index d06b3e66e3..6f3c866b46 100644 --- a/sysdeps/stub/getsockopt.c +++ b/sysdeps/stub/getsockopt.c @@ -28,11 +28,10 @@ getsockopt (fd, level, optname, optval, optlen) int level; int optname; void *optval; - size_t *optlen; + socklen_t *optlen; { __set_errno (ENOSYS); return -1; } - stub_warning (getsockopt) diff --git a/sysdeps/stub/recvfrom.c b/sysdeps/stub/recvfrom.c index d759c3d0a1..931bdbb1b5 100644 --- a/sysdeps/stub/recvfrom.c +++ b/sysdeps/stub/recvfrom.c @@ -29,11 +29,10 @@ recvfrom (fd, buf, n, flags, addr, addr_len) size_t n; int flags; __SOCKADDR_ARG addr; - size_t *addr_len; + socklen_t *addr_len; { __set_errno (ENOSYS); return -1; } - stub_warning (recvfrom) diff --git a/sysdeps/stub/sendto.c b/sysdeps/stub/sendto.c index d09efba513..47dad95dbd 100644 --- a/sysdeps/stub/sendto.c +++ b/sysdeps/stub/sendto.c @@ -28,11 +28,10 @@ sendto (fd, buf, n, flags, addr, addr_len) size_t n; int flags; __CONST_SOCKADDR_ARG addr; - size_t addr_len; + socklen_t addr_len; { __set_errno (ENOSYS); return -1; } - stub_warning (sendto) diff --git a/sysdeps/stub/setsockopt.c b/sysdeps/stub/setsockopt.c index b1c02a154b..5fad292a57 100644 --- a/sysdeps/stub/setsockopt.c +++ b/sysdeps/stub/setsockopt.c @@ -28,11 +28,10 @@ setsockopt (fd, level, optname, optval, optlen) int level; int optname; void *optval; - size_t optlen; + socklen_t optlen; { __set_errno (ENOSYS); return -1; } - stub_warning (setsockopt) diff --git a/sysdeps/unix/bsd/osf/bits/sigaction.h b/sysdeps/unix/bsd/osf/bits/sigaction.h index df400d4aaa..56e28a04fb 100644 --- a/sysdeps/unix/bsd/osf/bits/sigaction.h +++ b/sysdeps/unix/bsd/osf/bits/sigaction.h @@ -1,5 +1,5 @@ /* Structure and constant definitions for sigaction et al. OSF/1 version. - Copyright (C) 1993, 1996 Free Software Foundation, Inc. + Copyright (C) 1993, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Brendan Kehoe (brendan@zen.org). @@ -33,9 +33,9 @@ struct sigaction /* Bits in `sa_flags'. */ #ifdef __USE_BSD -#define SA_ONSTACK 0x1 /* Take signal on signal stack. */ -#define SA_RESTART 0x2 /* Don't restart syscall on signal return. */ -#define SA_DISABLE 0x4 /* Disable alternate signal stack. */ +# define SA_ONSTACK 0x1 /* Take signal on signal stack. */ +# define SA_RESTART 0x2 /* Restart syscall on signal return. */ +# define SA_DISABLE 0x4 /* Disable alternate signal stack. */ #endif #define SA_NOCLDSTOP 0x4 /* Don't send SIGCHLD when children stop. */ diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index ed9ae873fd..ea1ab49fd4 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -11,7 +11,7 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h sys/mtio.h \ sys/module.h sys/io.h sys/klog.h sys/kdaemon.h \ sys/user.h sys/sysmacros.h sys/procfs.h \ sys/debugreg.h sys/kd.h sys/soundcard.h sys/vt.h \ - sys/quota.h sys/fsuid.h + sys/quota.h sys/fsuid.h bits/mman.h install-others += $(inst_includedir)/bits/syscall.h diff --git a/sysdeps/unix/sysv/linux/alpha/bits/sigaction.h b/sysdeps/unix/sysv/linux/alpha/bits/sigaction.h index e2e97bd70c..f28b6f256c 100644 --- a/sysdeps/unix/sysv/linux/alpha/bits/sigaction.h +++ b/sysdeps/unix/sysv/linux/alpha/bits/sigaction.h @@ -31,21 +31,21 @@ struct sigaction }; /* Bits in `sa_flags'. */ -#define SA_NOCLDSTOP 0x00000004 /* Don't send SIGCHLD when children stop. */ +#define SA_NOCLDSTOP 0x00000004 /* Don't send SIGCHLD when children stop. */ #ifdef __USE_MISC -#define SA_STACK 0x00000001 /* Use signal stack by using `sa_restorer'. */ -#define SA_RESTART 0x00000002 /* Don't restart syscall on signal return. */ -#define SA_INTERRUPT 0x20000000 /* Historical no-op. */ -#define SA_NOMASK 0x00000008 /* Don't automatically block the signal when - its handler is being executed. */ -#define SA_ONESHOT 0x00000010 /* Reset to SIG_DFL on entry to handler. */ +# define SA_STACK 0x00000001 /* Use signal stack by using `sa_restorer'. */ +# define SA_RESTART 0x00000002 /* Restart syscall on signal return. */ +# define SA_INTERRUPT 0x20000000 /* Historical no-op. */ +# define SA_NOMASK 0x00000008 /* Don't automatically block the signal + when its handler is being executed. */ +# define SA_ONESHOT 0x00000010 /* Reset to SIG_DFL on entry to handler. */ /* Some aliases for the SA_ constants. */ -#define SA_NODEFER SA_NOMASK -#define SA_RESETHAND SA_ONESHOT +# define SA_NODEFER SA_NOMASK +# define SA_RESETHAND SA_ONESHOT #endif /* Values for the HOW argument to `sigprocmask'. */ -#define SIG_BLOCK 1 /* Block signals. */ -#define SIG_UNBLOCK 2 /* Unblock signals. */ -#define SIG_SETMASK 3 /* Set the set of blocked signals. */ +#define SIG_BLOCK 1 /* Block signals. */ +#define SIG_UNBLOCK 2 /* Unblock signals. */ +#define SIG_SETMASK 3 /* Set the set of blocked signals. */ diff --git a/sysdeps/unix/sysv/linux/bits/sigaction.h b/sysdeps/unix/sysv/linux/bits/sigaction.h index 13a6a03248..247b53499e 100644 --- a/sysdeps/unix/sysv/linux/bits/sigaction.h +++ b/sysdeps/unix/sysv/linux/bits/sigaction.h @@ -1,5 +1,5 @@ /* The proper definitions for Linux's sigaction. - Copyright (C) 1993, 1994, 1995, 1996 Free Software Foundation, Inc. + Copyright (C) 1993, 1994, 1995, 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -34,21 +34,21 @@ struct sigaction }; /* Bits in `sa_flags'. */ -#define SA_NOCLDSTOP 1 /* Don't send SIGCHLD when children stop. */ +#define SA_NOCLDSTOP 1 /* Don't send SIGCHLD when children stop. */ #ifdef __USE_MISC -#define SA_STACK 0x08000000 /* Use signal stack by using `sa_restorer'. */ -#define SA_RESTART 0x10000000 /* Don't restart syscall on signal return. */ -#define SA_INTERRUPT 0x20000000 /* Historical no-op. */ -#define SA_NODEFER 0x40000000 /* Don't automatically block the signal when - its handler is being executed. */ -#define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler. */ +# define SA_STACK 0x08000000 /* Use signal stack by using `sa_restorer'. */ +# define SA_RESTART 0x10000000 /* Restart syscall on signal return. */ +# define SA_INTERRUPT 0x20000000 /* Historical no-op. */ +# define SA_NODEFER 0x40000000 /* Don't automatically block the signal when + its handler is being executed. */ +# define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler. */ /* Some aliases for the SA_ constants. */ -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND +# define SA_NOMASK SA_NODEFER +# define SA_ONESHOT SA_RESETHAND #endif /* Values for the HOW argument to `sigprocmask'. */ -#define SIG_BLOCK 0 /* Block signals. */ -#define SIG_UNBLOCK 1 /* Unblock signals. */ -#define SIG_SETMASK 2 /* Set the set of blocked signals. */ +#define SIG_BLOCK 0 /* Block signals. */ +#define SIG_UNBLOCK 1 /* Unblock signals. */ +#define SIG_SETMASK 2 /* Set the set of blocked signals. */ diff --git a/sysdeps/unix/sysv/linux/if_index.c b/sysdeps/unix/sysv/linux/if_index.c index f64fe1e1ca..615a81d14a 100644 --- a/sysdeps/unix/sysv/linux/if_index.c +++ b/sysdeps/unix/sysv/linux/if_index.c @@ -68,20 +68,21 @@ if_nametoindex (const char *ifname) { #ifndef SIOGIFINDEX __set_errno (ENOSYS); + return 0; #else struct ifreq ifr; - int rc; int fd = opensock (); if (fd < 0) return 0; strncpy (ifr.ifr_name, ifname, sizeof (ifr.ifr_name)); - rc = ioctl (fd, SIOGIFINDEX, &ifr); - if (rc < 0) + if (ioctl (fd, SIOGIFINDEX, &ifr) < 0) { + int saved_errno = errno; close (fd); - __set_errno (rc == -EINVAL ? ENOSYS : -rc); + if (saved_errno == EINVAL) + __set_errno (ENOSYS); return 0; } close (fd); @@ -109,7 +110,6 @@ if_nameindex (void) __set_errno (ENOSYS); return NULL; #else - int rc; int fd = opensock (); struct ifconf ifc; unsigned int rq_ifs = 4, nifs, i; @@ -153,12 +153,13 @@ if_nameindex (void) goto jump; } strcpy (idx[i].if_name, ifr->ifr_name); - rc = ioctl (fd, SIOGIFINDEX, ifr); - if (rc < 0) + if (ioctl (fd, SIOGIFINDEX, ifr) < 0) { + int saved_errno = errno; free (idx); idx = NULL; - __set_errno (rc == -EINVAL ? ENOSYS : -rc); + if (saved_errno == EINVAL) + __set_errno (ENOSYS); goto jump; } idx[i].if_index = ifr->ifr_ifindex; diff --git a/sysdeps/unix/sysv/linux/m68k/bits/mman.h b/sysdeps/unix/sysv/linux/m68k/bits/mman.h new file mode 100644 index 0000000000..d6c29d2176 --- /dev/null +++ b/sysdeps/unix/sysv/linux/m68k/bits/mman.h @@ -0,0 +1,75 @@ +/* Definitions for POSIX memory map inerface. Linux/m68k version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SYS_MMAN_H +# error "Never include this file directly. Use 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. */ + +/* 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. */ +# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +# define MAP_LOCKED 0x2000 /* Lock the mapping. */ +# 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 diff --git a/sysdeps/unix/sysv/linux/mips/bits/sigaction.h b/sysdeps/unix/sysv/linux/mips/bits/sigaction.h index 66c58cc540..d6f70f2a2e 100644 --- a/sysdeps/unix/sysv/linux/mips/bits/sigaction.h +++ b/sysdeps/unix/sysv/linux/mips/bits/sigaction.h @@ -39,24 +39,24 @@ struct sigaction }; /* Bits in `sa_flags'. */ -#define SA_NOCLDSTOP 1 /* Don't send SIGCHLD when children stop. */ +#define SA_NOCLDSTOP 1 /* Don't send SIGCHLD when children stop. */ #ifdef __USE_MISC -#define SA_STACK 0x08000000 /* Use signal stack by using `sa_restorer'. */ -#define SA_RESTART 0x10000000 /* Don't restart syscall on signal return. */ -#define SA_INTERRUPT 0x20000000 /* Historical no-op. */ -#define SA_NODEFER 0x40000000 /* Don't automatically block the signal when - its handler is being executed. */ -#define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler. */ +# define SA_STACK 0x08000000 /* Use signal stack by using `sa_restorer'. */ +# define SA_RESTART 0x10000000 /* Restart syscall on signal return. */ +# define SA_INTERRUPT 0x20000000 /* Historical no-op. */ +# define SA_NODEFER 0x40000000 /* Don't automatically block the signal when + its handler is being executed. */ +# define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler. */ /* Some aliases for the SA_ constants. */ -#define SA_NOMASK SA_NODEFER -#define SA_ONESHOT SA_RESETHAND +# define SA_NOMASK SA_NODEFER +# define SA_ONESHOT SA_RESETHAND #endif /* Values for the HOW argument to `sigprocmask'. */ -#define SIG_NOP 0 /* 0 is unused to catch errors */ -#define SIG_BLOCK 1 /* Block signals. */ -#define SIG_UNBLOCK 2 /* Unblock signals. */ -#define SIG_SETMASK 3 /* Set the set of blocked signals. */ -#define SIG_SETMASK32 256 /* Goodie from SGI for BSD compatibility: +#define SIG_NOP 0 /* 0 is unused to catch errors */ +#define SIG_BLOCK 1 /* Block signals. */ +#define SIG_UNBLOCK 2 /* Unblock signals. */ +#define SIG_SETMASK 3 /* Set the set of blocked signals. */ +#define SIG_SETMASK32 256 /* Goodie from SGI for BSD compatibility: set only the low 32 bit of the sigset. */ diff --git a/sysdeps/unix/sysv/linux/sparc/Dist b/sysdeps/unix/sysv/linux/sparc/Dist deleted file mode 100644 index 9729f0709b..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/Dist +++ /dev/null @@ -1,8 +0,0 @@ -__sigtrampoline.S -bits/mman.h -clone.S -pipe.S -fork.S -kernel_stat.h -init-first.h -sys/trap.h diff --git a/sysdeps/unix/sysv/linux/sparc/Makefile b/sysdeps/unix/sysv/linux/sparc/Makefile deleted file mode 100644 index 4cbd3bd004..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -ifeq ($(subdir),signal) -sysdep_routines += __sigtrampoline -endif - -asm-CPPFLAGS=-D__ASSEMBLY__ -as-FLAGS-.so=-fPIC - -# When I get this to work, this is the right thing -ifeq ($(subdir),elf) -CFLAGS-rtld.c += -mv8 -#rtld-routines += dl-sysdepsparc -endif # elf diff --git a/sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S b/sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S deleted file mode 100644 index a639511f3e..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S +++ /dev/null @@ -1,143 +0,0 @@ -/* Userland trampoline code for sigaction on Linux/SPARC */ -/* (C) 1996, 1997 Free Software Foundation, Inc. */ -/* This file is part of the GNU C Library. */ -/* Contributed by Miguel de Icaza (miguel@gnu.ai.mit.edu) */ -/* Many thanks go to David Miller for explaining all this to me */ -/* miguel@nuclecu.unam.mx */ -/* Sources: David Miller, 4.4BSD/SPARC code */ - -#include -#define __ASSEMBLY__ -/* For REGWIN_SZ */ -#include -#include - -/* The C compiler frame size */ -#define CCFSZ 96 - - .text - -ENTRY(____sparc_signal_trampoline) - .global C_SYMBOL_NAME(____sig_table) - - /* Make room for 32 %f registers + %fsr - * this is 132 bytes + alignement = 136 - * 96 is the C frame size - */ - save %sp,-136-CCFSZ,%sp - - /* save regular registers */ - mov %g2,%l2 - mov %g3,%l3 - mov %g4,%l4 - mov %g5,%l5 - mov %g6,%l6 - mov %g7,%l7 - - /* save fpu registers */ - ld [%fp+64+16+20],%l0 /* load the psr from sigcontext */ - sethi %hi(PSR_EF),%l1 - andcc %l0,%l1,%l0 /* is floating point enabled? */ - be 1f - rd %y,%l1 /* save y anyways */ - - /* save fpu registers */ - st %fsr, [%sp + CCFSZ + 0] - std %f0, [%sp + CCFSZ + 8] - std %f2, [%sp + CCFSZ + 16] - std %f4, [%sp + CCFSZ + 24] - std %f6, [%sp + CCFSZ + 32] - std %f8, [%sp + CCFSZ + 40] - std %f10, [%sp + CCFSZ + 48] - std %f12, [%sp + CCFSZ + 56] - std %f14, [%sp + CCFSZ + 64] - std %f16, [%sp + CCFSZ + 72] - std %f18, [%sp + CCFSZ + 80] - std %f20, [%sp + CCFSZ + 88] - std %f22, [%sp + CCFSZ + 96] - std %f24, [%sp + CCFSZ + 104] - std %f26, [%sp + CCFSZ + 112] - std %f28, [%sp + CCFSZ + 120] - std %f30, [%sp + CCFSZ + 128] - -1: - /* Load signal number */ - ld [%fp + REGWIN_SZ],%o0 - mov %fp,%o1 - mov 0xfea,%o2 - - /* Sanity check */ - cmp %o0,33 - bl 1f - or %g0,%g0,%g1 /*Call sys_setup */ - t 0x10 -1: -#ifdef PIC - /* Save return address */ - mov %o7,%o4 -___sxx: - call ___syy - nop -___syy: - sethi %hi(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5 - or %o5,%lo(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5 - add %o7,%o5,%o5 - /* restore return address */ - mov %o4,%o7 - mov %o5,%o4 - /* o4 has the GOT pointer */ -#endif - sethi %hi(C_SYMBOL_NAME(____sig_table)),%o5 - or %o5,%lo(C_SYMBOL_NAME(____sig_table)),%o5 -#ifdef PIC - add %o5,%o4,%o4 - ld [%o4],%o5 -#endif - sll %o0,2,%o4 - add %o5,%o4,%o4 - ld [%o4],%o4 - ld [%fp + REGWIN_SZ + 4],%o1 /* Load subcode */ - ld [%fp + REGWIN_SZ + 8],%o2 /* pointer to sigcontext */ - call %o4 - ld [%fp + REGWIN_SZ + 12],%o3 /* Address where signal ocurre - */ - - /* handler returned, restore state */ - tst %l0 - be 1f - wr %l1,%g0,%y - - /* fpu restoration */ - ld [%sp + CCFSZ + 0], %fsr - ldd [%sp + CCFSZ + 8], %f0 - ldd [%sp + CCFSZ + 16], %f2 - ldd [%sp + CCFSZ + 24], %f4 - ldd [%sp + CCFSZ + 32], %f6 - ldd [%sp + CCFSZ + 40], %f8 - ldd [%sp + CCFSZ + 48], %f10 - ldd [%sp + CCFSZ + 56], %f12 - ldd [%sp + CCFSZ + 64], %f14 - ldd [%sp + CCFSZ + 72], %f16 - ldd [%sp + CCFSZ + 80], %f18 - ldd [%sp + CCFSZ + 88], %f20 - ldd [%sp + CCFSZ + 96], %f22 - ldd [%sp + CCFSZ + 104], %f24 - ldd [%sp + CCFSZ + 112], %f26 - ldd [%sp + CCFSZ + 120], %f28 - ldd [%sp + CCFSZ + 128], %f30 - -1: - mov %l2,%g2 - mov %l3,%g3 - mov %l4,%g4 - mov %l5,%g5 - mov %l6,%g6 - mov %l7,%g7 - - /* call sigreturn */ - restore %g0,SYS_ify(sigreturn),%g1 /* register back and set syscal */ - add %sp,64+16,%o0 - t 0x10 - /* if we return, sysreturn failed */ - mov SYS_ify(exit),%g1 - t 0x10 diff --git a/sysdeps/unix/sysv/linux/sparc/bits/mman.h b/sysdeps/unix/sysv/linux/sparc/bits/mman.h deleted file mode 100644 index 3e7f2900fa..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/bits/mman.h +++ /dev/null @@ -1,77 +0,0 @@ -/* Definitions for POSIX memory map inerface. Linux/SPARC version. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _SYS_MMAN_H -# error "Never include this file directly. Use 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. */ - -/* 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 0x0100 /* Stack-like segment. */ -# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ -# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ -# define MAP_LOCKED 0x0100 /* Lock the mapping. */ -# define MAP_NORESERVE 0x0040 /* Don't check for reservations. */ -# define _MAP_NEW 0x80000000 /* Binary compatibility with SunOS. */ -#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 -#endif diff --git a/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h b/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h index 19aa7e39cb..13471995b9 100644 --- a/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h +++ b/sysdeps/unix/sysv/linux/sparc/bits/sigaction.h @@ -27,26 +27,29 @@ struct sigaction __sigset_t sa_mask; /* Special flags. */ - unsigned int sa_flags; + unsigned long sa_flags; + + /* Not used by Linux/Sparc yet. */ + void (*sa_restorer)(void); }; /* Bits in `sa_flags'. */ -#define SA_NOCLDSTOP 0x00000008 /* Don't send SIGCHLD when children stop. */ +#define SA_NOCLDSTOP 0x00000008 /* Don't send SIGCHLD when children stop. */ #ifdef __USE_MISC -#define SA_STACK 0x00000001 /* Use signal stack by using `sa_restorer'. */ -#define SA_RESTART 0x00000002 /* Don't restart syscall on signal return. */ -#define SA_INTERRUPT 0x00000010 /* Historical no-op. */ -#define SA_NOMASK 0x00000020 /* Don't automatically block the signal when - its handler is being executed. */ -#define SA_ONESHOT 0x00000004 /* Reset to SIG_DFL on entry to handler. */ +# define SA_STACK 0x00000001 /* Use signal stack by using `sa_restorer'. */ +# define SA_RESTART 0x00000002 /* Restart syscall on signal return. */ +# define SA_INTERRUPT 0x00000010 /* Historical no-op. */ +# define SA_NOMASK 0x00000020 /* Don't automatically block the signal when + its handler is being executed. */ +# define SA_ONESHOT 0x00000004 /* Reset to SIG_DFL on entry to handler. */ /* Some aliases for the SA_ constants. */ -#define SA_NODEFER SA_NOMASK -#define SA_RESETHAND SA_ONESHOT +# define SA_NODEFER SA_NOMASK +# define SA_RESETHAND SA_ONESHOT #endif /* Values for the HOW argument to `sigprocmask'. */ -#define SIG_BLOCK 1 /* Block signals. */ -#define SIG_UNBLOCK 2 /* Unblock signals. */ -#define SIG_SETMASK 4 /* Set the set of blocked signals. */ +#define SIG_BLOCK 1 /* Block signals. */ +#define SIG_UNBLOCK 2 /* Unblock signals. */ +#define SIG_SETMASK 4 /* Set the set of blocked signals. */ diff --git a/sysdeps/unix/sysv/linux/sparc/brk.c b/sysdeps/unix/sysv/linux/sparc/brk.c deleted file mode 100644 index 8f079bf444..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/brk.c +++ /dev/null @@ -1,56 +0,0 @@ -/* brk system call for Linux/SPARC. - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx) - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include -#include - -/* This must be initialized data because commons can't have aliases. */ -void *__curbrk = 0; - -/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt - to work around different old braindamage in the old Linux ELF dynamic - linker. */ -weak_alias (__curbrk, ___brk_addr) - -int -__brk (void *addr) -{ - void *newbrk, *scratch; - - asm ("mov %1, %%g1\n\t" - "mov %2, %%o0\n\t" - "t 0x10\n\t" - "mov %%o0, %0\n\t" - : "=r" (newbrk) - : "0" (__NR_brk), "r" (addr) - : "g1", "o0"); - - __curbrk = newbrk; - - if (newbrk < addr) - { - __set_errno (ENOMEM); - return -1; - } - - return 0; -} -weak_alias (__brk, brk) diff --git a/sysdeps/unix/sysv/linux/sparc/clone.S b/sysdeps/unix/sysv/linux/sparc/clone.S deleted file mode 100644 index 64735e9dbc..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/clone.S +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. - Contributed by Richard Henderson (rth@tamu.edu). - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* clone() is even more special than fork() as it mucks with stacks - and invokes a function in the right context after its all over. */ - -#include -#include - -/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ - - .text - .align 4 - .globl __libc_clone - .type __libc_clone,@function - .weak clone - __clone = __libc_clone - clone = __libc_clone - -__libc_clone: - save %sp,-96,%sp - - /* sanity check arguments */ - tst %i0 - be __clone_syscall_error - tst %i1 - be __clone_syscall_error - nop - - /* Do the system call */ - mov %i1,%o1 - mov %i2,%o0 - set __NR_clone,%g1 - ta 0x10 - bcs __clone_syscall_error - tst %o1 - bne __thread_start - nop - mov %o0,%i0 - ret - restore - -__clone_syscall_error: - call __errno_location - set EINVAL,%i0 - st %i0,[%o0] - mov -1,%i0 - ret - restore - -__thread_start: - call %i0 - mov %i3,%o0 - call _exit,0 - nop diff --git a/sysdeps/unix/sysv/linux/sparc/fork.S b/sysdeps/unix/sysv/linux/sparc/fork.S deleted file mode 100644 index 951ab4981b..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/fork.S +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza , 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -PSEUDO (__libc_fork, fork, 0) - tst %o1 - be,a parent - nop - /* child: return 0 */ - clr %o0 -parent: - ret - -PSEUDO_END (__libc_fork) -weak_alias (__libc_fork, __fork) -weak_alias (__libc_fork, fork) diff --git a/sysdeps/unix/sysv/linux/sparc/init-first.h b/sysdeps/unix/sysv/linux/sparc/init-first.h deleted file mode 100644 index 39822fc595..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/init-first.h +++ /dev/null @@ -1,52 +0,0 @@ -/* Prepare arguments for library initialization function. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* The job of this fragment it to find argc and friends for INIT. - This is done in one of two ways: either in the stack context - of program start, or having dlopen pass them in. */ - -#define SYSDEP_CALL_INIT(NAME, INIT) \ -void NAME (void *arg) \ -{ \ - int argc; \ - char **argv, **envp; \ - /* The next variable is only here to work around a bug in gcc <= 2.7.2.2. \ - If the address would be taken inside the expression the optimizer \ - would try to be too smart and throws it away. Grrr. */ \ - int *dummy_addr = &_dl_starting_up; \ - \ - __libc_multiple_libcs = dummy_addr && !_dl_starting_up; \ - \ - if (!__libc_multiple_libcs) \ - { \ - argc = *(int *) arg; \ - argv = (char **) (arg + 4); \ - envp = &argv[argc+1]; \ - } \ - else \ - { \ - argc = (int) arg; \ - argv = ((char ***) &arg)[1]; \ - envp = ((char ***) &arg)[2]; \ - } \ - \ - INIT (argc, argv, envp); \ -} - - diff --git a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc/kernel_stat.h deleted file mode 100644 index 91f02f4e20..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/kernel_stat.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Definition of `struct stat' used in the kernel */ -struct kernel_stat - { - unsigned short int st_dev; - unsigned long int st_ino; - unsigned short int st_mode; - short int st_nlink; - unsigned short int st_uid; - unsigned short int st_gid; - unsigned short int st_rdev; - long int st_size; - long int st_atime; - unsigned long int __unused1; - long int st_mtime; - unsigned long int __unused2; - long int st_ctime; - unsigned long int __unused3; - long int st_blksize; - long int st_blocks; - unsigned long int __unused4; - unsigned long int __unused5; - }; - -#define _HAVE___UNUSED1 -#define _HAVE___UNUSED2 -#define _HAVE___UNUSED3 -#define _HAVE___UNUSED4 -#define _HAVE___UNUSED5 diff --git a/sysdeps/unix/sysv/linux/sparc/pipe.S b/sysdeps/unix/sysv/linux/sparc/pipe.S deleted file mode 100644 index 4c50656d6c..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/pipe.S +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza , 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - .globl __libc_pipe -ENTRY (__libc_pipe) - mov %o0, %o2 /* Save PIPEDES. */ - mov SYS_ify(pipe),%g1 - ta 0x10 - bcc,a 2f - nop - SYSCALL_ERROR_HANDLER -2: - st %o0, [%o2] /* PIPEDES[0] = %o0; */ - st %o1, [%o2 + 4] /* PIPEDES[1] = %o1; */ - retl - clr %o0 - -PSEUDO_END (__libc_pipe) -weak_alias (__libc_pipe, __pipe) -weak_alias (__libc_pipe, pipe) diff --git a/sysdeps/unix/sysv/linux/sparc/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/profil-counter.h deleted file mode 100644 index 1bd06482c9..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/profil-counter.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Low-level statistical profiling support function. Linux/SPARC version. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -void -profil_counter (int signo, __siginfo_t si) -{ - profil_count ((void *) si.si_regs.pc); -} diff --git a/sysdeps/unix/sysv/linux/sparc/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sigaction.c deleted file mode 100644 index d39eb7cc76..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sigaction.c +++ /dev/null @@ -1,136 +0,0 @@ -/* POSIX.1 sigaction call for Linux/SPARC. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx), 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include -#include - -/* Commented out while I figure out what the fuck goes on */ -long ____sig_table [NSIG]; -#if 0 - -/* The kernel will deliver signals in the old way if the signal - number is a positive number. The kernel will deliver a signal - with the new stack layout if the signal number is a negative number. - - Our sigaction code takes care of selecting the type of kernel we are - using at runtime. */ - -extern void ____sparc_signal_trampoline (int); - -int -__trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old) -{ - int ret; - int need_to_hide_trick = 0; - __sighandler_t old_sh; - - if (new) - { - if (new->sa_handler != SIG_DFL && new->sa_handler != SIG_IGN) - { - old_sh = ____sig_table[sig]; - ____sig_table[sig] = (long int) new->sa_handler; - new->sa_handler = ____sparc_signal_trampoline; - need_to_hide_trick = 1; - } - } - __asm__("or %%g0,%0,%%g1\n\t" - "or %%g0,%1,%%o0\n\t" - "or %%g0,%2,%%o1\n\t" - "or %%g0,%3,%%o2\n\t" - "t 0x10\n\t" - "bcc 1f\n\t" - "or %%o0, %%g0, %0\n\t" - "sub %%g0, %%o0, %0\n\t" - "1:" - : "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new), - "=r" ((long int) old) - : "0" (__NR_sigaction), "1" (sig), "2" (new), "3" (old) - : "g1", "o0", "o1", "o2"); - - if (ret >= 0) - { - if (old && old->sa_handler == ____sparc_signal_trampoline) - { - if (need_to_hide_trick) - old->sa_handler = old_sh; - else - old->sa_handler = ____sig_table[sig]; - } - if (need_to_hide_trick) - new->sa_handler = ____sig_table[sig]; - return 0; - } - __set_errno (-ret); - return -1; -} -#else -# define __new_sigaction __sigaction -#endif - -int -__new_sigaction (int sig, __const struct sigaction *new, struct sigaction *old) -{ - int ret; - - sig = -sig; - - __asm__("or %%g0,%0,%%g1\n\t" - "or %%g0,%1,%%o0\n\t" - "or %%g0,%2,%%o1\n\t" - "or %%g0,%3,%%o2\n\t" - "t 0x10\n\t" - "bcc 1f\n\t" - "or %%o0, %%g0, %0\n\t" - "sub %%g0,%%o0,%0\n\t" - "1:" - : "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new), - "=r" ((long int) old) - : "0" (__NR_sigaction), "1" (sig), "2" (new), "3" (old) - : "g1", "o0", "o1", "o2"); - if (ret >= 0) - return 0; - __set_errno (-ret); - return -1; -} - -#if 0 -int -__sigaction (int sig, __const struct sigaction *new, struct sigaction *old) -{ - static (*sigact_routine) (int, __const struct sigaction *, struct sigaction *); - int ret; - struct sigaction sa; - - if (sigact_routine) - return (*sigact_routine) (sig, new, old); - - ret = __new_sigaction (1, NULL, &sa); - if (ret == -1) - sigact_routine = __trampoline_sigaction; - else - sigact_routine = __new_sigaction; - - return __sigaction (sig, new, old); -} -#endif - -weak_alias (__sigaction, sigaction); diff --git a/sysdeps/unix/sysv/linux/sparc/socket.S b/sysdeps/unix/sysv/linux/sparc/socket.S deleted file mode 100644 index bdfc2fcc6d..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/socket.S +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza , 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include -#include - -#define P(a, b) P2(a, b) -#define P2(a, b) a##b - - .text -/* The socket-oriented system calls are handled unusually in Linux. - They are all gated through the single `socketcall' system call number. - `socketcall' takes two arguments: the first is the subcode, specifying - which socket function is being called; and the second is a pointer to - the arguments to the specific function. - - The .S files for the other calls just #define socket and #include this. */ - -.globl P(__,socket) -ENTRY (P(__,socket)) - mov SYS_ify(socketcall), %g1 /* System call number */ - - /* Use ## so `socket' is a separate token that might be #define'd. */ - mov P(SOCKOP_,socket), %o0 /* Subcode is first arg to syscall. */ - mov %i0,%o1 /* args pointer is second arg to syscall */ - - t 0x10 - bcc,a 1 - nop - save %sp,96,%sp - call __errno_location - nop - st %i0,[%o0] - restore - retl - mov -1,%o0 -1: - ret - -PSEUDO_END (P(__,socket)) - -weak_alias (P(__,socket), socket) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/Dist b/sysdeps/unix/sysv/linux/sparc/sparc32/Dist new file mode 100644 index 0000000000..9729f0709b --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Dist @@ -0,0 +1,8 @@ +__sigtrampoline.S +bits/mman.h +clone.S +pipe.S +fork.S +kernel_stat.h +init-first.h +sys/trap.h diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile new file mode 100644 index 0000000000..4cbd3bd004 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Makefile @@ -0,0 +1,12 @@ +ifeq ($(subdir),signal) +sysdep_routines += __sigtrampoline +endif + +asm-CPPFLAGS=-D__ASSEMBLY__ +as-FLAGS-.so=-fPIC + +# When I get this to work, this is the right thing +ifeq ($(subdir),elf) +CFLAGS-rtld.c += -mv8 +#rtld-routines += dl-sysdepsparc +endif # elf diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S b/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S new file mode 100644 index 0000000000..a639511f3e --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/__sigtrampoline.S @@ -0,0 +1,143 @@ +/* Userland trampoline code for sigaction on Linux/SPARC */ +/* (C) 1996, 1997 Free Software Foundation, Inc. */ +/* This file is part of the GNU C Library. */ +/* Contributed by Miguel de Icaza (miguel@gnu.ai.mit.edu) */ +/* Many thanks go to David Miller for explaining all this to me */ +/* miguel@nuclecu.unam.mx */ +/* Sources: David Miller, 4.4BSD/SPARC code */ + +#include +#define __ASSEMBLY__ +/* For REGWIN_SZ */ +#include +#include + +/* The C compiler frame size */ +#define CCFSZ 96 + + .text + +ENTRY(____sparc_signal_trampoline) + .global C_SYMBOL_NAME(____sig_table) + + /* Make room for 32 %f registers + %fsr + * this is 132 bytes + alignement = 136 + * 96 is the C frame size + */ + save %sp,-136-CCFSZ,%sp + + /* save regular registers */ + mov %g2,%l2 + mov %g3,%l3 + mov %g4,%l4 + mov %g5,%l5 + mov %g6,%l6 + mov %g7,%l7 + + /* save fpu registers */ + ld [%fp+64+16+20],%l0 /* load the psr from sigcontext */ + sethi %hi(PSR_EF),%l1 + andcc %l0,%l1,%l0 /* is floating point enabled? */ + be 1f + rd %y,%l1 /* save y anyways */ + + /* save fpu registers */ + st %fsr, [%sp + CCFSZ + 0] + std %f0, [%sp + CCFSZ + 8] + std %f2, [%sp + CCFSZ + 16] + std %f4, [%sp + CCFSZ + 24] + std %f6, [%sp + CCFSZ + 32] + std %f8, [%sp + CCFSZ + 40] + std %f10, [%sp + CCFSZ + 48] + std %f12, [%sp + CCFSZ + 56] + std %f14, [%sp + CCFSZ + 64] + std %f16, [%sp + CCFSZ + 72] + std %f18, [%sp + CCFSZ + 80] + std %f20, [%sp + CCFSZ + 88] + std %f22, [%sp + CCFSZ + 96] + std %f24, [%sp + CCFSZ + 104] + std %f26, [%sp + CCFSZ + 112] + std %f28, [%sp + CCFSZ + 120] + std %f30, [%sp + CCFSZ + 128] + +1: + /* Load signal number */ + ld [%fp + REGWIN_SZ],%o0 + mov %fp,%o1 + mov 0xfea,%o2 + + /* Sanity check */ + cmp %o0,33 + bl 1f + or %g0,%g0,%g1 /*Call sys_setup */ + t 0x10 +1: +#ifdef PIC + /* Save return address */ + mov %o7,%o4 +___sxx: + call ___syy + nop +___syy: + sethi %hi(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5 + or %o5,%lo(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5 + add %o7,%o5,%o5 + /* restore return address */ + mov %o4,%o7 + mov %o5,%o4 + /* o4 has the GOT pointer */ +#endif + sethi %hi(C_SYMBOL_NAME(____sig_table)),%o5 + or %o5,%lo(C_SYMBOL_NAME(____sig_table)),%o5 +#ifdef PIC + add %o5,%o4,%o4 + ld [%o4],%o5 +#endif + sll %o0,2,%o4 + add %o5,%o4,%o4 + ld [%o4],%o4 + ld [%fp + REGWIN_SZ + 4],%o1 /* Load subcode */ + ld [%fp + REGWIN_SZ + 8],%o2 /* pointer to sigcontext */ + call %o4 + ld [%fp + REGWIN_SZ + 12],%o3 /* Address where signal ocurre + */ + + /* handler returned, restore state */ + tst %l0 + be 1f + wr %l1,%g0,%y + + /* fpu restoration */ + ld [%sp + CCFSZ + 0], %fsr + ldd [%sp + CCFSZ + 8], %f0 + ldd [%sp + CCFSZ + 16], %f2 + ldd [%sp + CCFSZ + 24], %f4 + ldd [%sp + CCFSZ + 32], %f6 + ldd [%sp + CCFSZ + 40], %f8 + ldd [%sp + CCFSZ + 48], %f10 + ldd [%sp + CCFSZ + 56], %f12 + ldd [%sp + CCFSZ + 64], %f14 + ldd [%sp + CCFSZ + 72], %f16 + ldd [%sp + CCFSZ + 80], %f18 + ldd [%sp + CCFSZ + 88], %f20 + ldd [%sp + CCFSZ + 96], %f22 + ldd [%sp + CCFSZ + 104], %f24 + ldd [%sp + CCFSZ + 112], %f26 + ldd [%sp + CCFSZ + 120], %f28 + ldd [%sp + CCFSZ + 128], %f30 + +1: + mov %l2,%g2 + mov %l3,%g3 + mov %l4,%g4 + mov %l5,%g5 + mov %l6,%g6 + mov %l7,%g7 + + /* call sigreturn */ + restore %g0,SYS_ify(sigreturn),%g1 /* register back and set syscal */ + add %sp,64+16,%o0 + t 0x10 + /* if we return, sysreturn failed */ + mov SYS_ify(exit),%g1 + t 0x10 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h new file mode 100644 index 0000000000..3e7f2900fa --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/bits/mman.h @@ -0,0 +1,77 @@ +/* Definitions for POSIX memory map inerface. Linux/SPARC version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SYS_MMAN_H +# error "Never include this file directly. Use 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. */ + +/* 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 0x0100 /* Stack-like segment. */ +# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +# define MAP_LOCKED 0x0100 /* Lock the mapping. */ +# define MAP_NORESERVE 0x0040 /* Don't check for reservations. */ +# define _MAP_NEW 0x80000000 /* Binary compatibility with SunOS. */ +#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 +#endif diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c new file mode 100644 index 0000000000..8f079bf444 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/brk.c @@ -0,0 +1,56 @@ +/* brk system call for Linux/SPARC. + Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx) + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +/* This must be initialized data because commons can't have aliases. */ +void *__curbrk = 0; + +/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt + to work around different old braindamage in the old Linux ELF dynamic + linker. */ +weak_alias (__curbrk, ___brk_addr) + +int +__brk (void *addr) +{ + void *newbrk, *scratch; + + asm ("mov %1, %%g1\n\t" + "mov %2, %%o0\n\t" + "t 0x10\n\t" + "mov %%o0, %0\n\t" + : "=r" (newbrk) + : "0" (__NR_brk), "r" (addr) + : "g1", "o0"); + + __curbrk = newbrk; + + if (newbrk < addr) + { + __set_errno (ENOMEM); + return -1; + } + + return 0; +} +weak_alias (__brk, brk) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S new file mode 100644 index 0000000000..64735e9dbc --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/clone.S @@ -0,0 +1,70 @@ +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* clone() is even more special than fork() as it mucks with stacks + and invokes a function in the right context after its all over. */ + +#include +#include + +/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ + + .text + .align 4 + .globl __libc_clone + .type __libc_clone,@function + .weak clone + __clone = __libc_clone + clone = __libc_clone + +__libc_clone: + save %sp,-96,%sp + + /* sanity check arguments */ + tst %i0 + be __clone_syscall_error + tst %i1 + be __clone_syscall_error + nop + + /* Do the system call */ + mov %i1,%o1 + mov %i2,%o0 + set __NR_clone,%g1 + ta 0x10 + bcs __clone_syscall_error + tst %o1 + bne __thread_start + nop + mov %o0,%i0 + ret + restore + +__clone_syscall_error: + call __errno_location + set EINVAL,%i0 + st %i0,[%o0] + mov -1,%i0 + ret + restore + +__thread_start: + call %i0 + mov %i3,%o0 + call _exit,0 + nop diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/fork.S b/sysdeps/unix/sysv/linux/sparc/sparc32/fork.S new file mode 100644 index 0000000000..951ab4981b --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/fork.S @@ -0,0 +1,33 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +PSEUDO (__libc_fork, fork, 0) + tst %o1 + be,a parent + nop + /* child: return 0 */ + clr %o0 +parent: + ret + +PSEUDO_END (__libc_fork) +weak_alias (__libc_fork, __fork) +weak_alias (__libc_fork, fork) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h b/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h new file mode 100644 index 0000000000..39822fc595 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/init-first.h @@ -0,0 +1,52 @@ +/* Prepare arguments for library initialization function. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* The job of this fragment it to find argc and friends for INIT. + This is done in one of two ways: either in the stack context + of program start, or having dlopen pass them in. */ + +#define SYSDEP_CALL_INIT(NAME, INIT) \ +void NAME (void *arg) \ +{ \ + int argc; \ + char **argv, **envp; \ + /* The next variable is only here to work around a bug in gcc <= 2.7.2.2. \ + If the address would be taken inside the expression the optimizer \ + would try to be too smart and throws it away. Grrr. */ \ + int *dummy_addr = &_dl_starting_up; \ + \ + __libc_multiple_libcs = dummy_addr && !_dl_starting_up; \ + \ + if (!__libc_multiple_libcs) \ + { \ + argc = *(int *) arg; \ + argv = (char **) (arg + 4); \ + envp = &argv[argc+1]; \ + } \ + else \ + { \ + argc = (int) arg; \ + argv = ((char ***) &arg)[1]; \ + envp = ((char ***) &arg)[2]; \ + } \ + \ + INIT (argc, argv, envp); \ +} + + diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h new file mode 100644 index 0000000000..91f02f4e20 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/kernel_stat.h @@ -0,0 +1,28 @@ +/* Definition of `struct stat' used in the kernel */ +struct kernel_stat + { + unsigned short int st_dev; + unsigned long int st_ino; + unsigned short int st_mode; + short int st_nlink; + unsigned short int st_uid; + unsigned short int st_gid; + unsigned short int st_rdev; + long int st_size; + long int st_atime; + unsigned long int __unused1; + long int st_mtime; + unsigned long int __unused2; + long int st_ctime; + unsigned long int __unused3; + long int st_blksize; + long int st_blocks; + unsigned long int __unused4; + unsigned long int __unused5; + }; + +#define _HAVE___UNUSED1 +#define _HAVE___UNUSED2 +#define _HAVE___UNUSED3 +#define _HAVE___UNUSED4 +#define _HAVE___UNUSED5 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S b/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S new file mode 100644 index 0000000000..4c50656d6c --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/pipe.S @@ -0,0 +1,37 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + .globl __libc_pipe +ENTRY (__libc_pipe) + mov %o0, %o2 /* Save PIPEDES. */ + mov SYS_ify(pipe),%g1 + ta 0x10 + bcc,a 2f + nop + SYSCALL_ERROR_HANDLER +2: + st %o0, [%o2] /* PIPEDES[0] = %o0; */ + st %o1, [%o2 + 4] /* PIPEDES[1] = %o1; */ + retl + clr %o0 + +PSEUDO_END (__libc_pipe) +weak_alias (__libc_pipe, __pipe) +weak_alias (__libc_pipe, pipe) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h new file mode 100644 index 0000000000..1bd06482c9 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/profil-counter.h @@ -0,0 +1,26 @@ +/* Low-level statistical profiling support function. Linux/SPARC version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +void +profil_counter (int signo, __siginfo_t si) +{ + profil_count ((void *) si.si_regs.pc); +} diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c new file mode 100644 index 0000000000..d39eb7cc76 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c @@ -0,0 +1,136 @@ +/* POSIX.1 sigaction call for Linux/SPARC. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx), 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include + +/* Commented out while I figure out what the fuck goes on */ +long ____sig_table [NSIG]; +#if 0 + +/* The kernel will deliver signals in the old way if the signal + number is a positive number. The kernel will deliver a signal + with the new stack layout if the signal number is a negative number. + + Our sigaction code takes care of selecting the type of kernel we are + using at runtime. */ + +extern void ____sparc_signal_trampoline (int); + +int +__trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old) +{ + int ret; + int need_to_hide_trick = 0; + __sighandler_t old_sh; + + if (new) + { + if (new->sa_handler != SIG_DFL && new->sa_handler != SIG_IGN) + { + old_sh = ____sig_table[sig]; + ____sig_table[sig] = (long int) new->sa_handler; + new->sa_handler = ____sparc_signal_trampoline; + need_to_hide_trick = 1; + } + } + __asm__("or %%g0,%0,%%g1\n\t" + "or %%g0,%1,%%o0\n\t" + "or %%g0,%2,%%o1\n\t" + "or %%g0,%3,%%o2\n\t" + "t 0x10\n\t" + "bcc 1f\n\t" + "or %%o0, %%g0, %0\n\t" + "sub %%g0, %%o0, %0\n\t" + "1:" + : "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new), + "=r" ((long int) old) + : "0" (__NR_sigaction), "1" (sig), "2" (new), "3" (old) + : "g1", "o0", "o1", "o2"); + + if (ret >= 0) + { + if (old && old->sa_handler == ____sparc_signal_trampoline) + { + if (need_to_hide_trick) + old->sa_handler = old_sh; + else + old->sa_handler = ____sig_table[sig]; + } + if (need_to_hide_trick) + new->sa_handler = ____sig_table[sig]; + return 0; + } + __set_errno (-ret); + return -1; +} +#else +# define __new_sigaction __sigaction +#endif + +int +__new_sigaction (int sig, __const struct sigaction *new, struct sigaction *old) +{ + int ret; + + sig = -sig; + + __asm__("or %%g0,%0,%%g1\n\t" + "or %%g0,%1,%%o0\n\t" + "or %%g0,%2,%%o1\n\t" + "or %%g0,%3,%%o2\n\t" + "t 0x10\n\t" + "bcc 1f\n\t" + "or %%o0, %%g0, %0\n\t" + "sub %%g0,%%o0,%0\n\t" + "1:" + : "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new), + "=r" ((long int) old) + : "0" (__NR_sigaction), "1" (sig), "2" (new), "3" (old) + : "g1", "o0", "o1", "o2"); + if (ret >= 0) + return 0; + __set_errno (-ret); + return -1; +} + +#if 0 +int +__sigaction (int sig, __const struct sigaction *new, struct sigaction *old) +{ + static (*sigact_routine) (int, __const struct sigaction *, struct sigaction *); + int ret; + struct sigaction sa; + + if (sigact_routine) + return (*sigact_routine) (sig, new, old); + + ret = __new_sigaction (1, NULL, &sa); + if (ret == -1) + sigact_routine = __trampoline_sigaction; + else + sigact_routine = __new_sigaction; + + return __sigaction (sig, new, old); +} +#endif + +weak_alias (__sigaction, sigaction); diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S new file mode 100644 index 0000000000..bdfc2fcc6d --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/socket.S @@ -0,0 +1,58 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include + +#define P(a, b) P2(a, b) +#define P2(a, b) a##b + + .text +/* The socket-oriented system calls are handled unusually in Linux. + They are all gated through the single `socketcall' system call number. + `socketcall' takes two arguments: the first is the subcode, specifying + which socket function is being called; and the second is a pointer to + the arguments to the specific function. + + The .S files for the other calls just #define socket and #include this. */ + +.globl P(__,socket) +ENTRY (P(__,socket)) + mov SYS_ify(socketcall), %g1 /* System call number */ + + /* Use ## so `socket' is a separate token that might be #define'd. */ + mov P(SOCKOP_,socket), %o0 /* Subcode is first arg to syscall. */ + mov %i0,%o1 /* args pointer is second arg to syscall */ + + t 0x10 + bcc,a 1 + nop + save %sp,96,%sp + call __errno_location + nop + st %i0,[%o0] + restore + retl + mov -1,%o0 +1: + ret + +PSEUDO_END (P(__,socket)) + +weak_alias (P(__,socket), socket) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S b/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S new file mode 100644 index 0000000000..3921ca52dc --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/syscall.S @@ -0,0 +1,41 @@ +/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + .text +ENTRY (syscall) + or %o0,%g0,%g1 + or %o1,%g0,%o0 + or %o2,%g0,%o1 + or %o3,%g0,%o2 + or %o4,%g0,%o3 + or %o5,%g0,%o4 + ta 0x10 + bcc 1f + nop + save %sp, -96, %sp + call __errno_location + nop + st %i0,[%o0] + restore + retl + mov -1, %o0 +1: + ret + +PSEUDO_END (syscall) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list new file mode 100644 index 0000000000..7883d70719 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list @@ -0,0 +1,3 @@ +# File name Caller Syscall name # args Strong name Weak names + +s_llseek llseek _llseek 5 __sys_llseek diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S new file mode 100644 index 0000000000..7e9023901b --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.S @@ -0,0 +1,3 @@ +/* Define errno */ + + .common errno,4,4 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h new file mode 100644 index 0000000000..0e5a8cd218 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h @@ -0,0 +1,80 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza , January 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _LINUX_SPARC_SYSDEP_H +#define _LINUX_SPARC_SYSDEP_H 1 + +#include + +#undef SYS_ify +#define SYS_ify(syscall_name) __NR_##syscall_name + +#ifdef ASSEMBLER + +#ifdef DONT_LOAD_G1 +# define LOADSYSCALL(x) +#else +# define LOADSYSCALL(x) mov __NR_##x, %g1 +#endif + +/* Linux/SPARC uses a different trap number */ +#undef PSEUDO +#undef ENTRY + +#define ENTRY(name) \ + .global C_SYMBOL_NAME(name); \ + .align 2;\ + C_LABEL(name);\ + .type name,@function; + +#ifdef PIC +#define SYSCALL_ERROR_HANDLER \ + .global C_SYMBOL_NAME(__errno_location);\ + .type C_SYMBOL_NAME(__errno_location),@function;\ + save %sp,-96,%sp;\ + call __errno_location;\ + nop;\ + st %i0,[%o0];\ + restore;\ + retl;\ + mov -1,%o0; +#else +#define SYSCALL_ERROR_HANDLER \ + save %sp,-96,%sp; \ + call __errno_location; \ + nop; \ + st %i0,[%o0]; \ + restore; \ + retl; \ + mov -1,%o0; +#endif /* PIC */ + +#define PSEUDO(name, syscall_name, args) \ + .text; \ + ENTRY(name); \ + LOADSYSCALL(syscall_name); \ + ta 0x10; \ + bcc,a 1f; \ + nop; \ + SYSCALL_ERROR_HANDLER; \ +1:; + +#endif /* ASSEMBLER */ + +#endif /* linux/sparc/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Dist b/sysdeps/unix/sysv/linux/sparc/sparc64/Dist new file mode 100644 index 0000000000..e770e20eb9 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/Dist @@ -0,0 +1,7 @@ +bits/mman.h +clone.S +kernel_stat.h +getcontext.S +setcontext.S +ucontext.h +init-first.h diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile new file mode 100644 index 0000000000..c4d83226a2 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile @@ -0,0 +1,4 @@ +ifeq ($(subdir),misc) +sysdep_headers += ucontext.h +sysdep_routines += getcontext setcontext +endif diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/__longjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/__longjmp.S new file mode 100644 index 0000000000..3107179fdc --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/__longjmp.S @@ -0,0 +1 @@ +/* There is no need for __longjmp what with setcontext. */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/mman.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/mman.h new file mode 100644 index 0000000000..3e7f2900fa --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/mman.h @@ -0,0 +1,77 @@ +/* Definitions for POSIX memory map inerface. Linux/SPARC version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _SYS_MMAN_H +# error "Never include this file directly. Use 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. */ + +/* 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 0x0100 /* Stack-like segment. */ +# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ +# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ +# define MAP_LOCKED 0x0100 /* Lock the mapping. */ +# define MAP_NORESERVE 0x0040 /* Don't check for reservations. */ +# define _MAP_NEW 0x80000000 /* Binary compatibility with SunOS. */ +#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 +#endif diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h new file mode 100644 index 0000000000..ab850e5301 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/setjmp.h @@ -0,0 +1,26 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _JMP_BUF_H +#define _JMP_BUF_H 1 + +#include + +typedef ucontext_t __jmp_buf[1]; + +#endif /* jmp_buf.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h new file mode 100644 index 0000000000..222967881f --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bits/types.h @@ -0,0 +1,95 @@ +/* Copyright (C) 1991, 92, 94, 95, 96, 97 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 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* + * Never include this file directly; use instead. + */ + +#ifndef _BITS_TYPES_H +#define _BITS_TYPES_H 1 + +#include + +/* Convenience types. */ +typedef unsigned char __u_char; +typedef unsigned short __u_short; +typedef unsigned int __u_int; +typedef unsigned long __u_long; +typedef unsigned long int __u_quad_t; +typedef long int __quad_t; +typedef signed char __int8_t; +typedef unsigned char __uint8_t; +typedef signed short int __int16_t; +typedef unsigned short int __uint16_t; +typedef signed int __int32_t; +typedef unsigned int __uint32_t; +typedef signed long int __int64_t; +typedef unsigned long int __uint64_t; +typedef __quad_t *__qaddr_t; + +typedef __u_int __dev_t; /* Type of device numbers. */ +typedef __u_int __uid_t; /* Type of user identifications. */ +typedef __u_int __gid_t; /* Type of group identifications. */ +typedef __u_int __ino_t; /* Type of file serial numbers. */ +typedef __u_int __mode_t; /* Type of file attribute bitmasks. */ +typedef __u_int __nlink_t; /* Type of file link counts. */ +typedef long int __off_t; /* Type of file sizes and offsets. */ +typedef __quad_t __loff_t; /* Type of file sizes and offsets. */ +typedef int __pid_t; /* Type of process identifications. */ +typedef long int __ssize_t; /* Type of a byte count, or error. */ + +typedef struct + { + int __val[2]; + } __fsid_t; /* Type of file system IDs. */ + +/* Everythin' else. */ +typedef int __daddr_t; /* The type of a disk address. */ +typedef char *__caddr_t; +typedef long int __time_t; +typedef long int __swblk_t; /* Type of a swap block maybe? */ + +typedef long int __clock_t; + +/* One element in the file descriptor mask array. */ +typedef unsigned long int __fd_mask; + +/* Due to incaution, we may have gotten these from a kernel header file. */ +#undef __FD_SETSIZE +#undef __NFDBITS +#undef __FDMASK + +/* Number of descriptors that can fit in an `fd_set'. */ +#define __FD_SETSIZE 1024 + +/* It's easier to assume 8-bit bytes than to get CHAR_BIT. */ +#define __NFDBITS (8 * sizeof (__fd_mask)) +#define __FDELT(d) ((d) / __NFDBITS) +#define __FDMASK(d) (1 << ((d) % __NFDBITS)) + +/* fd_set for select and pselect. */ +typedef struct + { + /* XPG4.2 requires this member name. */ + __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS]; + } __fd_set; + + +typedef int __key_t; + +#endif /* bits/types.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S b/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S new file mode 100644 index 0000000000..abdd7e6604 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/brk.S @@ -0,0 +1,97 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* __brk is a special syscall under Linux since it never returns an + error. Instead, the error condition is indicated by returning the old + break value (instead of the new, requested one). */ + +#include +#define _ERRNO_H +#include + +#ifdef PIC +.section .bss + .align 8 + .globl __curbrk +__curbrk: .skip 8 + .type __curbrk,@object + .size __curbrk,8 +#else +.common __curbrk, 8, 8 +#endif + + .text +ENTRY(__brk) + save %sp, -160, %sp +#ifdef PIC +1: call 2f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 +2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + add %l7, %o7, %l7 +#endif + + LOADSYSCALL(brk) + mov %i0, %o0 + + ta 0x11 + + /* All the ways we can fail... */ + bcs,pn %xcc, .Lerr1 + nop + brz %i0, .Lok + subcc %i0, %o0, %g0 + bne,pn %xcc, .Lerr0 + + /* Update __curbrk and return cleanly. */ +.Lok: sethi %hi(__curbrk), %g1 + or %g1, %lo(__curbrk), %g1 +#ifdef PIC + ldx [%l7+%g1], %g1 + stx %o0, [%g1] +#else + stx %o0, [%g4+%g1] +#endif + mov %g0, %i0 + + /* Don't use "ret" cause the preprocessor will eat it. */ + jmpl %i7+8, %g0 + restore + + /* What a horrible way to die. */ +.Lerr0: set ENOMEM, %o0 +.Lerr1: sethi %hi(errno), %g1 + or %g1, %lo(errno), %g1 +#ifdef PIC + ldx [%l7+%g1], %g1 + st %o0, [%g1] +#else + st %o0, [%g4+%g1] +#endif +#ifdef _LIBC_REENTRANT + call __errno_location + mov %o0,%l1 + st %l1, [%o0] +#endif + sub %g0, 1, %i0 + jmpl %i7+8, %g0 + restore + + .size __brk, .-__brk + +weak_alias (__brk, brk) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-_setjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-_setjmp.S new file mode 100644 index 0000000000..4e6a2da560 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-_setjmp.S @@ -0,0 +1 @@ +/* _setjmp is in setjmp.S */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-setjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-setjmp.S new file mode 100644 index 0000000000..1da848d2f1 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/bsd-setjmp.S @@ -0,0 +1 @@ +/* setjmp is in setjmp.S */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S new file mode 100644 index 0000000000..a5cb1a4c4a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/clone.S @@ -0,0 +1,89 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* clone() is even more special than fork() as it mucks with stacks + and invokes a function in the right context after its all over. */ + +#include +#include + +/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ + + .text + .align 4 + .globl __libc_clone + .type __libc_clone,@function + .weak clone + __clone = __libc_clone + clone = __libc_clone + +__libc_clone: + save %sp,-160,%sp + + /* sanity check arguments */ + brz,pn %i0, 99f + mov %i0, %l0 /* save fn */ + brz,pn %i1, 99f + mov %i3, %l3 /* save arg */ + + /* Do the system call */ + mov %i1, %o1 + mov %i2, %o0 + set __NR_clone, %g1 + ta 0x11 + bcs,pn %xcc, 99f + nop + brnz %o0, __thread_start + mov %o0, %i0 + ret + restore +99: +#ifdef PIC + call 1f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7 +1: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7 + add %l7, %o7, %l7 + set EINVAL, %i0 + sethi %hi(errno), %g2 + or %g2, %lo(errno), %g2 + st %i0, [%l7+%g2] +#else + sethi %hi(errno), %g2 + add %g2, %g4, %g2 + set EINVAL, %i0 + st %i0, [%g2+%lo(errno)] +#endif +#ifdef _LIBC_REENTRANT + call __errno_location + nop + st %i0, [%o0] +#endif + mov -1,%i0 + ret + restore + .size __libc_clone, .-__libc_clone + + .type __thread_start,@function +__thread_start: + mov %g0, %fp /* terminate backtrace */ + sub %sp, 6*8, %sp /* provide arg storage */ + call %l0 + mov %l3,%o0 + call _exit,0 + nop + .size __thread_start, .-__thread_start diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/fork.S b/sysdeps/unix/sysv/linux/sparc/sparc64/fork.S new file mode 100644 index 0000000000..c735da5a44 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/fork.S @@ -0,0 +1,33 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +PSEUDO (__libc_fork, fork, 0) + tst %o1 + be %xcc, 1f + nop + /* child: return 0 */ + clr %o0 +1: ret + +PSEUDO_END (__libc_fork) + +weak_alias (__libc_fork, __fork) +weak_alias (__libc_fork, fork) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S new file mode 100644 index 0000000000..05b06269e4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/getcontext.S @@ -0,0 +1,30 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +/* void getcontext(ucontext_t *); */ + +ENTRY(__getcontext) + + ta 0x6e + ret + +END(__getcontext) + +weak_alias(__getcontext, getcontext) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h b/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h new file mode 100644 index 0000000000..3e27c6dcf7 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/init-first.h @@ -0,0 +1,92 @@ +/* Prepare arguments for library initialization function. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* The job of this fragment it to find argc and friends for INIT. + This is done in one of two ways: either in the stack context + of program start, or having dlopen pass them in. */ + +#include + +#define __S1(x) #x +#define __S(x) __S1(x) + +#ifdef PIC + +#define SYSDEP_CALL_INIT(NAME, INIT) asm("\ + .weak _dl_starting_up + .global " #NAME " + .type " #NAME ",@function +" #NAME ": + save %sp, -128, %sp +1: call 11f + sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 +11: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 + add %l7, %o7, %l7 + /* Are we a dynamic libc being loaded into a static program? */ + sethi %hi(_dl_starting_up), %l2 + or %l2, %lo(_dl_starting_up), %l2 + ldx [%l7+%l2], %l2 + brz,pn %l2, 3f + sethi %hi(__libc_multiple_libcs), %l3 + ld [%l2], %l4 + mov %g0, %l2 + movrz %l4, 1, %l2 +3: or %l3, %lo(__libc_multiple_libcs), %l3 + ldx [%l7+%l3], %l3 + st %l2, [%l3] + /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */ + brnz,pn %l2, " #INIT " + restore + ldx [%sp+" __S(STACK_BIAS) "+22*8], %o0 + add %sp, " __S(STACK_BIAS) "+23*8, %o1 + sll %o0, 3, %o2 + add %o2, %o1, %o2 + ba " #INIT " + add %o2, 8, %o2 + .size "#NAME ", .-" #NAME); + +#else + +#define SYSDEP_CALL_INIT(NAME, INIT) asm("\ + .weak _dl_starting_up + .global " #NAME " + .type " #NAME ",@function +" #NAME ": + /* Are we a dynamic libc being loaded into a static program? */ + sethi %hi(_dl_starting_up), %g2 + or %g2, %lo(_dl_starting_up), %g2 + brz,pt %g2, 3f + sethi %hi(__libc_multiple_libcs), %g3 + ld [%g4+%g2], %g1 + mov %g0, %g2 + movrz %g1, 1, %g2 +3: or %g3, %lo(__libc_multiple_libcs), %g3 + st %g2, [%g3+%g4] + /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */ + brnz,pn %g2, " #INIT " + nop + ldx [%sp+" __S(STACK_BIAS) "+22*8], %o0 + add %sp, " __S(STACK_BIAS) "+23*8, %o1 + sll %o0, 3, %o2 + add %o2, %o1, %o2 + add %o2, 8, %o2 + ba,a " #INIT " + .size "#NAME ", .-" #NAME); + +#endif diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc/sparc64/kernel_stat.h new file mode 100644 index 0000000000..fcb752e3ec --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/kernel_stat.h @@ -0,0 +1,22 @@ +/* Definition of `struct stat' used in the kernel */ +struct kernel_stat + { + unsigned int st_dev; + unsigned int st_ino; + unsigned int st_mode; + short int st_nlink; + unsigned int st_uid; + unsigned int st_gid; + unsigned int st_rdev; + long int st_size; + long int st_atime; + long int st_mtime; + long int st_ctime; + long int st_blksize; + long int st_blocks; + unsigned long int __unused1; + unsigned long int __unused2; + }; + +#define _HAVE___UNUSED1 +#define _HAVE___UNUSED2 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S new file mode 100644 index 0000000000..c4563776b6 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/longjmp.S @@ -0,0 +1,46 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* longjmp is implemented in terms of the setcontext trap on Linux/Sparc64. */ + +#include + +/* Offsets into the jmp_buf structure. */ + +#define O_mask_was_saved 512 +#define O_gregs 32 +#define O_g1 (O_gregs + 4*8) + + +/* void longjmp (sigjmp_buf env, int val) */ + +ENTRY(longjmp) + + /* Modify the context with the value we want to return. */ + movre %o1, 1, %o1 + stx %o1, [%o0 + O_g1] + + /* Let setcontext know if we want to modify the current sigmask. */ + ld [%o0 + O_mask_was_saved], %o1 + + /* And bamf back to where we belong! */ + ta 0x6f + +END(longjmp) + +strong_alias(longjmp, __longjmp) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S b/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S new file mode 100644 index 0000000000..82ff4eae3c --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/pipe.S @@ -0,0 +1,37 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Miguel de Icaza , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +ENTRY (__libc_pipe) + mov %o0, %o2 /* Save PIPEDES. */ + LOADSYSCALL(pipe) + ta 0x11 + bcc,pn %xcc, 2f + nop + SYSCALL_ERROR_HANDLER + +2: st %o0, [%o2] /* PIPEDES[0] = %o0; */ + st %o1, [%o2 + 4] /* PIPEDES[1] = %o1; */ + retl + clr %o0 +PSEUDO_END (__libc_pipe) + +weak_alias (__libc_pipe, __pipe) +weak_alias (__libc_pipe, pipe) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h b/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h new file mode 100644 index 0000000000..6a3f0a291a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/profil-counter.h @@ -0,0 +1,26 @@ +/* Low-level statistical profiling support function. Linux/Sparc64 version. + Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +void +profil_counter (int signo, __siginfo_t *si) +{ + profil_count ((void *) si->si_regs.tpc); +} diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/setcontext.S b/sysdeps/unix/sysv/linux/sparc/sparc64/setcontext.S new file mode 100644 index 0000000000..2968b65633 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/setcontext.S @@ -0,0 +1,33 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + + +/* void setcontext(ucontext_t *ctx); */ +.weak setcontext +ENTRY(setcontext) + + mov 1, %o1 + +/* void __setcontext(ucontext_t *ctx, int restoremask); */ +ENTRY(__setcontext) + + ta 0x6f + +END(__setcontext) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/setjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/setjmp.S new file mode 100644 index 0000000000..fcc5cb5a48 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/setjmp.S @@ -0,0 +1,67 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + Contributed by Richard Henderson (rth@tamu.edu). + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* __sigsetjmp is implemented in terms of the getcontext trap on + Linux/Sparc64. */ + +#include + +/* Offsets into the jmp_buf structure. */ + +#define O_mask_was_saved 512 +#define O_gregs 32 +#define O_g1 (O_gregs + 4*8) + +/* int _setjmp(jmp_buf) */ + +.weak _setjmp +ENTRY(_setjmp) + + ba __sigsetjmp_local + set 0, %o1 + +END(setjmp) + +/* int setjmp(jmp_buf) */ + +.weak setjmp +ENTRY(setjmp) + + set 1, %o1 + +END(setjmp) + +/* int __sigsetjmp(jmp_buf, savemask) */ + +ENTRY(__sigsetjmp) +__sigsetjmp_local: + + /* Record whether the user is intending to save the sigmask. */ + st %o1, [%o0 + O_mask_was_saved] + + /* Load up our return value, as longjmp is going to override + the jmp_buf on its way back. */ + mov %g0, %g1 + + /* And call getcontext! */ + ta 0x6e + + retl + mov %g1, %o0 + +END(__sigsetjmp) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sigjmp.S b/sysdeps/unix/sysv/linux/sparc/sparc64/sigjmp.S new file mode 100644 index 0000000000..940ccbcf68 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sigjmp.S @@ -0,0 +1 @@ +/* There is no need for __sigjmp_save what with getcontext. */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S new file mode 100644 index 0000000000..30dace5903 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscall.S @@ -0,0 +1,39 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + .text + +ENTRY (syscall) + + mov %o0,%g1 + mov %o1,%o0 + mov %o2,%o1 + mov %o3,%o2 + mov %o4,%o3 + mov %o5,%o4 + + ta 0x11 + + bcc,pt %xcc,1f + nop + SYSCALL_ERROR_HANDLER + +1: retl + +PSEUDO_END (syscall) diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list new file mode 100644 index 0000000000..66ba470994 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list @@ -0,0 +1,26 @@ +# File name Caller Syscall name # args Strong name Weak names + +# Whee! 64-bit systems naturally implement llseek. +llseek EXTRA lseek 3 llseek + +# Override select.S in parent directory: +select - select 5 __select select +accept - accept 3 __accept accept +bind - bind 3 __bind bind +connect - connect 3 __connect connect +getpeername - getpeername 3 __getpeername getpeername +getsockname - getsockname 3 __getsockname getsockname +getsockopt - getsockopt 5 __getsockopt getsockopt +listen - listen 2 __listen listen +recv - recv 4 __recv recv +recvfrom - recvfrom 6 __recvfrom recvfrom +recvmsg - recvmsg 3 __recvmsg recvmsg +send - send 4 __send send +sendmsg - sendmsg 3 __sendmsg sendmsg +sendto - sendto 6 __sendto sendto +setsockopt - setsockopt 5 __setsockopt setsockopt +shutdown - shutdown 2 __shutdown shutdown +socketpair - socketpair 4 __socketpair socketpair + +# Another broken Linux/i386 idea layed to rest +ptrace - ptrace 4 __ptrace ptrace diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.S b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.S new file mode 100644 index 0000000000..736578083c --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.S @@ -0,0 +1,31 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +/* Define errno */ + + .section .bss + .globl errno + .align 2 +errno: .space 4 + .type errno, @object + .size errno, 4 + + .globl __errno +__errno = errno diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h new file mode 100644 index 0000000000..c880e4a2dc --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h @@ -0,0 +1,138 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson , 1997. + + 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, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _LINUX_SPARC64_SYSDEP_H +#define _LINUX_SPARC64_SYSDEP_H 1 + +#include + +#undef SYS_ify +#define SYS_ify(syscall_name) __NR_##syscall_name + +#ifdef ASSEMBLER + +#ifdef DONT_LOAD_G1 +# define LOADSYSCALL(x) +#else +# define LOADSYSCALL(x) mov __NR_##x, %g1 +#endif + +/* Linux/SPARC uses a different trap number */ +#undef PSEUDO +#undef ENTRY + +#define ENTRY(name) \ + .global C_SYMBOL_NAME(name); \ + .align 2; \ + C_LABEL(name); \ + .type name,@function; + +#ifdef PIC +# ifdef _LIBC_REENTRANT +# define SYSCALL_ERROR_HANDLER \ + .global C_SYMBOL_NAME(errno); \ + .type C_SYMBOL_NAME(errno),@object; \ + save %sp,-160,%sp; \ + 101: call 102f; \ + sethi %hi(_GLOBAL_OFFSET_TABLE_-(101b-.)),%g2; \ + 102: or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(101b-.)),%g2; \ + sethi %hi(errno),%i1; \ + add %g2,%o7,%l7; \ + or %i1,%lo(errno),%i1; \ + ldx [%l7+%i1],%g2; \ + st %i0,[%g2]; \ + call __errno_location; \ + nop; \ + st %i0,[%o0]; \ + sub %g0,1,%i0; \ + jmpl %i7+8, %g0; \ + restore +# else +# define SYSCALL_ERROR_HANDLER \ + .global C_SYMBOL_NAME(errno); \ + .type C_SYMBOL_NAME(errno),@object; \ + mov %o7,%g3; \ + 101: call 102f; \ + sethi %hi(_GLOBAL_OFFSET_TABLE_-(101b-.)),%g2; \ + 102: or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(101b-.)),%g2; \ + sethi %hi(errno),%o1; \ + add %g2,%o7,%l7; \ + or %o1,%lo(errno),%o1; \ + mov %g3,%o7; \ + ldx [%l7+%o1],%g2; \ + st %o0,[%g2] +# endif +#else +# ifdef _LIBC_REENTRANT +# define SYSCALL_ERROR_HANDLER \ + .global C_SYMBOL_NAME(errno); \ + .type C_SYMBOL_NAME(errno),@object; \ + save %sp,-160,%sp; \ + sethi %hi(errno),%g1; \ + or %g1,%lo(errno),%g1; \ + st %i0,[%g1+%g4]; \ + call __errno_location; \ + nop; \ + st %i0,[%o0]; \ + sub %g0,1,%i0; \ + jmpl %i7+8, %g0; \ + restore +# else +# define SYSCALL_ERROR_HANDLER \ + .global C_SYMBOL_NAME(errno); \ + .type C_SYMBOL_NAME(errno),@object; \ + sethi %hi(errno),%g1; \ + or %g1,%lo(errno),%g1; \ + st %i0,[%g1+%g4]; \ + retl; \ + sub %g0,1,%i0 +# endif +#endif + +#define PSEUDO(name, syscall_name, args) \ + .text; \ + ENTRY(name); \ + LOADSYSCALL(syscall_name); \ + ta 0x11; \ + bcc,pt %xcc,1f; \ + nop; \ + SYSCALL_ERROR_HANDLER; \ +1: + +#undef PSEUDO_END +#define PSEUDO_END(name) \ + .size name,.-name + +#undef END +#define END(name) \ + .size name,.-name + +/* Careful here! This "ret" define can interfere; use jmpl if unsure. */ +#define ret retl; nop +#define r0 %o0 +#define r1 %o1 +#define MOVE(x,y) mov x, y + +#endif /* ASSEMBLER */ + +/* This is the offset from the %sp to the backing store above the + register windows. So if you poke stack memory directly you add this. */ +#define STACK_BIAS 2047 + +#endif /* linux/sparc64/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h b/sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h new file mode 100644 index 0000000000..160e2fc43a --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/ucontext.h @@ -0,0 +1,67 @@ +#ifndef _UCONTEXT_H +#define _UCONTEXT_H + +#include + +#define MC_TSTATE 0 +#define MC_PC 1 +#define MC_NPC 2 +#define MC_Y 3 +#define MC_G1 4 +#define MC_G2 5 +#define MC_G3 6 +#define MC_G4 7 +#define MC_G5 8 +#define MC_G6 9 +#define MC_G7 10 +#define MC_O0 11 +#define MC_O1 12 +#define MC_O2 13 +#define MC_O3 14 +#define MC_O4 15 +#define MC_O5 16 +#define MC_O6 17 +#define MC_O7 18 +#define MC_NGREG 19 + +typedef unsigned long mc_greg_t; +typedef mc_greg_t mc_gregset_t[MC_NGREG]; + +#define MC_MAXFPQ 16 +struct mc_fq { + unsigned long *mcfq_addr; + unsigned int mcfq_insn; +}; + +struct mc_fpu { + union { + unsigned int sregs[32]; + unsigned long dregs[32]; + long double qregs[16]; + } mcfpu_fregs; + unsigned long mcfpu_fsr; + unsigned long mcfpu_fprs; + unsigned long mcfpu_gsr; + struct mc_fq *mcfpu_fq; + unsigned char mcfpu_qcnt; + unsigned char mcfpu_qentsz; + unsigned char mcfpu_enab; +}; +typedef struct mc_fpu mc_fpu_t; + +typedef struct { + mc_gregset_t mc_gregs; + mc_greg_t mc_fp; + mc_greg_t mc_i7; + mc_fpu_t mc_fpregs; +} mcontext_t; + +struct ucontext { + struct ucontext *uc_link; + unsigned long uc_flags; + unsigned long uc_sigmask; + mcontext_t uc_mcontext; +}; +typedef struct ucontext ucontext_t; + +#endif /* ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/syscall.S b/sysdeps/unix/sysv/linux/sparc/syscall.S deleted file mode 100644 index 3921ca52dc..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/syscall.S +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - .text -ENTRY (syscall) - or %o0,%g0,%g1 - or %o1,%g0,%o0 - or %o2,%g0,%o1 - or %o3,%g0,%o2 - or %o4,%g0,%o3 - or %o5,%g0,%o4 - ta 0x10 - bcc 1f - nop - save %sp, -96, %sp - call __errno_location - nop - st %i0,[%o0] - restore - retl - mov -1, %o0 -1: - ret - -PSEUDO_END (syscall) diff --git a/sysdeps/unix/sysv/linux/sparc/syscalls.list b/sysdeps/unix/sysv/linux/sparc/syscalls.list deleted file mode 100644 index 7883d70719..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/syscalls.list +++ /dev/null @@ -1,3 +0,0 @@ -# File name Caller Syscall name # args Strong name Weak names - -s_llseek llseek _llseek 5 __sys_llseek diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep.S b/sysdeps/unix/sysv/linux/sparc/sysdep.S deleted file mode 100644 index 7e9023901b..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sysdep.S +++ /dev/null @@ -1,3 +0,0 @@ -/* Define errno */ - - .common errno,4,4 diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sysdep.h deleted file mode 100644 index 0e5a8cd218..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sysdep.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza , January 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _LINUX_SPARC_SYSDEP_H -#define _LINUX_SPARC_SYSDEP_H 1 - -#include - -#undef SYS_ify -#define SYS_ify(syscall_name) __NR_##syscall_name - -#ifdef ASSEMBLER - -#ifdef DONT_LOAD_G1 -# define LOADSYSCALL(x) -#else -# define LOADSYSCALL(x) mov __NR_##x, %g1 -#endif - -/* Linux/SPARC uses a different trap number */ -#undef PSEUDO -#undef ENTRY - -#define ENTRY(name) \ - .global C_SYMBOL_NAME(name); \ - .align 2;\ - C_LABEL(name);\ - .type name,@function; - -#ifdef PIC -#define SYSCALL_ERROR_HANDLER \ - .global C_SYMBOL_NAME(__errno_location);\ - .type C_SYMBOL_NAME(__errno_location),@function;\ - save %sp,-96,%sp;\ - call __errno_location;\ - nop;\ - st %i0,[%o0];\ - restore;\ - retl;\ - mov -1,%o0; -#else -#define SYSCALL_ERROR_HANDLER \ - save %sp,-96,%sp; \ - call __errno_location; \ - nop; \ - st %i0,[%o0]; \ - restore; \ - retl; \ - mov -1,%o0; -#endif /* PIC */ - -#define PSEUDO(name, syscall_name, args) \ - .text; \ - ENTRY(name); \ - LOADSYSCALL(syscall_name); \ - ta 0x10; \ - bcc,a 1f; \ - nop; \ - SYSCALL_ERROR_HANDLER; \ -1:; - -#endif /* ASSEMBLER */ - -#endif /* linux/sparc/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/sparc64/Dist b/sysdeps/unix/sysv/linux/sparc64/Dist deleted file mode 100644 index e770e20eb9..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/Dist +++ /dev/null @@ -1,7 +0,0 @@ -bits/mman.h -clone.S -kernel_stat.h -getcontext.S -setcontext.S -ucontext.h -init-first.h diff --git a/sysdeps/unix/sysv/linux/sparc64/Makefile b/sysdeps/unix/sysv/linux/sparc64/Makefile deleted file mode 100644 index c4d83226a2..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -ifeq ($(subdir),misc) -sysdep_headers += ucontext.h -sysdep_routines += getcontext setcontext -endif diff --git a/sysdeps/unix/sysv/linux/sparc64/__longjmp.S b/sysdeps/unix/sysv/linux/sparc64/__longjmp.S deleted file mode 100644 index 3107179fdc..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/__longjmp.S +++ /dev/null @@ -1 +0,0 @@ -/* There is no need for __longjmp what with setcontext. */ diff --git a/sysdeps/unix/sysv/linux/sparc64/bits/mman.h b/sysdeps/unix/sysv/linux/sparc64/bits/mman.h deleted file mode 100644 index 3e7f2900fa..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/bits/mman.h +++ /dev/null @@ -1,77 +0,0 @@ -/* Definitions for POSIX memory map inerface. Linux/SPARC version. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _SYS_MMAN_H -# error "Never include this file directly. Use 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. */ - -/* 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 0x0100 /* Stack-like segment. */ -# define MAP_DENYWRITE 0x0800 /* ETXTBSY */ -# define MAP_EXECUTABLE 0x1000 /* Mark it as an executable. */ -# define MAP_LOCKED 0x0100 /* Lock the mapping. */ -# define MAP_NORESERVE 0x0040 /* Don't check for reservations. */ -# define _MAP_NEW 0x80000000 /* Binary compatibility with SunOS. */ -#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 -#endif diff --git a/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h b/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h deleted file mode 100644 index ab850e5301..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/bits/setjmp.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _JMP_BUF_H -#define _JMP_BUF_H 1 - -#include - -typedef ucontext_t __jmp_buf[1]; - -#endif /* jmp_buf.h */ diff --git a/sysdeps/unix/sysv/linux/sparc64/bits/types.h b/sysdeps/unix/sysv/linux/sparc64/bits/types.h deleted file mode 100644 index 222967881f..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/bits/types.h +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright (C) 1991, 92, 94, 95, 96, 97 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 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* - * Never include this file directly; use instead. - */ - -#ifndef _BITS_TYPES_H -#define _BITS_TYPES_H 1 - -#include - -/* Convenience types. */ -typedef unsigned char __u_char; -typedef unsigned short __u_short; -typedef unsigned int __u_int; -typedef unsigned long __u_long; -typedef unsigned long int __u_quad_t; -typedef long int __quad_t; -typedef signed char __int8_t; -typedef unsigned char __uint8_t; -typedef signed short int __int16_t; -typedef unsigned short int __uint16_t; -typedef signed int __int32_t; -typedef unsigned int __uint32_t; -typedef signed long int __int64_t; -typedef unsigned long int __uint64_t; -typedef __quad_t *__qaddr_t; - -typedef __u_int __dev_t; /* Type of device numbers. */ -typedef __u_int __uid_t; /* Type of user identifications. */ -typedef __u_int __gid_t; /* Type of group identifications. */ -typedef __u_int __ino_t; /* Type of file serial numbers. */ -typedef __u_int __mode_t; /* Type of file attribute bitmasks. */ -typedef __u_int __nlink_t; /* Type of file link counts. */ -typedef long int __off_t; /* Type of file sizes and offsets. */ -typedef __quad_t __loff_t; /* Type of file sizes and offsets. */ -typedef int __pid_t; /* Type of process identifications. */ -typedef long int __ssize_t; /* Type of a byte count, or error. */ - -typedef struct - { - int __val[2]; - } __fsid_t; /* Type of file system IDs. */ - -/* Everythin' else. */ -typedef int __daddr_t; /* The type of a disk address. */ -typedef char *__caddr_t; -typedef long int __time_t; -typedef long int __swblk_t; /* Type of a swap block maybe? */ - -typedef long int __clock_t; - -/* One element in the file descriptor mask array. */ -typedef unsigned long int __fd_mask; - -/* Due to incaution, we may have gotten these from a kernel header file. */ -#undef __FD_SETSIZE -#undef __NFDBITS -#undef __FDMASK - -/* Number of descriptors that can fit in an `fd_set'. */ -#define __FD_SETSIZE 1024 - -/* It's easier to assume 8-bit bytes than to get CHAR_BIT. */ -#define __NFDBITS (8 * sizeof (__fd_mask)) -#define __FDELT(d) ((d) / __NFDBITS) -#define __FDMASK(d) (1 << ((d) % __NFDBITS)) - -/* fd_set for select and pselect. */ -typedef struct - { - /* XPG4.2 requires this member name. */ - __fd_mask fds_bits[__FD_SETSIZE / __NFDBITS]; - } __fd_set; - - -typedef int __key_t; - -#endif /* bits/types.h */ diff --git a/sysdeps/unix/sysv/linux/sparc64/brk.S b/sysdeps/unix/sysv/linux/sparc64/brk.S deleted file mode 100644 index 87412e095a..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/brk.S +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Richard Henderson , 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* __brk is a special syscall under Linux since it never returns an - error. Instead, the error condition is indicated by returning the old - break value (instead of the new, requested one). */ - -#include -#define _ERRNO_H -#include - -#ifdef PIC -.section .bss - .align 8 - .globl __curbrk -__curbrk: .skip 8 - .type __curbrk,@object - .size __curbrk,8 -#else -.common __curbrk, 8, 8 -#endif - - .text -ENTRY(__brk) - save %sp, -160, %sp -#ifdef PIC -1: rd %pc, %g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 - or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 - add %l7, %g1, %l7 -#endif - - LOADSYSCALL(brk) - mov %i0, %o0 - - ta 0x11 - - /* All the ways we can fail... */ - bcs,pn %xcc, .Lerr1 - nop - brz %i0, .Lok - subcc %i0, %o0, %g0 - bne,pn %xcc, .Lerr0 - - /* Update __curbrk and return cleanly. */ -.Lok: sethi %hi(__curbrk), %g1 - or %g1, %lo(__curbrk), %g1 -#ifdef PIC - ldx [%l7+%g1], %g1 - stx %o0, [%g1] -#else - stx %o0, [%g4+%g1] -#endif - mov %g0, %i0 - - /* Don't use "ret" cause the preprocessor will eat it. */ - jmpl %i7+8, %g0 - restore - - /* What a horrible way to die. */ -.Lerr0: set ENOMEM, %o0 -.Lerr1: sethi %hi(errno), %g1 - or %g1, %lo(errno), %g1 -#ifdef PIC - ldx [%l7+%g1], %g1 - st %o0, [%g1] -#else - st %o0, [%g4+%g1] -#endif -#ifdef _LIBC_REENTRANT - call __errno_location - mov %o0,%l1 - st %l1, [%o0] -#endif - sub %g0, 1, %i0 - jmpl %i7+8, %g0 - restore - - .size __brk, .-__brk - -weak_alias (__brk, brk) diff --git a/sysdeps/unix/sysv/linux/sparc64/clone.S b/sysdeps/unix/sysv/linux/sparc64/clone.S deleted file mode 100644 index fe38bf4ab7..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/clone.S +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - Contributed by Richard Henderson (rth@tamu.edu). - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* clone() is even more special than fork() as it mucks with stacks - and invokes a function in the right context after its all over. */ - -#include -#include - -/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */ - - .text - .align 4 - .globl __libc_clone - .type __libc_clone,@function - .weak clone - __clone = __libc_clone - clone = __libc_clone - -__libc_clone: - save %sp,-160,%sp - - /* sanity check arguments */ - brz,pn %i0, 99f - mov %i0, %l0 /* save fn */ - brz,pn %i1, 99f - mov %i3, %l3 /* save arg */ - - /* Do the system call */ - mov %i1, %o1 - mov %i2, %o0 - set __NR_clone, %g1 - ta 0x11 - bcs,pn %xcc, 99f - nop - brnz %o0, __thread_start - mov %o0, %i0 - ret - restore -99: -#ifdef PIC - rd %pc, %g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7 - or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(99b-.)), %l7 - add %l7, %g1, %l7 - set EINVAL, %i0 - sethi %hi(errno), %g2 - or %g2, %lo(errno), %g2 - st %i0, [%l7+%g2] -#else - sethi %hi(errno), %g2 - add %g2, %g4, %g2 - set EINVAL, %i0 - st %i0, [%g2+%lo(errno)] -#endif -#ifdef _LIBC_REENTRANT - call __errno_location - nop - st %i0, [%o0] -#endif - mov -1,%i0 - ret - restore - .size __libc_clone,.-__libc_clone - - .type __thread_start,@function -__thread_start: - mov %g0, %fp /* terminate backtrace */ - sub %sp, 6*8, %sp /* provide arg storage */ - call %l0 - mov %l3,%o0 - call _exit,0 - nop - .size __thread_start,.-__thread_start diff --git a/sysdeps/unix/sysv/linux/sparc64/fork.S b/sysdeps/unix/sysv/linux/sparc64/fork.S deleted file mode 100644 index c735da5a44..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/fork.S +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza , 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -PSEUDO (__libc_fork, fork, 0) - tst %o1 - be %xcc, 1f - nop - /* child: return 0 */ - clr %o0 -1: ret - -PSEUDO_END (__libc_fork) - -weak_alias (__libc_fork, __fork) -weak_alias (__libc_fork, fork) diff --git a/sysdeps/unix/sysv/linux/sparc64/getcontext.S b/sysdeps/unix/sysv/linux/sparc64/getcontext.S deleted file mode 100644 index 05b06269e4..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/getcontext.S +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - Contributed by Richard Henderson (rth@tamu.edu). - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -/* void getcontext(ucontext_t *); */ - -ENTRY(__getcontext) - - ta 0x6e - ret - -END(__getcontext) - -weak_alias(__getcontext, getcontext) diff --git a/sysdeps/unix/sysv/linux/sparc64/init-first.h b/sysdeps/unix/sysv/linux/sparc64/init-first.h deleted file mode 100644 index f7fad7f87f..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/init-first.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Prepare arguments for library initialization function. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* The job of this fragment it to find argc and friends for INIT. - This is done in one of two ways: either in the stack context - of program start, or having dlopen pass them in. */ - -#include - -#define __S1(x) #x -#define __S(x) __S1(x) - -#ifdef PIC - -#define SYSDEP_CALL_INIT(NAME, INIT) asm("\ - .weak _dl_starting_up - .global " #NAME " - .type " #NAME ",@function -" #NAME ": - save %sp, -64, %sp -1: rd %pc, %g1 - sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 - or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 - add %l7, %o7, %l7 - /* Are we a dynamic libc being loaded into a static program? */ - sethi %hi(_dl_starting_up), %g2 - or %g2, %lo(_dl_starting_up), %g2 - ld [%l7+%g2], %g2 - brz,pn %g2, 3f - sethi %hi(__libc_multiple_libcs), %g3 - ld [%g2], %g2 - subcc %g0, %g2, %g0 - subc %g0, -1, %g2 -3: or %g3, %lo(__libc_multiple_libcs), %g3 - ld [%l7+%g3], %g3 - st %g2, [%g3] - /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */ - brnz,pn %g2, " #INIT " - restore - ld [%sp+" __S(STACK_BIAS) "+22*8], %o0 - add %sp, " __S(STACK_BIAS) "+23*8, %o1 - sll %o0, 3, %o2 - add %o2, %o1, %o2 - add %o2, 8, %o2 - ba,a " #INIT " - .size "#NAME " .-" #NAME); - -#else - -#define SYSDEP_CALL_INIT(NAME, INIT) asm("\ - .weak _dl_starting_up - .global " #NAME " - .type " #NAME ",@function -" #NAME ": - /* Are we a dynamic libc being loaded into a static program? */ - sethi %hi(_dl_starting_up), %g2 - or %g2, %lo(_dl_starting_up), %g2 - brz,pt %g2, 3f - sethi %hi(__libc_multiple_libcs), %g3 - ld [%g4+%g2], %g2 - subcc %g0, %g2, %g0 - subc %g0, -1, %g2 -3: add %g3, %g4, %g3 - st %g2, [%g3+%lo(__libc_multiple_libcs)] - /* If so, argc et al are in %o0-%o2 already. Otherwise, load them. */ - brnz,pn %g2, " #INIT " - nop - ld [%sp+" __S(STACK_BIAS) "+22*8], %o0 - add %sp, " __S(STACK_BIAS) "+23*8, %o1 - sll %o0, 3, %o2 - add %o2, %o1, %o2 - add %o2, 8, %o2 - ba,a " #INIT " - .size "#NAME ", .-" #NAME); - -#endif diff --git a/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h b/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h deleted file mode 100644 index fcb752e3ec..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/kernel_stat.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Definition of `struct stat' used in the kernel */ -struct kernel_stat - { - unsigned int st_dev; - unsigned int st_ino; - unsigned int st_mode; - short int st_nlink; - unsigned int st_uid; - unsigned int st_gid; - unsigned int st_rdev; - long int st_size; - long int st_atime; - long int st_mtime; - long int st_ctime; - long int st_blksize; - long int st_blocks; - unsigned long int __unused1; - unsigned long int __unused2; - }; - -#define _HAVE___UNUSED1 -#define _HAVE___UNUSED2 diff --git a/sysdeps/unix/sysv/linux/sparc64/longjmp.S b/sysdeps/unix/sysv/linux/sparc64/longjmp.S deleted file mode 100644 index c81b10495e..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/longjmp.S +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - Contributed by Richard Henderson (rth@tamu.edu). - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* longjmp is implemented in terms of the setcontext trap on Linux/Sparc64. */ - -#include - -/* Offsets into the jmp_buf structure. */ - -#define O_mask_was_saved 512 -#define O_gregs 32 -#define O_g1 (O_gregs + 4*8) - - -/* void longjmp (sigjmp_buf env, int val) */ - -ENTRY(longjmp) - - /* Modify the context with the value we want to return. */ - movre %o1, 1, %o1 - stx %o1, [%o0 + O_g1] - - /* Let setcontext know if we want to modify the current sigmask. */ - ld [%o0 + O_mask_was_saved], %o1 - - /* And bamf back to where we belong! */ - ta 0x6f - -END(longjmp) diff --git a/sysdeps/unix/sysv/linux/sparc64/pipe.S b/sysdeps/unix/sysv/linux/sparc64/pipe.S deleted file mode 100644 index 82ff4eae3c..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/pipe.S +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Miguel de Icaza , 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -ENTRY (__libc_pipe) - mov %o0, %o2 /* Save PIPEDES. */ - LOADSYSCALL(pipe) - ta 0x11 - bcc,pn %xcc, 2f - nop - SYSCALL_ERROR_HANDLER - -2: st %o0, [%o2] /* PIPEDES[0] = %o0; */ - st %o1, [%o2 + 4] /* PIPEDES[1] = %o1; */ - retl - clr %o0 -PSEUDO_END (__libc_pipe) - -weak_alias (__libc_pipe, __pipe) -weak_alias (__libc_pipe, pipe) diff --git a/sysdeps/unix/sysv/linux/sparc64/profil-counter.h b/sysdeps/unix/sysv/linux/sparc64/profil-counter.h deleted file mode 100644 index 6a3f0a291a..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/profil-counter.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Low-level statistical profiling support function. Linux/Sparc64 version. - Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - -void -profil_counter (int signo, __siginfo_t *si) -{ - profil_count ((void *) si->si_regs.tpc); -} diff --git a/sysdeps/unix/sysv/linux/sparc64/setcontext.S b/sysdeps/unix/sysv/linux/sparc64/setcontext.S deleted file mode 100644 index 2968b65633..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/setcontext.S +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - Contributed by Richard Henderson (rth@tamu.edu). - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#include - - -/* void setcontext(ucontext_t *ctx); */ -.weak setcontext -ENTRY(setcontext) - - mov 1, %o1 - -/* void __setcontext(ucontext_t *ctx, int restoremask); */ -ENTRY(__setcontext) - - ta 0x6f - -END(__setcontext) diff --git a/sysdeps/unix/sysv/linux/sparc64/setjmp.S b/sysdeps/unix/sysv/linux/sparc64/setjmp.S deleted file mode 100644 index 8b88b49ac4..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/setjmp.S +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - Contributed by Richard Henderson (rth@tamu.edu). - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* __sigsetjmp is implemented in terms of the getcontext trap on - Linux/Sparc64. */ - -#include - -/* Offsets into the jmp_buf structure. */ - -#define O_mask_was_saved 512 -#define O_gregs 32 -#define O_g1 (O_gregs + 4*8) - - -/* int __sigsetjmp(jmp_buf, savemask) */ - -ENTRY(__sigsetjmp) - - /* Record whether the user is intending to save the sigmask. */ - st %o1, [%o0 + O_mask_was_saved] - - /* Load up our return value, as longjmp is going to override - the jmp_buf on its way back. */ - mov %g0, %g1 - - /* And call getcontext! */ - ta 0x6e - - retl - mov %g1, %o0 - -END(__sigsetjmp) diff --git a/sysdeps/unix/sysv/linux/sparc64/sigjmp.S b/sysdeps/unix/sysv/linux/sparc64/sigjmp.S deleted file mode 100644 index 940ccbcf68..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/sigjmp.S +++ /dev/null @@ -1 +0,0 @@ -/* There is no need for __sigjmp_save what with getcontext. */ diff --git a/sysdeps/unix/sysv/linux/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc64/syscalls.list deleted file mode 100644 index 66ba470994..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/syscalls.list +++ /dev/null @@ -1,26 +0,0 @@ -# File name Caller Syscall name # args Strong name Weak names - -# Whee! 64-bit systems naturally implement llseek. -llseek EXTRA lseek 3 llseek - -# Override select.S in parent directory: -select - select 5 __select select -accept - accept 3 __accept accept -bind - bind 3 __bind bind -connect - connect 3 __connect connect -getpeername - getpeername 3 __getpeername getpeername -getsockname - getsockname 3 __getsockname getsockname -getsockopt - getsockopt 5 __getsockopt getsockopt -listen - listen 2 __listen listen -recv - recv 4 __recv recv -recvfrom - recvfrom 6 __recvfrom recvfrom -recvmsg - recvmsg 3 __recvmsg recvmsg -send - send 4 __send send -sendmsg - sendmsg 3 __sendmsg sendmsg -sendto - sendto 6 __sendto sendto -setsockopt - setsockopt 5 __setsockopt setsockopt -shutdown - shutdown 2 __shutdown shutdown -socketpair - socketpair 4 __socketpair socketpair - -# Another broken Linux/i386 idea layed to rest -ptrace - ptrace 4 __ptrace ptrace diff --git a/sysdeps/unix/sysv/linux/sparc64/sysdep.S b/sysdeps/unix/sysv/linux/sparc64/sysdep.S deleted file mode 100644 index 736578083c..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/sysdep.S +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Richard Henderson , 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - - -/* Define errno */ - - .section .bss - .globl errno - .align 2 -errno: .space 4 - .type errno, @object - .size errno, 4 - - .globl __errno -__errno = errno diff --git a/sysdeps/unix/sysv/linux/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc64/sysdep.h deleted file mode 100644 index f01c1f43cd..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/sysdep.h +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright (C) 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Richard Henderson , 1997. - - 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, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _LINUX_SPARC64_SYSDEP_H -#define _LINUX_SPARC64_SYSDEP_H 1 - -#include - -#undef SYS_ify -#define SYS_ify(syscall_name) __NR_##syscall_name - -#ifdef ASSEMBLER - -#ifdef DONT_LOAD_G1 -# define LOADSYSCALL(x) -#else -# define LOADSYSCALL(x) mov __NR_##x, %g1 -#endif - -/* Linux/SPARC uses a different trap number */ -#undef PSEUDO -#undef ENTRY - -#define ENTRY(name) \ - .global C_SYMBOL_NAME(name); \ - .align 2; \ - C_LABEL(name); \ - .type name,@function; - -#ifdef PIC -#define SYSCALL_ERROR_HANDLER1(R) \ - .global C_SYMBOL_NAME(errno); \ - .type C_SYMBOL_NAME(errno),@object; \ -0: rd %pc,%g1; \ - sethi %hi(_GLOBAL_OFFSET_TABLE_-(0b-.)),%g2; \ - add %g2,%lo(_GLOBAL_OFFSET_TABLE_-(0b-.)),%g2; \ - add %g2,%g1,%g1; \ - sethi %hi(errno),%g2; \ - add %g2,%lo(errno),%g2; \ - ldx [%g1+%g2],%g2; \ - st R,[%g2] -#else -#define SYSCALL_ERROR_HANDLER1(R) \ - .global C_SYMBOL_NAME(errno); \ - .type C_SYMBOL_NAME(errno),@object; \ - sethi %hi(errno),%g1; \ - add %g1,%g4,%g1; \ - st R,[%g1+%lo(errno)] -#endif - -#ifdef _LIBC_REENTRANT -#define SYSCALL_ERROR_HANDLER \ - .global C_SYMBOL_NAME(__errno_location); \ - .type C_SYMBOL_NAME(__errno_location),@function; \ - save %sp,-128,%sp; \ - SYSCALL_ERROR_HANDLER1(%i0); \ - call __errno_location; \ - nop; \ - st %i0,[%o0]; \ - sub %g0,1,%i0; \ - jmpl %i7+8, %g0; \ - restore -#else -#define SYSCALL_ERROR_HANDLER \ - SYSCALL_ERROR_HANDLER1(%o0); \ - retl; \ - sub %g0,1,%i0 -#endif - -#define PSEUDO(name, syscall_name, args) \ - .text; \ - ENTRY(name); \ - LOADSYSCALL(syscall_name); \ - ta 0x11; \ - bcc,pt %xcc,1f; \ - nop; \ - SYSCALL_ERROR_HANDLER; \ -1: - -#undef PSEUDO_END -#define PSEUDO_END(name) \ - .size name,.-name - -#undef END -#define END(name) \ - .size name,.-name - -/* Careful here! This "ret" define can interfere; use jmpl if unsure. */ -#define ret retl; nop -#define r0 %o0 -#define r1 %o1 -#define MOVE(x,y) mov x, y - -#endif /* ASSEMBLER */ - -/* This is the offset from the %sp to the backing store above the - register windows. So if you poke stack memory directly you add this. */ -#define STACK_BIAS 2047 - -#endif /* linux/sparc64/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/sparc64/ucontext.h b/sysdeps/unix/sysv/linux/sparc64/ucontext.h deleted file mode 100644 index 160e2fc43a..0000000000 --- a/sysdeps/unix/sysv/linux/sparc64/ucontext.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef _UCONTEXT_H -#define _UCONTEXT_H - -#include - -#define MC_TSTATE 0 -#define MC_PC 1 -#define MC_NPC 2 -#define MC_Y 3 -#define MC_G1 4 -#define MC_G2 5 -#define MC_G3 6 -#define MC_G4 7 -#define MC_G5 8 -#define MC_G6 9 -#define MC_G7 10 -#define MC_O0 11 -#define MC_O1 12 -#define MC_O2 13 -#define MC_O3 14 -#define MC_O4 15 -#define MC_O5 16 -#define MC_O6 17 -#define MC_O7 18 -#define MC_NGREG 19 - -typedef unsigned long mc_greg_t; -typedef mc_greg_t mc_gregset_t[MC_NGREG]; - -#define MC_MAXFPQ 16 -struct mc_fq { - unsigned long *mcfq_addr; - unsigned int mcfq_insn; -}; - -struct mc_fpu { - union { - unsigned int sregs[32]; - unsigned long dregs[32]; - long double qregs[16]; - } mcfpu_fregs; - unsigned long mcfpu_fsr; - unsigned long mcfpu_fprs; - unsigned long mcfpu_gsr; - struct mc_fq *mcfpu_fq; - unsigned char mcfpu_qcnt; - unsigned char mcfpu_qentsz; - unsigned char mcfpu_enab; -}; -typedef struct mc_fpu mc_fpu_t; - -typedef struct { - mc_gregset_t mc_gregs; - mc_greg_t mc_fp; - mc_greg_t mc_i7; - mc_fpu_t mc_fpregs; -} mcontext_t; - -struct ucontext { - struct ucontext *uc_link; - unsigned long uc_flags; - unsigned long uc_sigmask; - mcontext_t uc_mcontext; -}; -typedef struct ucontext ucontext_t; - -#endif /* ucontext.h */ diff --git a/sysdeps/unix/sysv/minix/bits/sigaction.h b/sysdeps/unix/sysv/minix/bits/sigaction.h index 5bf5985c51..732befc630 100644 --- a/sysdeps/unix/sysv/minix/bits/sigaction.h +++ b/sysdeps/unix/sysv/minix/bits/sigaction.h @@ -31,14 +31,14 @@ struct sigaction /* Bits in `sa_flags'. */ #ifdef __USE_MISC -#define SA_ONSTACK 0x1 /* Take signal on signal stack. */ -#define SA_RESETHAND 0x2 /* Reset signal handler when signal caught. */ -#define SA_NODEFER 0x4 /* Don't block signal while catching it. */ -#define SA_RESTART 0x8 /* Don't restart syscall on signal return. */ -#define SA_SIGINFO 0x10 /* Extended signal handling. */ -#define SA_NOCLDWAIT 0x20 /* Don't create zombies. */ -#define SA_COMPAT 0x80 /* Internal flag for old signal catchers. */ -#define SA_DISABLE 0x100 /* Disable alternate signal stack. */ +# define SA_ONSTACK 0x1 /* Take signal on signal stack. */ +# define SA_RESETHAND 0x2 /* Reset signal handler when signal caught. */ +# define SA_NODEFER 0x4 /* Don't block signal while catching it. */ +# define SA_RESTART 0x8 /* Restart syscall on signal return. */ +# define SA_SIGINFO 0x10 /* Extended signal handling. */ +# define SA_NOCLDWAIT 0x20 /* Don't create zombies. */ +# define SA_COMPAT 0x80 /* Internal flag for old signal catchers. */ +# define SA_DISABLE 0x100 /* Disable alternate signal stack. */ #endif #define SA_NOCLDSTOP 0x40 /* Don't send SIGCHLD when children stop. */ diff --git a/sysdeps/unix/sysv/sysv4/bits/sigaction.h b/sysdeps/unix/sysv/sysv4/bits/sigaction.h index 3a2ffb2e10..ce3ab5e60c 100644 --- a/sysdeps/unix/sysv/sysv4/bits/sigaction.h +++ b/sysdeps/unix/sysv/sysv4/bits/sigaction.h @@ -35,13 +35,13 @@ struct sigaction /* Bits in `sa_flags'. */ #ifdef __USE_MISC -#define SA_ONSTACK 0x1 /* Take signal on signal stack. */ -#define SA_RESETHAND 0x2 /* Reset to SIG_DFL on entry to handler. */ -#define SA_RESTART 0x4 /* Don't restart syscall on signal return. */ -#define SA_SIGINFO 0x8 /* Provide additional info to the handler. */ -#define SA_NODEFER 0x10 /* Don't automatically block the signal when +# define SA_ONSTACK 0x1 /* Take signal on signal stack. */ +# define SA_RESETHAND 0x2 /* Reset to SIG_DFL on entry to handler. */ +# define SA_RESTART 0x4 /* Restart syscall on signal return. */ +# define SA_SIGINFO 0x8 /* Provide additional info to the handler. */ +# define SA_NODEFER 0x10 /* Don't automatically block the signal when its handler is being executed. */ -#define SA_NOCLDWAIT 0x10000 /* Don't save zombie processes. */ +# define SA_NOCLDWAIT 0x10000 /* Don't save zombie processes. */ #endif #define SA_NOCLDSTOP 0x20000 /* Don't send SIGCHLD when children stop. */ diff --git a/time/tzset.c b/time/tzset.c index d3625fe9dd..d7659008bc 100644 --- a/time/tzset.c +++ b/time/tzset.c @@ -328,12 +328,9 @@ __tzset_internal (always) { register tz_rule *tzr = &tz_rules[whichrule]; - if (*tz == ',') - { - ++tz; - if (*tz == '\0') - return; - } + /* Ignore comma to support string following the incorrect + specification in early POSIX.1 printings. */ + tz += *tz == ','; /* Get the date of the change. */ if (*tz == 'J' || isdigit (*tz)) -- cgit v1.2.3