]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR libfortran/35862 ([F2003] Implement new rounding modes for run time)
authorTobias Burnus <burnus@net-b.de>
Sun, 21 Jul 2013 11:54:27 +0000 (13:54 +0200)
committerTobias Burnus <burnus@gcc.gnu.org>
Sun, 21 Jul 2013 11:54:27 +0000 (13:54 +0200)
2013-07-21  Tobias Burnus  <burnus@net-b.de>

        PR fortran/35862
        * libgfortran.h (GFC_FPE_DOWNWARD, GFC_FPE_TONEAREST,
        GFC_FPE_TOWARDZERO, GFC_FPE_UPWARD): New defines.

2013-07-21  Tobias Burnus  <burnus@net-b.de>

        PR fortran/35862
        * libgfortran.h (set_fpu_rounding_mode,
        get_fpu_rounding_mode): New prototypes.
        * config/fpu-387.h (set_fpu_rounding_mode,
        get_fpu_rounding_mode): New functions.
        * config/fpu-aix.h (set_fpu_rounding_mode,
        get_fpu_rounding_mode): Ditto.
        * config/fpu-generic.h (set_fpu_rounding_mode,
        get_fpu_rounding_mode): Ditto.
        * config/fpu-glibc.h (set_fpu_rounding_mode,
        get_fpu_rounding_mode): Ditto.
        * config/fpu-sysv.h (set_fpu_rounding_mode,
        get_fpu_rounding_mode): Ditto.
        * configure.ac: Check for fp_rnd and fp_rnd_t.
        * io/io.h (enum unit_round): Use GFC_FPE_* for the value.
        * io/read.c (convert_real): Set FP ronding mode.
        * Makefile.in: Regenerate.
        * aclocal.m4: Regenerate.
        * config.h.in: Regenerate.
        * configure: Regenerate.

2013-07-21  Tobias Burnus  <burnus@net-b.de>

        PR fortran/35862
        * gfortran.dg/round_4.f90: New.

Co-Authored-By: Uros Bizjak <ubizjak@gmail.com>
From-SVN: r201093

18 files changed:
gcc/fortran/ChangeLog
gcc/fortran/libgfortran.h
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/round_4.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/Makefile.in
libgfortran/aclocal.m4
libgfortran/config.h.in
libgfortran/config/fpu-387.h
libgfortran/config/fpu-aix.h
libgfortran/config/fpu-generic.h
libgfortran/config/fpu-glibc.h
libgfortran/config/fpu-sysv.h
libgfortran/configure
libgfortran/configure.ac
libgfortran/io/io.h
libgfortran/io/read.c
libgfortran/libgfortran.h

index 3e4ecb8e74a0f2e0b91dd092af54edf6abcfaf50..785cf42e9e885d3182ae5d9c3955097002ef0a15 100644 (file)
@@ -1,3 +1,9 @@
+2013-07-21  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/35862
+       * libgfortran.h (GFC_FPE_DOWNWARD, GFC_FPE_TONEAREST,
+       GFC_FPE_TOWARDZERO, GFC_FPE_UPWARD): New defines.
+
 2013-07-21  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/57894
index 30b3b7bcee7275882d14911b0d6f2e70458c860c..fce52942c88df08164efad6b3127fed89ec25c66 100644 (file)
@@ -43,6 +43,12 @@ along with GCC; see the file COPYING3.  If not see
 #define GFC_FPE_UNDERFLOW  (1<<4)
 #define GFC_FPE_INEXACT    (1<<5)
 
+/* Defines for floating-point rounding modes.  */
+#define GFC_FPE_DOWNWARD   1
+#define GFC_FPE_TONEAREST  2
+#define GFC_FPE_TOWARDZERO 3
+#define GFC_FPE_UPWARD     4
+
 
 /* Bitmasks for the various runtime checks that can be enabled.  */
 #define GFC_RTCHECK_BOUNDS      (1<<0)
index ad1d2749146c93af292808fe091e764a4fa9a3df..cf6cef65b8cadce46b5cdf716475239e1cb36fb8 100644 (file)
@@ -1,3 +1,8 @@
+2013-07-21  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/35862
+       * gfortran.dg/round_4.f90: New.
+
 2013-07-21  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/57894
