From b48de48389275f9e7af3912fb4a14da5b18b2fca Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Wed, 20 Apr 2011 04:18:25 +0000 Subject: [PATCH] re PR libfortran/48602 (Invalid F conversion of G descriptor for values close to powers of 10) 2011-04-19 Jerry DeLisle PR libgfortran/48602 * io/write_float.def (output_float_FMT_G): Fix reversal in conditional. Use asm volatile to mark temp variable, avoiding optimization errors. From-SVN: r172753 --- libgfortran/ChangeLog | 6 ++++++ libgfortran/io/write_float.def | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index f4b19f8b863..205243e8181 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2011-04-19 Jerry DeLisle + + PR libgfortran/48602 + * io/write_float.def (output_float_FMT_G): Fix reversal in conditional. + Use asm volatile to mark temp variable, avoiding optimization errors. + 2011-04-17 Jerry DeLisle PR libgfortran/48602 diff --git a/libgfortran/io/write_float.def b/libgfortran/io/write_float.def index 9e90d809450..2bced6ffec4 100644 --- a/libgfortran/io/write_float.def +++ b/libgfortran/io/write_float.def @@ -805,7 +805,8 @@ CALCULATE_EXP(16) notes: for Gw.d , n' ' means 4 blanks for Gw.dEe, n' ' means e+2 blanks - for rounding modes adjustment, r, See Fortran F2008 10.7.5.2.2 */ + for rounding modes adjustment, r, See Fortran F2008 10.7.5.2.2 + the asm volatile is required for 32-bit x86 platforms. */ #define OUTPUT_FLOAT_FMT_G(x) \ static void \ @@ -830,7 +831,7 @@ output_float_FMT_G_ ## x (st_parameter_dt *dtp, const fnode *f, \ switch (dtp->u.p.current_unit->round_status)\ {\ case ROUND_ZERO:\ - r = sign_bit ? 0.0 : 1.0;\ + r = sign_bit ? 1.0 : 0.0;\ break;\ case ROUND_UP:\ r = 1.0;\ @@ -867,6 +868,7 @@ output_float_FMT_G_ ## x (st_parameter_dt *dtp, const fnode *f, \ mid = (low + high) / 2;\ \ temp = (calculate_exp_ ## x (mid - 1) * (1 - r * rexp_d));\ + asm volatile ("" : "+m" (temp));\ \ if (m < temp)\ { \ -- 2.30.2