* floatformat.c (floatformat_is_valid): New function.
authordrow <drow@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 15 Sep 2003 20:16:32 +0000 (20:16 +0000)
committerdrow <drow@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 15 Sep 2003 20:16:32 +0000 (20:16 +0000)
(get_field, put_field): Correct comments.

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

libiberty/ChangeLog
libiberty/floatformat.c

index e702593..a70872e 100644 (file)
@@ -1,3 +1,8 @@
+2003-09-15  Daniel Jacobowitz  <drow@mvista.com>
+
+       * floatformat.c (floatformat_is_valid): New function.
+       (get_field, put_field): Correct comments.
+
 2003-09-06  Josef Zlomek  <zlomekj@suse.cz>
 
        * fibheap.c (fibheap_replace_key_data): Change type of OKEY to
index d69024f..b892dbe 100644 (file)
@@ -1,5 +1,5 @@
 /* IEEE floating point support routines, for GDB, the GNU Debugger.
-   Copyright (C) 1991, 1994, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1991, 1994, 1999, 2000, 2003 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -149,7 +149,7 @@ static unsigned long get_field PARAMS ((unsigned char *,
                                        unsigned int,
                                        unsigned int));
 
-/* Extract a field which starts at START and is LEN bytes long.  DATA and
+/* Extract a field which starts at START and is LEN bits long.  DATA and
    TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER.  */
 static unsigned long
 get_field (data, order, total_len, start, len)
@@ -273,7 +273,7 @@ static void put_field PARAMS ((unsigned char *, enum floatformat_byteorders,
                               unsigned int,
                               unsigned long));
 
-/* Set a field which starts at START and is LEN bytes long.  DATA and
+/* Set a field which starts at START and is LEN bits long.  DATA and
    TOTAL_LEN are the thing we are extracting it from, in byteorder ORDER.  */
 static void
 put_field (data, order, total_len, start, len, stuff_to_put)
@@ -404,6 +404,39 @@ floatformat_from_double (fmt, from, to)
     }
 }
 
+/* Return non-zero iff the data at FROM is a valid number in format FMT.  */
+
+int
+floatformat_is_valid (fmt, from)
+     const struct floatformat *fmt;
+     char *from;
+{
+  if (fmt == &floatformat_i387_ext)
+    {
+      /* In the i387 double-extended format, if the exponent is all
+        ones, then the integer bit must be set.  If the exponent
+        is neither 0 nor ~0, the intbit must also be set.  Only
+        if the exponent is zero can it be zero, and then it must
+        be zero.  */
+      unsigned long exponent, int_bit;
+      unsigned char *ufrom = (unsigned char *) from;
+
+      exponent = get_field (ufrom, fmt->byteorder, fmt->totalsize,
+                           fmt->exp_start, fmt->exp_len);
+      int_bit = get_field (ufrom, fmt->byteorder, fmt->totalsize,
+                          fmt->man_start, 1);
+
+      if ((exponent == 0) != (int_bit == 0))
+       return 0;
+      else
+       return 1;
+    }
+
+  /* Other formats with invalid representations should be added
+     here.  */
+  return 1;
+}
+
 
 #ifdef IEEE_DEBUG