diff --git a/gcc/testsuite/gfortran.dg/round_4.f90 b/gcc/testsuite/gfortran.dg/round_4.f90
new file mode 100644 (file)
index 0000000..8a7d95b
--- /dev/null
@@ -0,0 +1,102 @@
+! { dg-do run }
+! { dg-add-options ieee }
+!
+! PR fortran/35862
+!
+! Test whether I/O rounding works. Uses internally (libgfortran) strtod
+! for the conversion - and sets the CPU rounding mode accordingly.
+!
+! If it doesn't work on your system, please check whether strtod handles
+! rounding and whether your system is supported in libgfortran/config/fpu*.c
+!
+! Please only add ... run { target { ! { triplets } } } if it is unfixable
+! on your target - and a note why (strtod doesn't handle it, no rounding
+! support, etc.)
+!
+program main
+  use iso_fortran_env
+  implicit none
+
+  ! The following uses kinds=10 and 16 if available or
+  ! 8 and 10 - or 8 and 16 - or 4 and 8.
+  integer, parameter :: xp = real_kinds(ubound(real_kinds,dim=1)-1)
+  integer, parameter :: qp = real_kinds(ubound(real_kinds,dim=1))
+
+  real(4) :: r4p, r4m, ref4u, ref4d
+  real(8) :: r8p, r8m, ref8u, ref8d
+  real(xp) :: r10p, r10m, ref10u, ref10d
+  real(qp) :: r16p, r16m, ref16u, ref16d
+  character(len=20) :: str, round
+
+  ref4u = 0.100000001_4
+  ref8u = 0.10000000000000001_8
+
+  if (xp == 4) then
+    ref10u = 0.100000001_xp
+  elseif (xp == 8) then
+    ref10u = 0.10000000000000001_xp
+  else ! xp == 10
+    ref10u = 0.1000000000000000000014_xp
+  end if
+
+  if (qp == 8) then
+    ref16u = 0.10000000000000001_qp
+  elseif (qp == 10) then
+    ref16u = 0.1000000000000000000014_qp
+  else ! qp == 16
+    ref16u = 0.10000000000000000000000000000000000481_qp
+  end if
+
+ ! ref*d = 9.999999...
+ ref4d = nearest (ref4u, -1.0_4)
+ ref8d = nearest (ref8u, -1.0_8)
+ ref10d = nearest (ref10u, -1.0_xp)
+ ref16d = nearest (ref16u, -1.0_qp)
+
+  round = 'up'
+  call t()
+  if (r4p  /= ref4u  .or. r4m  /= -ref4d)  call abort()
+  if (r8p  /= ref8u  .or. r8m  /= -ref8d)  call abort()
+  if (r10p /= ref10u .or. r10m /= -ref10d) call abort()
+  if (r16p /= ref16u .or. r16m /= -ref16d) call abort()
+
+  round = 'down'
+  call t()
+  if (r4p  /= ref4d  .or. r4m  /= -ref4u)  call abort()
+  if (r8p  /= ref8d  .or. r8m  /= -ref8u)  call abort()
+  if (r10p /= ref10d .or. r10m /= -ref10u) call abort()
+  if (r16p /= ref16d .or. r16m /= -ref16u) call abort()
+
+  round = 'zero'
+  call t()
+  if (r4p  /= ref4d  .or. r4m  /= -ref4d)  call abort()
+  if (r8p  /= ref8d  .or. r8m  /= -ref8d)  call abort()
+  if (r10p /= ref10d .or. r10m /= -ref10d) call abort()
+  if (r16p /= ref16d .or. r16m /= -ref16d) call abort()
+
+  round = 'nearest'
+  call t()
+  if (r4p  /= ref4u  .or. r4m  /= -ref4u)  call abort()
+  if (r8p  /= ref8u  .or. r8m  /= -ref8u)  call abort()
+  if (r10p /= ref10u .or. r10m /= -ref10u) call abort()
+  if (r16p /= ref16u .or. r16m /= -ref16u) call abort()
+
+! Same as nearest (but rounding towards zero if there is a tie
+! [does not apply here])
+  round = 'compatible'
+  call t()
+  if (r4p  /= ref4u  .or. r4m  /= -ref4u)  call abort()
+  if (r8p  /= ref8u  .or. r8m  /= -ref8u)  call abort()
+  if (r10p /= ref10u .or. r10m /= -ref10u) call abort()
+  if (r16p /= ref16u .or. r16m /= -ref16u) call abort()
+contains
+  subroutine t()
+!    print *, round
+    str = "0.1 0.1 0.1 0.1"
+    read (str, *,round=round) r4p, r8p, r10p, r16p
+!    write (*, '(*(g0:"  "))') r4p, r8p, r10p, r16p
+    str = "-0.1 -0.1 -0.1 -0.1"
+    read (str, *,round=round) r4m, r8m, r10m, r16m
+!    write (*, *) r4m, r8m, r10m, r16m
+  end subroutine t
+end program main
index e6c2fad3f02b078d2d9f5095f2c3abdf5b00913a..eacb01b62d5420ef6487e83b8040c87774622090 100644 (file)
@@ -1,3 +1,27 @@
+2013-07-21  Tobias Burnus  <burnus@net-b.de>
+           Uros Bizjak  <ubizjak@gmail.com>
+
+       PR fortran/35862
+       * libgfortran.h (set_fpu_rounding_mode,
+       get_fpu_rounding_mode): New prototypes.
+       * config/fpu-387.h (set_fpu_rounding_mode,
+       get_fpu_rounding_mode): New functions.
+       * config/fpu-aix.h (set_fpu_rounding_mode,
+       get_fpu_rounding_mode): Ditto.
+       * config/fpu-generic.h (set_fpu_rounding_mode,
+       get_fpu_rounding_mode): Ditto.
+       * config/fpu-glibc.h (set_fpu_rounding_mode,
+       get_fpu_rounding_mode): Ditto.
+       * config/fpu-sysv.h (set_fpu_rounding_mode,
+       get_fpu_rounding_mode): Ditto.
+       * configure.ac: Check for fp_rnd and fp_rnd_t.
+       * io/io.h (enum unit_round): Use GFC_FPE_* for the value.
+       * io/read.c (convert_real): Set FP ronding mode.
+       * Makefile.in: Regenerate.
+       * aclocal.m4: Regenerate.
+       * config.h.in: Regenerate.
+       * configure: Regenerate.
+
 2013-06-24  Tobias Burnus  <burnus@net-b.de>
 
        * configure.ac: Check for fp_except and fp_except_t.
