2011-05-04 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 May 2011 01:19:30 +0000 (01:19 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 5 May 2011 01:19:30 +0000 (01:19 +0000)
PR libgfortran/48787
* io/write_float.def (output_float): Adjust up and down rounding for
cases where 'd' = 0. Gather common code to one location.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@173408 138bc75d-0d04-0410-961f-82ee72b054a4

libgfortran/ChangeLog
libgfortran/io/write_float.def

index 5b73722..7e081cc 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-04  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+
+       PR libgfortran/48787
+       * io/write_float.def (output_float): Adjust up and down rounding for
+       cases where 'd' = 0. Gather common code to one location.
+
 2011-05-01  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/48787
index 7f3cedd..7ab70d2 100644 (file)
@@ -221,6 +221,7 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
 
   if (zero_flag)
     goto skip;
+
   /* Round the value.  The value being rounded is an unsigned magnitude.
      The ROUND_COMPATIBLE is rounding away from zero when there is a tie.  */
   switch (dtp->u.p.current_unit->round_status)
@@ -230,19 +231,11 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
       case ROUND_UP:
        if (sign_bit)
          goto skip;
-       rchar = '0';
-       /* Scan for trailing zeros to see if we really need to round it.  */
-       for(i = nbefore + nafter; i < ndigits; i++)
-         {
-           if (digits[i] != '0')
-             goto do_rnd;
-         }
-       goto skip;
+       goto updown;
       case ROUND_DOWN:
        if (!sign_bit)
          goto skip;
-       rchar = '0';
-       break;
+       goto updown;
       case ROUND_NEAREST:
        /* Round compatible unless there is a tie. A tie is a 5 with
           all trailing zero's.  */
@@ -254,7 +247,7 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
                if (digits[i] != '0')
                  goto do_rnd;
              }
-           /* It is a  tie so round to even.  */
+           /* It is a tie so round to even.  */
            switch (digits[nafter + nbefore - 1])
              {
                case '1':
@@ -274,8 +267,21 @@ output_float (st_parameter_dt *dtp, const fnode *f, char *buffer, size_t size,
       case ROUND_UNSPECIFIED:
       case ROUND_COMPATIBLE:
        rchar = '5';
-       /* Just fall through and do the actual rounding.  */
+       goto do_rnd;
+    }
+
+  updown:
+
+  rchar = '0';
+  if (w > 0 && d == 0 && p == 0)
+    nbefore = 1;
+  /* Scan for trailing zeros to see if we really need to round it.  */
+  for(i = nbefore + nafter; i < ndigits; i++)
+    {
+      if (digits[i] != '0')
+       goto do_rnd;
     }
+  goto skip;
     
   do_rnd: