This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

[PATCH] Add new target h8300-*-linux


Add h8300-*-linux target for h8300 linux kernel and userland.

h8300-*-elf is some difference of standard elf.
h8300-*-linux is compatible of standard elf rules.

Thanks.

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cfacea1..fc5101c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2015-03-06  Yoshinori Sato <ysato@users.sourceforge.jp>
+
+	* config.gcc: Add h8300-*-linux
+	* config/h8300/h8300.c (h8300_option_override):
+	Exclusive -mh vs -ms/-msx
+	(h8300_file_start): Target priority -msx > -ms > -mh
+	* config/h8300/linux.h: New file.
+	* config/h8300/t-linux: Likewise.
+
 2015-03-05  Martin Liska  <mliska@suse.cz>
 
 	* ipa-inline.c (inline_small_functions): Set default value to
diff --git a/gcc/config.gcc b/gcc/config.gcc
index 483c672..975f3f6 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1211,6 +1211,10 @@ h8300-*-elf*)
 	tmake_file="h8300/t-h8300"
 	tm_file="h8300/h8300.h dbxelf.h elfos.h newlib-stdint.h h8300/elf.h"
 	;;
+h8300-*-linux*)
+	tmake_file="${tmake_file} h8300/t-h8300 h8300/t-linux"
+	tm_file="h8300/h8300.h dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h h8300/linux.h"
+	;;
 hppa*64*-*-linux*)
 	target_cpu_default="MASK_PA_11|MASK_PA_20"
 	tm_file="pa/pa64-start.h ${tm_file} dbxelf.h elfos.h gnu-user.h linux.h \
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index 4e9110e..9862b7e 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -370,6 +370,11 @@ h8300_option_override (void)
   h8_pop_op = h8_pop_ops[cpu_type];
   h8_mov_op = h8_mov_ops[cpu_type];
 
+  if (TARGET_H8300H && (TARGET_H8300S || TARGET_H8300SX))
+    {
+      target_flags ^= MASK_H8300H;
+    }
+
   if (!TARGET_H8300S && TARGET_MAC)
     {
       error ("-ms2600 is used without -ms");
@@ -1006,12 +1011,12 @@ h8300_file_start (void)
 {
   default_file_start ();
 
-  if (TARGET_H8300H)
-    fputs (TARGET_NORMAL_MODE ? "\t.h8300hn\n" : "\t.h8300h\n", asm_out_file);
-  else if (TARGET_H8300SX)
+  if (TARGET_H8300SX)
     fputs (TARGET_NORMAL_MODE ? "\t.h8300sxn\n" : "\t.h8300sx\n", asm_out_file);
   else if (TARGET_H8300S)
     fputs (TARGET_NORMAL_MODE ? "\t.h8300sn\n" : "\t.h8300s\n", asm_out_file);
+  else if (TARGET_H8300H)
+    fputs (TARGET_NORMAL_MODE ? "\t.h8300hn\n" : "\t.h8300h\n", asm_out_file);
 }
 
 /* Output assembly language code for the end of file.  */
diff --git a/gcc/config/h8300/linux.h b/gcc/config/h8300/linux.h
new file mode 100644
index 0000000..995d320
--- /dev/null
+++ b/gcc/config/h8300/linux.h
@@ -0,0 +1,47 @@
+/* Definitions of target machine for GNU compiler.
+   Renesas H8/300 (linux variant)
+   Copyright (C) 2015
+   Free Software Foundation, Inc.
+   Contributed by Yoshinori Sato <ysato@users.sourceforge.jp>
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+#ifndef GCC_H8300_LINUX_H
+#define GCC_H8300_LINUX_H
+
+#define TARGET_OS_CPP_BUILTINS() \
+  do						\
+    {						\
+      GNU_USER_TARGET_OS_CPP_BUILTINS();	\
+    }						\
+  while (0)
+
+#undef LINK_SPEC
+#define LINK_SPEC "%{mh:%{!mn:-m h8300helf_linux}} %{ms:%{!mn:-m h8300self_linux}}"
+
+#undef TARGET_DEFAULT
+#define TARGET_DEFAULT (MASK_QUICKCALL | MASK_INT32 | MASK_H8300H)
+
+/* Width of a word, in units (bytes).  */
+#undef DOUBLE_TYPE_SIZE
+#define DOUBLE_TYPE_SIZE	64
+
+#undef DEFAULT_SIGNED_CHAR
+#define DEFAULT_SIGNED_CHAR 1
+
+#undef USER_LABEL_PREFIX
+#endif /* ! GCC_H8300_LINUX_H */
diff --git a/gcc/config/h8300/t-linux b/gcc/config/h8300/t-linux
new file mode 100644
index 0000000..11237ea
--- /dev/null
+++ b/gcc/config/h8300/t-linux
@@ -0,0 +1,20 @@
+# Copyright (C) 2015 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+MULTILIB_OPTIONS = ms/msx
+MULTILIB_DIRNAMES = h8300s h8sx
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 49eee7a..1ebc061 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,10 @@
+2015-03-06  Yoshinori Sato <ysato@users.sourceforge.jp>
+
+	* libgcc/config.host: Add target h8300-*-linux.
+	* libgcc/config/h8300/lib1funcs.S: No symbol prefix support.
+	* libgcc/config/h8300/sfp-machine.h: New file.
+	* libgcc/config/h8300/t-linux: Likewise.
+
 2015-03-03  Max Filippov  <jcmvbkbc@gmail.com>
 	
 	Implement call0 ABI for xtensa
diff --git a/libgcc/config.host b/libgcc/config.host
index 5baeae5..5e47f0e 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -487,6 +487,10 @@ h8300-*-elf*)
 	tm_file="$tm_file h8300/h8300-lib.h"
 	extra_parts="$extra_parts crti.o crtn.o"
 	;;
