From patchwork Sat Jun 12 04:48:23 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Set FPU defaults for -ffast-math on MIPS. (Take 2) Date: Fri, 11 Jun 2010 18:48:23 -0000 From: Kazu Hirata X-Patchwork-Id: 55379 Message-Id: <20100612044823.35AED5664EF@henry1.codesourcery.com> To: gcc-patches@gcc.gnu.org Cc: echristo@apple.com Hi, Attached is a revised patch to set FPU defaults for -ffast-math on MIPS. The previous version was posted at: http://gcc.gnu.org/ml/gcc-patches/2010-06/msg00961.html In this iteration, I have removed changes to gcc/config/mips/linux64.h as they were duplicates of ones to gcc/config/mips/linux.h. The revised patch does not introduce gcc/config/mips/t-crtfm. We do still need to set extra_parts because libgcc/Makefile.in checks to see if EXTRA_PARTS from gcc and EXTRA_PARTS from libgcc are identical. I have moved the definition of EXTRA_PARTS to config.gcc (and lower-cased it). Tested on mips-linux-gnu. OK to apply? Kazu Hirata gcc/ 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. libgcc/ 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. Index: gcc/config.gcc =================================================================== --- gcc/config.gcc (revision 160484) +++ gcc/config.gcc (working copy) @@ -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 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*) Index: gcc/config/mips/crtfastmath.c =================================================================== --- gcc/config/mips/crtfastmath.c (revision 0) +++ gcc/config/mips/crtfastmath.c (revision 0) @@ -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 */ Index: gcc/config/mips/linux.h =================================================================== --- gcc/config/mips/linux.h (revision 160484) +++ gcc/config/mips/linux.h (working copy) @@ -147,3 +147,9 @@ extern const char *host_detect_local_cpu #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" Index: libgcc/config.host =================================================================== --- libgcc/config.host (revision 160631) +++ libgcc/config.host (working copy) @@ -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*) ;; Index: libgcc/config/mips/t-crtfm =================================================================== --- libgcc/config/mips/t-crtfm (revision 0) +++ libgcc/config/mips/t-crtfm (revision 0) @@ -0,0 +1,3 @@ +crtfastmath.o: $(gcc_srcdir)/config/mips/crtfastmath.c + $(gcc_compile) -c $(gcc_srcdir)/config/mips/crtfastmath.c +