Found when looking at the issue of the PR, but unrelated.
For __float128, we have to use the libquadmath functions - not the "long double" ones.
The patch is rather obvious, though I wonder whether it could clash with some #defines of the system headers on some systems.
Build and regtested on x86-64-gnu-linux. OK for the trunk? Tobias
2013-06-01 Tobias Burnus <bur...@net-b.de> PR fortran/57496 * io/write_float.def (ISFINITE2Q, ISFINITE2, ISFINITE2L, ISFINITE, SIGNBIT2Q, SIGNBIT2, SIGNBIT2L, SIGNBIT, ISNAN2Q, ISNAN2, ISNAN2L, ISNAN): New macros. (WRITE_FLOAT): Use them. diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def index a157f0b..4f0fa72 100644 --- a/libgfortran/io/write_float.def +++ b/libgfortran/io/write_float.def @@ -961,6 +961,34 @@ __qmath_(quadmath_snprintf) (buffer, size, "%+-#.*Qf", \ #endif +#if defined(GFC_REAL_16_IS_FLOAT128) +#define ISFINITE2Q(val) finiteq(val) +#endif +#define ISFINITE2(val) isfinite(val) +#define ISFINITE2L(val) isfinite(val) + +#define ISFINITE(suff,val) TOKENPASTE(ISFINITE2,suff)(val) + + +#if defined(GFC_REAL_16_IS_FLOAT128) +#define SIGNBIT2Q(val) signbitq(val) +#endif +#define SIGNBIT2(val) signbit(val) +#define SIGNBIT2L(val) signbit(val) + +#define SIGNBIT(suff,val) TOKENPASTE(SIGNBIT2,suff)(val) + + +#if defined(GFC_REAL_16_IS_FLOAT128) +#define ISNAN2Q(val) isnanq(val) +#endif +#define ISNAN2(val) isnan(val) +#define ISNAN2L(val) isnan(val) + +#define ISNAN(suff,val) TOKENPASTE(ISNAN2,suff)(val) + + + /* Generate corresponding I/O format for FMT_G and output. The rules to translate FMT_G to FMT_E or FMT_F from DEC fortran LRM (table 11-2, Chapter 11, "I/O Formatting", P11-25) is: @@ -1194,10 +1222,10 @@ determine_en_precision (st_parameter_dt *dtp, const fnode *f, {\ GFC_REAL_ ## x tmp;\ tmp = * (GFC_REAL_ ## x *)source;\ - sign_bit = signbit (tmp);\ - if (!isfinite (tmp))\ + sign_bit = SIGNBIT (y,tmp);\ + if (!ISFINITE (y,tmp))\ { \ - write_infnan (dtp, f, isnan (tmp), sign_bit);\ + write_infnan (dtp, f, ISNAN (y,tmp), sign_bit);\ return;\ }\ tmp = sign_bit ? -tmp : tmp;\