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