diff -Nru gcc-5.1.0/gcc/config/h8300/h8300.c gcc-5.1.0-h8300/gcc/config/h8300/h8300.c --- gcc-5.1.0/gcc/config/h8300/h8300.c 2015-02-06 23:25:23.000000000 +0900 +++ gcc-5.1.0-h8300/gcc/config/h8300/h8300.c 2015-04-29 14:57:05.000000000 +0900 @@ -406,6 +406,14 @@ - Option ignored!"); } +#ifdef H8300_LINUX + if ((TARGET_NORMAL_MODE)) + { + error ("-mn is not supported for linux targets"); + target_flags ^= MASK_NORMAL_MODE; + } +#endif + /* Some of the shifts are optimized for speed by default. See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html If optimizing for size, change shift_alg for those shift to @@ -1006,12 +1014,12 @@ { 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. */ @@ -4094,10 +4102,10 @@ /* Find the target CPU. */ if (TARGET_H8300) cpu = H8_300; - else if (TARGET_H8300H) - cpu = H8_300H; - else + else if (TARGET_H8300S) cpu = H8_S; + else + cpu = H8_300H; /* Find the shift algorithm. */ info->alg = SHIFT_LOOP; @@ -4540,10 +4548,10 @@ /* Find out the target CPU. */ if (TARGET_H8300) cpu = H8_300; - else if (TARGET_H8300H) - cpu = H8_300H; - else + else if (TARGET_H8300S) cpu = H8_S; + else + cpu = H8_300H; /* Find the shift algorithm. */ switch (mode) diff -Nru gcc-5.1.0/gcc/config/h8300/h8300.h gcc-5.1.0-h8300/gcc/config/h8300/h8300.h --- gcc-5.1.0/gcc/config/h8300/h8300.h 2015-01-05 21:33:28.000000000 +0900 +++ gcc-5.1.0-h8300/gcc/config/h8300/h8300.h 2015-04-29 14:57:05.000000000 +0900 @@ -39,29 +39,29 @@ #define TARGET_CPU_CPP_BUILTINS() \ do \ { \ - if (TARGET_H8300H) \ + if (TARGET_H8300SX) \ { \ - builtin_define ("__H8300H__"); \ - builtin_assert ("cpu=h8300h"); \ - builtin_assert ("machine=h8300h"); \ + builtin_define ("__H8300SX__"); \ if (TARGET_NORMAL_MODE) \ { \ builtin_define ("__NORMAL_MODE__"); \ } \ } \ - else if (TARGET_H8300SX) \ + else if (TARGET_H8300S) \ { \ - builtin_define ("__H8300SX__"); \ + builtin_define ("__H8300S__"); \ + builtin_assert ("cpu=h8300s"); \ + builtin_assert ("machine=h8300s"); \ if (TARGET_NORMAL_MODE) \ { \ builtin_define ("__NORMAL_MODE__"); \ } \ } \ - else if (TARGET_H8300S) \ + else if (TARGET_H8300H) \ { \ - builtin_define ("__H8300S__"); \ - builtin_assert ("cpu=h8300s"); \ - builtin_assert ("machine=h8300s"); \ + builtin_define ("__H8300H__"); \ + builtin_assert ("cpu=h8300h"); \ + builtin_assert ("machine=h8300h"); \ if (TARGET_NORMAL_MODE) \ { \ builtin_define ("__NORMAL_MODE__"); \ diff -Nru gcc-5.1.0/gcc/config/h8300/h8300.md gcc-5.1.0-h8300/gcc/config/h8300/h8300.md --- gcc-5.1.0/gcc/config/h8300/h8300.md 2015-02-06 15:19:03.000000000 +0900 +++ gcc-5.1.0-h8300/gcc/config/h8300/h8300.md 2015-04-29 14:57:05.000000000 +0900 @@ -5847,7 +5847,7 @@ (pc)))] "(TARGET_H8300H || TARGET_H8300S) && peep2_reg_dead_p (1, operands[0]) - && ((TARGET_H8300H && INTVAL (operands[1]) == 3) + && (INTVAL (operands[1]) == 3 || INTVAL (operands[1]) == 7 || INTVAL (operands[1]) == 15 || INTVAL (operands[1]) == 31 diff -Nru gcc-5.1.0/gcc/config/h8300/linux.h gcc-5.1.0-h8300/gcc/config/h8300/linux.h --- gcc-5.1.0/gcc/config/h8300/linux.h 1970-01-01 09:00:00.000000000 +0900 +++ gcc-5.1.0-h8300/gcc/config/h8300/linux.h 2015-04-29 14:57:05.000000000 +0900 @@ -0,0 +1,50 @@ +/* Definitions of target machine for GNU compiler. + Renesas H8/300 (linux variant) + Copyright (C) 2015 + Free Software Foundation, Inc. + Contributed by Yoshinori Sato + +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 +. */ + +#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:-mh8300helf_linux} %{ms:-m h8300self_linux} %{msx:-m h8300sxelf_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 + +#define H8300_LINUX + +#endif /* ! GCC_H8300_LINUX_H */ diff -Nru gcc-5.1.0/gcc/config/h8300/t-linux gcc-5.1.0-h8300/gcc/config/h8300/t-linux --- gcc-5.1.0/gcc/config/h8300/t-linux 1970-01-01 09:00:00.000000000 +0900 +++ gcc-5.1.0-h8300/gcc/config/h8300/t-linux 2015-04-29 14:57:05.000000000 +0900 @@ -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 +# . + +MULTILIB_OPTIONS = ms/msx +MULTILIB_DIRNAMES = h8300s h8sx diff -Nru gcc-5.1.0/gcc/config.gcc gcc-5.1.0-h8300/gcc/config.gcc --- gcc-5.1.0/gcc/config.gcc 2015-03-10 18:50:41.000000000 +0900 +++ gcc-5.1.0-h8300/gcc/config.gcc 2015-04-29 14:57:05.000000000 +0900 @@ -1213,6 +1213,10 @@ 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 -Nru gcc-5.1.0/libgcc/config/h8300/lib1funcs.S gcc-5.1.0-h8300/libgcc/config/h8300/lib1funcs.S --- gcc-5.1.0/libgcc/config/h8300/lib1funcs.S 2015-01-05 21:33:28.000000000 +0900 +++ gcc-5.1.0-h8300/libgcc/config/h8300/lib1funcs.S 2015-04-29 14:57:05.000000000 +0900 @@ -84,6 +84,12 @@ #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 @@ #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 @@ #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 @@ ; 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 @@ ; 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 @@ ; 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 @@ ; 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 @@ #else PUSHP S2P bsr modnorm - bsr ___udivsi3 + bsr LABEL(divsi3) mov.l er3,er0 bra exitdiv #endif @@ -440,8 +446,8 @@ ;; 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 @@ bra reti #endif - .global ___umodsi3 -___umodsi3: + .global LABEL(umodsi3) +LABEL_DEF(umodsi3) #ifdef __H8300__ PUSHP S2P PUSHP S0P @@ -460,13 +466,13 @@ 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 @@ #else PUSHP S2P jsr divnorm - bsr ___udivsi3 + bsr LABEL(udivsi3) #endif ; examine what the sign should be @@ -591,8 +597,8 @@ #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 @@ #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 @@ #ifdef __H8300__ - .global ___mulsi3 -___mulsi3: + .global LABEL(mulsi3) +LABEL_DEF(mulsi3) PUSHP S0P PUSHP S1P @@ -785,8 +791,8 @@ ; 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 @@ #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 -Nru gcc-5.1.0/libgcc/config/h8300/sfp-machine.h gcc-5.1.0-h8300/libgcc/config/h8300/sfp-machine.h --- gcc-5.1.0/libgcc/config/h8300/sfp-machine.h 1970-01-01 09:00:00.000000000 +0900 +++ gcc-5.1.0-h8300/libgcc/config/h8300/sfp-machine.h 2015-04-29 14:57:05.000000000 +0900 @@ -0,0 +1,76 @@ +/* Soft-FP definitions for H8/300 + Copyright (C) 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 +. */ + +#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 -Nru gcc-5.1.0/libgcc/config/h8300/t-linux gcc-5.1.0-h8300/libgcc/config/h8300/t-linux --- gcc-5.1.0/libgcc/config/h8300/t-linux 1970-01-01 09:00:00.000000000 +0900 +++ gcc-5.1.0-h8300/libgcc/config/h8300/t-linux 2015-04-29 14:57:05.000000000 +0900 @@ -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 diff -Nru gcc-5.1.0/libgcc/config.host gcc-5.1.0-h8300/libgcc/config.host --- gcc-5.1.0/libgcc/config.host 2015-03-25 17:32:17.000000000 +0900 +++ gcc-5.1.0-h8300/libgcc/config.host 2015-04-29 14:57:05.000000000 +0900 @@ -487,6 +487,10 @@ 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"