Hello! Attached patch fixes some fallout from IEEE support and enables -mieee for alpha. Also, the patch removes -O0 from dg-additiona-options in IEEE testsuite, as this always override default optimization flag.
libgfortran/ChangeLog: 2014-07-02 Uros Bizjak <ubiz...@gmail.com> * configure.host (ieee_flags): Add -mieee for alpha*. * config/fpu-glibc.h (support_fpu_rounding_mode): Correctly handle GFC_FPE_UPWARD, GFC_FPE_DOWNWARD and GFC_FPE_TOWARDZERO. * config/fpu-aix.h (support_fpu_rounding_mode): Ditto. testsuite/ChangeLog: 2014-07-02 Uros Bizjak <ubiz...@gmail.com> * gfortran.dg/ieee/ieee_1.F90 (dg-additional-options): Remove -O0. * gfortran.dg/ieee/ieee_rounding_1.f90 (dg-additional-options): Add. Patch was tested on alphaev68-linux-gnu (uses fpu-glibc.h) and x86_64-linux-gnu. Patch was committed to mainline SVN. BTW: On alpha, it is possible to enable underflow handling: #ifdef __USE_GNU /* On later hardware, and later kernels for earlier hardware, we can forcibly underflow denormal inputs and outputs. This can speed up certain programs significantly, usually without affecting accuracy. */ enum { FE_MAP_DMZ = 1UL << 12, /* Map denorm inputs to zero */ #define FE_MAP_DMZ FE_MAP_DMZ FE_MAP_UMZ = 1UL << 13, /* Map underflowed outputs to zero */ #define FE_MAP_UMZ FE_MAP_UMZ }; #endif FX, if you care for this option, I can help test the patch and corresponding testcases. Uros.
Index: libgfortran/configure.host =================================================================== --- libgfortran/configure.host (revision 212221) +++ libgfortran/configure.host (working copy) @@ -48,6 +48,8 @@ esac # Some targets require additional compiler options for NaN/Inf. ieee_flags= case "${host_cpu}" in + alpha*) + ieee_flags="-mieee" ;; sh*) ieee_flags="-mieee" ;; esac Index: libgfortran/config/fpu-aix.h =================================================================== --- libgfortran/config/fpu-aix.h (revision 212221) +++ libgfortran/config/fpu-aix.h (working copy) @@ -372,18 +372,21 @@ support_fpu_rounding_mode (int mode) return 0; #endif + case GFC_FPE_UPWARD: #ifdef FE_UPWARD return 1; #else return 0; #endif + case GFC_FPE_DOWNWARD: #ifdef FE_DOWNWARD return 1; #else return 0; #endif + case GFC_FPE_TOWARDZERO: #ifdef FE_TOWARDZERO return 1; #else Index: libgfortran/config/fpu-glibc.h =================================================================== --- libgfortran/config/fpu-glibc.h (revision 212221) +++ libgfortran/config/fpu-glibc.h (working copy) @@ -387,18 +387,21 @@ support_fpu_rounding_mode (int mode) return 0; #endif + case GFC_FPE_UPWARD: #ifdef FE_UPWARD return 1; #else return 0; #endif + case GFC_FPE_DOWNWARD: #ifdef FE_DOWNWARD return 1; #else return 0; #endif + case GFC_FPE_TOWARDZERO: #ifdef FE_TOWARDZERO return 1; #else Index: gcc/testsuite/gfortran.dg/ieee/ieee_1.F90 =================================================================== --- gcc/testsuite/gfortran.dg/ieee/ieee_1.F90 (revision 212221) +++ gcc/testsuite/gfortran.dg/ieee/ieee_1.F90 (working copy) @@ -1,5 +1,5 @@ ! { dg-do run } -! { dg-additional-options "-ffree-line-length-none -O0" } +! { dg-additional-options "-ffree-line-length-none" } ! ! Use dg-additional-options rather than dg-options to avoid overwriting the ! default IEEE options which are passed by ieee.exp and necessary. Index: gcc/testsuite/gfortran.dg/ieee/ieee_rounding_1.f90 =================================================================== --- gcc/testsuite/gfortran.dg/ieee/ieee_rounding_1.f90 (revision 212221) +++ gcc/testsuite/gfortran.dg/ieee/ieee_rounding_1.f90 (working copy) @@ -1,4 +1,5 @@ ! { dg-do run } +! { dg-additional-options "-mfp-rounding-mode=d" { target alpha*-*-* } } use, intrinsic :: ieee_features, only : ieee_rounding use, intrinsic :: ieee_arithmetic