public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/7] sim: ppc: constify spreg table
@ 2022-11-09 20:01 Mike Frysinger
  2022-11-09 20:01 ` [PATCH 2/7] sim: ppc: pull default switch return out Mike Frysinger
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Mike Frysinger @ 2022-11-09 20:01 UTC (permalink / raw)
  To: gdb-patches

This internal table is only ever read, so constify it.
---
 sim/ppc/dgen.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/sim/ppc/dgen.c b/sim/ppc/dgen.c
index caafe07a6aab..0f9b02f91084 100644
--- a/sim/ppc/dgen.c
+++ b/sim/ppc/dgen.c
@@ -196,14 +196,14 @@ gen_spreg_c(spreg_table *table, lf *file)
 
   lf_printf(file, "\n");
   lf_printf(file, "typedef struct _spreg_info {\n");
-  lf_printf(file, "  char *name;\n");
+  lf_printf(file, "  const char *name;\n");
   lf_printf(file, "  int is_valid;\n");
   lf_printf(file, "  int length;\n");
   lf_printf(file, "  int is_readonly;\n");
   lf_printf(file, "  int index;\n");
   lf_printf(file, "} spreg_info;\n");
   lf_printf(file, "\n");
-  lf_printf(file, "static spreg_info spr_info[nr_of_sprs+1] = {\n");
+  lf_printf(file, "static const spreg_info spr_info[nr_of_sprs+1] = {\n");
   entry = table->sprs;
   for (spreg_nr = 0; spreg_nr < nr_of_sprs+1; spreg_nr++) {
     if (entry == NULL || spreg_nr < entry->spreg_nr)
-- 
2.38.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/7] sim: ppc: pull default switch return out
  2022-11-09 20:01 [PATCH 1/7] sim: ppc: constify spreg table Mike Frysinger
@ 2022-11-09 20:01 ` Mike Frysinger
  2022-11-09 20:01 ` [PATCH 3/7] sim: ppc: collapse is_valid switch table more Mike Frysinger
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Mike Frysinger @ 2022-11-09 20:01 UTC (permalink / raw)
  To: gdb-patches

This saves a single line for the same result.  By itself, it's not
interesting, but we can further optimize the generated output and
completely omit the switch table in some cases.  Which we'll do in
follow up commits.
---
 sim/ppc/dgen.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/sim/ppc/dgen.c b/sim/ppc/dgen.c
index 0f9b02f91084..0cc210b5fed1 100644
--- a/sim/ppc/dgen.c
+++ b/sim/ppc/dgen.c
@@ -248,9 +248,8 @@ gen_spreg_c(spreg_table *table, lf *file)
 	else
 	  ASSERT(0);
       }
-      lf_printf(file, "  default:\n");
-      lf_printf(file, "    return 0;\n");
       lf_printf(file, "  }\n");
+      lf_printf(file, "  return 0;\n");
     }
     lf_printf(file, "}\n");
   }
-- 
2.38.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/7] sim: ppc: collapse is_valid switch table more
  2022-11-09 20:01 [PATCH 1/7] sim: ppc: constify spreg table Mike Frysinger
  2022-11-09 20:01 ` [PATCH 2/7] sim: ppc: pull default switch return out Mike Frysinger
@ 2022-11-09 20:01 ` Mike Frysinger
  2022-11-09 20:01 ` [PATCH 4/7] sim: ppc: collapse is_readonly & length switch tables heavily Mike Frysinger
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Mike Frysinger @ 2022-11-09 20:01 UTC (permalink / raw)
  To: gdb-patches

Instead of writing:
  case 1:
    return 1;
  case 2:
    return 1;
  ...etc...

Output a single return so we get:
  case 1:
  case 2:
  case ...
    return 1;

This saves ~100 lines of code.  Hopefully the compiler was already
smart enough to optimize to the same code, but if not, this probably
helps there too :).
---
 sim/ppc/dgen.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/sim/ppc/dgen.c b/sim/ppc/dgen.c
index 0cc210b5fed1..d2ea922ffc91 100644
--- a/sim/ppc/dgen.c
+++ b/sim/ppc/dgen.c
@@ -240,7 +240,7 @@ gen_spreg_c(spreg_table *table, lf *file)
       for (entry = table->sprs; entry != NULL; entry = entry->next) {
 	lf_printf(file, "  case %d:\n", entry->spreg_nr);
 	if (strcmp(*attribute, "is_valid") == 0)
-	  lf_printf(file, "    return 1;\n");
+	  /* 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)
@@ -248,6 +248,9 @@ gen_spreg_c(spreg_table *table, lf *file)
 	else
 	  ASSERT(0);
       }
+      /* Output a single return for is_valid.  */
+      if (strcmp(*attribute, "is_valid") == 0)
+	lf_printf(file, "    return 1;\n");
       lf_printf(file, "  }\n");
       lf_printf(file, "  return 0;\n");
     }
-- 
2.38.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 4/7] sim: ppc: collapse is_readonly & length switch tables heavily
  2022-11-09 20:01 [PATCH 1/7] sim: ppc: constify spreg table Mike Frysinger
  2022-11-09 20:01 ` [PATCH 2/7] sim: ppc: pull default switch return out Mike Frysinger
  2022-11-09 20:01 ` [PATCH 3/7] sim: ppc: collapse is_valid switch table more Mike Frysinger
@ 2022-11-09 20:01 ` Mike Frysinger
  2022-11-09 20:01 ` [PATCH 5/7] sim: ppc: drop support for dgen -L option Mike Frysinger
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Mike Frysinger @ 2022-11-09 20:01 UTC (permalink / raw)
  To: gdb-patches

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 | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/sim/ppc/dgen.c b/sim/ppc/dgen.c
index d2ea922ffc91..d772771b9fa7 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.  */
-- 
2.38.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 5/7] sim: ppc: drop support for dgen -L option
  2022-11-09 20:01 [PATCH 1/7] sim: ppc: constify spreg table Mike Frysinger
                   ` (2 preceding siblings ...)
  2022-11-09 20:01 ` [PATCH 4/7] sim: ppc: collapse is_readonly & length switch tables heavily Mike Frysinger
