[pypy-svn] r67907 - pypy/trunk/pypy/jit/backend/x86

arigo at codespeak.net arigo at codespeak.net
Sat Sep 26 20:18:09 CEST 2009


Author: arigo
Date: Sat Sep 26 20:18:09 2009
New Revision: 67907

Modified:
   pypy/trunk/pypy/jit/backend/x86/codebuf.py
   pypy/trunk/pypy/jit/backend/x86/ri386.py
   pypy/trunk/pypy/jit/backend/x86/ri386setup.py
Log:
Avoid calling 'builder.write(chr(n))' from the generated code,
because this will make a temporary string out of chr(n).


Modified: pypy/trunk/pypy/jit/backend/x86/codebuf.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/codebuf.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/codebuf.py	Sat Sep 26 20:18:09 2009
@@ -28,6 +28,13 @@
     def write(self, data):
         self._pos = self.overwrite(self._pos, data)
 
+    def writechr(self, n):
+        # purely for performance: don't convert chr(n) to a str
+        pos = self._pos
+        assert pos + 1 <= self._size
+        self._data[pos] = chr(n)
+        self._pos = pos + 1
+
     def get_relative_pos(self):
         return self._pos
 

Modified: pypy/trunk/pypy/jit/backend/x86/ri386.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/ri386.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/ri386.py	Sat Sep 26 20:18:09 2009
@@ -394,6 +394,9 @@
     def write(self, data):
         raise NotImplementedError
 
+    def writechr(self, n):
+        self.write(chr(n))
+
     def tell(self):
         raise NotImplementedError
 

Modified: pypy/trunk/pypy/jit/backend/x86/ri386setup.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/ri386setup.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/ri386setup.py	Sat Sep 26 20:18:09 2009
@@ -86,7 +86,7 @@
         expr = 'arg%d.byte' % self.op
         if has_orbyte:
             expr = 'orbyte | %s' % expr
-        lines.append('builder.write(chr(%s))' % expr)
+        lines.append('builder.writechr(%s)' % expr)
         lines.append('builder.write(arg%d.extradata)' % self.op)
         return False
 
@@ -94,14 +94,13 @@
     def eval(self, lines, has_orbyte):
         assert not has_orbyte, "malformed bytecode"
         if self.width == 'i':
-            packer = 'packimm32'
+            lines.append('builder.write(packimm32(arg%d.value))' % (self.op,))
         elif self.width == 'b':
-            packer = 'packimm8'
+            lines.append('builder.writechr(arg%d.value & 0xFF)' % (self.op,))
         elif self.width == 'h':
-            packer = 'packimm16'
+            lines.append('builder.write(packimm16(arg%d.value))' % (self.op,))
         else:
             raise AssertionError, "invalid width %r" % (self.width,)
-        lines.append('builder.write(%s(arg%d.value))' % (packer, self.op))
         return False
 
 class relative(operand):
@@ -157,11 +156,14 @@
                 nextbyte = ord(op[0])
                 if nextbyte:
                     lines.append('orbyte |= %d' % nextbyte)
-                lines.append('builder.write(chr(orbyte))')
+                lines.append('builder.writechr(orbyte)')
                 has_orbyte = False
                 op = op[1:]
             if op:
-                lines.append('builder.write(%r)' % (op,))
+                if len(op) > 1:
+                    lines.append('builder.write(%r)' % (op,))
+                else:
+                    lines.append('builder.writechr(%d)' % (ord(op),))
         else:
             has_orbyte = op.eval(lines, has_orbyte)
     assert not has_orbyte, "malformed bytecode"



More information about the Pypy-commit mailing list