index 62b9f7abffa97e706cab150798e9b2283929ca18..aa23e85e37b06a3a5309efa7df32d5e96517df54 100644 (file)
@@ -1,9 +1,9 @@
-# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-# Foundation, Inc.
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,
+# Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -87,12 +87,6 @@ am__nobase_list = $(am__nobase_strip_setup); \
 am__base_list = \
   sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
   sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
 am__installdirs = "$(DESTDIR)$(cafexeclibdir)" \
        "$(DESTDIR)$(myexeclibdir)" "$(DESTDIR)$(toolexeclibdir)" \
        "$(DESTDIR)$(toolexeclibdir)"
@@ -1282,7 +1276,7 @@ all: $(BUILT_SOURCES) config.h
 
 .SUFFIXES:
 .SUFFIXES: .F90 .c .f90 .lo .o .obj
-am--refresh: Makefile
+am--refresh:
        @:
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
        @for dep in $?; do \
@@ -1318,8 +1312,10 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 
 config.h: stamp-h1
-       @if test ! -f $@; then rm -f stamp-h1; else :; fi
-       @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
+       @if test ! -f $@; then \
+         rm -f stamp-h1; \
+         $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
+       else :; fi
 
 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
        @rm -f stamp-h1
@@ -1426,11 +1422,11 @@ clean-toolexeclibLTLIBRARIES:
          echo "rm -f \"$${dir}/so_locations\""; \
          rm -f "$${dir}/so_locations"; \
        done
-libcaf_single.la: $(libcaf_single_la_OBJECTS) $(libcaf_single_la_DEPENDENCIES) $(EXTRA_libcaf_single_la_DEPENDENCIES) 
+libcaf_single.la: $(libcaf_single_la_OBJECTS) $(libcaf_single_la_DEPENDENCIES) 
        $(libcaf_single_la_LINK) -rpath $(cafexeclibdir) $(libcaf_single_la_OBJECTS) $(libcaf_single_la_LIBADD) $(LIBS)
-libgfortran.la: $(libgfortran_la_OBJECTS) $(libgfortran_la_DEPENDENCIES) $(EXTRA_libgfortran_la_DEPENDENCIES) 
+libgfortran.la: $(libgfortran_la_OBJECTS) $(libgfortran_la_DEPENDENCIES) 
        $(libgfortran_la_LINK) -rpath $(toolexeclibdir) $(libgfortran_la_OBJECTS) $(libgfortran_la_LIBADD) $(LIBS)
