From e7b564aa85a5d135b65798288784ed9ae9ad9687 Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Sun, 24 Mar 2002 00:43:28 +0000 Subject: [PATCH] * 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. --- sim/igen/ChangeLog | 7 +++++++ sim/igen/gen.c | 25 ++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/sim/igen/ChangeLog b/sim/igen/ChangeLog index a65864b6644..a0d69a5556f 100644 --- a/sim/igen/ChangeLog +++ b/sim/igen/ChangeLog @@ -1,3 +1,10 @@ +2002-03-23 Andrew Cagney + + * 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 * 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 de886190665..7c24b46813f 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) { -- 2.30.2