+h8300-*-linux*)
+	tmake_file="t-linux h8300/t-linux t-softfp-sfdf t-softfp"
+	tm_file="$tm_file h8300/h8300-lib.h"
+	;;
 hppa*64*-*-linux*)
 	tmake_file="$tmake_file pa/t-linux pa/t-linux64"
 	extra_parts="crtbegin.o crtbeginS.o crtbeginT.o crtend.o crtendS.o"
diff --git a/libgcc/config/h8300/lib1funcs.S b/libgcc/config/h8300/lib1funcs.S
index 36e7d53..24a74a9 100644
--- a/libgcc/config/h8300/lib1funcs.S
+++ b/libgcc/config/h8300/lib1funcs.S
@@ -84,6 +84,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #define A3E	e3
 #endif
 
+#define CONCAT(A,B)     A##B
+#define LABEL0(U,X)    CONCAT(U,__##X)
+#define LABEL0_DEF(U,X)    CONCAT(U,__##X##:)
+#define LABEL_DEF(X)       LABEL0_DEF(__USER_LABEL_PREFIX__,X)
+#define LABEL(X)       LABEL0(__USER_LABEL_PREFIX__,X)
+
 #ifdef __H8300H__
 #ifdef __NORMAL_MODE__
 	.h8300hn
@@ -111,8 +117,8 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #ifdef __H8300__
 	.section .text
 	.align 2
-	.global ___cmpsi2
-___cmpsi2:
+	.global LABEL(cmpsi2)
+LABEL_DEF(cmpsi2)
 	cmp.w	A0,A2
 	bne	.L2
 	cmp.w	A1,A3
@@ -137,8 +143,8 @@ ___cmpsi2:
 #ifdef __H8300__
 	.section .text
 	.align 2
-	.global ___ucmpsi2
-___ucmpsi2:
+	.global LABEL(ucmpsi2)
+LABEL_DEF(ucmpsi2)
 	cmp.w	A0,A2
 	bne	.L2
 	cmp.w	A1,A3
@@ -207,10 +213,10 @@ _lab8:	rts
 
 ; A0=A0/A1 signed
 
-	.global	___divhi3
-___divhi3:
+	.global	LABEL(divhi3)
+LABEL_DEF(divhi3)
 	bsr	divnorm
-	bsr	___udivhi3
+	bsr	LABEL(udivhi3)
 negans:	btst	#3,A2L	; should answer be negative ?
 	beq	_lab4
 	not	A0H	; yes, so make it so
@@ -220,18 +226,18 @@ _lab4:	rts
 
 ; A0=A0%A1 signed
 
-	.global	___modhi3
-___modhi3:
+	.global	LABEL(modhi3)
+LABEL_DEF(modhi3)
 	bsr	modnorm
-	bsr	___udivhi3
+	bsr	LABEL(udivhi3)
 	mov	A3,A0
 	bra	negans
 
 ; A0=A0%A1 unsigned
 
-	.global	___umodhi3
-___umodhi3:
-	bsr	___udivhi3
+	.global	LABEL(umodhi3)
+LABEL_DEF(umodhi3)
+	bsr	LABEL(udivhi3)
 	mov	A3,A0
 	rts
 
