[pypy-svn] pypy 32ptr-on-64bit: cpu.bh_getarrayitem_gc_r.
arigo
commits-noreply at bitbucket.org
Thu Apr 14 22:32:34 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: 32ptr-on-64bit
Changeset: r43371:6cd51cf49802
Date: 2011-04-14 13:29 -0700
http://bitbucket.org/pypy/pypy/changeset/6cd51cf49802/
Log: cpu.bh_getarrayitem_gc_r.
diff --git a/pypy/jit/backend/llsupport/llmodel.py b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -248,16 +248,11 @@
def unpack_arraydescr(self, arraydescr):
assert isinstance(arraydescr, BaseArrayDescr)
- return arraydescr.get_base_size(self.translate_support_code)
- unpack_arraydescr._always_inline_ = True
-
- def unpack_arraydescr_size(self, arraydescr):
- assert isinstance(arraydescr, BaseArrayDescr)
ofs = arraydescr.get_base_size(self.translate_support_code)
size = arraydescr.get_item_size(self.translate_support_code)
sign = arraydescr.is_item_signed()
return ofs, size, sign
- unpack_arraydescr_size._always_inline_ = True
+ unpack_arraydescr._always_inline_ = True
def calldescrof(self, FUNC, ARGS, RESULT, extrainfo=None):
return get_call_descr(self.gc_ll_descr, ARGS, RESULT, extrainfo)
@@ -288,7 +283,7 @@
@specialize.argtype(2)
def bh_getarrayitem_gc_i(self, arraydescr, gcref, itemindex):
- ofs, size, sign = self.unpack_arraydescr_size(arraydescr)
+ ofs, size, sign = self.unpack_arraydescr(arraydescr)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
for STYPE, UTYPE, itemsize in unroll_basic_sizes:
@@ -307,17 +302,22 @@
raise NotImplementedError("size = %d" % size)
def bh_getarrayitem_gc_r(self, arraydescr, gcref, itemindex):
- ofs = self.unpack_arraydescr(arraydescr)
+ ofs, size, _ = self.unpack_arraydescr(arraydescr)
+ icp = self.gcdescr.is_compressed_ptr(size)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
- items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
- pval = self._cast_int_to_gcref(items[itemindex])
+ if icp:
+ items = rffi.cast(rffi.CArrayPtr(rffi.UINT), items)
+ pval = self._cast_hidden_int32_to_gcref(items[itemindex])
+ else:
+ items = rffi.cast(rffi.CArrayPtr(lltype.Signed), items)
+ pval = self._cast_int_to_gcref(items[itemindex])
# --- end of GC unsafe code ---
return pval
@specialize.argtype(2)
def bh_getarrayitem_gc_f(self, arraydescr, gcref, itemindex):
- ofs = self.unpack_arraydescr(arraydescr)
+ ofs, _, _ = self.unpack_arraydescr(arraydescr)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items)
@@ -327,7 +327,7 @@
@specialize.argtype(2)
def bh_setarrayitem_gc_i(self, arraydescr, gcref, itemindex, newvalue):
- ofs, size, sign = self.unpack_arraydescr_size(arraydescr)
+ ofs, size, sign = self.unpack_arraydescr(arraydescr)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
for TYPE, _, itemsize in unroll_basic_sizes:
@@ -340,7 +340,7 @@
raise NotImplementedError("size = %d" % size)
def bh_setarrayitem_gc_r(self, arraydescr, gcref, itemindex, newvalue):
- ofs = self.unpack_arraydescr(arraydescr)
+ ofs, size, _ = self.unpack_arraydescr(arraydescr)
self.gc_ll_descr.do_write_barrier(gcref, newvalue)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
@@ -350,7 +350,7 @@
@specialize.argtype(2)
def bh_setarrayitem_gc_f(self, arraydescr, gcref, itemindex, newvalue):
- ofs = self.unpack_arraydescr(arraydescr)
+ ofs, _, _ = self.unpack_arraydescr(arraydescr)
# --- start of GC unsafe code (no GC operation!) ---
items = rffi.ptradd(rffi.cast(rffi.CCHARP, gcref), ofs)
items = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), items)
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -2488,6 +2488,15 @@
descrfld_y,
lltype.cast_opaque_ptr(llmemory.GCREF, t))
assert llop.show_from_ptr32(lltype.Ptr(S), s.y) == t
+ #
+ A = lltype.GcArray(llmemory.HiddenGcRef32)
+ a = lltype.malloc(A, 10)
+ descrarray = cpu.arraydescrof(A)
+ a[4] = s32
+ x = cpu.bh_getarrayitem_gc_r(descrarray,
+ lltype.cast_opaque_ptr(llmemory.GCREF, a),
+ 4)
+ assert lltype.cast_opaque_ptr(lltype.Ptr(S), x) == s
class OOtypeBackendTest(BaseBackendTest):
More information about the Pypy-commit
mailing list