@ 2022-11-09 20:01 ` Mike Frysinger
  2022-11-09 20:01 ` [PATCH 6/7] sim: ppc: change spreg switch table generation to compile-time Mike Frysinger
  2022-11-09 20:01 ` [PATCH 7/7] sim: ppc: move spreg.[ch] files to the source tree Mike Frysinger
  5 siblings, 0 replies; 9+ messages in thread
From: Mike Frysinger @ 2022-11-09 20:01 UTC (permalink / raw)
  To: gdb-patches

Nothing passes this to dgen, and even if it did, nothing would happen
because the generated spreg.[ch] files don't include any references
back to the original data table.  So drop it to simplify.
---
 sim/ppc/dgen.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/sim/ppc/dgen.c b/sim/ppc/dgen.c
index d772771b9fa7..8a17700820e5 100644
--- a/sim/ppc/dgen.c
+++ b/sim/ppc/dgen.c
@@ -292,10 +292,9 @@ main(int argc,
     printf("-n <file-name>  Use this as cpp line numbering name\n");
     printf("-h  Output header file\n");
     printf("-p <spreg-file>  Output spreg.h(P) or spreg.c(p)\n");
-    printf("-L  Suppress cpp line numbering in output files\n");
   }
 
-  while ((ch = getopt_long (argc, argv, "hLsn:r:p:", longopts, NULL))
+  while ((ch = getopt_long (argc, argv, "hsn:r:p:", longopts, NULL))
 	 != -1)
   {
 #if 0  /* For debugging.  */
@@ -311,9 +310,6 @@ main(int argc,
     case 'n':
       real_file_name = strdup(optarg);
       break;
-    case 'L':
-      file_references = lf_omit_references;
-      break;
     case 'h':
       is_header = 1;
       break;
-- 
2.38.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 6/7] sim: ppc: change spreg switch table generation to compile-time
  2022-11-09 20:01 [PATCH 1/7] sim: ppc: constify spreg table Mike Frysinger
                   ` (3 preceding siblings ...)
  2022-11-09 20:01 ` [PATCH 5/7] sim: ppc: drop support for dgen -L option Mike Frysinger
@ 2022-11-09 20:01 ` Mike Frysinger
  2022-11-09 20:01 ` [PATCH 7/7] sim: ppc: move spreg.[ch] files to the source tree Mike Frysinger
  5 siblings, 0 replies; 9+ messages in thread
From: Mike Frysinger @ 2022-11-09 20:01 UTC (permalink / raw)
  To: gdb-patches

Simplify the generator by always outputting the switch tables, and
leave the choice of whether to use them to the compiler via a -D
flag.
---
 sim/ppc/Makefile.in  |  6 ++++--
 sim/ppc/configure    |  2 +-
 sim/ppc/configure.ac |  2 +-
 sim/ppc/dgen.c       | 21 ++++++++++-----------
 4 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/sim/ppc/Makefile.in b/sim/ppc/Makefile.in
index 05f357a31a0a..a07a3262961a 100644
--- a/sim/ppc/Makefile.in
+++ b/sim/ppc/Makefile.in
@@ -70,6 +70,7 @@ FLOAT_CFLAGS = @sim_float@
 MONITOR_CFLAGS = @sim_monitor@
 MODEL_CFLAGS = @sim_model@ @sim_default_model@ @sim_model_issue@
 TERMIO_CFLAGS = @sim_termio@
+SWITCH_CFLAGS = @sim_switch@
 CONFIG_CFLAGS = \
   $(SMP_CFLAGS) \
   $(XOR_ENDIAN_CFLAGS) \
@@ -79,7 +80,8 @@ CONFIG_CFLAGS = \
   $(FLOAT_CFLAGS) \
   $(MONITOR_CFLAGS) \
   $(MODEL_CFLAGS) \
-  $(TERMIO_CFLAGS)
+  $(TERMIO_CFLAGS) \
+  $(SWITCH_CFLAGS)
 SIM_FPU_CFLAGS = -DHAVE_COMMON_FPU -I../common -I${srcdir}/../common
 
 STD_CFLAGS	= $(CFLAGS) $(WERROR_CFLAGS) $(INLINE_CFLAGS) $(CONFIG_CFLAGS) $(WARN_CFLAGS) $(INCLUDES) $(INCGNU) $(SIM_FPU_CFLAGS)
@@ -99,7 +101,7 @@ IGEN_FILTER = @sim_filter@
 IGEN_ICACHE = @sim_icache@
 IGEN_SMP = @sim_igen_smp@
 IGEN_LINE_NR = @sim_line_nr@
-DGEN_FLAGS = @sim_switch@
+DGEN_FLAGS =
 
 IGEN_FLAGS = \
 	$(IGEN_DECODE_MECHANISM) \
diff --git a/sim/ppc/configure.ac b/sim/ppc/configure.ac
index cd9edd0de4cd..5260fa0ba7af 100644
--- a/sim/ppc/configure.ac
+++ b/sim/ppc/configure.ac
@@ -345,7 +345,7 @@ fi])dnl
 AC_ARG_ENABLE(sim-switch,
 [  --enable-sim-switch			Use a switch instead of a table for instruction call.],
 [case "${enableval}" in
-  yes)	sim_switch="-s";;
+  yes)	sim_switch="-DWITH_SPREG_SWITCH_TABLE";;
   no)	sim_switch="";;
   *)	AC_MSG_ERROR("--enable-sim-switch does not take a value"); sim_switch="";;
 esac
diff --git a/sim/ppc/dgen.c b/sim/ppc/dgen.c
index 8a17700820e5..73f8d7d45825 100644
--- a/sim/ppc/dgen.c
+++ b/sim/ppc/dgen.c
@@ -39,7 +39,6 @@
 
 /****************************************************************/
 
-int spreg_lookup_table = 1;
 enum {
   nr_of_sprs = 1024,
 };
@@ -185,6 +184,7 @@ gen_spreg_c(spreg_table *table, lf *file)
   spreg_table_entry *entry;
   char **attribute;
   int spreg_nr;
+  int spreg_lookup_table;
 
   lf_print__gnu_copyleft(file);
   lf_printf(file, "\n");
@@ -229,13 +229,11 @@ gen_spreg_c(spreg_table *table, lf *file)
     }
     lf_printf(file, "spr_%s(sprs spr)\n", *attribute);
     lf_printf(file, "{\n");
-    if (spreg_lookup_table
-	|| strcmp(*attribute, "name") == 0
-	|| strcmp(*attribute, "index") == 0)
-      lf_printf(file, "  return spr_info[spr].%s;\n",
-		*attribute);
-    else {
+    spreg_lookup_table = !(strcmp(*attribute, "name") == 0
+			   || strcmp(*attribute, "index") == 0);
+    if (spreg_lookup_table) {
       spreg_table_entry *entry;
+      lf_printf(file, "#ifdef WITH_SPREG_SWITCH_TABLE\n");
       lf_printf(file, "  switch (spr) {\n");
       for (entry = table->sprs; entry != NULL; entry = entry->next) {
 	if (strcmp(*attribute, "is_valid") == 0) {
@@ -261,7 +259,12 @@ gen_spreg_c(spreg_table *table, lf *file)
 	lf_printf(file, "    return 1;\n");
       lf_printf(file, "  }\n");
       lf_printf(file, "  return 0;\n");
+      lf_printf(file, "#else\n");
     }
+    lf_printf(file, "  return spr_info[spr].%s;\n",
+	      *attribute);
+    if (spreg_lookup_table)
+      lf_printf(file, "#endif\n");
     lf_printf(file, "}\n");
   }
 
@@ -288,7 +291,6 @@ main(int argc,
 
   if (argc <= 1) {
     printf("Usage: dgen ...\n");
-    printf("-s  Use switch instead of table\n");
     printf("-n <file-name>  Use this as cpp line numbering name\n");
     printf("-h  Output header file\n");
     printf("-p <spreg-file>  Output spreg.h(P) or spreg.c(p)\n");
@@ -301,9 +303,6 @@ main(int argc,
     fprintf(stderr, "\t-%c %s\n", ch, ( optarg ? optarg : ""));
 #endif
     switch(ch) {
-    case 's':
-      spreg_lookup_table = 0;
-      break;
     case 'r':
       sprs = spreg_table_load(optarg);
       break;
-- 
2.38.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 7/7] sim: ppc: move spreg.[ch] files to the source tree
  2022-11-09 20:01 [PATCH 1/7] sim: ppc: constify spreg table Mike Frysinger
                   ` (4 preceding siblings ...)
  2022-11-09 20:01 ` [PATCH 6/7] sim: ppc: change spreg switch table generation to compile-time Mike Frysinger
@ 2022-11-09 20:01 ` Mike Frysinger
  2022-12-20  1:50   ` [PATCH 1/2] " Mike Frysinger
  5 siblings, 1 reply; 9+ messages in thread
From: Mike Frysinger @ 2022-11-09 20:01 UTC (permalink / raw)
  To: gdb-patches

Simplify the build by moving the generation of these files from
build-time (via dgen.c that we have to compile & execute on the
build system) to maintainer/release mode (via dgen.py that we
only ever execute when the spreg table actually changes).  This
speeds up the build process and makes it easier for us to reason
about & review changes to the code generator.
---
 sim/Makefile.in     |   10 +
 sim/ppc/Makefile.in |   31 +-
 sim/ppc/dgen.c      |  334 ------------
 sim/ppc/dgen.py     |  301 +++++++++++
 sim/ppc/local.mk    |   10 +
 sim/ppc/options.c   |    4 -
 sim/ppc/spreg.c     | 1175 +++++++++++++++++++++++++++++++++++++++++++
 sim/ppc/spreg.h     |  108 ++++
 8 files changed, 1610 insertions(+), 363 deletions(-)
 delete mode 100644 sim/ppc/dgen.c
 create mode 100755 sim/ppc/dgen.py
 create mode 100644 sim/ppc/spreg.c
 create mode 100644 sim/ppc/spreg.h

diff --git a/sim/ppc/Makefile.in b/sim/ppc/Makefile.in
index a07a3262961a..398b34e8dbcf 100644
--- a/sim/ppc/Makefile.in
+++ b/sim/ppc/Makefile.in
@@ -101,7 +101,6 @@ IGEN_FILTER = @sim_filter@
 IGEN_ICACHE = @sim_icache@
 IGEN_SMP = @sim_igen_smp@
 IGEN_LINE_NR = @sim_line_nr@
-DGEN_FLAGS =
 
 IGEN_FLAGS = \
 	$(IGEN_DECODE_MECHANISM) \
@@ -112,11 +111,10 @@ IGEN_FLAGS = \
 	$(IGEN_SMP) \
 	$(IGEN_LINE_NR)
 
-# igen/dgen leak memory, and therefore makes AddressSanitizer unhappy.  Disable
-# leak detection while running them.
+# igen leaks memory, and therefore makes AddressSanitizer unhappy.  Disable
+# leak detection while running it.
 
 IGEN = ASAN_OPTIONS=detect_leaks=0 ./igen
-DGEN = ASAN_OPTIONS=detect_leaks=0 ./dgen
 
 .NOEXPORT:
 MAKEOVERRIDES=
@@ -416,7 +414,6 @@ BUILT_SRC_WO_CONFIG = \
 	idecode.h idecode.c \
 	semantics.h semantics.c \
 	itable.h itable.c \
-	spreg.h spreg.c \
 	model.h model.c \
 	support.h support.c \
 	pk.h \
@@ -516,7 +513,7 @@ PACKAGE_SRC = pk_disklabel.c
 PACKAGE_OBJ = $(PACKAGE_SRC:.c=.o)
 
 
-$(TARGETLIB): tmp-igen tmp-dgen tmp-hw tmp-defines $(LIB_OBJ) $(GDB_OBJ)
+$(TARGETLIB): tmp-igen tmp-hw tmp-defines $(LIB_OBJ) $(GDB_OBJ)
 	$(ECHO_AR) $(AR) $(AR_FLAGS) $(TARGETLIB) $(LIB_OBJ) $(GDB_OBJ)
 	$(ECHO_RANLIB) $(RANLIB) $(TARGETLIB)
 
@@ -588,7 +585,7 @@ sim-fpu.o: $(srcdir)/../common/sim-fpu.c $(CONFIG_H)
 
 # Rebuild options whenever something changes so the date/time is up to date.
 options.o: options.c $(CPU_H) $(OPTIONS_H) $(DEFINES_H) $(BASICS_H) $(IDECODE_H) $(INLINE) $(LIB_SRC) $(BUILT_SRC) config.status Makefile
-	$(ECHO_CC) $(CC) -c $(STD_CFLAGS) '-DOPCODE_RULES="@sim_opcode@"' '-DIGEN_FLAGS="$(IGEN_FLAGS)"' '-DDGEN_FLAGS="$(DGEN_FLAGS)"' $(srcdir)/options.c
+	$(ECHO_CC) $(CC) -c $(STD_CFLAGS) '-DOPCODE_RULES="@sim_opcode@"' '-DIGEN_FLAGS="$(IGEN_FLAGS)"' $(srcdir)/options.c
 
 defines.h: tmp-defines; @true
 tmp-defines: config.h Makefile
@@ -600,15 +597,6 @@ tmp-defines: config.h Makefile
 # Rules to create the built c source code files
 #
 
-tmp-dgen: dgen ppc-spr-table $(srcroot)/move-if-change
-	$(ECHO_GEN) $(DGEN) $(DGEN_FLAGS) \
-		-r $(srcdir)/ppc-spr-table \
-		-n spreg.h -hp tmp-spreg.h \
-		-n spreg.c -p  tmp-spreg.c
-	$(SILENCE) $(SHELL) $(srcroot)/move-if-change tmp-spreg.h spreg.h
-	$(SILENCE) $(SHELL) $(srcroot)/move-if-change tmp-spreg.c spreg.c
-	$(SILENCE) touch $@
-
 tmp-igen: igen $(srcdir)/ppc-instructions $(srcdir)/altivec.igen $(srcdir)/e500.igen $(IGEN_OPCODE_RULES) $(srcroot)/move-if-change
 	$(ECHO_GEN) $(IGEN) $(IGEN_FLAGS) \
 		-o $(srcdir)/$(IGEN_OPCODE_RULES) \
@@ -642,12 +630,8 @@ tmp-igen: igen $(srcdir)/ppc-instructions $(srcdir)/altivec.igen $(srcdir)/e500.
 # NOTE: Some versions of make don't handle files created as side-effects
 # uncomment the below if that is the case.
 
-$(TARGETLIB): tmp-igen tmp-dgen
+$(TARGETLIB): tmp-igen
 itable.h itable.c icache.h icache.c idecode.h idecode.c semantics.h semantics.c model.h model.c support.h support.c: tmp-igen
-spreg.h spreg.c: tmp-dgen
-
-dgen: dgen.o table.o lf.o misc.o filter_host.o
-	$(ECHO_CCLD) $(LINK_FOR_BUILD) dgen.o table.o lf.o misc.o filter_host.o
 
 igen: igen.o table.o lf.o misc.o filter_host.o ld-decode.o ld-cache.o filter.o ld-insn.o gen-model.o gen-itable.o gen-icache.o gen-semantics.o gen-idecode.o gen-support.o
 	$(ECHO_CCLD) $(LINK_FOR_BUILD) igen.o table.o lf.o misc.o filter_host.o ld-decode.o ld-cache.o filter.o ld-insn.o gen-model.o gen-itable.o gen-icache.o gen-semantics.o gen-idecode.o gen-support.o
@@ -702,9 +686,6 @@ gen-idecode.o: gen-idecode.c $(MISC_H) $(LF_H) $(TABLE_H) $(FILTER_H) $(LD_DECOD
 gen-support.o: gen-support.c $(MISC_H) $(LF_H) $(TABLE_H) $(FILTER_H) $(LD_DECODE_H) $(LD_CACHE_H) $(LD_INSN_H) $(IGEN_H) $(GEN_SEMANTICS_H) $(GEN_SUPPORT_H)
 	$(ECHO_CC) $(COMPILE_FOR_BUILD) -c $(srcdir)/gen-support.c
 
-dgen.o: dgen.c $(CONFIG_H) $(MISC_H) $(LF_H) $(TABLE_H)
-	$(ECHO_CC) $(COMPILE_FOR_BUILD) -c $(srcdir)/dgen.c
-
 igen.o: igen.c $(MISC_H) $(LF_H) $(TABLE_H) $(CONFIG_H) $(FILTER_H) $(LD_CACHE_H) $(LD_DECODE_H) $(LD_INSN_H) $(IGEN_H) $(GEN_MODEL_H) $(GEN_ICACHE_H) $(GEN_ITABLE_H) $(GEN_IDECODE_H) $(GEN_SEMANTICS_H) $(GEN_SUPPORT_H)
 	$(ECHO_CC) $(COMPILE_FOR_BUILD) -c $(srcdir)/igen.c
 
@@ -801,7 +782,7 @@ TAGS: $(BUILT_SRC)
 	etags $(srcdir)/*.h $(srcdir)/*.c $(BUILT_SRC)
 
 clean mostlyclean:
-	rm -f tmp-* *.[oasi] core igen dgen $(BUILT_SRC_WO_CONFIG)
+	rm -f tmp-* *.[oasi] core igen $(BUILT_SRC_WO_CONFIG)
 
 distclean realclean: clean
 	rm -f TAGS Makefile config.cache config.status config.h defines.h stamp-h config.log
diff --git a/sim/ppc/dgen.c b/sim/ppc/dgen.c
deleted file mode 100644
index 73f8d7d45825..000000000000
--- a/sim/ppc/dgen.c
+++ /dev/null
@@ -1,334 +0,0 @@
-/*  This file is part of the program psim.
-
-    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
- 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, see <http://www.gnu.org/licenses/>.
- 
-    */
-
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <getopt.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <stdarg.h>
-
-#include "build-config.h"
-#include "misc.h"
-#include "lf.h"
-#include "table.h"
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-
-/****************************************************************/
-
-enum {
-  nr_of_sprs = 1024,
-};
-
-/****************************************************************/
-
-
-typedef enum {
-  spreg_name,
-  spreg_reg_nr,
-  spreg_readonly,
-  spreg_length,
-  nr_spreg_fields,
-} spreg_fields;
-
-typedef struct _spreg_table_entry spreg_table_entry;
-struct _spreg_table_entry {
-  char *name;
-  int spreg_nr;
-  int is_readonly;
-  int length;
-  table_entry *entry;
-  spreg_table_entry *next;
-};
-
-typedef struct _spreg_table spreg_table;
-struct _spreg_table {
-  spreg_table_entry *sprs;
-};
-
-static void
-spreg_table_insert(spreg_table *table, table_entry *entry)
-{
-  /* create a new spr entry */
-  spreg_table_entry *new_spr = ZALLOC(spreg_table_entry);
-  new_spr->next = NULL;
-  new_spr->entry = entry;
-  new_spr->spreg_nr = atoi(entry->fields[spreg_reg_nr]);
-  new_spr->is_readonly = (entry->fields[spreg_readonly]
-			  ? atoi(entry->fields[spreg_readonly])
-			  : 0);
-  new_spr->length = atoi(entry->fields[spreg_length]);
-  new_spr->name = (char*)zalloc(strlen(entry->fields[spreg_name]) + 1);
-  ASSERT(new_spr->name != NULL);
-  {
-    int i;
-    for (i = 0; entry->fields[spreg_name][i] != '\0'; i++) {
-      if (isupper(entry->fields[spreg_name][i]))
-	new_spr->name[i] = tolower(entry->fields[spreg_name][i]);
-      else
-	new_spr->name[i] = entry->fields[spreg_name][i];
-    }
-  }
-
-  /* insert, by spreg_nr order */
-  {
-    spreg_table_entry **ptr_to_spreg_entry = &table->sprs;
-    spreg_table_entry *spreg_entry = *ptr_to_spreg_entry;
-    while (spreg_entry != NULL && spreg_entry->spreg_nr < new_spr->spreg_nr) {
-      ptr_to_spreg_entry = &spreg_entry->next;
-      spreg_entry = *ptr_to_spreg_entry;
-    }
-    ASSERT(spreg_entry == NULL || spreg_entry->spreg_nr != new_spr->spreg_nr);
-    *ptr_to_spreg_entry = new_spr;
-    new_spr->next = spreg_entry;
-  }
-
-}
-
-
-static spreg_table *
-spreg_table_load(char *file_name)
-{
-  table *file = table_open(file_name, nr_spreg_fields, 0);
-  spreg_table *table = ZALLOC(spreg_table);
-
-  {
-    table_entry *entry;
-    while ((entry = table_entry_read(file)) != NULL) {
-      spreg_table_insert(table, entry);
-    }
-  }
-
-  return table;
-}
-
-
-/****************************************************************/
-
-char *spreg_attributes[] = {
-  "is_valid",
-  "is_readonly",
-  "name",
-  "index",
-  "length",
-  0
-};
-
-static void
-gen_spreg_h(spreg_table *table, lf *file)
-{
-  spreg_table_entry *entry;
-  char **attribute;
-
-  lf_print__gnu_copyleft(file);
-  lf_printf(file, "\n");
-  lf_printf(file, "#ifndef _SPREG_H_\n");
-  lf_printf(file, "#define _SPREG_H_\n");
-  lf_printf(file, "\n");
-  lf_printf(file, "typedef unsigned_word spreg;\n");
-  lf_printf(file, "\n");
-  lf_printf(file, "typedef enum {\n");
-
-  for (entry = table->sprs;
-       entry != NULL ;
-       entry = entry->next) {
-    lf_printf(file, "  spr_%s = %d,\n", entry->name, entry->spreg_nr);
-  }
-
-  lf_printf(file, "  nr_of_sprs = %d\n", nr_of_sprs);
-  lf_printf(file, "} sprs;\n");
-  lf_printf(file, "\n");
-  for (attribute = spreg_attributes;
-       *attribute != NULL;
-       attribute++) {
-    if (strcmp(*attribute, "name") == 0) {
-      lf_print_function_type(file, "const char *", "INLINE_SPREG", " ");
-      lf_printf(file, "spr_%s(sprs spr);\n", *attribute);
-    }
-    else {
-      lf_print_function_type(file, "int", "INLINE_SPREG", " ");
-      lf_printf(file, "spr_%s(sprs spr);\n", *attribute);
-    }
-  }
-  lf_printf(file, "\n");
-  lf_printf(file, "#endif /* _SPREG_H_ */\n");
-}
-
-
-static void
-gen_spreg_c(spreg_table *table, lf *file)
-{
-  spreg_table_entry *entry;
-  char **attribute;
-  int spreg_nr;
-  int spreg_lookup_table;
-
-  lf_print__gnu_copyleft(file);
-  lf_printf(file, "\n");
-  lf_printf(file, "#ifndef _SPREG_C_\n");
-  lf_printf(file, "#define _SPREG_C_\n");
-  lf_printf(file, "\n");
-  lf_printf(file, "#include \"basics.h\"\n");
-  lf_printf(file, "#include \"spreg.h\"\n");
-
-  lf_printf(file, "\n");
-  lf_printf(file, "typedef struct _spreg_info {\n");
-  lf_printf(file, "  const char *name;\n");
-  lf_printf(file, "  int is_valid;\n");
-  lf_printf(file, "  int length;\n");
-  lf_printf(file, "  int is_readonly;\n");
-  lf_printf(file, "  int index;\n");
-  lf_printf(file, "} spreg_info;\n");
-  lf_printf(file, "\n");
-  lf_printf(file, "static const spreg_info spr_info[nr_of_sprs+1] = {\n");
-  entry = table->sprs;
-  for (spreg_nr = 0; spreg_nr < nr_of_sprs+1; spreg_nr++) {
-    if (entry == NULL || spreg_nr < entry->spreg_nr)
-      lf_printf(file, "  { 0, 0, 0, 0, %d},\n", spreg_nr);
-    else {
-      lf_printf(file, "  { \"%s\", %d, %d, %d, spr_%s /*%d*/ },\n",
-		entry->name, 1, entry->length, entry->is_readonly,
-		entry->name, entry->spreg_nr);
-      entry = entry->next;
-    }
-  }
-  lf_printf(file, "};\n");
-
-  for (attribute = spreg_attributes;
-       *attribute != NULL;
-       attribute++) {
-    lf_printf(file, "\n");
-    if (strcmp(*attribute, "name") == 0) {
-      lf_print_function_type(file, "const char *", "INLINE_SPREG", "\n");
-    }
-    else {
-      lf_print_function_type(file, "int", "INLINE_SPREG", "\n");
-    }
-    lf_printf(file, "spr_%s(sprs spr)\n", *attribute);
-    lf_printf(file, "{\n");
-    spreg_lookup_table = !(strcmp(*attribute, "name") == 0
-			   || strcmp(*attribute, "index") == 0);
-    if (spreg_lookup_table) {
-      spreg_table_entry *entry;
-      lf_printf(file, "#ifdef WITH_SPREG_SWITCH_TABLE\n");
-      lf_printf(file, "  switch (spr) {\n");
-      for (entry = table->sprs; entry != NULL; entry = entry->next) {
-	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) {
-	  /* 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.  */
-      if (strcmp(*attribute, "is_valid") == 0)
-	lf_printf(file, "    return 1;\n");
-      lf_printf(file, "  }\n");
-      lf_printf(file, "  return 0;\n");
-      lf_printf(file, "#else\n");
-    }
-    lf_printf(file, "  return spr_info[spr].%s;\n",
-	      *attribute);
-    if (spreg_lookup_table)
-      lf_printf(file, "#endif\n");
-    lf_printf(file, "}\n");
-  }
-
-  lf_printf(file, "\n");
-  lf_printf(file, "#endif /* _SPREG_C_ */\n");
-}
-
-
-
-/****************************************************************/
-
-
-int
-main(int argc,
-     char **argv,
-     char **envp)
-{
-  lf_file_references file_references = lf_include_references;
-  spreg_table *sprs = NULL;
-  static const struct option longopts[] = { { 0 } };
-  char *real_file_name = NULL;
-  int is_header = 0;
-  int ch;
-
-  if (argc <= 1) {
-    printf("Usage: dgen ...\n");
-    printf("-n <file-name>  Use this as cpp line numbering name\n");
-    printf("-h  Output header file\n");
-    printf("-p <spreg-file>  Output spreg.h(P) or spreg.c(p)\n");
-  }
-
-  while ((ch = getopt_long (argc, argv, "hsn:r:p:", longopts, NULL))
-	 != -1)
-  {
-#if 0  /* For debugging.  */
-    fprintf(stderr, "\t-%c %s\n", ch, ( optarg ? optarg : ""));
-#endif
-    switch(ch) {
-    case 'r':
-      sprs = spreg_table_load(optarg);
-      break;
-    case 'n':
-      real_file_name = strdup(optarg);
-      break;
-    case 'h':
-      is_header = 1;
-      break;
-    case 'p':
-      {
-	lf *file = lf_open(optarg, real_file_name, file_references,
-			   (is_header ? lf_is_h : lf_is_c),
-			   argv[0]);
-	if (is_header)
-	  gen_spreg_h(sprs, file);
-	else
-	  gen_spreg_c(sprs, file);
-	lf_close(file);
-	is_header = 0;
-      }
-      real_file_name = NULL;
-      break;
-    default:
-      error("unknown option\n");
-    }
-  }
-  return 0;
-}
diff --git a/sim/ppc/dgen.py b/sim/ppc/dgen.py
new file mode 100755
index 000000000000..a43c407765f4
--- /dev/null
+++ b/sim/ppc/dgen.py
@@ -0,0 +1,301 @@
+#!/usr/bin/env python3
+# Copyright (C) 1994-1995 Andrew Cagney <cagney@highland.com.au>
+# Copyright (C) 1996-2022 Free Software Foundation, Inc.
+#
+# This file is part of the GNU simulators.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""Helper to generate spreg.[ch] files."""
+
+import argparse
+from pathlib import Path
+import sys
+from typing import NamedTuple, TextIO
+
+
+FILE = Path(__file__).resolve()
+DIR = FILE.parent
+
+
+NR_OF_SPRS = 1024
+
+SPREG_ATTRIBUTES = (
+    "is_valid",
+    "is_readonly",
+    "name",
+    "index",
+    "length",
+)
+
+
+class Spreg(NamedTuple):
+    """A single spreg entry."""
+
+    name: str
+    reg_nr: int
+    is_readonly: int
+    length: int
+
+
+def load_table(source: Path) -> list[Spreg]:
+    """Load the spreg table & return all entries in it."""
+    ret = []
+
+    with source.open("r", encoding="utf-8") as fp:
+        for i, line in enumerate(fp):
+            line = line.split("#", 1)[0].strip()
+            if not line:
+                # Skip blank & comment lines.
+                continue
+
+            fields = line.split(":")
+            assert len(fields) == 4, f"{source}:{i}: bad line: {line}"
+            spreg = Spreg(
+                name=fields[0].lower(),
+                reg_nr=int(fields[1]),
+                is_readonly=int(fields[2]),
+                length=int(fields[3]),
+            )
+            ret.append(spreg)
+
+    return sorted(ret, key=lambda x: x[1])
+
+
+def print_copyleft(fp: TextIO) -> None:
+    """Write out the standard copyright & license file block."""
+    fp.write(
+        f"""\
+/* DO NOT EDIT: GENERATED BY {FILE.name}.
+
+   Copyright (C) 1994-1995 Andrew Cagney <cagney@highland.com.au>
+   Copyright (C) 1996-2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU simulators.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+"""
+    )
+
+
+def gen_header(table: list[Spreg], output: Path) -> None:
+    """Write header to |output| from spreg |table|."""
+    with output.open("w", encoding="utf-8") as fp:
+        print_copyleft(fp)
+        fp.write(
+            """
+#ifndef _SPREG_H_
+#define _SPREG_H_
+
+typedef unsigned_word spreg;
+
+typedef enum {
+"""
+        )
+
+        for spreg in table:
+            fp.write(f"  spr_{spreg.name} = {spreg.reg_nr},\n")
+
+        fp.write(
+            f"""\
+  nr_of_sprs = {NR_OF_SPRS}
+}} sprs;
+
+"""
+        )
+
+        for attr in SPREG_ATTRIBUTES:
+            ret_type = "const char *" if attr == "name" else "int"
+            fp.write(f"INLINE_SPREG({ret_type}) spr_{attr}(sprs spr);\n")
+
+        fp.write(
+            """
+#endif /* _SPREG_H_ */
+"""
+        )
+
+
+def gen_switch_is_valid(table: list[Spreg], fp: TextIO) -> None:
+    """Generate switch table for is_valid property."""
+    fp.write("  switch (spr) {\n")
+    # Output all the known registers.  We'll return 1 for them.
+    for spreg in table:
+        fp.write(f"    case {spreg.reg_nr}:\n")
+    # All other registers return 0.
+    fp.write(
+        """\
+      return 1;
+    }
+    return 0;
+"""
+    )
+
+
+def gen_switch_is_readonly(table: list[Spreg], fp: TextIO) -> None:
+    """Generate switch table for is_readonly property."""
+    # Find any readonly registers and output a switch for them.
+    # If there aren't any, we can optimize this away to a single return.
+    output_switch = False
+    has_readonly = False
+    for spreg in table:
+        if spreg.is_readonly:
+            if not output_switch:
+                fp.write("  switch (spr) {\n")
+                output_switch = True
+            has_readonly = True
+            fp.write(f"    case {spreg.reg_nr}:\n")
+    if has_readonly:
+        fp.write("      return 1;\n")
+
+    if output_switch:
+        fp.write("  }\n")
+    fp.write("  return 0;\n")
+
+
+def gen_switch_length(table: list[Spreg], fp: TextIO) -> None:
+    """Generate switch table for length property."""
+    # Find any registers with a length property and output a switch for them.
+    # If there aren't any, we can optimize this away to a single return.
+    output_switch = False
+    for spreg in table:
+        if spreg.length:
+            if not output_switch:
+                fp.write("  switch (spr) {\n")
+                output_switch = True
+            fp.write(f"    case {spreg.reg_nr}:\n")
+            fp.write(f"      return {spreg.length};\n")
+
+    if output_switch:
+        fp.write("  }\n")
+    fp.write("  return 0;\n")
+
+
+def gen_source(table: list[Spreg], output: Path) -> None:
+    """Write header to |output| from spreg |table|."""
+    with output.open("w", encoding="utf-8") as fp:
+        print_copyleft(fp)
+        fp.write(
+            """
+#ifndef _SPREG_C_
+#define _SPREG_C_
+
+#include "basics.h"
+#include "spreg.h"
+
+typedef struct _spreg_info {
+  const char *name;
+  int is_valid;
+  int length;
+  int is_readonly;
+  int index;
+} spreg_info;
+
+static const spreg_info spr_info[nr_of_sprs+1] = {
+"""
+        )
+
+        entries = iter(table)
+        entry = next(entries)
+        for spreg_nr in range(0, NR_OF_SPRS + 1):
+            if entry is None or spreg_nr < entry.reg_nr:
+                fp.write(f"  {{ 0, 0, 0, 0, {spreg_nr}}},\n")
+            else:
+                fp.write(
+                    f'  {{ "{entry.name}", 1, {entry.length}, {entry.is_readonly}, spr_{entry.name} /*{spreg_nr}*/}},\n'
+                )
+                entry = next(entries, None)
+        fp.write("};\n")
+
+        for attr in SPREG_ATTRIBUTES:
+            ret_type = "const char *" if attr == "name" else "int"
+            fp.write(
+                f"""
+INLINE_SPREG({ret_type}) spr_{attr}(sprs spr)
+{{
+"""
+            )
+
+            if attr not in ("index", "name"):
+                fp.write(
+                    """\
+#ifdef WITH_SPREG_SWITCH_TABLE
+"""
+                )
+                if attr == "is_valid":
+                    gen_switch_is_valid(table, fp)
+                elif attr == "is_readonly":
+                    gen_switch_is_readonly(table, fp)
+                elif attr == "length":
+                    gen_switch_length(table, fp)
+                else:
+                    assert False, f"{attr}: Unknown attribute"
+                fp.write("#else\n")
+            fp.write(f"  return spr_info[spr].{attr};\n")
+            if attr not in ("index", "name"):
+                fp.write("#endif\n")
+            fp.write("}\n")
+
+        fp.write("\n#endif /* _SPREG_C_ */\n")
+
+
+def get_parser() -> argparse.ArgumentParser:
+    """Get CLI parser."""
+    parser = argparse.ArgumentParser(
+        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
+    )
+    parser.add_argument(
+        "--table", type=Path, default=DIR / "ppc-spr-table", help="path to source table"
+    )
+    parser.add_argument("--header", type=Path, help="path to header (.h) file")
+    parser.add_argument("--source", type=Path, help="path to source (.c) file")
+    return parser
+
+
+def parse_args(argv: list[str]) -> argparse.Namespace:
+    """Process the command line & default options."""
+    parser = get_parser()
+    opts = parser.parse_args(argv)
+
+    if not opts.header and not opts.source:
+        opts.header = DIR / "spreg.h"
+        opts.source = DIR / "spreg.c"
+
+    return opts
+
+
+def main(argv: list[str]) -> int:
+    """The main entry point for scripts."""
+    opts = parse_args(argv)
+
+    table = load_table(opts.table)
+    if opts.header:
+        gen_header(table, opts.header)
+    if opts.source:
+        gen_source(table, opts.source)
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1:]))
diff --git a/sim/ppc/local.mk b/sim/ppc/local.mk
index 37d67b0adba0..23af7d860ccd 100644
--- a/sim/ppc/local.mk
+++ b/sim/ppc/local.mk
@@ -30,5 +30,15 @@
 
 noinst_PROGRAMS += %D%/run %D%/psim
 
+%D%/spreg.c: @MAINT@ %D%/ppc-spr-table %D%/dgen.py %D%/$(am__dirstamp)
+	$(AM_V_GEN)$(srcdir)/%D%/dgen.py --source $@.tmp
+	$(AM_V_at)$(SHELL) $(srcroot)/move-if-change $@.tmp $(srcdir)/%D%/spreg.c
+	$(AM_V_at)touch $(srcdir)/%D%/spreg.c
+
+%D%/spreg.h: @MAINT@ %D%/ppc-spr-table %D%/dgen.py %D%/$(am__dirstamp)
+	$(AM_V_GEN)$(srcdir)/%D%/dgen.py --header $@.tmp
+	$(AM_V_at)$(SHELL) $(srcroot)/move-if-change $@.tmp $(srcdir)/%D%/spreg.h
+	$(AM_V_at)touch $(srcdir)/%D%/spreg.h
+
 %C%docdir = $(docdir)/%C%
 %C%doc_DATA = %D%/BUGS %D%/INSTALL %D%/README %D%/RUN
diff --git a/sim/ppc/options.c b/sim/ppc/options.c
index a696db1b623e..64606159f7ae 100644
--- a/sim/ppc/options.c
+++ b/sim/ppc/options.c
@@ -155,10 +155,6 @@ print_options (void)
   printf_filtered ("IGEN_FLAGS               = %s\n", IGEN_FLAGS);
 #endif
 
-#ifdef DGEN_FLAGS
-  printf_filtered ("DGEN_FLAGS               = %s\n", DGEN_FLAGS);
-#endif
-
   {
     static const char *const defines[] = {
 #ifdef __GNUC__
diff --git a/sim/ppc/spreg.c b/sim/ppc/spreg.c
new file mode 100644
index 000000000000..29899aa13d44
--- /dev/null
+++ b/sim/ppc/spreg.c
@@ -0,0 +1,1175 @@
+/* DO NOT EDIT: GENERATED BY dgen.py.
+
+   Copyright (C) 1994-1995 Andrew Cagney <cagney@highland.com.au>
+   Copyright (C) 1996-2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU simulators.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SPREG_C_
+#define _SPREG_C_
+
+#include "basics.h"
+#include "spreg.h"
+
+typedef struct _spreg_info {
+  const char *name;
+  int is_valid;
+  int length;
+  int is_readonly;
+  int index;
+} spreg_info;
+
+static const spreg_info spr_info[nr_of_sprs+1] = {
+  { "mq", 1, 0, 0, spr_mq /*0*/},
+  { "xer", 1, 0, 0, spr_xer /*1*/},
+  { 0, 0, 0, 0, 2},
+  { 0, 0, 0, 0, 3},
+  { "rtcu", 1, 0, 0, spr_rtcu /*4*/},
+  { "rtcl", 1, 0, 0, spr_rtcl /*5*/},
+  { 0, 0, 0, 0, 6},
+  { 0, 0, 0, 0, 7},
+  { "lr", 1, 0, 0, spr_lr /*8*/},
+  { "ctr", 1, 0, 0, spr_ctr /*9*/},
+  { 0, 0, 0, 0, 10},
+  { 0, 0, 0, 0, 11},
+  { 0, 0, 0, 0, 12},
+  { 0, 0, 0, 0, 13},
+  { 0, 0, 0, 0, 14},
+  { 0, 0, 0, 0, 15},
+  { 0, 0, 0, 0, 16},
+  { 0, 0, 0, 0, 17},
+  { "dsisr", 1, 0, 0, spr_dsisr /*18*/},
+  { "dar", 1, 0, 0, spr_dar /*19*/},
+  { 0, 0, 0, 0, 20},
+  { 0, 0, 0, 0, 21},
+  { "dec", 1, 0, 0, spr_dec /*22*/},
+  { 0, 0, 0, 0, 23},
+  { 0, 0, 0, 0, 24},
+  { "sdr1", 1, 0, 0, spr_sdr1 /*25*/},
+  { "srr0", 1, 0, 0, spr_srr0 /*26*/},
+  { "srr1", 1, 0, 0, spr_srr1 /*27*/},
+  { 0, 0, 0, 0, 28},
+  { 0, 0, 0, 0, 29},
+  { 0, 0, 0, 0, 30},
+  { 0, 0, 0, 0, 31},
+  { 0, 0, 0, 0, 32},
+  { 0, 0, 0, 0, 33},
+  { 0, 0, 0, 0, 34},
+  { 0, 0, 0, 0, 35},
+  { 0, 0, 0, 0, 36},
+  { 0, 0, 0, 0, 37},
+  { 0, 0, 0, 0, 38},
+  { 0, 0, 0, 0, 39},
+  { 0, 0, 0, 0, 40},
+  { 0, 0, 0, 0, 41},
+  { 0, 0, 0, 0, 42},
+  { 0, 0, 0, 0, 43},
+  { 0, 0, 0, 0, 44},
+  { 0, 0, 0, 0, 45},
+  { 0, 0, 0, 0, 46},
+  { 0, 0, 0, 0, 47},
+  { 0, 0, 0, 0, 48},
+  { 0, 0, 0, 0, 49},
+  { 0, 0, 0, 0, 50},
+  { 0, 0, 0, 0, 51},
+  { 0, 0, 0, 0, 52},
+  { 0, 0, 0, 0, 53},
+  { 0, 0, 0, 0, 54},
+  { 0, 0, 0, 0, 55},
+  { 0, 0, 0, 0, 56},
+  { 0, 0, 0, 0, 57},
+  { 0, 0, 0, 0, 58},
+  { 0, 0, 0, 0, 59},
+  { 0, 0, 0, 0, 60},
+  { 0, 0, 0, 0, 61},
+  { 0, 0, 0, 0, 62},
+  { 0, 0, 0, 0, 63},
+  { 0, 0, 0, 0, 64},
+  { 0, 0, 0, 0, 65},
+  { 0, 0, 0, 0, 66},
+  { 0, 0, 0, 0, 67},
+  { 0, 0, 0, 0, 68},
+  { 0, 0, 0, 0, 69},
+  { 0, 0, 0, 0, 70},
+  { 0, 0, 0, 0, 71},
+  { 0, 0, 0, 0, 72},
+  { 0, 0, 0, 0, 73},
+  { 0, 0, 0, 0, 74},
+  { 0, 0, 0, 0, 75},
+  { 0, 0, 0, 0, 76},
+  { 0, 0, 0, 0, 77},
+  { 0, 0, 0, 0, 78},
+  { 0, 0, 0, 0, 79},
+  { 0, 0, 0, 0, 80},
+  { 0, 0, 0, 0, 81},
+  { 0, 0, 0, 0, 82},
+  { 0, 0, 0, 0, 83},
+  { 0, 0, 0, 0, 84},
+  { 0, 0, 0, 0, 85},
+  { 0, 0, 0, 0, 86},
+  { 0, 0, 0, 0, 87},
+  { 0, 0, 0, 0, 88},
+  { 0, 0, 0, 0, 89},
+  { 0, 0, 0, 0, 90},
+  { 0, 0, 0, 0, 91},
+  { 0, 0, 0, 0, 92},
+  { 0, 0, 0, 0, 93},
+  { 0, 0, 0, 0, 94},
+  { 0, 0, 0, 0, 95},
+  { 0, 0, 0, 0, 96},
+  { 0, 0, 0, 0, 97},
+  { 0, 0, 0, 0, 98},
+  { 0, 0, 0, 0, 99},
+  { 0, 0, 0, 0, 100},
+  { 0, 0, 0, 0, 101},
+  { 0, 0, 0, 0, 102},
+  { 0, 0, 0, 0, 103},
+  { 0, 0, 0, 0, 104},
+  { 0, 0, 0, 0, 105},
+  { 0, 0, 0, 0, 106},
+  { 0, 0, 0, 0, 107},
+  { 0, 0, 0, 0, 108},
+  { 0, 0, 0, 0, 109},
+  { 0, 0, 0, 0, 110},
+  { 0, 0, 0, 0, 111},
+  { 0, 0, 0, 0, 112},
+  { 0, 0, 0, 0, 113},
+  { 0, 0, 0, 0, 114},
+  { 0, 0, 0, 0, 115},
+  { 0, 0, 0, 0, 116},
+  { 0, 0, 0, 0, 117},
+  { 0, 0, 0, 0, 118},
+  { 0, 0, 0, 0, 119},
+  { 0, 0, 0, 0, 120},
+  { 0, 0, 0, 0, 121},
+  { 0, 0, 0, 0, 122},
+  { 0, 0, 0, 0, 123},
+  { 0, 0, 0, 0, 124},
+  { 0, 0, 0, 0, 125},
+  { 0, 0, 0, 0, 126},
+  { 0, 0, 0, 0, 127},
+  { 0, 0, 0, 0, 128},
+  { 0, 0, 0, 0, 129},
+  { 0, 0, 0, 0, 130},
+  { 0, 0, 0, 0, 131},
+  { 0, 0, 0, 0, 132},
+  { 0, 0, 0, 0, 133},
+  { 0, 0, 0, 0, 134},
+  { 0, 0, 0, 0, 135},
+  { 0, 0, 0, 0, 136},
+  { 0, 0, 0, 0, 137},
+  { 0, 0, 0, 0, 138},
+  { 0, 0, 0, 0, 139},
+  { 0, 0, 0, 0, 140},
+  { 0, 0, 0, 0, 141},
+  { 0, 0, 0, 0, 142},
+  { 0, 0, 0, 0, 143},
+  { 0, 0, 0, 0, 144},
+  { 0, 0, 0, 0, 145},
+  { 0, 0, 0, 0, 146},
+  { 0, 0, 0, 0, 147},
+  { 0, 0, 0, 0, 148},
+  { 0, 0, 0, 0, 149},
+  { 0, 0, 0, 0, 150},
+  { 0, 0, 0, 0, 151},
+  { 0, 0, 0, 0, 152},
+  { 0, 0, 0, 0, 153},
+  { 0, 0, 0, 0, 154},
+  { 0, 0, 0, 0, 155},
+  { 0, 0, 0, 0, 156},
+  { 0, 0, 0, 0, 157},
+  { 0, 0, 0, 0, 158},
+  { 0, 0, 0, 0, 159},
+  { 0, 0, 0, 0, 160},
+  { 0, 0, 0, 0, 161},
+  { 0, 0, 0, 0, 162},
+  { 0, 0, 0, 0, 163},
+  { 0, 0, 0, 0, 164},
+  { 0, 0, 0, 0, 165},
+  { 0, 0, 0, 0, 166},
+  { 0, 0, 0, 0, 167},
+  { 0, 0, 0, 0, 168},
+  { 0, 0, 0, 0, 169},
+  { 0, 0, 0, 0, 170},
+  { 0, 0, 0, 0, 171},
+  { 0, 0, 0, 0, 172},
+  { 0, 0, 0, 0, 173},
+  { 0, 0, 0, 0, 174},
+  { 0, 0, 0, 0, 175},
+  { 0, 0, 0, 0, 176},
+  { 0, 0, 0, 0, 177},
+  { 0, 0, 0, 0, 178},
+  { 0, 0, 0, 0, 179},
+  { 0, 0, 0, 0, 180},
+  { 0, 0, 0, 0, 181},
+  { 0, 0, 0, 0, 182},
+  { 0, 0, 0, 0, 183},
+  { 0, 0, 0, 0, 184},
+  { 0, 0, 0, 0, 185},
+  { 0, 0, 0, 0, 186},
+  { 0, 0, 0, 0, 187},
+  { 0, 0, 0, 0, 188},
+  { 0, 0, 0, 0, 189},
+  { 0, 0, 0, 0, 190},
+  { 0, 0, 0, 0, 191},
+  { 0, 0, 0, 0, 192},
+  { 0, 0, 0, 0, 193},
+  { 0, 0, 0, 0, 194},
+  { 0, 0, 0, 0, 195},
+  { 0, 0, 0, 0, 196},
+  { 0, 0, 0, 0, 197},
+  { 0, 0, 0, 0, 198},
+  { 0, 0, 0, 0, 199},
+  { 0, 0, 0, 0, 200},
+  { 0, 0, 0, 0, 201},
+  { 0, 0, 0, 0, 202},
+  { 0, 0, 0, 0, 203},
+  { 0, 0, 0, 0, 204},
+  { 0, 0, 0, 0, 205},
+  { 0, 0, 0, 0, 206},
+  { 0, 0, 0, 0, 207},
+  { 0, 0, 0, 0, 208},
+  { 0, 0, 0, 0, 209},
+  { 0, 0, 0, 0, 210},
+  { 0, 0, 0, 0, 211},
+  { 0, 0, 0, 0, 212},
+  { 0, 0, 0, 0, 213},
+  { 0, 0, 0, 0, 214},
+  { 0, 0, 0, 0, 215},
+  { 0, 0, 0, 0, 216},
+  { 0, 0, 0, 0, 217},
+  { 0, 0, 0, 0, 218},
+  { 0, 0, 0, 0, 219},
+  { 0, 0, 0, 0, 220},
+  { 0, 0, 0, 0, 221},
+  { 0, 0, 0, 0, 222},
+  { 0, 0, 0, 0, 223},
+  { 0, 0, 0, 0, 224},
+  { 0, 0, 0, 0, 225},
+  { 0, 0, 0, 0, 226},
+  { 0, 0, 0, 0, 227},
+  { 0, 0, 0, 0, 228},
+  { 0, 0, 0, 0, 229},
+  { 0, 0, 0, 0, 230},
+  { 0, 0, 0, 0, 231},
+  { 0, 0, 0, 0, 232},
+  { 0, 0, 0, 0, 233},
+  { 0, 0, 0, 0, 234},
+  { 0, 0, 0, 0, 235},
+  { 0, 0, 0, 0, 236},
+  { 0, 0, 0, 0, 237},
+  { 0, 0, 0, 0, 238},
+  { 0, 0, 0, 0, 239},
+  { 0, 0, 0, 0, 240},
+  { 0, 0, 0, 0, 241},
+  { 0, 0, 0, 0, 242},
+  { 0, 0, 0, 0, 243},
+  { 0, 0, 0, 0, 244},
+  { 0, 0, 0, 0, 245},
+  { 0, 0, 0, 0, 246},
+  { 0, 0, 0, 0, 247},
+  { 0, 0, 0, 0, 248},
+  { 0, 0, 0, 0, 249},
+  { 0, 0, 0, 0, 250},
+  { 0, 0, 0, 0, 251},
+  { 0, 0, 0, 0, 252},
+  { 0, 0, 0, 0, 253},
+  { 0, 0, 0, 0, 254},
+  { 0, 0, 0, 0, 255},
+  { "vrsave", 1, 0, 0, spr_vrsave /*256*/},
+  { 0, 0, 0, 0, 257},
+  { 0, 0, 0, 0, 258},
+  { 0, 0, 0, 0, 259},
+  { 0, 0, 0, 0, 260},
+  { 0, 0, 0, 0, 261},
+  { 0, 0, 0, 0, 262},
+  { 0, 0, 0, 0, 263},
+  { 0, 0, 0, 0, 264},
+  { 0, 0, 0, 0, 265},
+  { 0, 0, 0, 0, 266},
+  { 0, 0, 0, 0, 267},
+  { "tbrl", 1, 0, 0, spr_tbrl /*268*/},
+  { "tbru", 1, 0, 0, spr_tbru /*269*/},
+  { 0, 0, 0, 0, 270},
+  { 0, 0, 0, 0, 271},
+  { "sprg0", 1, 0, 0, spr_sprg0 /*272*/},
+  { "sprg1", 1, 0, 0, spr_sprg1 /*273*/},
+  { "sprg2", 1, 0, 0, spr_sprg2 /*274*/},
+  { "sprg3", 1, 0, 0, spr_sprg3 /*275*/},
+  { 0, 0, 0, 0, 276},
+  { 0, 0, 0, 0, 277},
+  { 0, 0, 0, 0, 278},
+  { 0, 0, 0, 0, 279},
+  { 0, 0, 0, 0, 280},
+  { 0, 0, 0, 0, 281},
+  { "ear", 1, 0, 0, spr_ear /*282*/},
+  { 0, 0, 0, 0, 283},
+  { "tbl", 1, 0, 0, spr_tbl /*284*/},
+  { "tbu", 1, 0, 0, spr_tbu /*285*/},
+  { 0, 0, 0, 0, 286},
+  { "pvr", 1, 0, 0, spr_pvr /*287*/},
+  { 0, 0, 0, 0, 288},
+  { 0, 0, 0, 0, 289},
+  { 0, 0, 0, 0, 290},
+  { 0, 0, 0, 0, 291},
+  { 0, 0, 0, 0, 292},
+  { 0, 0, 0, 0, 293},
+  { 0, 0, 0, 0, 294},
+  { 0, 0, 0, 0, 295},
+  { 0, 0, 0, 0, 296},
+  { 0, 0, 0, 0, 297},
+  { 0, 0, 0, 0, 298},
+  { 0, 0, 0, 0, 299},
+  { 0, 0, 0, 0, 300},
+  { 0, 0, 0, 0, 301},
+  { 0, 0, 0, 0, 302},
+  { 0, 0, 0, 0, 303},
+  { 0, 0, 0, 0, 304},
+  { 0, 0, 0, 0, 305},
+  { 0, 0, 0, 0, 306},
+  { 0, 0, 0, 0, 307},
+  { 0, 0, 0, 0, 308},
+  { 0, 0, 0, 0, 309},
+  { 0, 0, 0, 0, 310},
+  { 0, 0, 0, 0, 311},
+  { 0, 0, 0, 0, 312},
+  { 0, 0, 0, 0, 313},
+  { 0, 0, 0, 0, 314},
+  { 0, 0, 0, 0, 315},
+  { 0, 0, 0, 0, 316},
+  { 0, 0, 0, 0, 317},
+  { 0, 0, 0, 0, 318},
+  { 0, 0, 0, 0, 319},
+  { 0, 0, 0, 0, 320},
+  { 0, 0, 0, 0, 321},
+  { 0, 0, 0, 0, 322},
+  { 0, 0, 0, 0, 323},
+  { 0, 0, 0, 0, 324},
+  { 0, 0, 0, 0, 325},
+  { 0, 0, 0, 0, 326},
+  { 0, 0, 0, 0, 327},
+  { 0, 0, 0, 0, 328},
+  { 0, 0, 0, 0, 329},
+  { 0, 0, 0, 0, 330},
+  { 0, 0, 0, 0, 331},
+  { 0, 0, 0, 0, 332},
+  { 0, 0, 0, 0, 333},
+  { 0, 0, 0, 0, 334},
+  { 0, 0, 0, 0, 335},
+  { 0, 0, 0, 0, 336},
+  { 0, 0, 0, 0, 337},
+  { 0, 0, 0, 0, 338},
+  { 0, 0, 0, 0, 339},
+  { 0, 0, 0, 0, 340},
+  { 0, 0, 0, 0, 341},
+  { 0, 0, 0, 0, 342},
+  { 0, 0, 0, 0, 343},
+  { 0, 0, 0, 0, 344},
+  { 0, 0, 0, 0, 345},
+  { 0, 0, 0, 0, 346},
+  { 0, 0, 0, 0, 347},
+  { 0, 0, 0, 0, 348},
+  { 0, 0, 0, 0, 349},
+  { 0, 0, 0, 0, 350},
+  { 0, 0, 0, 0, 351},
+  { 0, 0, 0, 0, 352},
+  { 0, 0, 0, 0, 353},
+  { 0, 0, 0, 0, 354},
+  { 0, 0, 0, 0, 355},
+  { 0, 0, 0, 0, 356},
+  { 0, 0, 0, 0, 357},
+  { 0, 0, 0, 0, 358},
+  { 0, 0, 0, 0, 359},
+  { 0, 0, 0, 0, 360},
+  { 0, 0, 0, 0, 361},
+  { 0, 0, 0, 0, 362},
+  { 0, 0, 0, 0, 363},
+  { 0, 0, 0, 0, 364},
+  { 0, 0, 0, 0, 365},
+  { 0, 0, 0, 0, 366},
+  { 0, 0, 0, 0, 367},
+  { 0, 0, 0, 0, 368},
+  { 0, 0, 0, 0, 369},
+  { 0, 0, 0, 0, 370},
+  { 0, 0, 0, 0, 371},
+  { 0, 0, 0, 0, 372},
+  { 0, 0, 0, 0, 373},
+  { 0, 0, 0, 0, 374},
+  { 0, 0, 0, 0, 375},
+  { 0, 0, 0, 0, 376},
+  { 0, 0, 0, 0, 377},
+  { 0, 0, 0, 0, 378},
+  { 0, 0, 0, 0, 379},
+  { 0, 0, 0, 0, 380},
+  { 0, 0, 0, 0, 381},
+  { 0, 0, 0, 0, 382},
+  { 0, 0, 0, 0, 383},
+  { 0, 0, 0, 0, 384},
+  { 0, 0, 0, 0, 385},
+  { 0, 0, 0, 0, 386},
+  { 0, 0, 0, 0, 387},
+  { 0, 0, 0, 0, 388},
+  { 0, 0, 0, 0, 389},
+  { 0, 0, 0, 0, 390},
+  { 0, 0, 0, 0, 391},
+  { 0, 0, 0, 0, 392},
+  { 0, 0, 0, 0, 393},
+  { 0, 0, 0, 0, 394},
+  { 0, 0, 0, 0, 395},
+  { 0, 0, 0, 0, 396},
+  { 0, 0, 0, 0, 397},
+  { 0, 0, 0, 0, 398},
+  { 0, 0, 0, 0, 399},
+  { 0, 0, 0, 0, 400},
+  { 0, 0, 0, 0, 401},
+  { 0, 0, 0, 0, 402},
+  { 0, 0, 0, 0, 403},
+  { 0, 0, 0, 0, 404},
+  { 0, 0, 0, 0, 405},
+  { 0, 0, 0, 0, 406},
+  { 0, 0, 0, 0, 407},
+  { 0, 0, 0, 0, 408},
+  { 0, 0, 0, 0, 409},
+  { 0, 0, 0, 0, 410},
+  { 0, 0, 0, 0, 411},
+  { 0, 0, 0, 0, 412},
+  { 0, 0, 0, 0, 413},
+  { 0, 0, 0, 0, 414},
+  { 0, 0, 0, 0, 415},
+  { 0, 0, 0, 0, 416},
+  { 0, 0, 0, 0, 417},
+  { 0, 0, 0, 0, 418},
+  { 0, 0, 0, 0, 419},
+  { 0, 0, 0, 0, 420},
+  { 0, 0, 0, 0, 421},
+  { 0, 0, 0, 0, 422},
+  { 0, 0, 0, 0, 423},
+  { 0, 0, 0, 0, 424},
+  { 0, 0, 0, 0, 425},
+  { 0, 0, 0, 0, 426},
+  { 0, 0, 0, 0, 427},
+  { 0, 0, 0, 0, 428},
+  { 0, 0, 0, 0, 429},
+  { 0, 0, 0, 0, 430},
+  { 0, 0, 0, 0, 431},
+  { 0, 0, 0, 0, 432},
+  { 0, 0, 0, 0, 433},
+  { 0, 0, 0, 0, 434},
+  { 0, 0, 0, 0, 435},
+  { 0, 0, 0, 0, 436},
+  { 0, 0, 0, 0, 437},
+  { 0, 0, 0, 0, 438},
+  { 0, 0, 0, 0, 439},
+  { 0, 0, 0, 0, 440},
+  { 0, 0, 0, 0, 441},
+  { 0, 0, 0, 0, 442},
+  { 0, 0, 0, 0, 443},
+  { 0, 0, 0, 0, 444},
+  { 0, 0, 0, 0, 445},
+  { 0, 0, 0, 0, 446},
+  { 0, 0, 0, 0, 447},
+  { 0, 0, 0, 0, 448},
+  { 0, 0, 0, 0, 449},
+  { 0, 0, 0, 0, 450},
+  { 0, 0, 0, 0, 451},
+  { 0, 0, 0, 0, 452},
+  { 0, 0, 0, 0, 453},
+  { 0, 0, 0, 0, 454},
+  { 0, 0, 0, 0, 455},
+  { 0, 0, 0, 0, 456},
+  { 0, 0, 0, 0, 457},
+  { 0, 0, 0, 0, 458},
+  { 0, 0, 0, 0, 459},
+  { 0, 0, 0, 0, 460},
+  { 0, 0, 0, 0, 461},
+  { 0, 0, 0, 0, 462},
+  { 0, 0, 0, 0, 463},
+  { 0, 0, 0, 0, 464},
+  { 0, 0, 0, 0, 465},
+  { 0, 0, 0, 0, 466},
+  { 0, 0, 0, 0, 467},
+  { 0, 0, 0, 0, 468},
+  { 0, 0, 0, 0, 469},
+  { 0, 0, 0, 0, 470},
+  { 0, 0, 0, 0, 471},
+  { 0, 0, 0, 0, 472},
+  { 0, 0, 0, 0, 473},
+  { 0, 0, 0, 0, 474},
+  { 0, 0, 0, 0, 475},
+  { 0, 0, 0, 0, 476},
+  { 0, 0, 0, 0, 477},
+  { 0, 0, 0, 0, 478},
+  { 0, 0, 0, 0, 479},
+  { 0, 0, 0, 0, 480},
+  { 0, 0, 0, 0, 481},
+  { 0, 0, 0, 0, 482},
+  { 0, 0, 0, 0, 483},
+  { 0, 0, 0, 0, 484},
+  { 0, 0, 0, 0, 485},
+  { 0, 0, 0, 0, 486},
+  { 0, 0, 0, 0, 487},
+  { 0, 0, 0, 0, 488},
+  { 0, 0, 0, 0, 489},
+  { 0, 0, 0, 0, 490},
+  { 0, 0, 0, 0, 491},
+  { 0, 0, 0, 0, 492},
+  { 0, 0, 0, 0, 493},
+  { 0, 0, 0, 0, 494},
+  { 0, 0, 0, 0, 495},
+  { 0, 0, 0, 0, 496},
+  { 0, 0, 0, 0, 497},
+  { 0, 0, 0, 0, 498},
+  { 0, 0, 0, 0, 499},
+  { 0, 0, 0, 0, 500},
+  { 0, 0, 0, 0, 501},
+  { 0, 0, 0, 0, 502},
+  { 0, 0, 0, 0, 503},
+  { 0, 0, 0, 0, 504},
+  { 0, 0, 0, 0, 505},
+  { 0, 0, 0, 0, 506},
+  { 0, 0, 0, 0, 507},
+  { 0, 0, 0, 0, 508},
+  { 0, 0, 0, 0, 509},
+  { 0, 0, 0, 0, 510},
+  { 0, 0, 0, 0, 511},
+  { "spefscr", 1, 0, 0, spr_spefscr /*512*/},
+  { 0, 0, 0, 0, 513},
+  { 0, 0, 0, 0, 514},
+  { 0, 0, 0, 0, 515},
+  { 0, 0, 0, 0, 516},
+  { 0, 0, 0, 0, 517},
+  { 0, 0, 0, 0, 518},
+  { 0, 0, 0, 0, 519},
+  { 0, 0, 0, 0, 520},
+  { 0, 0, 0, 0, 521},
+  { 0, 0, 0, 0, 522},
+  { 0, 0, 0, 0, 523},
+  { 0, 0, 0, 0, 524},
+  { 0, 0, 0, 0, 525},
+  { 0, 0, 0, 0, 526},
+  { 0, 0, 0, 0, 527},
+  { "ibat0u", 1, 0, 0, spr_ibat0u /*528*/},
+  { "ibat0l", 1, 0, 0, spr_ibat0l /*529*/},
+  { "ibat1u", 1, 0, 0, spr_ibat1u /*530*/},
+  { "ibat1l", 1, 0, 0, spr_ibat1l /*531*/},
+  { "ibat2u", 1, 0, 0, spr_ibat2u /*532*/},
+  { "ibat2l", 1, 0, 0, spr_ibat2l /*533*/},
+  { "ibat3u", 1, 0, 0, spr_ibat3u /*534*/},
+  { "ibat3l", 1, 0, 0, spr_ibat3l /*535*/},
+  { "dbat0u", 1, 0, 0, spr_dbat0u /*536*/},
+  { "dbat0l", 1, 0, 0, spr_dbat0l /*537*/},
+  { "dbat1u", 1, 0, 0, spr_dbat1u /*538*/},
+  { "dbat1l", 1, 0, 0, spr_dbat1l /*539*/},
+  { "dbat2u", 1, 0, 0, spr_dbat2u /*540*/},
+  { "dbat2l", 1, 0, 0, spr_dbat2l /*541*/},
+  { "dbat3u", 1, 0, 0, spr_dbat3u /*542*/},
+  { "dbat3l", 1, 0, 0, spr_dbat3l /*543*/},
+  { 0, 0, 0, 0, 544},
+  { 0, 0, 0, 0, 545},
+  { 0, 0, 0, 0, 546},
+  { 0, 0, 0, 0, 547},
+  { 0, 0, 0, 0, 548},
+  { 0, 0, 0, 0, 549},
+  { 0, 0, 0, 0, 550},
+  { 0, 0, 0, 0, 551},
+  { 0, 0, 0, 0, 552},
+  { 0, 0, 0, 0, 553},
+  { 0, 0, 0, 0, 554},
+  { 0, 0, 0, 0, 555},
+  { 0, 0, 0, 0, 556},
+  { 0, 0, 0, 0, 557},
+  { 0, 0, 0, 0, 558},
+  { 0, 0, 0, 0, 559},
+  { 0, 0, 0, 0, 560},
+  { 0, 0, 0, 0, 561},
+  { 0, 0, 0, 0, 562},
+  { 0, 0, 0, 0, 563},
+  { 0, 0, 0, 0, 564},
+  { 0, 0, 0, 0, 565},
+  { 0, 0, 0, 0, 566},
+  { 0, 0, 0, 0, 567},
+  { 0, 0, 0, 0, 568},
+  { 0, 0, 0, 0, 569},
+  { 0, 0, 0, 0, 570},
+  { 0, 0, 0, 0, 571},
+  { 0, 0, 0, 0, 572},
+  { 0, 0, 0, 0, 573},
+  { 0, 0, 0, 0, 574},
+  { 0, 0, 0, 0, 575},
+  { 0, 0, 0, 0, 576},
+  { 0, 0, 0, 0, 577},
+  { 0, 0, 0, 0, 578},
+  { 0, 0, 0, 0, 579},
+  { 0, 0, 0, 0, 580},
+  { 0, 0, 0, 0, 581},
+  { 0, 0, 0, 0, 582},
+  { 0, 0, 0, 0, 583},
+  { 0, 0, 0, 0, 584},
+  { 0, 0, 0, 0, 585},
+  { 0, 0, 0, 0, 586},
+  { 0, 0, 0, 0, 587},
+  { 0, 0, 0, 0, 588},
+  { 0, 0, 0, 0, 589},
+  { 0, 0, 0, 0, 590},
+  { 0, 0, 0, 0, 591},
+  { 0, 0, 0, 0, 592},
+  { 0, 0, 0, 0, 593},
+  { 0, 0, 0, 0, 594},
+  { 0, 0, 0, 0, 595},
+  { 0, 0, 0, 0, 596},
+  { 0, 0, 0, 0, 597},
+  { 0, 0, 0, 0, 598},
+  { 0, 0, 0, 0, 599},
+  { 0, 0, 0, 0, 600},
+  { 0, 0, 0, 0, 601},
+  { 0, 0, 0, 0, 602},
+  { 0, 0, 0, 0, 603},
+  { 0, 0, 0, 0, 604},
+  { 0, 0, 0, 0, 605},
+  { 0, 0, 0, 0, 606},
+  { 0, 0, 0, 0, 607},
+  { 0, 0, 0, 0, 608},
+  { 0, 0, 0, 0, 609},
+  { 0, 0, 0, 0, 610},
+  { 0, 0, 0, 0, 611},
+  { 0, 0, 0, 0, 612},
+  { 0, 0, 0, 0, 613},
+  { 0, 0, 0, 0, 614},
+  { 0, 0, 0, 0, 615},
+  { 0, 0, 0, 0, 616},
+  { 0, 0, 0, 0, 617},
+  { 0, 0, 0, 0, 618},
+  { 0, 0, 0, 0, 619},
+  { 0, 0, 0, 0, 620},
+  { 0, 0, 0, 0, 621},
+  { 0, 0, 0, 0, 622},
+  { 0, 0, 0, 0, 623},
+  { 0, 0, 0, 0, 624},
+  { 0, 0, 0, 0, 625},
+  { 0, 0, 0, 0, 626},
+  { 0, 0, 0, 0, 627},
+  { 0, 0, 0, 0, 628},
+  { 0, 0, 0, 0, 629},
+  { 0, 0, 0, 0, 630},
+  { 0, 0, 0, 0, 631},
+  { 0, 0, 0, 0, 632},
+  { 0, 0, 0, 0, 633},
+  { 0, 0, 0, 0, 634},
+  { 0, 0, 0, 0, 635},
+  { 0, 0, 0, 0, 636},
+  { 0, 0, 0, 0, 637},
+  { 0, 0, 0, 0, 638},
+  { 0, 0, 0, 0, 639},
+  { 0, 0, 0, 0, 640},
+  { 0, 0, 0, 0, 641},
+  { 0, 0, 0, 0, 642},
+  { 0, 0, 0, 0, 643},
+  { 0, 0, 0, 0, 644},
+  { 0, 0, 0, 0, 645},
+  { 0, 0, 0, 0, 646},
+  { 0, 0, 0, 0, 647},
+  { 0, 0, 0, 0, 648},
+  { 0, 0, 0, 0, 649},
+  { 0, 0, 0, 0, 650},
+  { 0, 0, 0, 0, 651},
+  { 0, 0, 0, 0, 652},
+  { 0, 0, 0, 0, 653},
+  { 0, 0, 0, 0, 654},
+  { 0, 0, 0, 0, 655},
+  { 0, 0, 0, 0, 656},
+  { 0, 0, 0, 0, 657},
+  { 0, 0, 0, 0, 658},
+  { 0, 0, 0, 0, 659},
+  { 0, 0, 0, 0, 660},
+  { 0, 0, 0, 0, 661},
+  { 0, 0, 0, 0, 662},
+  { 0, 0, 0, 0, 663},
+  { 0, 0, 0, 0, 664},
+  { 0, 0, 0, 0, 665},
+  { 0, 0, 0, 0, 666},
+  { 0, 0, 0, 0, 667},
+  { 0, 0, 0, 0, 668},
+  { 0, 0, 0, 0, 669},
+  { 0, 0, 0, 0, 670},
+  { 0, 0, 0, 0, 671},
+  { 0, 0, 0, 0, 672},
+  { 0, 0, 0, 0, 673},
+  { 0, 0, 0, 0, 674},
+  { 0, 0, 0, 0, 675},
+  { 0, 0, 0, 0, 676},
+  { 0, 0, 0, 0, 677},
+  { 0, 0, 0, 0, 678},
+  { 0, 0, 0, 0, 679},
+  { 0, 0, 0, 0, 680},
+  { 0, 0, 0, 0, 681},
+  { 0, 0, 0, 0, 682},
+  { 0, 0, 0, 0, 683},
+  { 0, 0, 0, 0, 684},
+  { 0, 0, 0, 0, 685},
+  { 0, 0, 0, 0, 686},
+  { 0, 0, 0, 0, 687},
+  { 0, 0, 0, 0, 688},
+  { 0, 0, 0, 0, 689},
+  { 0, 0, 0, 0, 690},
+  { 0, 0, 0, 0, 691},
+  { 0, 0, 0, 0, 692},
+  { 0, 0, 0, 0, 693},
+  { 0, 0, 0, 0, 694},
+  { 0, 0, 0, 0, 695},
+  { 0, 0, 0, 0, 696},
+  { 0, 0, 0, 0, 697},
+  { 0, 0, 0, 0, 698},
+  { 0, 0, 0, 0, 699},
+  { 0, 0, 0, 0, 700},
+  { 0, 0, 0, 0, 701},
+  { 0, 0, 0, 0, 702},
+  { 0, 0, 0, 0, 703},
+  { 0, 0, 0, 0, 704},
+  { 0, 0, 0, 0, 705},
+  { 0, 0, 0, 0, 706},
+  { 0, 0, 0, 0, 707},
+  { 0, 0, 0, 0, 708},
+  { 0, 0, 0, 0, 709},
+  { 0, 0, 0, 0, 710},
+  { 0, 0, 0, 0, 711},
+  { 0, 0, 0, 0, 712},
+  { 0, 0, 0, 0, 713},
+  { 0, 0, 0, 0, 714},
+  { 0, 0, 0, 0, 715},
+  { 0, 0, 0, 0, 716},
+  { 0, 0, 0, 0, 717},
+  { 0, 0, 0, 0, 718},
+  { 0, 0, 0, 0, 719},
+  { 0, 0, 0, 0, 720},
+  { 0, 0, 0, 0, 721},
+  { 0, 0, 0, 0, 722},
+  { 0, 0, 0, 0, 723},
+  { 0, 0, 0, 0, 724},
+  { 0, 0, 0, 0, 725},
+  { 0, 0, 0, 0, 726},
+  { 0, 0, 0, 0, 727},
+  { 0, 0, 0, 0, 728},
+  { 0, 0, 0, 0, 729},
+  { 0, 0, 0, 0, 730},
+  { 0, 0, 0, 0, 731},
+  { 0, 0, 0, 0, 732},
+  { 0, 0, 0, 0, 733},
+  { 0, 0, 0, 0, 734},
+  { 0, 0, 0, 0, 735},
+  { 0, 0, 0, 0, 736},
+  { 0, 0, 0, 0, 737},
+  { 0, 0, 0, 0, 738},
+  { 0, 0, 0, 0, 739},
+  { 0, 0, 0, 0, 740},
+  { 0, 0, 0, 0, 741},
+  { 0, 0, 0, 0, 742},
+  { 0, 0, 0, 0, 743},
+  { 0, 0, 0, 0, 744},
+  { 0, 0, 0, 0, 745},
+  { 0, 0, 0, 0, 746},
+  { 0, 0, 0, 0, 747},
+  { 0, 0, 0, 0, 748},
+  { 0, 0, 0, 0, 749},
+  { 0, 0, 0, 0, 750},
+  { 0, 0, 0, 0, 751},
+  { 0, 0, 0, 0, 752},
+  { 0, 0, 0, 0, 753},
+  { 0, 0, 0, 0, 754},
+  { 0, 0, 0, 0, 755},
+  { 0, 0, 0, 0, 756},
+  { 0, 0, 0, 0, 757},
+  { 0, 0, 0, 0, 758},
+  { 0, 0, 0, 0, 759},
+  { 0, 0, 0, 0, 760},
+  { 0, 0, 0, 0, 761},
+  { 0, 0, 0, 0, 762},
+  { 0, 0, 0, 0, 763},
+  { 0, 0, 0, 0, 764},
+  { 0, 0, 0, 0, 765},
+  { 0, 0, 0, 0, 766},
+  { 0, 0, 0, 0, 767},
+  { 0, 0, 0, 0, 768},
+  { 0, 0, 0, 0, 769},
+  { 0, 0, 0, 0, 770},
+  { 0, 0, 0, 0, 771},
+  { 0, 0, 0, 0, 772},
+  { 0, 0, 0, 0, 773},
+  { 0, 0, 0, 0, 774},
+  { 0, 0, 0, 0, 775},
+  { 0, 0, 0, 0, 776},
+  { 0, 0, 0, 0, 777},
+  { 0, 0, 0, 0, 778},
+  { 0, 0, 0, 0, 779},
+  { 0, 0, 0, 0, 780},
+  { 0, 0, 0, 0, 781},
+  { 0, 0, 0, 0, 782},
+  { 0, 0, 0, 0, 783},
+  { 0, 0, 0, 0, 784},
+  { 0, 0, 0, 0, 785},
+  { 0, 0, 0, 0, 786},
+  { 0, 0, 0, 0, 787},
+  { 0, 0, 0, 0, 788},
+  { 0, 0, 0, 0, 789},
+  { 0, 0, 0, 0, 790},
+  { 0, 0, 0, 0, 791},
+  { 0, 0, 0, 0, 792},
+  { 0, 0, 0, 0, 793},
+  { 0, 0, 0, 0, 794},
+  { 0, 0, 0, 0, 795},
+  { 0, 0, 0, 0, 796},
+  { 0, 0, 0, 0, 797},
+  { 0, 0, 0, 0, 798},
+  { 0, 0, 0, 0, 799},
+  { 0, 0, 0, 0, 800},
+  { 0, 0, 0, 0, 801},
+  { 0, 0, 0, 0, 802},
+  { 0, 0, 0, 0, 803},
+  { 0, 0, 0, 0, 804},
+  { 0, 0, 0, 0, 805},
+  { 0, 0, 0, 0, 806},
+  { 0, 0, 0, 0, 807},
+  { 0, 0, 0, 0, 808},
+  { 0, 0, 0, 0, 809},
+  { 0, 0, 0, 0, 810},
+  { 0, 0, 0, 0, 811},
+  { 0, 0, 0, 0, 812},
+  { 0, 0, 0, 0, 813},
+  { 0, 0, 0, 0, 814},
+  { 0, 0, 0, 0, 815},
+  { 0, 0, 0, 0, 816},
+  { 0, 0, 0, 0, 817},
+  { 0, 0, 0, 0, 818},
+  { 0, 0, 0, 0, 819},
+  { 0, 0, 0, 0, 820},
+  { 0, 0, 0, 0, 821},
+  { 0, 0, 0, 0, 822},
+  { 0, 0, 0, 0, 823},
+  { 0, 0, 0, 0, 824},
+  { 0, 0, 0, 0, 825},
+  { 0, 0, 0, 0, 826},
+  { 0, 0, 0, 0, 827},
+  { 0, 0, 0, 0, 828},
+  { 0, 0, 0, 0, 829},
+  { 0, 0, 0, 0, 830},
+  { 0, 0, 0, 0, 831},
+  { 0, 0, 0, 0, 832},
+  { 0, 0, 0, 0, 833},
+  { 0, 0, 0, 0, 834},
+  { 0, 0, 0, 0, 835},
+  { 0, 0, 0, 0, 836},
+  { 0, 0, 0, 0, 837},
+  { 0, 0, 0, 0, 838},
+  { 0, 0, 0, 0, 839},
+  { 0, 0, 0, 0, 840},
+  { 0, 0, 0, 0, 841},
+  { 0, 0, 0, 0, 842},
+  { 0, 0, 0, 0, 843},
+  { 0, 0, 0, 0, 844},
+  { 0, 0, 0, 0, 845},
+  { 0, 0, 0, 0, 846},
+  { 0, 0, 0, 0, 847},
+  { 0, 0, 0, 0, 848},
+  { 0, 0, 0, 0, 849},
+  { 0, 0, 0, 0, 850},
+  { 0, 0, 0, 0, 851},
+  { 0, 0, 0, 0, 852},
+  { 0, 0, 0, 0, 853},
+  { 0, 0, 0, 0, 854},
+  { 0, 0, 0, 0, 855},
+  { 0, 0, 0, 0, 856},
+  { 0, 0, 0, 0, 857},
+  { 0, 0, 0, 0, 858},
+  { 0, 0, 0, 0, 859},
+  { 0, 0, 0, 0, 860},
+  { 0, 0, 0, 0, 861},
+  { 0, 0, 0, 0, 862},
+  { 0, 0, 0, 0, 863},
+  { 0, 0, 0, 0, 864},
+  { 0, 0, 0, 0, 865},
+  { 0, 0, 0, 0, 866},
+  { 0, 0, 0, 0, 867},
+  { 0, 0, 0, 0, 868},
+  { 0, 0, 0, 0, 869},
+  { 0, 0, 0, 0, 870},
+  { 0, 0, 0, 0, 871},
+  { 0, 0, 0, 0, 872},
+  { 0, 0, 0, 0, 873},
+  { 0, 0, 0, 0, 874},
+  { 0, 0, 0, 0, 875},
+  { 0, 0, 0, 0, 876},
+  { 0, 0, 0, 0, 877},
+  { 0, 0, 0, 0, 878},
+  { 0, 0, 0, 0, 879},
+  { 0, 0, 0, 0, 880},
+  { 0, 0, 0, 0, 881},
+  { 0, 0, 0, 0, 882},
+  { 0, 0, 0, 0, 883},
+  { 0, 0, 0, 0, 884},
+  { 0, 0, 0, 0, 885},
+  { 0, 0, 0, 0, 886},
+  { 0, 0, 0, 0, 887},
+  { 0, 0, 0, 0, 888},
+  { 0, 0, 0, 0, 889},
+  { 0, 0, 0, 0, 890},
+  { 0, 0, 0, 0, 891},
+  { 0, 0, 0, 0, 892},
+  { 0, 0, 0, 0, 893},
+  { 0, 0, 0, 0, 894},
+  { 0, 0, 0, 0, 895},
+  { 0, 0, 0, 0, 896},
+  { 0, 0, 0, 0, 897},
+  { 0, 0, 0, 0, 898},
+  { 0, 0, 0, 0, 899},
+  { 0, 0, 0, 0, 900},
+  { 0, 0, 0, 0, 901},
+  { 0, 0, 0, 0, 902},
+  { 0, 0, 0, 0, 903},
+  { 0, 0, 0, 0, 904},
+  { 0, 0, 0, 0, 905},
+  { 0, 0, 0, 0, 906},
+  { 0, 0, 0, 0, 907},
+  { 0, 0, 0, 0, 908},
+  { 0, 0, 0, 0, 909},
+  { 0, 0, 0, 0, 910},
+  { 0, 0, 0, 0, 911},
+  { 0, 0, 0, 0, 912},
+  { 0, 0, 0, 0, 913},
+  { 0, 0, 0, 0, 914},
+  { 0, 0, 0, 0, 915},
+  { 0, 0, 0, 0, 916},
+  { 0, 0, 0, 0, 917},
+  { 0, 0, 0, 0, 918},
+  { 0, 0, 0, 0, 919},
+  { 0, 0, 0, 0, 920},
+  { 0, 0, 0, 0, 921},
+  { 0, 0, 0, 0, 922},
+  { 0, 0, 0, 0, 923},
+  { 0, 0, 0, 0, 924},
+  { 0, 0, 0, 0, 925},
+  { 0, 0, 0, 0, 926},
+  { 0, 0, 0, 0, 927},
+  { 0, 0, 0, 0, 928},
+  { 0, 0, 0, 0, 929},
+  { 0, 0, 0, 0, 930},
+  { 0, 0, 0, 0, 931},
+  { 0, 0, 0, 0, 932},
+  { 0, 0, 0, 0, 933},
+  { 0, 0, 0, 0, 934},
+  { 0, 0, 0, 0, 935},
+  { "ummcr0", 1, 0, 0, spr_ummcr0 /*936*/},
+  { "upmc1", 1, 0, 0, spr_upmc1 /*937*/},
+  { "upmc2", 1, 0, 0, spr_upmc2 /*938*/},
+  { "usia", 1, 0, 0, spr_usia /*939*/},
+  { "ummcr1", 1, 0, 0, spr_ummcr1 /*940*/},
+  { "upmc3", 1, 0, 0, spr_upmc3 /*941*/},
+  { "upmc4", 1, 0, 0, spr_upmc4 /*942*/},
+  { 0, 0, 0, 0, 943},
+  { 0, 0, 0, 0, 944},
+  { 0, 0, 0, 0, 945},
+  { 0, 0, 0, 0, 946},
+  { 0, 0, 0, 0, 947},
+  { 0, 0, 0, 0, 948},
+  { 0, 0, 0, 0, 949},
+  { 0, 0, 0, 0, 950},
+  { 0, 0, 0, 0, 951},
+  { "mmcr0", 1, 0, 0, spr_mmcr0 /*952*/},
+  { "pmc1", 1, 0, 0, spr_pmc1 /*953*/},
+  { "pmc2", 1, 0, 0, spr_pmc2 /*954*/},
+  { "sia", 1, 0, 0, spr_sia /*955*/},
+  { "mmcr1", 1, 0, 0, spr_mmcr1 /*956*/},
+  { "pmc3", 1, 0, 0, spr_pmc3 /*957*/},
+  { "pmc4", 1, 0, 0, spr_pmc4 /*958*/},
+  { "sda", 1, 0, 0, spr_sda /*959*/},
+  { 0, 0, 0, 0, 960},
+  { 0, 0, 0, 0, 961},
+  { 0, 0, 0, 0, 962},
+  { 0, 0, 0, 0, 963},
+  { 0, 0, 0, 0, 964},
+  { 0, 0, 0, 0, 965},
+  { 0, 0, 0, 0, 966},
+  { 0, 0, 0, 0, 967},
+  { 0, 0, 0, 0, 968},
+  { 0, 0, 0, 0, 969},
+  { 0, 0, 0, 0, 970},
+  { 0, 0, 0, 0, 971},
+  { 0, 0, 0, 0, 972},
+  { 0, 0, 0, 0, 973},
+  { 0, 0, 0, 0, 974},
+  { 0, 0, 0, 0, 975},
+  { "dmiss", 1, 0, 0, spr_dmiss /*976*/},
+  { "dcmp", 1, 0, 0, spr_dcmp /*977*/},
+  { "hash1", 1, 0, 0, spr_hash1 /*978*/},
+  { "hash2", 1, 0, 0, spr_hash2 /*979*/},
+  { "imiss", 1, 0, 0, spr_imiss /*980*/},
+  { "icmp", 1, 0, 0, spr_icmp /*981*/},
+  { "rpa", 1, 0, 0, spr_rpa /*982*/},
+  { 0, 0, 0, 0, 983},
+  { 0, 0, 0, 0, 984},
+  { 0, 0, 0, 0, 985},
+  { 0, 0, 0, 0, 986},
+  { 0, 0, 0, 0, 987},
+  { 0, 0, 0, 0, 988},
+  { 0, 0, 0, 0, 989},
+  { 0, 0, 0, 0, 990},
+  { 0, 0, 0, 0, 991},
+  { 0, 0, 0, 0, 992},
+  { 0, 0, 0, 0, 993},
+  { 0, 0, 0, 0, 994},
+  { 0, 0, 0, 0, 995},
+  { 0, 0, 0, 0, 996},
+  { 0, 0, 0, 0, 997},
+  { 0, 0, 0, 0, 998},
+  { 0, 0, 0, 0, 999},
+  { 0, 0, 0, 0, 1000},
+  { 0, 0, 0, 0, 1001},
+  { 0, 0, 0, 0, 1002},
+  { 0, 0, 0, 0, 1003},
+  { 0, 0, 0, 0, 1004},
+  { 0, 0, 0, 0, 1005},
+  { 0, 0, 0, 0, 1006},
+  { 0, 0, 0, 0, 1007},
+  { "hid0", 1, 0, 0, spr_hid0 /*1008*/},
+  { "hid1", 1, 0, 0, spr_hid1 /*1009*/},
+  { "iabr", 1, 0, 0, spr_iabr /*1010*/},
+  { 0, 0, 0, 0, 1011},
+  { 0, 0, 0, 0, 1012},
+  { "dabr", 1, 0, 0, spr_dabr /*1013*/},
+  { 0, 0, 0, 0, 1014},
+  { 0, 0, 0, 0, 1015},
+  { 0, 0, 0, 0, 1016},
+  { "l2cr", 1, 0, 0, spr_l2cr /*1017*/},
+  { 0, 0, 0, 0, 1018},
+  { "ictc", 1, 0, 0, spr_ictc /*1019*/},
+  { "thrm1", 1, 0, 0, spr_thrm1 /*1020*/},
+  { "thrm2", 1, 0, 0, spr_thrm2 /*1021*/},
+  { "thrm3", 1, 0, 0, spr_thrm3 /*1022*/},
+  { "pir", 1, 0, 0, spr_pir /*1023*/},
+  { 0, 0, 0, 0, 1024},
+};
+
+INLINE_SPREG(int) spr_is_valid(sprs spr)
+{
+#ifdef WITH_SPREG_SWITCH_TABLE
+  switch (spr) {
+    case 0:
+    case 1:
+    case 4:
+    case 5:
+    case 8:
+    case 9:
+    case 18:
+    case 19:
+    case 22:
+    case 25:
+    case 26:
+    case 27:
+    case 256:
+    case 268:
+    case 269:
+    case 272:
+    case 273:
+    case 274:
+    case 275:
+    case 282:
+    case 284:
+    case 285:
+    case 287:
+    case 512:
+    case 528:
+    case 529:
+    case 530:
+    case 531:
+    case 532:
+    case 533:
+    case 534:
+    case 535:
+    case 536:
+    case 537:
+    case 538:
+    case 539:
+    case 540:
+    case 541:
+    case 542:
+    case 543:
+    case 936:
+    case 937:
+    case 938:
+    case 939:
+    case 940:
+    case 941:
+    case 942:
+    case 952:
+    case 953:
+    case 954:
+    case 955:
+    case 956:
+    case 957:
+    case 958:
+    case 959:
+    case 976:
+    case 977:
+    case 978:
+    case 979:
+    case 980:
+    case 981:
+    case 982:
+    case 1008:
+    case 1009:
+    case 1010:
+    case 1013:
+    case 1017:
+    case 1019:
+    case 1020:
+    case 1021:
+    case 1022:
+    case 1023:
+      return 1;
+    }
+    return 0;
+#else
+  return spr_info[spr].is_valid;
+#endif
+}
+
+INLINE_SPREG(int) spr_is_readonly(sprs spr)
+{
+#ifdef WITH_SPREG_SWITCH_TABLE
+  return 0;
+#else
+  return spr_info[spr].is_readonly;
+#endif
+}
+
+INLINE_SPREG(const char *) spr_name(sprs spr)
+{
+  return spr_info[spr].name;
+}
+
+INLINE_SPREG(int) spr_index(sprs spr)
+{
+  return spr_info[spr].index;
+}
+
+INLINE_SPREG(int) spr_length(sprs spr)
+{
+#ifdef WITH_SPREG_SWITCH_TABLE
+  return 0;
+#else
+  return spr_info[spr].length;
+#endif
+}
+
+#endif /* _SPREG_C_ */
diff --git a/sim/ppc/spreg.h b/sim/ppc/spreg.h
new file mode 100644
index 000000000000..07c173251a5c
--- /dev/null
+++ b/sim/ppc/spreg.h
@@ -0,0 +1,108 @@
+/* DO NOT EDIT: GENERATED BY dgen.py.
+
+   Copyright (C) 1994-1995 Andrew Cagney <cagney@highland.com.au>
+   Copyright (C) 1996-2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU simulators.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SPREG_H_
+#define _SPREG_H_
+
+typedef unsigned_word spreg;
+
+typedef enum {
+  spr_mq = 0,
+  spr_xer = 1,
+  spr_rtcu = 4,
+  spr_rtcl = 5,
+  spr_lr = 8,
+  spr_ctr = 9,
+  spr_dsisr = 18,
+  spr_dar = 19,
+  spr_dec = 22,
+  spr_sdr1 = 25,
+  spr_srr0 = 26,
+  spr_srr1 = 27,
+  spr_vrsave = 256,
+  spr_tbrl = 268,
+  spr_tbru = 269,
+  spr_sprg0 = 272,
+  spr_sprg1 = 273,
+  spr_sprg2 = 274,
+  spr_sprg3 = 275,
+  spr_ear = 282,
+  spr_tbl = 284,
+  spr_tbu = 285,
+  spr_pvr = 287,
+  spr_spefscr = 512,
+  spr_ibat0u = 528,
+  spr_ibat0l = 529,
+  spr_ibat1u = 530,
+  spr_ibat1l = 531,
+  spr_ibat2u = 532,
+  spr_ibat2l = 533,
+  spr_ibat3u = 534,
+  spr_ibat3l = 535,
+  spr_dbat0u = 536,
+  spr_dbat0l = 537,
+  spr_dbat1u = 538,
+  spr_dbat1l = 539,
+  spr_dbat2u = 540,
+  spr_dbat2l = 541,
+  spr_dbat3u = 542,
+  spr_dbat3l = 543,
+  spr_ummcr0 = 936,
+  spr_upmc1 = 937,
+  spr_upmc2 = 938,
+  spr_usia = 939,
+  spr_ummcr1 = 940,
+  spr_upmc3 = 941,
+  spr_upmc4 = 942,
+  spr_mmcr0 = 952,
+  spr_pmc1 = 953,
+  spr_pmc2 = 954,
+  spr_sia = 955,
+  spr_mmcr1 = 956,
+  spr_pmc3 = 957,
+  spr_pmc4 = 958,
+  spr_sda = 959,
+  spr_dmiss = 976,
+  spr_dcmp = 977,
+  spr_hash1 = 978,
+  spr_hash2 = 979,
+  spr_imiss = 980,
+  spr_icmp = 981,
+  spr_rpa = 982,
+  spr_hid0 = 1008,
+  spr_hid1 = 1009,
+  spr_iabr = 1010,
+  spr_dabr = 1013,
+  spr_l2cr = 1017,
+  spr_ictc = 1019,
+  spr_thrm1 = 1020,
+  spr_thrm2 = 1021,
+  spr_thrm3 = 1022,
+  spr_pir = 1023,
+  nr_of_sprs = 1024
+} sprs;
+
+INLINE_SPREG(int) spr_is_valid(sprs spr);
+INLINE_SPREG(int) spr_is_readonly(sprs spr);
+INLINE_SPREG(const char *) spr_name(sprs spr);
+INLINE_SPREG(int) spr_index(sprs spr);
+INLINE_SPREG(int) spr_length(sprs spr);
+
+#endif /* _SPREG_H_ */
-- 
2.38.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] sim: ppc: move spreg.[ch] files to the source tree
  2022-11-09 20:01 ` [PATCH 7/7] sim: ppc: move spreg.[ch] files to the source tree Mike Frysinger
