2002-02-12 Ben Elliston <bje@redhat.com>
authorBen Elliston <bje@au.ibm.com>
Wed, 13 Feb 2002 08:59:26 +0000 (08:59 +0000)
committerBen Elliston <bje@au.ibm.com>
Wed, 13 Feb 2002 08:59:26 +0000 (08:59 +0000)
* NEWS: Document floating point number handling in gasp.
* gasp.c: Include <assert.h> and "xregex.h".
(is_flonum): New function.
(chew_flownum): Likewise.
(change_base): Consume flonums from the input, where possible.
* doc/gasp.texi (Constants): Document floating point numbers.

[testsuite/ChangeLog]

* gasp/flonums.asm: New test.
* gasp/flonums.err: New result.
* gasp/flonums.out: Likewise.

gas/ChangeLog
gas/NEWS
gas/doc/gasp.texi
gas/gasp.c
gas/testsuite/ChangeLog
gas/testsuite/gasp/flonums.asm [new file with mode: 0644]
gas/testsuite/gasp/flonums.err [new file with mode: 0644]
gas/testsuite/gasp/flonums.out [new file with mode: 0644]

index 14b2201..baab322 100644 (file)
@@ -1,3 +1,12 @@
+2002-02-12  Ben Elliston  <bje@redhat.com>
+
+       * NEWS: Document floating point number handling in gasp.
+       * gasp.c: Include <assert.h> and "xregex.h".
+       (is_flonum): New function.
+       (chew_flownum): Likewise.
+       (change_base): Consume flonums from the input, where possible.
+       * doc/gasp.texi (Constants): Document floating point numbers.
+
 2002-02-12  John David Anglin  <dave@hiauly1.hia.nrc.ca>
 
        * config/tc-hppa.c (hppa_fix_adjustable): Don't adjust final types
index 227dba5..c5ecd3d 100644 (file)
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,4 +1,8 @@
 -*- text -*-
+GASP now correctly parses floating point numbers. Unless the base is explicitly
+specified, they are interpreted as decimal numbers regardless of the currently
+specified base.
+
 Support for the OpenRISC 32-bit embedded processor by OpenCores.
 
 The ARM assembler now accepts -march=..., -mcpu=... and -mfpu=... for
index e5bda63..9358059 100644 (file)
@@ -943,6 +943,11 @@ character matches those you can specify with @code{.RADIX}: @samp{B} for
 base 2, @samp{Q} for base 8, @samp{D} for base 10, and @samp{H} for base
 16.  (You can write this character in lower case if you prefer.)
 
+You can write floating point constants using the same syntax recognised
+by GAS @ref{Flonums,,Flonums,as,The GNU Assembler.}.  A constraint is
+that these constants will be interpreted as decimal values irrespective
+of the currently selected base.
+
 @c FIXME! What are rules for recognizing number in deflt base?  Whatever
 @c        is left over after parsing other things??
 
index 73b4d88..dc93622 100644 (file)
@@ -48,6 +48,7 @@ suitable for gas to consume.
 #include "config.h"
 #include "bin-bugs.h"
 
+#include <assert.h>
 #include <stdio.h>
 #include <string.h>
 #include <getopt.h>
@@ -66,6 +67,7 @@ extern char *malloc ();
 #include "sb.h"
 #include "macro.h"
 #include "asintl.h"
+#include "xregex.h"
 
 char *program_version = "1.2";
 
@@ -227,6 +229,8 @@ static void hash_add_to_string_table PARAMS ((hash_table *, sb *, sb *, int));
 static void hash_add_to_int_table PARAMS ((hash_table *, sb *, int));
 static hash_entry *hash_lookup PARAMS ((hash_table *, sb *));
 static void checkconst PARAMS ((int, exp_t *));
+static int is_flonum PARAMS ((int, sb *));
+static int chew_flonum PARAMS ((int, sb *, sb *));
 static int sb_strtol PARAMS ((int, sb *, int, int *));
 static int level_0 PARAMS ((int, sb *, exp_t *));
 static int level_1 PARAMS ((int, sb *, exp_t *));
@@ -522,6 +526,62 @@ checkconst (op, term)
     }
 }
 