-libgfortranbegin.la: $(libgfortranbegin_la_OBJECTS) $(libgfortranbegin_la_DEPENDENCIES) $(EXTRA_libgfortranbegin_la_DEPENDENCIES) 
+libgfortranbegin.la: $(libgfortranbegin_la_OBJECTS) $(libgfortranbegin_la_DEPENDENCIES) 
        $(libgfortranbegin_la_LINK) -rpath $(myexeclibdir) $(libgfortranbegin_la_OBJECTS) $(libgfortranbegin_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
@@ -5690,7 +5686,9 @@ uninstall-toolexeclibDATA:
        @$(NORMAL_UNINSTALL)
        @list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
        files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
-       dir='$(DESTDIR)$(toolexeclibdir)'; $(am__uninstall_files_from_dir)
+       test -n "$$files" || exit 0; \
+       echo " ( cd '$(DESTDIR)$(toolexeclibdir)' && rm -f" $$files ")"; \
+       cd "$(DESTDIR)$(toolexeclibdir)" && rm -f $$files
 
 ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
        list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -5762,15 +5760,10 @@ install-am: all-am
 
 installcheck: installcheck-am
 install-strip:
-       if test -z '$(STRIP)'; then \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-             install; \
-       else \
-         $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-           install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-           "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
-       fi
+       $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+         install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+         `test -z '$(STRIP)' || \
+           echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
 mostlyclean-generic:
 
 clean-generic:
index 351be9d255ab932d679f68a0270998a6b7c1c0b8..8673daa1a9d7d788aad4db25943230da0815944f 100644 (file)
@@ -1,8 +1,7 @@
-# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
+# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
-# Inc.
+# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -20,15 +19,12 @@ You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically `autoreconf'.])])
 
-# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
-# Foundation, Inc.
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 1
-
 # AM_AUTOMAKE_VERSION(VERSION)
 # ----------------------------
 # Automake X.Y traces this macro to ensure aclocal.m4 has been
@@ -38,7 +34,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
 [am__api_version='1.11'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.11.3], [],
+m4_if([$1], [1.11.1], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -54,21 +50,19 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.11.3])dnl
+[AM_AUTOMAKE_VERSION([1.11.1])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 1
-
 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
 # $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
 # `$srcdir', `$srcdir/..', or `$srcdir/../..'.
@@ -150,14 +144,14 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
-# 2010, 2011 Free Software Foundation, Inc.
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009
+# Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 12
+# serial 10
 
 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
 # written in clear, in which case automake, when reading aclocal.m4,
@@ -197,7 +191,6 @@ AC_CACHE_CHECK([dependency style of $depcc],
   # instance it was reported that on HP-UX the gcc test will end up
   # making a dummy file named `D' -- because `-MD' means `put the output
   # in D'.
-  rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
   # using a relative directory.
@@ -262,7 +255,7 @@ AC_CACHE_CHECK([dependency style of $depcc],
        break
       fi
       ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+    msvisualcpp | msvcmsys)
       # This compiler won't grok `-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
@@ -327,13 +320,10 @@ AC_DEFUN([AM_DEP_TRACK],
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
-  am__nodep='_no'
 fi
 AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
 AC_SUBST([AMDEPBACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-AC_SUBST([am__nodep])dnl
-_AM_SUBST_NOTMAKE([am__nodep])dnl
 ])
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
@@ -555,15 +545,12 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
-# Inc.
+# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 1
-
 # AM_PROG_INSTALL_SH
 # ------------------
 # Define $install_sh.
@@ -582,8 +569,8 @@ AC_SUBST(install_sh)])
 # Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 # From Jim Meyering
 
-# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008,
-# 2011 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -603,7 +590,7 @@ AC_DEFUN([AM_MAINTAINER_MODE],
        [disable], [m4_define([am_maintainer_other], [enable])],
        [m4_define([am_maintainer_other], [enable])
         m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
-AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+AC_MSG_CHECKING([whether to am_maintainer_other maintainer-specific portions of Makefiles])
   dnl maintainer-mode's default is 'disable' unless 'enable' is passed
   AC_ARG_ENABLE([maintainer-mode],
 [  --][am_maintainer_other][-maintainer-mode  am_maintainer_other make rules and dependencies not useful
@@ -749,15 +736,12 @@ else
 fi
 ])
 
-# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
-# Inc.
+# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 1
-
 # AM_PROG_MKDIR_P
 # ---------------
 # Check for `mkdir -p'.
@@ -780,14 +764,13 @@ esac
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
-# Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 5
+# serial 4
 
 # _AM_MANGLE_OPTION(NAME)
 # -----------------------
@@ -795,13 +778,13 @@ AC_DEFUN([_AM_MANGLE_OPTION],
 [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
 
 # _AM_SET_OPTION(NAME)
-# --------------------
+# ------------------------------
 # Set option NAME.  Presently that only means defining a flag for this option.
 AC_DEFUN([_AM_SET_OPTION],
 [m4_define(_AM_MANGLE_OPTION([$1]), 1)])
 
 # _AM_SET_OPTIONS(OPTIONS)
-# ------------------------
+# ----------------------------------
 # OPTIONS is a space-separated list of Automake options.
 AC_DEFUN([_AM_SET_OPTIONS],
 [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
@@ -877,14 +860,12 @@ Check your system clock])
 fi
 AC_MSG_RESULT(yes)])
 
-# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 1
-
 # AM_PROG_INSTALL_STRIP
 # ---------------------
 # One issue with vendor `install' (even GNU) is that you can't
@@ -907,13 +888,13 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
+# Copyright (C) 2006, 2008  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 3
+# serial 2
 
 # _AM_SUBST_NOTMAKE(VARIABLE)
 # ---------------------------
@@ -922,13 +903,13 @@ AC_SUBST([INSTALL_STRIP_PROGRAM])])
 AC_DEFUN([_AM_SUBST_NOTMAKE])
 
 # AM_SUBST_NOTMAKE(VARIABLE)
