[pypy-svn] r74047 - in pypy/branch/blackhole-improvement/pypy/jit: backend backend/llgraph codewriter metainterp

arigo at codespeak.net arigo at codespeak.net
Sun Apr 25 10:55:43 CEST 2010


Author: arigo
Date: Sun Apr 25 10:55:41 2010
New Revision: 74047

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
   pypy/branch/blackhole-improvement/pypy/jit/backend/model.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/regalloc.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
Log:
test_basic.test_format passes.


Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py	Sun Apr 25 10:55:41 2010
@@ -422,6 +422,10 @@
         count = countbox.getint()
         return history.BoxPtr(llimpl.do_new_array(size.ofs, count))
 
+    def bh_new_array(self, arraydescr, length):
+        assert isinstance(arraydescr, Descr)
+        return llimpl.do_new_array(arraydescr.ofs, length)
+
     def do_setarrayitem_gc(self, arraybox, indexbox, newvaluebox, arraydescr):
         assert isinstance(arraydescr, Descr)
         array = arraybox.getref_base()
@@ -439,6 +443,10 @@
         else:
             raise NotImplementedError
 
+    def bh_setarrayitem_gc_r(self, arraydescr, array, index, newvalue):
+        assert isinstance(arraydescr, Descr)
+        llimpl.do_setarrayitem_gc_ptr(array, index, newvalue)
+
     def do_setfield_gc(self, structbox, newvaluebox, fielddescr):
         assert isinstance(fielddescr, Descr)
         struct = structbox.getref_base()

Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/model.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/model.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/model.py	Sun Apr 25 10:55:41 2010
@@ -192,13 +192,23 @@
 
     def do_new_with_vtable(self, classbox):
         raise NotImplementedError
-    
+
     def do_new_array(self, lengthbox, arraydescr):
         raise NotImplementedError
+
+    def bh_new_array(self, arraydescr, length):
+        raise NotImplementedError
     
     def do_setarrayitem_gc(self, arraybox, indexbox, newvaluebox, arraydescr):
         raise NotImplementedError
 
+    def bh_setarrayitem_gc_i(self, arraydescr, array, index, newvalue):
+        raise NotImplementedError
+    def bh_setarrayitem_gc_r(self, arraydescr, array, index, newvalue):
+        raise NotImplementedError
+    def bh_setarrayitem_gc_f(self, arraydescr, array, index, newvalue):
+        raise NotImplementedError
+
     def do_setarrayitem_raw(self, arraybox, indexbox, newvaluebox, arraydescr):
         raise NotImplementedError
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py	Sun Apr 25 10:55:41 2010
@@ -19,14 +19,35 @@
         return self.transform_graph_to_jitcode(graph)
 
     def transform_graph_to_jitcode(self, graph, verbose=False):
+        """Transform a graph into a JitCode containing the same bytecode
+        in a different format.  Note that the original 'graph' is mangled
+        by the process and should not be used any more.
+        """
+        #
+        # step 1: mangle the graph so that it contains the final instructions
+        # that we want in the JitCode, but still as a control flow graph
         transform_graph(graph, self.cpu)
+        #
+        # step 2: perform register allocation on it
         regallocs = {}
         for kind in KINDS:
             regallocs[kind] = perform_register_allocation(graph, kind)
+        #
+        # step 3: flatten the graph to produce human-readable "assembler",
+        # which means mostly producing a linear list of operations and
+        # inserting jumps or conditional jumps.  This is a list of tuples
+        # of the shape ("opname", arg1, ..., argN) or (Label(...),).
         ssarepr = flatten_graph(graph, regallocs)
+        #
+        # if 'verbose', print the resulting assembler
         if verbose:
             print graph
             print indent(format_assembler(ssarepr), 4)
+        #
+        # step 4: "assemble" it into a JitCode, which contains a sequence
+        # of bytes and lists of constants.  It's during this step that
+        # constants are cast to their normalized type (Signed, GCREF or
+        # Float).
         jitcode = self.assembler.assemble(ssarepr)
         return jitcode
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py	Sun Apr 25 10:55:41 2010
@@ -1,4 +1,4 @@
-from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.lltypesystem import lltype, rstr
 from pypy.jit.metainterp.history import getkind
 from pypy.objspace.flow.model import SpaceOperation
 from pypy.jit.codewriter.flatten import ListOfKind
@@ -119,8 +119,7 @@
         hints = op.args[1].value
         if hints.get('promote') and op.args[0].concretetype is not lltype.Void:
             #self.minimize_variables()
-            from pypy.rpython.lltypesystem.rstr import STR
-            assert op.args[0].concretetype != lltype.Ptr(STR)
+            assert op.args[0].concretetype != lltype.Ptr(rstr.STR)
             kind = getkind(op.args[0].concretetype)
             return SpaceOperation('%s_guard_value' % kind,
                                   [op.args[0]], op.result)
