OSDN Git Service

2007-07-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 15 Jul 2007 16:26:22 +0000 (16:26 +0000)
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 15 Jul 2007 16:26:22 +0000 (16:26 +0000)
    Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>

PR fortran/32611
* runtime/compile_options.c (set_std): Remove.
(set_options): New function.
(init_compile_options): Add initialization for -fsign-zero option.
* gfortran.map (GFORTRAN_1.0): Rename _gfortran_set_std into
_gfortran_set_options.
* libgfortran.h (compile_options_t): Add sign_zero field.
* io/write.c (output_float): Use the sign bit of the value to determine
if a negative sign should be emitted for zero values.  Do not emit the
negative sign for zero if -fno-sign-zero was set during compile.

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

libgfortran/ChangeLog
libgfortran/gfortran.map
libgfortran/io/write.c
libgfortran/libgfortran.h
libgfortran/runtime/compile_options.c

index 25bb24b..a6b20fb 100644 (file)
@@ -1,3 +1,17 @@
+2007-07-15  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
+           Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
+
+       PR fortran/32611
+       * runtime/compile_options.c (set_std): Remove.
+       (set_options): New function.
+       (init_compile_options): Add initialization for -fsign-zero option.
+       * gfortran.map (GFORTRAN_1.0): Rename _gfortran_set_std into
+       _gfortran_set_options.
+       * libgfortran.h (compile_options_t): Add sign_zero field.
+       * io/write.c (output_float): Use the sign bit of the value to determine
+       if a negative sign should be emitted for zero values.  Do not emit the
+       negative sign for zero if -fno-sign-zero was set during compile.
+       
 2007-07-14  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/32752
index 71c809a..76dba0c 100644 (file)
@@ -590,7 +590,7 @@ GFORTRAN_1.0 {
     _gfortran_set_fpe;
     _gfortran_set_max_subrecord_length;
     _gfortran_set_record_marker;
-    _gfortran_set_std;
+    _gfortran_set_options;
     _gfortran_shape_16;
     _gfortran_shape_4;
     _gfortran_shape_8;
index 766d268..b4e5d3e 100644 (file)
@@ -465,6 +465,7 @@ output_float (st_parameter_dt *dtp, const fnode *f, GFC_REAL_LARGEST value)
   int leadzero;
   int nblanks;
   int i;
+  int sign_bit;
   sign_t sign;
 
   ft = f->format;
@@ -482,6 +483,7 @@ output_float (st_parameter_dt *dtp, const fnode *f, GFC_REAL_LARGEST value)
      For an N digit exponent, this gives us (MIN_FIELD_WIDTH-5)-N digits
      after the decimal point, plus another one before the decimal point.  */
   sign = calculate_sign (dtp, value < 0.0);
+  sign_bit = signbit (value);
   if (value < 0)
     value = -value;
 
@@ -547,9 +549,15 @@ output_float (st_parameter_dt *dtp, const fnode *f, GFC_REAL_LARGEST value)
   /* Read the exponent back in.  */
   e = atoi (&buffer[ndigits + 3]) + 1;
 
-  /* Make sure zero comes out as 0.0e0.  */
+  /* Make sure zero comes out as 0.0e0.   */
   if (value == 0.0)
-    e = 0;
+    {
+      e = 0;
+      if (compile_options.sign_zero == 1)
+        sign = calculate_sign (dtp, sign_bit);
+      else
+       sign = calculate_sign (dtp, 0);
+    }
 
   /* Normalize the fractional component.  */
   buffer[2] = buffer[1];
@@ -751,7 +759,14 @@ output_float (st_parameter_dt *dtp, const fnode *f, GFC_REAL_LARGEST value)
        break;
     }
   if (i == ndigits)
-    sign = calculate_sign (dtp, 0);
+    {
+      /* The output is zero, so set the sign according to the sign bit unless
+        -fno-sign-zero was specified.  */
+      if (compile_options.sign_zero == 1)
+        sign = calculate_sign (dtp, sign_bit);
+      else
+       sign = calculate_sign (dtp, 0);
+    }
 
   /* Work out how much padding is needed.  */
   nblanks = w - (nbefore + nzero + nafter + edigits + 1);
@@ -776,7 +791,6 @@ output_float (st_parameter_dt *dtp, const fnode *f, GFC_REAL_LARGEST value)
 
   /* Pad to full field width.  */
 
-
   if ( ( nblanks > 0 ) && !dtp->u.p.no_leading_blank)
     {
       memset (out, ' ', nblanks);
index 8a86f41..e0cfa45 100644 (file)
@@ -382,6 +382,7 @@ typedef struct
   int convert;
   int dump_core;
   int backtrace;
+  int sign_zero;
   size_t record_marker;
   int max_subrecord_length;
 }
index dc404da..0976a39 100644 (file)
@@ -1,5 +1,5 @@
 /* Handling of compile-time options that influence the library.
-   Copyright (C) 2005 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2007 Free Software Foundation, Inc.
 
 This file is part of the GNU Fortran 95 runtime library (libgfortran).
 
@@ -35,23 +35,25 @@ Boston, MA 02110-1301, USA.  */
 /* Useful compile-time options will be stored in here.  */
 compile_options_t compile_options;
 
-
-/* Prototypes */
-extern void set_std (GFC_INTEGER_4, GFC_INTEGER_4, GFC_INTEGER_4,
-                    GFC_INTEGER_4, GFC_INTEGER_4);
-export_proto(set_std);
-
+/* Set the usual compile-time options.  */
+extern void set_options (int , int []);
+export_proto(set_options);
 
 void
-set_std (GFC_INTEGER_4 warn_std, GFC_INTEGER_4 allow_std,
-        GFC_INTEGER_4 pedantic, GFC_INTEGER_4 dump_core,
-        GFC_INTEGER_4 backtrace)
+set_options (int num, int options[])
 {
-  compile_options.pedantic = pedantic;
-  compile_options.warn_std = warn_std;
-  compile_options.allow_std = allow_std;
-  compile_options.dump_core = dump_core;
-  compile_options.backtrace = backtrace;
+  if (num >= 1)
+    compile_options.warn_std = options[0];
+  if (num >= 2)
+    compile_options.allow_std = options[1];
+  if (num >= 3)
+    compile_options.pedantic = options[2];
+  if (num >= 4)
+    compile_options.dump_core = options[3];
+  if (num >= 5)
+    compile_options.backtrace = options[4];
+  if (num >= 6)
+    compile_options.sign_zero = options[5];
 }
 
 
@@ -67,6 +69,7 @@ init_compile_options (void)
   compile_options.pedantic = 0;
   compile_options.dump_core = 0;
   compile_options.backtrace = 0;
+  compile_options.sign_zero = 1;
 }
 
 /* Function called by the front-end to tell us the