[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