[pypy-svn] r78066 - pypy/branch/jit-sign-descr/pypy/jit/backend/llsupport
arigo at codespeak.net
arigo at codespeak.net
Mon Oct 18 19:22:38 CEST 2010
Author: arigo
Date: Mon Oct 18 19:22:37 2010
New Revision: 78066
Modified:
pypy/branch/jit-sign-descr/pypy/jit/backend/llsupport/descr.py
Log:
Implement the sign flag in the descrs.
Modified: pypy/branch/jit-sign-descr/pypy/jit/backend/llsupport/descr.py
==============================================================================
--- pypy/branch/jit-sign-descr/pypy/jit/backend/llsupport/descr.py (original)
+++ pypy/branch/jit-sign-descr/pypy/jit/backend/llsupport/descr.py Mon Oct 18 19:22:37 2010
@@ -82,6 +82,7 @@
_is_pointer_field = False # unless overridden by GcPtrFieldDescr
_is_float_field = False # unless overridden by FloatFieldDescr
+ _is_field_signed = False # unless overridden by XxxFieldDescr
def is_pointer_field(self):
return self._is_pointer_field
@@ -89,6 +90,9 @@
def is_float_field(self):
return self._is_float_field
+ def is_field_signed(self):
+ return self._is_field_signed
+
def repr_of_descr(self):
return '<%s %s %s>' % (self._clsname, self.name, self.offset)
@@ -105,7 +109,7 @@
def getFieldDescrClass(TYPE):
return getDescrClass(TYPE, BaseFieldDescr, GcPtrFieldDescr,
NonGcPtrFieldDescr, 'Field', 'get_field_size',
- '_is_float_field')
+ '_is_float_field', '_is_field_signed')
def get_field_descr(gccache, STRUCT, fieldname):
cache = gccache._cache_field
@@ -144,6 +148,7 @@
_is_array_of_pointers = False # unless overridden by GcPtrArrayDescr
_is_array_of_floats = False # unless overridden by FloatArrayDescr
+ _is_item_signed = False # unless overridden by XxxArrayDescr
def is_array_of_pointers(self):
return self._is_array_of_pointers
@@ -151,6 +156,9 @@
def is_array_of_floats(self):
return self._is_array_of_floats
+ def is_item_signed(self):
+ return self._is_item_signed
+
def repr_of_descr(self):
return '<%s>' % self._clsname
@@ -186,12 +194,12 @@
def getArrayDescrClass(ARRAY):
return getDescrClass(ARRAY.OF, BaseArrayDescr, GcPtrArrayDescr,
NonGcPtrArrayDescr, 'Array', 'get_item_size',
- '_is_array_of_floats')
+ '_is_array_of_floats', '_is_item_signed')
def getArrayNoLengthDescrClass(ARRAY):
return getDescrClass(ARRAY.OF, BaseArrayNoLengthDescr, GcPtrArrayNoLengthDescr,
NonGcPtrArrayNoLengthDescr, 'ArrayNoLength', 'get_item_size',
- '_is_array_of_floats')
+ '_is_array_of_floats', '_is_item_signed')
def get_array_descr(gccache, ARRAY):
cache = gccache._cache_array
@@ -242,6 +250,9 @@
def get_result_size(self, translate_support_code):
raise NotImplementedError
+ def is_result_signed(self):
+ return False # unless overridden
+
def create_call_stub(self, rtyper, RESULT):
def process(c):
arg = 'args_%s[%d]' % (c, seen[c])
@@ -307,6 +318,10 @@
_return_type = history.INT
call_stub = staticmethod(lambda func, args_i, args_r, args_f: 0)
+ _is_result_signed = False # can be overridden in XxxCallDescr
+ def is_result_signed(self):
+ return self._is_result_signed
+
class DynamicIntCallDescr(BaseIntCallDescr):
"""
calldescr that works for every integer type, by explicitly passing it the
@@ -314,12 +329,17 @@
"""
_clsname = 'DynamicIntCallDescr'
- def __init__(self, arg_classes, result_size, extrainfo=None):
+ def __init__(self, arg_classes, result_size, result_sign, extrainfo=None):
BaseIntCallDescr.__init__(self, arg_classes, extrainfo)
- self._result_size = result_size
+ assert isinstance(result_sign, bool)
+ self._result_size = chr(result_size)
+ self._result_sign = result_sign
def get_result_size(self, translate_support_code):
- return self._result_size
+ return ord(self._result_size)
+
+ def is_result_signed(self):
+ return self._result_sign
class NonGcPtrCallDescr(BaseIntCallDescr):
@@ -356,7 +376,8 @@
return FloatCallDescr
return getDescrClass(RESULT, BaseIntCallDescr, GcPtrCallDescr,
NonGcPtrCallDescr, 'Call', 'get_result_size',
- Ellipsis) # <= floatattrname should not be used here
+ Ellipsis, # <= floatattrname should not be used here
+ '_is_result_signed')
def get_call_descr(gccache, ARGS, RESULT, extrainfo=None):
arg_classes = []
@@ -383,7 +404,8 @@
# ____________________________________________________________
def getDescrClass(TYPE, BaseDescr, GcPtrDescr, NonGcPtrDescr,
- nameprefix, methodname, floatattrname, _cache={}):
+ nameprefix, methodname, floatattrname, signedattrname,
+ _cache={}):
if isinstance(TYPE, lltype.Ptr):
if TYPE.TO._gckind == 'gc':
return GcPtrDescr
@@ -403,6 +425,8 @@
#
if TYPE is lltype.Float:
setattr(Descr, floatattrname, True)
+ elif rffi.cast(TYPE, -1) == -1:
+ setattr(Descr, signedattrname, True)
#
_cache[nameprefix, TYPE] = Descr
return Descr
More information about the Pypy-commit
mailing list