[pypy-commit] pypy ppc-jit-backend: Finished implementation of regalloc_mov, added further tests.
hager
noreply at buildbot.pypy.org
Wed Sep 28 18:18:57 CEST 2011
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r47660:982bc81e4f01
Date: 2011-09-28 18:18 +0200
http://bitbucket.org/pypy/pypy/changeset/982bc81e4f01/
Log: Finished implementation of regalloc_mov, added further tests.
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -325,6 +325,7 @@
clt.asmmemmgr_blocks = []
return clt.asmmemmgr_blocks
+ # XXX fix for 64 bit
def regalloc_mov(self, prev_loc, loc):
if prev_loc.is_imm():
value = prev_loc.getint()
@@ -332,12 +333,41 @@
if loc.is_reg():
reg = loc.as_key()
self.mc.load_imm(reg, value)
+ return
# move immediate value to memory
- else:
+ elif loc.is_stack():
offset = loc.as_key() * WORD - WORD
self.mc.load_imm(r.r0.value, value)
- self.mc.stw(r.r0, r.SPP, offset)
- return
+ self.mc.stw(r.r0.value, r.SPP.value, offset)
+ return
+ assert 0, "not supported location"
+ elif prev_loc.is_stack():
+ offset = prev_loc.as_key() * WORD - WORD
+ # move from memory to register
+ if loc.is_reg():
+ reg = loc.as_key()
+ self.mc.lwz(reg, r.SPP.value, offset)
+ return
+ # move in memory
+ elif loc.is_stack():
+ target_offset = loc.as_key() * WORD - WORD
+ self.mc.lwz(r.r0.value, r.SPP.value, offset)
+ self.mc.stw(r.r0.value, r.SPP.value, target_offset)
+ return
+ assert 0, "not supported location"
+ elif prev_loc.is_reg():
+ reg = prev_loc.as_key()
+ # move to another register
+ if loc.is_reg():
+ other_reg = loc.as_key()
+ self.mc.mr(other_reg, reg)
+ return
+ # move to memory
+ elif loc.is_stack():
+ offset = loc.as_key() * WORD - WORD
+ self.mc.stw(reg, r.SPP.value, offset)
+ return
+ assert 0, "not supported location"
assert 0, "not supported location"
def make_operations():
diff --git a/pypy/jit/backend/ppc/ppcgen/test/test_regalloc.py b/pypy/jit/backend/ppc/ppcgen/test/test_regalloc.py
--- a/pypy/jit/backend/ppc/ppcgen/test/test_regalloc.py
+++ b/pypy/jit/backend/ppc/ppcgen/test/test_regalloc.py
@@ -33,8 +33,7 @@
def __eq__(self, other):
assert isinstance(other, MockInstruction)
- #return self.name == other.name and self.args == other.args
- return str(self) == str(other)
+ return self.name == other.name and self.args == other.args
def __repr__(self):
return self.__str__()
@@ -96,11 +95,38 @@
self.asm.regalloc_mov(imm(big), stack(7))
exp_instr = [MI("load_imm", 0, 5),
- MI("stw", r0, SPP, -(6 * WORD + WORD)),
+ MI("stw", r0.value, SPP.value, -(6 * WORD + WORD)),
MI("load_imm", 0, big),
- MI("stw", r0, SPP, -(7 * WORD + WORD))]
+ MI("stw", r0.value, SPP.value, -(7 * WORD + WORD))]
assert self.asm.mc.instrs == exp_instr
+ def test_mem_to_reg(self):
+ self.asm.regalloc_mov(stack(5), reg(10))
+ self.asm.regalloc_mov(stack(0), reg(0))
+ exp_instrs = [MI("lwz", r10.value, SPP.value, -(5 * WORD + WORD)),
+ MI("lwz", r0.value, SPP.value, -(WORD))]
+ assert self.asm.mc.instrs == exp_instrs
+
+ def test_mem_to_mem(self):
+ self.asm.regalloc_mov(stack(5), stack(6))
+ exp_instrs = [MI("lwz", r0.value, SPP.value, -(5 * WORD + WORD)),
+ MI("stw", r0.value, SPP.value, -(6 * WORD + WORD))]
+ assert self.asm.mc.instrs == exp_instrs
+
+ def test_reg_to_reg(self):
+ self.asm.regalloc_mov(reg(0), reg(1))
+ self.asm.regalloc_mov(reg(5), reg(10))
+ exp_instrs = [MI("mr", r1.value, r0.value),
+ MI("mr", r10.value, r5.value)]
+ assert self.asm.mc.instrs == exp_instrs
+
+ def test_reg_to_mem(self):
+ self.asm.regalloc_mov(reg(5), stack(10))
+ self.asm.regalloc_mov(reg(0), stack(2))
+ exp_instrs = [MI("stw", r5.value, SPP.value, -(10 * WORD + WORD)),
+ MI("stw", r0.value, SPP.value, -(2 * WORD + WORD))]
+ assert self.asm.mc.instrs == exp_instrs
+
def reg(i):
return RegisterLocation(i)
More information about the pypy-commit
mailing list