diff options
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/config/tc-mips.c | 61 |
2 files changed, 19 insertions, 47 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 508a3bb..614014f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,10 @@ 2011-07-24 Maciej W. Rozycki <macro@codesourcery.com> + * config/tc-mips.c (mips_ip): Make a copy of the instruction's + mnemonic and use it for further processing. + +2011-07-24 Maciej W. Rozycki <macro@codesourcery.com> + * config/tc-mips.c (can_swap_branch_p): Adjust for the rename of INSN_TRAP to INSN_NO_DELAY_SLOT. Remove the check for INSN_SYNC as well as explicit checks for ERET and DERET when scheduling diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index afa8b38..d458c5a 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -8931,67 +8931,38 @@ mips_ip (char *str, struct mips_cl_insn *ip) unsigned int lastpos = 0; unsigned int limlo, limhi; char *s_reset; - char save_c = 0; offsetT min_range, max_range; + char *name; int argnum; unsigned int rtype; + long end; insn_error = NULL; - /* If the instruction contains a '.', we first try to match an instruction - including the '.'. Then we try again without the '.'. */ insn = NULL; - for (s = str; *s != '\0' && !ISSPACE (*s); ++s) - continue; - /* If we stopped on whitespace, then replace the whitespace with null for - the call to hash_find. Save the character we replaced just in case we - have to re-parse the instruction. */ - if (ISSPACE (*s)) - { - save_c = *s; - *s++ = '\0'; - } + /* Try to match an instruction up to a space or to the end. */ + for (end = 0; str[end] != '\0' && !ISSPACE (str[end]); end++) + continue; - insn = (struct mips_opcode *) hash_find (op_hash, str); + /* Make a copy of the instruction so that we can fiddle with it. */ + name = alloca (end + 1); + memcpy (name, str, end); + name[end] = '\0'; - /* If we didn't find the instruction in the opcode table, try again, but - this time with just the instruction up to, but not including the - first '.'. */ + insn = (struct mips_opcode *) hash_find (op_hash, name); if (insn == NULL) { - /* Restore the character we overwrite above (if any). */ - if (save_c) - *(--s) = save_c; - - /* Scan up to the first '.' or whitespace. */ - for (s = str; - *s != '\0' && *s != '.' && !ISSPACE (*s); - ++s) - continue; - - /* If we did not find a '.', then we can quit now. */ - if (*s != '.') - { - insn_error = _("Unrecognized opcode"); - return; - } - - /* Lookup the instruction in the hash table. */ - *s++ = '\0'; - if ((insn = (struct mips_opcode *) hash_find (op_hash, str)) == NULL) - { - insn_error = _("Unrecognized opcode"); - return; - } + insn_error = _("Unrecognized opcode"); + return; } - argsStart = s; + argsStart = s = str + end; for (;;) { bfd_boolean ok; - gas_assert (strcmp (insn->name, str) == 0); + gas_assert (strcmp (insn->name, name) == 0); ok = is_opcode_valid (insn); if (! ok) @@ -9013,8 +8984,6 @@ mips_ip (char *str, struct mips_cl_insn *ip) mips_cpu_info_from_isa (mips_opts.isa)->name); insn_error = buf; } - if (save_c) - *(--s) = save_c; return; } } @@ -10474,8 +10443,6 @@ mips_ip (char *str, struct mips_cl_insn *ip) insn_error = _("Illegal operands"); continue; } - if (save_c) - *(--argsStart) = save_c; insn_error = _("Illegal operands"); return; } |