diff options
author | Mike Frysinger <vapier@gentoo.org> | 2022-11-10 02:24:41 +0700 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2022-11-10 14:27:41 +0700 |
commit | 40466c48e843221e010209e4baa4197debf7a092 (patch) | |
tree | 2d9e5c3af866f56743161f88f9b2f6290bbea9a2 /sim | |
parent | 1eff12f75acd62066399437042b7c016463ad932 (diff) | |
download | binutils-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.
Diffstat (limited to 'sim')
-rw-r--r-- | sim/ppc/dgen.c | 22 |
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. */ |