diff options
-rw-r--r-- | gas/ChangeLog | 6 | ||||
-rw-r--r-- | gas/config/tc-i386.c | 35 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/white.l | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/white.s | 3 | ||||
-rw-r--r-- | include/opcode/ChangeLog | 6 | ||||
-rw-r--r-- | include/opcode/i386.h | 24 |
7 files changed, 69 insertions, 12 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 8861565..6727bab 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,9 @@ +1999-08-29 Alan Modra <alan@spri.levels.unisa.edu.au> + + Based on a patch from H.J. Lu <hjl@gnu.org> + * config/tc-i386.c (parse_register): Handle FP regs specially. + (md_begin): Remove '(' and ')' from register_chars. + 1999-08-29 Doug Evans <devans@casey.cygnus.com> * config/tc-m32r.c (md_parse_option): Delete unrecognized option diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index a2c0bcc..085a4b9 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -703,8 +703,6 @@ md_begin () #ifdef LEX_AT identifier_chars['@'] = '@'; #endif - register_chars[')'] = ')'; - register_chars['('] = '('; digit_chars['-'] = '-'; identifier_chars['_'] = '_'; identifier_chars['.'] = '.'; @@ -4166,6 +4164,39 @@ parse_register (reg_string, end_op) r = (const reg_entry *) hash_find (reg_hash, reg_name_given); + /* Handle floating point regs, allowing spaces in the (i) part. */ + if (r == i386_regtab /* %st is first entry of table */) + { + --s; + if (is_space_char (*s)) + ++s; + if (*s == '(') + { + *p++ = *s++; + if (is_space_char (*s)) + ++s; + if (*s >= '0' && *s <= '7') + { + r = &i386_float_regtab[*s - '0']; + *p++ = *s++; + if (is_space_char (*s)) + ++s; + if (*s == ')') + { + *end_op = s + 1; + return r; + } + *p++ = *s; + } + if (!allow_naked_reg) + { + *p = '\0'; + as_bad (_("bad register name `%s'"), reg_name_given); + } + return (const reg_entry *) NULL; + } + } + if (r == NULL) { if (!allow_naked_reg) diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 824253d..2805e2c 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,7 @@ +1999-08-29 Alan Modra <alan@spri.levels.unisa.edu.au> + + * gas/i386/white.s, gas/i386/white.l: Add space in FP reg tests. + Sat Aug 28 00:16:12 1999 Jerry Quinn <jquinn@nortelnetworks.com> * gas/hppa/basic/basic.exp: Add new tests shift2.s, diff --git a/gas/testsuite/gas/i386/white.l b/gas/testsuite/gas/i386/white.l index 1ce6161..c2d9157 100644 --- a/gas/testsuite/gas/i386/white.l +++ b/gas/testsuite/gas/i386/white.l @@ -19,3 +19,6 @@ GAS LISTING .* 16 0022 66B81300 0000 Mov \$ foo , %eAx 17 .Code32 18 0028 66B81300 mov \$ foo , %ax + 19 + 20 002c D9C9 fxch %st \( 1 \) + 21 002e D9C9 fxch % st\(1\) diff --git a/gas/testsuite/gas/i386/white.s b/gas/testsuite/gas/i386/white.s index 3bf5070..11eccfb 100644 --- a/gas/testsuite/gas/i386/white.s +++ b/gas/testsuite/gas/i386/white.s @@ -16,3 +16,6 @@ foo: jmpw % es : * ( % ebx ) Mov $ foo , %eAx .Code32 mov $ foo , %ax + + fxch %st ( 1 ) + fxch % st(1) diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog index d59e716..ef0da73 100644 --- a/include/opcode/ChangeLog +++ b/include/opcode/ChangeLog @@ -1,3 +1,9 @@ +1999-08-29 Alan Modra <alan@spri.levels.unisa.edu.au> + + * i386.h (i386_regtab): Move %st to top of table, and split off + other fp reg entries. + (i386_float_regtab): To here. + Sat Aug 28 00:25:25 1999 Jerry Quinn <jquinn@nortelnetworks.com> * hppa.h (pa_opcodes): Replace 'f' by 'v'. Prefix float register args diff --git a/include/opcode/i386.h b/include/opcode/i386.h index 3df27f2..7e3a564 100644 --- a/include/opcode/i386.h +++ b/include/opcode/i386.h @@ -1061,6 +1061,8 @@ static const template i386_optab[] = { /* 386 register table */ static const reg_entry i386_regtab[] = { + /* make %st first as we test for it */ + {"st", FloatReg|FloatAcc, 0}, /* 8 bit regs */ {"al", Reg8|Acc, 0}, {"cl", Reg8|ShiftCount, 1}, @@ -1130,16 +1132,7 @@ static const reg_entry i386_regtab[] = { {"tr5", Test, 5}, {"tr6", Test, 6}, {"tr7", Test, 7}, - /* float registers */ - {"st(0)", FloatReg|FloatAcc, 0}, - {"st", FloatReg|FloatAcc, 0}, - {"st(1)", FloatReg, 1}, - {"st(2)", FloatReg, 2}, - {"st(3)", FloatReg, 3}, - {"st(4)", FloatReg, 4}, - {"st(5)", FloatReg, 5}, - {"st(6)", FloatReg, 6}, - {"st(7)", FloatReg, 7}, + /* mmx and simd registers */ {"mm0", RegMMX, 0}, {"mm1", RegMMX, 1}, {"mm2", RegMMX, 2}, @@ -1158,6 +1151,17 @@ static const reg_entry i386_regtab[] = { {"xmm7", RegXMM, 7} }; +static const reg_entry i386_float_regtab[] = { + {"st(0)", FloatReg|FloatAcc, 0}, + {"st(1)", FloatReg, 1}, + {"st(2)", FloatReg, 2}, + {"st(3)", FloatReg, 3}, + {"st(4)", FloatReg, 4}, + {"st(5)", FloatReg, 5}, + {"st(6)", FloatReg, 6}, + {"st(7)", FloatReg, 7} +}; + #define MAX_REG_NAME_SIZE 8 /* for parsing register names from input */ /* segment stuff */ |