Author: David Schneider <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit