aboutsummaryrefslogtreecommitdiff
path: root/sim/mn10300
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>1997-05-18 22:57:49 +0000
committerJeff Law <law@redhat.com>1997-05-18 22:57:49 +0000
commitb07a1e78c5e0d82d8cf993da497b2afc9cb94a86 (patch)
treeefb62dddb60b69a178ce1464c57cb87dee5494ef /sim/mn10300
parent63aa80ff5151ee867663272a38ac3d7556408fcf (diff)
downloadgdb-b07a1e78c5e0d82d8cf993da497b2afc9cb94a86.zip
gdb-b07a1e78c5e0d82d8cf993da497b2afc9cb94a86.tar.gz
gdb-b07a1e78c5e0d82d8cf993da497b2afc9cb94a86.tar.bz2
* interp.c (load_mem_big): Remove function. It's now a macro
defined elsewhere. (compare_simops): New function. (sim_open): Sort the Simops table before inserting entries into the hash table. * mn10300_sim.h: Remove unused #defines. (load_mem_big): Define. Another 20% so performance improvement for the mn10300 simulator.
Diffstat (limited to 'sim/mn10300')
-rw-r--r--sim/mn10300/ChangeLog10
-rw-r--r--sim/mn10300/interp.c50
2 files changed, 34 insertions, 26 deletions
diff --git a/sim/mn10300/ChangeLog b/sim/mn10300/ChangeLog
index 50db974..a69a3be 100644
--- a/sim/mn10300/ChangeLog
+++ b/sim/mn10300/ChangeLog
@@ -1,3 +1,13 @@
+Sun May 18 16:46:31 1997 Jeffrey A Law (law@cygnus.com)
+
+ * interp.c (load_mem_big): Remove function. It's now a macro
+ defined elsewhere.
+ (compare_simops): New function.
+ (sim_open): Sort the Simops table before inserting entries
+ into the hash table.
+ * mn10300_sim.h: Remove unused #defines.
+ (load_mem_big): Define.
+
Fri May 16 16:36:17 1997 Jeffrey A Law (law@cygnus.com)
* interp.c (load_mem): If we get a load from an out of range
diff --git a/sim/mn10300/interp.c b/sim/mn10300/interp.c
index 1a14039..cf42f23 100644
--- a/sim/mn10300/interp.c
+++ b/sim/mn10300/interp.c
@@ -234,32 +234,6 @@ put_word (addr, data)
a[3] = (data >> 24) & 0xff;
}
-
-uint32
-load_mem_big (addr, len)
- SIM_ADDR addr;
- int len;
-{
- uint8 *p = addr + State.mem;
-
- if (addr > max_mem)
- abort ();
-
- switch (len)
- {
- case 1:
- return p[0];
- case 2:
- return p[0] << 8 | p[1];
- case 3:
- return p[0] << 16 | p[1] << 8 | p[2];
- case 4:
- return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
- default:
- abort ();
- }
-}
-
uint32
load_mem (addr, len)
SIM_ADDR addr;
@@ -357,6 +331,22 @@ sim_write (sd, addr, buffer, size)
return size;
}
+/* Compare two opcode table entries for qsort. */
+static int
+compare_simops (arg1, arg2)
+ const PTR arg1;
+ const PTR arg2;
+{
+ unsigned long code1 = ((struct simops *)arg1)->opcode;
+ unsigned long code2 = ((struct simops *)arg2)->opcode;
+
+ if (code1 < code2)
+ return -1;
+ if (code2 < code1)
+ return 1;
+ return 0;
+}
+
SIM_DESC
sim_open (kind,argv)
SIM_OPEN_KIND kind;
@@ -365,6 +355,14 @@ sim_open (kind,argv)
struct simops *s;
struct hash_entry *h;
char **p;
+ int i;
+
+ /* Sort the opcode array from smallest opcode to largest.
+ This will generally improve simulator performance as the smaller
+ opcodes are generally preferred to the larger opcodes. */
+ for (i = 0, s = Simops; s->func; s++, i++)
+ ;
+ qsort (Simops, i, sizeof (Simops[0]), compare_simops);
sim_kind = kind;
myname = argv[0];