libgcobol: Handle long double as an alternate IEEE754 quad [PR119244]
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.
This commit is contained in:
parent
fc89b1face
commit
69ffddd8bd
5 changed files with 155 additions and 169 deletions
|
@ -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"
|
||||
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
|
||||
ac_[]_AC_LANG_ABBREV[]_werror_flag=$ac_xsave_[]_AC_LANG_ABBREV[]_werror_flag
|
||||
])
|
||||
rm -f conftest1.$ac_objext conftest2.$ac_objext conftest conftest.cmd
|
||||
|
||||
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"
|
||||
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
|
||||
|
|
140
libgcobol/configure
vendored
140
libgcobol/configure
vendored
|
@ -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;
|
||||
|
@ -17225,6 +17229,10 @@ fi
|
|||
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,47 +17304,18 @@ $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
|
||||
|
||||
ac_cxx_werror_flag=yes
|
||||
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
|
||||
/* end confdefs.h. */
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_cxx_try_link "$LINENO"; then :
|
||||
libgcob_cv_have_as_needed=yes
|
||||
else
|
||||
libgcob_cv_have_as_needed=no
|
||||
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"
|
||||
# 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
|
||||
|
@ -17364,43 +17343,72 @@ 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
|
||||
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
|
||||
as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5
|
||||
fi
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_cxx_try_link "$LINENO"; then :
|
||||
libgcob_cv_have_as_needed=yes
|
||||
else
|
||||
libgcob_cv_have_as_needed=no
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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}"
|
||||
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="$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
|
||||
|
|
|
@ -55,19 +55,11 @@
|
|||
#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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue