Author: David Schneider <[email protected]>
Branch: arm-backend-2
Changeset: r47708:2c2975a81d25
Date: 2011-09-29 14:33 +0200
http://bitbucket.org/pypy/pypy/changeset/2c2975a81d25/
Log: refactor and test mov_to_vfp_loc
diff --git a/pypy/jit/backend/arm/assembler.py
b/pypy/jit/backend/arm/assembler.py
--- a/pypy/jit/backend/arm/assembler.py
+++ b/pypy/jit/backend/arm/assembler.py
@@ -1000,18 +1000,21 @@
assert 0, 'unsupported case'
def mov_to_vfp_loc(self, reg1, reg2, vfp_loc, cond=c.AL):
+ """Moves a floating point value from to consecutive core registers to a
+ vfp location, either a vfp regsiter or a stacklocation"""
assert reg1.value + 1 == reg2.value
- temp = r.lr
if vfp_loc.is_vfp_reg():
self.mc.VMOV_cr(vfp_loc.value, reg1.value, reg2.value, cond=cond)
elif vfp_loc.is_stack():
- # load spilled value into vfp reg
+ # move from two core registers to a float stack location
offset = ConstInt((vfp_loc.position)*WORD)
if not _check_imm_arg(offset, size=0xFFF):
- self.mc.gen_load_int(temp.value, -offset.value, cond=cond)
- self.mc.STR_rr(reg1.value, r.fp.value, temp.value, cond=cond)
- self.mc.ADD_ri(temp.value, temp.value, imm=WORD, cond=cond)
- self.mc.STR_rr(reg2.value, r.fp.value, temp.value, cond=cond)
+ self.mc.PUSH([r.ip.value], cond=cond)
+ self.mc.gen_load_int(r.ip.value, -offset.value, cond=cond)
+ self.mc.STR_rr(reg1.value, r.fp.value, r.ip.value, cond=cond)
+ self.mc.ADD_ri(r.ip.value, r.ip.value, imm=WORD, cond=cond)
+ self.mc.STR_rr(reg2.value, r.fp.value, r.ip.value, cond=cond)
+ self.mc.POP([r.ip.value], cond=cond)
else:
self.mc.STR_ri(reg1.value, r.fp.value, imm=-offset.value,
cond=cond)
self.mc.STR_ri(reg2.value, r.fp.value, imm=-offset.value+WORD,
cond=cond)
diff --git a/pypy/jit/backend/arm/test/test_regalloc_mov.py
b/pypy/jit/backend/arm/test/test_regalloc_mov.py
--- a/pypy/jit/backend/arm/test/test_regalloc_mov.py
+++ b/pypy/jit/backend/arm/test/test_regalloc_mov.py
@@ -58,13 +58,16 @@
self.asm = instantiate(AssemblerARM)
self.asm.mc = self.builder
+ def validate(self, expected):
+ result =self.builder.instrs
+ assert result == expected
+
class TestRegallocMov(BaseMovTest):
def mov(self, a, b, expected=None):
self.asm.regalloc_mov(a, b)
- result =self.builder.instrs
- assert result == expected
+ self.validate(expected)
def test_mov_imm_to_reg(self):
val = imm(123)
@@ -245,8 +248,7 @@
class TestMovFromVFPLoc(BaseMovTest):
def mov(self, a, b, c, expected=None):
self.asm.mov_from_vfp_loc(a, b, c)
- result =self.builder.instrs
- assert result == expected
+ self.validate(expected)
def test_from_vfp(self):
vr = vfp(10)
@@ -295,3 +297,44 @@
py.test.raises(AssertionError, 'self.asm.mov_from_vfp_loc(stack(1),
r(1), r(2))')
py.test.raises(AssertionError, 'self.asm.mov_from_vfp_loc(imm(1),
r(1), r(2))')
py.test.raises(AssertionError, 'self.asm.mov_from_vfp_loc(r(1), r(1),
r(2))')
+
+class TestMoveToVFPLoc(BaseMovTest):
+ def mov(self, r1, r2, vfp, expected):
+ self.asm.mov_to_vfp_loc(r1, r2, vfp)
+ self.validate(expected)
+
+ def mov_to_vfp_reg(self):
+ vr = vfp(10)
+ r1 = r(1)
+ r2 = r(2)
+ e = [mi('VMOV_cr', vr.value, r1.value, r2.value, cond=AL)]
+ self.mov(vr, r1, r2, e)
+
+ def test_to_vfp_stack(self):
+ s = stack_float(4)
+ r1 = r(1)
+ r2 = r(2)
+ e = [
+ mi('STR_ri', r1.value, fp.value, imm=-16, cond=AL),
+ mi('STR_ri', r2.value, fp.value, imm=-12, cond=AL)]
+ self.mov(r1, r2, s, e)
+
+ def test_from_big_vfp_stack(self):
+ s = stack_float(2049)
+ r1 = r(1)
+ r2 = r(2)
+ e = [
+ mi('PUSH', [ip.value], cond=AL),
+ mi('gen_load_int', ip.value, -2049*4, cond=AL),
+ mi('STR_rr', r1.value, fp.value, ip.value,cond=AL),
+ mi('ADD_ri', ip.value, ip.value, imm=4, cond=AL),
+ mi('STR_rr', r2.value, fp.value, ip.value, cond=AL),
+ mi('POP', [ip.value], cond=AL)]
+ self.mov(r1, r2, s, e)
+
+ def unsupported(self):
+ py.test.raises(AssertionError, 'self.asm.mov_from_vfp_loc(r(5), r(2),
vfp(4))')
+ py.test.raises(AssertionError, 'self.asm.mov_from_vfp_loc(r(1), r(2),
stack(2))')
+ py.test.raises(AssertionError, 'self.asm.mov_from_vfp_loc(r(1), r(2),
imm(2))')
+ py.test.raises(AssertionError, 'self.asm.mov_from_vfp_loc(r(1), r(2),
imm_float(2))')
+ py.test.raises(AssertionError, 'self.asm.mov_from_vfp_loc(r(1), r(1),
r(2))')
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit