[pypy-commit] pypy emit-call-arm: add raw stack location tests

bivab noreply at buildbot.pypy.org
Mon May 27 14:52:29 CEST 2013


Author: David Schneider <david.schneider at picle.org>
Branch: emit-call-arm
Changeset: r64578:2174f2660a2d
Date: 2013-05-27 07:42 -0500
http://bitbucket.org/pypy/pypy/changeset/2174f2660a2d/

Log:	add raw stack location tests

diff --git a/rpython/jit/backend/arm/assembler.py b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -1038,7 +1038,7 @@
             self.store_reg(self.mc, prev_loc, r.fp, offset, helper=temp, cond=cond)
             if not is_imm and save:
                 self.mc.POP([temp.value], cond=cond)
-        elif loc.is_raw_sp():
+        elif loc.is_raw_sp() and loc.type != FLOAT:
             temp, save = self.get_tmp_reg([prev_loc])
             assert not save
             self.store_reg(self.mc, prev_loc, r.sp, loc.value, cond=cond, helper=temp)
@@ -1064,6 +1064,8 @@
             helper, save = self.get_tmp_reg()
             save_helper = not is_imm and save
         elif loc.is_raw_sp():
+            assert (loc.type == prev_loc.type == FLOAT
+                    or (loc.type != FLOAT and prev_loc.type != FLOAT))
             tmp = loc
             if loc.is_float():
                 loc = r.vfp_ip
@@ -1093,10 +1095,10 @@
             self.load_reg(self.mc, loc, helper, 0, cond=cond)
             if save_helper:
                 self.mc.POP([helper.value], cond=cond)
-        elif loc.is_stack():
+        elif loc.is_stack() and loc.type == FLOAT:
             self.regalloc_mov(prev_loc, r.vfp_ip, cond)
             self.regalloc_mov(r.vfp_ip, loc, cond)
-        elif loc.is_raw_sp():
+        elif loc.is_raw_sp() and loc.type == FLOAT:
             self.regalloc_mov(prev_loc, r.vfp_ip, cond)
             self.regalloc_mov(r.vfp_ip, loc, cond)
         else:
@@ -1113,6 +1115,8 @@
             is_imm = check_imm_arg(offset)
             self.store_reg(self.mc, prev_loc, r.fp, offset, cond=cond, helper=r.ip)
         elif loc.is_raw_sp():
+            assert loc.type == FLOAT, 'trying to store to an \
+                incompatible location from a float register'
             self.store_reg(self.mc, prev_loc, r.sp, loc.value, cond=cond)
         else:
             assert 0, 'unsupported case'
diff --git a/rpython/jit/backend/arm/test/test_regalloc_mov.py b/rpython/jit/backend/arm/test/test_regalloc_mov.py
--- a/rpython/jit/backend/arm/test/test_regalloc_mov.py
+++ b/rpython/jit/backend/arm/test/test_regalloc_mov.py
@@ -1,9 +1,10 @@
 from rpython.rlib.objectmodel import instantiate
 from rpython.jit.backend.arm.assembler import AssemblerARM
-from rpython.jit.backend.arm.locations import imm, ConstFloatLoc,\
-                                        RegisterLocation, StackLocation, \
-                                        VFPRegisterLocation, get_fp_offset
-from rpython.jit.backend.arm.registers import lr, ip, fp, vfp_ip
+from rpython.jit.backend.arm.locations import imm, ConstFloatLoc
+from rpython.jit.backend.arm.locations import RegisterLocation, StackLocation
+from rpython.jit.backend.arm.locations import VFPRegisterLocation, get_fp_offset
+from rpython.jit.backend.arm.locations import RawSPStackLocation
+from rpython.jit.backend.arm.registers import lr, ip, fp, vfp_ip, sp
 from rpython.jit.backend.arm.conditions import AL
 from rpython.jit.backend.arm.arch import WORD
 from rpython.jit.metainterp.history import FLOAT
@@ -54,6 +55,12 @@
     addr = int(value)  # whatever
     return ConstFloatLoc(addr)
 
