summaryrefslogtreecommitdiff
path: root/sysdeps/sh
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-06-12 20:50:37 +0000
committerUlrich Drepper <drepper@redhat.com>2000-06-12 20:50:37 +0000
commit3846ef75cf3309e2e8264c81fb510cdd54bee4fd (patch)
tree45ad5244c5af4a690d56f41da4ee36d864bc4242 /sysdeps/sh
parent55985355ade2a038b567dd9b58153a98384ae703 (diff)
downloadglibc-3846ef75cf3309e2e8264c81fb510cdd54bee4fd.tar.gz
Update.
2000-06-12 Kazumoto Kojima <kkojima@rr.iij4u.or.jp> Yutaka Niibe <gniibe@chroot.org> * sysdeps/sh/Dist: New file. * sysdeps/sh/Implies: New file. * sysdeps/sh/gmp-mparam.h: New file. * sysdeps/sh/init-first.c: New file. * sysdeps/sh/machine-gmon.h: New file. * sysdeps/sh/memcpy.S: New file. * sysdeps/sh/memprof.h: New file. * sysdeps/sh/memset.S: New file. * sysdeps/sh/sh3/__longjmp.S: New file. * sysdeps/sh/sh3/bits/endian.h: New file. * sysdeps/sh/sh3/bits/huge_val.h: New file. * sysdeps/sh/sh3/bits/setjmp.h: New file. * sysdeps/sh/sh3/bsd-_setjmp.S: New file. * sysdeps/sh/sh3/bsd-setjmp.S: New file. * sysdeps/sh/sh3/dl-machine.h: New file. * sysdeps/sh/sh3/elf/initfini.c: New file. * sysdeps/sh/sh3/elf/start.S: New file. * sysdeps/sh/sh3/setjmp.S: New file. * sysdeps/sh/sh3/sys/ucontext.h: New file. * sysdeps/sh/sh4/__longjmp.S: New file. * sysdeps/sh/sh4/bits/endian.h: New file. * sysdeps/sh/sh4/bits/huge_val.h: New file. * sysdeps/sh/sh4/bits/setjmp.h: New file. * sysdeps/sh/sh4/bsd-_setjmp.S: New file. * sysdeps/sh/sh4/bsd-setjmp.S: New file. * sysdeps/sh/sh4/dl-machine.h: New file. * sysdeps/sh/sh4/elf/initfini.c: New file. * sysdeps/sh/sh4/elf/start.S: New file. * sysdeps/sh/sh4/fpu/bits/fenv.h: New file. * sysdeps/sh/sh4/fpu/bits/huge_val.h: New file. * sysdeps/sh/sh4/fpu/bits/mathdef.h: New file. * sysdeps/sh/sh4/fpu/fclrexcpt.c: New file. * sysdeps/sh/sh4/fpu/fegetenv.c: New file. * sysdeps/sh/sh4/fpu/fegetround.c: New file. * sysdeps/sh/sh4/fpu/feholdexcpt.c: New file. * sysdeps/sh/sh4/fpu/fesetenv.c: New file. * sysdeps/sh/sh4/fpu/fesetround.c: New file. * sysdeps/sh/sh4/fpu/fpu_control.h: New file. * sysdeps/sh/sh4/fpu/fraiseexcpt.c: New file. * sysdeps/sh/sh4/fpu/fsetexcptflg.c: New file. * sysdeps/sh/sh4/fpu/ftestexcept.c: New file. * sysdeps/sh/sh4/fpu/libm-test-ulps: New file. * sysdeps/sh/sh4/setjmp.S: New file. * sysdeps/sh/sh4/sys/ucontext.h: New file. * sysdeps/sh/strlen.S: New file. * sysdeps/sh/sysdep.h: New file. * sysdeps/unix/sh/sysdep.S: New file. * sysdeps/unix/sh/sysdep.h: New file. * sysdeps/unix/sysv/linux/sh/Dist: New file. * sysdeps/unix/sysv/linux/sh/Makefile: New file. * sysdeps/unix/sysv/linux/sh/Versions: New file. * sysdeps/unix/sysv/linux/sh/bits/mman.h: New file. * sysdeps/unix/sysv/linux/sh/bits/resource.h: New file. * sysdeps/unix/sysv/linux/sh/brk.c: New file. * sysdeps/unix/sysv/linux/sh/chown.c: New file. * sysdeps/unix/sysv/linux/sh/clone.S: New file. * sysdeps/unix/sysv/linux/sh/fchown.c: New file. * sysdeps/unix/sysv/linux/sh/fxstat.c: New file. * sysdeps/unix/sysv/linux/sh/getegid.c: New file. * sysdeps/unix/sysv/linux/sh/geteuid.c: New file. * sysdeps/unix/sysv/linux/sh/getgroups.c: New file. * sysdeps/unix/sysv/linux/sh/getresgid.c: New file. * sysdeps/unix/sysv/linux/sh/getresuid.c: New file. * sysdeps/unix/sysv/linux/sh/getrlimit.c: New file. * sysdeps/unix/sysv/linux/sh/getrlimit64.c: New file. * sysdeps/unix/sysv/linux/sh/getuid.c: New file. * sysdeps/unix/sysv/linux/sh/lchown.c: New file. * sysdeps/unix/sysv/linux/sh/lxstat.c: New file. * sysdeps/unix/sysv/linux/sh/msgctl.c: New file. * sysdeps/unix/sysv/linux/sh/oldgetrlimit64.c: New file. * sysdeps/unix/sysv/linux/sh/pipe.S: New file. * sysdeps/unix/sysv/linux/sh/profil-counter.h: New file. * sysdeps/unix/sysv/linux/sh/semctl.c: New file. * sysdeps/unix/sysv/linux/sh/setegid.c: New file. * sysdeps/unix/sysv/linux/sh/seteuid.c: New file. * sysdeps/unix/sysv/linux/sh/setfsgid.c: New file. * sysdeps/unix/sysv/linux/sh/setfsuid.c: New file. * sysdeps/unix/sysv/linux/sh/setgid.c: New file. * sysdeps/unix/sysv/linux/sh/setgroups.c: New file. * sysdeps/unix/sysv/linux/sh/setregid.c: New file. * sysdeps/unix/sysv/linux/sh/setresgid.c: New file. * sysdeps/unix/sysv/linux/sh/setresuid.c: New file. * sysdeps/unix/sysv/linux/sh/setreuid.c: New file. * sysdeps/unix/sysv/linux/sh/setrlimit.c: New file. * sysdeps/unix/sysv/linux/sh/setuid.c: New file. * sysdeps/unix/sysv/linux/sh/sh3/register-dump.h: New file. * sysdeps/unix/sysv/linux/sh/sh4/register-dump.h: New file. * sysdeps/unix/sysv/linux/sh/shmctl.c: New file. * sysdeps/unix/sysv/linux/sh/sigcontextinfo.h: New file. * sysdeps/unix/sysv/linux/sh/socket.S: New file. * sysdeps/unix/sysv/linux/sh/sys/io.h: New file. * sysdeps/unix/sysv/linux/sh/sys/ucontext.h: New file. * sysdeps/unix/sysv/linux/sh/sys/user.h: New file. * sysdeps/unix/sysv/linux/sh/syscalls.list: New file. * sysdeps/unix/sysv/linux/sh/sysdep.S: New file. * sysdeps/unix/sysv/linux/sh/sysdep.h: New file. * sysdeps/unix/sysv/linux/sh/vfork.S: New file. * sysdeps/unix/sysv/linux/sh/xstat.c: New file.
Diffstat (limited to 'sysdeps/sh')
-rw-r--r--sysdeps/sh/Dist1
-rw-r--r--sysdeps/sh/Implies3
-rw-r--r--sysdeps/sh/elf/initfini.c151
-rw-r--r--sysdeps/sh/elf/start.S90
-rw-r--r--sysdeps/sh/gmp-mparam.h30
-rw-r--r--sysdeps/sh/init-first.c69
-rw-r--r--sysdeps/sh/machine-gmon.h34
-rw-r--r--sysdeps/sh/memcpy.S231
-rw-r--r--sysdeps/sh/memprof.h21
-rw-r--r--sysdeps/sh/memset.S79
-rw-r--r--sysdeps/sh/sh3/__longjmp.S44
-rw-r--r--sysdeps/sh/sh3/bits/endian.h13
-rw-r--r--sysdeps/sh/sh3/bits/huge_val.h104
-rw-r--r--sysdeps/sh/sh3/bits/setjmp.h45
-rw-r--r--sysdeps/sh/sh3/bsd-_setjmp.S51
-rw-r--r--sysdeps/sh/sh3/bsd-setjmp.S51
-rw-r--r--sysdeps/sh/sh3/dl-machine.h520
-rw-r--r--sysdeps/sh/sh3/setjmp.S67
-rw-r--r--sysdeps/sh/sh4/__longjmp.S49
-rw-r--r--sysdeps/sh/sh4/bits/endian.h13
-rw-r--r--sysdeps/sh/sh4/bits/huge_val.h104
-rw-r--r--sysdeps/sh/sh4/bits/setjmp.h50
-rw-r--r--sysdeps/sh/sh4/bsd-_setjmp.S50
-rw-r--r--sysdeps/sh/sh4/bsd-setjmp.S50
-rw-r--r--sysdeps/sh/sh4/dl-machine.h515
-rw-r--r--sysdeps/sh/sh4/fpu/fclrexcpt.c45
-rw-r--r--sysdeps/sh/sh4/fpu/fegetenv.c34
-rw-r--r--sysdeps/sh/sh4/fpu/fegetround.c33
-rw-r--r--sysdeps/sh/sh4/fpu/feholdexcpt.c37
-rw-r--r--sysdeps/sh/sh4/fpu/fesetenv.c37
-rw-r--r--sysdeps/sh/sh4/fpu/fesetround.c43
-rw-r--r--sysdeps/sh/sh4/fpu/fpu_control.h56
-rw-r--r--sysdeps/sh/sh4/fpu/fraiseexcpt.c38
-rw-r--r--sysdeps/sh/sh4/fpu/fsetexcptflg.c43
-rw-r--r--sysdeps/sh/sh4/fpu/ftestexcept.c32
-rw-r--r--sysdeps/sh/sh4/fpu/libm-test-ulps1079
-rw-r--r--sysdeps/sh/sh4/setjmp.S72
-rw-r--r--sysdeps/sh/strlen.S84
-rw-r--r--sysdeps/sh/sys/ucontext.h99
-rw-r--r--sysdeps/sh/sysdep.h76
40 files changed, 4243 insertions, 0 deletions
diff --git a/sysdeps/sh/Dist b/sysdeps/sh/Dist
new file mode 100644
index 0000000000..d78de40205
--- /dev/null
+++ b/sysdeps/sh/Dist
@@ -0,0 +1 @@
+ieee754.h
diff --git a/sysdeps/sh/Implies b/sysdeps/sh/Implies
new file mode 100644
index 0000000000..780c4e2467
--- /dev/null
+++ b/sysdeps/sh/Implies
@@ -0,0 +1,3 @@
+wordsize-32
+ieee754/flt-32
+ieee754/dbl-64
diff --git a/sysdeps/sh/elf/initfini.c b/sysdeps/sh/elf/initfini.c
new file mode 100644
index 0000000000..0660c2cd8c
--- /dev/null
+++ b/sysdeps/sh/elf/initfini.c
@@ -0,0 +1,151 @@
+/* Special .init and .fini section support for SH.
+ Copyright (C) 2000 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.
+
+ In addition to the permissions in the GNU Library General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file with other
+ programs, and to distribute those programs without any restriction
+ coming from the use of this file. (The Library General Public
+ License restrictions do apply in other respects; for example, they
+ cover modification of the file, and distribution when not linked
+ into another program.)
+
+ 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, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* This file is compiled into assembly code which is then munged by a sed
+ script into two files: crti.s and crtn.s.
+
+ * crti.s puts a function prologue at the beginning of the
+ .init and .fini sections and defines global symbols for
+ those addresses, so they can be called as functions.
+
+ * crtn.s puts the corresponding function epilogues
+ in the .init and .fini sections. */
+
+__asm__ ("
+
+#include \"defs.h\"
+#define SHARED
+
+/*@HEADER_ENDS*/
+
+/*@TESTS_BEGIN*/
+
+/*@TESTS_END*/
+
+/*@_init_PROLOG_BEGINS*/
+ .section .init
+ .align 5
+ .global _init
+ .type _init,@function
+_init:
+ mov.l r12,@-r15
+ mov.l r14,@-r15
+ sts.l pr,@-r15
+#ifdef SHARED
+ mova .L22,r0
+ mov.l .L22,r12
+ add r0,r12
+ mova .L23,r0
+ mov.l .L23,r1
+ add r0,r1
+#else
+ mov.l .L23,r1
+#endif
+ jsr @r1
+ mov r15,r14
+ bra 1f
+ nop
+ .align 2
+#ifdef SHARED
+.L22:
+ .long _GLOBAL_OFFSET_TABLE_
+.L23:
+ .long __gmon_start__@PLT
+#else
+.L23:
+ .long __gmon_start__
+#endif
+1:
+ ALIGN
+ END_INIT
+
+
+/*@_init_PROLOG_ENDS*/
+
+/*@_init_EPILOG_BEGINS*/
+ .section .init
+ mov r14,r15
+ lds.l @r15+,pr
+ mov.l @r15+,r14
+ rts
+ mov.l @r15+,r12
+ END_INIT
+ .section .text
+ .align 5
+ .weak __gmon_start__
+ .type __gmon_start__,@function
+__gmon_start__:
+ mov.l r14,@-r15
+ mov r15,r14
+ mov r14,r15
+ rts
+ mov.l @r15+,r14
+
+/*@_init_EPILOG_ENDS*/
+
+/*@_fini_PROLOG_BEGINS*/
+ .section .fini
+ .align 5
+ .global _fini
+ .type _fini,@function
+_fini:
+ mov.l r12,@-$r15
+ mov.l r14,@-r15
+ sts.l pr,@-r15
+#ifdef SHARED
+ mova .L27,r0
+ mov.l .L27,r12
+ add r0,r12
+#endif
+ mov r15,r14
+ ALIGN
+ END_FINI
+#ifdef SHARED
+ bra 1f
+ nop
+ .align 2
+.L27:
+ .long _GLOBAL_OFFSET_TABLE_
+#endif
+1:
+/*@_fini_PROLOG_ENDS*/
+
+/*@_fini_EPILOG_BEGINS*/
+ .section .fini
+ mov r14,r15
+ lds.l @r15+,pr
+ mov.l @r15+,r14
+ rts
+ mov.l @r15+,r12
+
+ END_FINI
+
+/*@_fini_EPILOG_ENDS*/
+
+/*@TRAILER_BEGINS*/
+");
diff --git a/sysdeps/sh/elf/start.S b/sysdeps/sh/elf/start.S
new file mode 100644
index 0000000000..21b1ec2a4b
--- /dev/null
+++ b/sysdeps/sh/elf/start.S
@@ -0,0 +1,90 @@
+/* Startup code for SH & ELF.
+ Copyright (C) 1999 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU 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. */
+
+/* This is the canonical entry point, usually the first thing in the text
+ segment.
+
+ Note that the code in the .init section has already been run.
+ This includes _init and _libc_init
+
+
+ At this entry point, most registers' values are unspecified, except:
+
+ r4 Contains a function pointer to be registered with `atexit'.
+ This is how the dynamic linker arranges to have DT_FINI
+ functions called for shared libraries that have been loaded
+ before this code runs.
+
+ sp The stack contains the arguments and environment:
+ 0(sp) argc
+ 4(sp) argv[0]
+ ...
+ (4*argc)(sp) NULL
+ (4*(argc+1))(sp) envp[0]
+ ...
+ NULL
+*/
+
+ .text
+ .globl _start
+_start:
+ /* Clear the frame pointer since this is the outermost frame. */
+ mov #0, r14
+
+ /* Pop argc off the stack and save a pointer to argv */
+ mov.l @r15+,r5
+ mov r15, r6
+
+ /* Push the last arguments to main() onto the stack */
+ mov.l r4,@-r15
+ mov.l L_fini,r0
+ mov.l r0,@-r15
+
+ /* Set up the other arguments for main() that go in registers */
+ mov.l L_main,r4
+ mov.l L_init,r7
+
+ /* __libc_start_main (main, argc, argv, init, fini, rtld_fini) */
+
+ /* Let the libc call main and exit with its return code. */
+ mov.l L_libc_start_main,r1
+ jsr @r1
+ nop
+ /* should never get here....*/
+ mov.l L_abort,r1
+ jsr @r1
+ nop
+ .align 2
+L_main:
+ .long main
+L_init:
+ .long _init
+L_fini:
+ .long _fini
+L_libc_start_main:
+ .long __libc_start_main
+L_abort:
+ .long abort
+/* Define a symbol for the first piece of initialized data. */
+ .data
+ .globl __data_start
+__data_start:
+ .long 0
+ .weak data_start
+ data_start = __data_start
diff --git a/sysdeps/sh/gmp-mparam.h b/sysdeps/sh/gmp-mparam.h
new file mode 100644
index 0000000000..f6423c39dd
--- /dev/null
+++ b/sysdeps/sh/gmp-mparam.h
@@ -0,0 +1,30 @@
+/* gmp-mparam.h -- Compiler/machine parameter header file.
+
+Copyright (C) 1991, 1993, 1994, 1995, 2000 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 32
+#define BYTES_PER_MP_LIMB 4
+#define BITS_PER_LONGINT 32
+#define BITS_PER_INT 32
+#define BITS_PER_SHORTINT 16
+#define BITS_PER_CHAR 8
+
+#define IEEE_DOUBLE_BIG_ENDIAN 0
+#define IEEE_DOUBLE_MIXED_ENDIAN 1
diff --git a/sysdeps/sh/init-first.c b/sysdeps/sh/init-first.c
new file mode 100644
index 0000000000..20d417f18b
--- /dev/null
+++ b/sysdeps/sh/init-first.c
@@ -0,0 +1,69 @@
+/* Initialization code run first thing by the ELF startup code. For SH.
+ Copyright (C) 1995, 1996, 1997, 1998, 2000 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 <unistd.h>
+
+extern void __libc_init (int, char **, char **);
+extern void __getopt_clean_environment (char **);
+extern void __libc_global_ctors (void);
+
+int __libc_multiple_libcs = 1;
+
+static void
+init (int *data)
+{
+ int argc = *data;
+ char **argv = (void *) (data + 1);
+ char **envp = &argv[argc + 1];
+
+ __environ = envp;
+ __libc_init (argc, argv, envp);
+
+ /* This is a hack to make the special getopt in GNU libc working. */
+ __getopt_clean_environment (envp);
+}
+
+#ifdef SHARED
+/* This function is called to initialize the shared C library.
+ It is called just before the user _start code from sh/sh[34]/elf/start.S,
+ with the stack set up as that code gets it. */
+
+/* NOTE! The linker notices the magical name `_init' and sets the DT_INIT
+ pointer in the dynamic section based solely on that. It is convention
+ for this function to be in the `.init' section, but the symbol name is
+ the only thing that really matters!! */
+/*void _init (int argc, ...) __attribute__ ((unused, section (".init")));*/
+
+void
+_init (int argc, ...)
+{
+ init (&argc);
+
+ __libc_global_ctors ();
+}
+#endif
+
+
+void
+__libc_init_first (int argc __attribute__ ((unused)), ...)
+{
+#ifndef SHARED
+ init (&argc);
+#endif
+}
diff --git a/sysdeps/sh/machine-gmon.h b/sysdeps/sh/machine-gmon.h
new file mode 100644
index 0000000000..d8b86e59ff
--- /dev/null
+++ b/sysdeps/sh/machine-gmon.h
@@ -0,0 +1,34 @@
+/* Machine-dependent definitions for profiling support. SH version.
+ Copyright (C) 1996, 1997, 1998, 2000 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. */
+
+/* NOTYET */
+
+/* We must not pollute the global namespace. */
+#define mcount_internal __mcount_internal
+
+void mcount_internal (u_long frompc, u_long selfpc);
+
+#define _MCOUNT_DECL(frompc, selfpc) \
+void mcount_internal (u_long frompc, u_long selfpc)
+
+
+/* Define MCOUNT as empty since we have the implementation in another
+ file. */
+#define MCOUNT
+
diff --git a/sysdeps/sh/memcpy.S b/sysdeps/sh/memcpy.S
new file mode 100644
index 0000000000..18be7dc7f4
--- /dev/null
+++ b/sysdeps/sh/memcpy.S
@@ -0,0 +1,231 @@
+/* Copyright (C) 1999, 2000 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>
+#include <endian.h>
+
+/*
+ * void *memcpy(void *dst, const void *src, size_t n);
+ * No overlap between the memory of DST and of SRC are assumed.
+ */
+
+ENTRY(memcpy)
+ tst r6,r6
+ bt/s 1f
+ mov r4,r0
+ mov #12,r1
+ cmp/gt r6,r1
+ bf 2f
+0:
+ mov.b @r5+,r1
+ dt r6
+ mov.b r1,@r4
+ bf/s 0b
+ add #1,r4
+1:
+ rts
+ nop
+2:
+ mov.l r8,@-r15
+ mov.l r9,@-r15
+ mov r6,r2
+ mov.l r10,@-r15
+ mov.l r11,@-r15
+ mov.l r14,@-r15
+ mov r4,r11
+ mov r15,r14
+ mov r5,r0
+ and #1,r0
+ tst r0,r0
+ bt/s .L42
+ mov r5,r0
+ mov.b @r5+,r1
+ add #-1,r2
+ add #1,r4
+ mov.b r1,@r11
+ mov r5,r0
+.L42:
+ and #2,r0
+ tst r0,r0
+ bt/s .L43
+ mov r4,r0
+ mov.b @r5+,r1
+ mov.b r1,@r4
+ mov.b @r5+,r1
+ add #1,r4
+ add #-2,r2
+ mov.b r1,@r4
+ add #1,r4
+ mov r4,r0
+.L43:
+ and #1,r0
+ tst r0,r0
+ bf/s .L38
+ mov r4,r0
+ and #2,r0
+ tst r0,r0
+ bf/s .L7
+ mov r2,r0
+ shlr2 r0
+ and #3,r0
+ cmp/eq #2,r0
+ bt/s .L10
+ mov #2,r1
+ cmp/gt r1,r0
+ bt/s .L14
+ cmp/eq #3,r0
+ cmp/eq #1,r0
+ bt/s .L11
+ mov r0,r1
+ bra .L44
+ shll2 r1
+ .align 5
+.L14:
+ bf .L8
+ mov.l @(8,r5),r1
+ mov.l r1,@(8,r4)
+.L10:
+ mov.l @(4,r5),r1
+ mov.l r1,@(4,r4)
+.L11:
+ mov.l @r5,r1
+ mov.l r1,@r4
+.L8:
+ mov r0,r1
+ shll2 r1
+.L44:
+ add r1,r4
+ add r1,r5
+ mov r2,r0
+ mov #-4,r1
+ shad r1,r0
+ mov #3,r6
+ bra .L37
+ and r2,r6
+ .align 5
+.L18:
+ mov.l @r5+,r1
+ mov.l @r5+,r2
+ mov.l @r5+,r3
+ mov.l @r5+,r7
+ mov.l r1,@r4
+ mov.l r2,@(4,r4)
+ mov.l r3,@(8,r4)
+ mov.l r7,@(12,r4)
+ add #16,r4
+.L37:
+ cmp/pl r0
+ bt/s .L18
+ add #-1,r0
+ mov r6,r2
+.L38:
+ bra .L40
+ mov r2,r0
+ .align 5
+.L7:
+ shar r0
+ and #3,r0
+ cmp/eq #2,r0
+ bt/s .L23
+ mov #2,r1
+ cmp/gt r1,r0
+ bt/s .L27
+ cmp/eq #3,r0
+ cmp/eq #1,r0
+ bt/s .L24
+ mov r0,r1
+ bra .L45
+ add r0,r1
+ .align 5
+.L27:
+ bf .L21
+ add #4,r5
+ mov.w @r5,r1
+ add #4,r4
+ mov.w r1,@r4
+ add #-4,r5
+ add #-4,r4
+.L23:
+ add #2,r5
+ mov.w @r5,r1
+ add #2,r4
+ mov.w r1,@r4
+ add #-2,r5
+ add #-2,r4
+.L24:
+ mov.w @r5,r1
+ mov.w r1,@r4
+.L21:
+ mov r0,r1
+ add r0,r1
+.L45:
+ add r1,r4
+ add r1,r5
+ mov r2,r0
+ mov #-3,r1
+ shad r1,r0
+ mov #1,r10
+ mov r0,r1
+ and r2,r10
+ cmp/pl r1
+ bf/s .L29
+ add #-1,r0
+ mov r4,r9
+ mov r4,r8
+ add #4,r9
+ mov r4,r6
+ add #6,r8
+ add #2,r6
+.L31:
+ mov.w @r5+,r1
+ mov.w @r5+,r2
+ mov.w @r5+,r3
+ mov.w @r5+,r7
+ mov.w r1,@r4
+ mov.w r2,@r6
+ add #8,r4
+ mov r0,r1
+ add #8,r6
+ mov.w r3,@r9
+ add #-1,r0
+ add #8,r9
+ mov.w r7,@r8
+ cmp/pl r1
+ bt/s .L31
+ add #8,r8
+.L29:
+ mov r10,r2
+ mov r2,r0
+.L40:
+ cmp/pl r0
+ bf .L34
+.L35:
+ mov.b @r5+,r1
+ dt r2
+ mov.b r1,@r4
+ bf/s .L35
+ add #1,r4
+.L34:
+ mov r11,r0
+ mov r14,r15
+ mov.l @r15+,r14
+ mov.l @r15+,r11
+ mov.l @r15+,r10
+ mov.l @r15+,r9
+ rts
+ mov.l @r15+,r8
diff --git a/sysdeps/sh/memprof.h b/sysdeps/sh/memprof.h
new file mode 100644
index 0000000000..a02949f291
--- /dev/null
+++ b/sysdeps/sh/memprof.h
@@ -0,0 +1,21 @@
+/* Copyright (C) 2000 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 GETSP() ({ register uintptr_t stack_ptr asm ("r15"); stack_ptr; })
+
+#include <sysdeps/generic/memprof.h>
diff --git a/sysdeps/sh/memset.S b/sysdeps/sh/memset.S
new file mode 100644
index 0000000000..a44a8f7edd
--- /dev/null
+++ b/sysdeps/sh/memset.S
@@ -0,0 +1,79 @@
+/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
+
+ 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>
+
+/* void *memset (t, c, len) */
+
+ENTRY(memset)
+ tst r6, r6
+ bt/s end
+ mov r4, r3
+ mov #3, r0
+ cmp/hs r6, r0
+ bt/s 2f
+ and r4, r0
+ tst r0, r0
+ bt/s 1f
+ add r0, r6
+ add #-1, r0
+ shll2 r0
+ braf r0
+ add #-4, r6
+
+ mov.b r5, @r4
+ add #1, r4
+ mov.b r5, @r4
+ add #1, r4
+ mov.b r5, @r4
+ add #1, r4
+1:
+ extu.b r5, r0
+ shll8 r5
+ or r5, r0
+ extu.w r0, r0
+ mov r0, r5
+ swap.w r5, r5
+ or r0, r5
+
+2:
+ add #-4, r6
+ cmp/pz r6
+ bf afew
+ mov.l r5, @r4
+ bra 2b
+ add #4, r4
+
+afew:
+ mov #-1, r0
+ sub r6, r0
+ shll2 r0
+ braf r0
+ nop
+
+ mov.b r5, @r4
+ add #1, r4
+ mov.b r5, @r4
+ add #1, r4
+ mov.b r5, @r4
+ add #1, r4
+end:
+ rts
+ mov r3, r0
+END(memset)
diff --git a/sysdeps/sh/sh3/__longjmp.S b/sysdeps/sh/sh3/__longjmp.S
new file mode 100644
index 0000000000..09f829ae37
--- /dev/null
+++ b/sysdeps/sh/sh3/__longjmp.S
@@ -0,0 +1,44 @@
+/* longjmp for SH.
+ Copyright (C) 1999, 2000 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>
+#define _SETJMP_H
+#define _ASM
+#include <bits/setjmp.h>
+
+/* __longjmp(jmpbuf, val) */
+
+ENTRY (__longjmp)
+ mov.l @r4+, r8
+ mov.l @r4+, r9
+ mov.l @r4+, r10
+ mov.l @r4+, r11
+ mov.l @r4+, r12
+ mov.l @r4+, r13
+ mov.l @r4+, r14
+ mov.l @r4+, r15
+ mov r5, r0 /* get the return value in place */
+ tst r0, r0
+ bf.s 1f
+ lds.l @r4+, pr
+ mov #1,r0 /* can't let setjmp() return zero! */
+1:
+ rts
+ ldc.l @r4+, gbr
+END (__longjmp)
diff --git a/sysdeps/sh/sh3/bits/endian.h b/sysdeps/sh/sh3/bits/endian.h
new file mode 100644
index 0000000000..1fef1ff938
--- /dev/null
+++ b/sysdeps/sh/sh3/bits/endian.h
@@ -0,0 +1,13 @@
+/* SH is bi-endian but with a big-endian FPU. */
+
+#ifndef _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+#ifdef __LITTLE_ENDIAN__
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __FLOAT_WORD_ORDER __LITTLE_ENDIAN
+#else
+#define __BYTE_ORDER __BIG_ENDIAN
+#define __FLOAT_WORD_ORDER __BIG_ENDIAN
+#endif
diff --git a/sysdeps/sh/sh3/bits/huge_val.h b/sysdeps/sh/sh3/bits/huge_val.h
new file mode 100644
index 0000000000..a058c999ae
--- /dev/null
+++ b/sysdeps/sh/sh3/bits/huge_val.h
@@ -0,0 +1,104 @@
+/* `HUGE_VAL' constants for IEEE 754 machines (where it is infinity).
+ Used by <stdlib.h> and <math.h> functions for overflow.
+ SH version.
+ Copyright (C) 1992, 95, 96, 97, 98, 99, 2000 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 <bits/huge_val.h> directly; include <math.h> instead."
+#endif
+
+#include <features.h>
+
+/* IEEE positive infinity (-HUGE_VAL is negative infinity). */
+
+#ifdef __GNUC__
+
+# if __GNUC_PREREQ(2,96)
+
+# define HUGE_VAL (__extension__ 0x1.0p2047)
+
+# else
+
+# define HUGE_VAL \
+ (__extension__ \
+ ((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; }) \
+ { __l: 0x000000007ff00000ULL }).__d)
+
+# endif
+
+#else /* not GCC */
+
+# include <endian.h>
+
+typedef union { unsigned char __c[8]; double __d; } __huge_val_t;
+
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define __HUGE_VAL_bytes { 0, 0, 0, 0, 0x7f, 0xf0, 0, 0 }
+# endif
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __HUGE_VAL_bytes { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 }
+# endif
+
+static __huge_val_t __huge_val = { __HUGE_VAL_bytes };
+# define HUGE_VAL (__huge_val.__d)
+
+#endif /* GCC. */
+
+
+/* ISO C99 extensions: (float) HUGE_VALF and (long double) HUGE_VALL. */
+
+#ifdef __USE_ISOC99
+
+# ifdef __GNUC__
+
+# if __GNUC_PREREQ(2,96)
+
+# define HUGE_VALF (__extension__ 0x1.0p255f)
+
+# else
+
+# define HUGE_VALF \
+ (__extension__ \
+ ((union { unsigned __l __attribute__((__mode__(__SI__))); float __d; }) \
+ { __l: 0x7f800000UL }).__d)
+
+# endif
+
+# else /* not GCC */
+
+typedef union { unsigned char __c[4]; float __f; } __huge_valf_t;
+
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define __HUGE_VALF_bytes { 0x7f, 0x80, 0, 0 }
+# endif
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __HUGE_VALF_bytes { 0, 0, 0x80, 0x7f }
+# endif
+
+static __huge_valf_t __huge_valf = { __HUGE_VALF_bytes };
+# define HUGE_VALF (__huge_valf.__f)
+
+# endif /* GCC. */
+
+
+/* Generally there is no separate `long double' format and it is the
+ same as `double'. */
+# define HUGE_VALL HUGE_VAL
+
+#endif /* __USE_ISOC99. */
diff --git a/sysdeps/sh/sh3/bits/setjmp.h b/sysdeps/sh/sh3/bits/setjmp.h
new file mode 100644
index 0000000000..d2c4a420cd
--- /dev/null
+++ b/sysdeps/sh/sh3/bits/setjmp.h
@@ -0,0 +1,45 @@
+/* Copyright (C) 1999, 2000 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 the machine-dependent type `jmp_buf'. SH version. */
+
+#ifndef _SETJMP_H
+# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
+#endif
+
+#ifndef _ASM
+typedef struct
+ {
+ /* Callee-saved registers r8 through r15. */
+ int __regs[8];
+
+ /* Program counter. */
+ void * __pc;
+
+ /* The global pointer. */
+ void * __gbr;
+
+ } __jmp_buf[1];
+#endif
+
+#define JB_SIZE (4 * 10)
+
+/* Test if longjmp to JMPBUF would unwind the frame
+ containing a local variable at ADDRESS. */
+#define _JMPBUF_UNWINDS(jmpbuf, address) \
+ ((void *) (address) < &(jmpbuf)[0].__regs[7])
diff --git a/sysdeps/sh/sh3/bsd-_setjmp.S b/sysdeps/sh/sh3/bsd-_setjmp.S
new file mode 100644
index 0000000000..d787cd23d7
--- /dev/null
+++ b/sysdeps/sh/sh3/bsd-_setjmp.S
@@ -0,0 +1,51 @@
+/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. SH version.
+ Copyright (C) 1999, 2000 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. */
+
+/* This just does a tail-call to `__sigsetjmp (ARG, 0)'.
+ We cannot do it in C because it must be a tail-call, so frame-unwinding
+ in setjmp doesn't clobber the state restored by longjmp. */
+
+#include <sysdep.h>
+
+ENTRY (_setjmp)
+#ifdef SHARED
+ mova 1f, r0
+ mov.l 1f, r1
+ bra 2f
+ add r1, r0
+ .align 2
+1:
+ .long _GLOBAL_OFFSET_TABLE_
+2:
+ mov.l 3f, r1
+ mov.l @(r0,r1), r1
+ jmp @r1
+ mov #0, r0
+ .align 2
+3:
+ .long C_SYMBOL_NAME(__sigsetjmp@GOT)
+#else
+ mov.l 1f, r1
+ jmp @r1
+ mov #0, r0
+ .align 2
+1:
+ .long C_SYMBOL_NAME(__sigsetjmp)
+#endif
+END (_setjmp)
diff --git a/sysdeps/sh/sh3/bsd-setjmp.S b/sysdeps/sh/sh3/bsd-setjmp.S
new file mode 100644
index 0000000000..7ffb6919da
--- /dev/null
+++ b/sysdeps/sh/sh3/bsd-setjmp.S
@@ -0,0 +1,51 @@
+/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. SH version.
+ Copyright (C) 1999, 2000 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. */
+
+/* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
+ We cannot do it in C because it must be a tail-call, so frame-unwinding
+ in setjmp doesn't clobber the state restored by longjmp. */
+
+#include <sysdep.h>
+
+ENTRY (setjmp)
+#ifdef SHARED
+ mova 1f, r0
+ mov.l 1f, r1
+ bra 2f
+ add r1, r0
+ .align 2
+1:
+ .long _GLOBAL_OFFSET_TABLE_
+2:
+ mov.l 3f, r1
+ mov.l @(r0,r1), r1
+ jmp @r1
+ mov #1, r0
+ .align 2
+3:
+ .long C_SYMBOL_NAME(__sigsetjmp@GOT)
+#else
+ mov.l 1f, r1
+ jmp @r1
+ mov #1, r0
+ .align 2
+1:
+ .long C_SYMBOL_NAME(__sigsetjmp)
+#endif
+END (setjmp)
diff --git a/sysdeps/sh/sh3/dl-machine.h b/sysdeps/sh/sh3/dl-machine.h
new file mode 100644
index 0000000000..93a65ac03a
--- /dev/null
+++ b/sysdeps/sh/sh3/dl-machine.h
@@ -0,0 +1,520 @@
+/* Machine-dependent ELF dynamic relocation inline functions. SH-3 version.
+ Copyright (C) 1999, 2000 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 dl_machine_h
+#define dl_machine_h
+
+/* Only dummy. This doesn't work. */
+
+#define ELF_MACHINE_NAME "SH"
+
+#include <sys/param.h>
+
+#include <assert.h>
+
+/* Return nonzero iff E_MACHINE is compatible with the running host. */
+static inline int __attribute__ ((unused))
+elf_machine_matches_host (Elf32_Half e_machine)
+{
+ switch (e_machine)
+ {
+ case EM_SH:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+
+/* 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 __attribute__ ((unused))
+elf_machine_dynamic (void)
+{
+ register Elf32_Addr *got;
+ asm ("mov r12,%0" :"=r" (got));
+ return *got;
+}
+
+
+/* Return the run-time load address of the shared object. */
+static inline Elf32_Addr __attribute__ ((unused))
+elf_machine_load_address (void)
+{
+ Elf32_Addr addr;
+ asm ("mov.l .L1,r0
+ mov.l .L3,r2
+ add r12,r2
+ mov.l @(r0,r12),r0
+ bra .L2
+ sub r0,r2
+ .align 2
+ .L1: .long _dl_start@GOT
+ .L3: .long _dl_start@GOTOFF
+ .L2: mov r2,%0"
+ : "=r" (addr) : : "r0", "r1", "r2");
+ return addr;
+}
+
+
+/* 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 __attribute__ ((unused))
+elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+{
+ Elf32_Addr *got;
+ extern void _dl_runtime_resolve (Elf32_Word);
+ extern void _dl_runtime_profile (Elf32_Word);
+
+ if (l->l_info[DT_JMPREL] && lazy)
+ {
+ /* The GOT entries for functions in the PLT have not yet been filled
+ in. Their initial contents will arrange when called to load an
+ offset into the .rela.plt section and _GLOBAL_OFFSET_TABLE_[1],
+ and then jump to _GLOBAL_OFFSET_TABLE[2]. */
+ got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
+ got[1] = (Elf32_Addr) l; /* Identify this shared object. */
+
+ /* The got[2] entry contains the address of a function which gets
+ called to get the address of a so far unresolved function and
+ jump to it. The profiling extension of the dynamic linker allows
+ to intercept the calls to collect information. In this case we
+ don't store the address in the GOT so that all future calls also
+ end in this function. */
+ if (profile)
+ {
+ got[2] = (Elf32_Addr) &_dl_runtime_profile;
+ /* Say that we really want profiling and the timers are started. */
+ _dl_profile_map = l;
+ }
+ else
+ /* 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] = (Elf32_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_FIXUP_ARGS int plt_type
+
+#ifdef SHARED
+#define FUN_ADDR "\
+ mov.l 1f,r2
+ mova 1f,r0
+ bra 2f
+ add r0,r2 ! Get GOT address in r2
+0: .align 2
+1: .long _GLOBAL_OFFSET_TABLE_
+2: mov.l 3f,r0
+ add r2,r0"
+#define GOTJMP(x) #x "@GOTOFF"
+#else
+#define FUN_ADDR "\
+ mov.l 3f,r0"
+#define GOTJMP(x) #x
+#endif
+
+#if defined (KERNEL_MATH_EMULATION)
+#define FGR_SAVE "\
+ sts.l fpscr, @-r15
+ mov #8,r3
+ swap.w r3, r3
+ lds r3, fpscr
+ fmov.s fr11, @-r15
+ fmov.s fr10, @-r15
+ fmov.s fr9, @-r15
+ fmov.s fr8, @-r15
+ fmov.s fr7, @-r15
+ fmov.s fr6, @-r15
+ fmov.s fr5, @-r15
+ fmov.s fr4, @-r15"
+#define FGR_LOAD "\
+ fmov.s @r15+, fr4
+ fmov.s @r15+, fr5
+ fmov.s @r15+, fr6
+ fmov.s @r15+, fr7
+ fmov.s @r15+, fr8
+ fmov.s @r15+, fr9
+ fmov.s @r15+, fr10
+ fmov.s @r15+, fr11
+ lds.l @r15+, fpscr"
+#else
+#define FGR_SAVE ""
+#define FGR_LOAD ""
+#endif
+
+#ifndef PROF
+# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+ .text
+ .globl _dl_runtime_resolve
+ .type _dl_runtime_resolve, @function
+ .align 5
+_dl_runtime_resolve:
+ mov.l r3,@-r15
+ mov.l r4,@-r15
+ mov.l r5,@-r15
+ mov.l r6,@-r15
+ mov.l r7,@-r15
+ mov.l r12,@-r15
+ movt r3 ! Save T flag.
+ mov.l r3,@-r15
+ " FGR_SAVE "
+ sts.l pr,@-r15
+ mov r0,r4 ! PLT type
+ mov r2,r5 ! link map address
+ " FUN_ADDR "
+ jsr @r0 ! Call resolver.
+ mov r1,r6 ! reloc offset
+ lds.l @r15+,pr ! Get register content back.
+ " FGR_LOAD "
+ mov.l @r15+,r3
+ shal r3 ! Lode T flag.
+ mov.l @r15+,r12
+ mov.l @r15+,r7
+ mov.l @r15+,r6
+ mov.l @r15+,r5
+ mov.l @r15+,r4
+ jmp @r0 ! Jump to function address.
+ mov.l @r15+,r3
+ .align 2
+3:
+ .long " GOTJMP (fixup) "
+ .size _dl_runtime_resolve, .-_dl_runtime_resolve
+
+ .globl _dl_runtime_profile
+ .type _dl_runtime_profile, @function
+ .align 5
+_dl_runtime_profile:
+ mov.l r3,@-r15
+ mov.l r4,@-r15
+ mov.l r5,@-r15
+ mov.l r6,@-r15
+ mov.l r7,@-r15
+ mov.l r12,@-r15
+ movt r3 ! Save T flag.
+ mov.l r3,@-r15
+ " FGR_SAVE "
+ sts.l pr,@-r15
+ mov r0,r4 ! PLT type
+ mov r2,r5 ! link map address
+ sts pr,r7 ! return address
+ " FUN_ADDR "
+ jsr @r0 ! Call resolver.
+ mov r1,r6 ! reloc offset
+ lds.l @r15+,pr ! Get register content back.
+ " FGR_LOAD "
+ mov.l @r15+,r3
+ shal r3 ! Lode T flag.
+ mov.l @r15+,r12
+ mov.l @r15+,r7
+ mov.l @r15+,r6
+ mov.l @r15+,r5
+ mov.l @r15+,r4
+ jmp @r0 ! Jump to function address.
+ mov.l @r15+,r3
+ .align 2
+3:
+ .long " GOTJMP (profile_fixup) "
+ .size _dl_runtime_profile, .-_dl_runtime_profile
+ .previous
+");
+#else
+# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+ .text
+ .globl _dl_runtime_resolve
+ .globl _dl_runtime_profile
+ .type _dl_runtime_resolve, @function
+ .type _dl_runtime_profile, @function
+ .align 5
+_dl_runtime_resolve:
+_dl_runtime_profile:
+ mov.l r3,@-r15
+ mov.l r4,@-r15
+ mov.l r5,@-r15
+ mov.l r6,@-r15
+ mov.l r7,@-r15
+ mov.l r12,@-r15
+ movt r3 ! Save T flag.
+ mov.l r3,@-r15
+ " FGR_SAVE "
+ sts.l pr,@-r15
+ mov r0,r4 ! PLT type
+ mov r2,r5 ! link map address
+ sts pr,r7 ! return address
+ " FUN_ADDR "
+ jsr @r0 ! Call resolver.
+ mov r1,r6 ! reloc offset
+ lds.l @r15+,pr ! Get register content back.
+ " FGR_LOAD "
+ mov.l @r15+,r3
+ shal r3 ! Lode T flag.
+ mov.l @r15+,r12
+ mov.l @r15+,r7
+ mov.l @r15+,r6
+ mov.l @r15+,r5
+ mov.l @r15+,r4
+ jmp @r0 ! Jump to function address.
+ mov.l @r15+,r3
+ .align 2
+3:
+ .long " GOTJMP (fixup) "
+ .size _dl_runtime_resolve, .-_dl_runtime_resolve
+ .size _dl_runtime_profile, .-_dl_runtime_profile
+ .previous
+");
+#endif
+
+/* Mask identifying addresses reserved for the user program,
+ where the dynamic linker should not map anything. */
+#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL
+
+/* 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\
+.globl _dl_start_user\n\
+_start:\n\
+ mov r15,r4\n\
+ mov.l .L_dl_start,r1\n\
+ mova .L_dl_start,r0\n\
+ add r1,r0\n\
+ jsr @r0\n\
+ nop\n\
+_dl_start_user:\n\
+ ! Save the user entry point address in r8.\n\
+ mov r0,r8\n\
+ ! Point r12 at the GOT.\n\
+ mov.l 1f,r12\n\
+ mova 1f,r0\n\
+ bra 2f\n\
+ add r0,r12\n\
+ .align 2\n\
+1: .long _GLOBAL_OFFSET_TABLE_\n\
+2: ! Store the highest stack address\n\
+ mov.l .L_stack_end,r0\n\
+ mov.l @(r0,r12),r0\n\
+ mov.l r15,@r0\n\
+ ! See if we were run as a command with the executable file\n\
+ ! name as an extra leading argument.\n\
+ mov.l .L_dl_skip_args,r0\n\
+ mov.l @(r0,r12),r0\n\
+ mov.l @r0,r0\n\
+ ! Get the original argument count.\n\
+ mov.l @r15,r5\n\
+ ! Subtract _dl_skip_args from it.\n\
+ sub r0,r5\n\
+ ! Adjust the stack pointer to skip _dl_skip_args words.\n\
+ shll2 r0\n\
+ add r0,r15\n\
+ ! Store back the modified argument count.\n\
+ mov.l r5,@r15\n\
+ ! Compute argv address and envp.\n\
+ mov r15,r6\n\
+ add #4,r6\n\
+ mov r5,r7\n\
+ shll2 r7\n\
+ add r15,r7\n\
+ mov.l .L_dl_loaded,r0\n\
+ mov.l @(r0,r12),r0\n\
+ mov.l @r0,r4\n\
+ ! Call _dl_init.\n\
+ mov.l .L_dl_init,r1\n\
+ mova .L_dl_init,r0\n\
+ add r1,r0\n\
+ jsr @r0\n\
+ nop\n\
+1: ! Clear the startup flag.\n\
+ mov.l .L_dl_starting_up,r0\n\
+ mov.l @(r0,r12),r0\n\
+ mov #0,r2\n\
+ mov.l r2,@r0\n\
+ ! Pass our finalizer function to the user in r4, as per ELF ABI.\n\
+ mov.l .L_dl_fini,r0\n\
+ mov.l @(r0,r12),r4\n\
+ ! Jump to the user's entry point.\n\
+ jmp @r8\n\
+ nop\n\
+ .align 2\n\
+.L_dl_start:\n\
+ .long _dl_start@PLT\n\
+.L_stack_end:\n\
+ .long __libc_stack_end@GOT\n\
+.L_dl_skip_args:\n\
+ .long _dl_skip_args@GOT\n\
+.L_dl_init:\n\
+ .long _dl_init@PLT\n\
+.L_dl_loaded:\n\
+ .long _dl_loaded@GOT\n\
+.L_dl_starting_up:\n\
+ .long _dl_starting_up@GOT\n\
+.L_dl_fini:\n\
+ .long _dl_fini@GOT\n\
+.previous\n\
+");
+
+/* 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_SH_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_SH_JMP_SLOT)
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
+#define ELF_MACHINE_JMP_SLOT R_SH_JMP_SLOT
+
+/* We define an initialization functions. This is called very early in
+ _dl_sysdep_start. */
+#define DL_PLATFORM_INIT dl_platform_init ()
+
+extern const char *_dl_platform;
+
+static inline void __attribute__ ((unused))
+dl_platform_init (void)
+{
+ if (_dl_platform != NULL && *_dl_platform == '\0')
+ /* Avoid an empty string which would disturb us. */
+ _dl_platform = NULL;
+}
+
+static inline Elf32_Addr
+elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+ const Elf32_Rela *reloc,
+ Elf32_Addr *reloc_addr, Elf32_Addr value)
+{
+ return *reloc_addr = value;
+}
+
+/* Return the final value of a plt relocation. */
+static inline Elf32_Addr
+elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
+ Elf32_Addr value)
+{
+ return value + reloc->r_addend;
+}
+
+#endif /* !dl_machine_h */
+
+#ifdef RESOLVE
+
+/* SH never uses Elf32_Rel relocations. */
+#define ELF_MACHINE_NO_REL 1
+
+extern char **_dl_argv;
+
+/* 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)
+{
+ if (ELF32_R_TYPE (reloc->r_info) == R_SH_RELATIVE)
+ {
+#ifndef RTLD_BOOTSTRAP
+ if (map != &_dl_rtld_map) /* Already done in rtld itself. */
+#endif
+ *reloc_addr = map->l_addr + reloc->r_addend;
+ }
+ else if (ELF32_R_TYPE (reloc->r_info) != R_SH_NONE)
+ {
+ const Elf32_Sym *const refsym = sym;
+ Elf32_Addr value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info));
+ if (sym)
+ value += sym->st_value;
+ value += reloc->r_addend;
+
+ switch (ELF32_R_TYPE (reloc->r_info))
+ {
+ case R_SH_COPY:
+ if (sym == NULL)
+ /* This can happen in trace mode if an object could not be
+ found. */
+ break;
+ if (sym->st_size > refsym->st_size
+ || (sym->st_size < refsym->st_size && _dl_verbose))
+ {
+ const char *strtab;
+
+ strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
+ _dl_sysdep_error (_dl_argv[0] ?: "<program name unknown>",
+ ": 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_SH_GLOB_DAT:
+ case R_SH_JMP_SLOT:
+ *reloc_addr = value;
+ break;
+ case R_SH_DIR32:
+ {
+#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);
+ if (map == &_dl_rtld_map)
+ /* Undo the relocation done here during bootstrapping.
+ Now we will relocate it anew, possibly using a
+ binding found in the user program or a loaded library
+ rather than the dynamic linker's built-in definitions
+ used while loading those libraries. */
+ value -= map->l_addr + refsym->st_value + reloc->r_addend;
+#endif
+ *reloc_addr = value;
+ break;
+ }
+ case R_SH_REL32:
+ *reloc_addr = (value - (Elf32_Addr) reloc_addr);
+ break;
+ default:
+ _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 0);
+ break;
+ }
+ }
+}
+
+static inline void
+elf_machine_lazy_rel (struct link_map *map,
+ Elf32_Addr l_addr, const Elf32_Rela *reloc)
+{
+ Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
+ /* Check for unexpected PLT reloc type. */
+ if (ELF32_R_TYPE (reloc->r_info) == R_SH_JMP_SLOT)
+ *reloc_addr += l_addr;
+ else
+ _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
+}
+
+#endif /* RESOLVE */
diff --git a/sysdeps/sh/sh3/setjmp.S b/sysdeps/sh/sh3/setjmp.S
new file mode 100644
index 0000000000..ea41f459de
--- /dev/null
+++ b/sysdeps/sh/sh3/setjmp.S
@@ -0,0 +1,67 @@
+/* setjmp for SH4.
+ Copyright (C) 1999, 2000 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>
+#define _SETJMP_H
+#define _ASM
+#include <bits/setjmp.h>
+
+ /* Binary compatibility entry point. */
+ENTRY (__setjmp)
+ mov #0, r5
+ENTRY (__sigsetjmp)
+ /* Save registers */
+ add #JB_SIZE, r4
+ stc.l gbr, @-r4
+ sts.l pr, @-r4
+ mov.l r15, @-r4
+ mov.l r14, @-r4
+ mov.l r13, @-r4
+ mov.l r12, @-r4
+ mov.l r11, @-r4
+ mov.l r10, @-r4
+ mov.l r9, @-r4
+ mov.l r8, @-r4
+
+ /* Make a tail call to __sigjmp_save; it takes the same args. */
+#ifdef SHARED
+ mov.l 1f, r1
+ mova 1f, r0
+ bra 2f
+ add r1, r0
+ .align 2
+1:
+ .long _GLOBAL_OFFSET_TABLE_
+2:
+ mov.l .L1, r1
+ mov.l @(r0,r1), r1
+ jmp @r1
+ nop
+ .align 2
+.L1:
+ .long C_SYMBOL_NAME(__sigjmp_save@GOT)
+#else
+ mov.l .L1, r1
+ jmp @r1
+ nop
+ .align 2
+.L1:
+ .long C_SYMBOL_NAME(__sigjmp_save)
+#endif
+END (__setjmp)
diff --git a/sysdeps/sh/sh4/__longjmp.S b/sysdeps/sh/sh4/__longjmp.S
new file mode 100644
index 0000000000..c7100cbe51
--- /dev/null
+++ b/sysdeps/sh/sh4/__longjmp.S
@@ -0,0 +1,49 @@
+/* longjmp for SH.
+ Copyright (C) 1999, 2000 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>
+#define _SETJMP_H
+#define _ASM
+#include <bits/setjmp.h>
+
+/* __longjmp(jmpbuf, val) */
+
+ENTRY (__longjmp)
+ mov.l @r4+, r8
+ mov.l @r4+, r9
+ mov.l @r4+, r10
+ mov.l @r4+, r11
+ mov.l @r4+, r12
+ mov.l @r4+, r13
+ mov.l @r4+, r14
+ mov.l @r4+, r15
+ mov r5, r0 /* get the return value in place */
+ tst r0, r0
+ bf.s 1f
+ lds.l @r4+, pr
+ mov #1,r0 /* can't let setjmp() return zero! */
+1:
+ ldc.l @r4+, gbr
+ lds.l @r4+, fpscr
+ fmov.s @r4+, fr12
+ fmov.s @r4+, fr13
+ fmov.s @r4+, fr14
+ rts
+ fmov.s @r4+, fr15
+END (__longjmp)
diff --git a/sysdeps/sh/sh4/bits/endian.h b/sysdeps/sh/sh4/bits/endian.h
new file mode 100644
index 0000000000..1fef1ff938
--- /dev/null
+++ b/sysdeps/sh/sh4/bits/endian.h
@@ -0,0 +1,13 @@
+/* SH is bi-endian but with a big-endian FPU. */
+
+#ifndef _ENDIAN_H
+# error "Never use <bits/endian.h> directly; include <endian.h> instead."
+#endif
+
+#ifdef __LITTLE_ENDIAN__
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#define __FLOAT_WORD_ORDER __LITTLE_ENDIAN
+#else
+#define __BYTE_ORDER __BIG_ENDIAN
+#define __FLOAT_WORD_ORDER __BIG_ENDIAN
+#endif
diff --git a/sysdeps/sh/sh4/bits/huge_val.h b/sysdeps/sh/sh4/bits/huge_val.h
new file mode 100644
index 0000000000..a058c999ae
--- /dev/null
+++ b/sysdeps/sh/sh4/bits/huge_val.h
@@ -0,0 +1,104 @@
+/* `HUGE_VAL' constants for IEEE 754 machines (where it is infinity).
+ Used by <stdlib.h> and <math.h> functions for overflow.
+ SH version.
+ Copyright (C) 1992, 95, 96, 97, 98, 99, 2000 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 <bits/huge_val.h> directly; include <math.h> instead."
+#endif
+
+#include <features.h>
+
+/* IEEE positive infinity (-HUGE_VAL is negative infinity). */
+
+#ifdef __GNUC__
+
+# if __GNUC_PREREQ(2,96)
+
+# define HUGE_VAL (__extension__ 0x1.0p2047)
+
+# else
+
+# define HUGE_VAL \
+ (__extension__ \
+ ((union { unsigned __l __attribute__((__mode__(__DI__))); double __d; }) \
+ { __l: 0x000000007ff00000ULL }).__d)
+
+# endif
+
+#else /* not GCC */
+
+# include <endian.h>
+
+typedef union { unsigned char __c[8]; double __d; } __huge_val_t;
+
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define __HUGE_VAL_bytes { 0, 0, 0, 0, 0x7f, 0xf0, 0, 0 }
+# endif
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __HUGE_VAL_bytes { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 }
+# endif
+
+static __huge_val_t __huge_val = { __HUGE_VAL_bytes };
+# define HUGE_VAL (__huge_val.__d)
+
+#endif /* GCC. */
+
+
+/* ISO C99 extensions: (float) HUGE_VALF and (long double) HUGE_VALL. */
+
+#ifdef __USE_ISOC99
+
+# ifdef __GNUC__
+
+# if __GNUC_PREREQ(2,96)
+
+# define HUGE_VALF (__extension__ 0x1.0p255f)
+
+# else
+
+# define HUGE_VALF \
+ (__extension__ \
+ ((union { unsigned __l __attribute__((__mode__(__SI__))); float __d; }) \
+ { __l: 0x7f800000UL }).__d)
+
+# endif
+
+# else /* not GCC */
+
+typedef union { unsigned char __c[4]; float __f; } __huge_valf_t;
+
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define __HUGE_VALF_bytes { 0x7f, 0x80, 0, 0 }
+# endif
+# if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __HUGE_VALF_bytes { 0, 0, 0x80, 0x7f }
+# endif
+
+static __huge_valf_t __huge_valf = { __HUGE_VALF_bytes };
+# define HUGE_VALF (__huge_valf.__f)
+
+# endif /* GCC. */
+
+
+/* Generally there is no separate `long double' format and it is the
+ same as `double'. */
+# define HUGE_VALL HUGE_VAL
+
+#endif /* __USE_ISOC99. */
diff --git a/sysdeps/sh/sh4/bits/setjmp.h b/sysdeps/sh/sh4/bits/setjmp.h
new file mode 100644
index 0000000000..d5918f2ad0
--- /dev/null
+++ b/sysdeps/sh/sh4/bits/setjmp.h
@@ -0,0 +1,50 @@
+/* Copyright (C) 1999, 2000 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 the machine-dependent type `jmp_buf'. SH version. */
+
+#ifndef _SETJMP_H
+# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
+#endif
+
+#ifndef _ASM
+typedef struct
+ {
+ /* Callee-saved registers r8 through r15. */
+ int __regs[8];
+
+ /* Program counter. */
+ void * __pc;
+
+ /* The global pointer. */
+ void * __gbr;
+
+ /* Floating point status register. */
+ int __fpscr;
+
+ /* Callee-saved floating point registers fr12 through fr15. */
+ int __fpregs[4];
+ } __jmp_buf[1];
+#endif
+
+#define JB_SIZE (4 * 15)
+
+/* Test if longjmp to JMPBUF would unwind the frame
+ containing a local variable at ADDRESS. */
+#define _JMPBUF_UNWINDS(jmpbuf, address) \
+ ((void *) (address) < &(jmpbuf)[0].__regs[7])
diff --git a/sysdeps/sh/sh4/bsd-_setjmp.S b/sysdeps/sh/sh4/bsd-_setjmp.S
new file mode 100644
index 0000000000..468c8575e6
--- /dev/null
+++ b/sysdeps/sh/sh4/bsd-_setjmp.S
@@ -0,0 +1,50 @@
+/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. SH version.
+ Copyright (C) 1999, 2000 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. */
+
+/* This just does a tail-call to `__sigsetjmp (ARG, 0)'.
+ We cannot do it in C because it must be a tail-call, so frame-unwinding
+ in setjmp doesn't clobber the state restored by longjmp. */
+
+#include <sysdep.h>
+
+ENTRY (_setjmp)
+#ifdef SHARED
+ mova 1f, r0
+ mov.l 1f, r1
+ bra 2f
+ add r1, r0
+ .align 2
+1:
+ .long _GLOBAL_OFFSET_TABLE_
+2:
+ mov.l 3f, r1
+ mov.l @(r0,r1), r1
+ jmp @r1
+ mov #0, r0
+3:
+ .long C_SYMBOL_NAME(__sigsetjmp@GOT)
+#else
+ mov.l 1f, r1
+ jmp @r1
+ mov #0, r0
+ .align 2
+1:
+ .long C_SYMBOL_NAME(__sigsetjmp)
+#endif
+END (_setjmp)
diff --git a/sysdeps/sh/sh4/bsd-setjmp.S b/sysdeps/sh/sh4/bsd-setjmp.S
new file mode 100644
index 0000000000..2be74bd93e
--- /dev/null
+++ b/sysdeps/sh/sh4/bsd-setjmp.S
@@ -0,0 +1,50 @@
+/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. SH version.
+ Copyright (C) 1999, 2000 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. */
+
+/* This just does a tail-call to `__sigsetjmp (ARG, 1)'.
+ We cannot do it in C because it must be a tail-call, so frame-unwinding
+ in setjmp doesn't clobber the state restored by longjmp. */
+
+#include <sysdep.h>
+
+ENTRY (setjmp)
+#ifdef SHARED
+ mova 1f, r0
+ mov.l 1f, r1
+ bra 2f
+ add r1, r0
+ .align 2
+1:
+ .long _GLOBAL_OFFSET_TABLE_
+2:
+ mov.l 3f, r1
+ mov.l @(r0,r1), r1
+ jmp @r1
+ mov #1, r0
+3:
+ .long C_SYMBOL_NAME(__sigsetjmp@GOT)
+#else
+ mov.l 1f, r1
+ jmp @r1
+ mov #1, r0
+ .align 2
+1:
+ .long C_SYMBOL_NAME(__sigsetjmp)
+#endif
+END (setjmp)
diff --git a/sysdeps/sh/sh4/dl-machine.h b/sysdeps/sh/sh4/dl-machine.h
new file mode 100644
index 0000000000..a8de19a719
--- /dev/null
+++ b/sysdeps/sh/sh4/dl-machine.h
@@ -0,0 +1,515 @@
+/* Machine-dependent ELF dynamic relocation inline functions. SH-4 version.
+ Copyright (C) 1999, 2000 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 dl_machine_h
+#define dl_machine_h
+
+/* Only dummy. This doesn't work. */
+
+#define ELF_MACHINE_NAME "SH"
+
+#include <sys/param.h>
+
+#include <assert.h>
+
+/* Return nonzero iff E_MACHINE is compatible with the running host. */
+static inline int __attribute__ ((unused))
+elf_machine_matches_host (Elf32_Half e_machine)
+{
+ switch (e_machine)
+ {
+ case EM_SH:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+
+/* 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 __attribute__ ((unused))
+elf_machine_dynamic (void)
+{
+ register Elf32_Addr *got;
+ asm ("mov r12,%0" :"=r" (got));
+ return *got;
+}
+
+
+/* Return the run-time load address of the shared object. */
+static inline Elf32_Addr __attribute__ ((unused))
+elf_machine_load_address (void)
+{
+ Elf32_Addr addr;
+ asm ("mov.l .L1,r0
+ mov.l .L3,r2
+ add r12,r2
+ mov.l @(r0,r12),r0
+ bra .L2
+ sub r0,r2
+ .align 2
+ .L1: .long _dl_start@GOT
+ .L3: .long _dl_start@GOTOFF
+ .L2: mov r2,%0"
+ : "=r" (addr) : : "r0", "r1", "r2");
+ return addr;
+}
+
+
+/* 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 __attribute__ ((unused))
+elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+{
+ Elf32_Addr *got;
+ extern void _dl_runtime_resolve (Elf32_Word);
+ extern void _dl_runtime_profile (Elf32_Word);
+
+ if (l->l_info[DT_JMPREL] && lazy)
+ {
+ /* The GOT entries for functions in the PLT have not yet been filled
+ in. Their initial contents will arrange when called to load an
+ offset into the .rela.plt section and _GLOBAL_OFFSET_TABLE_[1],
+ and then jump to _GLOBAL_OFFSET_TABLE[2]. */
+ got = (Elf32_Addr *) D_PTR (l, l_info[DT_PLTGOT]);
+ got[1] = (Elf32_Addr) l; /* Identify this shared object. */
+
+ /* The got[2] entry contains the address of a function which gets
+ called to get the address of a so far unresolved function and
+ jump to it. The profiling extension of the dynamic linker allows
+ to intercept the calls to collect information. In this case we
+ don't store the address in the GOT so that all future calls also
+ end in this function. */
+ if (profile)
+ {
+ got[2] = (Elf32_Addr) &_dl_runtime_profile;
+ /* Say that we really want profiling and the timers are started. */
+ _dl_profile_map = l;
+ }
+ else
+ /* 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] = (Elf32_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_FIXUP_ARGS int plt_type
+
+#ifdef SHARED
+#define FUN_ADDR "\
+ mov.l 1f,r2
+ mova 1f,r0
+ bra 2f
+ add r0,r2 ! Get GOT address in r2
+0: .align 2
+1: .long _GLOBAL_OFFSET_TABLE_
+2: mov.l 3f,r0
+ add r2,r0"
+#define GOTJMP(x) #x "@GOTOFF"
+#else
+#define FUN_ADDR "\
+ mov.l 3f,r0"
+#define GOTJMP(x) #x
+#endif
+
+#define FGR_SAVE "\
+ sts.l fpscr, @-r15
+ mov #8,r3
+ swap.w r3, r3
+ lds r3, fpscr
+ fmov.s fr11, @-r15
+ fmov.s fr10, @-r15
+ fmov.s fr9, @-r15
+ fmov.s fr8, @-r15
+ fmov.s fr7, @-r15
+ fmov.s fr6, @-r15
+ fmov.s fr5, @-r15
+ fmov.s fr4, @-r15"
+#define FGR_LOAD "\
+ fmov.s @r15+, fr4
+ fmov.s @r15+, fr5
+ fmov.s @r15+, fr6
+ fmov.s @r15+, fr7
+ fmov.s @r15+, fr8
+ fmov.s @r15+, fr9
+ fmov.s @r15+, fr10
+ fmov.s @r15+, fr11
+ lds.l @r15+, fpscr"
+
+#ifndef PROF
+# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+ .text
+ .globl _dl_runtime_resolve
+ .type _dl_runtime_resolve, @function
+ .align 5
+_dl_runtime_resolve:
+ mov.l r3,@-r15
+ mov.l r4,@-r15
+ mov.l r5,@-r15
+ mov.l r6,@-r15
+ mov.l r7,@-r15
+ mov.l r12,@-r15
+ movt r3 ! Save T flag.
+ mov.l r3,@-r15
+ " FGR_SAVE "
+ sts.l pr,@-r15
+ mov r0,r4 ! PLT type
+ mov r2,r5 ! link map address
+ " FUN_ADDR "
+ jsr @r0 ! Call resolver.
+ mov r1,r6 ! reloc offset
+ lds.l @r15+,pr ! Get register content back.
+ " FGR_LOAD "
+ mov.l @r15+,r3
+ shal r3 ! Lode T flag.
+ mov.l @r15+,r12
+ mov.l @r15+,r7
+ mov.l @r15+,r6
+ mov.l @r15+,r5
+ mov.l @r15+,r4
+ jmp @r0 ! Jump to function address.
+ mov.l @r15+,r3
+ .align 2
+3:
+ .long " GOTJMP (fixup) "
+ .size _dl_runtime_resolve, .-_dl_runtime_resolve
+
+ .globl _dl_runtime_profile
+ .type _dl_runtime_profile, @function
+ .align 5
+_dl_runtime_profile:
+ mov.l r3,@-r15
+ mov.l r4,@-r15
+ mov.l r5,@-r15
+ mov.l r6,@-r15
+ mov.l r7,@-r15
+ mov.l r12,@-r15
+ movt r3 ! Save T flag.
+ mov.l r3,@-r15
+ " FGR_SAVE "
+ sts.l pr,@-r15
+ mov r0,r4 ! PLT type
+ mov r2,r5 ! link map address
+ sts pr,r7 ! return address
+ " FUN_ADDR "
+ jsr @r0 ! Call resolver.
+ mov r1,r6 ! reloc offset
+ lds.l @r15+,pr ! Get register content back.
+ " FGR_LOAD "
+ mov.l @r15+,r3
+ shal r3 ! Lode T flag.
+ mov.l @r15+,r12
+ mov.l @r15+,r7
+ mov.l @r15+,r6
+ mov.l @r15+,r5
+ mov.l @r15+,r4
+ jmp @r0 ! Jump to function address.
+ mov.l @r15+,r3
+ .align 2
+3:
+ .long " GOTJMP (profile_fixup) "
+ .size _dl_runtime_profile, .-_dl_runtime_profile
+ .previous
+");
+#else
+# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
+ .text
+ .globl _dl_runtime_resolve
+ .globl _dl_runtime_profile
+ .type _dl_runtime_resolve, @function
+ .type _dl_runtime_profile, @function
+ .align 5
+_dl_runtime_resolve:
+_dl_runtime_profile:
+ mov.l r3,@-r15
+ mov.l r4,@-r15
+ mov.l r5,@-r15
+ mov.l r6,@-r15
+ mov.l r7,@-r15
+ mov.l r12,@-r15
+ movt r3 ! Save T flag.
+ mov.l r3,@-r15
+ " FGR_SAVE "
+ sts.l pr,@-r15
+ mov r0,r4 ! PLT type
+ mov r2,r5 ! link map address
+ sts pr,r7 ! return address
+ " FUN_ADDR "
+ jsr @r0 ! Call resolver.
+ mov r1,r6 ! reloc offset
+ lds.l @r15+,pr ! Get register content back.
+ " FGR_LOAD "
+ mov.l @r15+,r3
+ shal r3 ! Lode T flag.
+ mov.l @r15+,r12
+ mov.l @r15+,r7
+ mov.l @r15+,r6
+ mov.l @r15+,r5
+ mov.l @r15+,r4
+ jmp @r0 ! Jump to function address.
+ mov.l @r15+,r3
+ .align 2
+3:
+ .long " GOTJMP (fixup) "
+ .size _dl_runtime_resolve, .-_dl_runtime_resolve
+ .size _dl_runtime_profile, .-_dl_runtime_profile
+ .previous
+");
+#endif
+
+/* Mask identifying addresses reserved for the user program,
+ where the dynamic linker should not map anything. */
+#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL
+
+/* 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\
+.globl _dl_start_user\n\
+_start:\n\
+ mov r15,r4\n\
+ mov.l .L_dl_start,r1\n\
+ mova .L_dl_start,r0\n\
+ add r1,r0\n\
+ jsr @r0\n\
+ nop\n\
+_dl_start_user:\n\
+ ! Save the user entry point address in r8.\n\
+ mov r0,r8\n\
+ ! Point r12 at the GOT.\n\
+ mov.l 1f,r12\n\
+ mova 1f,r0\n\
+ bra 2f\n\
+ add r0,r12\n\
+ .align 2\n\
+1: .long _GLOBAL_OFFSET_TABLE_\n\
+2: ! Store the highest stack address\n\
+ mov.l .L_stack_end,r0\n\
+ mov.l @(r0,r12),r0\n\
+ mov.l r15,@r0\n\
+ ! See if we were run as a command with the executable file\n\
+ ! name as an extra leading argument.\n\
+ mov.l .L_dl_skip_args,r0\n\
+ mov.l @(r0,r12),r0\n\
+ mov.l @r0,r0\n\
+ ! Get the original argument count.\n\
+ mov.l @r15,r5\n\
+ ! Subtract _dl_skip_args from it.\n\
+ sub r0,r5\n\
+ ! Adjust the stack pointer to skip _dl_skip_args words.\n\
+ shll2 r0\n\
+ add r0,r15\n\
+ ! Store back the modified argument count.\n\
+ mov.l r5,@r15\n\
+ ! Compute argv address and envp.\n\
+ mov r15,r6\n\
+ add #4,r6\n\
+ mov r5,r7\n\
+ shll2 r7\n\
+ add r15,r7\n\
+ mov.l .L_dl_loaded,r0\n\
+ mov.l @(r0,r12),r0\n\
+ mov.l @r0,r4\n\
+ ! Call _dl_init.\n\
+ mov.l .L_dl_init,r1\n\
+ mova .L_dl_init,r0\n\
+ add r1,r0\n\
+ jsr @r0\n\
+ nop\n\
+1: ! Clear the startup flag.\n\
+ mov.l .L_dl_starting_up,r0\n\
+ mov.l @(r0,r12),r0\n\
+ mov #0,r2\n\
+ mov.l r2,@r0\n\
+ ! Pass our finalizer function to the user in r4, as per ELF ABI.\n\
+ mov.l .L_dl_fini,r0\n\
+ mov.l @(r0,r12),r4\n\
+ ! Jump to the user's entry point.\n\
+ jmp @r8\n\
+ nop\n\
+ .align 2\n\
+.L_dl_start:\n\
+ .long _dl_start@PLT\n\
+.L_stack_end:\n\
+ .long __libc_stack_end@GOT\n\
+.L_dl_skip_args:\n\
+ .long _dl_skip_args@GOT\n\
+.L_dl_init:\n\
+ .long _dl_init@PLT\n\
+.L_dl_loaded:\n\
+ .long _dl_loaded@GOT\n\
+.L_dl_starting_up:\n\
+ .long _dl_starting_up@GOT\n\
+.L_dl_fini:\n\
+ .long _dl_fini@GOT\n\
+.previous\n\
+");
+
+/* 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_SH_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_SH_JMP_SLOT)
+
+/* A reloc type used for ld.so cmdline arg lookups to reject PLT entries. */
+#define ELF_MACHINE_JMP_SLOT R_SH_JMP_SLOT
+
+/* We define an initialization functions. This is called very early in
+ _dl_sysdep_start. */
+#define DL_PLATFORM_INIT dl_platform_init ()
+
+extern const char *_dl_platform;
+
+static inline void __attribute__ ((unused))
+dl_platform_init (void)
+{
+ if (_dl_platform != NULL && *_dl_platform == '\0')
+ /* Avoid an empty string which would disturb us. */
+ _dl_platform = NULL;
+}
+
+static inline Elf32_Addr
+elf_machine_fixup_plt (struct link_map *map, lookup_t t,
+ const Elf32_Rela *reloc,
+ Elf32_Addr *reloc_addr, Elf32_Addr value)
+{
+ return *reloc_addr = value;
+}
+
+/* Return the final value of a plt relocation. */
+static inline Elf32_Addr
+elf_machine_plt_value (struct link_map *map, const Elf32_Rela *reloc,
+ Elf32_Addr value)
+{
+ return value + reloc->r_addend;
+}
+
+#endif /* !dl_machine_h */
+
+#ifdef RESOLVE
+
+/* SH never uses Elf32_Rel relocations. */
+#define ELF_MACHINE_NO_REL 1
+
+extern char **_dl_argv;
+
+/* 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)
+{
+ if (ELF32_R_TYPE (reloc->r_info) == R_SH_RELATIVE)
+ {
+#ifndef RTLD_BOOTSTRAP
+ if (map != &_dl_rtld_map) /* Already done in rtld itself. */
+#endif
+ *reloc_addr = map->l_addr + reloc->r_addend;
+ }
+ else if (ELF32_R_TYPE (reloc->r_info) != R_SH_NONE)
+ {
+ const Elf32_Sym *const refsym = sym;
+ Elf32_Addr value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info));
+ if (sym)
+ value += sym->st_value;
+ value += reloc->r_addend;
+
+ switch (ELF32_R_TYPE (reloc->r_info))
+ {
+ case R_SH_COPY:
+ if (sym == NULL)
+ /* This can happen in trace mode if an object could not be
+ found. */
+ break;
+ if (sym->st_size > refsym->st_size
+ || (sym->st_size < refsym->st_size && _dl_verbose))
+ {
+ const char *strtab;
+
+ strtab = (const char *) D_PTR (map, l_info[DT_STRTAB]);
+ _dl_sysdep_error (_dl_argv[0] ?: "<program name unknown>",
+ ": 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_SH_GLOB_DAT:
+ case R_SH_JMP_SLOT:
+ *reloc_addr = value;
+ break;
+ case R_SH_DIR32:
+ {
+#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);
+ if (map == &_dl_rtld_map)
+ /* Undo the relocation done here during bootstrapping.
+ Now we will relocate it anew, possibly using a
+ binding found in the user program or a loaded library
+ rather than the dynamic linker's built-in definitions
+ used while loading those libraries. */
+ value -= map->l_addr + refsym->st_value + reloc->r_addend;
+#endif
+ *reloc_addr = value;
+ break;
+ }
+ case R_SH_REL32:
+ *reloc_addr = (value - (Elf32_Addr) reloc_addr);
+ break;
+ default:
+ _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 0);
+ break;
+ }
+ }
+}
+
+static inline void
+elf_machine_lazy_rel (struct link_map *map,
+ Elf32_Addr l_addr, const Elf32_Rela *reloc)
+{
+ Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
+ /* Check for unexpected PLT reloc type. */
+ if (ELF32_R_TYPE (reloc->r_info) == R_SH_JMP_SLOT)
+ *reloc_addr += l_addr;
+ else
+ _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
+}
+
+#endif /* RESOLVE */
diff --git a/sysdeps/sh/sh4/fpu/fclrexcpt.c b/sysdeps/sh/sh4/fpu/fclrexcpt.c
new file mode 100644
index 0000000000..cf77cfe5b3
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/fclrexcpt.c
@@ -0,0 +1,45 @@
+/* Clear given exceptions in current floating-point environment.
+ Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998.
+
+ 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+__feclearexcept (int excepts)
+{
+ int cw;
+
+ /* Mask out unsupported bits/exceptions. */
+ excepts &= FE_ALL_EXCEPT;
+
+ /* Read the complete control word. */
+ _FPU_GETCW (cw);
+
+ /* Clear exception bits. */
+ cw &= ~excepts;
+
+ /* Put the new data in effect. */
+ _FPU_SETCW (cw);
+
+ return 0;
+}
+strong_alias (__feclearexcept, __old_feclearexcept)
+symbol_version (__old_feclearexcept, feclearexcept, GLIBC_2.1);
+default_symbol_version (__feclearexcept, feclearexcept, GLIBC_2.2);
diff --git a/sysdeps/sh/sh4/fpu/fegetenv.c b/sysdeps/sh/sh4/fpu/fegetenv.c
new file mode 100644
index 0000000000..8bd540bd31
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/fegetenv.c
@@ -0,0 +1,34 @@
+/* Store current floating-point environment.
+ Copyright (C) 1997, 1998, 1999, 2000 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+__fegetenv (fenv_t *envp)
+{
+ unsigned long int temp;
+ _FPU_GETCW (temp);
+ envp->__fpscr = temp;
+
+ return 0;
+}
+strong_alias (__fegetenv, __old_fegetenv)
+symbol_version (__old_fegetenv, fegetenv, GLIBC_2.1);
+default_symbol_version (__fegetenv, fegetenv, GLIBC_2.2);
diff --git a/sysdeps/sh/sh4/fpu/fegetround.c b/sysdeps/sh/sh4/fpu/fegetround.c
new file mode 100644
index 0000000000..f53924ae7e
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/fegetround.c
@@ -0,0 +1,33 @@
+/* Return current rounding direction.
+ Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998.
+
+ 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+fegetround (void)
+{
+ int cw;
+
+ /* Get control word. */
+ _FPU_GETCW (cw);
+
+ return cw & 0x3;
+}
diff --git a/sysdeps/sh/sh4/fpu/feholdexcpt.c b/sysdeps/sh/sh4/fpu/feholdexcpt.c
new file mode 100644
index 0000000000..43a464dbbd
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/feholdexcpt.c
@@ -0,0 +1,37 @@
+/* Store current floating-point environment and clear exceptions.
+ Copyright (C) 1997, 1998, 1999, 2000 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+feholdexcept (fenv_t *envp)
+{
+ unsigned long int temp;
+
+ /* Store the environment. */
+ _FPU_GETCW (temp);
+ envp->__fpscr = temp;
+
+ /* Now set all exceptions to non-stop. */
+ temp &= ~FE_ALL_EXCEPT;
+ _FPU_SETCW (temp);
+
+ return 1;
+}
diff --git a/sysdeps/sh/sh4/fpu/fesetenv.c b/sysdeps/sh/sh4/fpu/fesetenv.c
new file mode 100644
index 0000000000..8424782666
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/fesetenv.c
@@ -0,0 +1,37 @@
+/* Install given floating-point environment.
+ Copyright (C) 1997, 1998, 1999, 2000 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+__fesetenv (const fenv_t *envp)
+{
+ if (envp == FE_DFL_ENV)
+ _FPU_SETCW (_FPU_DEFAULT);
+ else
+ {
+ unsigned long int temp = envp->__fpscr;
+ _FPU_SETCW (temp);
+ }
+ return 0;
+}
+strong_alias (__fesetenv, __old_fesetenv)
+symbol_version (__old_fesetenv, fesetenv, GLIBC_2.1);
+default_symbol_version (__fesetenv, fesetenv, GLIBC_2.2);
diff --git a/sysdeps/sh/sh4/fpu/fesetround.c b/sysdeps/sh/sh4/fpu/fesetround.c
new file mode 100644
index 0000000000..1d3ec2e5a3
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/fesetround.c
@@ -0,0 +1,43 @@
+/* Set current rounding direction.
+ Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998.
+
+ 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetround (int round)
+{
+ unsigned int cw;
+
+ if ((round & ~0x3) != 0)
+ /* ROUND is no valid rounding mode. */
+ return 0;
+
+ /* Get current state. */
+ _FPU_GETCW (cw);
+
+ /* Set rounding bits. */
+ cw &= ~0x3;
+ cw |= round;
+ /* Set new state. */
+ _FPU_SETCW (cw);
+
+ return 1;
+}
diff --git a/sysdeps/sh/sh4/fpu/fpu_control.h b/sysdeps/sh/sh4/fpu/fpu_control.h
new file mode 100644
index 0000000000..1cf5154d0c
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/fpu_control.h
@@ -0,0 +1,56 @@
+/* FPU control word definitions. SH version.
+ Copyright (C) 1999, 2000 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 _FPU_CONTROL_H
+#define _FPU_CONTROL_H
+
+/* masking of interrupts */
+#define _FPU_MASK_VM 0x0800 /* Invalid operation */
+#define _FPU_MASK_ZM 0x0400 /* Division by zero */
+#define _FPU_MASK_OM 0x0200 /* Overflow */
+#define _FPU_MASK_UM 0x0100 /* Underflow */
+#define _FPU_MASK_IM 0x0080 /* Inexact operation */
+
+/* rounding control */
+#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */
+#define _FPU_RC_ZERO 0x1
+
+#define _FPU_RESERVED 0xffc00000 /* These bits are reserved. */
+
+/* The fdlibm code requires strict IEEE double precision arithmetic,
+ and no interrupts for exceptions, rounding to nearest. */
+#define _FPU_DEFAULT 0x00080000 /* Default value. */
+#define _FPU_IEEE 0x00080f80 /* Default + exceptions enabled. */
+
+/* Type of the control word. */
+typedef unsigned int fpu_control_t;
+
+/* Macros for accessing the hardware control word. */
+#define _FPU_GETCW(cw) __asm__ ("sts fpscr,%0" : "=r" (cw))
+
+#if defined __GNUC__
+#define _FPU_SETCW(cw) __set_fpscr ((cw))
+#else
+#define _FPU_SETCW(cw) __asm__ ("lds %0,fpscr" : : "r" (cw))
+#endif
+
+/* Default control word set at startup. */
+extern fpu_control_t __fpu_control;
+
+#endif /* _FPU_CONTROL_H */
diff --git a/sysdeps/sh/sh4/fpu/fraiseexcpt.c b/sysdeps/sh/sh4/fpu/fraiseexcpt.c
new file mode 100644
index 0000000000..31d8d92dfb
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/fraiseexcpt.c
@@ -0,0 +1,38 @@
+/* Raise given exceptions.
+ Copyright (C) 1997, 1998, 2000 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 <fenv.h>
+#include <fpu_control.h>
+#include <math.h>
+
+int
+__feraiseexcept (int excepts)
+{
+ /* Raise exceptions represented by EXPECTS. */
+ fexcept_t temp;
+ _FPU_GETCW (temp);
+ temp |= (excepts & FE_ALL_EXCEPT);
+ temp |= (excepts & FE_ALL_EXCEPT) << 5;
+ _FPU_SETCW (temp);
+
+ return 0;
+}
+strong_alias (__feraiseexcept, __old_feraiseexcept)
+symbol_version (__old_feraiseexcept, feraiseexcept, GLIBC_2.1);
+default_symbol_version (__feraiseexcept, feraiseexcept, GLIBC_2.2);
diff --git a/sysdeps/sh/sh4/fpu/fsetexcptflg.c b/sysdeps/sh/sh4/fpu/fsetexcptflg.c
new file mode 100644
index 0000000000..b88077ac82
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/fsetexcptflg.c
@@ -0,0 +1,43 @@
+/* Set floating-point environment exception handling.
+ Copyright (C) 1997, 1998, 2000 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 <fenv.h>
+#include <math.h>
+#include <fpu_control.h>
+
+int
+__fesetexceptflag (const fexcept_t *flagp, int excepts)
+{
+ fexcept_t temp;
+
+ /* Get the current environment. */
+ _FPU_GETCW (temp);
+
+ /* Set the desired exception mask. */
+ temp &= ~(excepts & FE_ALL_EXCEPT);
+ temp |= (*flagp & excepts & FE_ALL_EXCEPT);
+
+ /* Save state back to the FPU. */
+ _FPU_SETCW (temp);
+
+ return 0;
+}
+strong_alias (__fesetexceptflag, __old_fesetexceptflag)
+symbol_version (__old_fesetexceptflag, fesetexceptflag, GLIBC_2.1);
+default_symbol_version (__fesetexceptflag, fesetexceptflag, GLIBC_2.2);
diff --git a/sysdeps/sh/sh4/fpu/ftestexcept.c b/sysdeps/sh/sh4/fpu/ftestexcept.c
new file mode 100644
index 0000000000..23ce149ca6
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/ftestexcept.c
@@ -0,0 +1,32 @@
+/* Test exception in current environment.
+ Copyright (C) 1997, 1998, 2000 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 <fenv.h>
+#include <fpu_control.h>
+
+int
+fetestexcept (int excepts)
+{
+ fexcept_t temp;
+
+ /* Get current exceptions. */
+ _FPU_GETCW (temp);
+
+ return temp & excepts & FE_ALL_EXCEPT;
+}
diff --git a/sysdeps/sh/sh4/fpu/libm-test-ulps b/sysdeps/sh/sh4/fpu/libm-test-ulps
new file mode 100644
index 0000000000..4737025991
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/libm-test-ulps
@@ -0,0 +1,1079 @@
+# Begin of automatic generation
+
+# asin
+Test "asin (-0.5) == -pi/6":
+float: 2
+ifloat: 2
+Test "asin (0.5) == pi/6":
+float: 2
+ifloat: 2
+Test "asin (0.7) == 0.7753974966107530637":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# atanh
+Test "atanh (0.7) == 0.8673005276940531944":
+double: 1
+idouble: 1
+
+# cabs
+Test "cabs (-0.7 + 12.4 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (-0.7 - 12.4 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (-12.4 + 0.7 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (-12.4 - 0.7 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "cabs (0.7 + 1.2 i) == 1.3892443989449804508":
+double: 1
+idouble: 1
+Test "cabs (0.7 + 12.4 i) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+
+# cacos
+Test "Real part of: cacos (0.7 + 1.2 i) == 1.1351827477151551089 - 1.0927647857577371459 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cacos (0.7 + 1.2 i) == 1.1351827477151551089 - 1.0927647857577371459 i":
+float: 1
+ifloat: 1
+
+# cacosh
+Test "Real part of: cacosh (-2 - 3 i) == -1.9833870299165354323 + 2.1414491111159960199 i":
+double: 1
+float: 7
+idouble: 1
+ifloat: 7
+Test "Imaginary part of: cacosh (-2 - 3 i) == -1.9833870299165354323 + 2.1414491111159960199 i":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+Test "Real part of: cacosh (0.7 + 1.2 i) == 1.0927647857577371459 + 1.1351827477151551089 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# casin
+Test "Real part of: casin (0.7 + 1.2 i) == 0.4356135790797415103 + 1.0927647857577371459 i":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+Test "Imaginary part of: casin (0.7 + 1.2 i) == 0.4356135790797415103 + 1.0927647857577371459 i":
+float: 1
+ifloat: 1
+
+# casinh
+Test "Real part of: casinh (-2 - 3 i) == -1.9686379257930962917 - 0.9646585044076027920 i":
+double: 5
+float: 1
+idouble: 5
+ifloat: 1
+Test "Imaginary part of: casinh (-2 - 3 i) == -1.9686379257930962917 - 0.9646585044076027920 i":
+double: 3
+float: 6
+idouble: 3
+ifloat: 6
+Test "Real part of: casinh (0.7 + 1.2 i) == 0.9786545955936738768 + 0.9113541895315601156 i":
+double: 1
+idouble: 1
+Test "Imaginary part of: casinh (0.7 + 1.2 i) == 0.9786545955936738768 + 0.9113541895315601156 i":
+float: 1
+ifloat: 1
+
+# catan
+Test "Real part of: catan (-2 - 3 i) == -1.4099210495965755225 - 0.2290726829685387662 i":
+float: 3
+ifloat: 3
+Test "Imaginary part of: catan (-2 - 3 i) == -1.4099210495965755225 - 0.2290726829685387662 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Real part of: catan (0.7 + 1.2 i) == 1.0785743834118921877 + 0.5770573776534306764 i":
+float: 4
+ifloat: 4
+Test "Imaginary part of: catan (0.7 + 1.2 i) == 1.0785743834118921877 + 0.5770573776534306764 i":
+double: 1
+idouble: 1
+
+# catanh
+Test "Real part of: catanh (-2 - 3 i) == -0.1469466662255297520 - 1.3389725222944935611 i":
+double: 4
+idouble: 4
+Test "Imaginary part of: catanh (-2 - 3 i) == -0.1469466662255297520 - 1.3389725222944935611 i":
+float: 4
+ifloat: 4
+Test "Real part of: catanh (0.7 + 1.2 i) == 0.2600749516525135959 + 0.9702403077950989849 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: catanh (0.7 + 1.2 i) == 0.2600749516525135959 + 0.9702403077950989849 i":
+double: 1
+float: 6
+idouble: 1
+ifloat: 6
+
+# cbrt
+Test "cbrt (-27.0) == -3.0":
+double: 1
+idouble: 1
+Test "cbrt (0.970299) == 0.99":
+double: 1
+idouble: 1
+
+# ccos
+Test "Imaginary part of: ccos (-2 - 3 i) == -4.1896256909688072301 - 9.1092278937553365979 i":
+float: 1
+ifloat: 1
+Test "Real part of: ccos (0.7 + 1.2 i) == 1.3848657645312111080 - 0.97242170335830028619 i":
+double: 1
+idouble: 1
+Test "Imaginary part of: ccos (0.7 + 1.2 i) == 1.3848657645312111080 - 0.97242170335830028619 i":
+double: 1
+idouble: 1
+
+# ccosh
+Test "Real part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: ccosh (-2 - 3 i) == -3.7245455049153225654 + 0.5118225699873846088 i":
+float: 1
+ifloat: 1
+Test "Real part of: ccosh (0.7 + 1.2 i) == 0.4548202223691477654 + 0.7070296600921537682 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: ccosh (0.7 + 1.2 i) == 0.4548202223691477654 + 0.7070296600921537682 i":
+double: 1
+idouble: 1
+
+# cexp
+Test "Imaginary part of: cexp (-2.0 - 3.0 i) == -0.1339809149295426134 - 0.0190985162611351964 i":
+float: 1
+ifloat: 1
+Test "Real part of: cexp (0.7 + 1.2 i) == 0.7296989091503236012 + 1.8768962328348102821 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: cexp (0.7 + 1.2 i) == 0.7296989091503236012 + 1.8768962328348102821 i":
+float: 1
+ifloat: 1
+
+# clog
+Test "Imaginary part of: clog (-2 - 3 i) == 1.2824746787307683680 - 2.1587989303424641704 i":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+# clog10
+Test "Imaginary part of: clog10 (-0 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-0 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-2 - 3 i) == 0.5569716761534183846 - 0.9375544629863747085 i":
+double: 1
+float: 5
+idouble: 1
+ifloat: 5
+Test "Imaginary part of: clog10 (-3 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-3 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf + 0 i) == inf + pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf + 1 i) == inf + pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf - 0 i) == inf - pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (-inf - 1 i) == inf - pi*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (0 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (0 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Real part of: clog10 (0.7 + 1.2 i) == 0.1427786545038868803 + 0.4528483579352493248 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (0.7 + 1.2 i) == 0.1427786545038868803 + 0.4528483579352493248 i":
+double: 1
+idouble: 1
+Test "Imaginary part of: clog10 (3 + inf i) == inf + pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (3 - inf i) == inf - pi/2*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (inf + inf i) == inf + pi/4*log10(e) i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: clog10 (inf - inf i) == inf - pi/4*log10(e) i":
+float: 1
+ifloat: 1
+
+# cos
+Test "cos (0.7) == 0.7648421872844884262":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "cos (M_PI_6l * 2.0) == 0.5":
+double: 1
+float: 0.5
+idouble: 1
+ifloat: 0.5
+Test "cos (M_PI_6l * 4.0) == -0.5":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "cos (pi/2) == 0":
+double: 0.2758
+float: 0.3667
+idouble: 0.2758
+ifloat: 0.3667
+
+# cpow
+Test "Real part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+Test "Imaginary part of: cpow (2 + 3 i, 4 + 0 i) == -119.0 - 120.0 i":
+float: 2
+ifloat: 2
+Test "Imaginary part of: cpow (e + 0 i, 0 + 2 * M_PIl i) == 1.0 + 0.0 i":
+double: 1.1031
+float: 1.5
+idouble: 1.1031
+ifloat: 1.5
+
+# csin
+Test "Imaginary part of: csin (0.7 + 1.2 i) == 1.1664563419657581376 + 1.1544997246948547371 i":
+float: 1
+ifloat: 1
+
+# csinh
+Test "Imaginary part of: csinh (-2 - 3 i) == 3.5905645899857799520 - 0.5309210862485198052 i":
+double: 1
+idouble: 1
+Test "Real part of: csinh (0.7 + 1.2 i) == 0.27487868678117583582 + 1.1698665727426565139 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: csinh (0.7 + 1.2 i) == 0.27487868678117583582 + 1.1698665727426565139 i":
+float: 1
+ifloat: 1
+
+# csqrt
+Test "Real part of: csqrt (-2 + 3 i) == 0.8959774761298381247 + 1.6741492280355400404 i":
+float: 1
+ifloat: 1
+Test "Real part of: csqrt (-2 - 3 i) == 0.8959774761298381247 - 1.6741492280355400404 i":
+float: 1
+ifloat: 1
+Test "Real part of: csqrt (0.7 + 1.2 i) == 1.0220676100300264507 + 0.5870453129635652115 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "Imaginary part of: csqrt (0.7 + 1.2 i) == 1.0220676100300264507 + 0.5870453129635652115 i":
+float: 1
+ifloat: 1
+
+# ctan
+Test "Real part of: ctan (-2 - 3 i) == 0.0037640256415042482 - 1.0032386273536098014 i":
+double: 1
+idouble: 1
+Test "Real part of: ctan (0.7 + 1.2 i) == 0.1720734197630349001 + 0.9544807059989405538 i":
+float: 1
+ifloat: 1
+Test "Imaginary part of: ctan (0.7 + 1.2 i) == 0.1720734197630349001 + 0.9544807059989405538 i":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# ctanh
+Test "Real part of: ctanh (-2 - 3 i) == -0.9653858790221331242 + 0.0098843750383224937 i":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+Test "Imaginary part of: ctanh (0 + pi/4 i) == 0.0 + 1.0 i":
+float: 1
+ifloat: 1
+Test "Real part of: ctanh (0.7 + 1.2 i) == 1.3472197399061191630 + 0.4778641038326365540 i":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "Imaginary part of: ctanh (0.7 + 1.2 i) == 1.3472197399061191630 + 0.4778641038326365540 i":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+# erfc
+Test "erfc (0.7) == 0.32219880616258152702":
+double: 1
+idouble: 1
+Test "erfc (1.2) == 0.089686021770364619762":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+Test "erfc (2.0) == 0.0046777349810472658379":
+double: 1
+idouble: 1
+Test "erfc (4.1) == 0.67000276540848983727e-8":
+double: 24
+float: 12
+idouble: 24
+ifloat: 12
+
+# exp10
+Test "exp10 (-1) == 0.1":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "exp10 (0.7) == 5.0118723362727228500":
+float: 1
+ifloat: 1
+Test "exp10 (3) == 1000":
+double: 6
+float: 2
+idouble: 6
+ifloat: 2
+
+# expm1
+Test "expm1 (1) == M_El - 1.0":
+float: 1
+ifloat: 1
+
+# fmod
+Test "fmod (-6.5, -2.3) == -1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "fmod (-6.5, 2.3) == -1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "fmod (6.5, -2.3) == 1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "fmod (6.5, 2.3) == 1.9":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+# hypot
+Test "hypot (-0.7, -12.4) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (-0.7, 12.4) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (-12.4, -0.7) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (-12.4, 0.7) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (0.7, -12.4) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (0.7, 1.2) == 1.3892443989449804508":
+double: 1
+idouble: 1
+Test "hypot (0.7, 12.4) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (12.4, -0.7) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+Test "hypot (12.4, 0.7) == 12.41974234837422060118":
+float: 1
+ifloat: 1
+
+# j0
+Test "j0 (10.0) == -0.24593576445134833520":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "j0 (2.0) == 0.22389077914123566805":
+float: 2
+ifloat: 2
+Test "j0 (8.0) == 0.17165080713755390609":
+float: 1
+ifloat: 1
+
+# j1
+Test "j1 (10.0) == 0.043472746168861436670":
+float: 2
+ifloat: 2
+Test "j1 (2.0) == 0.57672480775687338720":
+double: 1
+idouble: 1
+Test "j1 (8.0) == 0.23463634685391462438":
+double: 1
+idouble: 1
+
+# jn
+Test "jn (0, 10.0) == -0.24593576445134833520":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "jn (0, 2.0) == 0.22389077914123566805":
+float: 2
+ifloat: 2
+Test "jn (0, 8.0) == 0.17165080713755390609":
+float: 1
+ifloat: 1
+Test "jn (1, 10.0) == 0.043472746168861436670":
+float: 2
+ifloat: 2
+Test "jn (1, 2.0) == 0.57672480775687338720":
+double: 1
+idouble: 1
+Test "jn (1, 8.0) == 0.23463634685391462438":
+double: 1
+idouble: 1
+Test "jn (10, 0.1) == 0.26905328954342155795e-19":
+double: 6
+float: 4
+idouble: 6
+ifloat: 4
+Test "jn (10, 0.7) == 0.75175911502153953928e-11":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "jn (10, 10.0) == 0.20748610663335885770":
+double: 4
+float: 3
+idouble: 4
+ifloat: 3
+Test "jn (10, 2.0) == 0.25153862827167367096e-6":
+float: 4
+ifloat: 4
+Test "jn (3, 0.1) == 0.000020820315754756261429":
+double: 1
+idouble: 1
+Test "jn (3, 0.7) == 0.0069296548267508408077":
+float: 1
+ifloat: 1
+Test "jn (3, 10.0) == 0.058379379305186812343":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "jn (3, 2.0) == 0.12894324947440205110":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# lgamma
+Test "lgamma (0.7) == 0.26086724653166651439":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "lgamma (1.2) == -0.853740900033158497197e-1":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# log
+Test "log (0.7) == -0.35667494393873237891":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# log10
+Test "log10 (0.7) == -0.15490195998574316929":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "log10 (e) == log10(e)":
+float: 1
+ifloat: 1
+
+# log1p
+Test "log1p (-0.3) == -0.35667494393873237891":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# log2
+Test "log2 (0.7) == -0.51457317282975824043":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# sincos
+Test "sincos (0.7, &sin_res, &cos_res) puts 0.76484218728448842626 in cos_res":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.5 in cos_res":
+double: 1
+float: 0.5
+idouble: 1
+ifloat: 0.5
+Test "sincos (M_PI_6l*2.0, &sin_res, &cos_res) puts 0.866025403784438646764 in sin_res":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "sincos (pi/2, &sin_res, &cos_res) puts 0 in cos_res":
+double: 0.2758
+float: 0.3667
+idouble: 0.2758
+ifloat: 0.3667
+Test "sincos (pi/6, &sin_res, &cos_res) puts 0.866025403784438646764 in cos_res":
+float: 1
+ifloat: 1
+
+# sinh
+Test "sinh (0.7) == 0.75858370183953350346":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# tan
+Test "tan (pi/4) == 1":
+double: 0.5
+idouble: 0.5
+
+# tanh
+Test "tanh (0.7) == 0.60436777711716349631":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# tgamma
+Test "tgamma (-0.5) == -2 sqrt (pi)":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "tgamma (0.5) == sqrt (pi)":
+float: 1
+ifloat: 1
+Test "tgamma (0.7) == 1.29805533264755778568":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# y0
+Test "y0 (0.7) == -0.19066492933739506743":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "y0 (1.0) == 0.088256964215676957983":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "y0 (1.5) == 0.38244892379775884396":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "y0 (10.0) == 0.055671167283599391424":
+float: 1
+ifloat: 1
+Test "y0 (8.0) == 0.22352148938756622053":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+# y1
+Test "y1 (0.1) == -6.4589510947020269877":
+double: 1
+idouble: 1
+Test "y1 (0.7) == -1.1032498719076333697":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "y1 (1.5) == -0.41230862697391129595":
+float: 1
+ifloat: 1
+Test "y1 (10.0) == 0.24901542420695388392":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "y1 (2.0) == -0.10703243154093754689":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "y1 (8.0) == -0.15806046173124749426":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+# yn
+Test "yn (0, 0.7) == -0.19066492933739506743":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "yn (0, 1.0) == 0.088256964215676957983":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "yn (0, 1.5) == 0.38244892379775884396":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+Test "yn (0, 10.0) == 0.055671167283599391424":
+float: 1
+ifloat: 1
+Test "yn (0, 8.0) == 0.22352148938756622053":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (1, 0.1) == -6.4589510947020269877":
+double: 1
+idouble: 1
+Test "yn (1, 0.7) == -1.1032498719076333697":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (1, 1.5) == -0.41230862697391129595":
+float: 1
+ifloat: 1
+Test "yn (1, 10.0) == 0.24901542420695388392":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "yn (1, 2.0) == -0.10703243154093754689":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (1, 8.0) == -0.15806046173124749426":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+Test "yn (10, 0.1) == -0.11831335132045197885e19":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+Test "yn (10, 0.7) == -0.42447194260703866924e10":
+double: 3
+idouble: 3
+Test "yn (10, 1.0) == -0.12161801427868918929e9":
+double: 1
+idouble: 1
+Test "yn (10, 10.0) == -0.35981415218340272205":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (10, 2.0) == -129184.54220803928264":
+double: 2
+idouble: 2
+Test "yn (3, 0.1) == -5099.3323786129048894":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (3, 0.7) == -15.819479052819633505":
+double: 3
+float: 1
+idouble: 3
+ifloat: 1
+Test "yn (3, 10.0) == -0.25136265718383732978":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+Test "yn (3, 2.0) == -1.1277837768404277861":
+double: 1
+idouble: 1
+
+# Maximal error of functions:
+Function: "asin":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "atanh":
+double: 1
+idouble: 1
+
+Function: "cabs":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "cacos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "cacos":
+float: 1
+ifloat: 1
+
+Function: Real part of "cacosh":
+double: 1
+float: 7
+idouble: 1
+ifloat: 7
+
+Function: Imaginary part of "cacosh":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+Function: Real part of "casin":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: Imaginary part of "casin":
+float: 1
+ifloat: 1
+
+Function: Real part of "casinh":
+double: 5
+float: 1
+idouble: 5
+ifloat: 1
+
+Function: Imaginary part of "casinh":
+double: 3
+float: 6
+idouble: 3
+ifloat: 6
+
+Function: Real part of "catan":
+float: 4
+ifloat: 4
+
+Function: Imaginary part of "catan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "catanh":
+double: 4
+float: 1
+idouble: 4
+ifloat: 1
+
+Function: Imaginary part of "catanh":
+double: 1
+float: 6
+idouble: 1
+ifloat: 6
+
+Function: "cbrt":
+double: 1
+idouble: 1
+
+Function: Real part of "ccos":
+double: 1
+idouble: 1
+
+Function: Imaginary part of "ccos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "ccosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ccosh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "cexp":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "cexp":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "clog":
+double: 1
+float: 3
+idouble: 1
+ifloat: 3
+
+Function: Real part of "clog10":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "clog10":
+double: 1
+float: 5
+idouble: 1
+ifloat: 5
+
+Function: "cos":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: Real part of "cpow":
+double: 1
+float: 4
+idouble: 1
+ifloat: 4
+
+Function: Imaginary part of "cpow":
+double: 1.1031
+float: 2
+idouble: 1.1031
+ifloat: 2
+
+Function: Imaginary part of "csin":
+float: 1
+ifloat: 1
+
+Function: Real part of "csinh":
+float: 1
+ifloat: 1
+
+Function: Imaginary part of "csinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "csqrt":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "csqrt":
+float: 1
+ifloat: 1
+
+Function: Real part of "ctan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Imaginary part of "ctan":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: Real part of "ctanh":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: Imaginary part of "ctanh":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "erfc":
+double: 24
+float: 12
+idouble: 24
+ifloat: 12
+
+Function: "exp10":
+double: 6
+float: 2
+idouble: 6
+ifloat: 2
+
+Function: "expm1":
+float: 1
+ifloat: 1
+
+Function: "fmod":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "hypot":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "j0":
+double: 2
+float: 2
+idouble: 2
+ifloat: 2
+
+Function: "j1":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "jn":
+double: 6
+float: 4
+idouble: 6
+ifloat: 4
+
+Function: "lgamma":
+double: 1
+float: 2
+idouble: 1
+ifloat: 2
+
+Function: "log":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "log10":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "log1p":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "log2":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "sincos":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "sinh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "tan":
+double: 0.5
+idouble: 0.5
+
+Function: "tanh":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "tgamma":
+double: 1
+float: 1
+idouble: 1
+ifloat: 1
+
+Function: "y0":
+double: 2
+float: 1
+idouble: 2
+ifloat: 1
+
+Function: "y1":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+Function: "yn":
+double: 3
+float: 2
+idouble: 3
+ifloat: 2
+
+# end of automatic generation
diff --git a/sysdeps/sh/sh4/setjmp.S b/sysdeps/sh/sh4/setjmp.S
new file mode 100644
index 0000000000..76061cd822
--- /dev/null
+++ b/sysdeps/sh/sh4/setjmp.S
@@ -0,0 +1,72 @@
+/* setjmp for SH4.
+ Copyright (C) 1999, 2000 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>
+#define _SETJMP_H
+#define _ASM
+#include <bits/setjmp.h>
+
+ /* Binary compatibility entry point. */
+ENTRY (__setjmp)
+ mov #0, r5
+ENTRY (__sigsetjmp)
+ /* Save registers */
+ add #JB_SIZE, r4
+ fmov.s fr15, @-r4
+ fmov.s fr14, @-r4
+ fmov.s fr13, @-r4
+ fmov.s fr12, @-r4
+ sts.l fpscr, @-r4
+ stc.l gbr, @-r4
+ sts.l pr, @-r4
+ mov.l r15, @-r4
+ mov.l r14, @-r4
+ mov.l r13, @-r4
+ mov.l r12, @-r4
+ mov.l r11, @-r4
+ mov.l r10, @-r4
+ mov.l r9, @-r4
+ mov.l r8, @-r4
+
+ /* Make a tail call to __sigjmp_save; it takes the same args. */
+#ifdef SHARED
+ mov.l 1f, r1
+ mova 1f, r0
+ bra 2f
+ add r1, r0
+ .align 2
+1:
+ .long _GLOBAL_OFFSET_TABLE_
+2:
+ mov.l .L1, r1
+ mov.l @(r0,r1), r1
+ jmp @r1
+ nop
+ .align 2
+.L1:
+ .long C_SYMBOL_NAME(__sigjmp_save@GOT)
+#else
+ mov.l .L1, r1
+ jmp @r1
+ nop
+ .align 2
+.L1:
+ .long C_SYMBOL_NAME(__sigjmp_save)
+#endif
+END (__setjmp)
diff --git a/sysdeps/sh/strlen.S b/sysdeps/sh/strlen.S
new file mode 100644
index 0000000000..f79a5cd6e2
--- /dev/null
+++ b/sysdeps/sh/strlen.S
@@ -0,0 +1,84 @@
+/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
+
+ 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>
+#include <endian.h>
+
+/* size_t strlen (const char *s) */
+
+ENTRY(strlen)
+ mov r4, r0
+ and #3, r0
+ tst r0, r0
+ bt/s 1f
+ mov #0, r2
+
+ add #-1, r0
+ shll2 r0
+ shll r0
+ braf r0
+ nop
+
+ mov.b @r4+, r1
+ tst r1, r1
+ bt 8f
+ add #1, r2
+
+ mov.b @r4+, r1
+ tst r1, r1
+ bt 8f
+ add #1, r2
+
+ mov.b @r4+, r1
+ tst r1, r1
+ bt 8f
+ add #1, r2
+
+1:
+ mov #0, r3
+2:
+ mov.l @r4+, r1
+ cmp/str r3, r1
+ bf/s 2b
+ add #4, r2
+
+ add #-4, r2
+#if __BYTE_ORDER == __BIG_ENDIAN
+ swap.b r1, r1
+ swap.w r1, r1
+ swap.b r1, r1
+#endif
+ extu.b r1, r0
+ tst r0, r0
+ bt/s 8f
+ shlr8 r1
+ add #1, r2
+ extu.b r1, r0
+ tst r0, r0
+ bt/s 8f
+ shlr8 r1
+ add #1, r2
+ extu.b r1, r0
+ tst r0, r0
+ bt 8f
+ add #1, r2
+8:
+ rts
+ mov r2, r0
+END(strlen)
diff --git a/sysdeps/sh/sys/ucontext.h b/sysdeps/sh/sys/ucontext.h
new file mode 100644
index 0000000000..84ff44a1cb
--- /dev/null
+++ b/sysdeps/sh/sys/ucontext.h
@@ -0,0 +1,99 @@
+/* Copyright (C) 1999, 2000 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. */
+
+/* Where is System V/SH ABI? */
+
+#ifndef _SYS_UCONTEXT_H
+#define _SYS_UCONTEXT_H 1
+
+#include <features.h>
+#include <signal.h>
+
+typedef int greg_t;
+
+/* Number of general registers. */
+#define NGREG 16
+
+/* Container for all general registers. */
+typedef greg_t gregset_t[NGREG];
+
+/* Number of each register is the `gregset_t' array. */
+enum
+{
+ R0 = 0,
+#define R0 R0
+ R1 = 1,
+#define R1 R1
+ R2 = 2,
+#define R2 R2
+ R3 = 3,
+#define R3 R3
+ R4 = 4,
+#define R4 R4
+ R5 = 5,
+#define R5 R5
+ R6 = 6,
+#define R6 R6
+ R7 = 7,
+#define R7 R7
+ R8 = 8,
+#define R8 R8
+ R9 = 9,
+#define R9 R9
+ R10 = 10,
+#define R10 R10
+ R11 = 11,
+#define R11 R11
+ R12 = 12,
+#define R12 R12
+ R13 = 13,
+#define R13 R13
+ R14 = 14,
+#define R14 R14
+ R15 = 15,
+#define R15 R15
+};
+
+typedef int freg_t;
+
+/* Number of FPU registers. */
+#define NFREG 16
+
+/* Structure to describe FPU registers. */
+typedef freg_t fpregset_t[NFREG];
+
+/* Context to describe whole processor state. */
+typedef struct
+ {
+ gregset_t gregs;
+ fpregset_t fpregs;
+ fpregset_t xfpregs;
+ } mcontext_t;
+
+/* Userlevel context. */
+typedef struct ucontext
+ {
+ unsigned long int uc_flags;
+ struct ucontext *uc_link;
+ __sigset_t uc_sigmask;
+ stack_t uc_stack;
+ mcontext_t uc_mcontext;
+ long int uc_filler[5];
+ } ucontext_t;
+
+#endif /* sys/ucontext.h */
diff --git a/sysdeps/sh/sysdep.h b/sysdeps/sh/sysdep.h
new file mode 100644
index 0000000000..b0e791ef3f
--- /dev/null
+++ b/sysdeps/sh/sysdep.h
@@ -0,0 +1,76 @@
+/* Assembler macros for SH.
+ Copyright (C) 1999, 2000 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 <sysdeps/generic/sysdep.h>
+
+#ifdef __ASSEMBLER__
+
+/* Syntactic details of assembler. */
+
+#ifdef HAVE_ELF
+
+#define ALIGNARG(log2) log2
+/* For ELF we need the `.type' directive to make shared libs work right. */
+#define ASM_TYPE_DIRECTIVE(name,typearg) .type name,@##typearg;
+#define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+
+#ifdef SHARED
+#define PLTJMP(_x) _x##@PLT
+#else
+#define PLTJMP(_x) _x
+#endif
+
+#else
+
+#define ALIGNARG(log2) log2
+#define ASM_TYPE_DIRECTIVE(name,type) /* Nothing is specified. */
+#define ASM_SIZE_DIRECTIVE(name) /* Nothing is specified. */
+
+#define PLTJMP(_x) _x
+
+#endif
+
+/* Define an entry point visible from C. */
+#define ENTRY(name) \
+ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name); \
+ ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),function) \
+ .align ALIGNARG(5); \
+ C_LABEL(name) \
+ CALL_MCOUNT
+
+#undef END
+#define END(name) \
+ ASM_SIZE_DIRECTIVE(C_SYMBOL_NAME(name))
+
+/* If compiled for profiling, call `mcount' at the start of each function. */
+#ifdef PROF
+#define CALL_MCOUNT /* NOTYET */
+#else
+#define CALL_MCOUNT /* Do nothing. */
+#endif
+
+#ifdef NO_UNDERSCORES
+/* Since C identifiers are not normally prefixed with an underscore
+ on this system, the asm identifier `syscall_error' intrudes on the
+ C name space. Make sure we use an innocuous name. */
+#define syscall_error __syscall_error
+#define mcount _mcount
+#endif
+
+#endif /* __ASSEMBLER__ */