Author: Alex Gaynor <[email protected]>
Branch: jit-raw-array-of-struct
Changeset: r48584:b968a2c1909c
Date: 2011-10-28 14:34 -0400
http://bitbucket.org/pypy/pypy/changeset/b968a2c1909c/

Log:    progress

diff --git a/pypy/jit/codewriter/assembler.py b/pypy/jit/codewriter/assembler.py
--- a/pypy/jit/codewriter/assembler.py
+++ b/pypy/jit/codewriter/assembler.py
@@ -79,6 +79,7 @@
             if TYPE is lltype.SingleFloat:
                 value = longlong.singlefloat2int(value)
             if not isinstance(value, (llmemory.AddressAsInt,
+                                      llmemory.ItemOffset,
                                       ComputedIntSymbolic)):
                 value = lltype.cast_primitive(lltype.Signed, value)
                 if allow_short and -128 <= value <= 127:
diff --git a/pypy/jit/codewriter/jtransform.py 
b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -788,6 +788,16 @@
             return SpaceOperation('setinteriorfield_gc_%s' % kind, args,
                                   op.result)
 
+    def rewrite_op_getarraysubstruct(self, op):
+        array = op.args[0]
+        assert not self._is_gc(array)
+        tmp = varoftype(lltype.Signed)
+        element_size = llmemory.sizeof(array.concretetype.TO.OF)
+        return [
+            SpaceOperation("int_mul", [op.args[1], Constant(element_size, 
lltype.Signed)], tmp),
+            SpaceOperation("int_add", [op.args[0], tmp], op.result),
+        ]
+
     def _rewrite_equality(self, op, opname):
         arg0, arg1 = op.args
         if isinstance(arg0, Constant) and not arg0.value:
diff --git a/pypy/jit/codewriter/test/test_jtransform.py 
b/pypy/jit/codewriter/test/test_jtransform.py
--- a/pypy/jit/codewriter/test/test_jtransform.py
+++ b/pypy/jit/codewriter/test/test_jtransform.py
@@ -1140,4 +1140,24 @@
     assert op1.opname == 'mark_opaque_ptr'
     assert op1.args == [v1]
     assert op1.result is None
-    assert op2 is None
\ No newline at end of file
+    assert op2 is None
+
+def test_getarraysubstruct():
+    S = lltype.Struct("S", ("x", lltype.Float), ("y", lltype.Float))
+    v1 = varoftype(lltype.Ptr(lltype.Array(S)))
+    v2 = varoftype(lltype.Signed)
+    v3 = varoftype(lltype.Ptr(S))
+
+    op = SpaceOperation('getarraysubstruct', [v1, v2], v3)
+    [op1, op2] = Transformer().rewrite_operation(op)
+
+    assert op1.opname == "int_mul"
+    assert len(op1.args) == 2
+    assert op1.args[0] == v2
+    assert op1.args[1].value.TYPE == S
+    assert op1.args[1].value.repeat == 1
+    assert op1.result is not None
+
+    assert op2.opname == "int_add"
+    assert op2.args == [v1, op1.result]
+    assert op2.result == v3
\ No newline at end of file
diff --git a/pypy/jit/metainterp/test/test_ajit.py 
b/pypy/jit/metainterp/test/test_ajit.py
--- a/pypy/jit/metainterp/test/test_ajit.py
+++ b/pypy/jit/metainterp/test/test_ajit.py
@@ -3559,6 +3559,29 @@
         assert res == 0
         self.check_loops({"int_sub": 1, "int_gt": 1, "guard_true": 1, "jump": 
1})
 
+    def test_raw_array_of_structs(self):
+        POINT = lltype.Struct("POINT",
+            ("x", lltype.Signed),
+            ("y", lltype.Signed),
+        )
+        ARRAY = lltype.Array(POINT)
+        myjitdriver = JitDriver(greens = [], reds=["vals", "i", "n", "result"])
+        def f(n):
+            vals = lltype.malloc(ARRAY, n, flavor="raw")
+            for i in xrange(n):
+                vals[i].x = n
+                vals[i].y = 2
+            result = 0.0
+            i = 0
+            while i < n:
+                myjitdriver.jit_merge_point(vals=vals, i=i, n=n, result=result)
+                result += vals[i].x * vals[i].y
+                i += 1
+            lltype.free(vals, flavor="raw")
+            return result
+        res = self.meta_interp(f, [10])
+        assert res == f(10)
+        self.check_loops({})
 
 
 class TestLLtype(BaseLLtypeTests, LLJitMixin):
diff --git a/pypy/rpython/lltypesystem/llmemory.py 
b/pypy/rpython/lltypesystem/llmemory.py
--- a/pypy/rpython/lltypesystem/llmemory.py
+++ b/pypy/rpython/lltypesystem/llmemory.py
@@ -532,6 +532,8 @@
         return self.adr == cast_int_to_adr(other)
     def __ne__(self, other):
         return self.adr != cast_int_to_adr(other)
+    def __add__(self, other):
+        return AddressAsInt(self.adr + other)
     def __nonzero__(self):
         return bool(self.adr)
     def __repr__(self):
@@ -879,7 +881,7 @@
         assert isinstance(s_from, SomeAddress)
         assert isinstance(s_to, SomeAddress)
         assert isinstance(s_size, SomeInteger)
-    
+
     def specialize_call(self, hop):
         hop.exception_cannot_occur()
         v_list = hop.inputargs(Address, Address, lltype.Signed)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to