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>
* config/tc-hppa.c (hppa_fix_adjustable): Don't adjust final types

View File

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

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

View 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;

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