[pypy-svn] pypy 32ptr-on-64bit: Work in progress: support HiddenGcRef32 in some of the Descrs,

arigo commits-noreply at bitbucket.org
Thu Apr 14 22:16:15 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: 32ptr-on-64bit
Changeset: r43368:8427783c233c
Date: 2011-04-14 22:14 +0200
http://bitbucket.org/pypy/pypy/changeset/8427783c233c/

Log:	Work in progress: support HiddenGcRef32 in some of the Descrs,
	hopefully enough of them.

diff --git a/pypy/jit/backend/llsupport/descr.py b/pypy/jit/backend/llsupport/descr.py
--- a/pypy/jit/backend/llsupport/descr.py
+++ b/pypy/jit/backend/llsupport/descr.py
@@ -435,6 +435,7 @@
 def get_call_descr(gccache, ARGS, RESULT, extrainfo=None):
     arg_classes = []
     for ARG in ARGS:
+        assert ARG != llmemory.HiddenGcRef32
         kind = getkind(ARG)
         if   kind == 'int': arg_classes.append('i')
         elif kind == 'ref': arg_classes.append('r')

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -44,6 +44,8 @@
         return None
     def freeing_block(self, start, stop):
         pass
+    def is_compressed_ptr(self, size):
+        return False
 
 # ____________________________________________________________
 
@@ -576,6 +578,9 @@
         self.gcrootmap = gcrootmap
         self.gcrefs = GcRefList()
         self.single_gcref_descr = GcPtrFieldDescr('', 0)
+        self.compressptr = gcdescr.config.translation.compressptr
+        if self.compressptr:
+            assert rffi.sizeof(rffi.INT) == rffi.sizeof(llmemory.HiddenGcRef32)
 
         # make a TransformerLayoutBuilder and save it on the translator
         # where it can be fished and reused by the FrameworkGCTransformer
@@ -864,6 +869,13 @@
     def freeing_block(self, start, stop):
         self.gcrootmap.freeing_block(start, stop)
 
+    def is_compressed_ptr(self, size):
+        if self.compressptr:    # constant-folded away
+            ptrsize = symbolic.get_size_of_ptr(self.translate_support_code)
+            return size != ptrsize
+        else:
+            return False
+
 # ____________________________________________________________
 
 def get_ll_description(gcdescr, translator=None, rtyper=None):

diff --git a/pypy/jit/backend/llsupport/test/test_runner.py b/pypy/jit/backend/llsupport/test/test_runner.py
--- a/pypy/jit/backend/llsupport/test/test_runner.py
+++ b/pypy/jit/backend/llsupport/test/test_runner.py
@@ -1,4 +1,4 @@
-import py
+import py, sys
 from pypy.jit.backend.llsupport.llmodel import AbstractLLCPU
 from pypy.jit.backend.test.runner_test import LLtypeBackendTest
 
@@ -11,6 +11,11 @@
     def compile_loop(self, inputargs, operations, looptoken):
         py.test.skip("llsupport test: cannot compile operations")
 
+    class gcdescr:
+        @staticmethod
+        def is_compressed_ptr(size):
+            return sys.maxint > 2147483647 and size == 4
+
 
 class TestAbstractLLCPU(LLtypeBackendTest):
 

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
@@ -208,6 +208,11 @@
         return rffi.cast(llmemory.GCREF, x)
 
     @staticmethod
+    def _cast_hidden_int32_to_gcref(x):
+        hidden = rffi.cast(llmemory.HiddenGcRef32, x)
+        return llop.show_from_ptr32(llmemory.GCREF, hidden)
+
+    @staticmethod
     def cast_gcref_to_int(x):
         return rffi.cast(lltype.Signed, x)
 
@@ -227,16 +232,11 @@
 
     def unpack_fielddescr(self, fielddescr):
         assert isinstance(fielddescr, BaseFieldDescr)
