[pypy-commit] pypy arm-backend-2: test and refactor mov_from_vfp_loc
bivab
noreply at buildbot.pypy.org
Fri Sep 30 12:00:19 CEST 2011
Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r47707:6b54c5d93928
Date: 2011-09-29 14:24 +0200
http://bitbucket.org/pypy/pypy/changeset/6b54c5d93928/
Log: test and refactor mov_from_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
@@ -969,24 +969,30 @@
mov_loc_loc = regalloc_mov
def mov_from_vfp_loc(self, vfp_loc, reg1, reg2, cond=c.AL):
+ """Moves floating point values either as an immediate, in a vfp
+ register or at a stack location to a pair of core registers"""
assert reg1.value + 1 == reg2.value
temp = r.lr
if vfp_loc.is_vfp_reg():
self.mc.VMOV_rc(reg1.value, reg2.value, vfp_loc.value, cond=cond)
elif vfp_loc.is_imm_float():
- self.mc.gen_load_int(temp.value, vfp_loc.getint(), cond=cond)
+ self.mc.PUSH([r.ip.value], cond=cond)
+ self.mc.gen_load_int(r.ip.value, vfp_loc.getint(), cond=cond)
# we need to load one word to loc and one to loc+1 which are
# two 32-bit core registers
- self.mc.LDR_ri(reg1.value, temp.value, cond=cond)
- self.mc.LDR_ri(reg2.value, temp.value, imm=WORD, cond=cond)
- elif vfp_loc.is_stack():
- # load spilled value into vfp reg
+ self.mc.LDR_ri(reg1.value, r.ip.value, cond=cond)
+ self.mc.LDR_ri(reg2.value, r.ip.value, imm=WORD, cond=cond)
+ self.mc.POP([r.ip.value], cond=cond)
+ elif vfp_loc.is_stack() and vfp_loc.type == FLOAT:
+ # load spilled vfp value into two core registers
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.LDR_rr(reg1.value, r.fp.value, temp.value, cond=cond)
- self.mc.ADD_ri(temp.value, temp.value, imm=WORD, cond=cond)
- self.mc.LDR_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.LDR_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.LDR_rr(reg2.value, r.fp.value, r.ip.value, cond=cond)
+ self.mc.POP([r.ip.value], cond=cond)
else:
self.mc.LDR_ri(reg1.value, r.fp.value, imm=-offset.value, cond=cond)
self.mc.LDR_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
@@ -52,12 +52,15 @@
self.instrs.append(i)
return i
-class TestRegallocMov(object):
+class BaseMovTest(object):
def setup_method(self, method):
self.builder = MockBuilder()
self.asm = instantiate(AssemblerARM)
self.asm.mc = self.builder
+
+class TestRegallocMov(BaseMovTest):
+
def mov(self, a, b, expected=None):
self.asm.regalloc_mov(a, b)
result =self.builder.instrs
@@ -239,5 +242,56 @@
py.test.raises(AssertionError, 'self.asm.regalloc_mov(vfp(1), r(2))')
py.test.raises(AssertionError, 'self.asm.regalloc_mov(vfp(1), stack(2))')
-class TestMovFromToVFPLoc(object):
- pass
+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
+
+ def test_from_vfp(self):
+ vr = vfp(10)
+ r1 = r(1)
+ r2 = r(2)
+ e = [mi('VMOV_rc', r1.value, r2.value, vr.value, cond=AL)]
+ self.mov(vr, r1, r2, e)
+
+
+ def test_from_vfp_stack(self):
+ s = stack_float(4)
+ r1 = r(1)
+ r2 = r(2)
+ e = [
+ mi('LDR_ri', r1.value, fp.value, imm=-16, cond=AL),
+ mi('LDR_ri', r2.value, fp.value, imm=-12, cond=AL)]
+ self.mov(s, r1, r2, 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('LDR_rr', r1.value, fp.value, ip.value,cond=AL),
+ mi('ADD_ri', ip.value, ip.value, imm=4, cond=AL),
+ mi('LDR_rr', r2.value, fp.value, ip.value, cond=AL),
+ mi('POP', [ip.value], cond=AL)]
+ self.mov(s, r1, r2, e)
+
+ def test_from_imm_float(self):
+ i = imm_float(4)
+ r1 = r(1)
+ r2 = r(2)
+ e = [
+ mi('PUSH', [ip.value], cond=AL),
+ mi('gen_load_int', ip.value, i.value, cond=AL),
+ mi('LDR_ri', r1.value, ip.value, cond=AL),
+ mi('LDR_ri', r2.value, ip.value, imm=4, cond=AL),
+ mi('POP', [ip.value], cond=AL)]
+ self.mov(i, r1, r2, e)
+
+ def test_unsupported(self):
+ py.test.raises(AssertionError, 'self.asm.mov_from_vfp_loc(vfp(1), r(5), r(2))')
+ 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))')
More information about the pypy-commit
mailing list