summaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2015-05-22 14:39:22 +0000
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>2015-05-22 14:39:22 +0000
commit2a8549e09ffc441b653d4111b0f973e521c39216 (patch)
tree45d5d3882feb0b4975fb480549b6ab1ac81d7fe4 /libgcc
parentd86303d8ff25a5a4a9cd9121288838d85249153a (diff)
downloadgcc-2a8549e09ffc441b653d4111b0f973e521c39216.tar.gz
* 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
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog8
-rw-r--r--libgcc/config.host22
-rw-r--r--libgcc/config/i386/crtfastmath.c89
-rw-r--r--libgcc/config/i386/t-crtfm4
4 files changed, 65 insertions, 58 deletions
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 <ubizjak@gmail.com>
+
+ * 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 <amodra@gmail.com>
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 $<