[pypy-svn] pypy 32ptr-on-64bit: Finish call descrs.
arigo
commits-noreply at bitbucket.org
Sat Apr 16 22:11:56 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: 32ptr-on-64bit
Changeset: r43405:ac4ae9746e4e
Date: 2011-04-16 10:13 -0700
http://bitbucket.org/pypy/pypy/changeset/ac4ae9746e4e/
Log: Finish call descrs.
diff --git a/pypy/jit/backend/llsupport/test/test_descr.py b/pypy/jit/backend/llsupport/test/test_descr.py
--- a/pypy/jit/backend/llsupport/test/test_descr.py
+++ b/pypy/jit/backend/llsupport/test/test_descr.py
@@ -346,6 +346,23 @@
descr1 = get_call_descr(c2, [], RESTYPE)
assert descr1.is_result_signed() == signed
+def test_call_descr_hiddengcref32():
+ if sys.maxint == 2147483647:
+ py.test.skip("HiddenGcRef32: for 64-bit only")
+ for tsc in [False, True]:
+ c0 = GcCache(tsc)
+ descr = get_call_descr(c0, [llmemory.HiddenGcRef32], lltype.Void)
+ assert descr.get_arg_types() == 'H'
+ #
+ descr = get_call_descr(c0, [], llmemory.HiddenGcRef32)
+ assert descr.get_return_type() == 'H'
+ sz = descr.get_result_size(tsc)
+ if not tsc:
+ assert sz == 4
+ else:
+ assert isinstance(sz, Symbolic)
+ assert sz.TYPE == llmemory.HiddenGcRef32
+
def test_repr_of_descr():
c0 = GcCache(False)
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
@@ -332,6 +332,8 @@
result = 'rffi.cast(lltype.SignedLongLong, res)'
elif self.get_return_type() == history.VOID:
result = 'None'
+ elif self.get_return_type() == 'H':
+ result = 'llop.show_from_ptr32(llmemory.GCREF, res)'
else:
assert 0
source = py.code.Source("""
@@ -409,6 +411,12 @@
def get_result_size(self, translate_support_code):
return symbolic.get_size_of_ptr(translate_support_code)
+class GcPtrHidden32CallDescr(BaseCallDescr):
+ _clsname = 'GcPtrHidden32CallDescr'
+ _return_type = 'H'
+ def get_result_size(self, translate_support_code):
+ return symbolic.get_size(llmemory.HiddenGcRef32,translate_support_code)
+
class FloatCallDescr(BaseCallDescr):
_clsname = 'FloatCallDescr'
_return_type = history.FLOAT
@@ -437,7 +445,8 @@
return getDescrClass(RESULT, BaseIntCallDescr, GcPtrCallDescr,
NonGcPtrCallDescr, 'Call', 'get_result_size',
Ellipsis, # <= floatattrname should not be used here
- '_is_result_signed')
+ '_is_result_signed',
+ GcPtrHidden32CallDescr)
def get_call_descr(gccache, ARGS, RESULT, extrainfo=None):
arg_classes = []
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,7 +44,8 @@
if (isinstance(op.getdescr(), GcPtrHidden32FieldDescr) or
isinstance(op.getdescr(), GcPtrHidden32ArrayDescr) or
(isinstance(op.getdescr(), BaseCallDescr) and
- 'H' in op.getdescr().get_arg_types())):
+ ('H' in op.getdescr().get_arg_types() or
+ op.getdescr().get_return_type() == 'H'))):
from pypy.jit.metainterp.test.support import SkipThisRun
raise SkipThisRun("non-translated test with compressptr")
def can_inline_malloc(self, descr):
@@ -885,6 +886,11 @@
[v1], v2))
args[i] = v2
op = op.copy_and_change(op.getopnum(), args=args)
+ if descr.get_return_type() == 'H':
+ v1 = BoxInt()
+ v2 = op.result
+ newops.append(op.copy_and_change(op.getopnum(), result=v1))
+ op = ResOperation(rop.SHOW_FROM_PTR32, [v1], v2)
# ----------
newops.append(op)
del operations[:]
More information about the Pypy-commit
mailing list