@@ -251,8 +257,8 @@ ___umodhi3:
 ; The H8/300 only has a 16/8 bit divide, so we look at the incoming and
 ; see how to partition up the expression.
 
-	.global	___udivhi3
-___udivhi3:
+	.global	LABEL(udivhi3)
+LABEL_DEF(udivhi3)
 				; A0 A1 A2 A3
 				; Nn Dd       P
 	sub.w	A3,A3		; Nn Dd xP 00
@@ -418,8 +424,8 @@ mpostive2:
 
 ; numerator in A0/A1
 ; denominator in A2/A3
-	.global	___modsi3
-___modsi3:
+	.global	LABEL(modsi3)
+LABEL_DEF(modsi3)
 #ifdef __H8300__
 	PUSHP	S2P
 	PUSHP	S0P
@@ -432,7 +438,7 @@ ___modsi3:
 #else
 	PUSHP	S2P
 	bsr	modnorm
-	bsr	___udivsi3
+	bsr	LABEL(divsi3)
 	mov.l	er3,er0
 	bra	exitdiv
 #endif
@@ -440,8 +446,8 @@ ___modsi3:
 	;; H8/300H and H8S version of ___udivsi3 is defined later in
 	;; the file.
 #ifdef __H8300__
-	.global	___udivsi3
-___udivsi3:
+	.global	LABEL(udivsi3)
+LABEL_DEF(udivsi3)
 	PUSHP	S2P
 	PUSHP	S0P
 	PUSHP	S1P
@@ -449,8 +455,8 @@ ___udivsi3:
 	bra	reti
 #endif
 
-	.global	___umodsi3
-___umodsi3:
+	.global	LABEL(umodsi3)
+LABEL_DEF(umodsi3)
 #ifdef __H8300__
 	PUSHP	S2P
 	PUSHP	S0P
@@ -460,13 +466,13 @@ ___umodsi3:
 	mov	S1,A1
 	bra	reti
 #else
-	bsr	___udivsi3
+	bsr	LABEL(udivsi3)
 	mov.l	er3,er0
 	rts
 #endif
 
-	.global	___divsi3
-___divsi3:
+	.global	LABEL(divsi3)
+LABEL_DEF(divsi3)
 #ifdef __H8300__
 	PUSHP	S2P
 	PUSHP	S0P
@@ -476,7 +482,7 @@ ___divsi3:
 #else
 	PUSHP	S2P
 	jsr	divnorm
-	bsr	___udivsi3
+	bsr	LABEL(udivsi3)
 #endif
 
 	; examine what the sign should be
@@ -591,8 +597,8 @@ setone:
 #else /* __H8300H__ */
 
 	;; This function also computes the remainder and stores it in er3.
-	.global	___udivsi3
-___udivsi3:
+	.global	LABEL(udivsi3)
+LABEL_DEF(udivsi3)
 	mov.w	A1E,A1E		; denominator top word 0?
 	bne	DenHighNonZero
 
@@ -681,8 +687,8 @@ divmod_L26:
 #ifdef __H8300__
 	.section .text
 	.align 2
-	.global	___mulhi3
-___mulhi3:
+	.global	LABEL(mulhi3)
+LABEL_DEF(mulhi3)
 	mov.b	A1L,A2L		; A2l gets srcb.l
 	mulxu	A0L,A2		; A2 gets first sub product
 
@@ -726,8 +732,8 @@ ___mulhi3:
 
 #ifdef __H8300__
 
-	.global	___mulsi3
-___mulsi3:
+	.global	LABEL(mulsi3)
+LABEL_DEF(mulsi3)
 	PUSHP	S0P
 	PUSHP	S1P
 
@@ -785,8 +791,8 @@ _done:
 ; 32b * 32b =  92 states
 ;
 
-	.global	___mulsi3
-___mulsi3:
+	.global LABEL(mulsi3)
+LABEL_DEF(mulsi3)
 	mov.w	r1,r2   ; ( 2 states) b * d
 	mulxu	r0,er2  ; (22 states)
 
@@ -814,11 +820,11 @@ L_skip2:
 #ifdef __H8300__
 /* We still treat NANs different than libgcc2.c, but then, the
    behavior is undefined anyways.  */
-	.global	___fixunssfsi
-___fixunssfsi:
+	.global LABEL(fixunssfsi)
+LABEL_DEF(fixunssfsi)
 	cmp.b #0x4f,r0h
 	bge Large_num
