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