Committed the following after regression testing. i will update the test case when I get the chance.

Jerry

Author: jvdelisle
Date: Wed Apr 20 04:18:25 2011
New Revision: 172753

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=172753
Log:
2011-04-19  Jerry DeLisle  <jvdeli...@gcc.gnu.org>

    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.

Modified:
    trunk/libgfortran/ChangeLog
    trunk/libgfortran/io/write_float.def

The patch:

Index: write_float.def
===================================================================
--- write_float.def     (revision 172634)
+++ write_float.def     (working copy)
@@ -805,7 +805,8 @@

    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 @@
   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 @@
       mid = (low + high) / 2;\
 \
       temp = (calculate_exp_ ## x (mid - 1) * (1 - r * rexp_d));\
+      asm volatile ("" : "+m" (temp));\
 \
       if (m < temp)\
         { \

Reply via email to