[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