-        return fielddescr.offset
-    unpack_fielddescr._always_inline_ = True
-
-    def unpack_fielddescr_size(self, fielddescr):
-        assert isinstance(fielddescr, BaseFieldDescr)
         ofs = fielddescr.offset
         size = fielddescr.get_field_size(self.translate_support_code)
         sign = fielddescr.is_field_signed()
         return ofs, size, sign
-    unpack_fielddescr_size._always_inline_ = True
+    unpack_fielddescr._always_inline_ = True
 
     def arraydescrof(self, A):
         return get_array_descr(self.gc_ll_descr, A)
@@ -376,7 +376,7 @@
 
     @specialize.argtype(1)
     def _base_do_getfield_i(self, struct, fielddescr):
-        ofs, size, sign = self.unpack_fielddescr_size(fielddescr)
+        ofs, size, sign = self.unpack_fielddescr(fielddescr)
         # --- start of GC unsafe code (no GC operation!) ---
         fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
         for STYPE, UTYPE, itemsize in unroll_basic_sizes:
@@ -397,17 +397,22 @@
 
     @specialize.argtype(1)
     def _base_do_getfield_r(self, struct, fielddescr):
-        ofs = self.unpack_fielddescr(fielddescr)
+        ofs, size, _ = self.unpack_fielddescr(fielddescr)
+        icp = self.gcdescr.is_compressed_ptr(size)
         # --- start of GC unsafe code (no GC operation!) ---
         fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
-        pval = rffi.cast(rffi.CArrayPtr(lltype.Signed), fieldptr)[0]
-        pval = self._cast_int_to_gcref(pval)
+        if 0:# icp:
+            pval = rffi.cast(rffi.CArrayPtr(rffi.INT), fieldptr)[0]
+            pval = self._cast_hidden_int32_to_gcref(pval)
+        else:
+            pval = rffi.cast(rffi.CArrayPtr(lltype.Signed), fieldptr)[0]
+            pval = self._cast_int_to_gcref(pval)
         # --- end of GC unsafe code ---
         return pval
 
     @specialize.argtype(1)
     def _base_do_getfield_f(self, struct, fielddescr):
-        ofs = self.unpack_fielddescr(fielddescr)
+        ofs, _, _ = self.unpack_fielddescr(fielddescr)
         # --- start of GC unsafe code (no GC operation!) ---
         fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
         fval = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), fieldptr)[0]
@@ -423,7 +428,7 @@
 
     @specialize.argtype(1)
     def _base_do_setfield_i(self, struct, fielddescr, newvalue):
-        ofs, size, sign = self.unpack_fielddescr_size(fielddescr)
+        ofs, size, sign = self.unpack_fielddescr(fielddescr)
         # --- start of GC unsafe code (no GC operation!) ---
         fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
         for TYPE, _, itemsize in unroll_basic_sizes:
@@ -437,7 +442,7 @@
 
     @specialize.argtype(1)
     def _base_do_setfield_r(self, struct, fielddescr, newvalue):
-        ofs = self.unpack_fielddescr(fielddescr)
+        ofs, _, _ = self.unpack_fielddescr(fielddescr)
         assert lltype.typeOf(struct) is not lltype.Signed, (
             "can't handle write barriers for setfield_raw")
         self.gc_ll_descr.do_write_barrier(struct, newvalue)
@@ -449,7 +454,7 @@
 
     @specialize.argtype(1)
     def _base_do_setfield_f(self, struct, fielddescr, newvalue):
-        ofs = self.unpack_fielddescr(fielddescr)
+        ofs, _, _ = self.unpack_fielddescr(fielddescr)
         # --- start of GC unsafe code (no GC operation!) ---
         fieldptr = rffi.ptradd(rffi.cast(rffi.CCHARP, struct), ofs)
         fieldptr = rffi.cast(rffi.CArrayPtr(longlong.FLOATSTORAGE), fieldptr)


More information about the Pypy-commit mailing list