-# --------------------------
+# ---------------------------
 # Public sister of _AM_SUBST_NOTMAKE.
 AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -950,11 +931,10 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 # a tarball read from stdin.
 #     $(am__untar) < result.tar
 AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.  Yes, it's still used
-# in the wild :-(  We should find a proper way to deprecate it ...
-AC_SUBST([AMTAR], ['$${TAR-tar}'])
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
 m4_if([$1], [v7],
-     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
      [m4_case([$1], [ustar],, [pax],,
               [m4_fatal([Unknown tar format])])
 AC_MSG_CHECKING([how to create a $1 tar archive])
index 22fc4bab9a70f561b5296bdbb94091877856d570..d7c5ceb864e13827a4e0b7130eaaf6f3844775cf 100644 (file)
 /* Define to 1 if the system has the type `fp_except_t'. */
 #undef HAVE_FP_EXCEPT_T
 
+/* Define to 1 if the system has the type `fp_rnd'. */
+#undef HAVE_FP_RND
+
+/* Define to 1 if the system has the type `fp_rnd_t'. */
+#undef HAVE_FP_RND_T
+
 /* fp_trap is present */
 #undef HAVE_FP_TRAP
 
index 09709b2ea245f23102b562919394e6b184598aa9..72d86f89ea3fb6e4e03d3ff9e8d4ebe6a5bb7af9 100644 (file)
@@ -88,7 +88,7 @@ has_sse (void)
 #endif
 }
 
-/* i387 -- see linux <fpu_control.h> header file for details.  */
+/* i387 exceptions -- see linux <fpu_control.h> header file for details.  */
 #define _FPU_MASK_IM  0x01
 #define _FPU_MASK_DM  0x02
 #define _FPU_MASK_ZM  0x04
@@ -99,7 +99,18 @@ has_sse (void)
 
 #define _FPU_EX_ALL   0x3f
 
-void set_fpu (void)
+/* i387 rounding modes.  */
+
+#define _FPU_RC_NEAREST 0x0
+#define _FPU_RC_DOWN    0x400
+#define _FPU_RC_UP      0x800
+#define _FPU_RC_ZERO    0xc00
+
+#define _FPU_RC_MASK    0xc00
+
+
+void
+set_fpu (void)
 {
   int excepts = 0;
   unsigned short cw;
@@ -164,3 +175,72 @@ get_fpu_except_flags (void)
 
   return result;
 }
+
+void
+set_fpu_rounding_mode (int round)
+{
+  int round_mode;
+  unsigned short cw;
+
+  switch (round)
+    {
+    case GFC_FPE_TONEAREST:
+      round_mode = _FPU_RC_NEAREST;
+      break;
+    case GFC_FPE_UPWARD:
+      round_mode = _FPU_RC_UP;
+      break;
+    case GFC_FPE_DOWNWARD:
+      round_mode = _FPU_RC_DOWN;
+      break;
+    case GFC_FPE_TOWARDZERO:
+      round_mode = _FPU_RC_ZERO;
+      break;
+    default:
+      return; /* Should be unreachable.  */
+    }
+
+  __asm__ __volatile__ ("fnstcw\t%0" : "=m" (cw));
+
+  cw &= ~FPU_RC_MASK;
+  cw |= round_mode;
+
+  __asm__ __volatile__ ("fldcw\t%0" : : "m" (cw));
+
+  if (has_sse())
+    {
+      unsigned int cw_sse;
+
+      __asm__ __volatile__ ("%vstmxcsr\t%0" : "=m" (cw_sse));
+
+      /* The SSE round control bits are shifted by 3 bits.  */
+      cw_sse &= ~(FPU_RC_MASK << 3);
+      cw_sse |= round_mode << 3;
+
+      __asm__ __volatile__ ("%vldmxcsr\t%0" : : "m" (cw_sse));
+    }
+}
+
+int
+get_fpu_rounding_mode (void)
+{
+  unsigned short cw;
+
+  __asm__ __volatile__ ("fnstcw\t%0" : "=m" (cw));
+
+  cw &= FPU_RC_MASK;
+
+  switch (cw)
+    {
+    case _FPU_RC_NEAREST:
+      return GFC_FPE_TONEAREST;
+    case _FPU_RC_UP:
+      return GFC_FPE_UPWARD;
+    case _FPU_RC_DOWN:
+      return GFC_FPE_DOWNWARD;
+    case _FPU_RC_ZERO:
+      return GFC_FPE_TOWARDZERO;
+    default:
+      return GFC_FPE_INVALID; /* Should be unreachable.  */
+    }
+}
index 1ba9d4cfb224109316f4f4c40ae3399670b7409c..a30d7d0666a16f02f2743f80b88efc834cdb5a29 100644 (file)
@@ -116,3 +116,75 @@ get_fpu_except_flags (void)
 
   return result;
 }
