diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3d1b0eb301a..0102777ed2d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-06-12 Kazu Hirata + + * config.gcc (mips64*-*-linux*, mipsisa64*-*-linux*, + mips*-*-linux*): Add crtfastmath.o to extra_parts. + * config/mips/crtfastmath.c: New. + * config/mips/linux.h (ENDFILE_SPEC): New. + 2010-06-12 Sebastian Pop * graphite-clast-to-gimple.c (gcc_type_for_interval): Do not pass diff --git a/gcc/config.gcc b/gcc/config.gcc index 3b74b689a52..7ae54cca5fc 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -1750,6 +1750,7 @@ mips64*-*-linux* | mipsisa64*-*-linux*) tm_defines="${tm_defines} MIPS_ISA_DEFAULT=65" ;; esac + extra_parts="$extra_parts crtfastmath.o" gnu_ld=yes gas=yes test x$with_llsc != x || with_llsc=yes @@ -1764,6 +1765,7 @@ mips*-*-linux*) # Linux MIPS, either endian. mipsisa32*) tm_defines="${tm_defines} MIPS_ISA_DEFAULT=32" esac + extra_parts="$extra_parts crtfastmath.o" test x$with_llsc != x || with_llsc=yes ;; mips*-*-openbsd*) diff --git a/gcc/config/mips/crtfastmath.c b/gcc/config/mips/crtfastmath.c new file mode 100644 index 00000000000..a9586b0a797 --- /dev/null +++ b/gcc/config/mips/crtfastmath.c @@ -0,0 +1,53 @@ +/* Copyright (C) 2010 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 . */ + +#ifdef __mips_hard_float + +/* Flush denormalized numbers to zero. */ +#define _FPU_FLUSH_TZ 0x1000000 + +/* Rounding control. */ +#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */ +#define _FPU_RC_ZERO 0x1 +#define _FPU_RC_UP 0x2 +#define _FPU_RC_DOWN 0x3 + +/* Enable interrupts for IEEE exceptions. */ +#define _FPU_IEEE 0x00000F80 + +/* Macros for accessing the hardware control word. */ +#define _FPU_GETCW(cw) __asm__ ("cfc1 %0,$31" : "=r" (cw)) +#define _FPU_SETCW(cw) __asm__ ("ctc1 %0,$31" : : "r" (cw)) + +static void __attribute__((constructor)) +set_fast_math (void) +{ + unsigned int fcr; + + /* Flush to zero, round to nearest, IEEE exceptions disabled. */ + fcr = _FPU_FLUSH_TZ | _FPU_RC_NEAREST; + + _FPU_SETCW(fcr); +} + +#endif /* __mips_hard_float */ diff --git a/gcc/config/mips/linux.h b/gcc/config/mips/linux.h index 0512ef7d14f..8087e8ffd12 100644 --- a/gcc/config/mips/linux.h +++ b/gcc/config/mips/linux.h @@ -147,3 +147,9 @@ extern const char *host_detect_local_cpu (int argc, const char **argv); #define DRIVER_SELF_SPECS \ BASE_DRIVER_SELF_SPECS, \ LINUX_DRIVER_SELF_SPECS + +/* Similar to standard Linux, but adding -ffast-math support. */ +#undef ENDFILE_SPEC +#define ENDFILE_SPEC \ + "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \ + %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s" diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index a0e88458d96..a261a056f69 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,9 @@ +2010-06-12 Kazu Hirata + + * config.host (mips64*-*-linux*, mips*-*-linux*): Add mips/t-crtfm + to tmake_file. Add crtfastmath.o to extra_parts. + * config/mips/t-crtfm: New. + 2010-05-19 Joel Sherrill * config.host (sparc64-*-rtems*): New target. diff --git a/libgcc/config.host b/libgcc/config.host index 1e76b19b0bf..6784147d6d7 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -400,8 +400,12 @@ mips-sgi-irix[56]*) mips*-*-netbsd*) # NetBSD/mips, either endian. ;; mips64*-*-linux*) + extra_parts="$extra_parts crtfastmath.o" + tmake_file="{$tmake_file} mips/t-crtfm" ;; mips*-*-linux*) # Linux MIPS, either endian. + extra_parts="$extra_parts crtfastmath.o" + tmake_file="{$tmake_file} mips/t-crtfm" ;; mips*-*-openbsd*) ;; diff --git a/libgcc/config/mips/t-crtfm b/libgcc/config/mips/t-crtfm new file mode 100644 index 00000000000..fe2e06619b1 --- /dev/null +++ b/libgcc/config/mips/t-crtfm @@ -0,0 +1,3 @@ +crtfastmath.o: $(gcc_srcdir)/config/mips/crtfastmath.c + $(gcc_compile) -c $(gcc_srcdir)/config/mips/crtfastmath.c +