+2015-04-27 Yoshinori Sato <ysato@users.sourceforge.jp>
+
+ * config.gcc: Add h8300-*-linux.
+ * config/h8300/linux.h: New.
+ * config/h8300/t-linux: New.
+ * config/h8300/h8300.c (h8300_option_override): Normal mode
+ is not supported 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-27 Caroline Tice <cmtice@google.com>
* final.c (final_scan_insn): Output cold_function_nmae as function
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 \
- 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
{
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. */
/* 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;
/* 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)
#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__"); \
(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
--- /dev/null
+/* 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 */
--- /dev/null
+# 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
+2015-04-27 Yoshinori Sato <ysato@users.sourceforge.jp>
+
+ * config.host: Add h8300-*-linux
+ * config/h8300/t-linux: New file.
+ * 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>
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"
#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
#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
#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
; 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
; 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
; 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
; numerator in A0/A1
; denominator in A2/A3
- .global ___modsi3
-___modsi3:
+ .global LABEL(modsi3)
+LABEL_DEF(modsi3)
#ifdef __H8300__
PUSHP S2P
PUSHP S0P
#else
PUSHP S2P
bsr modnorm
- bsr ___udivsi3
+ bsr LABEL(divsi3)
mov.l er3,er0
bra exitdiv
#endif
;; 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
bra reti
#endif
- .global ___umodsi3
-___umodsi3:
+ .global LABEL(umodsi3)
+LABEL_DEF(umodsi3)
#ifdef __H8300__
PUSHP S2P
PUSHP S0P
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
#else
PUSHP S2P
jsr divnorm
- bsr ___udivsi3
+ bsr LABEL(udivsi3)
#endif
; examine what the sign should be
#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
#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
#ifdef __H8300__
- .global ___mulsi3
-___mulsi3:
+ .global LABEL(mulsi3)
+LABEL_DEF(mulsi3)
PUSHP S0P
PUSHP S1P
; 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)
#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
--- /dev/null
+/* 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)));
--- /dev/null
+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