@ 2022-12-20  1:50   ` Mike Frysinger
  2022-12-20  1:50     ` [PATCH 2/2] sim: ppc: drop old dgen.c generator Mike Frysinger
  0 siblings, 1 reply; 9+ messages in thread
From: Mike Frysinger @ 2022-12-20  1:50 UTC (permalink / raw)
  To: gdb-patches

Simplify the build by moving the generation of these files from
build-time (via dgen.c that we have to compile & execute on the
build system) to maintainer/release mode (via spreg-gen.py that
we only ever execute when the spreg table actually changes).  It
speeds up the build process and makes it easier for us to reason
about & review changes to the code generator.

The tool is renamed from "dgen" because it's hardcoded to only
generated spreg files.  It isn't a generalized tool for creating
lookup tables.
---
 sim/Makefile.in      |   10 +
 sim/ppc/local.mk     |   10 +
 sim/ppc/spreg-gen.py |  305 +++++++++++
 sim/ppc/spreg.c      | 1175 ++++++++++++++++++++++++++++++++++++++++++
 sim/ppc/spreg.h      |  108 ++++
 5 files changed, 1608 insertions(+)
 create mode 100755 sim/ppc/spreg-gen.py
 create mode 100644 sim/ppc/spreg.c
 create mode 100644 sim/ppc/spreg.h

diff --git a/sim/ppc/local.mk b/sim/ppc/local.mk
index 37d67b0adba0..2f65e9c0f34c 100644
--- a/sim/ppc/local.mk
+++ b/sim/ppc/local.mk
@@ -30,5 +30,15 @@
 
 noinst_PROGRAMS += %D%/run %D%/psim
 
+%D%/spreg.c: @MAINT@ %D%/ppc-spr-table %D%/spreg-gen.py %D%/$(am__dirstamp)
+	$(AM_V_GEN)$(srcdir)/%D%/spreg-gen.py --source $@.tmp
+	$(AM_V_at)$(SHELL) $(srcroot)/move-if-change $@.tmp $(srcdir)/%D%/spreg.c
+	$(AM_V_at)touch $(srcdir)/%D%/spreg.c
+
+%D%/spreg.h: @MAINT@ %D%/ppc-spr-table %D%/spreg-gen.py %D%/$(am__dirstamp)
+	$(AM_V_GEN)$(srcdir)/%D%/spreg-gen.py --header $@.tmp
+	$(AM_V_at)$(SHELL) $(srcroot)/move-if-change $@.tmp $(srcdir)/%D%/spreg.h
+	$(AM_V_at)touch $(srcdir)/%D%/spreg.h
+
 %C%docdir = $(docdir)/%C%
 %C%doc_DATA = %D%/BUGS %D%/INSTALL %D%/README %D%/RUN
