diff options
Diffstat (limited to 'sim/igen')
-rw-r--r-- | sim/igen/ChangeLog | 7 | ||||
-rw-r--r-- | sim/igen/gen.c | 25 |
2 files changed, 31 insertions, 1 deletions
diff --git a/sim/igen/ChangeLog b/sim/igen/ChangeLog index a65864b..a0d69a5 100644 --- a/sim/igen/ChangeLog +++ b/sim/igen/ChangeLog @@ -1,3 +1,10 @@ +2002-03-23 Andrew Cagney <ac131313@redhat.com> + + * gen.c (format_name_cmp): New function. + (insn_list_insert): Use the instruction field name as an + additional key. Different field names indicate different + semantics. + 2002-03-07 Chris Demetriou <cgd@broadcom.com> * igen.c (print_itrace_format): Add support for a new "%#lx" format. diff --git a/sim/igen/gen.c b/sim/igen/gen.c index de88619..7c24b46 100644 --- a/sim/igen/gen.c +++ b/sim/igen/gen.c @@ -308,7 +308,18 @@ new_opcode_bits (opcode_bits *old_bits, } } - +/* Same as strcmp(). */ +static int +format_name_cmp (const char *l, const char *r) +{ + if (l == NULL && r == NULL) + return 0; + if (l != NULL && r == NULL) + return -1; + if (l == NULL && r != NULL) + return +1; + return strcmp (l, r); +} typedef enum { @@ -351,6 +362,18 @@ insn_list_insert (insn_list **cur_insn_ptr, else if (cmp > 0) continue; + /* key#4 sort according to the format-name. If two apparently + identical instructions have unique format-names, then the + instructions are different. This is because the + format-name's use is overloaded, it not only indicates the + format name but also provides a unique semantic name for the + function. */ + cmp = format_name_cmp (insn->format_name, (*cur_insn_ptr)->insn->format_name); + if (cmp < 0) + break; + else if (cmp > 0) + continue; + /* duplicate keys, report problem */ switch (duplicate_action) { |