From 2a8549e09ffc441b653d4111b0f973e521c39216 Mon Sep 17 00:00:00 2001 From: uros Date: Fri, 22 May 2015 14:39:22 +0000 Subject: [PATCH] * config.host (i[34567]-*-*, x86_64-*-*): Add t-crtfm instead of i386/t-crtfm to tmake_file. * config/i386/crtfastmath.c (set_fast_math_sse): New function. (set_fast_math): Use set_fast_math_sse for SSE targets. * config/i386/t-crtfm: Remove. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@223578 138bc75d-0d04-0410-961f-82ee72b054a4 --- libgcc/ChangeLog | 8 ++++ libgcc/config.host | 22 +++++----- libgcc/config/i386/crtfastmath.c | 89 +++++++++++++++++++++------------------- libgcc/config/i386/t-crtfm | 4 -- 4 files changed, 65 insertions(+), 58 deletions(-) delete mode 100644 libgcc/config/i386/t-crtfm diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 0b4c298471d..1bcd266d79a 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,11 @@ +2015-05-22 Uros Bizjak + + * config.host (i[34567]-*-*, x86_64-*-*): Add t-crtfm instead of + i386/t-crtfm to tmake_file. + * config/i386/crtfastmath.c (set_fast_math_sse): New function. + (set_fast_math): Use set_fast_math_sse for SSE targets. + * config/i386/t-crtfm: Remove. + 2015-05-21 Alan Modra PR libgcc/66225 diff --git a/libgcc/config.host b/libgcc/config.host index 8d826806d2a..05fd808e968 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -553,12 +553,12 @@ hppa*-*-openbsd*) tmake_file="$tmake_file pa/t-openbsd" ;; i[34567]86-*-darwin*) - tmake_file="$tmake_file i386/t-crtpc i386/t-crtfm" + tmake_file="$tmake_file i386/t-crtpc t-crtfm" tm_file="$tm_file i386/darwin-lib.h" extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" ;; x86_64-*-darwin*) - tmake_file="$tmake_file i386/t-crtpc i386/t-crtfm" + tmake_file="$tmake_file i386/t-crtpc t-crtfm" tm_file="$tm_file i386/darwin-lib.h" extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" ;; @@ -595,24 +595,24 @@ x86_64-*-openbsd*) ;; i[34567]86-*-linux*) extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" - tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules" + tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff t-dfprules" tm_file="${tm_file} i386/elf-lib.h" md_unwind_header=i386/linux-unwind.h ;; i[34567]86-*-kfreebsd*-gnu | i[34567]86-*-knetbsd*-gnu | i[34567]86-*-gnu* | i[34567]86-*-kopensolaris*-gnu) extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" - tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules" + tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff t-dfprules" tm_file="${tm_file} i386/elf-lib.h" ;; x86_64-*-linux*) extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" - tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules" + tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff t-dfprules" tm_file="${tm_file} i386/elf-lib.h" md_unwind_header=i386/linux-unwind.h ;; x86_64-*-kfreebsd*-gnu | x86_64-*-knetbsd*-gnu) extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" - tmake_file="${tmake_file} i386/t-crtpc i386/t-crtfm i386/t-crtstuff t-dfprules" + tmake_file="${tmake_file} i386/t-crtpc t-crtfm i386/t-crtstuff t-dfprules" tm_file="${tm_file} i386/elf-lib.h" ;; i[34567]86-pc-msdosdjgpp*) @@ -628,7 +628,7 @@ i[34567]86-*-rtems*) extra_parts="$extra_parts crti.o crtn.o" ;; i[34567]86-*-solaris2* | x86_64-*-solaris2.1[0-9]*) - tmake_file="$tmake_file i386/t-crtpc i386/t-crtfm" + tmake_file="$tmake_file i386/t-crtpc t-crtfm" extra_parts="$extra_parts crtprec32.o crtprec64.o crtprec80.o crtfastmath.o" tm_file="${tm_file} i386/elf-lib.h" md_unwind_header=i386/sol2-unwind.h @@ -652,7 +652,7 @@ i[34567]86-*-cygwin*) else tmake_dlldir_file="i386/t-dlldir-x" fi - tmake_file="${tmake_file} ${tmake_eh_file} ${tmake_dlldir_file} i386/t-slibgcc-cygming i386/t-cygming i386/t-cygwin i386/t-crtfm i386/t-chkstk t-dfprules" + tmake_file="${tmake_file} ${tmake_eh_file} ${tmake_dlldir_file} i386/t-slibgcc-cygming i386/t-cygming i386/t-cygwin t-crtfm i386/t-chkstk t-dfprules" ;; x86_64-*-cygwin*) extra_parts="crtbegin.o crtbeginS.o crtend.o crtfastmath.o" @@ -672,7 +672,7 @@ x86_64-*-cygwin*) tmake_dlldir_file="i386/t-dlldir-x" fi # FIXME - dj - t-chkstk used to be in here, need a 64-bit version of that - tmake_file="${tmake_file} ${tmake_eh_file} ${tmake_dlldir_file} i386/t-slibgcc-cygming i386/t-cygming i386/t-cygwin i386/t-crtfm t-dfprules i386/t-chkstk" + tmake_file="${tmake_file} ${tmake_eh_file} ${tmake_dlldir_file} i386/t-slibgcc-cygming i386/t-cygming i386/t-cygwin t-crtfm t-dfprules i386/t-chkstk" ;; i[34567]86-*-mingw*) extra_parts="crtbegin.o crtend.o crtfastmath.o" @@ -700,7 +700,7 @@ i[34567]86-*-mingw*) else tmake_dlldir_file="i386/t-dlldir-x" fi - tmake_file="${tmake_file} ${tmake_eh_file} ${tmake_dlldir_file} i386/t-slibgcc-cygming i386/t-cygming i386/t-mingw32 i386/t-crtfm i386/t-chkstk t-dfprules" + tmake_file="${tmake_file} ${tmake_eh_file} ${tmake_dlldir_file} i386/t-slibgcc-cygming i386/t-cygming i386/t-mingw32 t-crtfm i386/t-chkstk t-dfprules" ;; x86_64-*-mingw*) case ${target_thread_file} in @@ -723,7 +723,7 @@ x86_64-*-mingw*) else tmake_dlldir_file="i386/t-dlldir-x" fi - tmake_file="${tmake_file} ${tmake_eh_file} ${tmake_dlldir_file} i386/t-slibgcc-cygming i386/t-cygming i386/t-mingw32 t-dfprules i386/t-crtfm i386/t-chkstk" + tmake_file="${tmake_file} ${tmake_eh_file} ${tmake_dlldir_file} i386/t-slibgcc-cygming i386/t-cygming i386/t-mingw32 t-dfprules t-crtfm i386/t-chkstk" extra_parts="$extra_parts crtbegin.o crtend.o crtfastmath.o" if test x$enable_vtable_verify = xyes; then extra_parts="$extra_parts vtv_start.o vtv_end.o vtv_start_preinit.o vtv_end_preinit.o" diff --git a/libgcc/config/i386/crtfastmath.c b/libgcc/config/i386/crtfastmath.c index a0916ac8dcf..a6cae01d3f0 100644 --- a/libgcc/config/i386/crtfastmath.c +++ b/libgcc/config/i386/crtfastmath.c @@ -29,15 +29,57 @@ /* All 64-bit targets have SSE and DAZ; only check them explicitly for 32-bit ones. */ #include "cpuid.h" -#endif -static void __attribute__((constructor)) -#ifndef __x86_64__ +__attribute__ ((target("fxsr,sse"))) +static void /* The i386 ABI only requires 4-byte stack alignment, so this is necessary to make sure the fxsave struct gets correct alignment. See PR27537 and PR28621. */ __attribute__ ((force_align_arg_pointer)) +set_fast_math_sse (unsigned int edx) +{ + unsigned int mxcsr; + + if (edx & bit_FXSAVE) + { + /* Check if DAZ is available. */ + struct + { + unsigned short cwd; + unsigned short swd; + unsigned short twd; + unsigned short fop; + unsigned int fip; + unsigned int fcs; + unsigned int foo; + unsigned int fos; + unsigned int mxcsr; + unsigned int mxcsr_mask; + unsigned int st_space[32]; + unsigned int xmm_space[32]; + unsigned int padding[56]; + } __attribute__ ((aligned (16))) fxsave; + + /* This is necessary since some implementations of FXSAVE + do not modify reserved areas within the image. */ + fxsave.mxcsr_mask = 0; + + __builtin_ia32_fxsave (&fxsave); + + mxcsr = fxsave.mxcsr; + + if (fxsave.mxcsr_mask & MXCSR_DAZ) + mxcsr |= MXCSR_DAZ; + } + else + mxcsr = __builtin_ia32_stmxcsr (); + + mxcsr |= MXCSR_FTZ; + __builtin_ia32_ldmxcsr (mxcsr); +} #endif + +static void __attribute__((constructor)) set_fast_math (void) { #ifndef __x86_64__ @@ -47,46 +89,7 @@ set_fast_math (void) return; if (edx & bit_SSE) - { - unsigned int mxcsr; - - if (edx & bit_FXSAVE) - { - /* Check if DAZ is available. */ - struct - { - unsigned short cwd; - unsigned short swd; - unsigned short twd; - unsigned short fop; - unsigned int fip; - unsigned int fcs; - unsigned int foo; - unsigned int fos; - unsigned int mxcsr; - unsigned int mxcsr_mask; - unsigned int st_space[32]; - unsigned int xmm_space[32]; - unsigned int padding[56]; - } __attribute__ ((aligned (16))) fxsave; - - /* This is necessary since some implementations of FXSAVE - do not modify reserved areas within the image. */ - fxsave.mxcsr_mask = 0; - - __builtin_ia32_fxsave (&fxsave); - - mxcsr = fxsave.mxcsr; - - if (fxsave.mxcsr_mask & MXCSR_DAZ) - mxcsr |= MXCSR_DAZ; - } - else - mxcsr = __builtin_ia32_stmxcsr (); - - mxcsr |= MXCSR_FTZ; - __builtin_ia32_ldmxcsr (mxcsr); - } + set_fast_math_sse (edx); #else unsigned int mxcsr = __builtin_ia32_stmxcsr (); mxcsr |= MXCSR_DAZ | MXCSR_FTZ; diff --git a/libgcc/config/i386/t-crtfm b/libgcc/config/i386/t-crtfm deleted file mode 100644 index b9da06bfd20..00000000000 --- a/libgcc/config/i386/t-crtfm +++ /dev/null @@ -1,4 +0,0 @@ -# This is an endfile, Use -minline-all-stringops to ensure -# that __builtin_memset doesn't refer to the lib function memset(). -crtfastmath.o: $(srcdir)/config/i386/crtfastmath.c - $(gcc_compile) -mfxsr -msse -c $< -- 2.11.4.GIT