From 1ac57253535242e3484562556cb262184e38d646 Mon Sep 17 00:00:00 2001 From: Ben Elliston Date: Wed, 13 Feb 2002 08:59:26 +0000 Subject: [PATCH] 2002-02-12 Ben Elliston * NEWS: Document floating point number handling in gasp. * gasp.c: Include 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 | 9 ++++++ gas/NEWS | 4 +++ gas/doc/gasp.texi | 5 ++++ gas/gasp.c | 64 ++++++++++++++++++++++++++++++++++++++++++ gas/testsuite/ChangeLog | 6 ++++ gas/testsuite/gasp/flonums.asm | 19 +++++++++++++ gas/testsuite/gasp/flonums.err | 0 gas/testsuite/gasp/flonums.out | 36 ++++++++++++++++++++++++ 8 files changed, 143 insertions(+) create mode 100644 gas/testsuite/gasp/flonums.asm create mode 100644 gas/testsuite/gasp/flonums.err create mode 100644 gas/testsuite/gasp/flonums.out diff --git a/gas/ChangeLog b/gas/ChangeLog index 14b2201..baab322 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2002-02-12 Ben Elliston + + * NEWS: Document floating point number handling in gasp. + * gasp.c: Include 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 * config/tc-hppa.c (hppa_fix_adjustable): Don't adjust final types diff --git a/gas/NEWS b/gas/NEWS index 227dba5..c5ecd3d 100644 --- 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 diff --git a/gas/doc/gasp.texi b/gas/doc/gasp.texi index e5bda63..9358059 100644 --- a/gas/doc/gasp.texi +++ b/gas/doc/gasp.texi @@ -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?? diff --git a/gas/gasp.c b/gas/gasp.c index 73b4d88..dc93622 100644 --- a/gas/gasp.c +++ b/gas/gasp.c @@ -48,6 +48,7 @@ suitable for gas to consume. #include "config.h" #include "bin-bugs.h" +#include #include #include #include @@ -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 (®, "([0-9]*\\.[0-9]+([eE][+-]?[0-9]+)?)", REG_EXTENDED) != 0) + return idx; + if (regexec (®, &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 (®); + 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 (®, "^[0-9]*\\.[0-9]+([eE][+-]?[0-9]+)?", REG_EXTENDED) != 0) + return 0; + + rc = regexec (®, &buf.ptr[idx], 0, NULL, 0); + sb_kill (&buf); + regfree (®); + 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; diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index dc3f40e..a057524 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2002-02-12 Ben Elliston + + * gasp/flonums.asm: New test. + * gasp/flonums.err: New result. + * gasp/flonums.out: Likewise. + 2002-02-12 John David Anglin * 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 index 0000000..e6ddb5a --- /dev/null +++ b/gas/testsuite/gasp/flonums.asm @@ -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 index 0000000..e69de29 diff --git a/gas/testsuite/gasp/flonums.out b/gas/testsuite/gasp/flonums.out new file mode 100644 index 0000000..23bde3d --- /dev/null +++ b/gas/testsuite/gasp/flonums.out @@ -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 -- 2.7.4