aboutsummaryrefslogtreecommitdiff
path: root/sim/igen
diff options
context:
space:
mode:
Diffstat (limited to 'sim/igen')
-rw-r--r--sim/igen/ChangeLog7
-rw-r--r--sim/igen/gen.c25
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)
{