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

arigo at codespeak.net arigo at codespeak.net
Wed Apr 28 19:01:27 CEST 2010


Author: arigo
Date: Wed Apr 28 19:01:25 2010
New Revision: 74188

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/assembler.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_assembler.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_codewriter.py
Log:
Add an extra byte at the end of the bytecode to mean "the highest
register number used, among registers of type 'r'".


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	Wed Apr 28 19:01:25 2010
@@ -18,13 +18,25 @@
         self.called_from = called_from
         self.graph = graph
 
-    def setup(self, code, constants_i=[], constants_r=[], constants_f=[]):
-        self.code = code
+    def setup(self, code, constants_i=[], constants_r=[], constants_f=[],
+              num_regs_r=256):
+        # stick an extra char at the end of self.code, which is the
+        # highest 'r' register used in this code.  It default to 255,
+        # which is always correct.  Also, even if no 'r' register is
+        # used it must be set to 0, which means that register %r0 is
+        # always marked as used.
+        self.code = code + chr((num_regs_r or 1)-1)
         # 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
 
+    def _code(self):
+        return self.code[:-1]   # for testing, without the extra char
+
+    def highest_r_reg(self):
+        return ord(self.code[-1])
+
 
 class Assembler(object):
 
@@ -50,11 +62,11 @@
         self.label_positions = {}
         self.tlabel_positions = []
         self.switchdictdescrs = []
-        self.highest_regs = dict.fromkeys(KINDS, 0)
+        self.count_regs = dict.fromkeys(KINDS, 0)
 
     def emit_reg(self, reg):
-        if reg.index > self.highest_regs[reg.kind]:
-            self.highest_regs[reg.kind] = reg.index
+        if reg.index >= self.count_regs[reg.kind]:
+            self.count_regs[reg.kind] = reg.index + 1
         self.code.append(chr(reg.index))
 
     def emit_const(self, const, kind, allow_short=False):
@@ -164,14 +176,15 @@
 
     def check_result(self):
         # Limitation of the number of registers, from the single-byte encoding
-        assert self.highest_regs['int'] + len(self.constants_i) <= 256
-        assert self.highest_regs['ref'] + len(self.constants_r) <= 256
-        assert self.highest_regs['float'] + len(self.constants_f) <= 256
+        assert self.count_regs['int'] + len(self.constants_i) <= 256
+        assert self.count_regs['ref'] + len(self.constants_r) <= 256
+        assert self.count_regs['float'] + len(self.constants_f) <= 256
 
     def make_jitcode(self, name):
         jitcode = JitCode(name)
         jitcode.setup(''.join(self.code),
                       self.constants_i,
                       self.constants_r,
-                      self.constants_f)
+                      self.constants_f,
+                      self.count_regs['ref'])
         return jitcode

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	Wed Apr 28 19:01:25 2010
@@ -17,7 +17,8 @@
     assembler = Assembler()
     jitcode = assembler.assemble(ssarepr)
     assert jitcode.code == ("\x00\x00\x01\x02"
-                            "\x01\x02")
+                            "\x01\x02"
+                            "\x00")
     assert assembler.insns == {'int_add/iii': 0,
                                'int_return/i': 1}
 
@@ -36,7 +37,8 @@
                             "\x01\x12"   # use int_return/c for one-byte consts
                             "\x01\xFC"
                             "\x00\xFF"   # use int_return/i for larger consts
-                            "\x00\xFE")
+                            "\x00\xFE"
+                            "\x00")      # highest_r_reg
     assert assembler.insns == {'int_return/i': 0,
                                'int_return/c': 1}
     assert jitcode.constants_i == [128, -129]
@@ -54,7 +56,8 @@
     assert jitcode.code == ("\x00\x0D"
                             "\x00\xFF"
                             "\x00\xFE"
-                            "\x00\xFD")
+                            "\x00\xFD"
+                            "\x00")
     assert assembler.insns == {'float_return/f': 0}
     assert jitcode.constants_f == [18.0, -4.0, 128.1]
 
@@ -75,7 +78,8 @@
     assert jitcode.code == ("\x00\x58"
                             "\x01\xFF"
                             "\x01\xFE"
-                            "\x02\xFF")
+                            "\x02\xFF"
+                            "\x00")
     assert assembler.insns == {'int_return/c': 0,
                                'int_return/i': 1,
                                'ref_return/r': 2}
@@ -102,7 +106,8 @@
                             "\x01\x17\x16\x17"
                             "\x02\x16\x01\x16"
                             "\x03\x00\x00"
-                            "\x04\x17")
+                            "\x04\x17"
+                            "\x00")
     assert assembler.insns == {'goto_if_not_int_gt/Lic': 0,
                                'int_add/iii': 1,
                                'int_sub/ici': 2,
@@ -118,7 +123,7 @@
         ]
     assembler = Assembler()
     jitcode = assembler.assemble(ssarepr)
-    assert jitcode.code == "\x00\x03\x16\x17\xFF\x00"
+    assert jitcode._code() == "\x00\x03\x16\x17\xFF\x00"
     assert assembler.insns == {'foobar/IR': 0}
     assert jitcode.constants_i == [42]
 
@@ -130,7 +135,18 @@
     ssarepr.insns = [('foobar', d) for d in descrs[::-1]]
     assembler = Assembler()
     jitcode = assembler.assemble(ssarepr)
-    assert jitcode.code == ''.join(["\x00" + struct.pack("<H", i)
-                                    for i in range(300)])
+    assert jitcode._code() == ''.join(["\x00" + struct.pack("<H", i)
+                                       for i in range(300)])
     assert assembler.insns == {'foobar/d': 0}
     assert assembler.descrs == descrs[::-1]
+
+def test_highest_r_reg():
+    assembler = Assembler()
+    ssarepr = SSARepr("test")
+    ssarepr.insns = []
+    jitcode = assembler.assemble(ssarepr)
+    assert jitcode.highest_r_reg() == 0
+    ssarepr = SSARepr("test")
+    ssarepr.insns = [('foobar', Register('int', 51), Register('ref', 27))]
+    jitcode = assembler.assemble(ssarepr)
+    assert jitcode.highest_r_reg() == 27

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_codewriter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_codewriter.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_codewriter.py	Wed Apr 28 19:01:25 2010
@@ -9,11 +9,11 @@
         return b
     cw = CodeWriter()
     jitcode = cw.transform_func_to_jitcode(f, [5, 6])
-    assert jitcode.code == ("\x00\x10\x00\x00\x00"
-                            "\x01\x01\x00\x01"
-                            "\x02\x00\x01\x00"
-                            "\x03\x00\x00"
-                            "\x04\x01")
+    assert jitcode._code() == ("\x00\x10\x00\x00\x00"
+                               "\x01\x01\x00\x01"
+                               "\x02\x00\x01\x00"
+                               "\x03\x00\x00"
+                               "\x04\x01")
     assert cw.assembler.insns == {'goto_if_not_int_gt/Lic': 0,
                                   'int_add/iii': 1,
                                   'int_sub/ici': 2,



More information about the Pypy-commit mailing list