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)\
{ \