[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