[pypy-svn] r74878 - in pypy/branch/blackhole-improvement/pypy/jit: backend/llsupport backend/llsupport/test backend/x86 backend/x86/test metainterp

arigo at codespeak.net arigo at codespeak.net
Fri May 28 22:45:36 CEST 2010


Author: arigo
Date: Fri May 28 22:45:34 2010
New Revision: 74878

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/descr.py
   pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/llmodel.py
   pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/test/test_descr.py
   pypy/branch/blackhole-improvement/pypy/jit/backend/x86/assembler.py
   pypy/branch/blackhole-improvement/pypy/jit/backend/x86/runner.py
   pypy/branch/blackhole-improvement/pypy/jit/backend/x86/test/test_assembler.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py
Log:
Still in-progress...


Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/descr.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/descr.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/descr.py	Fri May 28 22:45:34 2010
@@ -190,18 +190,8 @@
     def get_extra_info(self):
         return self.extrainfo
 
-    _returns_a_pointer = False        # unless overridden by GcPtrCallDescr
-    _returns_a_float   = False        # unless overridden by FloatCallDescr
-    _returns_a_void    = False        # unless overridden by VoidCallDescr
-
-    def returns_a_pointer(self):
-        return self._returns_a_pointer
-
-    def returns_a_float(self):
-        return self._returns_a_float
-
-    def returns_a_void(self):
-        return self._returns_a_void
+    def get_return_type(self):
+        return self._return_type
 
     def get_result_size(self, translate_support_code):
         raise NotImplementedError
@@ -225,14 +215,16 @@
         seen = {'i': 0, 'r': 0, 'f': 0}
         args = ", ".join([process(c) for c in self.arg_classes])
 
-        if self.returns_a_pointer():
+        if self.get_return_type() == history.INT:
+            result = 'rffi.cast(lltype.Signed, res)'
+        elif self.get_return_type() == history.REF:
             result = 'lltype.cast_opaque_ptr(llmemory.GCREF, res)'
-        elif self.returns_a_float():
+        elif self.get_return_type() == history.FLOAT:
             result = 'res'
-        elif self.returns_a_void():
+        elif self.get_return_type() == history.VOID:
             result = 'None'
         else:
