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: Jeff Law <law at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sun, 26 Apr 2015 15:21:40 +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> <55313A9F dot 6040304 at redhat dot com> <87618rjtbe dot wl-ysato at users dot sourceforge dot jp> <55351A9D dot 4070902 at redhat dot com> <87egneuidq dot wl-ysato at users dot sourceforge dot jp>
Updated.
Some cleanup.
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a73cef67..b7dac9b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2015-04-26 Yoshinori Sato <ysato@users.sourceforge.jp>
+
+ * config.gcc: Add h8300-*-linux.
+ * config/h8300/linux.h: Likewise.
+ * config/h8300/t-linux: Likewise.
+ * config/h8300/h8300.c (h8300_option_override): normal mode
+ not support for h8300-*-linux.
+ (h8300_file_start): target priority change.
+ (get_shift_alg): Likewise.
+ (h8300_shift_need_scratch_p): Likewise.
+ * config/h8300/h8300.h (TARGET_CPU_CPP_BUILTINS): Likewise.
+ * config/h8300/h8300.md (define_peephole2): Remove duplicate condition.
+
2015-04-24 Steve Ellcey <sellcey@imgtec.com>
* config/mips/mips.md: (*madd4<mode>) Remove accum_in attribute.
diff --git a/gcc/config.gcc b/gcc/config.gcc
index a1df043..5c48cd0 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -1218,6 +1218,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..00087f3 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -406,6 +406,14 @@ h8300_option_override (void)
- 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 @@ 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. */
@@ -4094,10 +4102,10 @@ get_shift_alg (enum shift_type shift_type, enum shift_mode shift_mode,
/* 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 @@ h8300_shift_needs_scratch_p (int count, machine_mode mode)
/* 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 --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h
index 2a47aa8..86fd7d1 100644
--- a/gcc/config/h8300/h8300.h
+++ b/gcc/config/h8300/h8300.h
@@ -39,29 +39,29 @@ extern const char * const *h8_reg_names;
#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 --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md
index dfd082c..4079b30 100644
--- a/gcc/config/h8300/h8300.md
+++ b/gcc/config/h8300/h8300.md
@@ -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 --git a/gcc/config/h8300/linux.h b/gcc/config/h8300/linux.h
new file mode 100644
index 0000000..ef31e86
--- /dev/null
+++ b/gcc/config/h8300/linux.h
@@ -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 <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:-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 --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 0891353..0eccadd 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,10 @@
+2015-04-26 Yoshinori Sato <ysato@users.sourceforge.jp>
+
+ * config.host: Add h8300-*-linux
+ * config/h8300/t-linux: Likewise.
+ * config/h8300/lib1funs.s: Change symbol prefix.
+ * config/h8300/sfp-machine.h: 64bit double support.
+
2015-04-22 Gregor Richards <gregor.richards@uwaterloo.ca>
Szabolcs Nagy <szabolcs.nagy@arm.com>
diff --git a/libgcc/config.host b/libgcc/config.host
index ce14b9e..570998f 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..6a4f975
--- /dev/null
+++ b/libgcc/config/h8300/sfp-machine.h
@@ -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
+<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>