This is the mail archive of the libc-alpha@sources.redhat.com mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

CRIS port 5/8: sysdeps/cris


Contents of glibc/sysdeps/cris.  Note, as mentioned, copyright Axis on
sysdeps/cris/memcpy.c and sysdeps/cris/memset.c.  Copyright dates just
*look* random.  They depend on whatever file in some other port I started
from; i.e. "based the work on", thus according to instructions AFAICT. :-)

I'm not sure I got the Dist files right (though I did RTFM).  I played tag
with other ports again.

2001-04-08  Hans-Peter Nilsson  <hp@axis.com>

	* sysdeps/cris/Dist: New file.
	* sysdeps/cris/Implies: New file.
	* sysdeps/cris/Makefile: New file.
	* sysdeps/cris/__longjmp.S: New file.
	* sysdeps/cris/_mcount.S: New file.
	* sysdeps/cris/bits/endian.h: New file.
	* sysdeps/cris/bits/setjmp.h: New file.
	* sysdeps/cris/bits/string.h: New file.
	* sysdeps/cris/dl-machine.h: New file.
	* sysdeps/cris/elf/start.S: New file.
	* sysdeps/cris/machine-gmon.h: New file.
	* sysdeps/cris/memcopy.h: New file.
	* sysdeps/cris/memcpy.c: New file.
	* sysdeps/cris/mempcpy.c: New file.
	* sysdeps/cris/memset.c: New file.
	* sysdeps/cris/memusage.h: New file.
	* sysdeps/cris/setjmp.S: New file.
	* sysdeps/cris/sysdep.h: New file.
	* sysdeps/cris/wordcopy.c: New file.

diff -cpNr sysdeps/cris.empty/Dist sysdeps/cris/Dist
*** sysdeps/cris.empty/Dist	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/Dist	Wed Feb 28 01:53:41 2001
***************
*** 0 ****
--- 1 ----
+ _mcount.S
diff -cpNr sysdeps/cris.empty/Implies sysdeps/cris/Implies
*** sysdeps/cris.empty/Implies	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/Implies	Tue Feb 20 07:22:07 2001
***************
*** 0 ****
--- 1,3 ----
+ wordsize-32
+ ieee754/flt-32
+ ieee754/dbl-64
diff -cpNr sysdeps/cris.empty/Makefile sysdeps/cris/Makefile
*** sysdeps/cris.empty/Makefile	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/Makefile	Tue Mar 27 05:01:35 2001
***************
*** 0 ****
--- 1,232 ----
+ # Copyright (C) 1999, 2000, 2001 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.
+ 
+ # We don't support long doubles as a distinct type.  We don't need to set
+ # this variable; it's here mostly for documentational purposes.
+ 
+ long-double-fcts = no
+ 
+ ifndef subdir
+ # These are only wanted for the toplevel make.
+ 
+ # Making install-headers does not work for the toplevel in GNU make
+ # 3.77 (only headers in subdirs are installed), and the construct looks
+ # suspicious.  Let's override it here with an explicit rule (can do
+ # since we can override an implicit rule).  (FIXME: That comment is now
+ # historical; perhaps requiring 3.79 fixed that problem.  But this one
+ # remains:)
+ #  And gnu/stubs.h really is a needed header file; it is not suitable to
+ # only install it with "install-others".
+ # Let's have a target-specific target for this.
+ install-headers-cris: install-headers-nosubdir $(inst_includedir)/gnu/stubs.h
+ 
+ # install-lib should install libc.a too.
+ #  If you want this to depend using a more complicated construct like in
+ # $(installed-libcs), go ahead and try.
+ # FIXME: Let's try without this, and see it it's still needed.
+ #install-lib: $(inst_libdir)/libc.a
+ 
+ endif # ! subdir
+ 
+ # FIXME: Note that this is a machine-specific stub; profiling is not
+ # implemented.
+ ifeq ($(subdir),gmon)
+ sysdep_routines += _mcount
+ endif
+ 
+ # FIXME: This test seems generally bogus.  Wrong types in function calls
+ # and assumes FE_TONEAREST is defined.  Does it work somewhere?
+ # Presumably it does, so let's settle for filtering it out target-wise
+ # until it's agreed what should be done.
+ ifeq ($(subdir),math)
+ tests := $(filter-out test-fenv, $(tests))
+ endif
+ 
+ # PIC code must be assembled with special options, passed on by gcc when
+ # given the -fpic option.
+ ASFLAGS-.os = -fpic
+ 
+ # No string inlines from glibc, thank you.  We emit them in GCC where
+ # appropriate - the GCC we use is new enough that the output is sane.
+ CPPFLAGS += -D__NO_STRING_INLINES
+ 
+ # Overflow occurs at 2**15/4 (8192) symbols.  Glibc uses about 2000.
+ # So use -fpic: smaller-size relocs; smaller, faster code.
+ pic-ccflag = -fpic
+ 
+ # Glibc plays games in the link_warning macro with the supposedly
+ # formatted assembly output from gcc.  That is bad.  Nobody notices since
+ # gas does not assume input is formatted unless the first line says
+ # "#NO_APP" and no other ELF gcc port does that at present (2001-02-27),
+ # since the default definition of ASM_FILE_START in gcc/config/elfos.h
+ # does not emit #NO_APP.  (It does not matter that there are #APP/#NO_APP
+ # sequences elsewhere in the assembly output, such as around asm:s.)  We
+ # kludge around it by adding an compiler option that emits verbose
+ # assembly info and causes #NO_APP not to be emitted first in file (but
+ # rather #APP).  We do it only for files we compile, and only those that
+ # use link_warning.  We define $(CFLAGS)-$(@F) which is used in the
+ # general .c compile rule, but seems not defined by other Makefiles or
+ # equivalent.  Unfortunately, we have to provide a definition for every
+ # suffix.  FIXME: Perhaps there's a GNU make spell to make this simpler.
+ # Perhaps we should just supply -mpdebug in a generic CFLAGS.
+ 
+ CFLAGS-getwd.o = -mpdebug
+ CFLAGS-getwd.og = -mpdebug
+ CFLAGS-getwd.os = -mpdebug
+ CFLAGS-iogets.o = -mpdebug
+ CFLAGS-iogets.og = -mpdebug
+ CFLAGS-iogets.os = -mpdebug
+ CFLAGS-attr.o = -mpdebug
+ CFLAGS-attr.og = -mpdebug
+ CFLAGS-attr.os = -mpdebug
+ CFLAGS-mktemp.o = -mpdebug
+ CFLAGS-mktemp.og = -mpdebug
+ CFLAGS-mktemp.os = -mpdebug
+ CFLAGS-getpw.o = -mpdebug
+ CFLAGS-getpw.og = -mpdebug
+ CFLAGS-getpw.os = -mpdebug
+ CFLAGS-siggetmask.o = -mpdebug
+ CFLAGS-siggetmask.og = -mpdebug
+ CFLAGS-siggetmask.os = -mpdebug
+ CFLAGS-gets.o = -mpdebug
+ CFLAGS-gets.og = -mpdebug
+ CFLAGS-gets.os = -mpdebug
+ CFLAGS-tempnam.o = -mpdebug
+ CFLAGS-tempnam.og = -mpdebug
+ CFLAGS-tempnam.os = -mpdebug
+ CFLAGS-tmpnam.o = -mpdebug
+ CFLAGS-tmpnam.og = -mpdebug
+ CFLAGS-tmpnam.os = -mpdebug
+ CFLAGS-tmpnam_r.o = -mpdebug
+ CFLAGS-tmpnam_r.og = -mpdebug
+ CFLAGS-tmpnam_r.os = -mpdebug
+ CFLAGS-llseek.o = -mpdebug
+ CFLAGS-llseek.og = -mpdebug
+ CFLAGS-llseek.os = -mpdebug
+ CFLAGS-sigstack.o = -mpdebug
+ CFLAGS-sigstack.og = -mpdebug
+ CFLAGS-sigstack.os = -mpdebug
+ 
+ # These are stubs.  FIXME: In a minimal library, the ones that aren't
+ # referred from internal functions should be omitted.  (Any notes about
+ # internal use below is incomplet and might be incorect.)
+ CFLAGS-sigreturn.o = -mpdebug
+ CFLAGS-sigreturn.og = -mpdebug
+ CFLAGS-sigreturn.os = -mpdebug
+ CFLAGS-getcontext.o = -mpdebug
+ CFLAGS-getcontext.og = -mpdebug
+ CFLAGS-getcontext.os = -mpdebug
+ CFLAGS-setcontext.o = -mpdebug
+ CFLAGS-setcontext.og = -mpdebug
+ CFLAGS-setcontext.os = -mpdebug
+ CFLAGS-makecontext.o = -mpdebug
+ CFLAGS-makecontext.og = -mpdebug
+ CFLAGS-makecontext.os = -mpdebug
+ CFLAGS-swapcontext.o = -mpdebug
+ CFLAGS-swapcontext.og = -mpdebug
+ CFLAGS-swapcontext.os = -mpdebug
+ CFLAGS-fexecve.o = -mpdebug
+ CFLAGS-fexecve.og = -mpdebug
+ CFLAGS-fexecve.os = -mpdebug
+ CFLAGS-setlogin.o = -mpdebug
+ CFLAGS-setlogin.og = -mpdebug
+ CFLAGS-setlogin.os = -mpdebug
+ CFLAGS-posix_fadvise.o = -mpdebug
+ CFLAGS-posix_fadvise.og = -mpdebug
+ CFLAGS-posix_fadvise.os = -mpdebug
+ CFLAGS-posix_fadvise64.o = -mpdebug
+ CFLAGS-posix_fadvise64.og = -mpdebug
+ CFLAGS-posix_fadvise64.os = -mpdebug
+ CFLAGS-sstk.o = -mpdebug
+ CFLAGS-sstk.og = -mpdebug
+ CFLAGS-sstk.os = -mpdebug
+ CFLAGS-revoke.o = -mpdebug
+ CFLAGS-revoke.og = -mpdebug
+ CFLAGS-revoke.os = -mpdebug
+ CFLAGS-gtty.o = -mpdebug
+ CFLAGS-gtty.og = -mpdebug
+ CFLAGS-gtty.os = -mpdebug
+ CFLAGS-stty.o = -mpdebug
+ CFLAGS-stty.og = -mpdebug
+ CFLAGS-stty.os = -mpdebug
+ CFLAGS-chflags.o = -mpdebug
+ CFLAGS-chflags.og = -mpdebug
+ CFLAGS-chflags.os = -mpdebug
+ CFLAGS-fchflags.o = -mpdebug
+ CFLAGS-fchflags.og = -mpdebug
+ CFLAGS-fchflags.os = -mpdebug
+ CFLAGS-getmsg.o = -mpdebug
+ CFLAGS-getmsg.og = -mpdebug
+ CFLAGS-getmsg.os = -mpdebug
+ CFLAGS-putmsg.o = -mpdebug
+ CFLAGS-putmsg.og = -mpdebug
+ CFLAGS-putmsg.os = -mpdebug
+ CFLAGS-getpmsg.o = -mpdebug
+ CFLAGS-getpmsg.og = -mpdebug
+ CFLAGS-getpmsg.os = -mpdebug
+ CFLAGS-putpmsg.o = -mpdebug
+ CFLAGS-putpmsg.og = -mpdebug
+ CFLAGS-putpmsg.os = -mpdebug
+ CFLAGS-fattach.o = -mpdebug
+ CFLAGS-fattach.og = -mpdebug
+ CFLAGS-fattach.os = -mpdebug
+ CFLAGS-fdetach.o = -mpdebug
+ CFLAGS-fdetach.og = -mpdebug
+ CFLAGS-fdetach.os = -mpdebug
+ CFLAGS-fgetexcptflg.o = -mpdebug
+ CFLAGS-fgetexcptflg.og = -mpdebug
+ CFLAGS-fgetexcptflg.os = -mpdebug
+ CFLAGS-fraiseexcpt.o = -mpdebug # Referred to internally (NOP if fails.)
+ CFLAGS-fraiseexcpt.og = -mpdebug
+ CFLAGS-fraiseexcpt.os = -mpdebug
+ CFLAGS-fsetexcptflg.o = -mpdebug
+ CFLAGS-fsetexcptflg.og = -mpdebug
+ CFLAGS-fsetexcptflg.os = -mpdebug
+ CFLAGS-fclrexcpt.o = -mpdebug
+ CFLAGS-fclrexcpt.og = -mpdebug
+ CFLAGS-fclrexcpt.os = -mpdebug
+ CFLAGS-ftestexcept.o = -mpdebug
+ CFLAGS-ftestexcept.og = -mpdebug
+ CFLAGS-ftestexcept.os = -mpdebug
+ CFLAGS-fegetround.o = -mpdebug
+ CFLAGS-fegetround.og = -mpdebug
+ CFLAGS-fegetround.os = -mpdebug
+ CFLAGS-fegetenv.o = -mpdebug
+ CFLAGS-fegetenv.og = -mpdebug
+ CFLAGS-fegetenv.os = -mpdebug
+ CFLAGS-fesetround.o = -mpdebug # Referred to internally (NOP if fails.)
+ CFLAGS-fesetround.og = -mpdebug
+ CFLAGS-fesetround.os = -mpdebug
+ CFLAGS-fesetenv.o = -mpdebug
+ CFLAGS-fesetenv.og = -mpdebug
+ CFLAGS-fesetenv.os = -mpdebug
+ CFLAGS-feholdexcpt.o = -mpdebug
+ CFLAGS-feholdexcpt.og = -mpdebug
+ CFLAGS-feholdexcpt.os = -mpdebug
+ CFLAGS-feupdateenv.o = -mpdebug
+ CFLAGS-feupdateenv.og = -mpdebug
+ CFLAGS-feupdateenv.os = -mpdebug
+ CFLAGS-fegetexcept.o = -mpdebug
+ CFLAGS-fegetexcept.og = -mpdebug
+ CFLAGS-fegetexcept.os = -mpdebug
+ CFLAGS-fedisblxcpt.o = -mpdebug
+ CFLAGS-fedisblxcpt.og = -mpdebug
+ CFLAGS-fedisblxcpt.os = -mpdebug
+ CFLAGS-feenablxcpt.o = -mpdebug
+ CFLAGS-feenablxcpt.og = -mpdebug
+ CFLAGS-feenablxcpt.os = -mpdebug
diff -cpNr sysdeps/cris.empty/__longjmp.S sysdeps/cris/__longjmp.S
*** sysdeps/cris.empty/__longjmp.S	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/__longjmp.S	Tue Feb 27 20:38:28 2001
***************
*** 0 ****
--- 1,38 ----
+ /* longjmp for CRIS.
+    Copyright (C) 2001 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>
+ 
+ 	.syntax no_register_prefix
+ 
+ /* Saving and restoring CCR is meaningless, so we don't do it.  */
+ ENTRY (__longjmp)
+ 	/* Note that r10 = jmp_buf, r11 = retval.  */
+ 	move [r10+16*4],srp
+ 	test.d r11
+ 	beq 0f                  /* Already a 1 in place. */
+ 	nop
+ 	/* Offset for r9, the return value (see setjmp).  */
+ 	move.d r11,[r10+6*4]
+ 0:
+ 	movem [r10],pc
+ END (__longjmp)
diff -cpNr sysdeps/cris.empty/_mcount.S sysdeps/cris/_mcount.S
*** sysdeps/cris.empty/_mcount.S	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/_mcount.S	Sat Mar 17 23:53:29 2001
***************
*** 0 ****
--- 1,36 ----
+ /* Machine-specific calling sequence for `mcount' profiling function for CRIS.
+    Copyright (C) 2001 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.  */
+ 
+ /* FIXME: This isn't implemented yet.  This is just a machine-specific
+    stub.  Perhaps a real implementation can make use of it.  */
+ 
+ #include <sysdep.h>
+ 
+ #undef CALL_MCOUNT
+ #define CALL_MCOUNT
+ 
+ ENTRY (_mcount)
+ 	SETUP_PIC
+ 	/* Sorry, isn't implemented yet.
+ 	   Can't call abort; that will recurse.  Force SEGV instead.  */
+ 	test.d [99]
+ 1:
+ 	ba 1b
+ 	nop
+ END (_mcount)
diff -cpNr sysdeps/cris.empty/bits/endian.h sysdeps/cris/bits/endian.h
*** sysdeps/cris.empty/bits/endian.h	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/bits/endian.h	Tue Feb 27 03:15:13 2001
***************
*** 0 ****
--- 1,7 ----
+ /* CRIS is little-endian.  */
+ 
+ #ifndef _ENDIAN_H
+ # error "Never use <bits/endian.h> directly; include <endian.h> instead."
+ #endif
+ 
+ #define __BYTE_ORDER __LITTLE_ENDIAN
diff -cpNr sysdeps/cris.empty/bits/setjmp.h sysdeps/cris/bits/setjmp.h
*** sysdeps/cris.empty/bits/setjmp.h	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/bits/setjmp.h	Wed Feb 21 23:30:51 2001
***************
*** 0 ****
--- 1,54 ----
+ /* Copyright (C) 1997, 1998 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', CRIS version.  */
+ 
+ /* Note that saving and restoring CCR has no meaning in user mode, so we
+    don't actually do it; the slot is now reserved.
+ 
+    jmp_buf[0] - PC
+    jmp_buf[1] - SP (R14)
+    jmp_buf[2] - R13
+    jmp_buf[3] - R12
+    jmp_buf[4] - R11
+    jmp_buf[5] - R10
+    jmp_buf[6] - R9
+    jmp_buf[7] - R8
+    jmp_buf[8] - R7
+    jmp_buf[9] - R6
+    jmp_buf[10] - R5
+    jmp_buf[11] - R4
+    jmp_buf[12] - R3
+    jmp_buf[13] - R2
+    jmp_buf[14] - R1
+    jmp_buf[15] - R0
+    jmp_buf[16] - SRP
+    jmp_buf[17] - CCR  */
+ 
+ #ifndef	_ASM
+ typedef unsigned long int __jmp_buf[18];
+ #endif
+ 
+ #if	defined (__USE_MISC) || defined (_ASM)
+ #define JB_SP 1
+ #endif
+ 
+ /* Test if longjmp to JMPBUF would unwind the frame
+    containing a local variable at ADDRESS.  */
+ #define _JMPBUF_UNWINDS(jmpbuf, address) \
+   ((unsigned long int) (address) < (jmpbuf)[JB_SP])
diff -cpNr sysdeps/cris.empty/bits/string.h sysdeps/cris/bits/string.h
*** sysdeps/cris.empty/bits/string.h	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/bits/string.h	Sat Mar 24 21:51:33 2001
***************
*** 0 ****
--- 1,26 ----
+ /* Optimized, inlined string functions.  CRIS version.
+    Copyright (C) 1997, 2001 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 _STRING_H
+ # error "Never use <bits/string.h> directly; include <string.h> instead."
+ #endif
+ 
+ /* Currently the only purpose of this file is to tell the generic inline
+    macros that unaligned memory access is possible.  */
+ #define _STRING_ARCH_unaligned	1
diff -cpNr sysdeps/cris.empty/dl-machine.h sysdeps/cris/dl-machine.h
*** sysdeps/cris.empty/dl-machine.h	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/dl-machine.h	Wed Mar 28 14:08:51 2001
***************
*** 0 ****
--- 1,392 ----
+ /* Machine-dependent ELF dynamic relocation inline functions.  CRIS version.
+    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 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
+ 
+ #define ELF_MACHINE_NAME "CRIS"
+ 
+ #include <sys/param.h>
+ 
+ #ifdef __PIC__
+ # define CALL_FN(x)				\
+ 	"move.d	$pc,$r9\n\t"			\
+ 	"add.d	" #x " - .,$r9\n\t"		\
+ 	"jsr	$r9"
+ #else
+ # define CALL_FN(x) "jsr " #x
+ #endif
+ 
+ /* Return nonzero iff ELF header is compatible with the running host.  */
+ 
+ static inline int
+ elf_machine_matches_host (const Elf32_Ehdr *ehdr)
+ {
+   return ehdr->e_machine == EM_CRIS;
+ }
+ 
+ /* Return the link-time address of _DYNAMIC.  Conveniently, this is the
+    first element of the GOT.  This must be inlined in a function which
+    uses global data.  */
+ 
+ static inline Elf32_Addr
+ elf_machine_dynamic (void)
+ {
+   /* Don't just set this to an asm variable "r0" since that's not logical
+      (like, the variable is uninitialized and the register is fixed) and
+      may make GCC trip over itself doing register allocation.  Yes, I'm
+      paranoid.  Why do you ask?  */
+   Elf32_Addr *got;
+ 
+   __asm__ ("move.d $r0,%0" : "=rm" (got));
+   return *got;
+ }
+ 
+ /* Return the run-time load address of the shared object.  We do it like
+    m68k and i386, by taking an arbitrary local symbol, forcing a GOT entry
+    for it, and peeking into the GOT table, which is set to the link-time
+    file-relative symbol value (regardless of whether the target is REL or
+    RELA).  We subtract this link-time file-relative value from the "local"
+    value we calculate from GOT position and GOT offset.  FIXME: Perhaps
+    there's some other symbol we could use, that we don't *have* to force a
+    GOT entry for.  */
+ 
+ static inline Elf32_Addr
+ elf_machine_load_address (void)
+ {
+   Elf32_Addr gotaddr_diff;
+   __asm__ ("sub.d [$r0+_dl_start:GOT16],$r0,%0\n\t"
+ 	   "add.d _dl_start:GOTOFF,%0" : "=r" (gotaddr_diff));
+   return gotaddr_diff;
+ }
+ 
+ /* Set up the loaded object described by L so its unrelocated PLT
+    entries will jump to the on-demand fixup code in dl-runtime.c.  */
+ 
+ static inline int
+ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile)
+ {
+   Elf32_Addr *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 push an offset into the .rela.plt section, push
+ 	 _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 (__builtin_expect (profile, 0))
+ 	{
+ 	  got[2] = (Elf32_Addr) &_dl_runtime_profile;
+ 
+ 	  if (_dl_name_match_p (_dl_profile, l))
+ 	    {
+ 	      /* This is the object we are looking for.  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.
+ 
+    We get here with the offset into the relocation table pushed on stack,
+    and the link map in MOF.  */
+ 
+ #define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name) \
+ "; Trampoline for " #fixup_name "
+ 	.globl " #tramp_name "
+ 	.type " #tramp_name ", @function
+ " #tramp_name ":
+ 	push	$r13
+ 	push	$r12
+ 	push	$r11
+ 	push	$r10
+ 	push	$r9
+ 	push	$srp
+ 	move.d	[$sp+6*4],$r11
+ 	move	$mof,$r10
+ 	" CALL_FN (fixup_name) "
+ 	move.d	$r10,[$sp+6*4]
+ 	pop	$srp
+ 	pop	$r9
+ 	pop	$r10
+ 	pop	$r11
+ 	pop	$r12
+ 	pop	$r13
+ 	jump	[$sp+]
+ 	.size " #tramp_name ", . - " #tramp_name "\n"
+ #ifndef PROF
+ #define ELF_MACHINE_RUNTIME_TRAMPOLINE \
+ asm (TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup) \
+      TRAMPOLINE_TEMPLATE (_dl_runtime_profile, profile_fixup));
+ #else
+ #define ELF_MACHINE_RUNTIME_TRAMPOLINE \
+ asm (TRAMPOLINE_TEMPLATE (_dl_runtime_resolve, fixup) \
+      ".globl _dl_runtime_profile\n" \
+      ".set _dl_runtime_profile, _dl_runtime_resolve");
+ #endif
+ 
+ 
+ /* Mask identifying addresses reserved for the user program,
+    where the dynamic linker should not map anything.  */
+ #define ELF_MACHINE_USER_ADDRESS_MASK	0xf8000000UL
+ 
+ /* 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
+ 	.globl	_start
+ 	.type	_start,@function
+ _start:
+ 	move.d	$sp,$r10
+ 	" CALL_FN (_dl_start) "
+ 	/* FALLTHRU */
+ 
+ 	.globl _dl_start_user
+ 	.type _dl_start_user,@function
+ _dl_start_user:
+ 	; Save the user entry point address in R1.
+ 	move.d	$r10,$r1
+ 	; Point R0 at the GOT.
+ 	move.d	$pc,$r0
+ 	sub.d	.:GOTOFF,$r0
+ 	; Remember the highest stack address.
+ 	move.d	[$r0+__libc_stack_end:GOT16],$r13
+ 	move.d	$sp,[$r13]
+ 	; See if we were run as a command with the executable file
+ 	; name as an extra leading argument.
+ 	move.d	[$r0+_dl_skip_args:GOT16],$r13
+ 	move.d	[$r13],$r9
+ 	; Get the original argument count
+ 	move.d	[$sp],$r11
+ 	; Subtract _dl_skip_args from it.
+ 	sub.d	$r9,$r11
+ 	; Adjust the stack pointer to skip _dl_skip_args words.
+ 	addi	$r9.d,$sp
+ 	; Put the new argc in place as expected by the user entry.
+ 	move.d	$r11,[$sp]
+ 	; Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)
+ 	;  env: skip scaled argc and skip stored argc and NULL at end of argv[].
+ 	move.d	$sp,$r13
+ 	addi	$r11.d,$r13
+ 	addq	8,$r13
+ 	;  argv: skip stored argc.
+ 	move.d	$sp,$r12
+ 	addq	4,$r12
+ 	;  main_map: at _dl_loaded.
+ 	move.d	[$r0+_dl_loaded:GOT16],$r9
+ 	move.d	[$r9],$r10
+ 	move.d	_dl_init:PLTG,$r9
+ 	add.d	$r0,$r9
+ 	jsr	$r9
+ 	; Pass our finalizer function to the user in R10.
+ 	move.d [$r0+_dl_fini:GOT16],$r10
+ 	; Terminate the frame-pointer.
+ 	moveq	0,$r8
+ 	; Cause SEGV if user entry returns.
+ 	move	$r8,$srp
+ 	; Jump to the user's entry point.
+ 	jump	$r1
+ 	.size _dl_start_user, . - _dl_start_user
+ 	.previous");
+ 
+ /* Nonzero iff TYPE describes a relocation that should
+    skip the executable when looking up the symbol value.  */
+ #define elf_machine_lookup_noexec_p(type) ((type) == R_CRIS_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_CRIS_JUMP_SLOT)
+ 
+ /* A reloc type used for ld.so cmdline arg lookups to reject PLT entries.  */
+ #define ELF_MACHINE_JMP_SLOT	R_CRIS_JUMP_SLOT
+ 
+ /* CRIS never uses Elf32_Rel relocations.  */
+ #define ELF_MACHINE_NO_REL 1
+ 
+ /* 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
+ 
+ /* 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)
+ {
+ #ifndef RTLD_BOOTSTRAP
+   /* This is defined in rtld.c, but nowhere in the static libc.a; make the
+      reference weak so static programs can still link.  This declaration
+      cannot be done when compiling rtld.c (i.e.  #ifdef RTLD_BOOTSTRAP)
+      because rtld.c contains the common defn for _dl_rtld_map, which is
+      incompatible with a weak decl in the same file.  */
+   weak_extern (_dl_rtld_map);
+ #endif
+ 
+   if (ELF32_R_TYPE (reloc->r_info) == R_CRIS_RELATIVE)
+     {
+ #ifndef RTLD_BOOTSTRAP
+       if (map != &_dl_rtld_map) /* Already done in rtld itself. */
+ #endif
+ 	*reloc_addr = map->l_addr + reloc->r_addend;
+     }
+   else
+     {
+ #ifndef RTLD_BOOTSTRAP
+       const Elf32_Sym *const refsym = sym;
+ #endif
+       Elf32_Addr value;
+       if (sym->st_shndx != SHN_UNDEF &&
+ 	  ELF32_ST_BIND (sym->st_info) == STB_LOCAL)
+ 	value = map->l_addr;
+       else
+ 	{
+ 	  value = RESOLVE (&sym, version, ELF32_R_TYPE (reloc->r_info));
+ 	  if (sym)
+ 	    value += sym->st_value;
+ 	}
+       value += reloc->r_addend;	/* Assume copy relocs have zero addend.  */
+ 
+       switch (ELF32_R_TYPE (reloc->r_info))
+ 	{
+ #ifndef RTLD_BOOTSTRAP
+ 	case R_CRIS_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
+ 	      || (_dl_verbose && sym->st_size < refsym->st_size))
+ 	    {
+ 	      extern char **_dl_argv;
+ 	      const char *strtab;
+ 
+ 	      strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
+ 	      _dl_error_printf ("\
+ %s: Symbol `%s' has different size in shared object, consider re-linking\n",
+ 				_dl_argv[0] ?: "<program name unknown>",
+ 				strtab + refsym->st_name);
+ 	    }
+ 	  memcpy (reloc_addr, (void *) value, MIN (sym->st_size,
+ 						   refsym->st_size));
+ 	  break;
+ 
+ 	case R_CRIS_32:
+ #endif
+ 	case R_CRIS_GLOB_DAT:
+ 	case R_CRIS_JUMP_SLOT:
+ 	  *reloc_addr = value;
+ 	  break;
+ #ifndef RTLD_BOOTSTRAP
+ 	case R_CRIS_8:
+ 	  *(char *) reloc_addr = value;
+ 	  break;
+ 	case R_CRIS_16:
+ 	  *(short *) reloc_addr = value;
+ 	  break;
+ 	case R_CRIS_8_PCREL:
+ 	  *(char *) reloc_addr
+ 	    = value + reloc->r_addend - (Elf32_Addr) reloc_addr - 1;
+ 	  break;
+ 	case R_CRIS_16_PCREL:
+ 	  *(short *) reloc_addr
+ 	    = value + reloc->r_addend - (Elf32_Addr) reloc_addr - 2;
+ 	  break;
+ 	case R_CRIS_32_PCREL:
+ 	  *reloc_addr = value + reloc->r_addend - (Elf32_Addr) reloc_addr - 4;
+ 	  break;
+ #endif
+ 	case R_CRIS_NONE:
+ 	  break;
+ #if !defined RTLD_BOOTSTRAP || defined _NDEBUG
+ 	default:
+ 	  _dl_reloc_bad_type (map, ELFW(R_TYPE) (reloc->r_info), 0);
+ 	  break;
+ #endif
+ 	}
+     }
+ }
+ 
+ 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);
+   if (__builtin_expect (ELF32_R_TYPE (reloc->r_info), R_CRIS_JUMP_SLOT)
+       == R_CRIS_JUMP_SLOT)
+     *reloc_addr += l_addr;
+   else
+     _dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
+ }
+ 
+ #endif /* RESOLVE */
diff -cpNr sysdeps/cris.empty/elf/start.S sysdeps/cris/elf/start.S
*** sysdeps/cris.empty/elf/start.S	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/elf/start.S	Wed Mar  7 04:21:50 2001
***************
*** 0 ****
--- 1,123 ----
+ /* Startup code compliant to the ELF CRIS ABI (to-be-written).
+    Copyright (C) 2001 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>
+ 
+ /* This is the canonical entry point, usually the first thing in the text
+    segment.  When the entry point runs, most registers' values are
+    unspecified, except for:
+ 
+    R10		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:
+ 		[SP]			argc
+ 		[SP+4]			argv[0]
+ 		...
+ 		[SP+4*argc]		NULL
+ 		[SP+4*(argc+1)]		envp[0]
+ 		...
+ 					NULL
+ */
+ 
+ 	.syntax no_register_prefix
+ 
+ 	.text
+ 	.globl	_start
+ _start:
+ 	/* Clear the frame pointer, to mark the outermost frame.  */
+ 	moveq	0,r8
+ 
+ 	/* Move the shared library termination function to the right place
+ 	   for __libc_main.  */
+ 	move.d	r10,r9
+ 
+ 	/* Extract the arguments as encoded on the stack and set up the
+ 	   arguments for `main': argc, argv.  envp will be determined
+ 	   later in __libc_start_main.  */
+ 
+ 	/* Get the argument count.  */
+ 	move.d	[sp],r11
+ 
+ 	/* Store the stack pointer as end of stack.  We overwrite
+ 	   the incoming argc.  */
+ 	move.d	sp,[sp]
+ 
+ 	/* The argument vector starts just after the argument count.  */
+ 	move.d	sp,r12
+ 	addq	4,r12
+ 
+ 	/* There are seven arguments to __libc_start_main:
+ 	   r10:  main - Address of it.
+ 	   r11:  argc
+ 	   r12:  argv
+ 	   r13:  init - Function to call.
+ 
+ 	   [sp]: fini - Function to register with atexit.
+            [sp+4]: rtld_fini - Another function to register with atexit.
+ 	   [sp+8]: stack_end - Top of stack (actually same as argv).
+ 
+ 	   The last two are passed on stack.  */
+ 
+         /* Store the fini function coming from the dynamic loader.  */
+ 	push	r9
+ 
+ 	/* Get the addresses of our own entry points to `.fini' and
+ 	   `.init'.  */
+ 
+ #ifdef __PIC__
+         /* If for some reason this program is compiled as PIC, set up R0.  */
+ 	move.d	pc,r0
+ 	sub.d	.:GOTOFF,r0
+ 
+ 	move.d	_init:PLTG,r13
+ 	add.d	r0,r13
+ 	move.d	_fini:PLTG,r9
+ 	add.d	r0,r9
+ 	move.d	main:PLTG,r10
+ 	add.d	r0,r10
+ #else
+ 	move.d	_init,r13
+ 	move.d	_fini,r9
+ 	move.d	main,r10
+ #endif
+ 	push	r9
+ 
+ 	/* Call the user's main function, and exit with its value.  But
+ 	   let the libc call main.  */
+ 	PLTCALL	(__libc_start_main)
+ 
+ 	/* Crash if somehow `exit' does return.  We have at least 8192
+ 	   invalid addresses to choose from.  */
+ 	test.d	[6502]
+ 
+ 	/* Stop the unstoppable.  */
+ 0:
+ 	ba	0b
+ 	nop
+ 
+ /* 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 -cpNr sysdeps/cris.empty/machine-gmon.h sysdeps/cris/machine-gmon.h
*** sysdeps/cris.empty/machine-gmon.h	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/machine-gmon.h	Sat Mar 17 22:59:49 2001
***************
*** 0 ****
--- 1,28 ----
+ /* PowerPC-specific implementation of profiling support.
+    Copyright (C) 1997, 2001 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.  */
+ 
+ void __mcount_internal (unsigned long frompc, unsigned long selfpc);
+ 
+ #define _MCOUNT_DECL(frompc, selfpc) \
+ void __mcount_internal (unsigned long frompc, unsigned long selfpc)
+ 
+ 
+ /* Define MCOUNT as empty since we have the implementation in another
+    file.  FIXME: Just stubs, currently.  */
+ #define MCOUNT
diff -cpNr sysdeps/cris.empty/memcopy.h sysdeps/cris/memcopy.h
*** sysdeps/cris.empty/memcopy.h	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/memcopy.h	Wed Mar 28 11:24:26 2001
***************
*** 0 ****
--- 1,57 ----
+ /* Copyright (C) 2001 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/memcopy.h>
+ 
+ /* We override the word-copying macros, partly because misalignment in one
+    pointer isn't cause for a special function, partly because we want to
+    get rid of wordcopy.c; these macros are only used in memmove.c (and
+    it's sibling bcopy) since we have arch-specific mempcpy, memcpy and
+    memset.  */
+ 
+ #undef OP_T_THRES
+ #define OP_T_THRES OPSIZ
+ 
+ #define WORD_COPY_FWD(dst_bp, src_bp, nbytes_left, nbytes)		\
+   do									\
+     {									\
+       unsigned long enddst_bp = dst_bp + nbytes - (nbytes % OPSIZ);	\
+       nbytes_left = (nbytes % OPSIZ);					\
+       while (dst_bp < (unsigned long) enddst_bp)			\
+ 	{								\
+ 	  op_t x = *(op_t *) src_bp;					\
+ 	  src_bp += sizeof x;						\
+ 	  *(op_t *) dst_bp = x;						\
+ 	  dst_bp += sizeof x;						\
+ 	}								\
+     } while (0)
+ 
+ #define WORD_COPY_BWD(dst_bp, src_bp, nbytes_left, nbytes)		\
+   do									\
+     {									\
+       unsigned long enddst_bp = dst_bp - nbytes + (nbytes % OPSIZ);	\
+       nbytes_left = (nbytes % OPSIZ);					\
+       while (dst_bp > enddst_bp)					\
+ 	{								\
+ 	  op_t x;							\
+ 	  src_bp -= sizeof x;						\
+ 	  x = *(op_t *) src_bp;						\
+ 	  dst_bp -= sizeof x;						\
+ 	  *(op_t *) dst_bp = x;						\
+ 	}								\
+     } while (0)
diff -cpNr sysdeps/cris.empty/memcpy.c sysdeps/cris/memcpy.c
*** sysdeps/cris.empty/memcpy.c	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/memcpy.c	Tue Mar 27 22:33:42 2001
***************
*** 0 ****
--- 1,248 ----
+ /* Copyright (C) 1994, 1995, 2000, 2001 Axis Communications AB.
+    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.  */
+ 
+ /*#************************************************************************#*/
+ /*#-------------------------------------------------------------------------*/
+ /*#                                                                         */
+ /*# FUNCTION NAME: memcpy()                                                 */
+ /*#                                                                         */
+ /*# PARAMETERS:  void* dst;   Destination address.                          */
+ /*#              void* src;   Source address.                               */
+ /*#              int   len;   Number of bytes to copy.                      */
+ /*#                                                                         */
+ /*# RETURNS:     dst.                                                       */
+ /*#                                                                         */
+ /*# DESCRIPTION: Copies len bytes of memory from src to dst.  No guarantees */
+ /*#              about copying of overlapping memory areas. This routine is */
+ /*#              very sensitive to compiler changes in register allocation. */
+ /*#              Should really be rewritten to avoid this problem.          */
+ /*#                                                                         */
+ /*#-------------------------------------------------------------------------*/
+ /*#                                                                         */
+ /*# HISTORY                                                                 */
+ /*#                                                                         */
+ /*# DATE      NAME            CHANGES                                       */
+ /*# ----      ----            -------                                       */
+ /*# 941007    Kenny R         Creation                                      */
+ /*# 941011    Kenny R         Lots of optimizations and inlining.           */
+ /*# 941129    Ulf A           Adapted for use in libc.                      */
+ /*# 950216    HP              N==0 forgotten if non-aligned src/dst.        */
+ /*#                           Added some optimizations.                     */
+ /*# 001025    HP              Make src and dst char *.  Align dst to	    */
+ /*#			      dword, not just word-if-both-src-and-dst-	    */
+ /*#			      are-misaligned.				    */
+ /*#                                                                         */
+ /*#-------------------------------------------------------------------------*/
+ 
+ void *memcpy(void *, const void *, unsigned int);
+ 
+ void *memcpy(void *pdst,
+              const void *psrc,
+              unsigned int pn)
+ {
+   /* Ok.  Now we want the parameters put in special registers.
+      Make sure the compiler is able to make something useful of this.
+       As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
+ 
+      If gcc was allright, it really would need no temporaries, and no
+      stack space to save stuff on. */
+ 
+ #ifndef MEMPCPY
+   register void *return_dst __asm__ ("r10") = pdst;
+ #else
+   /* FIXME: Use R10 for something.  */
+ # define return_dst dst
+ #endif
+ 
+   register char *dst __asm__ ("r13") = pdst;
+   register char *src __asm__ ("r11") = (char *) psrc;
+   register int n __asm__ ("r12") = pn;
+   
+  
+   /* When src is aligned but not dst, this makes a few extra needless
+      cycles.  I believe it would take as many to check that the
+      re-alignment was unnecessary.  */
+   if (((unsigned long) dst & 3) != 0
+       /* Don't align if we wouldn't copy more than a few bytes; so we
+ 	 don't have to check further for overflows.  */
+       && n >= 3)
+   {
+     if ((unsigned long) dst & 1)
+     {
+       n--;
+       *(char*)dst = *(char*)src;
+       src++;
+       dst++;
+     }
+ 
+     if ((unsigned long) dst & 2)
+     {
+       n -= 2;
+       *(short*)dst = *(short*)src;
+       src += 2;
+       dst += 2;
+     }
+   }
+ 
+   /* Decide which copying method to use. */
+   /* Break even between movem and move16 is at 38.7*2, but modulo 44. */
+   if (n >= 44*2)
+   {
+     /* For large copies we use 'movem' */
+ 
+   /* It is not optimal to tell the compiler about clobbering any
+      registers; that will move the saving/restoring of those registers
+      to the function prologue/epilogue, and make non-movem sizes
+      suboptimal.
+ 
+       This method is not foolproof; it assumes that the "register asm"
+      declarations at the beginning of the function really are used
+      here (beware: they may be moved to temporary registers).
+       This way, we do not have to save/move the registers around into
+      temporaries; we can safely use them straight away.  */
+     __asm__ volatile ("
+ 	.syntax no_register_prefix
+ 
+         ;; Check that the register asm declaration got right.
+         ;; The GCC manual explicitly says there's no warranty for that (too).
+ 	.ifnc %0-%1-%2,$r13-$r11-$r12
+ 	.err
+ 	.endif
+ 
+ 	;; Save the registers we'll use in the movem process
+ 	;; on the stack.
+ 	subq 	11*4,sp
+ 	movem	r10,[sp]
+ 
+         ;; Now we've got this:
+ 	;; r11 - src
+ 	;; r13 - dst
+ 	;; r12 - n
+ 	
+         ;; Update n for the first loop
+         subq    44,r12
+ 0:
+ 	movem	[r11+],r10
+         subq   44,r12
+         bge     0b
+ 	movem	r10,[r13+]
+ 
+         addq   44,r12  ;; compensate for last loop underflowing n
+ 
+ 	;; Restore registers from stack
+         movem [sp+],r10" 
+ 
+      /* Outputs */ : "=r" (dst), "=r" (src), "=r" (n) 
+      /* Inputs */ : "0" (dst), "1" (src), "2" (n));
+   }
+ 
+   /* Either we directly starts copying, using dword copying
+      in a loop, or we copy as much as possible with 'movem' 
+      and then the last block (<44 bytes) is copied here.
+      This will work since 'movem' will have updated src,dst,n. */
+ 
+   while ( n >= 16 )
+   {
+     *((long*)dst)++ = *((long*)src)++;
+     *((long*)dst)++ = *((long*)src)++;
+     *((long*)dst)++ = *((long*)src)++;
+     *((long*)dst)++ = *((long*)src)++;
+     n -= 16;
+   }
+ 
+   /* A switch() is definitely the fastest although it takes a LOT of code.
+    * Particularly if you inline code this.
+    */
+   switch (n)
+   {
+     case 0:
+       break;
+     case 1:
+       *((char*)dst)++ = *((char*)src)++;
+       break;
+     case 2:
+       *((short*)dst)++ = *((short*)src)++;
+       break;
+     case 3:
+       *((short*)dst)++ = *((short*)src)++;
+       *((char*)dst)++ = *((char*)src)++;
+       break;
+     case 4:
+       *((long*)dst)++ = *((long*)src)++;
+       break;
+     case 5:
+       *((long*)dst)++ = *((long*)src)++;
+       *((char*)dst)++ = *((char*)src)++;
+       break;
+     case 6:
+       *((long*)dst)++ = *((long*)src)++;
+       *((short*)dst)++ = *((short*)src)++;
+       break;
+     case 7:
+       *((long*)dst)++ = *((long*)src)++;
+       *((short*)dst)++ = *((short*)src)++;
+       *((char*)dst)++ = *((char*)src)++;
+       break;
+     case 8:
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       break;
+     case 9:
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       *((char*)dst)++ = *((char*)src)++;
+       break;
+     case 10:
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       *((short*)dst)++ = *((short*)src)++;
+       break;
+     case 11:
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       *((short*)dst)++ = *((short*)src)++;
+       *((char*)dst)++ = *((char*)src)++;
+       break;
+     case 12:
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       break;
+     case 13:
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       *((char*)dst)++ = *((char*)src)++;
+       break;
+     case 14:
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       *((short*)dst)++ = *((short*)src)++;
+       break;
+     case 15:
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       *((long*)dst)++ = *((long*)src)++;
+       *((short*)dst)++ = *((short*)src)++;
+       *((char*)dst)++ = *((char*)src)++;
+       break;
+   }
+ 
+   return return_dst; /* destination pointer. */
+ } /* memcpy() */
diff -cpNr sysdeps/cris.empty/mempcpy.c sysdeps/cris/mempcpy.c
*** sysdeps/cris.empty/mempcpy.c	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/mempcpy.c	Sun Mar 25 19:50:42 2001
***************
*** 0 ****
--- 1,4 ----
+ #define MEMPCPY
+ #define memcpy __mempcpy
+ #include "memcpy.c"
+ weak_alias (__mempcpy, mempcpy)
diff -cpNr sysdeps/cris.empty/memset.c sysdeps/cris/memset.c
*** sysdeps/cris.empty/memset.c	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/memset.c	Tue Mar 27 22:33:25 2001
***************
*** 0 ****
--- 1,267 ----
+ /* Copyright (C) 1999, 2000, 2001 Axis Communications AB.
+    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.  */
+ 
+ /*#************************************************************************#*/
+ /*#-------------------------------------------------------------------------*/
+ /*#                                                                         */
+ /*# FUNCTION NAME: memset()                                                 */
+ /*#                                                                         */
+ /*# PARAMETERS:  void* dst;   Destination address.                          */
+ /*#              int     c;   Value of byte to write.                       */
+ /*#              int   len;   Number of bytes to write.                     */
+ /*#                                                                         */
+ /*# RETURNS:     dst.                                                       */
+ /*#                                                                         */
+ /*# DESCRIPTION: Sets the memory dst of length len bytes to c, as standard. */
+ /*#              Framework taken from memcpy.  This routine is              */
+ /*#              very sensitive to compiler changes in register allocation. */
+ /*#              Should really be rewritten to avoid this problem.          */
+ /*#                                                                         */
+ /*#-------------------------------------------------------------------------*/
+ /*#                                                                         */
+ /*# HISTORY                                                                 */
+ /*#                                                                         */
+ /*# DATE      NAME            CHANGES                                       */
+ /*# ----      ----            -------                                       */
+ /*# 990713    HP              Tired of watching this function (or           */
+ /*#                           really, the nonoptimized generic              */
+ /*#                           implementation) take up 90% of simulator      */
+ /*#                           output.  Measurements needed.                 */
+ /*#                                                                         */
+ /*#-------------------------------------------------------------------------*/
+ 
+ /* No, there's no macro saying 12*4, since it is "hard" to get it into
+    the asm in a good way.  Thus better to expose the problem everywhere.
+    */
+ 
+ /* Assuming 1 cycle per dword written or read (ok, not really true), and
+    one per instruction, then 43+3*(n/48-1) <= 24+24*(n/48-1)
+    so n >= 45.7; n >= 0.9; we win on the first full 48-byte block to set. */
+ 
+ #define ZERO_BLOCK_SIZE (1*12*4)
+ 
+ void *memset(void *, int, unsigned long);
+ 
+ void *memset(void *pdst,
+              int c,
+              unsigned long plen)
+ {
+   /* Ok.  Now we want the parameters put in special registers.
+      Make sure the compiler is able to make something useful of this. */
+ 
+   register char *return_dst __asm__ ("r10") = pdst;
+   register long n __asm__ ("r12") = plen;
+   register int lc __asm__ ("r11") = c;
+ 
+   /* Most apps use memset sanely.  Only those memsetting about 3..4
+      bytes or less get penalized compared to the generic implementation
+      - and that's not really sane use. */
+ 
+   /* Ugh.  This is fragile at best.  Check with newer GCC releases, if
+      they compile cascaded "x |= x << 8" sanely! */
+   __asm__("movu.b %0,$r13 \n\
+ 	   lslq 8,$r13    \n\
+ 	   move.b %0,$r13 \n\
+ 	   move.d $r13,%0 \n\
+ 	   lslq 16,$r13   \n\
+ 	   or.d $r13,%0"
+           : "=r" (lc) : "0" (lc) : "r13");
+ 
+   {
+     register char *dst __asm__ ("r13") = pdst;
+  
+   if (((unsigned long) pdst & 3) != 0
+      /* Oops! n=0 must be a legal call, regardless of alignment. */
+       && n >= 3)
+   {
+     if ((unsigned long)dst & 1)
+     {
+       *dst = (char) lc;
+       n--;
+       dst++;
+     }
+ 
+     if ((unsigned long)dst & 2)
+     {
+       *(short *)dst = lc;
+       n -= 2;
+       dst += 2;
+     }
+   }
+ 
+   /* Now the fun part.  For the threshold value of this, check the equation
+      above. */
+   /* Decide which copying method to use. */
+   if (n >= ZERO_BLOCK_SIZE)
+   {
+     /* For large copies we use 'movem' */
+ 
+   /* It is not optimal to tell the compiler about clobbering any
+      registers; that will move the saving/restoring of those registers
+      to the function prologue/epilogue, and make non-movem sizes
+      suboptimal.
+ 
+       This method is not foolproof; it assumes that the "asm reg"
+      declarations at the beginning of the function really are used
+      here (beware: they may be moved to temporary registers).
+       This way, we do not have to save/move the registers around into
+      temporaries; we can safely use them straight away.  */
+     __asm__ volatile ("
+ 	.syntax no_register_prefix
+ 
+         ;; Check that the register asm declaration got right.
+         ;; The GCC manual explicitly says there's no warranty for that (too).
+ 	.ifnc %0-%1-%4,$r13-$r12-$r11
+ 	.err
+ 	.endif
+ 
+ 	;; Save the registers we'll clobber in the movem process
+ 	;; on the stack.  Don't mention them to gcc, it will only be
+ 	;; upset.
+ 	subq 	11*4,sp
+         movem   r10,[sp]
+ 
+         move.d  r11,r0
+         move.d  r11,r1
+         move.d  r11,r2
+         move.d  r11,r3
+         move.d  r11,r4
+         move.d  r11,r5
+         move.d  r11,r6
+         move.d  r11,r7
+         move.d  r11,r8
+         move.d  r11,r9
+         move.d  r11,r10
+ 
+         ;; Now we've got this:
+ 	;; r13 - dst
+ 	;; r12 - n
+ 	
+         ;; Update n for the first loop
+         subq    12*4,r12
+ 0:
+         subq   12*4,r12
+         bge     0b
+ 	movem	r11,[r13+]
+ 
+         addq   12*4,r12  ;; compensate for last loop underflowing n
+ 
+ 	;; Restore registers from stack
+         movem [sp+],r10" 
+ 
+      /* Outputs */ : "=r" (dst), "=r" (n)
+      /* Inputs */ : "0" (dst), "1" (n), "r" (lc));
+     
+   }
+ 
+     /* Either we directly starts copying, using dword copying
+        in a loop, or we copy as much as possible with 'movem' 
+        and then the last block (<44 bytes) is copied here.
+        This will work since 'movem' will have updated src,dst,n. */
+ 
+     while ( n >= 16 )
+     {
+       *((long*)dst)++ = lc;
+       *((long*)dst)++ = lc;
+       *((long*)dst)++ = lc;
+       *((long*)dst)++ = lc;
+       n -= 16;
+     }
+ 
+     /* A switch() is definitely the fastest although it takes a LOT of code.
+      * Particularly if you inline code this.
+      */
+     switch (n)
+     {
+       case 0:
+         break;
+       case 1:
+         *(char*)dst = (char) lc;
+         break;
+       case 2:
+         *(short*)dst = (short) lc;
+         break;
+       case 3:
+         *((short*)dst)++ = (short) lc;
+         *(char*)dst = (char) lc;
+         break;
+       case 4:
+         *((long*)dst)++ = lc;
+         break;
+       case 5:
+         *((long*)dst)++ = lc;
+         *(char*)dst = (char) lc;
+         break;
+       case 6:
+         *((long*)dst)++ = lc;
+         *(short*)dst = (short) lc;
+         break;
+       case 7:
+         *((long*)dst)++ = lc;
+         *((short*)dst)++ = (short) lc;
+         *(char*)dst = (char) lc;
+         break;
+       case 8:
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         break;
+       case 9:
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         *(char*)dst = (char) lc;
+         break;
+       case 10:
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         *(short*)dst = (short) lc;
+         break;
+       case 11:
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         *((short*)dst)++ = (short) lc;
+         *(char*)dst = (char) lc;
+         break;
+       case 12:
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         break;
+       case 13:
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         *(char*)dst = (char) lc;
+         break;
+       case 14:
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         *(short*)dst = (short) lc;
+         break;
+       case 15:
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         *((long*)dst)++ = lc;
+         *((short*)dst)++ = (short) lc;
+         *(char*)dst = (char) lc;
+         break;
+     }
+   }
+ 
+   return return_dst; /* destination pointer. */
+ } /* memset() */
diff -cpNr sysdeps/cris.empty/memusage.h sysdeps/cris/memusage.h
*** sysdeps/cris.empty/memusage.h	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/memusage.h	Thu Mar  1 01:53:02 2001
***************
*** 0 ****
--- 1,27 ----
+ /* Copyright (C) 2001 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.  */
+ 
+ /* No asm variables, just for reasons of solid healthy paranoia. */
+ #define GETSP()						\
+  ({							\
+    uintptr_t stack_ptr;					\
+    __asm__ ("move.d $sp,%0" : "=rm" (stack_ptr));	\
+    stack_ptr;						\
+  })
+ 
+ #include <sysdeps/generic/memusage.h>
diff -cpNr sysdeps/cris.empty/setjmp.S sysdeps/cris/setjmp.S
*** sysdeps/cris.empty/setjmp.S	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/setjmp.S	Sun Feb 25 04:00:17 2001
***************
*** 0 ****
--- 1,66 ----
+ /* setjmp for CRIS.
+    Copyright (C) 2001 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>
+ 
+ 	.syntax no_register_prefix
+ 
+ ENTRY (__sigsetjmp)
+ .Local__sigsetjmp:	
+ 	moveq 1,r9
+ 	movem sp,[r10+1*4]
+ #ifdef __PIC__
+ 	move.d pc,r9
+ 	addq 0f-.,r9
+ #else
+ 	move.d 0f,r9
+ #endif
+ 	move.d r9,[r10]
+ 	move srp,[r10+16*4]
+ 	move ccr,[r10+17*4]
+ 	PLTJUMP (__sigjmp_save)
+ 0: /* This is where longjmp returns.  (Don't use "ret" - it's a macro.  */
+ 	Ret
+ 	move.d r9,r10
+ END (__sigsetjmp)
+ 
+ /* Binary compatibility entry points.  Having these in separate files
+    is not meaningful and just adds library overhead.  */
+ 
+ ENTRY (__setjmp)
+ 	ba .Local__sigsetjmp
+ 	moveq 0,r11
+ END (__setjmp)
+ 
+ ENTRY (_setjmp)
+ 	ba .Local__sigsetjmp
+ 	moveq 0,r11
+ END (_setjmp)
+ 
+ ENTRY (setjmp)
+ 	ba .Local__sigsetjmp
+ 	moveq 1,r11
+ END (setjmp)
+ 
+ weak_extern (__setjmp)
+ weak_extern (_setjmp)
+ weak_extern (setjmp)
diff -cpNr sysdeps/cris.empty/sysdep.h sysdeps/cris/sysdep.h
*** sysdeps/cris.empty/sysdep.h	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/sysdep.h	Sat Mar 17 22:57:22 2001
***************
*** 0 ****
--- 1,114 ----
+ /* Assembler macros for CRIS.
+    Copyright (C) 1999, 2000, 2001 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>
+ 
+ #ifndef HAVE_ELF
+ #error ELF is assumed.  Generalize the code and retry.
+ #endif
+ 
+ #ifndef NO_UNDERSCORES
+ #error User-label prefix (underscore) assumed absent.  Generalize the code and retry.
+ #endif
+ 
+ #ifdef	__ASSEMBLER__
+ 
+ /* Syntactic details of assembly-code.  */
+ 
+ /* It is *not* generally true that "ELF uses byte-counts for .align, most
+    others use log2 of count of bytes", like some neighboring configs say.
+    See "align" in gas/read.c which is not overridden by
+    gas/config/obj-elf.c.  It takes a log2 argument.  *Some* targets
+    override it to take a byte argument.  People should read source instead
+    of relying on hearsay.  */
+ #define ALIGNARG(log2) log2
+ 
+ #define ASM_TYPE_DIRECTIVE(name,typearg) .type name,typearg
+ #define ASM_SIZE_DIRECTIVE(name) .size name,.-name
+ 
+ /* The non-PIC jump is preferred, since it does not stall, and does not
+    invoke generation of a PLT.  These macros assume that $r0 is set up as
+    GOT register.  */
+ #ifdef __PIC__
+ #define PLTJUMP(_x) \
+   add.d	C_SYMBOL_NAME (_x):PLT,$pc
+ 
+ #define PLTCALL(_x) \
+   move.d C_SYMBOL_NAME (_x):PLTG,$r9			@ \
+   add.d	$r0,$r9						@ \
+   jsr	$r9
+ 
+ #define SETUP_PIC \
+   push	$r0						@ \
+   move.d $pc,$r0					@ \
+   sub.d	.:GOTOFF,$r0
+ 
+ #define TEARDOWN_PIC pop $r0
+ #else
+ #define PLTJUMP(_x) jump C_SYMBOL_NAME (_x)
+ #define PLTCALL(_x) jsr  C_SYMBOL_NAME (_x)
+ #define SETUP_PIC
+ #define TEARDOWN_PIC
+ #endif
+ 
+ /* Define an entry point visible from C.  */
+ #define	ENTRY(name) \
+   .text							@ \
+   ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (name) 		@ \
+   ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME (name), function)	@ \
+   .align ALIGNARG (2) 					@ \
+   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.
+    FIXME: Note that profiling is not actually implemented.  This is just
+    example code which might not even compile, though it is believed to be
+    correct.  */
+ #ifdef	PROF
+ #define CALL_MCOUNT \
+   push	$srp						@ \
+   push	$r9						@ \
+   push	$r10						@ \
+   push	$r11						@ \
+   push	$r12						@ \
+   push	$r13						@ \
+   SETUP_PIC						@ \
+   PLTCALL (mcount)					@ \
+   TEARDOWN_PIC						@ \
+   pop	$r13						@ \
+   pop	$r12						@ \
+   pop	$r11						@ \
+   pop	$r10						@ \
+   pop	$r9						@ \
+   pop	$srp
+ #else
+ #define CALL_MCOUNT		/* Do nothing.  */
+ #endif
+ 
+ /* 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	/* __ASSEMBLER__ */
diff -cpNr sysdeps/cris.empty/wordcopy.c sysdeps/cris/wordcopy.c
*** sysdeps/cris.empty/wordcopy.c	Thu Jan  1 01:00:00 1970
--- sysdeps/cris/wordcopy.c	Tue Mar 27 23:04:24 2001
***************
*** 0 ****
--- 1 ----
+ /* Empty; not needed.  */

brgds, H-P


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]