1ec601bf9f
/ 2010-11-13 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> Tobias Burnus <burnus@net-b.de> PR fortran/32049 * Makefile.def: Add libquadmath; build it with language=fortran. * configure.ac: Add libquadmath. * Makefile.tpl: Handle multiple libs in check-[+language+]. * Makefile.in: Regenerate. * configure: Regenerate. libquadmath/ 2010-11-13 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> Tobias Burnus <burnus@net-b.de> PR fortran/32049 Initial implementation and checkin. gcc/fortran/ 2010-11-13 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> Tobias Burnus <burnus@net-b.de> PR fortran/32049 * gfortranspec.c (find_spec_file): New function. (lang_specific_driver): Try to find .spec file and use it. * trans-io.c (iocall): Define * IOCALL_X_REAL128/COMPLEX128(,write). (gfc_build_io_library_fndecls): Build decl for __float128 I/O. (transfer_expr): Call __float128 I/O functions. * trans-types.c (gfc_init_kinds): Allow kind-16 belonging to __float128. gcc/testsuite/ 2010-11-13 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> Tobias Burnus <burnus@net-b.de> PR fortran/32049 * gfortran.dg/quad_1.f90: New. * lib/gcc-defs.exp (gcc-set-multilib-library-path): Use also compiler arguments. * lib/gfortran.exp (gfortran_link_flags): Add libquadmath to library search path; call gcc-set-multilib-library-path with arguments such that libgfortran.spec is found. (gfortran_init): Add path for libgfortran.spec to GFORTRAN_UNDER_TEST. libgomp/ 2010-11-13 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> Tobias Burnus <burnus@net-b.de> PR fortran/32049 * configure.ac: * configure: Regenerate. libgfortran/ 2010-11-13 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> Tobias Burnus <burnus@net-b.de> PR fortran/32049 * Makefile.am: Add missing pow_r16_i4.c, add transfer128.c, link libquadmath, if used. * acinclude.m4 (LIBGFOR_CHECK_FLOAT128): Add. * configure.ac: Use it, touch spec file. * gfortran.map: Add pow_r16_i4 and transfer_(real,complex)128(,write) functions. * intrinsics/cshift0.c (cshift0): Handle __float128 type. * intrinsics/erfc_scaled_inc.c: Ditto. * intrinsics/pack_generic.c (pack): Ditto * intrinsics/spread_generic.c (spread): Ditto. * intrinsics/unpack_generic.c (unpack1): Ditto. * io/read.c (convert_real): Ditto. * io/transfer.c: Update comments. * io/transfer128.c: New file. * io/write_float.def (write_float): Handle __float128 type. * libgfortran.h: #include quadmath_weak.h, define __builtin_infq and nanq. * m4/mtype.m4: Handle __float128 type. * runtime/in_pack_generic.c (internal_pack): Ditto. * runtime/in_unpack_generic.c (internal_unpack): Ditto. * kinds-override.h: New file. * libgfortran.spec.in: Ditto. * generated/pow_r16_i4.c: Generated. * Makefile.in: Regenerate. * configure: Regenerate. * config.h: Regenerate. * bessel_r10.c: Regenerate. * bessel_r16.c: Regenerate. * bessel_r4.c: Regenerate. * bessel_r8.c: Regenerate. * exponent_r16.c: Regenerate. * fraction_r16.c: Regenerate. * nearest_r16.c: Regenerate. * norm2_r10.c: Regenerate. * norm2_r16.c: Regenerate. * norm2_r4.c: Regenerate. * norm2_r8.c: Regenerate. * rrspacing_r16.c: Regenerate. * set_exponent_r16.c: Regenerate. * spacing_r16.c: Regenerate. Co-Authored-By: Tobias Burnus <burnus@net-b.de> From-SVN: r166825
120 lines
3.3 KiB
Bash
Executable File
120 lines
3.3 KiB
Bash
Executable File
#!/bin/sh
|
|
LC_ALL=C
|
|
export LC_ALL
|
|
|
|
compile="$1"
|
|
|
|
# Possible types must be listed in ascending order
|
|
possible_integer_kinds="1 2 4 8 16"
|
|
possible_real_kinds="4 8 10 16"
|
|
|
|
|
|
largest=""
|
|
smallest=""
|
|
for k in $possible_integer_kinds; do
|
|
echo " integer (kind=$k) :: i" > tmp$$.f90
|
|
echo " i = 1_$k" >> tmp$$.f90
|
|
echo " end" >> tmp$$.f90
|
|
if $compile -S tmp$$.f90 > /dev/null 2>&1; then
|
|
s=`expr 8 \* $k`
|
|
largest="$k"
|
|
|
|
if [ $s -eq 128 ]; then
|
|
prefix="__"
|
|
else
|
|
prefix=""
|
|
fi
|
|
|
|
if [ "$smallest" = "" ]; then
|
|
smallest="$k"
|
|
fi
|
|
|
|
echo "typedef ${prefix}int${s}_t GFC_INTEGER_${k};"
|
|
echo "typedef ${prefix}uint${s}_t GFC_UINTEGER_${k};"
|
|
echo "typedef GFC_INTEGER_${k} GFC_LOGICAL_${k};"
|
|
echo "#define HAVE_GFC_LOGICAL_${k}"
|
|
echo "#define HAVE_GFC_INTEGER_${k}"
|
|
echo ""
|
|
fi
|
|
rm -f tmp$$.*
|
|
done
|
|
|
|
echo "#define GFC_INTEGER_LARGEST GFC_INTEGER_${largest}"
|
|
echo "#define GFC_UINTEGER_LARGEST GFC_UINTEGER_${largest}"
|
|
echo "#define GFC_DEFAULT_CHAR ${smallest}"
|
|
echo ""
|
|
|
|
|
|
# Get the kind value for long double, so we may disambiguate it
|
|
# from __float128.
|
|
echo "use iso_c_binding; print *, c_long_double ; end" > tmq$$.f90
|
|
long_double_kind=`$compile -S -fdump-parse-tree tmq$$.f90 | grep TRANSFER \
|
|
| sed 's/ *TRANSFER *//'`
|
|
rm -f tmq$$.*
|
|
|
|
|
|
for k in $possible_real_kinds; do
|
|
echo " real (kind=$k) :: x" > tmp$$.f90
|
|
echo " x = 1.0_$k" >> tmp$$.f90
|
|
echo " end" >> tmp$$.f90
|
|
if $compile -S tmp$$.f90 > /dev/null 2>&1; then
|
|
case $k in
|
|
4) ctype="float" ; cplxtype="complex float" ; suffix="f" ;;
|
|
8) ctype="double" ; cplxtype="complex double" ; suffix="" ;;
|
|
10) ctype="long double" ; cplxtype="complex long double" ; suffix="l" ;;
|
|
16) if [ $long_double_kind -eq 10 ]; then
|
|
ctype="__float128"
|
|
cplxtype="_Complex float __attribute__((mode(TC)))"
|
|
suffix="q"
|
|
else
|
|
ctype="long double"
|
|
cplxtype="complex long double"
|
|
suffix="l"
|
|
fi ;;
|
|
*) echo "$0: Unknown type" >&2 ; exit 1 ;;
|
|
esac
|
|
|
|
# Check for the value of HUGE
|
|
echo "print *, huge(0._$k) ; end" > tmq$$.f90
|
|
huge=`$compile -S -fdump-parse-tree tmq$$.f90 | grep TRANSFER \
|
|
| sed 's/ *TRANSFER *//' | sed 's/_.*//'`
|
|
rm -f tmq$$.*
|
|
|
|
# Check for the value of DIGITS
|
|
echo "print *, digits(0._$k) ; end" > tmq$$.f90
|
|
digits=`$compile -S -fdump-parse-tree tmq$$.f90 | grep TRANSFER \
|
|
| sed 's/ *TRANSFER *//'`
|
|
rm -f tmq$$.*
|
|
|
|
# Check for the value of RADIX
|
|
echo "print *, radix(0._$k) ; end" > tmq$$.f90
|
|
radix=`$compile -S -fdump-parse-tree tmq$$.f90 | grep TRANSFER \
|
|
| sed 's/ *TRANSFER *//'`
|
|
rm -f tmq$$.*
|
|
|
|
# Output the information we've gathered
|
|
echo "typedef ${ctype} GFC_REAL_${k};"
|
|
echo "typedef ${cplxtype} GFC_COMPLEX_${k};"
|
|
echo "#define HAVE_GFC_REAL_${k}"
|
|
echo "#define HAVE_GFC_COMPLEX_${k}"
|
|
echo "#define GFC_REAL_${k}_HUGE ${huge}${suffix}"
|
|
echo "#define GFC_REAL_${k}_LITERAL_SUFFIX ${suffix}"
|
|
if [ "x$suffix" = "x" ]; then
|
|
echo "#define GFC_REAL_${k}_LITERAL(X) (X)"
|
|
else
|
|
echo "#define GFC_REAL_${k}_LITERAL(X) (X ## ${suffix})"
|
|
fi
|
|
echo "#define GFC_REAL_${k}_DIGITS ${digits}"
|
|
echo "#define GFC_REAL_${k}_RADIX ${radix}"
|
|
echo ""
|
|
fi
|
|
rm -f tmp$$.*
|
|
done
|
|
|
|
|
|
# After this, we include a header that can override some of the
|
|
# autodetected settings.
|
|
echo '#include "kinds-override.h"'
|
|
|
|
exit 0
|