[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