This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

sh64-elf (SH5) port


I'm a bit disappointed that I have missed 1.10.0, but this port
wouldn't have been of much use before contributing binutils, gcc and
the simulator, anyway.  So I'm now pleased to contribute the sh64-elf
port of newlib, for the SH5 processor.  Ok to install?

Index: newlib/ChangeLog
from  Alexandre Oliva  <aoliva@redhat.com>

	Contribute sh64-elf.
	2001-03-13  Alexandre Oliva  <aoliva@redhat.com>
	* configure.host (newlib_cflags) [sh*-*-*]: Enable long long
	support in printf.
	2001-01-29  Alexandre Oliva  <aoliva@redhat.com>
	* libc/machine/sh/setjmp.S [SH5]: Switch to SHmedia mode before
	any labels.
	2001-01-24  Alexandre Oliva  <aoliva@redhat.com>
	* libc/sys/sh/trap.S (___trap34) [SH5]: Don't trash r2.
	2000-12-16  Alexandre Oliva  <aoliva@redhat.com>
	* libc/machine/sh/configure.in: Rework conditionals.
	* libc/machine/sh/Makefile.am: Likewise.
	* libc/machine/sh/configure, libc/machine/sh/Makefile.in: Rebuilt.
	2000-12-01  Alexandre Oliva  <aoliva@redhat.com>
	* configure.host: Match `sh*'.
	* libc/include/machine/setjmp.h: Define for SH5.
	* libc/machine/sh/configure.in: Detect SH5.
	* libc/machine/sh/configure: Rebuilt.
	* libc/machine/sh/Makefile.am: Use only setjmp.S for SH5.
	* libc/machine/sh/Makefile.in: Rebuilt.
	* libc/machine/sh/asm.h: Adjust for SH5.
	* libc/machine/sh/setjmp.S: Implement in SHmedia.
	* libc/sys/sh/crt0.S: Likewise.
	* libc/sys/sh/trap.S: Likewise.

Index: newlib/configure.host
===================================================================
RCS file: /home/aoliva/cygnus/uberbaum/newlib/configure.host,v
retrieving revision 1.17
diff -u -p -r1.17 configure.host
--- newlib/configure.host 1 Feb 2002 18:00:39 -0000 1.17
+++ newlib/configure.host 3 Feb 2002 01:00:23 -0000
@@ -150,7 +150,7 @@ case "${host_cpu}" in
   powerpc*)
 	machine_dir=powerpc
 	;;
-  sh)
+  sh | sh64)
 	machine_dir=sh
 	;;
   sparc*)
@@ -474,7 +474,7 @@ case "${host}" in
 	syscall_dir=syscalls
 	;;
   sh*-*-*)
-	newlib_cflags="${newlib_cflags} -DHAVE_GETTIMEOFDAY"
+	newlib_cflags="${newlib_cflags} -DHAVE_GETTIMEOFDAY -DWANT_PRINTF_LONG_LONG"
 	syscall_dir=syscalls
 	;;
   sparc-sun-sunos*)
Index: newlib/libc/include/machine/setjmp.h
===================================================================
RCS file: /home/aoliva/cygnus/uberbaum/newlib/libc/include/machine/setjmp.h,v
retrieving revision 1.6
diff -u -p -r1.6 setjmp.h
--- newlib/libc/include/machine/setjmp.h 22 Dec 2001 22:47:57 -0000 1.6
+++ newlib/libc/include/machine/setjmp.h 2 Feb 2002 04:00:47 -0000
@@ -93,7 +93,12 @@ typedef int jmp_buf[_JBLEN];
 #endif
 
 #ifdef  __sh__
+#if __SH5__
+#define _JBLEN 50
+#define _JBTYPE long long
+#else
 #define _JBLEN 20
+#endif /* __SH5__ */
 #endif
 
 #ifdef  __v800
Index: newlib/libc/machine/sh/Makefile.am
===================================================================
RCS file: /home/aoliva/cygnus/uberbaum/newlib/libc/machine/sh/Makefile.am,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 Makefile.am
--- newlib/libc/machine/sh/Makefile.am 17 Feb 2000 19:39:47 -0000 1.1.1.1
+++ newlib/libc/machine/sh/Makefile.am 2 Feb 2002 04:00:47 -0000
@@ -6,7 +6,11 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLA
 
 noinst_LIBRARIES = lib.a
 
+if SH64
+lib_a_SOURCES = setjmp.S
+else
 lib_a_SOURCES = memcpy.S memset.S setjmp.S strcpy.S strcmp.S
+endif
 
 memcpy.o: asm.h
 memset.o: asm.h
Index: newlib/libc/machine/sh/asm.h
===================================================================
RCS file: /home/aoliva/cygnus/uberbaum/newlib/libc/machine/sh/asm.h,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 asm.h
--- newlib/libc/machine/sh/asm.h 17 Feb 2000 19:39:47 -0000 1.1.1.1
+++ newlib/libc/machine/sh/asm.h 2 Feb 2002 04:00:47 -0000
@@ -5,8 +5,19 @@
 #endif
 #define _ASM_LABEL(x)   x
 
+#if __SH5__
+# if __SH5__ == 32 && __SHMEDIA__
+#  define TEXT .section .text..SHmedia32, "ax"
+# else
+#  define TEXT .text
+# endif
+
+# define _ENTRY(name)	\
+	TEXT; .align 4; .globl name; name:
+#else
 #define _ENTRY(name)	\
 	.text; .align 2; .globl name; name:
+#endif /* __SH5__ */
 
 #define ENTRY(name)	\
 	_ENTRY(_C_LABEL(name))
Index: newlib/libc/machine/sh/configure.in
===================================================================
RCS file: /home/aoliva/cygnus/uberbaum/newlib/libc/machine/sh/configure.in,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 configure.in
--- newlib/libc/machine/sh/configure.in 17 Feb 2000 19:39:47 -0000 1.1.1.1
+++ newlib/libc/machine/sh/configure.in 2 Feb 2002 04:00:47 -0000
@@ -9,4 +9,11 @@ AC_CONFIG_AUX_DIR(../../../..)
 
 NEWLIB_CONFIGURE(../../..)
 
+AC_EGREP_CPP([sh5], [
+#if __SH5__
+  sh5
+#endif
+], [have_sh64=yes], [have_sh64=no])
+AM_CONDITIONAL(SH64, [test $have_sh64 = yes])
+
 AC_OUTPUT(Makefile)
Index: newlib/libc/machine/sh/setjmp.S
===================================================================
RCS file: /home/aoliva/cygnus/uberbaum/newlib/libc/machine/sh/setjmp.S,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 setjmp.S
--- newlib/libc/machine/sh/setjmp.S 17 Feb 2000 19:39:47 -0000 1.1.1.1
+++ newlib/libc/machine/sh/setjmp.S 2 Feb 2002 04:00:47 -0000
@@ -1,6 +1,77 @@
+/* We want to pretend we're in SHmedia mode, even when assembling for
+   SHcompact.  */
+#if __SH5__ == 32 && ! __SHMEDIA__
+# undef __SHMEDIA__
+# define __SHMEDIA__ 1
+#endif
+
+#if __SHMEDIA__
+	.mode	SHmedia
+#endif
+
 #include "asm.h"
 
 ENTRY(setjmp)
+#if __SH5__
+	ptabs	r18, tr0
+	gettr	tr5, r5
+	gettr	tr6, r6
+	gettr	tr7, r7
+	st.q	r2,  0*8, r18
+	st.q	r2,  1*8, r10
+	st.q	r2,  2*8, r11
+	st.q	r2,  3*8, r12
+	st.q	r2,  4*8, r13
+	st.q	r2,  5*8, r14
+	st.q	r2,  6*8, r15
+	st.q	r2,  7*8, r28
+	st.q	r2,  8*8, r29
+	st.q	r2,  9*8, r30
+	st.q	r2, 10*8, r31
+	st.q	r2, 11*8, r32
+	st.q	r2, 12*8, r33
+	st.q	r2, 13*8, r34
+	st.q	r2, 14*8, r35
+	st.q	r2, 15*8, r44
+	st.q	r2, 16*8, r45
+	st.q	r2, 17*8, r46
+	st.q	r2, 18*8, r47
+	st.q	r2, 19*8, r48
+	st.q	r2, 20*8, r49
+	st.q	r2, 21*8, r50
+	st.q	r2, 22*8, r51
+	st.q	r2, 23*8, r52
+	st.q	r2, 24*8, r53
+	st.q	r2, 25*8, r54
+	st.q	r2, 26*8, r55
+	st.q	r2, 27*8, r56
+	st.q	r2, 28*8, r57
+	st.q	r2, 29*8, r58
+	st.q	r2, 30*8, r59
+	st.q	r2, 31*8, r5
+	st.q	r2, 32*8, r6
+	st.q	r2, 33*8, r7
+#if ! __SH4_NOFPU__
+	fst.d	r2, 34*8, dr12
+	fst.d	r2, 35*8, dr14
+	fst.d	r2, 36*8, dr36
+	fst.d	r2, 37*8, dr38
+	fst.d	r2, 38*8, dr40
+	fst.d	r2, 39*8, dr42
+	fst.d	r2, 40*8, dr44
+	fst.d	r2, 41*8, dr46
+	fst.d	r2, 42*8, dr48
+	fst.d	r2, 43*8, dr50
+	fst.d	r2, 44*8, dr52
+	fst.d	r2, 45*8, dr54
+	fst.d	r2, 46*8, dr56
+	fst.d	r2, 47*8, dr58
+	fst.d	r2, 48*8, dr60
+	fst.d	r2, 49*8, dr62
+#endif
+	movi	0, r2
+	blink	tr0, r63
+#else
 #if defined (__SH3E__) || defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__)
 	add	#(13*4),r4
 #else
@@ -28,8 +99,70 @@ ENTRY(setjmp)
 
 	rts
 	mov    #0,r0
+#endif /* __SH5__ */
 
 ENTRY(longjmp)
+#if __SH5__
+	ld.q	r2,  0*8, r18
+	ptabs	r18, tr0
+	ld.q	r2,  1*8, r10
+	ld.q	r2,  2*8, r11
+	ld.q	r2,  3*8, r12
+	ld.q	r2,  4*8, r13
+	ld.q	r2,  5*8, r14
+	ld.q	r2,  6*8, r15
+	ld.q	r2,  7*8, r28
+	ld.q	r2,  8*8, r29
+	ld.q	r2,  9*8, r30
+	ld.q	r2, 10*8, r31
+	ld.q	r2, 11*8, r32
+	ld.q	r2, 12*8, r33
+	ld.q	r2, 13*8, r34
+	ld.q	r2, 14*8, r35
+	ld.q	r2, 15*8, r44
+	ld.q	r2, 16*8, r45
+	ld.q	r2, 17*8, r46
+	ld.q	r2, 18*8, r47
+	ld.q	r2, 19*8, r48
+	ld.q	r2, 20*8, r49
+	ld.q	r2, 21*8, r50
+	ld.q	r2, 22*8, r51
+	ld.q	r2, 23*8, r52
+	ld.q	r2, 24*8, r53
+	ld.q	r2, 25*8, r54
+	ld.q	r2, 26*8, r55
+	ld.q	r2, 27*8, r56
+	ld.q	r2, 28*8, r57
+	ld.q	r2, 29*8, r58
+	ld.q	r2, 30*8, r59
+	ld.q	r2, 31*8, r5
+	ld.q	r2, 32*8, r6
+	ld.q	r2, 33*8, r7
+	ptabs	r5, tr5
+	ptabs	r6, tr6
+	ptabs	r7, tr7
+#if ! __SH4_NOFPU__
+	fld.d	r2, 34*8, dr12
+	fld.d	r2, 35*8, dr14
+	fld.d	r2, 36*8, dr36
+	fld.d	r2, 37*8, dr38
+	fld.d	r2, 38*8, dr40
+	fld.d	r2, 39*8, dr42
+	fld.d	r2, 40*8, dr44
+	fld.d	r2, 41*8, dr46
+	fld.d	r2, 42*8, dr48
+	fld.d	r2, 43*8, dr50
+	fld.d	r2, 44*8, dr52
+	fld.d	r2, 45*8, dr54
+	fld.d	r2, 46*8, dr56
+	fld.d	r2, 47*8, dr58
+	fld.d	r2, 48*8, dr60
+	fld.d	r2, 49*8, dr62
+#endif
+	movi	1, r2
+	cmvne	r3, r3, r2
+	blink	tr0, r63
+#else
 	mov.l	@r4+,r8
 	mov.l	@r4+,r9
 	mov.l	@r4+,r10
@@ -55,3 +188,4 @@ ENTRY(longjmp)
 	movt	r0
 retr4:	rts
 	nop
+#endif /* __SH5__ */
Index: newlib/libc/sys/sh/crt0.S
===================================================================
RCS file: /home/aoliva/cygnus/uberbaum/newlib/libc/sys/sh/crt0.S,v
retrieving revision 1.2
diff -u -p -r1.2 crt0.S
--- newlib/libc/sys/sh/crt0.S 13 Dec 2001 20:10:16 -0000 1.2
+++ newlib/libc/sys/sh/crt0.S 2 Feb 2002 04:00:48 -0000
@@ -1,3 +1,69 @@
+
+#ifdef __SH5__
+	.section .data,"aw"
+	.global ___data
+___data:
+
+	.section .rodata,"a"
+	.global ___rodata
+___rodata:
+
+#if __SH5__ == 64
+	.section .text,"ax"
+#define LOAD_ADDR(sym, reg) \
+	movi	(sym >> 48) & 65535, reg; \
+	shori	(sym >> 32) & 65535, reg; \
+	shori	(sym >> 16) & 65535, reg; \
+	shori	sym & 65535, reg
+#else
+	.mode	SHmedia
+	.section .text..SHmedia32,"ax"
+#define LOAD_ADDR(sym, reg) \
+	movi	(sym >> 16) & 65535, reg; \
+	shori	sym & 65535, reg
+#endif
+	.global start
+start:
+	LOAD_ADDR (_stack, r15)
+
+	pt/l	zero_bss_loop, tr0
+	pt/l	_atexit, tr1
+	pt/l	_init, tr5
+	pt/l	_main, tr6
+	pt/l	_exit, tr7
+
+	! zero out bss
+	LOAD_ADDR (_edata, r0)
+	LOAD_ADDR (_end, r1)
+zero_bss_loop:
+	stx.q	r0, r63, r63
+	addi	r0, 8, r0
+	bgt/l	r1, r0, tr0
+
+	LOAD_ADDR (___data, r26)
+	LOAD_ADDR (___rodata, r27)
+
+#if ! __SH4_NOFPU__
+	getcon	cr0, r0
+	movi	1, r1
+	shlli	r1, 15, r1
+	or	r1, r0, r0
+	putcon	r0, cr0
+#endif
+
+	! arrange for exit to call fini
+	LOAD_ADDR (_fini, r2)
+	blink	tr1, r18
+
+	! call init
+	blink	tr5, r18
+
+	! call the mainline
+	blink	tr6, r18
+
+	! call exit
+	blink	tr7, r18
+#else
 	.section .text
 	.global	start
 start:
@@ -46,6 +112,7 @@ main_k:
 	.long	_main
 exit_k:
 	.long	_exit
+#endif
 
 #ifdef __ELF__
 	.section .stack,"aw"
Index: newlib/libc/sys/sh/trap.S
===================================================================
RCS file: /home/aoliva/cygnus/uberbaum/newlib/libc/sys/sh/trap.S,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 trap.S
--- newlib/libc/sys/sh/trap.S 17 Feb 2000 19:39:50 -0000 1.1.1.1
+++ newlib/libc/sys/sh/trap.S 2 Feb 2002 04:00:48 -0000
@@ -1,3 +1,30 @@
+#if __SH5__
+	.mode	SHmedia
+#if __SH5__ == 32 && __SHMEDIA__
+	.section	.text..SHmedia32, "ax"
+#else
+	.text
+#endif
+	.global ___trap34
+___trap34:
+	movi	34, r0
+	trapa	r0
+	pt/l	ret, tr1
+	ptabs/l	r18, tr0
+	beqi	r1, 0, tr1
+#if __SH5__ == 64
+	movi	((_errno >> 48) & 65535), r0
+	shori	((_errno >> 32) & 65535), r0
+	shori	((_errno >> 16) & 65535), r0
+#else
+	movi	((_errno >> 16) & 65535), r0
+#endif
+	shori	(_errno & 65535), r0
+	stx.l	r0, r63, r1
+ret:
+	blink	tr0, r63
+	
+#else
 	.text
 	.global	___trap34
 ___trap34:
@@ -13,3 +40,4 @@ ret:
 	.align	2
 perrno:
 	.long	_errno
+#endif /* ! __SH5__ */

-- 
Alexandre Oliva   Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer                  aoliva@{cygnus.com, redhat.com}
CS PhD student at IC-Unicamp        oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist                Professional serial bug killer

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