+/* Chew the flonum from the string starting at idx.  Adjust idx to
+   point to the next character after the flonum.  */
+
+static int
+chew_flonum (idx, string, out)
+     int idx;
+     sb *string;
+     sb *out;
+{
+  sb buf;
+  regex_t reg;
+  regmatch_t match;
+
+  /* Duplicate and null terminate `string'.  */
+  sb_new (&buf);
+  sb_add_sb (&buf, string);
+  sb_add_char (&buf, '\0');
+
+  if (regcomp (&reg, "([0-9]*\\.[0-9]+([eE][+-]?[0-9]+)?)", REG_EXTENDED) != 0)
+    return idx;
+  if (regexec (&reg, &buf.ptr[idx], 1, &match, 0) != 0)
+    return idx;
+
+  /* Copy the match to the output.  */
+  assert (match.rm_eo >= match.rm_so);
+  sb_add_buffer (out, &buf.ptr[idx], match.rm_eo - match.rm_so);
+
+  sb_kill (&buf);
+  regfree (&reg);
+  idx += match.rm_eo;
+  return idx;
+}
+
+static int
+is_flonum (idx, string)
+     int idx;
+     sb *string;
+{
+  sb buf;
+  regex_t reg;
+  int rc;
+
+  /* Duplicate and null terminate `string'.  */
+  sb_new (&buf);
+  sb_add_sb (&buf, string);
+  sb_add_char (&buf, '\0');
+
+  if (regcomp (&reg, "^[0-9]*\\.[0-9]+([eE][+-]?[0-9]+)?", REG_EXTENDED) != 0)
+    return 0;
+    
+  rc = regexec (&reg, &buf.ptr[idx], 0, NULL, 0);
+  sb_kill (&buf);
+  regfree (&reg);
+  return (rc == 0);
+}
+
 /* Turn the number in string at idx into a number of base, fill in
    ptr, and return the index of the first character not in the number.  */
 
@@ -1132,6 +1192,10 @@ change_base (idx, in, out)
              idx++;
            }
        }
+      else if (is_flonum (idx, in))
+       {
+         idx = chew_flonum (idx, in, out);
+       }
       else if (ISDIGIT (in->ptr[idx]))
        {
          int value;
index dc3f40e..a057524 100644 (file)
@@ -1,3 +1,9 @@
+2002-02-12  Ben Elliston  <bje@redhat.com>
+
+       * gasp/flonums.asm: New test.
+       * gasp/flonums.err: New result.
+       * gasp/flonums.out: Likewise.
+
 2002-02-12  John David Anglin  <dave@hiauly1.hia.nrc.ca>
 
        * gas/hppa/reloc/reloc.exp (labelopbug.s): Change test to suit
diff --git a/gas/testsuite/gasp/flonums.asm b/gas/testsuite/gasp/flonums.asm
new file mode 100644 (file)
index 0000000..e6ddb5a
--- /dev/null
@@ -0,0 +1,19 @@
+.RADIX Q
+       ! test floats now
+       .float -H'C
+       .float -9.0
+       .float 0.9
+       .float +0.9
+       .float +.9
+       .float -00.0009
+       .float -2.900
+       .float 1.1e+10
+       .float +1.1e+10
+       .float +1.1e-10
+       .float -1.1E+10
+       .float +1.1E+1000
+       .float +1.1E+0001 10
+       .float 11.11E-10 10
+       .float H'C.3
+       .float H'C.H'C
+.END
diff --git a/gas/testsuite/gasp/flonums.err b/gas/testsuite/gasp/flonums.err
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/gas/testsuite/gasp/flonums.out b/gas/testsuite/gasp/flonums.out
new file mode 100644 (file)
index 0000000..23bde3d
--- /dev/null
@@ -0,0 +1,36 @@
+!.RADIX Q
+!      ! test floats now
+       ! test floats now
+!      .float -H'C
+       .float -12
+!      .float -9.0
+       .float -9.0
+!      .float 0.9
+       .float 0.9
+!      .float +0.9
+       .float +0.9
+!      .float +.9
+       .float +.9
+!      .float -00.0009
+       .float -00.0009
+!      .float -2.900
+       .float -2.900
+!      .float 1.1e+10
+       .float 1.1e+10
+!      .float +1.1e+10
+       .float +1.1e+10
+!      .float +1.1e-10
+       .float +1.1e-10
+!      .float -1.1E+10
+       .float -1.1E+10
+!      .float +1.1E+1000
+       .float +1.1E+1000
+!      .float +1.1E+0001 10
+       .float +1.1E+0001 8
+!      .float 11.11E-10 10
+       .float 11.11E-10 8
+!      .float H'C.3
+       .float 12.3
+!      .float H'C.H'C
+       .float 12.12
+!.END