aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorRainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>2011-07-13 17:33:38 +0000
committerRainer Orth <ro@gcc.gnu.org>2011-07-13 17:33:38 +0000
commit35d8090d78a398e73813e3c752e0468e69c96750 (patch)
tree43558081045fc254d40f3c818a030ebac045ba73 /libgcc
parent19073ebc7ad340bcbcfc9e47715f235a53e0dc73 (diff)
downloadgcc-35d8090d78a398e73813e3c752e0468e69c96750.zip
gcc-35d8090d78a398e73813e3c752e0468e69c96750.tar.gz
gcc-35d8090d78a398e73813e3c752e0468e69c96750.tar.bz2
crtfastmath.c: Move to ../libgcc/config/alpha.
gcc: * config/alpha/crtfastmath.c: Move to ../libgcc/config/alpha. * config/alpha/t-crtfm: Remove. * config/i386/crtfastmath.c: Move to ../libgcc/config/i386. * config/i386/t-crtfm: Remove. * config/ia64/crtfastmath.c: Move to ../libgcc/config/ia64. * config/mips/crtfastmath.c: Move to ../libgcc/config/mips. * config/sparc/crtfastmath.c: Move to ../libgcc/config/sparc. * config/sparc/t-crtfm: Remove. * config.gcc (alpha*-*-linux*): Remove alpha/t-crtfm from tmake_file. (alpha*-*-freebsd*): Likewise. (i[34567]86-*-darwin*): Remove i386/t-crtfm from tmake_file. (x86_64-*-darwin*): Likewise. (i[34567]86-*-linux*): Likewise. (x86_64-*-linux*): Likewise. (x86_64-*-mingw*): Likewise. (ia64*-*-elf*): Remove crtfastmath.o from extra_parts. (ia64*-*-freebsd*): Likewise. (ia64*-*-linux*): Likewise. (mips64*-*-linux*): Likewise. (mips*-*-linux*): Likewise. (sparc-*-linux*): Remove sparc/t-crtfm from tmake_file. (sparc64-*-linux*): Likewise. (sparc64-*-freebsd*): Likewise. libgcc: * config/alpha/crtfastmath.c: New file. * config/i386/crtfastmath.c: New file. * config/ia64/crtfastmath.c: New file. * config/mips/crtfastmath.c: New file. * config/sparc/crtfastmath.c: New file. * config/t-crtfm (crtfastmath.o): Use $(srcdir) to refer to crtfastmath.c. Add -frandom-seed=gcc-crtfastmath. * config/alpha/t-crtfm: Remove. * config/i386/t-crtfm: Use $(srcdir) to refer to crtfastmath.c. * config/ia64/t-ia64 (crtfastmath.o): Remove. * config.host (alpha*-*-linux*): Replace alpha/t-crtfm by t-crtfm. (alpha*-dec-osf5.1*): Likewise. (alpha*-*-freebsd*): Add t-crtfm to tmake_file. Add crtfastmath.o to extra_parts. (i[34567]86-*-darwin*): Add i386/t-crtfm to tmake_file. Add crtfastmath.o to extra_parts. (x86_64-*-darwin*): Likewise. (x86_64-*-mingw*): Likewise. (ia64*-*-elf*): Add t-crtfm to tmake_file. (ia64*-*-freebsd*): Likewise. (ia64*-*-linux*): Likewise. (sparc64-*-freebsd*): Add t-crtfm to tmake_file. Add crtfastmath.o to extra_parts. From-SVN: r176241
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog29
-rw-r--r--libgcc/config.host22
-rw-r--r--libgcc/config/alpha/crtfastmath.c36
-rw-r--r--libgcc/config/alpha/t-crtfm5
-rw-r--r--libgcc/config/i386/crtfastmath.c131
-rw-r--r--libgcc/config/i386/t-crtfm2
-rw-r--r--libgcc/config/ia64/crtfastmath.c34
-rw-r--r--libgcc/config/ia64/t-ia643
-rw-r--r--libgcc/config/mips/crtfastmath.c53
-rw-r--r--libgcc/config/sparc/crtfastmath.c44
-rw-r--r--libgcc/config/t-crtfm7
11 files changed, 348 insertions, 18 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index bfbf105..401287c 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,5 +1,34 @@
2011-07-13 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+ * config/alpha/crtfastmath.c: New file.
+ * config/i386/crtfastmath.c: New file.
+ * config/ia64/crtfastmath.c: New file.
+ * config/mips/crtfastmath.c: New file.
+ * config/sparc/crtfastmath.c: New file.
+
+ * config/t-crtfm (crtfastmath.o): Use $(srcdir) to refer to
+ crtfastmath.c.
+ Add -frandom-seed=gcc-crtfastmath.
+ * config/alpha/t-crtfm: Remove.
+ * config/i386/t-crtfm: Use $(srcdir) to refer to crtfastmath.c.
+ * config/ia64/t-ia64 (crtfastmath.o): Remove.
+
+ * config.host (alpha*-*-linux*): Replace alpha/t-crtfm by t-crtfm.
+ (alpha*-dec-osf5.1*): Likewise.
+ (alpha*-*-freebsd*): Add t-crtfm to tmake_file.
+ Add crtfastmath.o to extra_parts.
+ (i[34567]86-*-darwin*): Add i386/t-crtfm to tmake_file.
+ Add crtfastmath.o to extra_parts.
+ (x86_64-*-darwin*): Likewise.
+ (x86_64-*-mingw*): Likewise.
+ (ia64*-*-elf*): Add t-crtfm to tmake_file.
+ (ia64*-*-freebsd*): Likewise.
+ (ia64*-*-linux*): Likewise.
+ (sparc64-*-freebsd*): Add t-crtfm to tmake_file.
+ Add crtfastmath.o to extra_parts.
+
+2011-07-13 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
* config/darwin-crt3.o: New file.
* config/rs6000/darwin-crt2.c: New file.
* config/t-darwin: New file.
diff --git a/libgcc/config.host b/libgcc/config.host
index 56ce998..fba7ecd 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -224,18 +224,20 @@ esac
case ${host} in
alpha*-*-linux*)
- tmake_file="${tmake_file} alpha/t-crtfm"
+ tmake_file="${tmake_file} t-crtfm"
extra_parts="$extra_parts crtfastmath.o"
md_unwind_header=alpha/linux-unwind.h
;;
alpha*-*-freebsd*)
+ tmake_file="${tmake_file} t-crtfm"
+ extra_parts="$extra_parts crtfastmath.o"
;;
alpha*-*-netbsd*)
;;
alpha*-*-openbsd*)
;;
alpha*-dec-osf5.1*)
- tmake_file="${tmake_file} alpha/t-alpha alpha/t-ieee alpha/t-crtfm t-slibgcc alpha/t-slibgcc-osf"
+ tmake_file="${tmake_file} alpha/t-alpha alpha/t-ieee t-crtfm t-slibgcc alpha/t-slibgcc-osf"
case ${target_thread_file} in
posix)
tmake_file="${tmake_file} alpha/t-osf-pthread"
@@ -323,9 +325,12 @@ hppa[12]*-*-hpux11*)
md_unwind_header=pa/hpux-unwind.h
;;
i[34567]86-*-darwin*)
+ tmake_file="$tmake_file i386/t-crtfm"
+ extra_parts="$extra_parts crtfastmath.o"
;;
x86_64-*-darwin*)
- tmake_file="t-darwin ${cpu_type}/t-darwin64 t-slibgcc-darwin"
+ tmake_file="t-darwin ${cpu_type}/t-darwin64 i386/t-crtfm t-slibgcc-darwin"
+ extra_parts="$extra_parts crtfastmath.o"
;;
i[34567]86-*-elf*)
;;
@@ -398,21 +403,22 @@ i[34567]86-*-mingw*)
md_unwind_header=i386/w32-unwind.h
;;
x86_64-*-mingw*)
- tmake_file=t-dfprules
+ tmake_file="t-dfprules i386/t-crtfm"
+ extra_parts="$extra_parts crtfastmath.o"
;;
i[34567]86-*-interix3*)
;;
ia64*-*-elf*)
extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
- tmake_file="ia64/t-ia64"
+ tmake_file="ia64/t-ia64 t-crtfm"
;;
ia64*-*-freebsd*)
extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
- tmake_file="ia64/t-ia64"
+ tmake_file="ia64/t-ia64 t-crtfm"
;;
ia64*-*-linux*)
extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
- tmake_file="ia64/t-ia64 t-softfp ia64/t-fprules-softfp ia64/t-softfp-compat"
+ tmake_file="ia64/t-ia64 t-crtfm t-softfp ia64/t-fprules-softfp ia64/t-softfp-compat"
md_unwind_header=ia64/linux-unwind.h
;;
ia64*-*-hpux*)
@@ -644,6 +650,8 @@ sparc64-*-elf*)
sparc-wrs-vxworks)
;;
sparc64-*-freebsd*|ultrasparc-*-freebsd*)
+ tmake_file="$tmake_file t-crtfm"
+ extra_parts=crtfastmath.o
;;
sparc64-*-linux*) # 64-bit SPARC's running GNU/Linux
extra_parts="$extra_parts crtfastmath.o"
diff --git a/libgcc/config/alpha/crtfastmath.c b/libgcc/config/alpha/crtfastmath.c
new file mode 100644
index 0000000..677b9ed
--- /dev/null
+++ b/libgcc/config/alpha/crtfastmath.c
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2001, 2009 Free Software Foundation, Inc.
+ * Contributed by Richard Henderson (rth@redhat.com)
+ *
+ * This file 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.
+ *
+ * This file 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
+ * <http://www.gnu.org/licenses/>.
+ */
+
+/* Assume OSF/1 compatible interfaces. */
+
+extern void __ieee_set_fp_control (unsigned long int);
+
+#define IEEE_MAP_DMZ (1UL<<12) /* Map denorm inputs to zero */
+#define IEEE_MAP_UMZ (1UL<<13) /* Map underflowed outputs to zero */
+
+static void __attribute__((constructor))
+set_fast_math (void)
+{
+ __ieee_set_fp_control (IEEE_MAP_DMZ | IEEE_MAP_UMZ);
+}
diff --git a/libgcc/config/alpha/t-crtfm b/libgcc/config/alpha/t-crtfm
deleted file mode 100644
index 5060c15..0000000
--- a/libgcc/config/alpha/t-crtfm
+++ /dev/null
@@ -1,5 +0,0 @@
-# FIXME drow/20061228 - I have preserved this -frandom-seed option
-# while migrating this rule from the GCC directory, but I do not
-# know why it is necessary if no other crt file uses it.
-crtfastmath.o: $(gcc_srcdir)/config/alpha/crtfastmath.c
- $(gcc_compile) -frandom-seed=gcc-crtfastmath -c $<
diff --git a/libgcc/config/i386/crtfastmath.c b/libgcc/config/i386/crtfastmath.c
new file mode 100644
index 0000000..7abe500
--- /dev/null
+++ b/libgcc/config/i386/crtfastmath.c
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2005, 2007, 2009, 2011 Free Software Foundation, Inc.
+ *
+ * This file 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.
+ *
+ * This file 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
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#define MXCSR_DAZ (1 << 6) /* Enable denormals are zero mode */
+#define MXCSR_FTZ (1 << 15) /* Enable flush to zero mode */
+
+#ifndef __x86_64__
+/* All 64-bit targets have SSE and DAZ;
+ only check them explicitly for 32-bit ones. */
+#include "cpuid.h"
+#endif
+
+#if !defined __x86_64__ && defined __sun__ && defined __svr4__
+#include <signal.h>
+#include <ucontext.h>
+
+static volatile sig_atomic_t sigill_caught;
+
+static void
+sigill_hdlr (int sig __attribute((unused)),
+ siginfo_t *sip __attribute__((unused)),
+ ucontext_t *ucp)
+{
+ sigill_caught = 1;
+ /* Set PC to the instruction after the faulting one to skip over it,
+ otherwise we enter an infinite loop. 3 is the size of the movaps
+ instruction. */
+ ucp->uc_mcontext.gregs[EIP] += 3;
+ setcontext (ucp);
+}
+#endif
+
+static void __attribute__((constructor))
+#ifndef __x86_64__
+/* 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))
+#endif
+set_fast_math (void)
+{
+#ifndef __x86_64__
+ unsigned int eax, ebx, ecx, edx;
+
+ if (!__get_cpuid (1, &eax, &ebx, &ecx, &edx))
+ return;
+
+ if (edx & bit_SSE)
+ {
+ unsigned int mxcsr;
+
+#if defined __sun__ && defined __svr4__
+ /* Solaris 2 before Solaris 9 4/04 cannot execute SSE instructions even
+ if the CPU supports them. Programs receive SIGILL instead, so check
+ for that at runtime. */
+ struct sigaction act, oact;
+
+ act.sa_handler = sigill_hdlr;
+ sigemptyset (&act.sa_mask);
+ /* Need to set SA_SIGINFO so a ucontext_t * is passed to the handler. */
+ act.sa_flags = SA_SIGINFO;
+ sigaction (SIGILL, &act, &oact);
+
+ /* We need a single SSE instruction here so the handler can safely skip
+ over it. */
+ __asm__ volatile ("movaps %xmm0,%xmm0");
+
+ sigaction (SIGILL, &oact, NULL);
+
+ if (sigill_caught)
+ return;
+#endif /* __sun__ && __svr4__ */
+
+ mxcsr = __builtin_ia32_stmxcsr () | MXCSR_FTZ;
+
+ if (edx & bit_FXSAVE)
+ {
+ /* Check if DAZ is available. */
+ struct
+ {
+ unsigned short int cwd;
+ unsigned short int swd;
+ unsigned short int twd;
+ unsigned short int fop;
+ long int fip;
+ long int fcs;
+ long int foo;
+ long int fos;
+ long int mxcsr;
+ long int mxcsr_mask;
+ long int st_space[32];
+ long int xmm_space[32];
+ long int padding[56];
+ } __attribute__ ((aligned (16))) fxsave;
+
+ __builtin_memset (&fxsave, 0, sizeof (fxsave));
+
+ asm volatile ("fxsave %0" : "=m" (fxsave) : "m" (fxsave));
+
+ if (fxsave.mxcsr_mask & MXCSR_DAZ)
+ mxcsr |= MXCSR_DAZ;
+ }
+
+ __builtin_ia32_ldmxcsr (mxcsr);
+ }
+#else
+ unsigned int mxcsr = __builtin_ia32_stmxcsr ();
+ mxcsr |= MXCSR_DAZ | MXCSR_FTZ;
+ __builtin_ia32_ldmxcsr (mxcsr);
+#endif
+}
diff --git a/libgcc/config/i386/t-crtfm b/libgcc/config/i386/t-crtfm
index f71f99a..46ce70b 100644
--- a/libgcc/config/i386/t-crtfm
+++ b/libgcc/config/i386/t-crtfm
@@ -1,4 +1,4 @@
# This is an endfile, Use -minline-all-stringops to ensure
# that __builtin_memset doesn't refer to the lib function memset().
-crtfastmath.o: $(gcc_srcdir)/config/i386/crtfastmath.c
+crtfastmath.o: $(srcdir)/config/i386/crtfastmath.c
$(gcc_compile) -msse -minline-all-stringops -c $<
diff --git a/libgcc/config/ia64/crtfastmath.c b/libgcc/config/ia64/crtfastmath.c
new file mode 100644
index 0000000..0decd2a
--- /dev/null
+++ b/libgcc/config/ia64/crtfastmath.c
@@ -0,0 +1,34 @@
+/* Copyright (C) 2001, 2005, 2009 Free Software Foundation, Inc.
+ Contributed by David Mosberger <davidm@hpl.hp.com>.
+
+ 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
+ <http://www.gnu.org/licenses/>. */
+
+/* We could call fesetenv() here but that would create a confusing
+ dependency on libm (since that is where fesetenv() gets defined.
+ To avoid this, just do everything locally. */
+#define FE_NONIEEE_ENV 0x0009a04d0270037f
+
+static void __attribute__((constructor))
+__ia64_set_fast_math (void)
+{
+ __asm__ __volatile__ ("mov.m ar.fpsr=%0" : : "r"(FE_NONIEEE_ENV));
+}
diff --git a/libgcc/config/ia64/t-ia64 b/libgcc/config/ia64/t-ia64
index d9c7566..3ec5fc5 100644
--- a/libgcc/config/ia64/t-ia64
+++ b/libgcc/config/ia64/t-ia64
@@ -13,6 +13,3 @@ crtbeginS.o: $(gcc_srcdir)/config/ia64/crtbegin.asm
crtendS.o: $(gcc_srcdir)/config/ia64/crtend.asm
$(CC) $(compile_deps) -I. -I$(gcc_objdir) -c -x assembler-with-cpp \
-o $@ -DSHARED $(gcc_srcdir)/config/ia64/crtend.asm
-
-crtfastmath.o: $(gcc_srcdir)/config/ia64/crtfastmath.c
- $(gcc_compile) -c $(gcc_srcdir)/config/ia64/crtfastmath.c
diff --git a/libgcc/config/mips/crtfastmath.c b/libgcc/config/mips/crtfastmath.c
new file mode 100644
index 0000000..a9586b0
--- /dev/null
+++ b/libgcc/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 <http://www.gnu.org/licenses/>. */
+
+#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/libgcc/config/sparc/crtfastmath.c b/libgcc/config/sparc/crtfastmath.c
new file mode 100644
index 0000000..04727ec
--- /dev/null
+++ b/libgcc/config/sparc/crtfastmath.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2001, 2009 Free Software Foundation, Inc.
+ * Contributed by David S. Miller (davem@redhat.com)
+ *
+ * This file 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.
+ *
+ * This file 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
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#define FPRS_NS (1 << 22) /* Non-Standard fpu results */
+
+static void __attribute__((constructor))
+set_fast_math (void)
+{
+ unsigned int fsr;
+
+ /* This works for the 64-bit case because, even if 32-bit ld/st of
+ the fsr register modified the upper 32-bit, the only thing up there
+ are the 3 other condition codes which are "do not care" at the time
+ that this runs. */
+
+ __asm__("st %%fsr, %0"
+ : "=m" (fsr));
+
+ fsr |= FPRS_NS;
+
+ __asm__("ld %0, %%fsr"
+ : : "m" (fsr));
+}
diff --git a/libgcc/config/t-crtfm b/libgcc/config/t-crtfm
index 6b9d84c..1d3b8ec 100644
--- a/libgcc/config/t-crtfm
+++ b/libgcc/config/t-crtfm
@@ -1,2 +1,5 @@
-crtfastmath.o: $(gcc_srcdir)/config/$(cpu_type)/crtfastmath.c
- $(gcc_compile) -c $<
+# -frandom-seed is necessary to avoid bootstrap comparison failures due to
+# changing mangled names of the constructor on Tru64 Unix, but harmless
+# otherwise.
+crtfastmath.o: $(srcdir)/config/$(cpu_type)/crtfastmath.c
+ $(gcc_compile) -frandom-seed=gcc-crtfastmath -c $<