summaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2015-04-27 19:16:27 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2015-04-27 19:16:27 +0000
commitacff2768b3f55faa986f82517c2e9b996e4aa408 (patch)
treea67446cf5b576ae16aac0ce5b4210d02ea3e99ef /libgcc
parentce9b6ce6b8dadfe222a2a2870dd259ff9f03d953 (diff)
downloadgcc-acff2768b3f55faa986f82517c2e9b996e4aa408.tar.gz
gcc/
* 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. libgcc/ * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222479 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog7
-rw-r--r--libgcc/config.host4
-rw-r--r--libgcc/config/h8300/lib1funcs.S80
-rw-r--r--libgcc/config/h8300/sfp-machine.h76
-rw-r--r--libgcc/config/h8300/t-linux10
5 files changed, 140 insertions, 37 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 0891353a5e5..c48a61cbe37 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,10 @@
+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>
diff --git a/libgcc/config.host b/libgcc/config.host
index ce14b9ee625..570998feffa 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 36e7d53a45d..24a74a93373 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 00000000000..6a4f97553ae
--- /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 00000000000..a575e755a8a
--- /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