Author: David Schneider <david.schnei...@picle.org>
Branch: ppc-jit-backend
Changeset: r56218:d5c318e10931
Date: 2012-07-19 00:38 -0700
http://bitbucket.org/pypy/pypy/changeset/d5c318e10931/

Log:    tentative fix for regalloc_push and regalloc_pop involving
        stack_locations, fixes
        test_basic.py:test_loop_invariant_mul_bridge_ovf2

diff --git a/pypy/jit/backend/ppc/ppc_assembler.py 
b/pypy/jit/backend/ppc/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppc_assembler.py
@@ -975,7 +975,6 @@
         self.mc = None
         self._regalloc = None
         assert self.datablockwrapper is None
-        self.stack_in_use = False
         self.max_stack_params = 0
 
     def _walk_operations(self, operations, regalloc):
@@ -1247,37 +1246,41 @@
         """Pushes the value stored in loc to the stack
         Can trash the current value of SCRATCH when pushing a stack
         loc"""
+        if loc.is_imm() or loc.is_imm_float():
+            assert 0, "not implemented yet"
 
+        self.mc.addi(r.SP.value, r.SP.value, -WORD) # decrease stack pointer
+        assert IS_PPC_64, 'needs to updated for ppc 32'
         if loc.is_stack():
             # XXX this code has to be verified
-            assert not self.stack_in_use
-            target = StackLocation(self.ENCODING_AREA // WORD) # write to 
ENCODING AREA           
-            self.regalloc_mov(loc, target)
-            self.stack_in_use = True
+            with scratch_reg(self.mc):
+                self.regalloc_mov(loc, r.SCRATCH)
+                # push value
+                self.mc.store(r.SCRATCH.value, r.SP.value, 0)
         elif loc.is_reg():
-            self.mc.addi(r.SP.value, r.SP.value, -WORD) # decrease stack 
pointer
             # push value
             self.mc.store(loc.value, r.SP.value, 0)
         elif loc.is_fp_reg():
             self.mc.addi(r.SP.value, r.SP.value, -WORD) # decrease stack 
pointer
             # push value
             self.mc.stfd(loc.value, r.SP.value, 0)
-        elif loc.is_imm():
-            assert 0, "not implemented yet"
-        elif loc.is_imm_float():
-            assert 0, "not implemented yet"
         else:
             raise AssertionError('Trying to push an invalid location')
 
     def regalloc_pop(self, loc):
         """Pops the value on top of the stack to loc. Can trash the current
         value of SCRATCH when popping to a stack loc"""
+        assert IS_PPC_64, 'needs to updated for ppc 32'
         if loc.is_stack():
             # XXX this code has to be verified
-            assert self.stack_in_use
-            from_loc = StackLocation(self.ENCODING_AREA // WORD) # read from 
ENCODING AREA
-            self.regalloc_mov(from_loc, loc)
-            self.stack_in_use = False
+            with scratch_reg(self.mc):
+                # pop value
+                if IS_PPC_32:
+                    self.mc.lwz(r.SCRATCH.value, r.SP.value, 0)
+                else:
+                    self.mc.ld(r.SCRATCH.value, r.SP.value, 0)
+                self.mc.addi(r.SP.value, r.SP.value, WORD) # increase stack 
pointer
+                self.regalloc_mov(r.SCRATCH, loc)
         elif loc.is_reg():
             # pop value
             if IS_PPC_32:
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to