sim: ppc: collapse is_readonly & length switch tables heavily
authorMike Frysinger <vapier@gentoo.org>
Wed, 9 Nov 2022 19:24:41 +0000 (02:24 +0700)
committerMike Frysinger <vapier@gentoo.org>
Thu, 10 Nov 2022 07:27:41 +0000 (14:27 +0700)
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.

sim/ppc/dgen.c

index d2ea922ffc913205d96d66c35b47a21757b2d7a5..d772771b9fa7db93294c8e95da4df667314a51aa 100644 (file)
@@ -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.  */