[pypy-svn] r73910 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test
arigo at codespeak.net
arigo at codespeak.net
Tue Apr 20 15:42:49 CEST 2010
Author: arigo
Date: Tue Apr 20 15:42:47 2010
New Revision: 73910
Modified:
pypy/branch/blackhole-improvement/pypy/jit/codewriter/assembler.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/blackhole.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.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_blackhole.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
Log:
Fix the handling of constants in the BlackholeInterpreter.
More general fixes here and there to support refs and floats.
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 15:42:47 2010
@@ -1,11 +1,12 @@
-from pypy.jit.metainterp import history
-from pypy.jit.codewriter.flatten import Register, Label, TLabel
+from pypy.jit.metainterp.history import AbstractValue, getkind
+from pypy.jit.codewriter.flatten import Register, Label, TLabel, KINDS
from pypy.objspace.flow.model import Constant
-from pypy.jit.metainterp.history import ConstInt
-class JitCode(history.AbstractValue):
- empty_list = []
+class JitCode(AbstractValue):
+ _empty_i = []
+ _empty_r = []
+ _empty_f = []
def __init__(self, name, cfnptr=None, calldescr=None, called_from=None,
graph=None):
@@ -15,9 +16,12 @@
self.called_from = called_from
self.graph = graph
- def setup(self, code, constants):
+ def setup(self, code, constants_i=[], constants_r=[], constants_f=[]):
self.code = code
- self.constants = constants or self.empty_list # share the empty list
+ # if the following lists are empty, use a single shared empty list
+ self.constants_i = constants_i or self._empty_i
+ self.constants_r = constants_r or self._empty_r
+ self.constants_f = constants_f or self._empty_f
class Assembler(object):
@@ -28,9 +32,12 @@
def assemble(self, ssarepr):
code = []
constants_dict = {}
- constants_rev = []
+ constants_i = []
+ constants_r = []
+ constants_f = []
label_positions = {}
tlabel_positions = []
+ highest_regs = dict.fromkeys(KINDS, 0)
for insn in ssarepr.insns:
if isinstance(insn[0], Label):
label_positions[insn[0].name] = len(code)
@@ -41,18 +48,29 @@
argcodes = []
for x in insn[1:]:
if isinstance(x, Register):
+ if x.index > highest_regs[x.kind]:
+ highest_regs[x.kind] = x.index
code.append(chr(x.index))
- argcodes.append('i')
+ argcodes.append(x.kind[0])
elif isinstance(x, Constant):
- if -128 <= x.value <= 127:
+ kind = getkind(x.concretetype)
+ if kind == 'int' and -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)
+ if kind == 'int':
+ constants = constants_i
+ elif kind == 'ref':
+ constants = constants_r
+ elif kind == 'float':
+ constants = constants_f
+ else:
+ raise NotImplementedError(x)
+ constants.append(x.value)
+ constants_dict[x] = 256 - len(constants)
code.append(chr(constants_dict[x]))
- argcodes.append('i')
+ argcodes.append(kind[0])
elif isinstance(x, TLabel):
tlabel_positions.append((x.name, len(code)))
code.append("temp 1")
@@ -73,6 +91,11 @@
code[pos ] = chr(target & 0xFF)
code[pos+1] = chr(target >> 8)
#
+ # Limitation of the number of registers, from the single-byte encoding
+ assert highest_regs['int'] + len(constants_i) <= 256
+ assert highest_regs['ref'] + len(constants_r) <= 256
+ assert highest_regs['float'] + len(constants_f) <= 256
+ #
jitcode = JitCode(ssarepr.name)
- jitcode.setup(''.join(code), constants_rev[::-1])
+ jitcode.setup(''.join(code), constants_i, constants_r, constants_f)
return jitcode
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/blackhole.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/blackhole.py Tue Apr 20 15:42:47 2010
@@ -15,6 +15,9 @@
class LeaveFrame(Exception):
pass
+class MissingValue(object):
+ pass
+
def signedord(c):
value = ord(c)
value = intmask(value << (LONG_BIT-8)) >> (LONG_BIT-8)
@@ -24,7 +27,15 @@
class BlackholeInterpreter(object):
def __init__(self):
+ self.registers_i = [MissingValue()] * 256
+ self.registers_r = [MissingValue()] * 256
+ self.registers_f = [MissingValue()] * 256
+
+ def _freeze_(self):
self.registers_i = [0] * 256
+ self.registers_r = [NULL] * 256
+ self.registers_f = [0.0] * 256
+ return False
def setup_insns(self, insns):
assert len(insns) <= 256, "too many instructions!"
@@ -106,13 +117,24 @@
self.registers_i[index] = value
def run(self, jitcode, position):
+ self.copy_constants(self.registers_i, jitcode.constants_i)
+ self.copy_constants(self.registers_r, jitcode.constants_r)
+ self.copy_constants(self.registers_f, jitcode.constants_f)
code = jitcode.code
- constants = jitcode.constants
try:
self.dispatch_loop(code, position)
except LeaveFrame:
pass
+ # XXX must be specialized
+ def copy_constants(self, registers, constants):
+ i = len(constants)
+ while i > 0:
+ j = 256 - i
+ assert j >= 0
+ i -= 1
+ registers[j] = constants[i]
+
# ----------
@arguments("i", "i", returns="i")
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 Tue Apr 20 15:42:47 2010
@@ -1,10 +1,8 @@
from pypy.jit.codewriter import support
from pypy.jit.codewriter.regalloc import perform_register_allocation
-from pypy.jit.codewriter.flatten import flatten_graph
+from pypy.jit.codewriter.flatten import flatten_graph, KINDS
from pypy.jit.codewriter.assembler import Assembler
-KINDS = ['int', 'ref', 'float']
-
class CodeWriter(object):
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 15:42:47 2010
@@ -28,6 +28,8 @@
self.kind = kind
self.index = index
+KINDS = ['int', 'ref', 'float']
+
# ____________________________________________________________
def flatten_graph(graph, regallocs):
@@ -85,7 +87,12 @@
def make_return(self, args):
if len(args) == 1:
# return from function
- self.emitline("int_return", self.getcolor(args[0]))
+ [v] = args
+ kind = getkind(v.concretetype)
+ if kind == 'void':
+ self.emitline("void_return")
+ else:
+ self.emitline("%s_return" % kind, self.getcolor(args[0]))
elif len(args) == 2:
# exception block, raising an exception from a function
xxx
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 15:42:47 2010
@@ -1,7 +1,7 @@
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
+from pypy.rpython.lltypesystem import lltype
def test_assemble_simple():
@@ -22,10 +22,10 @@
ssarepr = SSARepr("test")
ssarepr.insns = [
('int_return', Register('int', 13)),
- ('int_return', Constant(18)),
- ('int_return', Constant(-4)),
- ('int_return', Constant(128)),
- ('int_return', Constant(-129)),
+ ('int_return', Constant(18, lltype.Signed)),
+ ('int_return', Constant(-4, lltype.Signed)),
+ ('int_return', Constant(128, lltype.Signed)),
+ ('int_return', Constant(-129, lltype.Signed)),
]
assembler = Assembler()
jitcode = assembler.assemble(ssarepr)
@@ -36,16 +36,33 @@
"\x00\xFE")
assert assembler.insns == {'int_return/i': 0,
'int_return/c': 1}
- assert jitcode.constants == [ConstInt(-129), ConstInt(128)]
+ assert jitcode.constants_i == [128, -129]
+
+def test_assemble_float_consts():
+ ssarepr = SSARepr("test")
+ ssarepr.insns = [
+ ('float_return', Register('float', 13)),
+ ('float_return', Constant(18.0, lltype.Float)),
+ ('float_return', Constant(-4.0, lltype.Float)),
+ ('float_return', Constant(128.1, lltype.Float)),
+ ]
+ assembler = Assembler()
+ jitcode = assembler.assemble(ssarepr)
+ assert jitcode.code == ("\x00\x0D"
+ "\x00\xFF"
+ "\x00\xFE"
+ "\x00\xFD")
+ assert assembler.insns == {'float_return/f': 0}
+ assert jitcode.constants_f == [18.0, -4.0, 128.1]
def test_assemble_loop():
ssarepr = SSARepr("test")
i0, i1 = Register('int', 0x16), Register('int', 0x17)
ssarepr.insns = [
(Label('L1'),),
- ('goto_if_not_int_gt', TLabel('L2'), i0, Constant(4)),
+ ('goto_if_not_int_gt', TLabel('L2'), i0, Constant(4, lltype.Signed)),
('int_add', i1, i0, i1),
- ('int_sub', i0, Constant(1), i0),
+ ('int_sub', i0, Constant(1, lltype.Signed), i0),
('goto', TLabel('L1')),
(Label('L2'),),
('int_return', i1),
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_blackhole.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_blackhole.py Tue Apr 20 15:42:47 2010
@@ -27,6 +27,18 @@
blackholeinterp.run(jitcode, 0)
assert blackholeinterp.result_i == 42
+def test_simple_bigconst():
+ jitcode = JitCode("test")
+ jitcode.setup("\x00\xFD\x01\x02"
+ "\x01\x02",
+ [666, 666, 10042, 666])
+ blackholeinterp = BlackholeInterpreter()
+ blackholeinterp.setup_insns({'int_sub/iii': 0,
+ 'int_return/i': 1})
+ blackholeinterp.setarg_i(1, 10000)
+ blackholeinterp.run(jitcode, 0)
+ assert blackholeinterp.result_i == 42
+
def test_simple_loop():
jitcode = JitCode("test")
jitcode.setup("\x00\x10\x00\x16\x02" # L1: goto_if_not_int_gt L2, %i0, 2
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_flatten.py Tue Apr 20 15:42:47 2010
@@ -24,7 +24,9 @@
def encoding_test(self, func, args, expected, optimize=True):
graphs = self.make_graphs(func, args)
- ssarepr = flatten_graph(graphs[0], {'int': FakeRegAlloc()})
+ ssarepr = flatten_graph(graphs[0], {'int': FakeRegAlloc(),
+ 'ref': FakeRegAlloc(),
+ 'float': FakeRegAlloc()})
asm = format_assembler(ssarepr)
expected = str(py.code.Source(expected)).strip() + '\n'
assert asm == expected
@@ -56,3 +58,14 @@
L2:
int_return %i3
""")
+
+ def test_float(self):
+ def f(i, f):
+ return (i*5) + (f*0.25)
+ self.encoding_test(f, [4, 7.5], """
+ int_mul %i0, $5, %i1
+ float_mul %f0, $0.25, %f1
+ cast_int_to_float %i1, %f2
+ float_add %f2, %f1, %f3
+ float_return %f3
+ """)
More information about the Pypy-commit
mailing list