diff --git a/sim/ppc/spreg-gen.py b/sim/ppc/spreg-gen.py
new file mode 100755
index 000000000000..14dbb25fefe3
--- /dev/null
+++ b/sim/ppc/spreg-gen.py
@@ -0,0 +1,305 @@
+#!/usr/bin/env python3
+# Copyright (C) 1994-1995 Andrew Cagney <cagney@highland.com.au>
+# Copyright (C) 1996-2022 Free Software Foundation, Inc.
+#
+# This file is part of the GNU simulators.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""Helper to generate spreg.[ch] files."""
+
+import argparse
+from pathlib import Path
+import sys
+from typing import NamedTuple, TextIO
+
+
+FILE = Path(__file__).resolve()
+DIR = FILE.parent
+
+
+NR_OF_SPRS = 1024
+
+SPREG_ATTRIBUTES = (
+    "is_valid",
+    "is_readonly",
+    "name",
+    "index",
+    "length",
+)
+
+
+class Spreg(NamedTuple):
+    """A single spreg entry."""
+
+    name: str
+    reg_nr: int
+    is_readonly: int
+    length: int
+
+
+def load_table(source: Path) -> list[Spreg]:
+    """Load the spreg table & return all entries in it."""
+    ret = []
+
+    with source.open("r", encoding="utf-8") as fp:
+        for i, line in enumerate(fp):
+            line = line.split("#", 1)[0].strip()
+            if not line:
+                # Skip blank & comment lines.
+                continue
+
+            fields = line.split(":")
+            assert len(fields) == 4, f"{source}:{i}: bad line: {line}"
+            spreg = Spreg(
+                name=fields[0].lower(),
+                reg_nr=int(fields[1]),
+                is_readonly=int(fields[2]),
+                length=int(fields[3]),
+            )
+            ret.append(spreg)
+
+    return sorted(ret, key=lambda x: x[1])
+
+
+def print_copyleft(fp: TextIO) -> None:
+    """Write out the standard copyright & license file block."""
+    fp.write(
+        f"""\
+/* DO NOT EDIT: GENERATED BY {FILE.name}.
+
+   Copyright (C) 1994-1995 Andrew Cagney <cagney@highland.com.au>
+   Copyright (C) 1996-2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU simulators.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+"""
+    )
+
+
+def gen_header(table: list[Spreg], output: Path) -> None:
+    """Write header to |output| from spreg |table|."""
+    with output.open("w", encoding="utf-8") as fp:
+        print_copyleft(fp)
+        fp.write(
+            """
+#ifndef _SPREG_H_
+#define _SPREG_H_
+
+typedef unsigned_word spreg;
+
+typedef enum {
+"""
+        )
+
+        for spreg in table:
+            fp.write(f"  spr_{spreg.name} = {spreg.reg_nr},\n")
+
+        fp.write(
+            f"""\
+  nr_of_sprs = {NR_OF_SPRS}
+}} sprs;
+
+"""
+        )
+
+        for attr in SPREG_ATTRIBUTES:
+            ret_type = "const char *" if attr == "name" else "int"
+            fp.write(f"INLINE_SPREG({ret_type}) spr_{attr}(sprs spr);\n")
+
+        fp.write(
+            """
+#endif /* _SPREG_H_ */
+"""
+        )
+
+
+def gen_switch_is_valid(table: list[Spreg], fp: TextIO) -> None:
+    """Generate switch table for is_valid property."""
+    fp.write("  switch (spr) {\n")
+    # Output all the known registers.  We'll return 1 for them.
+    for spreg in table:
+        fp.write(f"    case {spreg.reg_nr}:\n")
+    # All other registers return 0.
+    fp.write(
+        """\
+      return 1;
+    }
+    return 0;
+"""
+    )
+
+
+def gen_switch_is_readonly(table: list[Spreg], fp: TextIO) -> None:
+    """Generate switch table for is_readonly property."""
+    # Find any readonly registers and output a switch for them.
+    # If there aren't any, we can optimize this away to a single return.
+    output_switch = False
+    has_readonly = False
+    for spreg in table:
+        if spreg.is_readonly:
+            if not output_switch:
+                fp.write("  switch (spr) {\n")
+                output_switch = True
+            has_readonly = True
+            fp.write(f"    case {spreg.reg_nr}:\n")
+    if has_readonly:
+        fp.write("      return 1;\n")
+
+    if output_switch:
+        fp.write("  }\n")
+    fp.write("  return 0;\n")
+
+
+def gen_switch_length(table: list[Spreg], fp: TextIO) -> None:
+    """Generate switch table for length property."""
+    # Find any registers with a length property and output a switch for them.
+    # If there aren't any, we can optimize this away to a single return.
+    output_switch = False
+    for spreg in table:
+        if spreg.length:
+            if not output_switch:
+                fp.write("  switch (spr) {\n")
+                output_switch = True
+            fp.write(f"    case {spreg.reg_nr}:\n")
+            fp.write(f"      return {spreg.length};\n")
+
+    if output_switch:
+        fp.write("  }\n")
+    fp.write("  return 0;\n")
+
+
+def gen_source(table: list[Spreg], output: Path) -> None:
+    """Write header to |output| from spreg |table|."""
+    with output.open("w", encoding="utf-8") as fp:
+        print_copyleft(fp)
+        fp.write(
+            """
+#ifndef _SPREG_C_
+#define _SPREG_C_
+
+#include "basics.h"
+#include "spreg.h"
+
+typedef struct _spreg_info {
+  const char *name;
+  int is_valid;
+  int length;
+  int is_readonly;
+  int index;
+} spreg_info;
+
+static const spreg_info spr_info[nr_of_sprs+1] = {
+"""
+        )
+
+        entries = iter(table)
+        entry = next(entries)
+        for spreg_nr in range(0, NR_OF_SPRS + 1):
+            if entry is None or spreg_nr < entry.reg_nr:
+                fp.write(f"  {{ 0, 0, 0, 0, {spreg_nr} }},\n")
+            else:
+                fp.write(
+                    f'  {{ "{entry.name}", 1, {entry.length}, {entry.is_readonly}, spr_{entry.name} /*{spreg_nr}*/ }},\n'
+                )
+                entry = next(entries, None)
+        fp.write("};\n")
+
+        for attr in SPREG_ATTRIBUTES:
+            ret_type = "const char *" if attr == "name" else "int"
+            fp.write(
+                f"""
+INLINE_SPREG({ret_type}) spr_{attr}(sprs spr)
+{{
+"""
+            )
+
+            if attr not in ("index", "name"):
+                fp.write(
+                    """\
+#ifdef WITH_SPREG_SWITCH_TABLE
+"""
+                )
+                if attr == "is_valid":
+                    gen_switch_is_valid(table, fp)
+                elif attr == "is_readonly":
+                    gen_switch_is_readonly(table, fp)
+                elif attr == "length":
+                    gen_switch_length(table, fp)
+                else:
+                    assert False, f"{attr}: Unknown attribute"
+                fp.write("#else\n")
+            fp.write(f"  return spr_info[spr].{attr};\n")
+            if attr not in ("index", "name"):
+                fp.write("#endif\n")
+            fp.write("}\n")
+
+        fp.write("\n#endif /* _SPREG_C_ */\n")
+
+
+def get_parser() -> argparse.ArgumentParser:
+    """Get CLI parser."""
+    parser = argparse.ArgumentParser(
+        description=__doc__,
+        formatter_class=argparse.RawDescriptionHelpFormatter,
+    )
+    parser.add_argument(
+        "--table",
+        type=Path,
+        default=DIR / "ppc-spr-table",
+        help="path to source table",
+    )
+    parser.add_argument("--header", type=Path, help="path to header (.h) file")
+    parser.add_argument("--source", type=Path, help="path to source (.c) file")
+    return parser
+
+
+def parse_args(argv: list[str]) -> argparse.Namespace:
+    """Process the command line & default options."""
+    parser = get_parser()
+    opts = parser.parse_args(argv)
+
+    if not opts.header and not opts.source:
+        opts.header = DIR / "spreg.h"
+        opts.source = DIR / "spreg.c"
+
+    return opts
+
+
+def main(argv: list[str]) -> int:
+    """The main entry point for scripts."""
+    opts = parse_args(argv)
+
+    table = load_table(opts.table)
+    if opts.header:
+        gen_header(table, opts.header)
+    if opts.source:
+        gen_source(table, opts.source)
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv[1:]))
diff --git a/sim/ppc/spreg.c b/sim/ppc/spreg.c
new file mode 100644
index 000000000000..f9361e7c0e98
--- /dev/null
+++ b/sim/ppc/spreg.c
@@ -0,0 +1,1175 @@
+/* DO NOT EDIT: GENERATED BY spreg-gen.py.
+
+   Copyright (C) 1994-1995 Andrew Cagney <cagney@highland.com.au>
+   Copyright (C) 1996-2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU simulators.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SPREG_C_
+#define _SPREG_C_
+
+#include "basics.h"
+#include "spreg.h"
+
+typedef struct _spreg_info {
+  const char *name;
+  int is_valid;
+  int length;
+  int is_readonly;
+  int index;
+} spreg_info;
+
+static const spreg_info spr_info[nr_of_sprs+1] = {
+  { "mq", 1, 0, 0, spr_mq /*0*/ },
+  { "xer", 1, 0, 0, spr_xer /*1*/ },
+  { 0, 0, 0, 0, 2 },
+  { 0, 0, 0, 0, 3 },
+  { "rtcu", 1, 0, 0, spr_rtcu /*4*/ },
+  { "rtcl", 1, 0, 0, spr_rtcl /*5*/ },
+  { 0, 0, 0, 0, 6 },
+  { 0, 0, 0, 0, 7 },
+  { "lr", 1, 0, 0, spr_lr /*8*/ },
+  { "ctr", 1, 0, 0, spr_ctr /*9*/ },
+  { 0, 0, 0, 0, 10 },
+  { 0, 0, 0, 0, 11 },
+  { 0, 0, 0, 0, 12 },
+  { 0, 0, 0, 0, 13 },
+  { 0, 0, 0, 0, 14 },
+  { 0, 0, 0, 0, 15 },
+  { 0, 0, 0, 0, 16 },
+  { 0, 0, 0, 0, 17 },
+  { "dsisr", 1, 0, 0, spr_dsisr /*18*/ },
+  { "dar", 1, 0, 0, spr_dar /*19*/ },
+  { 0, 0, 0, 0, 20 },
+  { 0, 0, 0, 0, 21 },
+  { "dec", 1, 0, 0, spr_dec /*22*/ },
+  { 0, 0, 0, 0, 23 },
+  { 0, 0, 0, 0, 24 },
+  { "sdr1", 1, 0, 0, spr_sdr1 /*25*/ },
+  { "srr0", 1, 0, 0, spr_srr0 /*26*/ },
+  { "srr1", 1, 0, 0, spr_srr1 /*27*/ },
+  { 0, 0, 0, 0, 28 },
+  { 0, 0, 0, 0, 29 },
+  { 0, 0, 0, 0, 30 },
+  { 0, 0, 0, 0, 31 },
+  { 0, 0, 0, 0, 32 },
+  { 0, 0, 0, 0, 33 },
+  { 0, 0, 0, 0, 34 },
+  { 0, 0, 0, 0, 35 },
+  { 0, 0, 0, 0, 36 },
+  { 0, 0, 0, 0, 37 },
+  { 0, 0, 0, 0, 38 },
+  { 0, 0, 0, 0, 39 },
+  { 0, 0, 0, 0, 40 },
+  { 0, 0, 0, 0, 41 },
+  { 0, 0, 0, 0, 42 },
+  { 0, 0, 0, 0, 43 },
+  { 0, 0, 0, 0, 44 },
+  { 0, 0, 0, 0, 45 },
+  { 0, 0, 0, 0, 46 },
+  { 0, 0, 0, 0, 47 },
+  { 0, 0, 0, 0, 48 },
+  { 0, 0, 0, 0, 49 },
+  { 0, 0, 0, 0, 50 },
+  { 0, 0, 0, 0, 51 },
+  { 0, 0, 0, 0, 52 },
+  { 0, 0, 0, 0, 53 },
+  { 0, 0, 0, 0, 54 },
+  { 0, 0, 0, 0, 55 },
+  { 0, 0, 0, 0, 56 },
+  { 0, 0, 0, 0, 57 },
+  { 0, 0, 0, 0, 58 },
+  { 0, 0, 0, 0, 59 },
+  { 0, 0, 0, 0, 60 },
+  { 0, 0, 0, 0, 61 },
+  { 0, 0, 0, 0, 62 },
+  { 0, 0, 0, 0, 63 },
+  { 0, 0, 0, 0, 64 },
+  { 0, 0, 0, 0, 65 },
+  { 0, 0, 0, 0, 66 },
+  { 0, 0, 0, 0, 67 },
+  { 0, 0, 0, 0, 68 },
+  { 0, 0, 0, 0, 69 },
+  { 0, 0, 0, 0, 70 },
+  { 0, 0, 0, 0, 71 },
+  { 0, 0, 0, 0, 72 },
+  { 0, 0, 0, 0, 73 },
+  { 0, 0, 0, 0, 74 },
+  { 0, 0, 0, 0, 75 },
+  { 0, 0, 0, 0, 76 },
+  { 0, 0, 0, 0, 77 },
+  { 0, 0, 0, 0, 78 },
+  { 0, 0, 0, 0, 79 },
+  { 0, 0, 0, 0, 80 },
+  { 0, 0, 0, 0, 81 },
+  { 0, 0, 0, 0, 82 },
+  { 0, 0, 0, 0, 83 },
+  { 0, 0, 0, 0, 84 },
+  { 0, 0, 0, 0, 85 },
+  { 0, 0, 0, 0, 86 },
+  { 0, 0, 0, 0, 87 },
+  { 0, 0, 0, 0, 88 },
+  { 0, 0, 0, 0, 89 },
+  { 0, 0, 0, 0, 90 },
+  { 0, 0, 0, 0, 91 },
+  { 0, 0, 0, 0, 92 },
+  { 0, 0, 0, 0, 93 },
+  { 0, 0, 0, 0, 94 },
+  { 0, 0, 0, 0, 95 },
+  { 0, 0, 0, 0, 96 },
+  { 0, 0, 0, 0, 97 },
+  { 0, 0, 0, 0, 98 },
+  { 0, 0, 0, 0, 99 },
+  { 0, 0, 0, 0, 100 },
+  { 0, 0, 0, 0, 101 },
+  { 0, 0, 0, 0, 102 },
+  { 0, 0, 0, 0, 103 },
+  { 0, 0, 0, 0, 104 },
+  { 0, 0, 0, 0, 105 },
+  { 0, 0, 0, 0, 106 },
+  { 0, 0, 0, 0, 107 },
+  { 0, 0, 0, 0, 108 },
+  { 0, 0, 0, 0, 109 },
+  { 0, 0, 0, 0, 110 },
+  { 0, 0, 0, 0, 111 },
+  { 0, 0, 0, 0, 112 },
+  { 0, 0, 0, 0, 113 },
+  { 0, 0, 0, 0, 114 },
+  { 0, 0, 0, 0, 115 },
+  { 0, 0, 0, 0, 116 },
+  { 0, 0, 0, 0, 117 },
+  { 0, 0, 0, 0, 118 },
+  { 0, 0, 0, 0, 119 },
+  { 0, 0, 0, 0, 120 },
+  { 0, 0, 0, 0, 121 },
+  { 0, 0, 0, 0, 122 },
+  { 0, 0, 0, 0, 123 },
+  { 0, 0, 0, 0, 124 },
+  { 0, 0, 0, 0, 125 },
+  { 0, 0, 0, 0, 126 },
+  { 0, 0, 0, 0, 127 },
+  { 0, 0, 0, 0, 128 },
+  { 0, 0, 0, 0, 129 },
+  { 0, 0, 0, 0, 130 },
+  { 0, 0, 0, 0, 131 },
+  { 0, 0, 0, 0, 132 },
+  { 0, 0, 0, 0, 133 },
+  { 0, 0, 0, 0, 134 },
+  { 0, 0, 0, 0, 135 },
+  { 0, 0, 0, 0, 136 },
+  { 0, 0, 0, 0, 137 },
+  { 0, 0, 0, 0, 138 },
+  { 0, 0, 0, 0, 139 },
+  { 0, 0, 0, 0, 140 },
+  { 0, 0, 0, 0, 141 },
+  { 0, 0, 0, 0, 142 },
+  { 0, 0, 0, 0, 143 },
+  { 0, 0, 0, 0, 144 },
+  { 0, 0, 0, 0, 145 },
+  { 0, 0, 0, 0, 146 },
+  { 0, 0, 0, 0, 147 },
+  { 0, 0, 0, 0, 148 },
+  { 0, 0, 0, 0, 149 },
+  { 0, 0, 0, 0, 150 },
+  { 0, 0, 0, 0, 151 },
+  { 0, 0, 0, 0, 152 },
+  { 0, 0, 0, 0, 153 },
+  { 0, 0, 0, 0, 154 },
+  { 0, 0, 0, 0, 155 },
+  { 0, 0, 0, 0, 156 },
+  { 0, 0, 0, 0, 157 },
+  { 0, 0, 0, 0, 158 },
+  { 0, 0, 0, 0, 159 },
+  { 0, 0, 0, 0, 160 },
+  { 0, 0, 0, 0, 161 },
+  { 0, 0, 0, 0, 162 },
+  { 0, 0, 0, 0, 163 },
+  { 0, 0, 0, 0, 164 },
+  { 0, 0, 0, 0, 165 },
+  { 0, 0, 0, 0, 166 },
+  { 0, 0, 0, 0, 167 },
+  { 0, 0, 0, 0, 168 },
+  { 0, 0, 0, 0, 169 },
+  { 0, 0, 0, 0, 170 },
+  { 0, 0, 0, 0, 171 },
+  { 0, 0, 0, 0, 172 },
+  { 0, 0, 0, 0, 173 },
+  { 0, 0, 0, 0, 174 },
+  { 0, 0, 0, 0, 175 },
+  { 0, 0, 0, 0, 176 },
+  { 0, 0, 0, 0, 177 },
+  { 0, 0, 0, 0, 178 },
+  { 0, 0, 0, 0, 179 },
+  { 0, 0, 0, 0, 180 },
+  { 0, 0, 0, 0, 181 },
+  { 0, 0, 0, 0, 182 },
+  { 0, 0, 0, 0, 183 },
+  { 0, 0, 0, 0, 184 },
+  { 0, 0, 0, 0, 185 },
+  { 0, 0, 0, 0, 186 },
+  { 0, 0, 0, 0, 187 },
+  { 0, 0, 0, 0, 188 },
+  { 0, 0, 0, 0, 189 },
+  { 0, 0, 0, 0, 190 },
+  { 0, 0, 0, 0, 191 },
+  { 0, 0, 0, 0, 192 },
+  { 0, 0, 0, 0, 193 },
+  { 0, 0, 0, 0, 194 },
+  { 0, 0, 0, 0, 195 },
+  { 0, 0, 0, 0, 196 },
+  { 0, 0, 0, 0, 197 },
+  { 0, 0, 0, 0, 198 },
+  { 0, 0, 0, 0, 199 },
+  { 0, 0, 0, 0, 200 },
+  { 0, 0, 0, 0, 201 },
+  { 0, 0, 0, 0, 202 },
+  { 0, 0, 0, 0, 203 },
+  { 0, 0, 0, 0, 204 },
+  { 0, 0, 0, 0, 205 },
+  { 0, 0, 0, 0, 206 },
+  { 0, 0, 0, 0, 207 },
+  { 0, 0, 0, 0, 208 },
+  { 0, 0, 0, 0, 209 },
+  { 0, 0, 0, 0, 210 },
+  { 0, 0, 0, 0, 211 },
+  { 0, 0, 0, 0, 212 },
+  { 0, 0, 0, 0, 213 },
+  { 0, 0, 0, 0, 214 },
+  { 0, 0, 0, 0, 215 },
+  { 0, 0, 0, 0, 216 },
+  { 0, 0, 0, 0, 217 },
+  { 0, 0, 0, 0, 218 },
+  { 0, 0, 0, 0, 219 },
+  { 0, 0, 0, 0, 220 },
+  { 0, 0, 0, 0, 221 },
+  { 0, 0, 0, 0, 222 },
+  { 0, 0, 0, 0, 223 },
+  { 0, 0, 0, 0, 224 },
+  { 0, 0, 0, 0, 225 },
+  { 0, 0, 0, 0, 226 },
+  { 0, 0, 0, 0, 227 },
+  { 0, 0, 0, 0, 228 },
+  { 0, 0, 0, 0, 229 },
+  { 0, 0, 0, 0, 230 },
+  { 0, 0, 0, 0, 231 },
+  { 0, 0, 0, 0, 232 },
+  { 0, 0, 0, 0, 233 },
+  { 0, 0, 0, 0, 234 },
+  { 0, 0, 0, 0, 235 },
+  { 0, 0, 0, 0, 236 },
+  { 0, 0, 0, 0, 237 },
+  { 0, 0, 0, 0, 238 },
+  { 0, 0, 0, 0, 239 },
+  { 0, 0, 0, 0, 240 },
+  { 0, 0, 0, 0, 241 },
+  { 0, 0, 0, 0, 242 },
+  { 0, 0, 0, 0, 243 },
+  { 0, 0, 0, 0, 244 },
+  { 0, 0, 0, 0, 245 },
+  { 0, 0, 0, 0, 246 },
+  { 0, 0, 0, 0, 247 },
+  { 0, 0, 0, 0, 248 },
+  { 0, 0, 0, 0, 249 },
+  { 0, 0, 0, 0, 250 },
+  { 0, 0, 0, 0, 251 },
+  { 0, 0, 0, 0, 252 },
+  { 0, 0, 0, 0, 253 },
+  { 0, 0, 0, 0, 254 },
+  { 0, 0, 0, 0, 255 },
+  { "vrsave", 1, 0, 0, spr_vrsave /*256*/ },
+  { 0, 0, 0, 0, 257 },
+  { 0, 0, 0, 0, 258 },
+  { 0, 0, 0, 0, 259 },
+  { 0, 0, 0, 0, 260 },
+  { 0, 0, 0, 0, 261 },
+  { 0, 0, 0, 0, 262 },
+  { 0, 0, 0, 0, 263 },
+  { 0, 0, 0, 0, 264 },
+  { 0, 0, 0, 0, 265 },
+  { 0, 0, 0, 0, 266 },
+  { 0, 0, 0, 0, 267 },
+  { "tbrl", 1, 0, 0, spr_tbrl /*268*/ },
+  { "tbru", 1, 0, 0, spr_tbru /*269*/ },
+  { 0, 0, 0, 0, 270 },
+  { 0, 0, 0, 0, 271 },
+  { "sprg0", 1, 0, 0, spr_sprg0 /*272*/ },
+  { "sprg1", 1, 0, 0, spr_sprg1 /*273*/ },
+  { "sprg2", 1, 0, 0, spr_sprg2 /*274*/ },
+  { "sprg3", 1, 0, 0, spr_sprg3 /*275*/ },
+  { 0, 0, 0, 0, 276 },
+  { 0, 0, 0, 0, 277 },
+  { 0, 0, 0, 0, 278 },
+  { 0, 0, 0, 0, 279 },
+  { 0, 0, 0, 0, 280 },
+  { 0, 0, 0, 0, 281 },
+  { "ear", 1, 0, 0, spr_ear /*282*/ },
+  { 0, 0, 0, 0, 283 },
+  { "tbl", 1, 0, 0, spr_tbl /*284*/ },
+  { "tbu", 1, 0, 0, spr_tbu /*285*/ },
+  { 0, 0, 0, 0, 286 },
+  { "pvr", 1, 0, 0, spr_pvr /*287*/ },
+  { 0, 0, 0, 0, 288 },
+  { 0, 0, 0, 0, 289 },
+  { 0, 0, 0, 0, 290 },
+  { 0, 0, 0, 0, 291 },
+  { 0, 0, 0, 0, 292 },
+  { 0, 0, 0, 0, 293 },
+  { 0, 0, 0, 0, 294 },
+  { 0, 0, 0, 0, 295 },
+  { 0, 0, 0, 0, 296 },
+  { 0, 0, 0, 0, 297 },
+  { 0, 0, 0, 0, 298 },
+  { 0, 0, 0, 0, 299 },
+  { 0, 0, 0, 0, 300 },
+  { 0, 0, 0, 0, 301 },
+  { 0, 0, 0, 0, 302 },
+  { 0, 0, 0, 0, 303 },
+  { 0, 0, 0, 0, 304 },
+  { 0, 0, 0, 0, 305 },
+  { 0, 0, 0, 0, 306 },
+  { 0, 0, 0, 0, 307 },
+  { 0, 0, 0, 0, 308 },
+  { 0, 0, 0, 0, 309 },
+  { 0, 0, 0, 0, 310 },
+  { 0, 0, 0, 0, 311 },
+  { 0, 0, 0, 0, 312 },
+  { 0, 0, 0, 0, 313 },
+  { 0, 0, 0, 0, 314 },
+  { 0, 0, 0, 0, 315 },
+  { 0, 0, 0, 0, 316 },
+  { 0, 0, 0, 0, 317 },
+  { 0, 0, 0, 0, 318 },
+  { 0, 0, 0, 0, 319 },
+  { 0, 0, 0, 0, 320 },
+  { 0, 0, 0, 0, 321 },
+  { 0, 0, 0, 0, 322 },
+  { 0, 0, 0, 0, 323 },
+  { 0, 0, 0, 0, 324 },
+  { 0, 0, 0, 0, 325 },
+  { 0, 0, 0, 0, 326 },
+  { 0, 0, 0, 0, 327 },
+  { 0, 0, 0, 0, 328 },
+  { 0, 0, 0, 0, 329 },
+  { 0, 0, 0, 0, 330 },
+  { 0, 0, 0, 0, 331 },
+  { 0, 0, 0, 0, 332 },
+  { 0, 0, 0, 0, 333 },
+  { 0, 0, 0, 0, 334 },
+  { 0, 0, 0, 0, 335 },
+  { 0, 0, 0, 0, 336 },
+  { 0, 0, 0, 0, 337 },
+  { 0, 0, 0, 0, 338 },
+  { 0, 0, 0, 0, 339 },
+  { 0, 0, 0, 0, 340 },
+  { 0, 0, 0, 0, 341 },
+  { 0, 0, 0, 0, 342 },
+  { 0, 0, 0, 0, 343 },
+  { 0, 0, 0, 0, 344 },
+  { 0, 0, 0, 0, 345 },
+  { 0, 0, 0, 0, 346 },
+  { 0, 0, 0, 0, 347 },
+  { 0, 0, 0, 0, 348 },
+  { 0, 0, 0, 0, 349 },
+  { 0, 0, 0, 0, 350 },
+  { 0, 0, 0, 0, 351 },
+  { 0, 0, 0, 0, 352 },
+  { 0, 0, 0, 0, 353 },
+  { 0, 0, 0, 0, 354 },
+  { 0, 0, 0, 0, 355 },
+  { 0, 0, 0, 0, 356 },
+  { 0, 0, 0, 0, 357 },
+  { 0, 0, 0, 0, 358 },
+  { 0, 0, 0, 0, 359 },
+  { 0, 0, 0, 0, 360 },
+  { 0, 0, 0, 0, 361 },
+  { 0, 0, 0, 0, 362 },
+  { 0, 0, 0, 0, 363 },
+  { 0, 0, 0, 0, 364 },
+  { 0, 0, 0, 0, 365 },
+  { 0, 0, 0, 0, 366 },
+  { 0, 0, 0, 0, 367 },
+  { 0, 0, 0, 0, 368 },
+  { 0, 0, 0, 0, 369 },
+  { 0, 0, 0, 0, 370 },
+  { 0, 0, 0, 0, 371 },
+  { 0, 0, 0, 0, 372 },
+  { 0, 0, 0, 0, 373 },
+  { 0, 0, 0, 0, 374 },
+  { 0, 0, 0, 0, 375 },
+  { 0, 0, 0, 0, 376 },
+  { 0, 0, 0, 0, 377 },
+  { 0, 0, 0, 0, 378 },
+  { 0, 0, 0, 0, 379 },
+  { 0, 0, 0, 0, 380 },
+  { 0, 0, 0, 0, 381 },
+  { 0, 0, 0, 0, 382 },
+  { 0, 0, 0, 0, 383 },
+  { 0, 0, 0, 0, 384 },
+  { 0, 0, 0, 0, 385 },
+  { 0, 0, 0, 0, 386 },
+  { 0, 0, 0, 0, 387 },
+  { 0, 0, 0, 0, 388 },
+  { 0, 0, 0, 0, 389 },
+  { 0, 0, 0, 0, 390 },
+  { 0, 0, 0, 0, 391 },
+  { 0, 0, 0, 0, 392 },
+  { 0, 0, 0, 0, 393 },
+  { 0, 0, 0, 0, 394 },
+  { 0, 0, 0, 0, 395 },
+  { 0, 0, 0, 0, 396 },
+  { 0, 0, 0, 0, 397 },
+  { 0, 0, 0, 0, 398 },
+  { 0, 0, 0, 0, 399 },
+  { 0, 0, 0, 0, 400 },
+  { 0, 0, 0, 0, 401 },
+  { 0, 0, 0, 0, 402 },
+  { 0, 0, 0, 0, 403 },
+  { 0, 0, 0, 0, 404 },
+  { 0, 0, 0, 0, 405 },
+  { 0, 0, 0, 0, 406 },
+  { 0, 0, 0, 0, 407 },
+  { 0, 0, 0, 0, 408 },
+  { 0, 0, 0, 0, 409 },
+  { 0, 0, 0, 0, 410 },
+  { 0, 0, 0, 0, 411 },
+  { 0, 0, 0, 0, 412 },
+  { 0, 0, 0, 0, 413 },
+  { 0, 0, 0, 0, 414 },
+  { 0, 0, 0, 0, 415 },
+  { 0, 0, 0, 0, 416 },
+  { 0, 0, 0, 0, 417 },
+  { 0, 0, 0, 0, 418 },
+  { 0, 0, 0, 0, 419 },
+  { 0, 0, 0, 0, 420 },
+  { 0, 0, 0, 0, 421 },
+  { 0, 0, 0, 0, 422 },
+  { 0, 0, 0, 0, 423 },
+  { 0, 0, 0, 0, 424 },
+  { 0, 0, 0, 0, 425 },
+  { 0, 0, 0, 0, 426 },
+  { 0, 0, 0, 0, 427 },
+  { 0, 0, 0, 0, 428 },
+  { 0, 0, 0, 0, 429 },
+  { 0, 0, 0, 0, 430 },
+  { 0, 0, 0, 0, 431 },
+  { 0, 0, 0, 0, 432 },
+  { 0, 0, 0, 0, 433 },
+  { 0, 0, 0, 0, 434 },
+  { 0, 0, 0, 0, 435 },
+  { 0, 0, 0, 0, 436 },
+  { 0, 0, 0, 0, 437 },
+  { 0, 0, 0, 0, 438 },
+  { 0, 0, 0, 0, 439 },
+  { 0, 0, 0, 0, 440 },
+  { 0, 0, 0, 0, 441 },
+  { 0, 0, 0, 0, 442 },
+  { 0, 0, 0, 0, 443 },
+  { 0, 0, 0, 0, 444 },
+  { 0, 0, 0, 0, 445 },
+  { 0, 0, 0, 0, 446 },
+  { 0, 0, 0, 0, 447 },
+  { 0, 0, 0, 0, 448 },
+  { 0, 0, 0, 0, 449 },
+  { 0, 0, 0, 0, 450 },
+  { 0, 0, 0, 0, 451 },
+  { 0, 0, 0, 0, 452 },
+  { 0, 0, 0, 0, 453 },
+  { 0, 0, 0, 0, 454 },
+  { 0, 0, 0, 0, 455 },
+  { 0, 0, 0, 0, 456 },
+  { 0, 0, 0, 0, 457 },
+  { 0, 0, 0, 0, 458 },
+  { 0, 0, 0, 0, 459 },
+  { 0, 0, 0, 0, 460 },
+  { 0, 0, 0, 0, 461 },
+  { 0, 0, 0, 0, 462 },
+  { 0, 0, 0, 0, 463 },
+  { 0, 0, 0, 0, 464 },
+  { 0, 0, 0, 0, 465 },
+  { 0, 0, 0, 0, 466 },
+  { 0, 0, 0, 0, 467 },
+  { 0, 0, 0, 0, 468 },
+  { 0, 0, 0, 0, 469 },
+  { 0, 0, 0, 0, 470 },
+  { 0, 0, 0, 0, 471 },
+  { 0, 0, 0, 0, 472 },
+  { 0, 0, 0, 0, 473 },
+  { 0, 0, 0, 0, 474 },
+  { 0, 0, 0, 0, 475 },
+  { 0, 0, 0, 0, 476 },
+  { 0, 0, 0, 0, 477 },
+  { 0, 0, 0, 0, 478 },
+  { 0, 0, 0, 0, 479 },
+  { 0, 0, 0, 0, 480 },
+  { 0, 0, 0, 0, 481 },
+  { 0, 0, 0, 0, 482 },
+  { 0, 0, 0, 0, 483 },
+  { 0, 0, 0, 0, 484 },
+  { 0, 0, 0, 0, 485 },
+  { 0, 0, 0, 0, 486 },
+  { 0, 0, 0, 0, 487 },
+  { 0, 0, 0, 0, 488 },
+  { 0, 0, 0, 0, 489 },
+  { 0, 0, 0, 0, 490 },
+  { 0, 0, 0, 0, 491 },
+  { 0, 0, 0, 0, 492 },
+  { 0, 0, 0, 0, 493 },
+  { 0, 0, 0, 0, 494 },
+  { 0, 0, 0, 0, 495 },
+  { 0, 0, 0, 0, 496 },
+  { 0, 0, 0, 0, 497 },
+  { 0, 0, 0, 0, 498 },
+  { 0, 0, 0, 0, 499 },
+  { 0, 0, 0, 0, 500 },
+  { 0, 0, 0, 0, 501 },
+  { 0, 0, 0, 0, 502 },
+  { 0, 0, 0, 0, 503 },
+  { 0, 0, 0, 0, 504 },
+  { 0, 0, 0, 0, 505 },
+  { 0, 0, 0, 0, 506 },
+  { 0, 0, 0, 0, 507 },
+  { 0, 0, 0, 0, 508 },
+  { 0, 0, 0, 0, 509 },
+  { 0, 0, 0, 0, 510 },
+  { 0, 0, 0, 0, 511 },
+  { "spefscr", 1, 0, 0, spr_spefscr /*512*/ },
+  { 0, 0, 0, 0, 513 },
+  { 0, 0, 0, 0, 514 },
+  { 0, 0, 0, 0, 515 },
+  { 0, 0, 0, 0, 516 },
+  { 0, 0, 0, 0, 517 },
+  { 0, 0, 0, 0, 518 },
+  { 0, 0, 0, 0, 519 },
+  { 0, 0, 0, 0, 520 },
+  { 0, 0, 0, 0, 521 },
+  { 0, 0, 0, 0, 522 },
+  { 0, 0, 0, 0, 523 },
+  { 0, 0, 0, 0, 524 },
+  { 0, 0, 0, 0, 525 },
+  { 0, 0, 0, 0, 526 },
+  { 0, 0, 0, 0, 527 },
+  { "ibat0u", 1, 0, 0, spr_ibat0u /*528*/ },
+  { "ibat0l", 1, 0, 0, spr_ibat0l /*529*/ },
+  { "ibat1u", 1, 0, 0, spr_ibat1u /*530*/ },
+  { "ibat1l", 1, 0, 0, spr_ibat1l /*531*/ },
+  { "ibat2u", 1, 0, 0, spr_ibat2u /*532*/ },
+  { "ibat2l", 1, 0, 0, spr_ibat2l /*533*/ },
+  { "ibat3u", 1, 0, 0, spr_ibat3u /*534*/ },
+  { "ibat3l", 1, 0, 0, spr_ibat3l /*535*/ },
+  { "dbat0u", 1, 0, 0, spr_dbat0u /*536*/ },
+  { "dbat0l", 1, 0, 0, spr_dbat0l /*537*/ },
+  { "dbat1u", 1, 0, 0, spr_dbat1u /*538*/ },
+  { "dbat1l", 1, 0, 0, spr_dbat1l /*539*/ },
+  { "dbat2u", 1, 0, 0, spr_dbat2u /*540*/ },
+  { "dbat2l", 1, 0, 0, spr_dbat2l /*541*/ },
+  { "dbat3u", 1, 0, 0, spr_dbat3u /*542*/ },
+  { "dbat3l", 1, 0, 0, spr_dbat3l /*543*/ },
+  { 0, 0, 0, 0, 544 },
+  { 0, 0, 0, 0, 545 },
+  { 0, 0, 0, 0, 546 },
+  { 0, 0, 0, 0, 547 },
+  { 0, 0, 0, 0, 548 },
+  { 0, 0, 0, 0, 549 },
+  { 0, 0, 0, 0, 550 },
+  { 0, 0, 0, 0, 551 },
+  { 0, 0, 0, 0, 552 },
+  { 0, 0, 0, 0, 553 },
+  { 0, 0, 0, 0, 554 },
+  { 0, 0, 0, 0, 555 },
+  { 0, 0, 0, 0, 556 },
+  { 0, 0, 0, 0, 557 },
+  { 0, 0, 0, 0, 558 },
+  { 0, 0, 0, 0, 559 },
+  { 0, 0, 0, 0, 560 },
+  { 0, 0, 0, 0, 561 },
+  { 0, 0, 0, 0, 562 },
+  { 0, 0, 0, 0, 563 },
+  { 0, 0, 0, 0, 564 },
+  { 0, 0, 0, 0, 565 },
+  { 0, 0, 0, 0, 566 },
+  { 0, 0, 0, 0, 567 },
+  { 0, 0, 0, 0, 568 },
+  { 0, 0, 0, 0, 569 },
+  { 0, 0, 0, 0, 570 },
+  { 0, 0, 0, 0, 571 },
+  { 0, 0, 0, 0, 572 },
+  { 0, 0, 0, 0, 573 },
+  { 0, 0, 0, 0, 574 },
+  { 0, 0, 0, 0, 575 },
+  { 0, 0, 0, 0, 576 },
+  { 0, 0, 0, 0, 577 },
+  { 0, 0, 0, 0, 578 },
+  { 0, 0, 0, 0, 579 },
+  { 0, 0, 0, 0, 580 },
+  { 0, 0, 0, 0, 581 },
+  { 0, 0, 0, 0, 582 },
+  { 0, 0, 0, 0, 583 },
+  { 0, 0, 0, 0, 584 },
+  { 0, 0, 0, 0, 585 },
+  { 0, 0, 0, 0, 586 },
+  { 0, 0, 0, 0, 587 },
+  { 0, 0, 0, 0, 588 },
+  { 0, 0, 0, 0, 589 },
+  { 0, 0, 0, 0, 590 },
+  { 0, 0, 0, 0, 591 },
+  { 0, 0, 0, 0, 592 },
+  { 0, 0, 0, 0, 593 },
+  { 0, 0, 0, 0, 594 },
+  { 0, 0, 0, 0, 595 },
+  { 0, 0, 0, 0, 596 },
+  { 0, 0, 0, 0, 597 },
+  { 0, 0, 0, 0, 598 },
+  { 0, 0, 0, 0, 599 },
+  { 0, 0, 0, 0, 600 },
+  { 0, 0, 0, 0, 601 },
+  { 0, 0, 0, 0, 602 },
+  { 0, 0, 0, 0, 603 },
+  { 0, 0, 0, 0, 604 },
+  { 0, 0, 0, 0, 605 },
+  { 0, 0, 0, 0, 606 },
+  { 0, 0, 0, 0, 607 },
+  { 0, 0, 0, 0, 608 },
+  { 0, 0, 0, 0, 609 },
+  { 0, 0, 0, 0, 610 },
+  { 0, 0, 0, 0, 611 },
+  { 0, 0, 0, 0, 612 },
+  { 0, 0, 0, 0, 613 },
+  { 0, 0, 0, 0, 614 },
+  { 0, 0, 0, 0, 615 },
+  { 0, 0, 0, 0, 616 },
+  { 0, 0, 0, 0, 617 },
+  { 0, 0, 0, 0, 618 },
+  { 0, 0, 0, 0, 619 },
+  { 0, 0, 0, 0, 620 },
+  { 0, 0, 0, 0, 621 },
+  { 0, 0, 0, 0, 622 },
+  { 0, 0, 0, 0, 623 },
+  { 0, 0, 0, 0, 624 },
+  { 0, 0, 0, 0, 625 },
+  { 0, 0, 0, 0, 626 },
+  { 0, 0, 0, 0, 627 },
+  { 0, 0, 0, 0, 628 },
+  { 0, 0, 0, 0, 629 },
+  { 0, 0, 0, 0, 630 },
+  { 0, 0, 0, 0, 631 },
+  { 0, 0, 0, 0, 632 },
+  { 0, 0, 0, 0, 633 },
+  { 0, 0, 0, 0, 634 },
+  { 0, 0, 0, 0, 635 },
+  { 0, 0, 0, 0, 636 },
+  { 0, 0, 0, 0, 637 },
+  { 0, 0, 0, 0, 638 },
+  { 0, 0, 0, 0, 639 },
+  { 0, 0, 0, 0, 640 },
+  { 0, 0, 0, 0, 641 },
+  { 0, 0, 0, 0, 642 },
+  { 0, 0, 0, 0, 643 },
+  { 0, 0, 0, 0, 644 },
+  { 0, 0, 0, 0, 645 },
+  { 0, 0, 0, 0, 646 },
+  { 0, 0, 0, 0, 647 },
+  { 0, 0, 0, 0, 648 },
+  { 0, 0, 0, 0, 649 },
+  { 0, 0, 0, 0, 650 },
+  { 0, 0, 0, 0, 651 },
+  { 0, 0, 0, 0, 652 },
+  { 0, 0, 0, 0, 653 },
+  { 0, 0, 0, 0, 654 },
+  { 0, 0, 0, 0, 655 },
+  { 0, 0, 0, 0, 656 },
+  { 0, 0, 0, 0, 657 },
+  { 0, 0, 0, 0, 658 },
+  { 0, 0, 0, 0, 659 },
+  { 0, 0, 0, 0, 660 },
+  { 0, 0, 0, 0, 661 },
+  { 0, 0, 0, 0, 662 },
+  { 0, 0, 0, 0, 663 },
+  { 0, 0, 0, 0, 664 },
+  { 0, 0, 0, 0, 665 },
+  { 0, 0, 0, 0, 666 },
+  { 0, 0, 0, 0, 667 },
+  { 0, 0, 0, 0, 668 },
+  { 0, 0, 0, 0, 669 },
+  { 0, 0, 0, 0, 670 },
+  { 0, 0, 0, 0, 671 },
+  { 0, 0, 0, 0, 672 },
+  { 0, 0, 0, 0, 673 },
+  { 0, 0, 0, 0, 674 },
+  { 0, 0, 0, 0, 675 },
+  { 0, 0, 0, 0, 676 },
+  { 0, 0, 0, 0, 677 },
+  { 0, 0, 0, 0, 678 },
+  { 0, 0, 0, 0, 679 },
+  { 0, 0, 0, 0, 680 },
+  { 0, 0, 0, 0, 681 },
+  { 0, 0, 0, 0, 682 },
+  { 0, 0, 0, 0, 683 },
+  { 0, 0, 0, 0, 684 },
+  { 0, 0, 0, 0, 685 },
+  { 0, 0, 0, 0, 686 },
+  { 0, 0, 0, 0, 687 },
+  { 0, 0, 0, 0, 688 },
+  { 0, 0, 0, 0, 689 },
+  { 0, 0, 0, 0, 690 },
+  { 0, 0, 0, 0, 691 },
+  { 0, 0, 0, 0, 692 },
+  { 0, 0, 0, 0, 693 },
+  { 0, 0, 0, 0, 694 },
+  { 0, 0, 0, 0, 695 },
+  { 0, 0, 0, 0, 696 },
+  { 0, 0, 0, 0, 697 },
+  { 0, 0, 0, 0, 698 },
+  { 0, 0, 0, 0, 699 },
+  { 0, 0, 0, 0, 700 },
+  { 0, 0, 0, 0, 701 },
+  { 0, 0, 0, 0, 702 },
+  { 0, 0, 0, 0, 703 },
+  { 0, 0, 0, 0, 704 },
+  { 0, 0, 0, 0, 705 },
+  { 0, 0, 0, 0, 706 },
+  { 0, 0, 0, 0, 707 },
+  { 0, 0, 0, 0, 708 },
+  { 0, 0, 0, 0, 709 },
+  { 0, 0, 0, 0, 710 },
+  { 0, 0, 0, 0, 711 },
+  { 0, 0, 0, 0, 712 },
+  { 0, 0, 0, 0, 713 },
+  { 0, 0, 0, 0, 714 },
+  { 0, 0, 0, 0, 715 },
+  { 0, 0, 0, 0, 716 },
+  { 0, 0, 0, 0, 717 },
+  { 0, 0, 0, 0, 718 },
+  { 0, 0, 0, 0, 719 },
+  { 0, 0, 0, 0, 720 },
+  { 0, 0, 0, 0, 721 },
+  { 0, 0, 0, 0, 722 },
+  { 0, 0, 0, 0, 723 },
+  { 0, 0, 0, 0, 724 },
+  { 0, 0, 0, 0, 725 },
+  { 0, 0, 0, 0, 726 },
+  { 0, 0, 0, 0, 727 },
+  { 0, 0, 0, 0, 728 },
+  { 0, 0, 0, 0, 729 },
+  { 0, 0, 0, 0, 730 },
+  { 0, 0, 0, 0, 731 },
+  { 0, 0, 0, 0, 732 },
+  { 0, 0, 0, 0, 733 },
+  { 0, 0, 0, 0, 734 },
+  { 0, 0, 0, 0, 735 },
+  { 0, 0, 0, 0, 736 },
+  { 0, 0, 0, 0, 737 },
+  { 0, 0, 0, 0, 738 },
+  { 0, 0, 0, 0, 739 },
+  { 0, 0, 0, 0, 740 },
+  { 0, 0, 0, 0, 741 },
+  { 0, 0, 0, 0, 742 },
+  { 0, 0, 0, 0, 743 },
+  { 0, 0, 0, 0, 744 },
+  { 0, 0, 0, 0, 745 },
+  { 0, 0, 0, 0, 746 },
+  { 0, 0, 0, 0, 747 },
+  { 0, 0, 0, 0, 748 },
+  { 0, 0, 0, 0, 749 },
+  { 0, 0, 0, 0, 750 },
+  { 0, 0, 0, 0, 751 },
+  { 0, 0, 0, 0, 752 },
+  { 0, 0, 0, 0, 753 },
+  { 0, 0, 0, 0, 754 },
+  { 0, 0, 0, 0, 755 },
+  { 0, 0, 0, 0, 756 },
+  { 0, 0, 0, 0, 757 },
+  { 0, 0, 0, 0, 758 },
+  { 0, 0, 0, 0, 759 },
+  { 0, 0, 0, 0, 760 },
+  { 0, 0, 0, 0, 761 },
+  { 0, 0, 0, 0, 762 },
+  { 0, 0, 0, 0, 763 },
+  { 0, 0, 0, 0, 764 },
+  { 0, 0, 0, 0, 765 },
+  { 0, 0, 0, 0, 766 },
+  { 0, 0, 0, 0, 767 },
+  { 0, 0, 0, 0, 768 },
+  { 0, 0, 0, 0, 769 },
+  { 0, 0, 0, 0, 770 },
+  { 0, 0, 0, 0, 771 },
+  { 0, 0, 0, 0, 772 },
+  { 0, 0, 0, 0, 773 },
+  { 0, 0, 0, 0, 774 },
+  { 0, 0, 0, 0, 775 },
+  { 0, 0, 0, 0, 776 },
+  { 0, 0, 0, 0, 777 },
+  { 0, 0, 0, 0, 778 },
+  { 0, 0, 0, 0, 779 },
+  { 0, 0, 0, 0, 780 },
+  { 0, 0, 0, 0, 781 },
+  { 0, 0, 0, 0, 782 },
+  { 0, 0, 0, 0, 783 },
+  { 0, 0, 0, 0, 784 },
+  { 0, 0, 0, 0, 785 },
+  { 0, 0, 0, 0, 786 },
+  { 0, 0, 0, 0, 787 },
+  { 0, 0, 0, 0, 788 },
+  { 0, 0, 0, 0, 789 },
+  { 0, 0, 0, 0, 790 },
+  { 0, 0, 0, 0, 791 },
+  { 0, 0, 0, 0, 792 },
+  { 0, 0, 0, 0, 793 },
+  { 0, 0, 0, 0, 794 },
+  { 0, 0, 0, 0, 795 },
+  { 0, 0, 0, 0, 796 },
+  { 0, 0, 0, 0, 797 },
+  { 0, 0, 0, 0, 798 },
+  { 0, 0, 0, 0, 799 },
+  { 0, 0, 0, 0, 800 },
+  { 0, 0, 0, 0, 801 },
+  { 0, 0, 0, 0, 802 },
+  { 0, 0, 0, 0, 803 },
+  { 0, 0, 0, 0, 804 },
+  { 0, 0, 0, 0, 805 },
+  { 0, 0, 0, 0, 806 },
+  { 0, 0, 0, 0, 807 },
+  { 0, 0, 0, 0, 808 },
+  { 0, 0, 0, 0, 809 },
+  { 0, 0, 0, 0, 810 },
+  { 0, 0, 0, 0, 811 },
+  { 0, 0, 0, 0, 812 },
+  { 0, 0, 0, 0, 813 },
+  { 0, 0, 0, 0, 814 },
+  { 0, 0, 0, 0, 815 },
+  { 0, 0, 0, 0, 816 },
+  { 0, 0, 0, 0, 817 },
+  { 0, 0, 0, 0, 818 },
+  { 0, 0, 0, 0, 819 },
+  { 0, 0, 0, 0, 820 },
+  { 0, 0, 0, 0, 821 },
+  { 0, 0, 0, 0, 822 },
+  { 0, 0, 0, 0, 823 },
+  { 0, 0, 0, 0, 824 },
+  { 0, 0, 0, 0, 825 },
+  { 0, 0, 0, 0, 826 },
+  { 0, 0, 0, 0, 827 },
+  { 0, 0, 0, 0, 828 },
+  { 0, 0, 0, 0, 829 },
+  { 0, 0, 0, 0, 830 },
+  { 0, 0, 0, 0, 831 },
+  { 0, 0, 0, 0, 832 },
+  { 0, 0, 0, 0, 833 },
+  { 0, 0, 0, 0, 834 },
+  { 0, 0, 0, 0, 835 },
+  { 0, 0, 0, 0, 836 },
+  { 0, 0, 0, 0, 837 },
+  { 0, 0, 0, 0, 838 },
+  { 0, 0, 0, 0, 839 },
+  { 0, 0, 0, 0, 840 },
+  { 0, 0, 0, 0, 841 },
+  { 0, 0, 0, 0, 842 },
+  { 0, 0, 0, 0, 843 },
+  { 0, 0, 0, 0, 844 },
+  { 0, 0, 0, 0, 845 },
+  { 0, 0, 0, 0, 846 },
+  { 0, 0, 0, 0, 847 },
+  { 0, 0, 0, 0, 848 },
+  { 0, 0, 0, 0, 849 },
+  { 0, 0, 0, 0, 850 },
+  { 0, 0, 0, 0, 851 },
+  { 0, 0, 0, 0, 852 },
+  { 0, 0, 0, 0, 853 },
+  { 0, 0, 0, 0, 854 },
+  { 0, 0, 0, 0, 855 },
+  { 0, 0, 0, 0, 856 },
+  { 0, 0, 0, 0, 857 },
+  { 0, 0, 0, 0, 858 },
+  { 0, 0, 0, 0, 859 },
+  { 0, 0, 0, 0, 860 },
+  { 0, 0, 0, 0, 861 },
+  { 0, 0, 0, 0, 862 },
+  { 0, 0, 0, 0, 863 },
+  { 0, 0, 0, 0, 864 },
+  { 0, 0, 0, 0, 865 },
+  { 0, 0, 0, 0, 866 },
+  { 0, 0, 0, 0, 867 },
+  { 0, 0, 0, 0, 868 },
+  { 0, 0, 0, 0, 869 },
+  { 0, 0, 0, 0, 870 },
+  { 0, 0, 0, 0, 871 },
+  { 0, 0, 0, 0, 872 },
+  { 0, 0, 0, 0, 873 },
+  { 0, 0, 0, 0, 874 },
+  { 0, 0, 0, 0, 875 },
+  { 0, 0, 0, 0, 876 },
+  { 0, 0, 0, 0, 877 },
+  { 0, 0, 0, 0, 878 },
+  { 0, 0, 0, 0, 879 },
+  { 0, 0, 0, 0, 880 },
+  { 0, 0, 0, 0, 881 },
+  { 0, 0, 0, 0, 882 },
+  { 0, 0, 0, 0, 883 },
+  { 0, 0, 0, 0, 884 },
+  { 0, 0, 0, 0, 885 },
+  { 0, 0, 0, 0, 886 },
+  { 0, 0, 0, 0, 887 },
+  { 0, 0, 0, 0, 888 },
+  { 0, 0, 0, 0, 889 },
+  { 0, 0, 0, 0, 890 },
+  { 0, 0, 0, 0, 891 },
+  { 0, 0, 0, 0, 892 },
+  { 0, 0, 0, 0, 893 },
+  { 0, 0, 0, 0, 894 },
+  { 0, 0, 0, 0, 895 },
+  { 0, 0, 0, 0, 896 },
+  { 0, 0, 0, 0, 897 },
+  { 0, 0, 0, 0, 898 },
+  { 0, 0, 0, 0, 899 },
+  { 0, 0, 0, 0, 900 },
+  { 0, 0, 0, 0, 901 },
+  { 0, 0, 0, 0, 902 },
+  { 0, 0, 0, 0, 903 },
+  { 0, 0, 0, 0, 904 },
+  { 0, 0, 0, 0, 905 },
+  { 0, 0, 0, 0, 906 },
+  { 0, 0, 0, 0, 907 },
+  { 0, 0, 0, 0, 908 },
+  { 0, 0, 0, 0, 909 },
+  { 0, 0, 0, 0, 910 },
+  { 0, 0, 0, 0, 911 },
+  { 0, 0, 0, 0, 912 },
+  { 0, 0, 0, 0, 913 },
+  { 0, 0, 0, 0, 914 },
+  { 0, 0, 0, 0, 915 },
+  { 0, 0, 0, 0, 916 },
+  { 0, 0, 0, 0, 917 },
+  { 0, 0, 0, 0, 918 },
+  { 0, 0, 0, 0, 919 },
+  { 0, 0, 0, 0, 920 },
+  { 0, 0, 0, 0, 921 },
+  { 0, 0, 0, 0, 922 },
+  { 0, 0, 0, 0, 923 },
+  { 0, 0, 0, 0, 924 },
+  { 0, 0, 0, 0, 925 },
+  { 0, 0, 0, 0, 926 },
+  { 0, 0, 0, 0, 927 },
+  { 0, 0, 0, 0, 928 },
+  { 0, 0, 0, 0, 929 },
+  { 0, 0, 0, 0, 930 },
+  { 0, 0, 0, 0, 931 },
+  { 0, 0, 0, 0, 932 },
+  { 0, 0, 0, 0, 933 },
+  { 0, 0, 0, 0, 934 },
+  { 0, 0, 0, 0, 935 },
+  { "ummcr0", 1, 0, 0, spr_ummcr0 /*936*/ },
+  { "upmc1", 1, 0, 0, spr_upmc1 /*937*/ },
+  { "upmc2", 1, 0, 0, spr_upmc2 /*938*/ },
+  { "usia", 1, 0, 0, spr_usia /*939*/ },
+  { "ummcr1", 1, 0, 0, spr_ummcr1 /*940*/ },
+  { "upmc3", 1, 0, 0, spr_upmc3 /*941*/ },
+  { "upmc4", 1, 0, 0, spr_upmc4 /*942*/ },
+  { 0, 0, 0, 0, 943 },
+  { 0, 0, 0, 0, 944 },
+  { 0, 0, 0, 0, 945 },
+  { 0, 0, 0, 0, 946 },
+  { 0, 0, 0, 0, 947 },
+  { 0, 0, 0, 0, 948 },
+  { 0, 0, 0, 0, 949 },
+  { 0, 0, 0, 0, 950 },
+  { 0, 0, 0, 0, 951 },
+  { "mmcr0", 1, 0, 0, spr_mmcr0 /*952*/ },
+  { "pmc1", 1, 0, 0, spr_pmc1 /*953*/ },
+  { "pmc2", 1, 0, 0, spr_pmc2 /*954*/ },
+  { "sia", 1, 0, 0, spr_sia /*955*/ },
+  { "mmcr1", 1, 0, 0, spr_mmcr1 /*956*/ },
+  { "pmc3", 1, 0, 0, spr_pmc3 /*957*/ },
+  { "pmc4", 1, 0, 0, spr_pmc4 /*958*/ },
+  { "sda", 1, 0, 0, spr_sda /*959*/ },
+  { 0, 0, 0, 0, 960 },
+  { 0, 0, 0, 0, 961 },
+  { 0, 0, 0, 0, 962 },
+  { 0, 0, 0, 0, 963 },
+  { 0, 0, 0, 0, 964 },
+  { 0, 0, 0, 0, 965 },
+  { 0, 0, 0, 0, 966 },
+  { 0, 0, 0, 0, 967 },
+  { 0, 0, 0, 0, 968 },
+  { 0, 0, 0, 0, 969 },
+  { 0, 0, 0, 0, 970 },
+  { 0, 0, 0, 0, 971 },
+  { 0, 0, 0, 0, 972 },
+  { 0, 0, 0, 0, 973 },
+  { 0, 0, 0, 0, 974 },
+  { 0, 0, 0, 0, 975 },
+  { "dmiss", 1, 0, 0, spr_dmiss /*976*/ },
+  { "dcmp", 1, 0, 0, spr_dcmp /*977*/ },
+  { "hash1", 1, 0, 0, spr_hash1 /*978*/ },
+  { "hash2", 1, 0, 0, spr_hash2 /*979*/ },
+  { "imiss", 1, 0, 0, spr_imiss /*980*/ },
+  { "icmp", 1, 0, 0, spr_icmp /*981*/ },
+  { "rpa", 1, 0, 0, spr_rpa /*982*/ },
+  { 0, 0, 0, 0, 983 },
+  { 0, 0, 0, 0, 984 },
+  { 0, 0, 0, 0, 985 },
+  { 0, 0, 0, 0, 986 },
+  { 0, 0, 0, 0, 987 },
+  { 0, 0, 0, 0, 988 },
+  { 0, 0, 0, 0, 989 },
+  { 0, 0, 0, 0, 990 },
+  { 0, 0, 0, 0, 991 },
+  { 0, 0, 0, 0, 992 },
+  { 0, 0, 0, 0, 993 },
+  { 0, 0, 0, 0, 994 },
+  { 0, 0, 0, 0, 995 },
+  { 0, 0, 0, 0, 996 },
+  { 0, 0, 0, 0, 997 },
+  { 0, 0, 0, 0, 998 },
+  { 0, 0, 0, 0, 999 },
+  { 0, 0, 0, 0, 1000 },
+  { 0, 0, 0, 0, 1001 },
+  { 0, 0, 0, 0, 1002 },
+  { 0, 0, 0, 0, 1003 },
+  { 0, 0, 0, 0, 1004 },
+  { 0, 0, 0, 0, 1005 },
+  { 0, 0, 0, 0, 1006 },
+  { 0, 0, 0, 0, 1007 },
+  { "hid0", 1, 0, 0, spr_hid0 /*1008*/ },
+  { "hid1", 1, 0, 0, spr_hid1 /*1009*/ },
+  { "iabr", 1, 0, 0, spr_iabr /*1010*/ },
+  { 0, 0, 0, 0, 1011 },
+  { 0, 0, 0, 0, 1012 },
+  { "dabr", 1, 0, 0, spr_dabr /*1013*/ },
+  { 0, 0, 0, 0, 1014 },
+  { 0, 0, 0, 0, 1015 },
+  { 0, 0, 0, 0, 1016 },
+  { "l2cr", 1, 0, 0, spr_l2cr /*1017*/ },
+  { 0, 0, 0, 0, 1018 },
+  { "ictc", 1, 0, 0, spr_ictc /*1019*/ },
+  { "thrm1", 1, 0, 0, spr_thrm1 /*1020*/ },
+  { "thrm2", 1, 0, 0, spr_thrm2 /*1021*/ },
+  { "thrm3", 1, 0, 0, spr_thrm3 /*1022*/ },
+  { "pir", 1, 0, 0, spr_pir /*1023*/ },
+  { 0, 0, 0, 0, 1024 },
+};
+
+INLINE_SPREG(int) spr_is_valid(sprs spr)
+{
+#ifdef WITH_SPREG_SWITCH_TABLE
+  switch (spr) {
+    case 0:
+    case 1:
+    case 4:
+    case 5:
+    case 8:
+    case 9:
+    case 18:
+    case 19:
+    case 22:
+    case 25:
+    case 26:
+    case 27:
+    case 256:
+    case 268:
+    case 269:
+    case 272:
+    case 273:
+    case 274:
+    case 275:
+    case 282:
+    case 284:
+    case 285:
+    case 287:
+    case 512:
+    case 528:
+    case 529:
+    case 530:
+    case 531:
+    case 532:
+    case 533:
+    case 534:
+    case 535:
+    case 536:
+    case 537:
+    case 538:
+    case 539:
+    case 540:
+    case 541:
+    case 542:
+    case 543:
+    case 936:
+    case 937:
+    case 938:
+    case 939:
+    case 940:
+    case 941:
+    case 942:
+    case 952:
+    case 953:
+    case 954:
+    case 955:
+    case 956:
+    case 957:
+    case 958:
+    case 959:
+    case 976:
+    case 977:
+    case 978:
+    case 979:
+    case 980:
+    case 981:
+    case 982:
+    case 1008:
+    case 1009:
+    case 1010:
+    case 1013:
+    case 1017:
+    case 1019:
+    case 1020:
+    case 1021:
+    case 1022:
+    case 1023:
+      return 1;
+    }
+    return 0;
+#else
+  return spr_info[spr].is_valid;
+#endif
+}
+
+INLINE_SPREG(int) spr_is_readonly(sprs spr)
+{
+#ifdef WITH_SPREG_SWITCH_TABLE
+  return 0;
+#else
+  return spr_info[spr].is_readonly;
+#endif
+}
+
+INLINE_SPREG(const char *) spr_name(sprs spr)
+{
+  return spr_info[spr].name;
+}
+
+INLINE_SPREG(int) spr_index(sprs spr)
+{
+  return spr_info[spr].index;
+}
+
+INLINE_SPREG(int) spr_length(sprs spr)
+{
+#ifdef WITH_SPREG_SWITCH_TABLE
+  return 0;
+#else
+  return spr_info[spr].length;
+#endif
+}
+
+#endif /* _SPREG_C_ */
diff --git a/sim/ppc/spreg.h b/sim/ppc/spreg.h
new file mode 100644
index 000000000000..c9b3adba66e4
--- /dev/null
+++ b/sim/ppc/spreg.h
@@ -0,0 +1,108 @@
+/* DO NOT EDIT: GENERATED BY spreg-gen.py.
+
+   Copyright (C) 1994-1995 Andrew Cagney <cagney@highland.com.au>
+   Copyright (C) 1996-2022 Free Software Foundation, Inc.
+
+   This file is part of the GNU simulators.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _SPREG_H_
+#define _SPREG_H_
+
+typedef unsigned_word spreg;
+
+typedef enum {
+  spr_mq = 0,
+  spr_xer = 1,
+  spr_rtcu = 4,
+  spr_rtcl = 5,
+  spr_lr = 8,
+  spr_ctr = 9,
+  spr_dsisr = 18,
+  spr_dar = 19,
+  spr_dec = 22,
+  spr_sdr1 = 25,
+  spr_srr0 = 26,
+  spr_srr1 = 27,
+  spr_vrsave = 256,
+  spr_tbrl = 268,
+  spr_tbru = 269,
+  spr_sprg0 = 272,
+  spr_sprg1 = 273,
+  spr_sprg2 = 274,
+  spr_sprg3 = 275,
+  spr_ear = 282,
+  spr_tbl = 284,
+  spr_tbu = 285,
+  spr_pvr = 287,
+  spr_spefscr = 512,
+  spr_ibat0u = 528,
+  spr_ibat0l = 529,
+  spr_ibat1u = 530,
+  spr_ibat1l = 531,
+  spr_ibat2u = 532,
+  spr_ibat2l = 533,
+  spr_ibat3u = 534,
+  spr_ibat3l = 535,
+  spr_dbat0u = 536,
+  spr_dbat0l = 537,
+  spr_dbat1u = 538,
+  spr_dbat1l = 539,
+  spr_dbat2u = 540,
+  spr_dbat2l = 541,
+  spr_dbat3u = 542,
+  spr_dbat3l = 543,
+  spr_ummcr0 = 936,
+  spr_upmc1 = 937,
+  spr_upmc2 = 938,
+  spr_usia = 939,
+  spr_ummcr1 = 940,
+  spr_upmc3 = 941,
+  spr_upmc4 = 942,
+  spr_mmcr0 = 952,
+  spr_pmc1 = 953,
+  spr_pmc2 = 954,
+  spr_sia = 955,
+  spr_mmcr1 = 956,
+  spr_pmc3 = 957,
+  spr_pmc4 = 958,
+  spr_sda = 959,
+  spr_dmiss = 976,
+  spr_dcmp = 977,
+  spr_hash1 = 978,
+  spr_hash2 = 979,
+  spr_imiss = 980,
+  spr_icmp = 981,
+  spr_rpa = 982,
+  spr_hid0 = 1008,
+  spr_hid1 = 1009,
+  spr_iabr = 1010,
+  spr_dabr = 1013,
+  spr_l2cr = 1017,
+  spr_ictc = 1019,
+  spr_thrm1 = 1020,
+  spr_thrm2 = 1021,
+  spr_thrm3 = 1022,
+  spr_pir = 1023,
+  nr_of_sprs = 1024
+} sprs;
+
+INLINE_SPREG(int) spr_is_valid(sprs spr);
+INLINE_SPREG(int) spr_is_readonly(sprs spr);
+INLINE_SPREG(const char *) spr_name(sprs spr);
+INLINE_SPREG(int) spr_index(sprs spr);
+INLINE_SPREG(int) spr_length(sprs spr);
+
+#endif /* _SPREG_H_ */
-- 
2.38.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/2] sim: ppc: drop old dgen.c generator
  2022-12-20  1:50   ` [PATCH 1/2] " Mike Frysinger
@ 2022-12-20  1:50     ` Mike Frysinger
  0 siblings, 0 replies; 9+ messages in thread
