[pypy-svn] r51128 - in pypy/branch/jit-refactoring/pypy/jit/rainbow: . test

cfbolz at codespeak.net cfbolz at codespeak.net
Wed Jan 30 15:15:27 CET 2008


Author: cfbolz
Date: Wed Jan 30 15:15:26 2008
New Revision: 51128

Modified:
   pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py
   pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py
Log:
adding switches


Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/bytecode.py	Wed Jan 30 15:15:26 2008
@@ -87,10 +87,10 @@
     def opimpl_goto(self):
         XXX
 
-    def opimpl_goto_green_iftrue(self):
+    def opimpl_green_goto_iftrue(self):
         XXX
 
-    def opimpl_goto_red_iftrue(self):
+    def opimpl_red_goto_iftrue(self):
         XXX
 
     def opimpl_red_return(self):
@@ -124,6 +124,7 @@
         self.constants = []
         self.const_positions = {}
         self.block_positions = {}
+        self.additional_positions = {}
         self.graph = graph
         self.entrymap = flowmodel.mkentrymap(graph)
         self.make_bytecode_block(graph.startblock)
@@ -156,26 +157,41 @@
     def insert_exits(self, block):
         if block.exits == ():
             returnvar, = block.inputargs
-            if self.hannotator.binding(returnvar).is_green():
-                color = "green"
-            else:
-                color = "red"
+            color = self.varcolor(returnvar)
+            index = self.serialize_oparg(color, returnvar)
             self.emit_2byte(self.interpreter.find_opcode("%s_return" % color))
-            self.emit_2byte(self.serialize_oparg(color, returnvar))
+            self.emit_2byte(index)
         elif len(block.exits) == 1:
             link, = block.exits
             self.insert_renaming(link.args)
             self.make_bytecode_block(link.target, insert_goto=True)
+        elif len(block.exits) == 2:
+            linkfalse, linktrue = block.exits
+            if linkfalse.llexitcase == True:
+                linkfalse, linktrue = linktrue, linkfalse
+            color = self.varcolor(block.exitswitch)
+            index = self.serialize_oparg(color, block.exitswitch)
+            self.emit_2byte(self.interpreter.find_opcode("%s_goto_iftrue" % color))
+            self.emit_2byte(index)
+            self.emit_jumptarget(linktrue)
+            self.insert_renaming(linkfalse.args)
+            self.make_bytecode_block(linkfalse.target, insert_goto=True)
+            self.additional_positions[linktrue] = len(self.bytecode)
+            self.insert_renaming(linktrue.args)
+            self.emit_2byte(self.interpreter.find_opcode("goto"))
+            self.emit_jumptarget(linktrue.target)
         else:
             XXX
 
     def patch_jumps(self):
         for i in range(len(self.bytecode)):
+            byte = self.bytecode[i]
             if isinstance(self.bytecode[i], str):
                 continue
-            assert 0
-            # must be a block
-            index = self.block_positions[self.bytecode[i]]
+            if byte in self.block_positions:
+                index = self.block_positions[byte]
+            else:
+                index = self.additional_positions[byte]
             self.bytecode[i + 0] = chr((index >> 24) & 0xff)
             self.bytecode[i + 1] = chr((index >> 16) & 0xff)
             self.bytecode[i + 2] = chr((index >>  8) & 0xff)
@@ -245,6 +261,13 @@
         if not self.hannotator.binding(op.result).is_green():
             return "red"
         return "green"
+
+    def varcolor(self, var):
+        if self.hannotator.binding(var).is_green():
+            color = "green"
+        else:
+            color = "red"
+        return color
         
     def redvar_position(self, arg):
         return self.redvar_positions.setdefault(

Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py	(original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_serializegraph.py	Wed Jan 30 15:15:26 2008
@@ -62,11 +62,39 @@
                                     "make_new_greenvars", 0,
                                     "red_return", 0)
 
-
-
+    def test_switch(self):
+        def f(x, y, z):
+            if x:
+                return y
+            else:
+                return z
+        writer, jitcode = self.serialize(f, [int, int, int])
+        expected = code(writer.interpreter,
+                        "red_int_is_true", 0,
+                        "red_goto_iftrue", 3, tlabel("true"),
+                        "make_new_redvars", 1, 2,
+                        "make_new_greenvars", 0,
+                        label("return"),
+                        "red_return", 0,
+                        label("true"),
+                        "make_new_redvars", 1, 1,
+                        "make_new_greenvars", 0,
+                        "goto", tlabel("return"),
+                        )
+        assert jitcode.code == expected
+
+
+class label(object):
+    def __init__(self, name):
+        self.name = name
+
+class tlabel(object):
+    def __init__(self, name):
+        self.name = name
 
 def code(interpreter, *args):
     result = []
+    labelpos = {}
     def emit_2byte(index):
         result.append(chr((index >> 8) & 0xff))
         result.append(chr(index & 0xff))
@@ -75,8 +103,20 @@
             emit_2byte(interpreter.find_opcode(arg))
         elif isinstance(arg, int):
             emit_2byte(arg)
+        elif isinstance(arg, label):
+            labelpos[arg.name] = len(result)
+        elif isinstance(arg, tlabel):
+            result.extend((arg, None, None, None))
         else:
             XXX
+    for i in range(len(result)):
+        b = result[i]
+        if isinstance(b, tlabel):
+            index = labelpos[b.name]
+            result[i + 0] = chr((index >> 24) & 0xff)
+            result[i + 1] = chr((index >> 16) & 0xff)
+            result[i + 2] = chr((index >>  8) & 0xff)
+            result[i + 3] = chr(index & 0xff)
     return "".join(result)
 
 



More information about the Pypy-commit mailing list