include/elf/
[deliverable/binutils-gdb.git] / gdb / doublest.c
index f05740d0eb9b44b46dd6285b9902afe4d63af038..859b43900e2a999b4e0f050a4dbbf512e80af57b 100644 (file)
@@ -1,14 +1,14 @@
 /* Floating point routines for GDB, the GNU debugger.
 
    Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
-   1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007
+   1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2007, 2008, 2009
    Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -17,9 +17,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /* Support for converting target fp numbers into host DOUBLEST format.  */
 
@@ -202,6 +200,24 @@ convert_floatformat_to_doublest (const struct floatformat *fmt,
   if (order != fmt->byteorder)
     ufrom = newfrom;
 
+  if (fmt->split_half)
+    {
+      DOUBLEST dtop, dbot;
+      floatformat_to_doublest (fmt->split_half, ufrom, &dtop);
+      /* Preserve the sign of 0, which is the sign of the top
+        half.  */
+      if (dtop == 0.0)
+       {
+         *to = dtop;
+         return;
+       }
+      floatformat_to_doublest (fmt->split_half,
+                            ufrom + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2,
+                            &dbot);
+      *to = dtop + dbot;
+      return;
+    }
+
   exponent = get_field (ufrom, order, fmt->totalsize, fmt->exp_start,
                        fmt->exp_len);
   /* Note that if exponent indicates a NaN, we can't really do anything useful
@@ -394,6 +410,30 @@ convert_doublest_to_floatformat (CONST struct floatformat *fmt,
   memcpy (&dfrom, from, sizeof (dfrom));
   memset (uto, 0, (fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1) 
                     / FLOATFORMAT_CHAR_BIT);
+
+  if (fmt->split_half)
+    {
+      /* Use static volatile to ensure that any excess precision is
+        removed via storing in memory, and so the top half really is
+        the result of converting to double.  */
+      static volatile double dtop, dbot;
+      DOUBLEST dtopnv, dbotnv;
+      dtop = (double) dfrom;
+      /* If the rounded top half is Inf, the bottom must be 0 not NaN
+        or Inf.  */
+      if (dtop + dtop == dtop && dtop != 0.0)
+       dbot = 0.0;
+      else
+       dbot = (double) (dfrom - (DOUBLEST) dtop);
+      dtopnv = dtop;
+      dbotnv = dbot;
+      floatformat_from_doublest (fmt->split_half, &dtopnv, uto);
+      floatformat_from_doublest (fmt->split_half, &dbotnv,
+                              (uto
+                               + fmt->totalsize / FLOATFORMAT_CHAR_BIT / 2));
+      return;
+    }
+
   if (dfrom == 0)
     return;                    /* Result is zero */
   if (dfrom != dfrom)          /* Result is NaN */
@@ -900,7 +940,7 @@ convert_typed_floating (const void *from, const struct type *from_type,
   else
     {
       /* The floating-point types don't match.  The best we can do
-         (aport from simulating the target FPU) is converting to the
+         (apart from simulating the target FPU) is converting to the
          widest floating-point type supported by the host, and then
          again to the desired type.  */
       DOUBLEST d;
This page took 0.025119 seconds and 4 git commands to generate.