Index: libgcc/configure.ac
===================================================================
--- libgcc/configure.ac	2014-02-04 18:11:37.078922650 +0000
+++ libgcc/configure.ac	2014-02-04 18:11:41.534950708 +0000
@@ -292,6 +292,18 @@ EOF
 eval `${CC-cc} -E conftest.c | grep host_address=`
 rm -f conftest.c
 
+case ${host} in
+mips*-*-*)
+  AC_CACHE_CHECK([whether the target is hard-float],
+		 [libgcc_cv_mips_hard_float],
+		 [AC_COMPILE_IFELSE(
+    [#ifndef __mips_hard_float
+     #error FOO
+     #endif],
+    [libgcc_cv_mips_hard_float=yes],
+    [libgcc_cv_mips_hard_float=no])])
+esac
+
 # Collect host-machine-specific information.
 . ${srcdir}/config.host
 
Index: libgcc/config.host
===================================================================
--- libgcc/config.host	2014-02-04 18:11:37.077922644 +0000
+++ libgcc/config.host	2014-02-04 18:11:41.434950078 +0000
@@ -142,7 +142,12 @@ microblaze*-*-*)
 mips*-*-*)
 	# All MIPS targets provide a full set of FP routines.
 	cpu_type=mips
-	tmake_file="mips/t-mips t-softfp-sfdf"
+	tmake_file="mips/t-mips"
+	if test "${libgcc_cv_mips_hard_float}" = yes; then
+		tmake_file="${tmake_file} mips/t-hardfp-sfdf"
+	else
+		tmake_file="${tmake_file} t-softfp-sfdf"
+	fi
 	if test "${ac_cv_sizeof_long_double}" = 16; then
 		tmake_file="${tmake_file} mips/t-softfp-tf"
 	fi
Index: libgcc/config/mips/t-mips
===================================================================
--- libgcc/config/mips/t-mips	2014-02-04 18:11:37.077922644 +0000
+++ libgcc/config/mips/t-mips	2014-02-04 18:11:41.443950135 +0000
@@ -1,1 +1,9 @@
+LIB2_SIDITI_CONV_FUNCS = yes
+
+softfp_float_modes :=
+softfp_int_modes := si di
+softfp_extensions :=
+softfp_truncations :=
+softfp_exclude_libgcc2 := n
+
 LIB2ADD_ST += $(srcdir)/config/mips/lib2funcs.c
Index: libgcc/config/mips/t-hardfp-sfdf
===================================================================
--- /dev/null	2014-01-30 08:06:21.701666182 +0000
+++ libgcc/config/mips/t-hardfp-sfdf	2014-02-04 18:11:41.534950708 +0000
@@ -0,0 +1,26 @@
+# We need to provide a full set of FP routines for backward-compatibility.
+mips-hf-bases := \
+  addM3 subM3 negM2 mulM3 divM3 \
+  eqM2 neM2 geM2 gtM2 leM2 ltM2 unordM2 \
+  fixMsi floatsiM floatunsiM
+mips-hf-modes := sf df
+
+mips-hf-funcs := $(foreach m, $(mips-hf-modes), \
+	      	 	   $(subst M,$(m),$(mips-hf-bases)))
+mips-hf-funcs += extendsfdf2 truncdfsf2
+
+mips-hf-defines-for = \
+  $(shell echo $1 | \
+    sed "s/\(.*\)\(sf\|df\)\(si\|2\|3\|\)$$/-DFUNC=__& -DOP_\1\3 -DTYPE=\2/")
+
+mips-hf-o = $(patsubst %,%$(objext),$(mips-hf-funcs))
+$(mips-hf-o): %$(objext): $(srcdir)/config/mips/hardfp.c
+	$(gcc_compile) $(call mips-hf-defines-for, $*) -c $< $(vis_hide) -Wno-missing-prototypes
+libgcc-objects += $(mips-hf-o)
+
+ifeq ($(enable_shared),yes)
+mips-hf-s-o = $(patsubst %,%_s$(objext),$(mips-hf-funcs))
+$(mips-hf-s-o): %_s$(objext): $(srcdir)/config/mips/hardfp.c
+	$(gcc_s_compile) $(call mips-hf-defines-for, $*) -c $< -Wno-missing-prototypes
+libgcc-s-objects += $(mips-hf-s-o)
+endif
Index: libgcc/config/mips/hardfp.c
===================================================================
--- /dev/null	2014-01-30 08:06:21.701666182 +0000
+++ libgcc/config/mips/hardfp.c	2014-02-04 18:11:41.534950708 +0000
@@ -0,0 +1,64 @@
+/* Dummy floating-point routines for MIPS hard-float code.
+   Copyright (C) 2014 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.
+
+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 sf float
+#define df double
+
+#if defined (OP_add3)
+TYPE FUNC (TYPE x, TYPE y) { return x + y; }
+#elif defined (OP_sub3)
+TYPE FUNC (TYPE x, TYPE y) { return x - y; }
+#elif defined (OP_neg2)
+TYPE FUNC (TYPE x) { return -x; }
+#elif defined (OP_mul3)
+TYPE FUNC (TYPE x, TYPE y) { return x * y; }
+#elif defined (OP_div3)
+TYPE FUNC (TYPE x, TYPE y) { return x / y; }
+#elif defined (OP_eq2)
+int FUNC (TYPE x, TYPE y) { return x == y; }
+#elif defined (OP_ne2)
+int FUNC (TYPE x, TYPE y) { return x != y; }
+#elif defined (OP_ge2)
+int FUNC (TYPE x, TYPE y) { return x >= y; }
+#elif defined (OP_gt2)
+int FUNC (TYPE x, TYPE y) { return x > y; }
+#elif defined (OP_le2)
+int FUNC (TYPE x, TYPE y) { return x <= y; }
+#elif defined (OP_lt2)
+int FUNC (TYPE x, TYPE y) { return x < y; }
+#elif defined (OP_unord2)
+int FUNC (TYPE x, TYPE y) { return __builtin_isunordered (x, y); }
+#elif defined (OP_fixsi)
+int FUNC (TYPE x) { return (int) x; }
+#elif defined (OP_floatsi)
+TYPE FUNC (int x) { return (TYPE) x; }
+#elif defined (OP_floatunsi)
+TYPE FUNC (unsigned int x) { return (TYPE) x; }
+#elif defined (OP_extendsf2)
+TYPE FUNC (float x) { return (TYPE) x; }
+#elif defined (OP_truncdf2)
+TYPE FUNC (double x) { return (TYPE) x; }
+#else
+#error Unknown operation
+#endif
