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

Reply via email to