]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libgcobol: Handle long double as an alternate IEEE754 quad [PR119244]
authorJakub Jelinek <jakub@redhat.com>
Tue, 15 Apr 2025 05:55:55 +0000 (07:55 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 15 Apr 2025 05:55:55 +0000 (07:55 +0200)
I think there should be consistency in what we use, so like
libgcobol-fp.h specifies, IEEE quad long double should have highest
priority, then _Float128 with *f128 APIs, then libquadmath.
And when we decide to use say long double, we shouldn't mix that with
strfromf128/strtof128.

Additionally, given that the *l vs. *f128 vs. *q API decision is done
solely in libgcobol and not in the compiler (which is different from
the Fortran case where compiled code emits say sinq or sinf128 calls),
I think libgcobol.spec should only have -lquadmath in any form only in
the case when using libquadmath for everything.  In the Fortran case
it is for backwards compatibility purposes, if something has been
compiled with older gfortran which used say sinq and link is done by
gfortran which has been configured against new glibc with *f128, linking
would fail otherwise.

2025-04-15  Jakub Jelinek  <jakub@redhat.com>
    Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

PR cobol/119244
* acinclude.m4 (LIBGCOBOL_CHECK_FLOAT128): Ensure
libgcob_cv_have_float128 is not yes on targets with IEEE quad
long double.  Don't check for --as-needed nor set LIBQUADSPEC
on targets which USE_IEC_60559.
* libgcobol-fp.h (FP128_FMT, strtofp128, strfromfp128): Define.
* intrinsic.cc (strtof128): Don't redefine.
(WEIRD_TRANSCENDENT_RETURN_VALUE): Use GCOB_FP128_LITERAL macro.
(__gg__numval_f): Use strtofp128 instead of strtof128.
* libgcobol.cc (strtof128): Don't redefine.
(format_for_display_internal): Use strfromfp128 instead of
strfromf128 or quadmath_snprintf and use FP128_FMT in the format
string.
(get_float128, __gg__compare_2, __gg__move, __gg__move_literala):
Use strtofp128 instead of strtof128.
* configure: Regenerate.

libgcobol/acinclude.m4
libgcobol/configure
libgcobol/intrinsic.cc
libgcobol/libgcobol-fp.h
libgcobol/libgcobol.cc

index aab0895146b9c9168a7bd541ab2ccf8289c51ef7..0e81b10838632f2ccad3b414a990545f9823cf35 100644 (file)
@@ -44,6 +44,10 @@ AC_DEFUN([LIBGCOBOL_CHECK_FLOAT128], [
   AC_CACHE_CHECK([whether we have a usable _Float128 type],
                  libgcob_cv_have_float128, [
    GCC_TRY_COMPILE_OR_LINK([
+#if __LDBL_MANT_DIG__ == 113 && __LDBL_MIN_EXP__ == -16381
+#error "long double is IEEE quad, no need for libquadmath"
+#endif
+
     _Float128 foo (_Float128 x)
     {
      _Complex _Float128 z1, z2;
@@ -90,32 +94,22 @@ AC_DEFUN([LIBGCOBOL_CHECK_FLOAT128], [
     fi
     AC_DEFINE(HAVE_FLOAT128, 1, [Define if target has usable _Float128 and __float128 types.])
 
-    dnl Check whether -Wl,--as-needed resp. -Wl,-zignore is supported
-    dnl 
-    dnl Turn warnings into error to avoid testsuite breakage.  So enable
-    dnl AC_LANG_WERROR, but there's currently (autoconf 2.64) no way to turn
-    dnl it off again.  As a workaround, save and restore werror flag like
-    dnl AC_PATH_XTRA.
-    dnl Cf. http://gcc.gnu.org/ml/gcc-patches/2010-05/msg01889.html
-    ac_xsave_[]_AC_LANG_ABBREV[]_werror_flag=$ac_[]_AC_LANG_ABBREV[]_werror_flag
-    AC_CACHE_CHECK([whether --as-needed/-z ignore works],
-      [libgcob_cv_have_as_needed],
-      [
-      # Test for native Solaris options first.
-      # No whitespace after -z to pass it through -Wl.
-      libgcob_cv_as_needed_option="-zignore"
-      libgcob_cv_no_as_needed_option="-zrecord"
-      save_LDFLAGS="$LDFLAGS"
-      LDFLAGS="$LDFLAGS -Wl,$libgcob_cv_as_needed_option -lm -Wl,$libgcob_cv_no_as_needed_option"
-      libgcob_cv_have_as_needed=no
-      AC_LANG_WERROR
-      AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
-                    [libgcob_cv_have_as_needed=yes],
-                    [libgcob_cv_have_as_needed=no])
-      LDFLAGS="$save_LDFLAGS"
-      if test "x$libgcob_cv_have_as_needed" = xno; then
-       libgcob_cv_as_needed_option="--as-needed"
-       libgcob_cv_no_as_needed_option="--no-as-needed"
+    if test "x$USE_IEC_60559" != xyes; then
+      dnl Check whether -Wl,--as-needed resp. -Wl,-zignore is supported
+      dnl 
+      dnl Turn warnings into error to avoid testsuite breakage.  So enable
+      dnl AC_LANG_WERROR, but there's currently (autoconf 2.64) no way to turn
+      dnl it off again.  As a workaround, save and restore werror flag like
+      dnl AC_PATH_XTRA.
+      dnl Cf. http://gcc.gnu.org/ml/gcc-patches/2010-05/msg01889.html
+      ac_xsave_[]_AC_LANG_ABBREV[]_werror_flag=$ac_[]_AC_LANG_ABBREV[]_werror_flag
+      AC_CACHE_CHECK([whether --as-needed/-z ignore works],
+       [libgcob_cv_have_as_needed],
+       [
+       # Test for native Solaris options first.
+       # No whitespace after -z to pass it through -Wl.
+       libgcob_cv_as_needed_option="-zignore"
+       libgcob_cv_no_as_needed_option="-zrecord"
        save_LDFLAGS="$LDFLAGS"
        LDFLAGS="$LDFLAGS -Wl,$libgcob_cv_as_needed_option -lm -Wl,$libgcob_cv_no_as_needed_option"
        libgcob_cv_have_as_needed=no
@@ -124,45 +118,51 @@ AC_DEFUN([LIBGCOBOL_CHECK_FLOAT128], [
                       [libgcob_cv_have_as_needed=yes],
                       [libgcob_cv_have_as_needed=no])
        LDFLAGS="$save_LDFLAGS"
-      fi
-      ac_[]_AC_LANG_ABBREV[]_werror_flag=$ac_xsave_[]_AC_LANG_ABBREV[]_werror_flag
-    ])
-
-    dnl Determine -Bstatic ... -Bdynamic etc. support from gfortran -### stderr.
-    touch conftest1.$ac_objext conftest2.$ac_objext
-    LQUADMATH=-lquadmath
-    $CXX -static-libgcobol -### -o conftest \
-       conftest1.$ac_objext -lgcobol conftest2.$ac_objext 2>&1 >/dev/null \
-       | grep "conftest1.$ac_objext.*conftest2.$ac_objext" > conftest.cmd
-    if grep "conftest1.$ac_objext.* -Bstatic -lgcobol -Bdynamic .*conftest2.$ac_objext" \
-       conftest.cmd >/dev/null 2>&1; then
-      LQUADMATH="%{static-libquadmath:-Bstatic} -lquadmath %{static-libquadmath:-Bdynamic}"
-    elif grep "conftest1.$ac_objext.* -bstatic -lgcobol -bdynamic .*conftest2.$ac_objext" \
-         conftest.cmd >/dev/null 2>&1; then
-      LQUADMATH="%{static-libquadmath:-bstatic} -lquadmath %{static-libquadmath:-bdynamic}"
-    elif grep "conftest1.$ac_objext.* -aarchive_shared -lgcobol -adefault .*conftest2.$ac_objext" \
-         conftest.cmd >/dev/null 2>&1; then
-      LQUADMATH="%{static-libquadmath:-aarchive_shared} -lquadmath %{static-libquadmath:-adefault}"
-    elif grep "conftest1.$ac_objext.*libgcobol.a .*conftest2.$ac_objext" \
+       if test "x$libgcob_cv_have_as_needed" = xno; then
+         libgcob_cv_as_needed_option="--as-needed"
+         libgcob_cv_no_as_needed_option="--no-as-needed"
+         save_LDFLAGS="$LDFLAGS"
+         LDFLAGS="$LDFLAGS -Wl,$libgcob_cv_as_needed_option -lm -Wl,$libgcob_cv_no_as_needed_option"
+         libgcob_cv_have_as_needed=no
+         AC_LANG_WERROR
+         AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
+                        [libgcob_cv_have_as_needed=yes],
+                        [libgcob_cv_have_as_needed=no])
+         LDFLAGS="$save_LDFLAGS"
+       fi
+       ac_[]_AC_LANG_ABBREV[]_werror_flag=$ac_xsave_[]_AC_LANG_ABBREV[]_werror_flag
+      ])
+
+      dnl Determine -Bstatic ... -Bdynamic etc. support from gfortran -### stderr.
+      touch conftest1.$ac_objext conftest2.$ac_objext
+      LQUADMATH=-lquadmath
+      $CXX -static-libgcobol -### -o conftest \
+         conftest1.$ac_objext -lgcobol conftest2.$ac_objext 2>&1 >/dev/null \
+         | grep "conftest1.$ac_objext.*conftest2.$ac_objext" > conftest.cmd
+      if grep "conftest1.$ac_objext.* -Bstatic -lgcobol -Bdynamic .*conftest2.$ac_objext" \
+        conftest.cmd >/dev/null 2>&1; then
+       LQUADMATH="%{static-libquadmath:-Bstatic} -lquadmath %{static-libquadmath:-Bdynamic}"
+      elif grep "conftest1.$ac_objext.* -bstatic -lgcobol -bdynamic .*conftest2.$ac_objext" \
+         conftest.cmd >/dev/null 2>&1; then
+       LQUADMATH="%{static-libquadmath:-bstatic} -lquadmath %{static-libquadmath:-bdynamic}"
+      elif grep "conftest1.$ac_objext.* -aarchive_shared -lgcobol -adefault .*conftest2.$ac_objext" \
+         conftest.cmd >/dev/null 2>&1; then
+       LQUADMATH="%{static-libquadmath:-aarchive_shared} -lquadmath %{static-libquadmath:-adefault}"
+      elif grep "conftest1.$ac_objext.*libgcobol.a .*conftest2.$ac_objext" \
          conftest.cmd >/dev/null 2>&1; then
-      LQUADMATH="%{static-libquadmath:libquadmath.a%s;:-lquadmath}"
-    fi
-    rm -f conftest1.$ac_objext conftest2.$ac_objext conftest conftest.cmd
-
-    dnl For static libgcobol linkage, depend on libquadmath only if needed.
-    dnl If using *f128 APIs from libc/libm, depend on libquadmath only if needed
-    dnl even for dynamic libgcobol linkage, and don't link libgcobol against
-    dnl -lquadmath.
-    if test "x$libgcob_cv_have_as_needed" = xyes; then
-      if test "x$USE_IEC_60559" = xyes; then
-       LIBQUADSPEC="$libgcob_cv_as_needed_option $LQUADMATH $libgcob_cv_no_as_needed_option"
+       LQUADMATH="%{static-libquadmath:libquadmath.a%s;:-lquadmath}"
+      fi
+      rm -f conftest1.$ac_objext conftest2.$ac_objext conftest conftest.cmd
+
+      if test "x$libgcob_cv_have_as_needed" = xyes; then
+       if test "x$USE_IEC_60559" = xyes; then
+         LIBQUADSPEC="$libgcob_cv_as_needed_option $LQUADMATH $libgcob_cv_no_as_needed_option"
+       else
+         LIBQUADSPEC="%{static-libgcobol:$libgcob_cv_as_needed_option} $LQUADMATH %{static-libgcobol:$libgcob_cv_no_as_needed_option}"
+       fi
       else
-       LIBQUADSPEC="%{static-libgcobol:$libgcob_cv_as_needed_option} $LQUADMATH %{static-libgcobol:$libgcob_cv_no_as_needed_option}"
+       LIBQUADSPEC="$LQUADMATH"
       fi
-    else
-      LIBQUADSPEC="$LQUADMATH"
-    fi
-    if test "x$USE_IEC_60559" != xyes; then
       if test -f ../libquadmath/libquadmath.la; then
        LIBQUADLIB=../libquadmath/libquadmath.la
        LIBQUADLIB_DEP=../libquadmath/libquadmath.la
index 6c2747c275b5a6fbaa998e32eceb8028ad5b2d7b..e83119d48f624fb487f624644f0ec80b0fb8eff3 100755 (executable)
@@ -17172,6 +17172,10 @@ else
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
+#if __LDBL_MANT_DIG__ == 113 && __LDBL_MIN_EXP__ == -16381
+#error "long double is IEEE quad, no need for libquadmath"
+#endif
+
     _Float128 foo (_Float128 x)
     {
      _Complex _Float128 z1, z2;
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
+#if __LDBL_MANT_DIG__ == 113 && __LDBL_MIN_EXP__ == -16381
+#error "long double is IEEE quad, no need for libquadmath"
+#endif
+
     _Float128 foo (_Float128 x)
     {
      _Complex _Float128 z1, z2;
@@ -17296,23 +17304,24 @@ $as_echo "#define USE_QUADMATH 1" >>confdefs.h
 $as_echo "#define HAVE_FLOAT128 1" >>confdefs.h
 
 
-                                ac_xsave_cxx_werror_flag=$ac_cxx_werror_flag
-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether --as-needed/-z ignore works" >&5
+    if test "x$USE_IEC_60559" != xyes; then
+                                                ac_xsave_cxx_werror_flag=$ac_cxx_werror_flag
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether --as-needed/-z ignore works" >&5
 $as_echo_n "checking whether --as-needed/-z ignore works... " >&6; }
 if ${libgcob_cv_have_as_needed+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
-      # Test for native Solaris options first.
-      # No whitespace after -z to pass it through -Wl.
-      libgcob_cv_as_needed_option="-zignore"
-      libgcob_cv_no_as_needed_option="-zrecord"
-      save_LDFLAGS="$LDFLAGS"
-      LDFLAGS="$LDFLAGS -Wl,$libgcob_cv_as_needed_option -lm -Wl,$libgcob_cv_no_as_needed_option"
-      libgcob_cv_have_as_needed=no
+       # Test for native Solaris options first.
+       # No whitespace after -z to pass it through -Wl.
+       libgcob_cv_as_needed_option="-zignore"
+       libgcob_cv_no_as_needed_option="-zrecord"
+       save_LDFLAGS="$LDFLAGS"
+       LDFLAGS="$LDFLAGS -Wl,$libgcob_cv_as_needed_option -lm -Wl,$libgcob_cv_no_as_needed_option"
+       libgcob_cv_have_as_needed=no
 
 ac_cxx_werror_flag=yes
-      if test x$gcc_no_link = xyes; then
+       if test x$gcc_no_link = xyes; then
   as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
 fi
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -17333,16 +17342,16 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-      LDFLAGS="$save_LDFLAGS"
-      if test "x$libgcob_cv_have_as_needed" = xno; then
-       libgcob_cv_as_needed_option="--as-needed"
-       libgcob_cv_no_as_needed_option="--no-as-needed"
-       save_LDFLAGS="$LDFLAGS"
-       LDFLAGS="$LDFLAGS -Wl,$libgcob_cv_as_needed_option -lm -Wl,$libgcob_cv_no_as_needed_option"
-       libgcob_cv_have_as_needed=no
+       LDFLAGS="$save_LDFLAGS"
+       if test "x$libgcob_cv_have_as_needed" = xno; then
+         libgcob_cv_as_needed_option="--as-needed"
+         libgcob_cv_no_as_needed_option="--no-as-needed"
+         save_LDFLAGS="$LDFLAGS"
+         LDFLAGS="$LDFLAGS -Wl,$libgcob_cv_as_needed_option -lm -Wl,$libgcob_cv_no_as_needed_option"
+         libgcob_cv_have_as_needed=no
 
 ac_cxx_werror_flag=yes
-       if test x$gcc_no_link = xyes; then
+         if test x$gcc_no_link = xyes; then
   as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
 fi
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -17363,44 +17372,43 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-       LDFLAGS="$save_LDFLAGS"
-      fi
-      ac_cxx_werror_flag=$ac_xsave_cxx_werror_flag
+         LDFLAGS="$save_LDFLAGS"
+       fi
+       ac_cxx_werror_flag=$ac_xsave_cxx_werror_flag
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgcob_cv_have_as_needed" >&5
 $as_echo "$libgcob_cv_have_as_needed" >&6; }
 
-        touch conftest1.$ac_objext conftest2.$ac_objext
-    LQUADMATH=-lquadmath
-    $CXX -static-libgcobol -### -o conftest \
-       conftest1.$ac_objext -lgcobol conftest2.$ac_objext 2>&1 >/dev/null \
-       | grep "conftest1.$ac_objext.*conftest2.$ac_objext" > conftest.cmd
-    if grep "conftest1.$ac_objext.* -Bstatic -lgcobol -Bdynamic .*conftest2.$ac_objext" \
-       conftest.cmd >/dev/null 2>&1; then
-      LQUADMATH="%{static-libquadmath:-Bstatic} -lquadmath %{static-libquadmath:-Bdynamic}"
-    elif grep "conftest1.$ac_objext.* -bstatic -lgcobol -bdynamic .*conftest2.$ac_objext" \
+            touch conftest1.$ac_objext conftest2.$ac_objext
+      LQUADMATH=-lquadmath
+      $CXX -static-libgcobol -### -o conftest \
+         conftest1.$ac_objext -lgcobol conftest2.$ac_objext 2>&1 >/dev/null \
+         | grep "conftest1.$ac_objext.*conftest2.$ac_objext" > conftest.cmd
+      if grep "conftest1.$ac_objext.* -Bstatic -lgcobol -Bdynamic .*conftest2.$ac_objext" \
+        conftest.cmd >/dev/null 2>&1; then
+       LQUADMATH="%{static-libquadmath:-Bstatic} -lquadmath %{static-libquadmath:-Bdynamic}"
+      elif grep "conftest1.$ac_objext.* -bstatic -lgcobol -bdynamic .*conftest2.$ac_objext" \
+         conftest.cmd >/dev/null 2>&1; then
+       LQUADMATH="%{static-libquadmath:-bstatic} -lquadmath %{static-libquadmath:-bdynamic}"
+      elif grep "conftest1.$ac_objext.* -aarchive_shared -lgcobol -adefault .*conftest2.$ac_objext" \
+         conftest.cmd >/dev/null 2>&1; then
+       LQUADMATH="%{static-libquadmath:-aarchive_shared} -lquadmath %{static-libquadmath:-adefault}"
+      elif grep "conftest1.$ac_objext.*libgcobol.a .*conftest2.$ac_objext" \
          conftest.cmd >/dev/null 2>&1; then
-      LQUADMATH="%{static-libquadmath:-bstatic} -lquadmath %{static-libquadmath:-bdynamic}"
-    elif grep "conftest1.$ac_objext.* -aarchive_shared -lgcobol -adefault .*conftest2.$ac_objext" \
-         conftest.cmd >/dev/null 2>&1; then
-      LQUADMATH="%{static-libquadmath:-aarchive_shared} -lquadmath %{static-libquadmath:-adefault}"
-    elif grep "conftest1.$ac_objext.*libgcobol.a .*conftest2.$ac_objext" \
-         conftest.cmd >/dev/null 2>&1; then
-      LQUADMATH="%{static-libquadmath:libquadmath.a%s;:-lquadmath}"
-    fi
-    rm -f conftest1.$ac_objext conftest2.$ac_objext conftest conftest.cmd
+       LQUADMATH="%{static-libquadmath:libquadmath.a%s;:-lquadmath}"
+      fi
+      rm -f conftest1.$ac_objext conftest2.$ac_objext conftest conftest.cmd
 
-                    if test "x$libgcob_cv_have_as_needed" = xyes; then
-      if test "x$USE_IEC_60559" = xyes; then
-       LIBQUADSPEC="$libgcob_cv_as_needed_option $LQUADMATH $libgcob_cv_no_as_needed_option"
+      if test "x$libgcob_cv_have_as_needed" = xyes; then
+       if test "x$USE_IEC_60559" = xyes; then
+         LIBQUADSPEC="$libgcob_cv_as_needed_option $LQUADMATH $libgcob_cv_no_as_needed_option"
+       else
+         LIBQUADSPEC="%{static-libgcobol:$libgcob_cv_as_needed_option} $LQUADMATH %{static-libgcobol:$libgcob_cv_no_as_needed_option}"
+       fi
       else
-       LIBQUADSPEC="%{static-libgcobol:$libgcob_cv_as_needed_option} $LQUADMATH %{static-libgcobol:$libgcob_cv_no_as_needed_option}"
+       LIBQUADSPEC="$LQUADMATH"
       fi
-    else
-      LIBQUADSPEC="$LQUADMATH"
-    fi
-    if test "x$USE_IEC_60559" != xyes; then
       if test -f ../libquadmath/libquadmath.la; then
        LIBQUADLIB=../libquadmath/libquadmath.la
        LIBQUADLIB_DEP=../libquadmath/libquadmath.la
index 844cd388063cfcf29f5bb79ada65ebf2ca0ce57e..181b0534f36a422ad6566732e90af06a13452218 100644 (file)
 #include "charmaps.h"
 
 
-#if !defined (HAVE_STRTOF128)
-# if USE_QUADMATH
-#  define strtof128 strtoflt128
-# else
-#  error "no available string to float 128"
-# endif
-#endif
-
 #pragma GCC diagnostic ignored "-Wformat-truncation"
 
 #define JD_OF_1601_01_02 2305812.5
 
-#define WEIRD_TRANSCENDENT_RETURN_VALUE (0.0Q)
+#define WEIRD_TRANSCENDENT_RETURN_VALUE GCOB_FP128_LITERAL (0.0)
 #define NO_RDIGITS (0)
 
 struct cobol_tm
@@ -5016,7 +5008,7 @@ __gg__numval_f( cblc_field_t *dest,
         }
       }
     *p++ = '\0';
-    value = strtof128(ach, NULL);
+    value = strtofp128(ach, NULL);
     }
   __gg__float128_to_field(dest,
                           value,
index bd443f3a234d13fc40895aeccadc51c19bf6e4c3..fcfa0a79b6beb6b64f44c59a9d63d370fc1c0230 100644 (file)
@@ -28,17 +28,26 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 # define GCOB_FP128 long double
 # define GCOB_FP128_LITERAL(lit) (lit ## l)
 # define FP128_FUNC(funcname) funcname ## l
+# define FP128_FMT "L"
+# define strtofp128(nptr, endptr) strtold(nptr, endptr)
+# define strfromfp128(str, n, format, fp) snprintf(str, n, format, fp)
 #elif __FLT128_MANT_DIG__ == 113 && __FLT128_MIN_EXP__ == -16381 \
      && defined(USE_IEC_60559)
 // Use _Float128, f128 suffix on calls, f128 or F128 suffix on literals
 # define GCOB_FP128 _Float128
 # define GCOB_FP128_LITERAL(lit) (lit ## f128)
 # define FP128_FUNC(funcname) funcname ## f128
+# define FP128_FMT ""
+# define strtofp128(nptr, endptr) strtof128(nptr, endptr)
+# define strfromfp128(str, n, format, fp) strfromf128(str, n, format, fp)
 #elif __FLT128_MANT_DIG__ == 113 && __FLT128_MIN_EXP__ == -16381
 // Use __float128, q suffix on calls, q or Q suffix on literals
 # define GCOB_FP128 __float128
 # define GCOB_FP128_LITERAL(lit) (lit ## q)
 # define FP128_FUNC(funcname) funcname ## q
+# define FP128_FMT "Q"
+# define strtofp128(nptr, endptr) strtoflt128(nptr, endptr)
+# define strfromfp128(str, n, format, fp) quadmath_snprintf(str, n, format, fp)
 #else
 # error "libgcobol requires 128b floating point"
 #endif
index 07d4e8ba9fc8e25007d27092571208d55aa2b151..c438d6be58097fd480bb6b36f49094f752067623 100644 (file)
@@ -93,20 +93,6 @@ strfromf64 (char *s, size_t n, const char *f, double v)
 # endif
 #endif
 
-#if !defined (HAVE_STRFROMF128)
-# if !USE_QUADMATH
-#  error "no available float 128 to string"
-# endif
-#endif
-
-#if !defined (HAVE_STRTOF128)
-# if USE_QUADMATH
-#  define strtof128 strtoflt128
-# else
-#  error "no available string to float 128"
-# endif
-#endif
-
 // This couldn't be defined in symbols.h because it conflicts with a LEVEL66
 // in parse.h
 #define LEVEL66 (66)
@@ -3262,11 +3248,7 @@ format_for_display_internal(char **dest,
           // on a 16-bit boundary.
           GCOB_FP128 floatval;
           memcpy(&floatval, actual_location, 16);
-#if !defined (HAVE_STRFROMF128) && USE_QUADMATH
-          quadmath_snprintf(ach, sizeof(ach), "%.36QE", floatval);
-#else
-          strfromf128(ach, sizeof(ach), "%.36E", floatval);
-#endif
+          strfromfp128(ach, sizeof(ach), "%.36" FP128_FMT "E", floatval);
           char *p = strchr(ach, 'E');
           if( !p )
             {
@@ -3288,13 +3270,8 @@ format_for_display_internal(char **dest,
 
               int precision = 36 - exp;
               char achFormat[24];
-#if !defined (HAVE_STRFROMF128) && USE_QUADMATH
-              sprintf(achFormat, "%%.%dQf", precision);
-              quadmath_snprintf(ach, sizeof(ach), achFormat, floatval);
-#else
-              sprintf(achFormat, "%%.%df", precision);
-              strfromf128(ach, sizeof(ach), achFormat, floatval);
-#endif
+              sprintf(achFormat, "%%.%d" FP128_FMT "f", precision);
+              strfromfp128(ach, sizeof(ach), achFormat, floatval);
               }
             __gg__remove_trailing_zeroes(ach);
             __gg__realloc_if_necessary(dest, dest_size, strlen(ach)+1);
@@ -3533,7 +3510,7 @@ get_float128( cblc_field_t *field,
     {
     if( __gg__decimal_point == '.' )
       {
-      retval = strtof128(field->initial, NULL);
+      retval = strtofp128(field->initial, NULL);
       }
     else
       {
@@ -3551,7 +3528,7 @@ get_float128( cblc_field_t *field,
         {
         *p = '.';
         }
-      retval = strtof128(buffer, NULL);
+      retval = strtofp128(buffer, NULL);
       }
     }
   else
@@ -4248,7 +4225,7 @@ __gg__compare_2(cblc_field_t *left_side,
               //_Float128 left_value  = *(_Float128 *)left_location;
               GCOB_FP128 left_value;
               memcpy(&left_value, left_location, 16);
-              GCOB_FP128 right_value = strtof128(buffer, NULL);
+              GCOB_FP128 right_value = strtofp128(buffer, NULL);
               retval = 0;
               retval = left_value < right_value ? -1 : retval;
               retval = left_value > right_value ?  1 : retval;
@@ -5998,8 +5975,8 @@ __gg__move( cblc_field_t        *fdest,
                 }
               case 16:
                 {
-                //*(_Float128 *)(fdest->data+dest_offset) = strtof128(ach, NULL);
-                GCOB_FP128 t = strtof128(ach, NULL);
+                //*(_Float128 *)(fdest->data+dest_offset) = strtofp128(ach, NULL);
+                GCOB_FP128 t = strtofp128(ach, NULL);
                 memcpy(fdest->data+dest_offset, &t, 16);
                 break;
                 }
@@ -6168,7 +6145,7 @@ __gg__move_literala(cblc_field_t *field,
           }
         case 16:
           {
-          GCOB_FP128 t = strtof128(ach, NULL);
+          GCOB_FP128 t = strtofp128(ach, NULL);
           memcpy(field->data+field_offset, &t, 16);
           break;
           }