This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Add new target h8300-*-linux
- From: Yoshinori Sato <ysato at users dot sourceforge dot jp>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 04 Apr 2015 23:08:09 +0900
- Subject: Re: [PATCH] Add new target h8300-*-linux
- Authentication-results: sourceware.org; auth=none
- References: <87twxz75id dot wl-ysato at users dot sourceforge dot jp>
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>