[pypy-svn] r62659 - in pypy/branch/pyjitpl5/pypy/jit/backend/x86: . test
fijal at codespeak.net
fijal at codespeak.net
Fri Mar 6 18:28:17 CET 2009
Author: fijal
Date: Fri Mar 6 18:28:12 2009
New Revision: 62659
Modified:
pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py
pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py
pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py
pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py
Log:
good, support calls of different sizes as well. thanks armin :)
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py Fri Mar 6 18:28:12 2009
@@ -500,6 +500,10 @@
return recovery_code_addr
def genop_call(self, op, arglocs, resloc):
+ sizeloc = arglocs[0]
+ assert isinstance(sizeloc, IMM32)
+ size = sizeloc.value
+ arglocs = arglocs[1:]
extra_on_stack = 0
for i in range(len(op.args) - 1, 0, -1):
# op.args[1] is a calldesc
@@ -519,6 +523,10 @@
x = arglocs[0]
self.mc.CALL(x)
self.mc.ADD(esp, imm(WORD * extra_on_stack))
+ if size == 1:
+ self.mc.AND(eax, imm(0xff))
+ elif size == 2:
+ self.mc.AND(eax, imm(0xffff))
#def genop_call__1(self, op, arglocs, resloc):
# self.gen_call(op, arglocs, resloc)
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py Fri Mar 6 18:28:12 2009
@@ -719,8 +719,12 @@
return ops + [Perform(op, arglocs, eax)]
def consider_call(self, op, ignored):
+ from pypy.jit.backend.x86.runner import CPU386
args = [op.args[0]] + op.args[2:]
- return self._call(op, [self.loc(arg) for arg in args])
+ calldescr = op.args[1].getint()
+ _, size, _ = CPU386.unpack_calldescr(calldescr)
+ return self._call(op, [imm(size)] +
+ [self.loc(arg) for arg in args])
consider_call_pure = consider_call
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py Fri Mar 6 18:28:12 2009
@@ -62,7 +62,7 @@
if rtyper is not None: # for tests
self.lltype2vtable = rtyper.lltype_to_vtable_mapping()
self._setup_ovf_error()
- self.generated_mps = [None] * 10
+ self.generated_mps = {}
def _setup_ovf_error(self):
if self.translate_support_code:
@@ -266,13 +266,13 @@
else:
raise ValueError('get_valuebox_from_int: %s' % (type,))
- def _get_mp_for_call(self, argnum):
- if argnum >= len(self.generated_mps):
- self.generated_mps += [None] * len(self.generated_mps)
- actual = self.generated_mps[argnum]
- if actual is not None:
- return actual
+ def _get_mp_for_call(self, argnum, calldescr):
+ try:
+ return self.generated_mps[calldescr]
+ except KeyError:
+ pass
args = [BoxInt(0) for i in range(argnum + 3)]
+ args[1].value = calldescr
result = BoxInt(0)
operations = [
ResOperation(rop.MERGE_POINT, args, None),
@@ -280,7 +280,7 @@
ResOperation(rop.GUARD_FALSE, [args[-1]], None)]
operations[-1].liveboxes = [result]
self.compile_operations(operations)
- self.generated_mps[argnum] = operations
+ self.generated_mps[calldescr] = operations
return operations
def execute_operations_in_new_frame(self, name, operations, valueboxes):
@@ -546,8 +546,8 @@
def do_call(self, args):
calldescr = args[1].getint()
- num_args, tp = self.unpack_calldescr(calldescr)
- mp = self._get_mp_for_call(num_args)
+ num_args, size, ptr = self.unpack_calldescr(calldescr)
+ mp = self._get_mp_for_call(num_args, calldescr)
return self.execute_operations_in_new_frame('call', mp, args + [BoxInt(1)])
# ------------------- helpers and descriptions --------------------
@@ -589,16 +589,22 @@
@staticmethod
def calldescrof(argtypes, resulttype):
if resulttype is lltype.Void:
- rt = VOID
- elif isinstance(resulttype, lltype.Ptr):
- rt = PTR
+ size = 0
else:
- rt = INT
- return (len(argtypes) << 2) + rt
+ size = symbolic.get_size(resulttype)
+ res = (len(argtypes) << 4) + size
+ if isinstance(resulttype, lltype.Ptr):
+ return ~res
+ return res
@staticmethod
def unpack_calldescr(calldescr):
- return calldescr >> 2, calldescr & 0x4
+ if calldescr < 0:
+ calldescr = ~calldescr
+ ptr = True
+ else:
+ ptr = False
+ return calldescr >> 4, calldescr & 0xf, ptr
@staticmethod
def fielddescrof(S, fieldname):
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py Fri Mar 6 18:28:12 2009
@@ -7,6 +7,7 @@
from pypy.jit.backend.x86.regalloc import WORD
from pypy.jit.backend.x86 import symbolic
from pypy.jit.metainterp.resoperation import rop
+from pypy.jit.metainterp.executor import execute
import ctypes
import sys
More information about the Pypy-commit
mailing list