[pypy-svn] r36660 - pypy/branch/i386-regalloc/pypy/jit/codegen/i386

arigo at codespeak.net arigo at codespeak.net
Sat Jan 13 15:43:53 CET 2007


Author: arigo
Date: Sat Jan 13 15:43:51 2007
New Revision: 36660

Modified:
   pypy/branch/i386-regalloc/pypy/jit/codegen/i386/rgenop.py
Log:
Support for pause_writing().


Modified: pypy/branch/i386-regalloc/pypy/jit/codegen/i386/rgenop.py
==============================================================================
--- pypy/branch/i386-regalloc/pypy/jit/codegen/i386/rgenop.py	(original)
+++ pypy/branch/i386-regalloc/pypy/jit/codegen/i386/rgenop.py	Sat Jan 13 15:43:51 2007
@@ -488,7 +488,7 @@
                 loc = self.var2loc[v]
             except KeyError:
                 if at_start:
-                    raise NotImplementedError
+                    pass    # input variable not used anyway
                 else:
                     self.add_final_move(v, operand)
             else:
@@ -596,6 +596,7 @@
 
 class Builder(GenBuilder):
     coming_from = 0
+    operations = None
 
     def __init__(self, rgenop, inputargs_gv, inputoperands):
         self.rgenop = rgenop
@@ -603,12 +604,16 @@
         self.inputoperands = inputoperands
 
     def start_writing(self):
+        assert self.operations is None
         self.operations = []
 
     def generate_block_code(self, final_vars_gv, force_vars=[],
-                                                 force_operands=[]):
+                                                 force_operands=[],
+                                                 renaming=True):
         allocator = RegAllocator()
         allocator.set_final(final_vars_gv)
+        if not renaming:
+            final_vars_gv = allocator.var2loc.keys()  # unique final vars
         allocator.allocate_locations(self.operations)
         allocator.force_var_operands(force_vars, force_operands,
                                      at_start=False)
@@ -620,7 +625,11 @@
         allocator.generate_initial_moves()
         allocator.generate_operations()
         self.operations = None
-        self.inputargs_gv = [GenVar() for v in final_vars_gv]
+        if renaming:
+            self.inputargs_gv = [GenVar() for v in final_vars_gv]
+        else:
+            # just keep one copy of each Variable that is alive
+            self.inputargs_gv = final_vars_gv
         self.inputoperands = [allocator.get_operand(v) for v in final_vars_gv]
         return mc
 
@@ -697,6 +706,12 @@
         # ----------------
         self.rgenop.close_mc(mc)
 
+    def pause_writing(self, alive_gv):
+        mc = self.generate_block_code(alive_gv, renaming=False)
+        self.set_coming_from(mc)
+        self.rgenop.close_mc(mc)
+        return self
+
     def end(self):
         pass
 



More information about the Pypy-commit mailing list