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.

[testsuite/ChangeLog]

	* gasp/flonums.asm: New test.
	* gasp/flonums.err: New result.
	* gasp/flonums.out: Likewise.
This commit is contained in:
Ben Elliston
2002-02-13 08:59:26 +00:00
parent 34588f232a
commit 1ac5725353
8 changed files with 143 additions and 0 deletions

View 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> 2002-02-12 John David Anglin <dave@hiauly1.hia.nrc.ca>
* config/tc-hppa.c (hppa_fix_adjustable): Don't adjust final types * config/tc-hppa.c (hppa_fix_adjustable): Don't adjust final types

View File

@ -1,4 +1,8 @@
-*- text -*- -*- 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. Support for the OpenRISC 32-bit embedded processor by OpenCores.
The ARM assembler now accepts -march=..., -mcpu=... and -mfpu=... for The ARM assembler now accepts -march=..., -mcpu=... and -mfpu=... for

View 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 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.) 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 FIXME! What are rules for recognizing number in deflt base? Whatever
@c is left over after parsing other things?? @c is left over after parsing other things??

View File

@ -48,6 +48,7 @@ suitable for gas to consume.
#include "config.h" #include "config.h"
#include "bin-bugs.h" #include "bin-bugs.h"
#include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <getopt.h> #include <getopt.h>
@ -66,6 +67,7 @@ extern char *malloc ();
#include "sb.h" #include "sb.h"
#include "macro.h" #include "macro.h"
#include "asintl.h" #include "asintl.h"
#include "xregex.h"
char *program_version = "1.2"; 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 void hash_add_to_int_table PARAMS ((hash_table *, sb *, int));
static hash_entry *hash_lookup PARAMS ((hash_table *, sb *)); static hash_entry *hash_lookup PARAMS ((hash_table *, sb *));
static void checkconst PARAMS ((int, exp_t *)); 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 sb_strtol PARAMS ((int, sb *, int, int *));
static int level_0 PARAMS ((int, sb *, exp_t *)); static int level_0 PARAMS ((int, sb *, exp_t *));
static int level_1 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 /* 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. */ ptr, and return the index of the first character not in the number. */
@ -1132,6 +1192,10 @@ change_base (idx, in, out)
idx++; idx++;
} }
} }
else if (is_flonum (idx, in))
{
idx = chew_flonum (idx, in, out);
}
else if (ISDIGIT (in->ptr[idx])) else if (ISDIGIT (in->ptr[idx]))
{ {
int value; int value;

View 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> 2002-02-12 John David Anglin <dave@hiauly1.hia.nrc.ca>
* gas/hppa/reloc/reloc.exp (labelopbug.s): Change test to suit * gas/hppa/reloc/reloc.exp (labelopbug.s): Change test to suit

View File

@ -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

View File

View File

@ -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