[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