-	jmp     @___fixsfsi
+	jmp     @LABEL(fixsfsi)
 Large_num:
 	bhi L_huge_num
 	xor.b #0x80,A0L
diff --git a/libgcc/config/h8300/sfp-machine.h b/libgcc/config/h8300/sfp-machine.h
new file mode 100644
index 0000000..645e8ab
--- /dev/null
+++ b/libgcc/config/h8300/sfp-machine.h
@@ -0,0 +1,76 @@
+/* Soft-FP definitions for H8/300
+   Copyright (C) 2013-2015 Free Software Foundation, Inc.
+
+This file is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3, or (at your option) any
+later version.
+
+This file 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
+General Public License for more details.
+
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
+
+#define _FP_W_TYPE_SIZE		32
+#define _FP_W_TYPE		unsigned long
+#define _FP_WS_TYPE		signed long
+#define _FP_I_TYPE		long
+
+#define _FP_MUL_MEAT_S(R,X,Y)				\
+  _FP_MUL_MEAT_1_wide(_FP_WFRACBITS_S,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_D(R,X,Y)				\
+  _FP_MUL_MEAT_2_wide(_FP_WFRACBITS_D,R,X,Y,umul_ppmm)
+#define _FP_MUL_MEAT_Q(R,X,Y)				\
+  _FP_MUL_MEAT_4_wide(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
+
+#define _FP_DIV_MEAT_S(R,X,Y)	_FP_DIV_MEAT_1_loop(S,R,X,Y)
+#define _FP_DIV_MEAT_D(R,X,Y)	_FP_DIV_MEAT_2_udiv(D,R,X,Y)
+#define _FP_DIV_MEAT_Q(R,X,Y)	_FP_DIV_MEAT_4_udiv(Q,R,X,Y)
+
+#define _FP_NANFRAC_S		((_FP_QNANBIT_S << 1) - 1)
+#define _FP_NANFRAC_D		((_FP_QNANBIT_D << 1) - 1), -1
+#define _FP_NANFRAC_Q		((_FP_QNANBIT_Q << 1) - 1), -1, -1, -1
+#define _FP_NANSIGN_S		0
+#define _FP_NANSIGN_D		0
+#define _FP_NANSIGN_Q		0
+
+#define _FP_KEEPNANFRACP 1
+#define _FP_QNANNEGATEDP 0
+
+/* Someone please check this.  */
+#define _FP_CHOOSENAN(fs, wc, R, X, Y, OP)			\
+  do {								\
+    if ((_FP_FRAC_HIGH_RAW_##fs(X) & _FP_QNANBIT_##fs)		\
+	&& !(_FP_FRAC_HIGH_RAW_##fs(Y) & _FP_QNANBIT_##fs))	\
+      {								\
+	R##_s = Y##_s;						\
+	_FP_FRAC_COPY_##wc(R,Y);				\
+      }								\
+    else							\
+      {								\
+	R##_s = X##_s;						\
+	_FP_FRAC_COPY_##wc(R,X);				\
+      }								\
+    R##_c = FP_CLS_NAN;						\
+  } while (0)
+
+/* Not checked.  */
+#define _FP_TININESS_AFTER_ROUNDING 0
+
+#define	__BIG_ENDIAN	4321
+
+#define __BYTE_ORDER __BIG_ENDIAN
+
+/* Define ALIASNAME as a strong alias for NAME.  */
+# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
+# define _strong_alias(name, aliasname) \
+  extern __typeof (name) aliasname __attribute__ ((alias (#name)));
diff --git a/libgcc/config/h8300/t-linux b/libgcc/config/h8300/t-linux
new file mode 100644
index 0000000..a575e75
--- /dev/null
+++ b/libgcc/config/h8300/t-linux
@@ -0,0 +1,10 @@
+LIB1ASMSRC = h8300/lib1funcs.S
+LIB1ASMFUNCS = _cmpsi2 _ucmpsi2 _divhi3 _divsi3 _mulhi3 _mulsi3 \
+  _fixunssfsi_asm
+
+LIB2ADD += \
+	$(srcdir)/config/h8300/clzhi2.c \
+	$(srcdir)/config/h8300/ctzhi2.c \
+	$(srcdir)/config/h8300/parityhi2.c \
+	$(srcdir)/config/h8300/popcounthi2.c \
+	$(srcdir)/config/h8300/fixunssfsi.c

-- 
Yoshinori Sato
<ysato@users.sourceforge.jp>


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