+
+
+int
+get_fpu_rounding_mode (void)
+{
+  int rnd_mode;
+
+  rnd_mode = fegetround ();
+
+  switch (rnd_mode)
+    {
+#ifdef FE_TONEAREST
+      case FE_TONEAREST:
+       return GFC_FPE_TONEAREST;
+#endif
+
+#ifdef FE_UPWARD
+      case FE_UPWARD:
+       return GFC_FPE_UPWARD;
+#endif
+
+#ifdef FE_DOWNWARD
+      case FE_DOWNWARD:
+       return GFC_FPE_DOWNWARD;
+#endif
+
+#ifdef FE_TOWARDZERO
+      case FE_TOWARDZERO:
+       return GFC_FPE_TOWARDZERO;
+#endif
+      default:
+       return GFC_FPE_INVALID;
+    }
+}
+
+
+void
+set_fpu_rounding_mode (int mode)
+{
+  int rnd_mode;
+
+  switch (mode)
+    {
+#ifdef FE_TONEAREST
+      case GFC_FPE_TONEAREST:
+       rnd_mode = FE_TONEAREST;
+       break;
+#endif
+
+#ifdef FE_UPWARD
+      case GFC_FPE_UPWARD:
+       rnd_mode = FE_UPWARD;
+       break;
+#endif
+
+#ifdef FE_DOWNWARD
+      case GFC_FPE_DOWNWARD:
+       rnd_mode = FE_DOWNWARD;
+       break;
+#endif
+
+#ifdef FE_TOWARDZERO
+      case GFC_FPE_TOWARDZERO:
+       rnd_mode = FE_TOWARDZERO;
+       break;
+#endif
+      default:
+       return;
+    }
+
+  fesetround (rnd_mode);
+}
index 4223f2e27d4815f62c3376e29be247f4120b3dc5..3ad0e8320554e3b5fc35aca675a5baa2a4c3ed39 100644 (file)
@@ -56,3 +56,16 @@ get_fpu_except_flags (void)
 {
   return 0;
 }
+
+
+int
+get_fpu_rounding_mode (void)
+{   
+  return 0;
+}               
+
+
+void
+set_fpu_rounding_mode (int round __attribute__((unused)))
+{
+}
index e0d1019b91910bff73d524d302c1f142ca135852..66919b8b807f88aa7d60b8d7b8a52e909037c04a 100644 (file)
@@ -127,3 +127,75 @@ get_fpu_except_flags (void)
 
   return result;
 }
+
+
+int
+get_fpu_rounding_mode (void)
+{
+  int rnd_mode;
+
+  rnd_mode = fegetround ();
+
+  switch (rnd_mode)
+    {
+#ifdef FE_TONEAREST
+      case FE_TONEAREST:
+       return GFC_FPE_TONEAREST;
+#endif
+
+#ifdef FE_UPWARD
+      case FE_UPWARD:
+       return GFC_FPE_UPWARD;
+#endif
+
+#ifdef FE_DOWNWARD
+      case FE_DOWNWARD:
+       return GFC_FPE_DOWNWARD;
+#endif
+
+#ifdef FE_TOWARDZERO
+      case FE_TOWARDZERO:
+       return GFC_FPE_TOWARDZERO;
+#endif
+      default:
+       return GFC_FPE_INVALID;
+    }
+}
+
+
+void
+set_fpu_rounding_mode (int mode)
+{
+  int rnd_mode;
+
+  switch (mode)
+    {
+#ifdef FE_TONEAREST
+      case GFC_FPE_TONEAREST:
+       rnd_mode = FE_TONEAREST;
+       break;
+#endif
+
+#ifdef FE_UPWARD
+      case GFC_FPE_UPWARD:
+       rnd_mode = FE_UPWARD;
+       break;
+#endif
+
+#ifdef FE_DOWNWARD
+      case GFC_FPE_DOWNWARD:
+       rnd_mode = FE_DOWNWARD;
+       break;
+#endif
+
+#ifdef FE_TOWARDZERO
+      case GFC_FPE_TOWARDZERO:
+       rnd_mode = FE_TOWARDZERO;
+       break;
+#endif
+      default:
+       return;
+    }
+
+  fesetround (rnd_mode);
+}
index db95e9df093b0fcf15ba6dd9b572619926061453..d7712562a4f89fc7eb1c6a112217aa68d5df9643 100644 (file)
@@ -128,3 +128,76 @@ get_fpu_except_flags (void)
 
   return result;
 }