@@ -128,6 +127,43 @@
             log.WARNING('ignoring hint %r at %r' % (hints, self.graph))
             raise NoOp
 
+    def rewrite_op_malloc_varsize(self, op):
+        assert op.args[1].value == {'flavor': 'gc'}
+        if op.args[0].value == rstr.STR:
+            return SpaceOperation('newstr', [op.args[2]], op.result)
+        elif op.args[0].value == rstr.UNICODE:
+            return SpaceOperation('newunicode', [op.args[2]], op.result)
+        else:
+            # XXX only strings or simple arrays for now
+            ARRAY = op.args[0].value
+            arraydescr = self.cpu.arraydescrof(ARRAY)
+            return SpaceOperation('new_array', [arraydescr, op.args[2]],
+                                  op.result)
+
+    def rewrite_op_setarrayitem(self, op):
+        ARRAY = op.args[0].concretetype.TO
+        assert ARRAY._gckind == 'gc'
+        if self._array_of_voids(ARRAY):
+            return
+##        if op.args[0] in self.vable_array_vars:     # for virtualizables
+##            (v_base, arrayindex) = self.vable_array_vars[op.args[0]]
+##            self.emit('setarrayitem_vable',
+##                      self.var_position(v_base),
+##                      arrayindex,
+##                      self.var_position(op.args[1]),
+##                      self.var_position(op.args[2]))
+##            return
+        arraydescr = self.cpu.arraydescrof(ARRAY)
+        kind = getkind(op.args[2].concretetype)
+        return SpaceOperation('setarrayitem_gc_%s' % kind[0],
+                              [arraydescr] + op.args, None)
+
+    def _array_of_voids(self, ARRAY):
+        #if isinstance(ARRAY, ootype.Array):
+        #    return ARRAY.ITEM == ootype.Void
+        #else:
+        return ARRAY.OF == lltype.Void
+
 # ____________________________________________________________
 
 _rewrite_ops = {}

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/regalloc.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/regalloc.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/regalloc.py	Sun Apr 25 10:55:41 2010
@@ -62,7 +62,8 @@
                     except KeyError:
                         pass
                     die_index += 1
-                if getkind(op.result.concretetype) == self.kind:
+                if (op.result is not None and
+                    getkind(op.result.concretetype) == self.kind):
                     dg.add_node(op.result)
                     for v in livevars:
                         if getkind(v.concretetype) == self.kind:

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py	Sun Apr 25 10:55:41 2010
@@ -75,15 +75,20 @@
             args = ()
             next_argcode = 0
             for argtype in argtypes:
-                if argtype == 'i':
-                    # argcode can be 'i' or 'c'; 'c' stands for a single
-                    # signed byte that gives the value of a small constant.
+                if argtype == 'i' or argtype == 'r' or argtype == 'f':
+                    # if argtype is 'i', then argcode can be 'i' or 'c';
+                    # 'c' stands for a single signed byte that gives the
+                    # value of a small constant.
                     argcode = argcodes[next_argcode]
                     next_argcode = next_argcode + 1
                     if argcode == 'i':
                         value = self.registers_i[ord(code[position])]
                     elif argcode == 'c':
                         value = signedord(code[position])
+                    elif argcode == 'r':
+                        value = self.registers_r[ord(code[position])]
+                    elif argcode == 'f':
+                        value = self.registers_f[ord(code[position])]
                     else:
                         raise AssertionError("bad argcode")
                     position += 1
@@ -289,6 +294,9 @@
     def opimpl_goto(self, target):
         return target
 
+    # ----------
+    # the following operations are directly implemented by the backend
+
     @arguments("i", "d", "R", returns="i")
     def opimpl_residual_call_r_i(self, func, calldescr, args_r):
         return self.cpu.bh_call_i(func, calldescr, None, args_r, None)
@@ -327,3 +335,10 @@
     @arguments("i", "d", "I", "R", "F", returns="v")
     def opimpl_residual_call_irf_v(self, func, calldescr,args_i,args_r,args_f):
         return self.cpu.bh_call_v(func, calldescr, args_i, args_r, args_f)
+
+    @arguments("d", "i", returns="r")
+    def opimpl_new_array(self, arraydescr, length):
+        return self.cpu.bh_new_array(arraydescr, length)
+    @arguments("d", "r", "i", "r")
+    def opimpl_setarrayitem_gc_r(self, arraydescr, array, index, newvalue):
+        self.cpu.bh_setarrayitem_gc_r(arraydescr, array, index, newvalue)



More information about the Pypy-commit mailing list