[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