Patch ieee128-lib-patch010b
This commit is contained in:
parent
03831dcc98
commit
3338afa4a3
@ -1,3 +1,15 @@
|
||||
2020-05-05 Michael Meissner <meissner@linux.ibm.com>
|
||||
|
||||
(ieee128-lib-patch010b)
|
||||
* config.host (powerpc*-*-linux): Add support if glibc does not
|
||||
provide the appropriate IEEE 128-bit conversions to/from Decimal.
|
||||
* config/rs6000/float128-decimal.c: New file.
|
||||
* config/rs6000/float128-decimal.ver: New file.
|
||||
* config/rs6000/t-float128-decimal: New file.
|
||||
* configure.ac (powerpc*-*-linux): Add support if glibc does not
|
||||
provide the appropriate IEEE 128-bit conversions to/from Decimal.
|
||||
* configure: Regenerate.
|
||||
|
||||
2020-05-05 Michael Meissner <meissner@linux.ibm.com>
|
||||
|
||||
(ieee128-lib-patch003b)
|
||||
|
@ -1220,6 +1220,9 @@ powerpc*-*-linux*)
|
||||
|
||||
if test $libgcc_cv_powerpc_float128 = yes; then
|
||||
tmake_file="${tmake_file} rs6000/t-float128"
|
||||
if test $libgcc_cv_powerpc_float128_dec = no; then
|
||||
tmake_file="${tmake_file} rs6000/t-float128-decimal"
|
||||
fi
|
||||
fi
|
||||
|
||||
if test $libgcc_cv_powerpc_float128_hw = yes; then
|
||||
|
@ -0,0 +1,78 @@
|
||||
/* Provide missing conversions between IEEE 128-bit floating point and Decimal
|
||||
floating point for PowerPC.
|
||||
|
||||
Copyright (C) 2020 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Michael Meissner (meissner@linux.ibm.com)
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
In addition to the permissions in the GNU Lesser General Public
|
||||
License, the Free Software Foundation gives you unlimited
|
||||
permission to link the compiled version of this file into
|
||||
combinations with other programs, and to distribute those
|
||||
combinations without any restriction coming from the use of this
|
||||
file. (The Lesser General Public License restrictions do apply in
|
||||
other respects; for example, they cover modification of the file,
|
||||
and distribution when not linked into a combine executable.)
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
extern __float128 __dpd_trunctdkf (_Decimal128);
|
||||
extern __float128 __dpd_truncddkf (_Decimal64);
|
||||
extern __float128 __dpd_truncsdkf (_Decimal64);
|
||||
extern _Decimal128 __dpd_extendkftd (__float128);
|
||||
extern _Decimal64 __dpd_trunckfdd (__float128);
|
||||
extern _Decimal32 __dpd_trunckfsd (__float128);
|
||||
|
||||
__float128
|
||||
__dpd_trunctdkf (_Decimal128 x)
|
||||
{
|
||||
__ibm128 ibm = (__ibm128) x;
|
||||
return (__float128) ibm;
|
||||
}
|
||||
|
||||
__float128
|
||||
__dpd_truncddkf (_Decimal64 x)
|
||||
{
|
||||
__ibm128 ibm = (__ibm128) x;
|
||||
return (__float128) ibm;
|
||||
}
|
||||
|
||||
__float128
|
||||
__dpd_truncsdkf (_Decimal64 x)
|
||||
{
|
||||
__ibm128 ibm = (__ibm128) x;
|
||||
return (__float128) ibm;
|
||||
}
|
||||
|
||||
_Decimal128
|
||||
__dpd_extendkftd (__float128 x)
|
||||
{
|
||||
__ibm128 ibm = (__ibm128) x;
|
||||
return (_Decimal128) ibm;
|
||||
}
|
||||
|
||||
_Decimal64
|
||||
__dpd_trunckfdd (__float128 x)
|
||||
{
|
||||
__ibm128 ibm = (__ibm128) x;
|
||||
return (_Decimal64) ibm;
|
||||
}
|
||||
|
||||
_Decimal32
|
||||
__dpd_trunckfsd (__float128 x)
|
||||
{
|
||||
__ibm128 ibm = (__ibm128) x;
|
||||
return (_Decimal32) ibm;
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
GCC_10.0.0 {
|
||||
# float128 <-> decimal conversions
|
||||
__dpd_extendkftd
|
||||
__dpd_trunckfdd
|
||||
__dpd_trunckfsd
|
||||
__dpd_trunctdkf
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
# Add support for doing conversions between IEEE 128-bit floating point and
|
||||
# Decimal types if glibc does not provide the necessary functions.
|
||||
|
||||
LIB2ADD += $(srcdir)/config/rs6000/float128-decimal.c
|
||||
SHLIB_MAPFILES += $(srcdir)/config/rs6000/float128-decimal.ver
|
||||
|
||||
float128-decimal$(objext) : INTERNAL_CFLAGS += -mno-gnu-attribute
|
108
libgcc/configure
vendored
108
libgcc/configure
vendored
@ -1801,6 +1801,52 @@ $as_echo "$ac_res" >&6; }
|
||||
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
|
||||
|
||||
} # ac_fn_c_check_header_preproc
|
||||
|
||||
# ac_fn_c_try_link LINENO
|
||||
# -----------------------
|
||||
# Try to link conftest.$ac_ext, and return whether this succeeded.
|
||||
ac_fn_c_try_link ()
|
||||
{
|
||||
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { { ac_try="$ac_link"
|
||||
case "(($ac_try" in
|
||||
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
|
||||
*) ac_try_echo=$ac_try;;
|
||||
esac
|
||||
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
|
||||
$as_echo "$ac_try_echo"; } >&5
|
||||
(eval "$ac_link") 2>conftest.err
|
||||
ac_status=$?
|
||||
if test -s conftest.err; then
|
||||
grep -v '^ *+' conftest.err >conftest.er1
|
||||
cat conftest.er1 >&5
|
||||
mv -f conftest.er1 conftest.err
|
||||
fi
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; } && {
|
||||
test -z "$ac_c_werror_flag" ||
|
||||
test ! -s conftest.err
|
||||
} && test -s conftest$ac_exeext && {
|
||||
test "$cross_compiling" = yes ||
|
||||
test -x conftest$ac_exeext
|
||||
}; then :
|
||||
ac_retval=0
|
||||
else
|
||||
$as_echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
ac_retval=1
|
||||
fi
|
||||
# Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
|
||||
# created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
|
||||
# interfere with the next link command; also delete a directory that is
|
||||
# left behind by Apple's compiler. We do this before executing the actions.
|
||||
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
|
||||
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
|
||||
as_fn_set_status $ac_retval
|
||||
|
||||
} # ac_fn_c_try_link
|
||||
cat >config.log <<_ACEOF
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
@ -5201,7 +5247,9 @@ case ${host} in
|
||||
# At present, we cannot turn -mfloat128 on via #pragma GCC target, so just
|
||||
# check if we have VSX (ISA 2.06) support to build the software libraries, and
|
||||
# whether the assembler can handle xsaddqp for hardware support. Also check if
|
||||
# a new glibc is being used so that __builtin_cpu_supports can be used.
|
||||
# a new glibc is being used so that __builtin_cpu_supports can be used. Check
|
||||
# to see if glibc provides the necessary decimal <-> IEEE 128 function, and
|
||||
# arrange to build our own version if they are not provided.
|
||||
powerpc*-*-linux*)
|
||||
saved_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -mabi=altivec -mvsx -mfloat128"
|
||||
@ -5258,6 +5306,64 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgcc_cv_powerpc_float128_hw" >&5
|
||||
$as_echo "$libgcc_cv_powerpc_float128_hw" >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PowerPC convert __float128 to/from _Decimal libraries" >&5
|
||||
$as_echo_n "checking for PowerPC convert __float128 to/from _Decimal libraries... " >&6; }
|
||||
if ${libgcc_cv_powerpc_float128_dec+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
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. */
|
||||
#include <stdlib.h>
|
||||
__attribute__((noinline)) __float128 f128_from_d128 (_Decimal128 d128)
|
||||
{
|
||||
return (__float128)d128;
|
||||
}
|
||||
__attribute__((noinline)) __float128 f128_from_d64 (_Decimal128 d64)
|
||||
{
|
||||
return (__float128)d64;
|
||||
}
|
||||
__attribute__((noinline)) __float128 f128_from_d32 (_Decimal128 d32)
|
||||
{
|
||||
return (__float128)d32;
|
||||
}
|
||||
__attribute__((noinline)) _Decimal128 d128_from_f128 (__float128 f128)
|
||||
{
|
||||
return (_Decimal128)f128;
|
||||
}
|
||||
__attribute__((noinline)) _Decimal64 d64_from_f128 (__float128 f128)
|
||||
{
|
||||
return (_Decimal64)f128;
|
||||
}
|
||||
__attribute__((noinline)) _Decimal32 d32_from_f128 (__float128 f128)
|
||||
{
|
||||
return (_Decimal32)f128;
|
||||
}
|
||||
int main (void)
|
||||
{
|
||||
__float128 five = 5.0;
|
||||
if (f128_from_d128 (5.0dl) != five
|
||||
|| f128_from_d64 (5.0dd) != five
|
||||
|| f128_from_d32 (5.0df) != five
|
||||
|| d128_from_f128 (five) != 5.0dl
|
||||
|| d64_from_f128 (five) != 5.0dd
|
||||
|| d32_from_f128 (five) != 5.0df)
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_c_try_link "$LINENO"; then :
|
||||
libgcc_cv_powerpc_float128_dec=yes
|
||||
else
|
||||
libgcc_cv_powerpc_float128_dec=no
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libgcc_cv_powerpc_float128_dec" >&5
|
||||
$as_echo "$libgcc_cv_powerpc_float128_dec" >&6; }
|
||||
CFLAGS="$saved_CFLAGS"
|
||||
esac
|
||||
|
||||
|
@ -424,7 +424,9 @@ case ${host} in
|
||||
# At present, we cannot turn -mfloat128 on via #pragma GCC target, so just
|
||||
# check if we have VSX (ISA 2.06) support to build the software libraries, and
|
||||
# whether the assembler can handle xsaddqp for hardware support. Also check if
|
||||
# a new glibc is being used so that __builtin_cpu_supports can be used.
|
||||
# a new glibc is being used so that __builtin_cpu_supports can be used. Check
|
||||
# to see if glibc provides the necessary decimal <-> IEEE 128 function, and
|
||||
# arrange to build our own version if they are not provided.
|
||||
powerpc*-*-linux*)
|
||||
saved_CFLAGS="$CFLAGS"
|
||||
CFLAGS="$CFLAGS -mabi=altivec -mvsx -mfloat128"
|
||||
@ -457,6 +459,48 @@ powerpc*-*-linux*)
|
||||
__attribute__ ((__ifunc__ ("add_resolver")));])],
|
||||
[libgcc_cv_powerpc_float128_hw=yes],
|
||||
[libgcc_cv_powerpc_float128_hw=no])])
|
||||
AC_CACHE_CHECK([for PowerPC convert __float128 to/from _Decimal libraries],
|
||||
[libgcc_cv_powerpc_float128_dec],
|
||||
[AC_LINK_IFELSE(
|
||||
[AC_LANG_SOURCE([#include <stdlib.h>
|
||||
__attribute__((noinline)) __float128 f128_from_d128 (_Decimal128 d128)
|
||||
{
|
||||
return (__float128)d128;
|
||||
}
|
||||
__attribute__((noinline)) __float128 f128_from_d64 (_Decimal128 d64)
|
||||
{
|
||||
return (__float128)d64;
|
||||
}
|
||||
__attribute__((noinline)) __float128 f128_from_d32 (_Decimal128 d32)
|
||||
{
|
||||
return (__float128)d32;
|
||||
}
|
||||
__attribute__((noinline)) _Decimal128 d128_from_f128 (__float128 f128)
|
||||
{
|
||||
return (_Decimal128)f128;
|
||||
}
|
||||
__attribute__((noinline)) _Decimal64 d64_from_f128 (__float128 f128)
|
||||
{
|
||||
return (_Decimal64)f128;
|
||||
}
|
||||
__attribute__((noinline)) _Decimal32 d32_from_f128 (__float128 f128)
|
||||
{
|
||||
return (_Decimal32)f128;
|
||||
}
|
||||
int main (void)
|
||||
{
|
||||
__float128 five = 5.0;
|
||||
if (f128_from_d128 (5.0dl) != five
|
||||
|| f128_from_d64 (5.0dd) != five
|
||||
|| f128_from_d32 (5.0df) != five
|
||||
|| d128_from_f128 (five) != 5.0dl
|
||||
|| d64_from_f128 (five) != 5.0dd
|
||||
|| d32_from_f128 (five) != 5.0df)
|
||||
abort ();
|
||||
return 0;
|
||||
}])],
|
||||
[libgcc_cv_powerpc_float128_dec=yes],
|
||||
[libgcc_cv_powerpc_float128_dec=no])])
|
||||
CFLAGS="$saved_CFLAGS"
|
||||
esac
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user