+
+
+int
+get_fpu_rounding_mode (void)
+{
+  switch (fpgetround ())
+    {
+#ifdef FP_RN
+      case FP_RN:
+       return GFC_FPE_TONEAREST;
+#endif
+
+#ifdef FP_RP
+      case FP_RP:
+       return GFC_FPE_UPWARD;
+#endif
+
+#ifdef FP_RM
+      case FP_RM:
+       return GFC_FPE_DOWNWARD;
+#endif
+
+#ifdef FP_RZ
+      case FP_RZ:
+       return GFC_FPE_TOWARDZERO;
+#endif
+      default:
+       return GFC_FPE_INVALID;
+    }
+}
+
+
+void
+set_fpu_rounding_mode (int mode)
+{
+#if HAVE_FP_RND
+  fp_rnd rnd_mode;
+#elif HAVE_FP_RND_T
+  fp_rnd_t rnd_mode;
+#else
+  choke me
+#endif
+
+  switch (mode)
+    {
+#ifdef FP_RN
+      case GFC_FPE_TONEAREST:
+       rnd_mode = FP_RN;
+        break;
+#endif
+
+#ifdef FP_RP
+      case GFC_FPE_UPWARD:
+       rnd_mode = FP_RP;
+        break;
+#endif
+
+#ifdef FP_RM
+      case GFC_FPE_DOWNWARD:
+       rnd_mode = FP_RM;
+        break;
+#endif
+
+#ifdef FP_RZ
+      case GFC_FPE_TOWARDZERO:
+       rnd_mode = FP_RZ;
+        break;
+#endif
+      default:
+       return;
+    }
+  fpsetround (rnd_mode);
+}
index e4f90eaf787bf902c923fda73e5beac4ce93b534..21c23107394a95d68d0908e293f8c47480ba5f19 100755 (executable)
@@ -654,7 +654,6 @@ CPP
 am__fastdepCC_FALSE
 am__fastdepCC_TRUE
 CCDEPMODE
-am__nodep
 AMDEPBACKSLASH
 AMDEP_FALSE
 AMDEP_TRUE
@@ -3387,11 +3386,11 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 
 # We need awk for the "check" target.  The system "awk" is bad on
 # some platforms.
-# Always define AMTAR for backward compatibility.  Yes, it's still used
-# in the wild :-(  We should find a proper way to deprecate it ...
-AMTAR='$${TAR-tar}'
+# Always define AMTAR for backward compatibility.
 
-am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
 
 
 
@@ -3524,7 +3523,6 @@ fi
 if test "x$enable_dependency_tracking" != xno; then
   am_depcomp="$ac_aux_dir/depcomp"
   AMDEPBACKSLASH='\'
-  am__nodep='_no'
 fi
  if test "x$enable_dependency_tracking" != xno; then
   AMDEP_TRUE=
@@ -4342,7 +4340,6 @@ else
   # instance it was reported that on HP-UX the gcc test will end up
   # making a dummy file named `D' -- because `-MD' means `put the output
   # in D'.
-  rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
   # using a relative directory.
@@ -4402,7 +4399,7 @@ else
        break
       fi
       ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+    msvisualcpp | msvcmsys)
       # This compiler won't grok `-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
@@ -5518,7 +5515,6 @@ else
   # instance it was reported that on HP-UX the gcc test will end up
   # making a dummy file named `D' -- because `-MD' means `put the output
   # in D'.
-  rm -rf conftest.dir
   mkdir conftest.dir
   # Copy depcomp to subdir because otherwise we won't find it if we're
   # using a relative directory.
@@ -5578,7 +5574,7 @@ else
        break
       fi
       ;;
-    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+    msvisualcpp | msvcmsys)
       # This compiler won't grok `-c -o', but also, the minuso test has
       # not run yet.  These depmodes are late enough in the game, and
       # so weak that their functioning should not be impacted.
@@ -12335,7 +12331,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12338 "configure"
+#line 12334 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -12441,7 +12437,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 12444 "configure"
+#line 12440 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -26030,6 +26026,27 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
+fi
+
+ac_fn_c_check_type "$LINENO" "fp_rnd" "ac_cv_type_fp_rnd" "#include <ieeefp.h>
+"
+if test "x$ac_cv_type_fp_rnd" = x""yes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_FP_RND 1
+_ACEOF
+
+
+fi
+ac_fn_c_check_type "$LINENO" "fp_rnd_t" "ac_cv_type_fp_rnd_t" "#include <ieeefp.h>
+"
+if test "x$ac_cv_type_fp_rnd_t" = x""yes; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_FP_RND_T 1
+_ACEOF
+
+
 fi
 
 
index 1021eea2671ab8f507a8d8aabc2ceeb726319352..4609eba8aa1ac63a602d17dd6aae4ab6d1c4f2a8 100644 (file)
@@ -513,6 +513,7 @@ fi
 # Check for SysV fpsetmask
 LIBGFOR_CHECK_FPSETMASK
 AC_CHECK_TYPES([fp_except,fp_except_t], [], [], [[#include <ieeefp.h>]])
+AC_CHECK_TYPES([fp_rnd,fp_rnd_t], [], [], [[#include <ieeefp.h>]])
 
 # Check for AIX fp_trap and fp_enable
 AC_CHECK_FUNC([fp_trap],[have_fp_trap=yes AC_DEFINE([HAVE_FP_TRAP],[1],[fp_trap is present])])
index 8ea9326670b5aaeb24f24b5f34f39daca4c61f1f..1dcf72e7163f1c4370235db778e67eb915fe0e21 100644 (file)
@@ -186,8 +186,14 @@ typedef enum
 unit_encoding;
 
 typedef enum
-{ ROUND_UP, ROUND_DOWN, ROUND_ZERO, ROUND_NEAREST, ROUND_COMPATIBLE,
-  ROUND_PROCDEFINED, ROUND_UNSPECIFIED }
+{ ROUND_UP = GFC_FPE_UPWARD,
+  ROUND_DOWN = GFC_FPE_DOWNWARD,
+  ROUND_ZERO = GFC_FPE_TOWARDZERO,
+  ROUND_NEAREST = GFC_FPE_TONEAREST,
+  ROUND_COMPATIBLE = 10, /* round away from zero.  */
+  ROUND_PROCDEFINED, /* Here as ROUND_NEAREST. */
+  ROUND_UNSPECIFIED /* Should never occur. */
+}
 unit_round;
 
 /* NOTE: unit_sign must correspond with the sign_status enumerator in
index d7d5c4167c713f6a2961812e7b5e6d84a05f8eb7..e35b1a061681504071a2f8d05221e2b80152db67 100644 (file)
@@ -129,6 +129,24 @@ int
 convert_real (st_parameter_dt *dtp, void *dest, const char *buffer, int length)
 {
   char *endptr = NULL;
+  int round_mode, old_round_mode;
+
+  switch (dtp->u.p.current_unit->round_status)
+    {
+      case ROUND_COMPATIBLE:
+       /* FIXME: As NEAREST but round away from zero for a tie.  */
+      case ROUND_UNSPECIFIED:
+       /* Should not occur.  */
+      case ROUND_PROCDEFINED:
+       round_mode = ROUND_NEAREST;
+       break;
+      default:
+       round_mode = dtp->u.p.current_unit->round_status;
+       break;
+    }
+
+  old_round_mode = get_fpu_rounding_mode();
+  set_fpu_rounding_mode (round_mode);
 
   switch (length)
     {
@@ -167,6 +185,8 @@ convert_real (st_parameter_dt *dtp, void *dest, const char *buffer, int length)
       internal_error (&dtp->common, "Unsupported real kind during IO");
     }
 
+  set_fpu_rounding_mode (old_round_mode);
+
   if (buffer == endptr)
     {
       generate_error (&dtp->common, LIBERROR_READ_VALUE,
index f22da21c4c6ce15cc546f25da2686bf195527225..6e5df5b1054d45aae02ffa5722555f6827a98a29 100644 (file)
@@ -743,9 +743,16 @@ internal_proto(gf_strerror);
 
 extern void set_fpu (void);
 internal_proto(set_fpu);
+
 extern int get_fpu_except_flags (void);
 internal_proto(get_fpu_except_flags);
 
+extern void set_fpu_rounding_mode (int round);
+internal_proto(set_fpu_rounding_mode);
+
+extern int get_fpu_rounding_mode (void);
+internal_proto(get_fpu_rounding_mode);
+
 /* memory.c */
 
 extern void *xmalloc (size_t) __attribute__ ((malloc));