===================================================================
@@ -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
===================================================================
@@ -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
===================================================================
@@ -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
===================================================================
@@ -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
===================================================================
@@ -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