-            result = 'rffi.cast(lltype.Signed, res)'
+            assert 0
         source = py.code.Source("""
         def call_stub(func, args_i, args_r, args_f):
             fnptr = rffi.cast(lltype.Ptr(FUNC), func)
@@ -247,9 +239,7 @@
         self.call_stub = d['call_stub']
 
     def verify_types(self, args_i, args_r, args_f, return_type):
-        assert self._returns_a_pointer == (return_type == 'ref')
-        assert self._returns_a_float   == (return_type == 'float')
-        assert self._returns_a_void    == (return_type == 'void')
+        assert self._return_type == return_type
         assert self.arg_classes.count('i') == len(args_i or ())
         assert self.arg_classes.count('r') == len(args_r or ())
         assert self.arg_classes.count('f') == len(args_f or ())
@@ -268,7 +258,7 @@
     #
     # The purpose of BaseIntCallDescr is to be the parent of all classes
     # in which 'call_stub' has a return kind of 'int'.
-    pass
+    _return_type = history.INT
 
 class NonGcPtrCallDescr(BaseIntCallDescr):
     _clsname = 'NonGcPtrCallDescr'
@@ -277,19 +267,19 @@
 
 class GcPtrCallDescr(BaseCallDescr):
     _clsname = 'GcPtrCallDescr'
-    _returns_a_pointer = True
+    _return_type = history.REF
     def get_result_size(self, translate_support_code):
         return symbolic.get_size_of_ptr(translate_support_code)
 
 class FloatCallDescr(BaseCallDescr):
     _clsname = 'FloatCallDescr'
-    _returns_a_float = True
+    _return_type = history.FLOAT
     def get_result_size(self, translate_support_code):
         return symbolic.get_size(lltype.Float, translate_support_code)
 
 class VoidCallDescr(BaseCallDescr):
     _clsname = 'VoidCallDescr'
-    _returns_a_void = True
+    _return_type = history.VOID
     def get_result_size(self, translate_support_code):
         return 0
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/llmodel.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/llmodel.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/llmodel.py	Fri May 28 22:45:34 2010
@@ -6,6 +6,7 @@
 from pypy.rlib.objectmodel import we_are_translated, specialize
 from pypy.jit.metainterp.history import BoxInt, BoxPtr, set_future_values,\
      BoxFloat
+from pypy.jit.metainterp import history
 from pypy.jit.backend.model import AbstractCPU
 from pypy.jit.backend.llsupport import symbolic
 from pypy.jit.backend.llsupport.symbolic import WORD, unroll_basic_sizes
@@ -440,25 +441,25 @@
     def bh_call_i(self, func, calldescr, args_i, args_r, args_f):
         assert isinstance(calldescr, BaseIntCallDescr)
         if not we_are_translated():
-            calldescr.verify_types(args_i, args_r, args_f, 'int')
+            calldescr.verify_types(args_i, args_r, args_f, history.INT)
         return calldescr.call_stub(func, args_i, args_r, args_f)
 
     def bh_call_r(self, func, calldescr, args_i, args_r, args_f):
         assert isinstance(calldescr, GcPtrCallDescr)
         if not we_are_translated():
-            calldescr.verify_types(args_i, args_r, args_f, 'ref')
+            calldescr.verify_types(args_i, args_r, args_f, history.REF)
         return calldescr.call_stub(func, args_i, args_r, args_f)
 
     def bh_call_f(self, func, calldescr, args_i, args_r, args_f):
         assert isinstance(calldescr, FloatCallDescr)
         if not we_are_translated():
-            calldescr.verify_types(args_i, args_r, args_f, 'float')
+            calldescr.verify_types(args_i, args_r, args_f, history.FLOAT)
         return calldescr.call_stub(func, args_i, args_r, args_f)
 
     def bh_call_v(self, func, calldescr, args_i, args_r, args_f):
         assert isinstance(calldescr, VoidCallDescr)
         if not we_are_translated():
-            calldescr.verify_types(args_i, args_r, args_f, 'void')
+            calldescr.verify_types(args_i, args_r, args_f, history.VOID)
         return calldescr.call_stub(func, args_i, args_r, args_f)
 
     def bh_cast_ptr_to_int(self, ptr):

Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/test/test_descr.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/test/test_descr.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llsupport/test/test_descr.py	Fri May 28 22:45:34 2010
@@ -4,6 +4,7 @@
 from pypy.rlib.objectmodel import Symbolic
 from pypy.rpython.annlowlevel import llhelper
 from pypy.jit.metainterp.history import BoxInt, BoxFloat, BoxPtr
+from pypy.jit.metainterp import history
 
 def test_get_size_descr():
     c0 = GcCache(False)
@@ -145,31 +146,28 @@
     c0 = GcCache(False)
     descr1 = get_call_descr(c0, [lltype.Char, lltype.Signed], lltype.Char)
     assert descr1.get_result_size(False) == rffi.sizeof(lltype.Char)
-    assert not descr1.returns_a_pointer()
-    assert not descr1.returns_a_float()
+    assert descr1.get_return_type() == history.INT
     assert descr1.arg_classes == "ii"
     #
     T = lltype.GcStruct('T')
     descr2 = get_call_descr(c0, [lltype.Ptr(T)], lltype.Ptr(T))
     assert descr2.get_result_size(False) == rffi.sizeof(lltype.Ptr(T))
-    assert descr2.returns_a_pointer()
-    assert not descr2.returns_a_float()
-    assert not descr2.returns_a_void()
+    assert descr2.get_return_type() == history.REF
     assert descr2.arg_classes == "r"
     #
     U = lltype.GcStruct('U', ('x', lltype.Signed))
     assert descr2 == get_call_descr(c0, [lltype.Ptr(U)], lltype.Ptr(U))
     #
     V = lltype.Struct('V', ('x', lltype.Signed))
-    assert not get_call_descr(c0, [], lltype.Ptr(V)).returns_a_pointer()
+    assert (get_call_descr(c0, [], lltype.Ptr(V)).get_return_type() ==
+            history.INT)
     #
-    assert get_call_descr(c0, [], lltype.Void).returns_a_void()
+    assert (get_call_descr(c0, [], lltype.Void).get_return_type() ==
+            history.VOID)
     #
     descr4 = get_call_descr(c0, [lltype.Float, lltype.Float], lltype.Float)
     assert descr4.get_result_size(False) == rffi.sizeof(lltype.Float)
-    assert not descr4.returns_a_pointer()
-    assert descr4.returns_a_float()
-    assert not descr4.returns_a_void()
+    assert descr4.get_return_type() == history.FLOAT
     assert descr4.arg_classes == "ff"
 
 def test_get_call_descr_translated():
@@ -178,14 +176,12 @@
     U = lltype.GcStruct('U', ('x', lltype.Signed))
     descr3 = get_call_descr(c1, [lltype.Ptr(T)], lltype.Ptr(U))
     assert isinstance(descr3.get_result_size(True), Symbolic)
-    assert descr3.returns_a_pointer()
-    assert not descr3.returns_a_float()
+    assert descr3.get_return_type() == history.REF
     assert descr3.arg_classes == "r"
     #
     descr4 = get_call_descr(c1, [lltype.Float, lltype.Float], lltype.Float)
     assert isinstance(descr4.get_result_size(True), Symbolic)
-    assert not descr4.returns_a_pointer()
-    assert descr4.returns_a_float()
+    assert descr4.get_return_type() == history.FLOAT
     assert descr4.arg_classes == "ff"
 
 def test_call_descr_extra_info():

Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/x86/assembler.py	Fri May 28 22:45:34 2010
@@ -1188,6 +1188,7 @@
         #
         if not we_are_translated():
             assert bytecode[4] == 0xCC
+        self.fail_boxes_count = num
         fail_index = rffi.cast(rffi.LONGP, bytecode)[0]
         return fail_index
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/x86/runner.py	Fri May 28 22:45:34 2010
@@ -73,7 +73,7 @@
         return self.assembler.fail_boxes_ptr.getitem(index)
 
     def get_latest_value_count(self):
-        XXX
+        return self.assembler.fail_boxes_count
 
     def clear_latest_values(self, count):
         setitem = self.assembler.fail_boxes_ptr.setitem

Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/x86/test/test_assembler.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/x86/test/test_assembler.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/x86/test/test_assembler.py	Fri May 28 22:45:34 2010
@@ -75,35 +75,6 @@
     assert ([loc.assembler() for loc in newlocs] ==
             [loc.assembler() for loc in locs if loc is not None])
 
-    # finally, test make_boxes_from_latest_values(), which should
-    # reproduce the holes
-    expected_classes = [BoxInt, BoxPtr, BoxFloat,
-                        BoxInt, BoxPtr, BoxFloat,
-                        type(None), type(None),
-                        BoxInt, BoxPtr, BoxFloat]
-    ptrvalues = {}
-    S = lltype.GcStruct('S')
-    for i, cls in enumerate(expected_classes):
-        if cls == BoxInt:
-            assembler.fail_boxes_int.setitem(i, 1000 + i)
-        elif cls == BoxPtr:
-            s = lltype.malloc(S)
-            s_ref = lltype.cast_opaque_ptr(llmemory.GCREF, s)
-            ptrvalues[i] = s_ref
-            assembler.fail_boxes_ptr.setitem(i, s_ref)
-        elif cls == BoxFloat:
-            assembler.fail_boxes_float.setitem(i, 42.5 + i)
-    boxes = assembler.make_boxes_from_latest_values(bytecode_addr)
-    assert len(boxes) == len(locs) == len(expected_classes)
-    for i, (box, expected_class) in enumerate(zip(boxes, expected_classes)):
-        assert type(box) is expected_class
-        if expected_class == BoxInt:
-            assert box.value == 1000 + i
-        elif expected_class == BoxPtr:
-            assert box.value == ptrvalues[i]
-        elif expected_class == BoxFloat:
-            assert box.value == 42.5 + i
-
 # ____________________________________________________________
 
 def test_failure_recovery_func_no_floats():

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py	Fri May 28 22:45:34 2010
@@ -8,7 +8,7 @@
 from pypy.rlib.rarithmetic import ovfcheck, r_uint, intmask
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.jit.metainterp.history import BoxInt, BoxPtr, BoxFloat, check_descr
-from pypy.jit.metainterp.history import INT, REF, FLOAT, AbstractDescr
+from pypy.jit.metainterp.history import INT, REF, FLOAT, VOID, AbstractDescr
 from pypy.jit.metainterp import resoperation
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.metainterp.blackhole import BlackholeInterpreter, NULL
@@ -75,7 +75,7 @@
         else:
             metainterp.execute_did_not_raise()
         return BoxFloat(result)
-    if rettype == 'v':   # void
+    if rettype == VOID:
         try:
             cpu.bh_call_v(func, descr, args_i, args_r, args_f)
         except Exception, e:

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py	Fri May 28 22:45:34 2010
@@ -16,6 +16,7 @@
 REF   = 'r'
 FLOAT = 'f'
 HOLE  = '_'
+VOID  = 'v'
 
 FAILARGS_LIMIT = 1000
 



More information about the Pypy-commit mailing list