From: Mike Frysinger @ 2022-12-20  1:50 UTC (permalink / raw)
  To: gdb-patches

The spreg.[ch] files live in the source tree now and are created
with the dgen.py script, so we don't need this old tool anymore.
---
 sim/ppc/Makefile.in |  31 +---
 sim/ppc/dgen.c      | 334 --------------------------------------------
 sim/ppc/options.c   |   4 -
 3 files changed, 6 insertions(+), 363 deletions(-)
 delete mode 100644 sim/ppc/dgen.c

diff --git a/sim/ppc/Makefile.in b/sim/ppc/Makefile.in
index 8fed7da83f56..cc9635e6023a 100644
--- a/sim/ppc/Makefile.in
+++ b/sim/ppc/Makefile.in
@@ -101,7 +101,6 @@ IGEN_FILTER = @sim_filter@
 IGEN_ICACHE = @sim_icache@
 IGEN_SMP = @sim_igen_smp@
 IGEN_LINE_NR = @sim_line_nr@
-DGEN_FLAGS =
 
 IGEN_FLAGS = \
 	$(IGEN_DECODE_MECHANISM) \
@@ -112,11 +111,10 @@ IGEN_FLAGS = \
 	$(IGEN_SMP) \
 	$(IGEN_LINE_NR)
 
-# igen/dgen leak memory, and therefore makes AddressSanitizer unhappy.  Disable
-# leak detection while running them.
+# igen leaks memory, and therefore makes AddressSanitizer unhappy.  Disable
+# leak detection while running it.
 
 IGEN = ASAN_OPTIONS=detect_leaks=0 ./igen
-DGEN = ASAN_OPTIONS=detect_leaks=0 ./dgen
 
 .NOEXPORT:
 MAKEOVERRIDES=
@@ -416,7 +414,6 @@ BUILT_SRC_WO_CONFIG = \
 	idecode.h idecode.c \
 	semantics.h semantics.c \
 	itable.h itable.c \
-	spreg.h spreg.c \
 	model.h model.c \
 	support.h support.c \
 	pk.h \
@@ -516,7 +513,7 @@ PACKAGE_SRC = pk_disklabel.c
 PACKAGE_OBJ = $(PACKAGE_SRC:.c=.o)
 
 
-$(TARGETLIB): tmp-igen tmp-dgen tmp-hw tmp-defines $(LIB_OBJ) $(GDB_OBJ)
+$(TARGETLIB): tmp-igen tmp-hw tmp-defines $(LIB_OBJ) $(GDB_OBJ)
 	$(ECHO_AR) $(AR) $(AR_FLAGS) $(TARGETLIB) $(LIB_OBJ) $(GDB_OBJ)
 	$(ECHO_RANLIB) $(RANLIB) $(TARGETLIB)
 
