[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