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:
parent
34588f232a
commit
1ac5725353
|
@ -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
|
||||
|
|
4
gas/NEWS
4
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
|
||||
|
|
|
@ -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??
|
||||
|
||||
|
|
64
gas/gasp.c
64
gas/gasp.c
|
@ -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 (®, "([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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue