2005-06-23 20:50:25 +02:00
|
|
|
#!/bin/sh
|
2007-10-27 16:07:14 +02:00
|
|
|
LC_ALL=C
|
|
|
|
export LC_ALL
|
2005-06-23 20:50:25 +02:00
|
|
|
|
|
|
|
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=""
|
2007-07-22 01:45:44 +02:00
|
|
|
smallest=""
|
2005-06-23 20:50:25 +02:00
|
|
|
for k in $possible_integer_kinds; do
|
|
|
|
echo " integer (kind=$k) :: i" > tmp$$.f90
|
2008-09-10 18:39:15 +02:00
|
|
|
echo " i = 1_$k" >> tmp$$.f90
|
2005-06-23 20:50:25 +02:00
|
|
|
echo " end" >> tmp$$.f90
|
2008-01-16 10:13:39 +01:00
|
|
|
if $compile -S tmp$$.f90 > /dev/null 2>&1; then
|
2005-06-23 20:50:25 +02:00
|
|
|
s=`expr 8 \* $k`
|
|
|
|
largest="$k"
|
|
|
|
|
|
|
|
if [ $s -eq 128 ]; then
|
|
|
|
prefix="__"
|
|
|
|
else
|
|
|
|
prefix=""
|
|
|
|
fi
|
|
|
|
|
2007-07-22 01:45:44 +02:00
|
|
|
if [ "$smallest" = "" ]; then
|
|
|
|
smallest="$k"
|
|
|
|
fi
|
|
|
|
|
2005-06-23 20:50:25 +02:00
|
|
|
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};"
|
re PR libfortran/19308 (I/O library should support more real and integer kinds)
PR libfortran/19308
PR fortran/20120
PR libfortran/22437
* Makefile.am: Add generated files for large real and integers
kinds. Add a rule to create the kinds.inc c99_protos.inc files.
Use kinds.inc to preprocess Fortran generated files.
* libgfortran.h: Add macro definitions for GFC_INTEGER_16_HUGE,
GFC_REAL_10_HUGE and GFC_REAL_16_HUGE. Add types gfc_array_i16,
gfc_array_r10, gfc_array_r16, gfc_array_c10, gfc_array_c16,
gfc_array_l16.
* mk-kinds-h.sh: Define macros HAVE_GFC_LOGICAL_* and
HAVE_GFC_COMPLEX_* when these types are available.
* intrinsics/ishftc.c (ishftc16): New function for GFC_INTEGER_16.
* m4/all.m4, m4/any.m4, m4/count.m4, m4/cshift1.m4, m4/dotprod.m4,
m4/dotprodc.m4, m4/dotprodl.m4, m4/eoshift1.m4, m4/eoshift3.m4,
m4/exponent.m4, m4/fraction.m4, m4/in_pack.m4, m4/in_unpack.m4,
m4/matmul.m4, m4/matmull.m4, m4/maxloc0.m4, m4/maxloc1.m4,
m4/maxval.m4, m4/minloc0.m4, m4/minloc1.m4, m4/minval.m4, m4/mtype.m4,
m4/nearest.m4, m4/pow.m4, m4/product.m4, m4/reshape.m4,
m4/set_exponent.m4, m4/shape.m4, m4/specific.m4, m4/specific2.m4,
m4/sum.m4, m4/transpose.m4: Protect generated functions with
appropriate "#if defined (HAVE_GFC_type_kind)" preprocessor directives.
* Makefile.in: Regenerate.
* all files in generated/: Regenerate.
* f95-lang.c (DO_DEFINE_MATH_BUILTIN): Add support for long
double builtin function.
(gfc_init_builtin_functions): Add mfunc_longdouble,
mfunc_clongdouble and func_clongdouble_longdouble trees. Build
them for round, trunc, cabs, copysign and pow functions.
* iresolve.c (gfc_resolve_reshape, gfc_resolve_transpose): Add
case for kind 10 and 16.
* trans-decl.c: Add trees for cpowl10, cpowl16, ishftc16,
exponent10 and exponent16.
(gfc_build_intrinsic_function_decls): Build nodes for int16,
real10, real16, complex10 and complex16 types. Build all possible
combinations for function _gfortran_pow_?n_?n. Build function
calls cpowl10, cpowl16, ishftc16, exponent10 and exponent16.
* trans-expr.c (gfc_conv_power_op): Add case for integer(16),
real(10) and real(16).
* trans-intrinsic.c: Add suppport for long double builtin
functions in BUILT_IN_FUNCTION, LIBM_FUNCTION and LIBF_FUNCTION
macros.
(gfc_conv_intrinsic_aint): Add case for integer(16), real(10) and
real(16) kinds.
(gfc_build_intrinsic_lib_fndecls): Add support for real10_decl
and real16_decl in library functions.
(gfc_get_intrinsic_lib_fndecl): Add cases for real and complex
kinds 10 and 16.
(gfc_conv_intrinsic_exponent): Add cases for real(10) and real(16)
kinds.
(gfc_conv_intrinsic_sign): Likewise.
(gfc_conv_intrinsic_ishftc): Add case for integer(16) kind.
* trans-types.c (gfc_get_int_type, gfc_get_real_type,
gfc_get_complex_type, gfc_get_logical_type): Doesn't error out in
the case of kinds not available.
* trans.h: Declare trees for cpowl10, cpowl16, ishftc16,
exponent10 and exponent16.
* gfortran.dg/large_real_kind_2.F90: New test.
* gfortran.dg/large_integer_kind_2.f90: New test.
From-SVN: r104889
2005-10-03 09:22:20 +02:00
|
|
|
echo "#define HAVE_GFC_LOGICAL_${k}"
|
2005-06-23 20:50:25 +02:00
|
|
|
echo "#define HAVE_GFC_INTEGER_${k}"
|
2007-10-26 01:32:07 +02:00
|
|
|
echo ""
|
2005-06-23 20:50:25 +02:00
|
|
|
fi
|
|
|
|
rm -f tmp$$.*
|
|
|
|
done
|
|
|
|
|
|
|
|
echo "#define GFC_INTEGER_LARGEST GFC_INTEGER_${largest}"
|
|
|
|
echo "#define GFC_UINTEGER_LARGEST GFC_UINTEGER_${largest}"
|
2007-07-22 01:45:44 +02:00
|
|
|
echo "#define GFC_DEFAULT_CHAR ${smallest}"
|
2005-06-23 20:50:25 +02:00
|
|
|
echo ""
|
|
|
|
|
2010-11-16 22:23:19 +01:00
|
|
|
|
|
|
|
# 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$$.*
|
|
|
|
|
2005-06-23 20:50:25 +02:00
|
|
|
|
|
|
|
for k in $possible_real_kinds; do
|
|
|
|
echo " real (kind=$k) :: x" > tmp$$.f90
|
2008-09-10 18:39:15 +02:00
|
|
|
echo " x = 1.0_$k" >> tmp$$.f90
|
2005-06-23 20:50:25 +02:00
|
|
|
echo " end" >> tmp$$.f90
|
2008-01-16 10:13:39 +01:00
|
|
|
if $compile -S tmp$$.f90 > /dev/null 2>&1; then
|
2005-06-23 20:50:25 +02:00
|
|
|
case $k in
|
2010-11-16 22:23:19 +01:00
|
|
|
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 ;;
|
2005-06-23 20:50:25 +02:00
|
|
|
*) echo "$0: Unknown type" >&2 ; exit 1 ;;
|
|
|
|
esac
|
2007-10-26 01:32:07 +02:00
|
|
|
|
|
|
|
# Check for the value of HUGE
|
|
|
|
echo "print *, huge(0._$k) ; end" > tmq$$.f90
|
2008-01-16 10:13:39 +01:00
|
|
|
huge=`$compile -S -fdump-parse-tree tmq$$.f90 | grep TRANSFER \
|
2007-11-08 20:17:19 +01:00
|
|
|
| sed 's/ *TRANSFER *//' | sed 's/_.*//'`
|
2007-10-26 01:32:07 +02:00
|
|
|
rm -f tmq$$.*
|
|
|
|
|
|
|
|
# Check for the value of DIGITS
|
|
|
|
echo "print *, digits(0._$k) ; end" > tmq$$.f90
|
2008-01-16 10:13:39 +01:00
|
|
|
digits=`$compile -S -fdump-parse-tree tmq$$.f90 | grep TRANSFER \
|
2007-10-26 01:32:07 +02:00
|
|
|
| sed 's/ *TRANSFER *//'`
|
|
|
|
rm -f tmq$$.*
|
|
|
|
|
|
|
|
# Check for the value of RADIX
|
|
|
|
echo "print *, radix(0._$k) ; end" > tmq$$.f90
|
2008-01-16 10:13:39 +01:00
|
|
|
radix=`$compile -S -fdump-parse-tree tmq$$.f90 | grep TRANSFER \
|
2007-10-26 01:32:07 +02:00
|
|
|
| sed 's/ *TRANSFER *//'`
|
|
|
|
rm -f tmq$$.*
|
|
|
|
|
|
|
|
# Output the information we've gathered
|
2005-06-23 20:50:25 +02:00
|
|
|
echo "typedef ${ctype} GFC_REAL_${k};"
|
2010-11-16 22:23:19 +01:00
|
|
|
echo "typedef ${cplxtype} GFC_COMPLEX_${k};"
|
2005-06-23 20:50:25 +02:00
|
|
|
echo "#define HAVE_GFC_REAL_${k}"
|
re PR libfortran/19308 (I/O library should support more real and integer kinds)
PR libfortran/19308
PR fortran/20120
PR libfortran/22437
* Makefile.am: Add generated files for large real and integers
kinds. Add a rule to create the kinds.inc c99_protos.inc files.
Use kinds.inc to preprocess Fortran generated files.
* libgfortran.h: Add macro definitions for GFC_INTEGER_16_HUGE,
GFC_REAL_10_HUGE and GFC_REAL_16_HUGE. Add types gfc_array_i16,
gfc_array_r10, gfc_array_r16, gfc_array_c10, gfc_array_c16,
gfc_array_l16.
* mk-kinds-h.sh: Define macros HAVE_GFC_LOGICAL_* and
HAVE_GFC_COMPLEX_* when these types are available.
* intrinsics/ishftc.c (ishftc16): New function for GFC_INTEGER_16.
* m4/all.m4, m4/any.m4, m4/count.m4, m4/cshift1.m4, m4/dotprod.m4,
m4/dotprodc.m4, m4/dotprodl.m4, m4/eoshift1.m4, m4/eoshift3.m4,
m4/exponent.m4, m4/fraction.m4, m4/in_pack.m4, m4/in_unpack.m4,
m4/matmul.m4, m4/matmull.m4, m4/maxloc0.m4, m4/maxloc1.m4,
m4/maxval.m4, m4/minloc0.m4, m4/minloc1.m4, m4/minval.m4, m4/mtype.m4,
m4/nearest.m4, m4/pow.m4, m4/product.m4, m4/reshape.m4,
m4/set_exponent.m4, m4/shape.m4, m4/specific.m4, m4/specific2.m4,
m4/sum.m4, m4/transpose.m4: Protect generated functions with
appropriate "#if defined (HAVE_GFC_type_kind)" preprocessor directives.
* Makefile.in: Regenerate.
* all files in generated/: Regenerate.
* f95-lang.c (DO_DEFINE_MATH_BUILTIN): Add support for long
double builtin function.
(gfc_init_builtin_functions): Add mfunc_longdouble,
mfunc_clongdouble and func_clongdouble_longdouble trees. Build
them for round, trunc, cabs, copysign and pow functions.
* iresolve.c (gfc_resolve_reshape, gfc_resolve_transpose): Add
case for kind 10 and 16.
* trans-decl.c: Add trees for cpowl10, cpowl16, ishftc16,
exponent10 and exponent16.
(gfc_build_intrinsic_function_decls): Build nodes for int16,
real10, real16, complex10 and complex16 types. Build all possible
combinations for function _gfortran_pow_?n_?n. Build function
calls cpowl10, cpowl16, ishftc16, exponent10 and exponent16.
* trans-expr.c (gfc_conv_power_op): Add case for integer(16),
real(10) and real(16).
* trans-intrinsic.c: Add suppport for long double builtin
functions in BUILT_IN_FUNCTION, LIBM_FUNCTION and LIBF_FUNCTION
macros.
(gfc_conv_intrinsic_aint): Add case for integer(16), real(10) and
real(16) kinds.
(gfc_build_intrinsic_lib_fndecls): Add support for real10_decl
and real16_decl in library functions.
(gfc_get_intrinsic_lib_fndecl): Add cases for real and complex
kinds 10 and 16.
(gfc_conv_intrinsic_exponent): Add cases for real(10) and real(16)
kinds.
(gfc_conv_intrinsic_sign): Likewise.
(gfc_conv_intrinsic_ishftc): Add case for integer(16) kind.
* trans-types.c (gfc_get_int_type, gfc_get_real_type,
gfc_get_complex_type, gfc_get_logical_type): Doesn't error out in
the case of kinds not available.
* trans.h: Declare trees for cpowl10, cpowl16, ishftc16,
exponent10 and exponent16.
* gfortran.dg/large_real_kind_2.F90: New test.
* gfortran.dg/large_integer_kind_2.f90: New test.
From-SVN: r104889
2005-10-03 09:22:20 +02:00
|
|
|
echo "#define HAVE_GFC_COMPLEX_${k}"
|
2007-10-26 01:32:07 +02:00
|
|
|
echo "#define GFC_REAL_${k}_HUGE ${huge}${suffix}"
|
2010-06-09 14:56:35 +02:00
|
|
|
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
|
2007-10-26 01:32:07 +02:00
|
|
|
echo "#define GFC_REAL_${k}_DIGITS ${digits}"
|
|
|
|
echo "#define GFC_REAL_${k}_RADIX ${radix}"
|
|
|
|
echo ""
|
2005-06-23 20:50:25 +02:00
|
|
|
fi
|
|
|
|
rm -f tmp$$.*
|
|
|
|
done
|
|
|
|
|
2010-11-16 22:23:19 +01:00
|
|
|
|
|
|
|
# After this, we include a header that can override some of the
|
|
|
|
# autodetected settings.
|
|
|
|
echo '#include "kinds-override.h"'
|
|
|
|
|
2005-06-23 20:50:25 +02:00
|
|
|
exit 0
|