+def raw_stack(i):
+    return RawSPStackLocation(i)
+
+def raw_stack_float(i):
+    return RawSPStackLocation(i, type=FLOAT)
+
 
 class MockBuilder(object):
     def __init__(self):
@@ -79,13 +86,13 @@
         result = self.builder.instrs
         assert result == expected
 
-
-class TestRegallocMov(BaseMovTest):
-
     def mov(self, a, b, expected=None):
         self.asm.regalloc_mov(a, b)
         self.validate(expected)
 
+
+class TestRegallocMov(BaseMovTest):
+
     def test_mov_imm_to_reg(self):
         val = imm(123)
         reg = r(7)
@@ -491,3 +498,79 @@
     def test_unsupported(self):
         py.test.raises(AssertionError, 'self.asm.regalloc_pop(imm(1))')
         py.test.raises(AssertionError, 'self.asm.regalloc_pop(imm_float(1))')
+
+class TestRawStackLocs(BaseMovTest):
+    def test_unsupported(self):
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(raw_stack(0), imm(1))')
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(raw_stack(0), imm_float(1))')
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(raw_stack(0), r(1))')
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(raw_stack(0), vfp(1))')
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(raw_stack(0), stack(1))')
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(raw_stack(0), stack_float(1))')
+
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(imm_float(1), raw_stack(1))')
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(imm(1), raw_stack_float(1))')
+
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(vfp(1), raw_stack(1))')
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(r(1), raw_stack_float(1))')
+
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(stack_float(1), raw_stack(1))')
+        py.test.raises(AssertionError, 'self.asm.regalloc_mov(stack(1), raw_stack_float(1))')
+
+    def test_from_imm(self):
+        s = raw_stack(1024)
+        i = imm(999)
+        e = [
+            mi('gen_load_int', lr.value, i.value, cond=AL),
+            mi('gen_load_int', ip.value, s.value, cond=AL),
+            mi('STR_rr', lr.value, sp.value, ip.value, cond=AL),
+            ]
+        self.mov(i, s, e)
+
+    def test_from_vfp_imm(self):
+        s = raw_stack_float(1024)
+        i = imm_float(999)
+        e = [
+            mi('gen_load_int', ip.value, i.value, cond=AL),
+            mi('VLDR', vfp_ip.value, ip.value, cond=AL, imm=0),
+            mi('gen_load_int', ip.value, s.value, cond=AL),
+            mi('ADD_rr', ip.value, sp.value, ip.value, cond=AL),
+            mi('VSTR', vfp_ip.value, ip.value, cond=AL),
+            ]
+        self.mov(i, s, e)
+
+    def test_from_reg(self):
+        s = raw_stack(1024)
+        reg = r(10)
+        e = [mi('gen_load_int', ip.value, s.value, cond=AL),
+             mi('STR_rr', reg.value, sp.value, ip.value, cond=AL),
+            ]
+        self.mov(reg, s, e)
+
+    def test_from_vfp_reg(self):
+        s = raw_stack_float(1024)
+        reg = vfp(10)
+        e = [mi('gen_load_int', ip.value, s.value, cond=AL),
+             mi('ADD_rr', ip.value, sp.value, ip.value, cond=AL),
+             mi('VSTR', reg.value, ip.value, cond=AL),
+            ]
+        self.mov(reg, s, e)
+
+    def test_from_stack(self):
+        s = raw_stack(1024)
+        reg = stack(10)
+        e = [mi('LDR_ri', ip.value, fp.value, imm=216, cond=AL),
+             mi('gen_load_int', lr.value, s.value, cond=AL),
+             mi('STR_rr', ip.value, sp.value, lr.value, cond=AL),
+            ]
+        self.mov(reg, s, e)
+
+    def test_from_vfp_stack(self):
+        s = raw_stack_float(1024)
+        reg = stack_float(10)
+        e = [mi('VLDR', vfp_ip.value, fp.value, imm=220, cond=AL),
+             mi('gen_load_int', ip.value, s.value, cond=AL),
+             mi('ADD_rr', ip.value, sp.value, ip.value, cond=AL),
+             mi('VSTR', vfp_ip.value, ip.value, cond=AL),
+            ]
+        self.mov(reg, s, e)


More information about the pypy-commit mailing list