[pypy-svn] r73901 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test

arigo at codespeak.net arigo at codespeak.net
Tue Apr 20 12:03:34 CEST 2010


Author: arigo
Date: Tue Apr 20 12:03:33 2010
New Revision: 73901

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/assembler.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_assembler.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_format.py
Log:
Finish the basic of the "assembler" pass.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/assembler.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/assembler.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/assembler.py	Tue Apr 20 12:03:33 2010
@@ -1,4 +1,7 @@
 from pypy.jit.metainterp import history
+from pypy.jit.codewriter.flatten import Register, Label, TLabel
+from pypy.objspace.flow.model import Constant
+from pypy.jit.metainterp.history import ConstInt
 
 
 class JitCode(history.AbstractValue):
@@ -15,3 +18,61 @@
     def setup(self, code, constants):
         self.code = code
         self.constants = constants or self.empty_list    # share the empty list
+
+
+class Assembler(object):
+
+    def __init__(self):
+        self.insns = {}
+
+    def assemble(self, ssarepr):
+        code = []
+        constants_dict = {}
+        constants_rev = []
+        label_positions = {}
+        tlabel_positions = []
+        for insn in ssarepr.insns:
+            if isinstance(insn[0], Label):
+                label_positions[insn[0].name] = len(code)
+                continue
+            startposition = len(code)
+            code.append("temporary placeholder")
+            #
+            argcodes = []
+            for x in insn[1:]:
+                if isinstance(x, Register):
+                    code.append(chr(x.index))
+                    argcodes.append('i')
+                elif isinstance(x, Constant):
+                    if -128 <= x.value <= 127:
+                        code.append(chr(x.value & 0xFF))
+                        argcodes.append('c')
+                    else:
+                        if x not in constants_dict:
+                            constants_rev.append(ConstInt(x.value))
+                            constants_dict[x] = 256 - len(constants_rev)
+                        code.append(chr(constants_dict[x]))
+                        argcodes.append('i')
+                elif isinstance(x, TLabel):
+                    tlabel_positions.append((x.name, len(code)))
+                    code.append("temp 1")
+                    code.append("temp 2")
+                    argcodes.append('L')
+                else:
+                    raise NotImplementedError(x)
+            #
+            key = insn[0] + '/' + ''.join(argcodes)
+            num = self.insns.setdefault(key, len(self.insns))
+            code[startposition] = chr(num)
+        #
+        for name, pos in tlabel_positions:
+            assert code[pos  ] == "temp 1"
+            assert code[pos+1] == "temp 2"
+            target = label_positions[name]
+            assert 0 <= target <= 0xFFFF
+            code[pos  ] = chr(target & 0xFF)
+            code[pos+1] = chr(target >> 8)
+        #
+        jitcode = JitCode(ssarepr.name)
+        jitcode.setup(''.join(code), constants_rev[::-1])
+        return jitcode

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py	Tue Apr 20 12:03:33 2010
@@ -2,7 +2,8 @@
 
 
 class SSARepr(object):
-    def __init__(self):
+    def __init__(self, name):
+        self.name = name
         self.insns = []
 
 class Label(object):
@@ -54,7 +55,7 @@
             assert self.regalloc.getcolor(inputargs[i]) == i
 
     def generate_ssa_form(self):
-        self.assembler = SSARepr()
+        self.assembler = SSARepr(self.graph.name)
         self.seen_blocks = {}
         self.make_bytecode_block(self.graph.startblock)
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_assembler.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_assembler.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_assembler.py	Tue Apr 20 12:03:33 2010
@@ -1,10 +1,11 @@
 from pypy.jit.codewriter.assembler import Assembler
 from pypy.jit.codewriter.flatten import SSARepr, Label, TLabel, Register
+from pypy.objspace.flow.model import Constant
 from pypy.jit.metainterp.history import ConstInt
 
 
 def test_assemble_simple():
-    ssarepr = SSARepr()
+    ssarepr = SSARepr("test")
     i0, i1, i2 = Register(0), Register(1), Register(2)
     ssarepr.insns = [
         ('int_add', i0, i1, i2),
@@ -18,7 +19,7 @@
                                'int_return/i': 1}
 
 def test_assemble_consts():
-    ssarepr = SSARepr()
+    ssarepr = SSARepr("test")
     ssarepr.insns = [
         ('int_return', Register(13)),
         ('int_return', Constant(18)),
@@ -35,11 +36,11 @@
                             "\x00\xFE")
     assert assembler.insns == {'int_return/i': 0,
                                'int_return/c': 1}
-    assert assembler.constants == [ConstInt(-129), ConstInt(128)]
+    assert jitcode.constants == [ConstInt(-129), ConstInt(128)]
 
 def test_assemble_loop():
-    ssarepr = SSARepr()
-    i0, i1 = Register(16), Register(17)
+    ssarepr = SSARepr("test")
+    i0, i1 = Register(0x16), Register(0x17)
     ssarepr.insns = [
         (Label('L1'),),
         ('goto_if_not_int_gt', TLabel('L2'), i0, Constant(4)),
@@ -51,7 +52,7 @@
         ]
     assembler = Assembler()
     jitcode = assembler.assemble(ssarepr)
-    assert jitcode.code == ("\x00\x10\x00\x10\x04"
+    assert jitcode.code == ("\x00\x10\x00\x16\x04"
                             "\x01\x17\x16\x17"
                             "\x02\x16\x01\x16"
                             "\x03\x00\x00"

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_format.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_format.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_format.py	Tue Apr 20 12:03:33 2010
@@ -5,7 +5,7 @@
 
 
 def test_format_assembler_simple():
-    ssarepr = SSARepr()
+    ssarepr = SSARepr("test")
     i0, i1, i2 = Register(0), Register(1), Register(2)
     ssarepr.insns = [
         ('foobar', [i0, i1]),
@@ -21,7 +21,7 @@
     assert asm == str(py.code.Source(expected)).strip() + '\n'
 
 def test_format_assembler_loop():
-    ssarepr = SSARepr()
+    ssarepr = SSARepr("test")
     i0, i1 = Register(0), Register(1)
     ssarepr.insns = [
         ('foobar', [i0, i1]),



More information about the Pypy-commit mailing list