summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2022-11-10 02:24:41 +0700
committerMike Frysinger <vapier@gentoo.org>2022-11-10 14:27:41 +0700
commit40466c48e843221e010209e4baa4197debf7a092 (patch)
tree2d9e5c3af866f56743161f88f9b2f6290bbea9a2
parent1eff12f75acd62066399437042b7c016463ad932 (diff)
downloadbinutils-gdb-40466c48e843221e010209e4baa4197debf7a092.tar.gz
sim: ppc: collapse is_readonly & length switch tables heavily
Since we know we'll return 0 by default, we don't have to output case statements for readonly or length fields whose values are also zero. This is the most common case by far and thus generates a much smaller switch table in the end.
-rw-r--r--sim/ppc/dgen.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/sim/ppc/dgen.c b/sim/ppc/dgen.c
index d2ea922ffc9..d772771b9fa 100644
--- a/sim/ppc/dgen.c
+++ b/sim/ppc/dgen.c
@@ -238,14 +238,22 @@ gen_spreg_c(spreg_table *table, lf *file)
spreg_table_entry *entry;
lf_printf(file, " switch (spr) {\n");
for (entry = table->sprs; entry != NULL; entry = entry->next) {
- lf_printf(file, " case %d:\n", entry->spreg_nr);
- if (strcmp(*attribute, "is_valid") == 0)
+ if (strcmp(*attribute, "is_valid") == 0) {
+ lf_printf(file, " case %d:\n", entry->spreg_nr);
/* No return -- see below. */;
- else if (strcmp(*attribute, "is_readonly") == 0)
- lf_printf(file, " return %d;\n", entry->is_readonly);
- else if (strcmp(*attribute, "length") == 0)
- lf_printf(file, " return %d;\n", entry->length);
- else
+ } else if (strcmp(*attribute, "is_readonly") == 0) {
+ /* Since we return 0 by default, only output non-zero entries. */
+ if (entry->is_readonly) {
+ lf_printf(file, " case %d:\n", entry->spreg_nr);
+ lf_printf(file, " return %d;\n", entry->is_readonly);
+ }
+ } else if (strcmp(*attribute, "length") == 0) {
+ /* Since we return 0 by default, only output non-zero entries. */
+ if (entry->length) {
+ lf_printf(file, " case %d:\n", entry->spreg_nr);
+ lf_printf(file, " return %d;\n", entry->length);
+ }
+ } else
ASSERT(0);
}
/* Output a single return for is_valid. */