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

arigo at codespeak.net arigo at codespeak.net
Sat Jan 13 19:16:05 CET 2007


Author: arigo
Date: Sat Jan 13 19:16:04 2007
New Revision: 36694

Modified:
   pypy/branch/i386-regalloc/pypy/jit/codegen/i386/rgenop.py
Log:
Fix for test_jump_to_block_with_many_vars.


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 19:16:04 2007
@@ -282,10 +282,12 @@
     def generate(self, allocator):
         lbl = self.lbl
         lbl.targetaddr = allocator.mc.tell()
+        lbl.targetstackdepth = allocator.required_frame_depth
         lbl.inputoperands = [allocator.get_operand(v) for v in self.args_gv]
 
 class Label(GenLabel):
     targetaddr = 0
+    targetstackdepth = 0
     inputoperands = None
 
 class OpCall(Operation):
@@ -687,6 +689,7 @@
         if last_n >= 0:
             if CALL_ALIGN > 1:
                 last_n = (last_n & ~(CALL_ALIGN-1)) + (CALL_ALIGN-1)
+            self.required_frame_depth = last_n + 1
             self.mc.LEA(esp, stack_op(last_n))
         # XXX naive algo for now
         for loc, srcoperand in initial_moves:
@@ -731,7 +734,8 @@
 
     def generate_block_code(self, final_vars_gv, force_vars=[],
                                                  force_operands=[],
-                                                 renaming=True):
+                                                 renaming=True,
+                                                 minimal_stack_depth=0):
         allocator = RegAllocator()
         allocator.set_final(final_vars_gv)
         if not renaming:
@@ -742,6 +746,8 @@
         allocator.force_var_operands(self.inputargs_gv, self.inputoperands,
                                      at_start=True)
         allocator.allocate_registers()
+        if allocator.required_frame_depth < minimal_stack_depth:
+            allocator.required_frame_depth = minimal_stack_depth
         mc = self.start_mc()
         allocator.mc = mc
         allocator.generate_initial_moves()
@@ -819,7 +825,8 @@
             self.start_writing()
             operands = targetlbl.inputoperands
             assert operands is not None
-        mc = self.generate_block_code(outputargs_gv, outputargs_gv, operands)
+        mc = self.generate_block_code(outputargs_gv, outputargs_gv, operands,
+                              minimal_stack_depth = targetlbl.targetstackdepth)
         mc.JMP(rel32(targetlbl.targetaddr))
         self.rgenop.close_mc(mc)
 



More information about the Pypy-commit mailing list