This is the mail archive of the
binutils@sourceware.cygnus.com
mailing list for the binutils project.
An i386 fp register name patch
- To: binutils@sourceware.cygnus.com
- Subject: An i386 fp register name patch
- From: hjl@varesearch.com (H.J. Lu)
- Date: Fri, 27 Aug 1999 12:18:41 -0700 (PDT)
Here is a patch to handle spaces ina i386 FP register names. I am
enclosing a testcase here.
----
fxch %st( 1)
fxch %st( 1 )
fxch %st ( 1 )
fxch %st (1)
fxch %st(1)
fxch % st(1)
fxch % st(1)
----
Thanks.
--
H.J. Lu (hjl@gnu.org)
--
Fri Aug 27 11:31:30 1999 H.J. Lu (hjl@gnu.org)
* config/tc-i386.c (i386_extract_reg): New function. Handle
spaces in FP register names.
(i386_is_reg): Use it.
(parse_register): Likewise.
Index: config/tc-i386.c
===================================================================
RCS file: /work/cvs/gnu/binutils/gas/config/tc-i386.c,v
retrieving revision 1.5
diff -u -p -r1.5 tc-i386.c
--- config/tc-i386.c 1999/08/21 18:02:59 1.5
+++ config/tc-i386.c 1999/08/27 18:24:16
@@ -2507,25 +2507,57 @@ md_assemble (line)
}
}
+static char * i386_extract_reg PARAMS ((char *, char *, int));
+
+static char *
+i386_extract_reg (s, reg, len)
+ char *s;
+ char *reg;
+ int len;
+{
+ register char *p;
+
+ while (is_space_char (*s))
+ ++s;
+
+ p = reg;
+ while (register_chars[(unsigned char) *s] != '\0'
+ || is_space_char (*s))
+ {
+ if (p >= ® [2] && tolower (reg [0]) == 's'
+ && tolower (reg [1]) == 't'
+ && (p == ® [2]
+ || (reg [2] == '('
+ && (p == ® [3]
+ || (*(p - 1) >= '0' && *(p - 1) <= '9')))))
+ /*
+ 1. %st (1).
+ 2. %st ( 1).
+ 3. %st ( 1 ).
+ */
+ while (is_space_char (*s))
+ ++s;
+
+ if ((*p++ = register_chars[(unsigned char) *s++]) == '\0')
+ break;
+ if (p >= reg + len)
+ return NULL;
+ }
+
+ *p++ = register_chars[(unsigned char) *s++];
+ return (p >= reg + len) ? NULL: s;
+}
+
static int i386_is_reg PARAMS ((char *));
static int
i386_is_reg (reg_string)
char *reg_string;
{
- register char *s = reg_string;
- register char *p;
char reg_name_given[MAX_REG_NAME_SIZE + 1];
-
- if (is_space_char (*s))
- ++s;
- p = reg_name_given;
- while ((*p++ = register_chars[(unsigned char) *s++]) != '\0')
- if (p >= reg_name_given + MAX_REG_NAME_SIZE)
- return 0;
-
- if (!hash_find (reg_hash, reg_name_given))
+ if (!i386_extract_reg (reg_string, reg_name_given, MAX_REG_NAME_SIZE)
+ || !hash_find (reg_hash, reg_name_given))
return 0;
else
return 1;
@@ -4137,7 +4169,6 @@ parse_register (reg_string, end_op)
char **end_op;
{
register char *s = reg_string;
- register char *p;
char reg_name_given[MAX_REG_NAME_SIZE + 1];
const reg_entry *r;
@@ -4145,23 +4176,16 @@ parse_register (reg_string, end_op)
if (*s == REGISTER_PREFIX)
++s;
- if (is_space_char (*s))
- ++s;
-
- p = reg_name_given;
- while ((*p++ = register_chars[(unsigned char) *s++]) != '\0')
+ s = i386_extract_reg (s, reg_name_given, MAX_REG_NAME_SIZE);
+ if (s == NULL)
{
- if (p >= reg_name_given + MAX_REG_NAME_SIZE)
+ if (!allow_naked_reg)
{
- if (!allow_naked_reg)
- {
- *p = '\0';
- as_bad (_("bad register name `%s'"), reg_name_given);
- }
- return (const reg_entry *) NULL;
+ reg_name_given [MAX_REG_NAME_SIZE] = '\0';
+ as_bad (_("bad register name `%s'"), reg_name_given);
}
+ return (const reg_entry *) NULL;
}
-
*end_op = s - 1;
r = (const reg_entry *) hash_find (reg_hash, reg_name_given);