[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