[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