Author: David Schneider <david.schnei...@picle.org> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit