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
