From patchwork Wed Jun 9 17:07:17 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kazu Hirata X-Patchwork-Id: 55113 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 01503B7D1D for ; Thu, 10 Jun 2010 03:07:29 +1000 (EST) Received: (qmail 817 invoked by alias); 9 Jun 2010 17:07:26 -0000 Received: (qmail 791 invoked by uid 22791); 9 Jun 2010 17:07:24 -0000 X-SWARE-Spam-Status: No, hits=-1.1 required=5.0 tests=AWL, BAYES_05, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from gateway.codesourcery.com (HELO henry1.codesourcery.com) (38.113.113.105) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 09 Jun 2010 17:07:19 +0000 Received: by henry1.codesourcery.com (Postfix, from userid 1009) id B3F305664EF; Wed, 9 Jun 2010 10:07:17 -0700 (PDT) To: gcc-patches@gcc.gnu.org CC: echristo@apple.com CC: rdsandiford@googlemail.com Subject: [patch] Set FPU defaults for -ffast-math on MIPS. Message-Id: <20100609170717.B3F305664EF@henry1.codesourcery.com> Date: Wed, 9 Jun 2010 10:07:17 -0700 (PDT) From: kazu@codesourcery.com (Kazu Hirata) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, Attached is a patch to set FPU defaults for -ffast-math on MIPS. When -ffast-math is given, the FPU default are set similarly to how the IA32 backend does. Tested on mips-linux-gnu. OK to apply? Kazu Hirata gcc/ 2010-06-09 Kazu Hirata * config.gcc (mips64*-*-linux*, mipsisa64*-*-linux*, mips*-*-linux*): Add mips/t-crtfm to tmake_file. * config/mips/crtfastmath.c: New. * config/mips/linux.h (ENDFILE_SPEC): New. * config/mips/linux64.h (ENDFILE_SPEC): New. * config/mips/t-crtfm: New. libgcc/ 2010-06-09 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 + tmake_file="$tmake_file mips/t-crtfm" gnu_ld=yes gas=yes test x$with_llsc != x || with_llsc=yes @@ -1765,6 +1766,7 @@ mips*-*-linux*) # Linux MIPS, either tm_defines="${tm_defines} MIPS_ISA_DEFAULT=32" esac test x$with_llsc != x || with_llsc=yes + tmake_file="$tmake_file mips/t-crtfm" ;; mips*-*-openbsd*) tm_defines="${tm_defines} OBSD_HAS_DECLARE_FUNCTION_NAME OBSD_HAS_DECLARE_OBJECT OBSD_HAS_CORRECT_SPECS" 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: gcc/config/mips/linux64.h =================================================================== --- gcc/config/mips/linux64.h (revision 160484) +++ gcc/config/mips/linux64.h (working copy) @@ -69,3 +69,9 @@ along with GCC; see the file COPYING3. ieee_quad_format is the default, but let's put this here to make sure nobody thinks we just forgot to set it to something else. */ #define MIPS_TFMODE_FORMAT mips_quad_format + +/* 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: 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/t-crtfm =================================================================== --- gcc/config/mips/t-crtfm (revision 0) +++ gcc/config/mips/t-crtfm (revision 0) @@ -0,0 +1,9 @@ + +EXTRA_MULTILIB_PARTS += crtfastmath.o + +EXTRA_PARTS += crtfastmath.o + +$(T)crtfastmath.o: $(srcdir)/config/mips/crtfastmath.c $(GCC_PASSES) + $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \ + -c -o $(T)crtfastmath.o $(srcdir)/config/mips/crtfastmath.c + Index: libgcc/config.host =================================================================== --- libgcc/config.host (revision 160484) +++ 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 +