From 7d30b888b5dee88c300e64ab6a6916ac069b0a68 Mon Sep 17 00:00:00 2001
From: Francois-Xavier Coudert <coudert@clipper.ens.fr>
Date: Fri, 31 Mar 2006 00:00:21 +0200
Subject: [PATCH] re PR libfortran/26712 (gfortran on mac intel runtime
 floating point exception when  printing)

	PR libfortran/26712
	* config/fpu-387.h: Add special case for handling of SSE
	control bit on i386-darwin.

From-SVN: r112546
---
 libgfortran/ChangeLog        |  6 ++++++
 libgfortran/config/fpu-387.h | 12 ++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index d082c073e647..4074c8c47bdc 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2006-03-30  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+	PR libfortran/26712
+	* config/fpu-387.h: Add special case for handling of SSE
+	control bit on i386-darwin.
+
 2006-03-30  Thomas Koenig  <Thomas.Koenig@online.de>
 
 	PR fortran/25031
diff --git a/libgfortran/config/fpu-387.h b/libgfortran/config/fpu-387.h
index bf9fbc8efced..5e3dec2d4df3 100644
--- a/libgfortran/config/fpu-387.h
+++ b/libgfortran/config/fpu-387.h
@@ -93,6 +93,17 @@ void set_fpu (void)
       /* SSE */
       asm volatile ("stmxcsr %0" : "=m" (cw_sse));
       cw_sse &= 0xFFFF0000;
+#ifdef __APPLE__
+      cw_sse |= (_FPU_MASK_IM | _FPU_MASK_DM | _FPU_MASK_ZM | _FPU_MASK_OM
+		 | _FPU_MASK_UM | _FPU_MASK_PM ) << 7;
+      if (options.fpe & GFC_FPE_INVALID) cw_sse &= ~(_FPU_MASK_IM << 7);
+      if (options.fpe & GFC_FPE_DENORMAL) cw_sse &= ~(_FPU_MASK_DM << 7);
+      if (options.fpe & GFC_FPE_ZERO) cw_sse &= ~(_FPU_MASK_ZM << 7);
+      if (options.fpe & GFC_FPE_OVERFLOW) cw_sse &= ~(_FPU_MASK_OM << 7);
+      if (options.fpe & GFC_FPE_UNDERFLOW) cw_sse &= ~(_FPU_MASK_UM << 7);
+      if (options.fpe & GFC_FPE_PRECISION) cw_sse &= ~(_FPU_MASK_PM << 7);
+      asm volatile ("ldmxcsr %0" : : "m" (cw_sse));
+#else
       if (options.fpe & GFC_FPE_INVALID) cw_sse |= 1 << 7;
       if (options.fpe & GFC_FPE_DENORMAL) cw_sse |= 1 << 8;
       if (options.fpe & GFC_FPE_ZERO) cw_sse |= 1 << 9;
@@ -100,5 +111,6 @@ void set_fpu (void)
       if (options.fpe & GFC_FPE_UNDERFLOW) cw_sse |= 1 << 11;
       if (options.fpe & GFC_FPE_PRECISION) cw_sse |= 1 << 12;
       asm volatile ("ldmxcsr %0" : : "m" (cw_sse));
+#endif
     }
 }
-- 
GitLab