[pypy-svn] r52888 - in pypy/branch/jit-hotpath/pypy/jit/rainbow: . test
cfbolz at codespeak.net
cfbolz at codespeak.net
Tue Mar 25 00:11:30 CET 2008
Author: cfbolz
Date: Tue Mar 25 00:11:29 2008
New Revision: 52888
Modified:
pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
pypy/branch/jit-hotpath/pypy/jit/rainbow/dump.py
pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py
pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_serializegraph.py
Log:
probably premature optimization: use a variable-width encoding for all the
integers encoded into the bytecode
Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/codewriter.py Tue Mar 25 00:11:29 2008
@@ -1771,23 +1771,32 @@
def __repr__(self):
return "tlabel(%r)" % (self.name, )
+def encode_int(index):
+ assert index >= 0
+ result = []
+ while True:
+ byte = index & 0x7F
+ index >>= 7
+ result.append(chr(byte + 0x80 * bool(index)))
+ if not index:
+ break
+ return result
+
def assemble_labelpos(labelpos, interpreter, *args):
result = []
- def emit_2byte(index):
- assert -32768 <= index < 32768
- result.append(chr((index >> 8) & 0xff))
- result.append(chr(index & 0xff))
+ def emit(index):
+ result.extend(encode_int(index))
for arg in args:
if isinstance(arg, str):
if arg.startswith('#'): # skip comments
continue
opcode = interpreter.find_opcode(arg)
assert opcode >= 0, "unknown opcode %s" % (arg, )
- emit_2byte(opcode)
+ emit(opcode)
elif isinstance(arg, bool):
result.append(chr(int(arg)))
elif isinstance(arg, int):
- emit_2byte(arg)
+ emit(arg)
elif isinstance(arg, label):
labelpos[arg.name] = len(result)
elif isinstance(arg, tlabel):
Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/dump.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/dump.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/dump.py Tue Mar 25 00:11:29 2008
@@ -25,42 +25,47 @@
return arg
def get_opname(self):
- return self.get(str, 2)
+ result = self.get(str, 0)
+ self.pc += len(
+ codewriter.encode_int(self.interpreter.find_opcode(result)))
+ return result
def getjitcode(self):
return self.jitcode
- def load_2byte(self):
- return self.get(int, 2)
+ def load_int(self):
+ result = self.get(int, 0)
+ self.pc += len(codewriter.encode_int(result))
+ return result
def load_bool(self):
return self.get(bool, 1)
def get_greenarg(self):
- i = self.load_2byte()
+ i = self.load_int()
if i % 2:
return self.jitcode.constants[i // 2]
return CustomRepr('g%d' % (i // 2))
def get_green_varargs(self):
greenargs = []
- num = self.load_2byte()
+ num = self.load_int()
for i in range(num):
greenargs.append(self.get_greenarg())
return greenargs
def get_red_varargs(self):
redargs = []
- num = self.load_2byte()
+ num = self.load_int()
for i in range(num):
redargs.append(self.get_redarg())
return redargs
def get_redarg(self):
- return CustomRepr('r%d' % self.get(int, 2))
+ return CustomRepr('r%d' % self.load_int())
def get_greenkey(self):
- keydescnum = self.load_2byte()
+ keydescnum = self.load_int()
if keydescnum == 0:
return None
else:
@@ -135,4 +140,5 @@
assert 0, "unexpected object: %r" % (arg,)
if src.pc != len(jitcode.code):
+ import pdb; pdb.set_trace()
print >> file, 'WARNING: the pc column is bogus! fix dump.py!'
Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/fallback.py Tue Mar 25 00:11:29 2008
@@ -195,7 +195,7 @@
def bytecode_loop(self):
while 1:
- bytecode = self.load_2byte()
+ bytecode = self.load_int()
assert bytecode >= 0
result = self.fbrunnerdesc.opcode_implementations[bytecode](self)
@@ -210,13 +210,19 @@
self.pc = pc + 1
return result
- def load_2byte(self):
+ def load_int(self):
+ result = 0
+ shift = 0
pc = self.pc
- assert pc >= 0
- result = ((ord(self.bytecode.code[pc]) << 8) |
- ord(self.bytecode.code[pc + 1]))
- self.pc = pc + 2
- return intmask((result ^ SIGN_EXTEND2) - SIGN_EXTEND2)
+ while 1:
+ byte = ord(self.bytecode.code[pc])
+ pc += 1
+ result += (byte & 0x7F) << shift
+ shift += 7
+ if not byte & 0x80:
+ break
+ self.pc = pc
+ return intmask(result)
def load_4byte(self):
pc = self.pc
@@ -232,30 +238,30 @@
return bool(self.load_byte())
def get_greenarg(self):
- i = self.load_2byte()
+ i = self.load_int()
if i % 2:
return self.bytecode.constants[i // 2]
return self.local_green[i // 2]
def get_green_varargs(self):
greenargs = []
- num = self.load_2byte()
+ num = self.load_int()
for i in range(num):
greenargs.append(self.get_greenarg())
return greenargs
def get_red_varargs(self):
redargs = []
- num = self.load_2byte()
+ num = self.load_int()
for i in range(num):
redargs.append(self.get_redarg())
return redargs
def get_redarg(self):
- return self.local_red[self.load_2byte()]
+ return self.local_red[self.load_int()]
def get_greenkey(self):
- keydescnum = self.load_2byte()
+ keydescnum = self.load_int()
if keydescnum == 0:
return empty_key
else:
Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/interpreter.py Tue Mar 25 00:11:29 2008
@@ -130,22 +130,22 @@
elif argspec == "green":
args += (self.get_greenarg(), )
elif argspec == "kind":
- args += (self.getjitcode().typekinds[self.load_2byte()], )
+ args += (self.getjitcode().typekinds[self.load_int()], )
elif argspec == "jumptarget":
args += (self.load_4byte(), )
elif argspec == "jumptargets":
- num = self.load_2byte()
+ num = self.load_int()
args += ([self.load_4byte() for i in range(num)], )
elif argspec == "bool":
args += (self.load_bool(), )
elif argspec == "redboxcls":
- args += (self.getjitcode().redboxclasses[self.load_2byte()], )
+ args += (self.getjitcode().redboxclasses[self.load_int()], )
elif argspec == "2byte":
- args += (self.load_2byte(), )
+ args += (self.load_int(), )
elif argspec == "greenkey":
args += (self.get_greenkey(), )
elif argspec == "promotiondesc":
- promotiondescnum = self.load_2byte()
+ promotiondescnum = self.load_int()
promotiondesc = self.getjitcode().promotiondescs[promotiondescnum]
args += (promotiondesc, )
elif argspec == "green_varargs":
@@ -153,38 +153,38 @@
elif argspec == "red_varargs":
args += (self.get_red_varargs(), )
elif argspec == "bytecode":
- bytecodenum = self.load_2byte()
+ bytecodenum = self.load_int()
args += (self.getjitcode().called_bytecodes[bytecodenum], )
elif argspec == "calldesc":
- index = self.load_2byte()
+ index = self.load_int()
function = self.getjitcode().calldescs[index]
args += (function, )
elif argspec == "metacalldesc":
- index = self.load_2byte()
+ index = self.load_int()
function = self.getjitcode().metacalldescs[index]
args += (function, )
elif argspec == "indirectcalldesc":
- index = self.load_2byte()
+ index = self.load_int()
function = self.getjitcode().indirectcalldescs[index]
args += (function, )
elif argspec == "oopspec":
- oopspecindex = self.load_2byte()
+ oopspecindex = self.load_int()
oopspec = self.getjitcode().oopspecdescs[oopspecindex]
args += (oopspec, )
elif argspec == "structtypedesc":
- td = self.getjitcode().structtypedescs[self.load_2byte()]
+ td = self.getjitcode().structtypedescs[self.load_int()]
args += (td, )
elif argspec == "arraydesc":
- td = self.getjitcode().arrayfielddescs[self.load_2byte()]
+ td = self.getjitcode().arrayfielddescs[self.load_int()]
args += (td, )
elif argspec == "fielddesc":
- d = self.getjitcode().fielddescs[self.load_2byte()]
+ d = self.getjitcode().fielddescs[self.load_int()]
args += (d, )
elif argspec == "interiordesc":
- d = self.getjitcode().interiordescs[self.load_2byte()]
+ d = self.getjitcode().interiordescs[self.load_int()]
args += (d, )
elif argspec == "exception":
- d = self.getjitcode().exceptioninstances[self.load_2byte()]
+ d = self.getjitcode().exceptioninstances[self.load_int()]
args += (d, )
else:
assert 0, "unknown argtype declaration"
@@ -305,7 +305,7 @@
def bytecode_loop(self):
while 1:
- bytecode = self.load_2byte()
+ bytecode = self.load_int()
assert bytecode >= 0
result = self.opcode_implementations[bytecode](self)
assert (self.frame is None or not self.frame.local_boxes or
@@ -361,20 +361,19 @@
def getjitcode(self):
return self.frame.bytecode
- def load_byte(self):
+ def load_int(self):
+ result = 0
+ shift = 0
pc = self.frame.pc
- assert pc >= 0
- result = ord(self.frame.bytecode.code[pc])
- self.frame.pc = pc + 1
- return result
-
- def load_2byte(self):
- pc = self.frame.pc
- assert pc >= 0
- result = ((ord(self.frame.bytecode.code[pc]) << 8) |
- ord(self.frame.bytecode.code[pc + 1]))
- self.frame.pc = pc + 2
- return intmask((result ^ SIGN_EXTEND2) - SIGN_EXTEND2)
+ while 1:
+ byte = ord(self.frame.bytecode.code[pc])
+ pc += 1
+ result += (byte & 0x7F) << shift
+ shift += 7
+ if not byte & 0x80:
+ break
+ self.frame.pc = pc
+ return intmask(result)
def load_4byte(self):
pc = self.frame.pc
@@ -387,33 +386,37 @@
return intmask(result)
def load_bool(self):
- return bool(self.load_byte())
+ pc = self.frame.pc
+ assert pc >= 0
+ result = ord(self.frame.bytecode.code[pc])
+ self.frame.pc = pc + 1
+ return bool(result)
def get_greenarg(self):
- i = self.load_2byte()
+ i = self.load_int()
if i % 2:
return self.frame.bytecode.constants[i // 2]
return self.frame.local_green[i // 2]
def get_green_varargs(self):
greenargs = []
- num = self.load_2byte()
+ num = self.load_int()
for i in range(num):
greenargs.append(self.get_greenarg())
return greenargs
def get_red_varargs(self):
redargs = []
- num = self.load_2byte()
+ num = self.load_int()
for i in range(num):
redargs.append(self.get_redarg())
return redargs
def get_redarg(self):
- return self.frame.local_boxes[self.load_2byte()]
+ return self.frame.local_boxes[self.load_int()]
def get_greenkey(self):
- keydescnum = self.load_2byte()
+ keydescnum = self.load_int()
if keydescnum == 0:
return empty_key
else:
Modified: pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_serializegraph.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_serializegraph.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/rainbow/test/test_serializegraph.py Tue Mar 25 00:11:29 2008
@@ -221,22 +221,22 @@
expected = """\
JITCODE 'f'
pc: 0 | make_redbox (0), 0 => r1
- 6 | make_new_redvars [r0, r1]
+ 3 | make_new_redvars [r0, r1]
|
- 14 | local_merge 0, None
- 20 | red_int_is_true r0 => r2
- 24 | red_goto_iftrue r2, pc: 40
- 32 | make_new_redvars [r1]
+ 7 | local_merge 0, None
+ 10 | red_int_is_true r0 => r2
+ 12 | red_goto_iftrue r2, pc: 22
+ 18 | make_new_redvars [r1]
|
- 38 | red_return
+ 21 | red_return
|
- 40 | make_new_redvars [r0, r1]
+ 22 | make_new_redvars [r0, r1]
|
- 48 | red_int_add r1, r0 => r2
- 54 | make_redbox (1), 0 => r3
- 60 | red_int_sub r0, r3 => r4
- 66 | make_new_redvars [r4, r2]
- 74 | goto pc: 14
+ 26 | red_int_add r1, r0 => r2
+ 29 | make_redbox (1), 0 => r3
+ 32 | red_int_sub r0, r3 => r4
+ 35 | make_new_redvars [r4, r2]
+ 39 | goto pc: 7
""".rstrip()
assert result == expected
More information about the Pypy-commit
mailing list