From mboxrd@z Thu Jan 1 00:00:00 1970 From: hjl@varesearch.com (H.J. Lu) To: binutils@sourceware.cygnus.com Subject: An i386 fp register name patch Date: Fri, 27 Aug 1999 12:18:00 -0000 Message-id: <19990827191842.315213FC1@varesearch.com> X-SW-Source: 1999-08/msg00156.html 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);