reduce PyFnWriter compile time (pywriter) by 75%
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 30 Sep 2021 13:32:18 +0000 (14:32 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 30 Sep 2021 13:32:18 +0000 (14:32 +0100)
needs some explanation: the pagereader enumerates all the sub-options
(Rc=1, OE=1) and adds one instruction (each) for all of the sub-options
but adds the exact same pseudocode.

PyFnWriter then generates up to *four copies* of the exact same pseucodode
and four functions, *only one of which is actually used* by ISACaller
(the one *without* Rc=1 and OE=1), then handles Rc=1 and OE=1 *separately*

added an option to pagereader to only add the first-encountered instruction
but for other purposes it is still added, so is not made the default

src/openpower/decoder/pseudo/pagereader.py
src/openpower/decoder/pseudo/pywriter.py

index d5cae081c0438adebd35d72bb26dbcf6c2def979..44c94b856d29b2e0583de294a848066f1eef2f2d 100644 (file)
@@ -64,11 +64,13 @@ def get_isa_dir():
 
 class ISA:
 
-    def __init__(self):
+    def __init__(self, first_encountered_instr=False):
         self.instr = OrderedDict()
         self.forms = {}
         self.page = {}
         self.verbose = False
+        # only add the first-encountered instruction (marked by "*")
+        self.first_encountered_instr = first_encountered_instr
         for pth in os.listdir(os.path.join(get_isa_dir())):
             if self.verbose:
                 print("examining", get_isa_dir(), pth)
@@ -282,6 +284,14 @@ class ISA:
             # add in opcode
             for o in opcodes:
                 self.add_op(o, d)
+                if self.first_encountered_instr:
+                    # turns out that because the pseudocode is identical,
+                    # you don't actually need to add any more than the
+                    # first listed opcode for pseudocode-generation.
+                    # therefore, save compiler time and skip all others.
+                    # detection of "." and "o" etc is handled in ISACaller
+                    # and ends up replicating the instruction that way
+                    break
 
             # expect and drop whitespace
             while lines:
index b01fc4cc0a0008f492b35bd1e397f2a1862271b7..2b405e26d4e028d659b8ab59efeeb59aff18e266 100644 (file)
@@ -53,7 +53,7 @@ iinfo_template = """instruction_info(func=%s,
 
 class PyISAWriter(ISA):
     def __init__(self):
-        ISA.__init__(self)
+        ISA.__init__(self, first_encountered_instr=True)
         self.pages_written = []
 
     def write_pysource(self, pagename):