sim: ppc: move spreg.[ch] files to the source tree
authorMike Frysinger <vapier@gentoo.org>
Wed, 9 Nov 2022 19:52:45 +0000 (02:52 +0700)
committerMike Frysinger <vapier@gentoo.org>
Wed, 21 Dec 2022 02:05:43 +0000 (21:05 -0500)
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
sim/ppc/local.mk
sim/ppc/spreg-gen.py [new file with mode: 0755]
sim/ppc/spreg.c [new file with mode: 0644]
sim/ppc/spreg.h [new file with mode: 0644]

index 84c48c5b72ce61131656f8f3f850a25b7c90446d..fd5faaf80cdd2cee8ab39f32faddeafb509ca11a 100644 (file)
@@ -3469,6 +3469,16 @@ testsuite/common/bits64m63.c: testsuite/common/bits-gen$(EXEEXT) testsuite/commo
 @SIM_ENABLE_ARCH_ppc_TRUE@ppc/%.o: ppc/%.c | ppc/libsim.a $(SIM_ALL_RECURSIVE_DEPS)
 @SIM_ENABLE_ARCH_ppc_TRUE@     $(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F)
 
+@SIM_ENABLE_ARCH_ppc_TRUE@ppc/spreg.c: @MAINT@ ppc/ppc-spr-table ppc/spreg-gen.py ppc/$(am__dirstamp)
+@SIM_ENABLE_ARCH_ppc_TRUE@     $(AM_V_GEN)$(srcdir)/ppc/spreg-gen.py --source $@.tmp
+@SIM_ENABLE_ARCH_ppc_TRUE@     $(AM_V_at)$(SHELL) $(srcroot)/move-if-change $@.tmp $(srcdir)/ppc/spreg.c
+@SIM_ENABLE_ARCH_ppc_TRUE@     $(AM_V_at)touch $(srcdir)/ppc/spreg.c
+
+@SIM_ENABLE_ARCH_ppc_TRUE@ppc/spreg.h: @MAINT@ ppc/ppc-spr-table ppc/spreg-gen.py ppc/$(am__dirstamp)
+@SIM_ENABLE_ARCH_ppc_TRUE@     $(AM_V_GEN)$(srcdir)/ppc/spreg-gen.py --header $@.tmp
+@SIM_ENABLE_ARCH_ppc_TRUE@     $(AM_V_at)$(SHELL) $(srcroot)/move-if-change $@.tmp $(srcdir)/ppc/spreg.h
+@SIM_ENABLE_ARCH_ppc_TRUE@     $(AM_V_at)touch $(srcdir)/ppc/spreg.h
+
 @SIM_ENABLE_ARCH_rl78_TRUE@rl78/%.o: rl78/%.c | rl78/libsim.a $(SIM_ALL_RECURSIVE_DEPS)
 @SIM_ENABLE_ARCH_rl78_TRUE@    $(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F)
 
index 37d67b0adba0595d3d449fdaf70c2e473cd66dbb..2f65e9c0f34cae66c8a66487deea81603a6860be 100644 (file)
 
 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 (executable)
index 0000000..14dbb25
--- /dev/null
@@ -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 (file)
index 0000000..f9361e7
--- /dev/null
@@ -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 (file)
index 0000000..c9b3adb
--- /dev/null
@@ -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_ */