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]

Re: [PATCH] Add new target h8300-*-linux


Ping

At Fri, 06 Mar 2015 01:50:34 +0900,
Yoshinori Sato wrote:
> 
> 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]