@@ -588,7 +585,7 @@ sim-fpu.o: $(srcdir)/../common/sim-fpu.c $(CONFIG_H)
 
 # Rebuild options whenever something changes so the date/time is up to date.
 options.o: options.c $(CPU_H) $(OPTIONS_H) $(DEFINES_H) $(BASICS_H) $(IDECODE_H) $(INLINE) $(LIB_SRC) $(BUILT_SRC) config.status Makefile
-	$(ECHO_CC) $(CC) -c $(STD_CFLAGS) '-DOPCODE_RULES="@sim_opcode@"' '-DIGEN_FLAGS="$(IGEN_FLAGS)"' '-DDGEN_FLAGS="$(DGEN_FLAGS)"' $(srcdir)/options.c
+	$(ECHO_CC) $(CC) -c $(STD_CFLAGS) '-DOPCODE_RULES="@sim_opcode@"' '-DIGEN_FLAGS="$(IGEN_FLAGS)"' $(srcdir)/options.c
 
 defines.h: tmp-defines; @true
 tmp-defines: config.h Makefile
@@ -600,15 +597,6 @@ tmp-defines: config.h Makefile
 # Rules to create the built c source code files
 #
 
-tmp-dgen: dgen ppc-spr-table $(srcroot)/move-if-change
-	$(ECHO_GEN) $(DGEN) $(DGEN_FLAGS) \
-		-r $(srcdir)/ppc-spr-table \
-		-n spreg.h -hp tmp-spreg.h \
-		-n spreg.c -p  tmp-spreg.c
-	$(SILENCE) $(SHELL) $(srcroot)/move-if-change tmp-spreg.h spreg.h
-	$(SILENCE) $(SHELL) $(srcroot)/move-if-change tmp-spreg.c spreg.c
-	$(SILENCE) touch $@
-
 tmp-igen: igen $(srcdir)/powerpc.igen $(srcdir)/altivec.igen $(srcdir)/e500.igen $(IGEN_OPCODE_RULES) $(srcroot)/move-if-change
 	$(ECHO_GEN) $(IGEN) $(IGEN_FLAGS) \
 		-o $(srcdir)/$(IGEN_OPCODE_RULES) \
@@ -642,12 +630,8 @@ tmp-igen: igen $(srcdir)/powerpc.igen $(srcdir)/altivec.igen $(srcdir)/e500.igen
 # NOTE: Some versions of make don't handle files created as side-effects
 # uncomment the below if that is the case.
 
-$(TARGETLIB): tmp-igen tmp-dgen
+$(TARGETLIB): tmp-igen
 itable.h itable.c icache.h icache.c idecode.h idecode.c semantics.h semantics.c model.h model.c support.h support.c: tmp-igen
-spreg.h spreg.c: tmp-dgen
-
-dgen: dgen.o table.o lf.o misc.o filter_host.o
-	$(ECHO_CCLD) $(LINK_FOR_BUILD) dgen.o table.o lf.o misc.o filter_host.o
 
 igen: igen.o table.o lf.o misc.o filter_host.o ld-decode.o ld-cache.o filter.o ld-insn.o gen-model.o gen-itable.o gen-icache.o gen-semantics.o gen-idecode.o gen-support.o
 	$(ECHO_CCLD) $(LINK_FOR_BUILD) igen.o table.o lf.o misc.o filter_host.o ld-decode.o ld-cache.o filter.o ld-insn.o gen-model.o gen-itable.o gen-icache.o gen-semantics.o gen-idecode.o gen-support.o
@@ -702,9 +686,6 @@ gen-idecode.o: gen-idecode.c $(MISC_H) $(LF_H) $(TABLE_H) $(FILTER_H) $(LD_DECOD
 gen-support.o: gen-support.c $(MISC_H) $(LF_H) $(TABLE_H) $(FILTER_H) $(LD_DECODE_H) $(LD_CACHE_H) $(LD_INSN_H) $(IGEN_H) $(GEN_SEMANTICS_H) $(GEN_SUPPORT_H)
 	$(ECHO_CC) $(COMPILE_FOR_BUILD) -c $(srcdir)/gen-support.c
 
-dgen.o: dgen.c $(CONFIG_H) $(MISC_H) $(LF_H) $(TABLE_H)
-	$(ECHO_CC) $(COMPILE_FOR_BUILD) -c $(srcdir)/dgen.c
-
 igen.o: igen.c $(MISC_H) $(LF_H) $(TABLE_H) $(CONFIG_H) $(FILTER_H) $(LD_CACHE_H) $(LD_DECODE_H) $(LD_INSN_H) $(IGEN_H) $(GEN_MODEL_H) $(GEN_ICACHE_H) $(GEN_ITABLE_H) $(GEN_IDECODE_H) $(GEN_SEMANTICS_H) $(GEN_SUPPORT_H)
 	$(ECHO_CC) $(COMPILE_FOR_BUILD) -c $(srcdir)/igen.c
 
@@ -801,7 +782,7 @@ TAGS: $(BUILT_SRC)
 	etags $(srcdir)/*.h $(srcdir)/*.c $(BUILT_SRC)
 
 clean mostlyclean:
-	rm -f tmp-* *.[oasi] core igen dgen $(BUILT_SRC_WO_CONFIG)
+	rm -f tmp-* *.[oasi] core igen $(BUILT_SRC_WO_CONFIG)
 
 distclean realclean: clean
 	rm -f TAGS Makefile config.cache config.status config.h defines.h stamp-h config.log
diff --git a/sim/ppc/dgen.c b/sim/ppc/dgen.c
deleted file mode 100644
index 73f8d7d45825..000000000000
--- a/sim/ppc/dgen.c
+++ /dev/null
@@ -1,334 +0,0 @@
-/*  This file is part of the program psim.
-
-    Copyright (C) 1994-1995, Andrew Cagney <cagney@highland.com.au>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
- 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, see <http://www.gnu.org/licenses/>.
- 
-    */
-
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <getopt.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <stdarg.h>
-
-#include "build-config.h"
-#include "misc.h"
-#include "lf.h"
-#include "table.h"
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdlib.h>
-#include <string.h>
-
-/****************************************************************/
-
-enum {
-  nr_of_sprs = 1024,
-};
-
-/****************************************************************/
-
-
-typedef enum {
-  spreg_name,
-  spreg_reg_nr,
-  spreg_readonly,
-  spreg_length,
-  nr_spreg_fields,
-} spreg_fields;
-
-typedef struct _spreg_table_entry spreg_table_entry;
-struct _spreg_table_entry {
-  char *name;
-  int spreg_nr;
-  int is_readonly;
-  int length;
-  table_entry *entry;
-  spreg_table_entry *next;
-};
-
-typedef struct _spreg_table spreg_table;
-struct _spreg_table {
-  spreg_table_entry *sprs;
-};
-
-static void
-spreg_table_insert(spreg_table *table, table_entry *entry)
-{
-  /* create a new spr entry */
-  spreg_table_entry *new_spr = ZALLOC(spreg_table_entry);
-  new_spr->next = NULL;
-  new_spr->entry = entry;
-  new_spr->spreg_nr = atoi(entry->fields[spreg_reg_nr]);
-  new_spr->is_readonly = (entry->fields[spreg_readonly]
-			  ? atoi(entry->fields[spreg_readonly])
-			  : 0);
-  new_spr->length = atoi(entry->fields[spreg_length]);
-  new_spr->name = (char*)zalloc(strlen(entry->fields[spreg_name]) + 1);
-  ASSERT(new_spr->name != NULL);
-  {
-    int i;
-    for (i = 0; entry->fields[spreg_name][i] != '\0'; i++) {
-      if (isupper(entry->fields[spreg_name][i]))
-	new_spr->name[i] = tolower(entry->fields[spreg_name][i]);
-      else
-	new_spr->name[i] = entry->fields[spreg_name][i];
-    }
-  }
-
-  /* insert, by spreg_nr order */
-  {
-    spreg_table_entry **ptr_to_spreg_entry = &table->sprs;
-    spreg_table_entry *spreg_entry = *ptr_to_spreg_entry;
-    while (spreg_entry != NULL && spreg_entry->spreg_nr < new_spr->spreg_nr) {
-      ptr_to_spreg_entry = &spreg_entry->next;
-      spreg_entry = *ptr_to_spreg_entry;
-    }
-    ASSERT(spreg_entry == NULL || spreg_entry->spreg_nr != new_spr->spreg_nr);
-    *ptr_to_spreg_entry = new_spr;
-    new_spr->next = spreg_entry;
-  }
-
-}
-
-
-static spreg_table *
-spreg_table_load(char *file_name)
-{
-  table *file = table_open(file_name, nr_spreg_fields, 0);
-  spreg_table *table = ZALLOC(spreg_table);
-
-  {
-    table_entry *entry;
-    while ((entry = table_entry_read(file)) != NULL) {
-      spreg_table_insert(table, entry);
-    }
-  }
-
-  return table;
-}
-
-
-/****************************************************************/
-
-char *spreg_attributes[] = {
-  "is_valid",
-  "is_readonly",
-  "name",
-  "index",
-  "length",
-  0
-};
-
-static void
-gen_spreg_h(spreg_table *table, lf *file)
-{
-  spreg_table_entry *entry;
-  char **attribute;
-
-  lf_print__gnu_copyleft(file);
-  lf_printf(file, "\n");
-  lf_printf(file, "#ifndef _SPREG_H_\n");
-  lf_printf(file, "#define _SPREG_H_\n");
-  lf_printf(file, "\n");
-  lf_printf(file, "typedef unsigned_word spreg;\n");
-  lf_printf(file, "\n");
-  lf_printf(file, "typedef enum {\n");
-
-  for (entry = table->sprs;
-       entry != NULL ;
-       entry = entry->next) {
-    lf_printf(file, "  spr_%s = %d,\n", entry->name, entry->spreg_nr);
-  }
-
-  lf_printf(file, "  nr_of_sprs = %d\n", nr_of_sprs);
-  lf_printf(file, "} sprs;\n");
-  lf_printf(file, "\n");
-  for (attribute = spreg_attributes;
-       *attribute != NULL;
-       attribute++) {
-    if (strcmp(*attribute, "name") == 0) {
-      lf_print_function_type(file, "const char *", "INLINE_SPREG", " ");
-      lf_printf(file, "spr_%s(sprs spr);\n", *attribute);
-    }
-    else {
-      lf_print_function_type(file, "int", "INLINE_SPREG", " ");
-      lf_printf(file, "spr_%s(sprs spr);\n", *attribute);
-    }
-  }
-  lf_printf(file, "\n");
-  lf_printf(file, "#endif /* _SPREG_H_ */\n");
-}
-
-
-static void
-gen_spreg_c(spreg_table *table, lf *file)
-{
-  spreg_table_entry *entry;
-  char **attribute;
-  int spreg_nr;
-  int spreg_lookup_table;
-
-  lf_print__gnu_copyleft(file);
-  lf_printf(file, "\n");
-  lf_printf(file, "#ifndef _SPREG_C_\n");
-  lf_printf(file, "#define _SPREG_C_\n");
-  lf_printf(file, "\n");
-  lf_printf(file, "#include \"basics.h\"\n");
-  lf_printf(file, "#include \"spreg.h\"\n");
-
-  lf_printf(file, "\n");
-  lf_printf(file, "typedef struct _spreg_info {\n");
-  lf_printf(file, "  const char *name;\n");
-  lf_printf(file, "  int is_valid;\n");
-  lf_printf(file, "  int length;\n");
-  lf_printf(file, "  int is_readonly;\n");
-  lf_printf(file, "  int index;\n");
-  lf_printf(file, "} spreg_info;\n");
-  lf_printf(file, "\n");
-  lf_printf(file, "static const spreg_info spr_info[nr_of_sprs+1] = {\n");
-  entry = table->sprs;
-  for (spreg_nr = 0; spreg_nr < nr_of_sprs+1; spreg_nr++) {
-    if (entry == NULL || spreg_nr < entry->spreg_nr)
-      lf_printf(file, "  { 0, 0, 0, 0, %d},\n", spreg_nr);
-    else {
-      lf_printf(file, "  { \"%s\", %d, %d, %d, spr_%s /*%d*/ },\n",
-		entry->name, 1, entry->length, entry->is_readonly,
-		entry->name, entry->spreg_nr);
-      entry = entry->next;
-    }
-  }
-  lf_printf(file, "};\n");
-
-  for (attribute = spreg_attributes;
-       *attribute != NULL;
-       attribute++) {
-    lf_printf(file, "\n");
-    if (strcmp(*attribute, "name") == 0) {
-      lf_print_function_type(file, "const char *", "INLINE_SPREG", "\n");
-    }
-    else {
-      lf_print_function_type(file, "int", "INLINE_SPREG", "\n");
-    }
-    lf_printf(file, "spr_%s(sprs spr)\n", *attribute);
-    lf_printf(file, "{\n");
-    spreg_lookup_table = !(strcmp(*attribute, "name") == 0
-			   || strcmp(*attribute, "index") == 0);
-    if (spreg_lookup_table) {
-      spreg_table_entry *entry;
-      lf_printf(file, "#ifdef WITH_SPREG_SWITCH_TABLE\n");
-      lf_printf(file, "  switch (spr) {\n");
-      for (entry = table->sprs; entry != NULL; entry = entry->next) {
-	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) {
-	  /* 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.  */
-      if (strcmp(*attribute, "is_valid") == 0)
-	lf_printf(file, "    return 1;\n");
-      lf_printf(file, "  }\n");
-      lf_printf(file, "  return 0;\n");
-      lf_printf(file, "#else\n");
-    }
-    lf_printf(file, "  return spr_info[spr].%s;\n",
-	      *attribute);
-    if (spreg_lookup_table)
-      lf_printf(file, "#endif\n");
-    lf_printf(file, "}\n");
-  }
-
-  lf_printf(file, "\n");
-  lf_printf(file, "#endif /* _SPREG_C_ */\n");
-}
-
-
-
-/****************************************************************/
-
-
-int
-main(int argc,
-     char **argv,
-     char **envp)
-{
-  lf_file_references file_references = lf_include_references;
-  spreg_table *sprs = NULL;
-  static const struct option longopts[] = { { 0 } };
-  char *real_file_name = NULL;
-  int is_header = 0;
-  int ch;
-
-  if (argc <= 1) {
-    printf("Usage: dgen ...\n");
-    printf("-n <file-name>  Use this as cpp line numbering name\n");
-    printf("-h  Output header file\n");
-    printf("-p <spreg-file>  Output spreg.h(P) or spreg.c(p)\n");
-  }
-
-  while ((ch = getopt_long (argc, argv, "hsn:r:p:", longopts, NULL))
-	 != -1)
-  {
-#if 0  /* For debugging.  */
-    fprintf(stderr, "\t-%c %s\n", ch, ( optarg ? optarg : ""));
-#endif
-    switch(ch) {
-    case 'r':
-      sprs = spreg_table_load(optarg);
-      break;
-    case 'n':
-      real_file_name = strdup(optarg);
-      break;
-    case 'h':
-      is_header = 1;
-      break;
-    case 'p':
-      {
-	lf *file = lf_open(optarg, real_file_name, file_references,
-			   (is_header ? lf_is_h : lf_is_c),
-			   argv[0]);
-	if (is_header)
-	  gen_spreg_h(sprs, file);
-	else
-	  gen_spreg_c(sprs, file);
-	lf_close(file);
-	is_header = 0;
-      }
-      real_file_name = NULL;
-      break;
-    default:
-      error("unknown option\n");
-    }
-  }
-  return 0;
-}
diff --git a/sim/ppc/options.c b/sim/ppc/options.c
index a696db1b623e..64606159f7ae 100644
--- a/sim/ppc/options.c
+++ b/sim/ppc/options.c
@@ -155,10 +155,6 @@ print_options (void)
   printf_filtered ("IGEN_FLAGS               = %s\n", IGEN_FLAGS);
 #endif
 
-#ifdef DGEN_FLAGS
-  printf_filtered ("DGEN_FLAGS               = %s\n", DGEN_FLAGS);
-#endif
-
   {
     static const char *const defines[] = {
 #ifdef __GNUC__
-- 
2.38.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-12-20  1:51 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-09 20:01 [PATCH 1/7] sim: ppc: constify spreg table Mike Frysinger
2022-11-09 20:01 ` [PATCH 2/7] sim: ppc: pull default switch return out Mike Frysinger
2022-11-09 20:01 ` [PATCH 3/7] sim: ppc: collapse is_valid switch table more Mike Frysinger
2022-11-09 20:01 ` [PATCH 4/7] sim: ppc: collapse is_readonly & length switch tables heavily Mike Frysinger
2022-11-09 20:01 ` [PATCH 5/7] sim: ppc: drop support for dgen -L option Mike Frysinger
2022-11-09 20:01 ` [PATCH 6/7] sim: ppc: change spreg switch table generation to compile-time Mike Frysinger
2022-11-09 20:01 ` [PATCH 7/7] sim: ppc: move spreg.[ch] files to the source tree Mike Frysinger
2022-12-20  1:50   ` [PATCH 1/2] " Mike Frysinger
2022-12-20  1:50     ` [PATCH 2/2] sim: ppc: drop old dgen.c generator Mike Frysinger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).