[pypy-svn] r63589 - pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86

fijal at codespeak.net fijal at codespeak.net
Fri Apr 3 23:47:40 CEST 2009


Author: fijal
Date: Fri Apr  3 23:47:37 2009
New Revision: 63589

Modified:
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
Log:
fix more bugs, remove more code. RETURN is gone in favor of FAIL
and make do_call work


Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/assembler.py	Fri Apr  3 23:47:37 2009
@@ -9,7 +9,7 @@
 from pypy.annotation import model as annmodel
 from pypy.tool.uid import fixid
 from pypy.jit.backend.x86.regalloc import (RegAlloc, FRAMESIZE, WORD, REGS,
-                                      arg_pos, lower_byte, stack_pos, RETURN)
+                                      arg_pos, lower_byte, stack_pos)
 from pypy.rlib.objectmodel import we_are_translated, specialize
 from pypy.jit.backend.x86 import codebuf
 from pypy.jit.backend.x86.support import gc_malloc_fnaddr
@@ -530,23 +530,23 @@
         #tree.comeback_bootstrap_addr = self.assemble_comeback_bootstrap(pos,
         #                                                locs, stacklocs)
 
-    def genop_discard_return(self, op, locs):
-        if op.args:
-            loc = locs[0]
-            if loc is not eax:
-                self.mc.MOV(eax, loc)
-        self.mc.ADD(esp, imm(FRAMESIZE))
-        # copy exception to some safe place and clean the original
-        # one
-        self.mc.MOV(ecx, heap(self._exception_addr))
-        self.mc.MOV(heap(self._exception_bck_addr), ecx)
-        self.mc.MOV(ecx, addr_add(imm(self._exception_addr), imm(WORD)))
-        self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(WORD)),
-                     ecx)
-        # clean up the original exception, we don't want
-        # to enter more rpython code with exc set
-        self.mc.MOV(heap(self._exception_addr), imm(0))
-        self.mc.RET()
+#     def genop_discard_return(self, op, locs):
+#         if op.args:
+#             loc = locs[0]
+#             if loc is not eax:
+#                 self.mc.MOV(eax, loc)
+#         self.mc.ADD(esp, imm(FRAMESIZE))
+#         # copy exception to some safe place and clean the original
+#         # one
+#         self.mc.MOV(ecx, heap(self._exception_addr))
+#         self.mc.MOV(heap(self._exception_bck_addr), ecx)
+#         self.mc.MOV(ecx, addr_add(imm(self._exception_addr), imm(WORD)))
+#         self.mc.MOV(addr_add(imm(self._exception_bck_addr), imm(WORD)),
+#                      ecx)
+#         # clean up the original exception, we don't want
+#         # to enter more rpython code with exc set
+#         self.mc.MOV(heap(self._exception_addr), imm(0))
+#         self.mc.RET()
 
     def genop_discard_jump(self, op, locs):
         targetmp = op.jump_target
@@ -703,17 +703,14 @@
     #    self.gen_call(op, arglocs, resloc)
     #    self.mc.MOVZX(eax, eax)
 
-genop_discard_list = [Assembler386.not_implemented_op_discard] * (RETURN + 1)
+genop_discard_list = [Assembler386.not_implemented_op_discard] * rop._LAST
 genop_list = [Assembler386.not_implemented_op] * rop._LAST
 genop_guard_list = [Assembler386.not_implemented_op_guard] * rop._LAST
 
 for name, value in Assembler386.__dict__.iteritems():
     if name.startswith('genop_discard_'):
         opname = name[len('genop_discard_'):]
-        if opname == 'return':
-            num = RETURN
-        else:
-            num = getattr(rop, opname.upper())
+        num = getattr(rop, opname.upper())
         genop_discard_list[num] = value
     elif name.startswith('genop_guard_') and name != 'genop_guard_exception': 
         opname = name[len('genop_guard_'):]

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/regalloc.py	Fri Apr  3 23:47:37 2009
@@ -17,8 +17,6 @@
 WORD = 4
 FRAMESIZE = 1024    # XXX should not be a constant at all!!
 
-RETURN = rop._LAST
-
 class TempBox(Box):
     def __init__(self):
         pass
@@ -287,10 +285,10 @@
             if op.is_guard():
                 self._compute_inpargs()
                 for arg in op.inputargs:
-                    if arg not in longevity:
+                    if isinstance(arg, Box) and arg not in end:
                         end[arg] = i
             for arg in op.args:
-                if arg not in longevity:
+                if isinstance(arg, Box) and arg not in end:
                     end[arg] = i
             if op.result:
                 longevity[op.result] = (i, end[op.result])
@@ -550,9 +548,9 @@
     def _consider_guard(self, op, ignored):
         loc = self.make_sure_var_in_reg(op.args[0], [])
         locs = self._locs_from_liveboxes(op)
+        xxx
         self.eventually_free_var(op.args[0])
         self.eventually_free_vars(op.liveboxes)
-        xxx
         self.PerformDiscard(op, [loc] + locs)
 
     consider_guard_true = _consider_guard
@@ -625,14 +623,6 @@
         locs = self._locs_from_liveboxes(op)
         self.eventually_free_vars(op.liveboxes + op.args)
         self.PerformDiscard(op, [x, y] + locs)
-
-    def consider_return(self, op, ignored):
-        if op.args:
-            arglocs = [self.loc(op.args[0])]
-            self.eventually_free_var(op.args[0])
-        else:
-            arglocs = []
-        self.PerformDiscard(op, arglocs)
     
     def _consider_binop_part(self, op, ignored):
         x = op.args[0]
@@ -1028,15 +1018,12 @@
         print "[regalloc] Not implemented operation: %s" % op.getopname()
         raise NotImplementedError
 
-oplist = [RegAlloc.not_implemented_op] * (RETURN + 1)
+oplist = [RegAlloc.not_implemented_op] * rop._LAST
 
 for name, value in RegAlloc.__dict__.iteritems():
     if name.startswith('consider_'):
         name = name[len('consider_'):]
-        if name == 'return':
-            num = RETURN
-        else:
-            num = getattr(rop, name.upper())
+        num = getattr(rop, name.upper())
         oplist[num] = value
 
 def arg_pos(i):

Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py	Fri Apr  3 23:47:37 2009
@@ -11,7 +11,7 @@
 from pypy.jit.metainterp import history, codewriter
 from pypy.jit.metainterp.history import (ResOperation, Box, Const,
      ConstInt, ConstPtr, BoxInt, BoxPtr, ConstAddr, AbstractDescr)
-from pypy.jit.backend.x86.assembler import Assembler386, WORD, RETURN
+from pypy.jit.backend.x86.assembler import Assembler386, WORD
 from pypy.jit.backend.x86 import symbolic
 from pypy.jit.metainterp.resoperation import rop, opname
 from pypy.jit.backend.x86.support import gc_malloc_fnaddr
@@ -58,8 +58,6 @@
                                     lltype.Ptr(rffi.CArray(lltype.Signed))],
                                    lltype.Signed)
 
-    return_value_type = 0
-
     def __init__(self, rtyper, stats, translate_support_code=False,
                  mixlevelann=None):
         self.rtyper = rtyper
@@ -219,20 +217,25 @@
         elif isinstance(box, BoxPtr):
             box.value = self.cast_int_to_gcref(fail_boxes[index])
 
-    def _get_mp_for_call(self, argnum, calldescr):
+    def _get_loop_for_call(self, argnum, calldescr, ptr):
         try:
             return self.generated_mps[calldescr]
         except KeyError:
             pass
         args = [BoxInt(0) for i in range(argnum + 1)]
-        result = BoxInt(0)
+        if ptr:
+            result = BoxPtr(lltype.nullptr(llmemory.GCREF))
+        else:
+            result = BoxInt(0)
         operations = [
-            ResOperation(rop.MERGE_POINT, args, None),
             ResOperation(rop.CALL, args, result, calldescr),
-            ResOperation(RETURN, [result], None)]
-        self.compile_operations(operations)
-        self.generated_mps[calldescr] = operations
-        return operations
+            ResOperation(rop.FAIL, [result], None)]
+        loop = history.TreeLoop('call')
+        loop.inputargs = args
+        loop.operations = operations
+        self.compile_operations(loop)
+        self.generated_mps[calldescr] = loop
+        return loop
 
     def execute_operations(self, loop, valueboxes):
         func = self.get_bootstrap_code(loop)
@@ -255,7 +258,11 @@
         keepalive_until_here(valueboxes)
         self.keepalives_index = oldindex
         del self.keepalives[oldindex:]
-        op = self._guard_list[guard_index]
+        if guard_index == -1:
+            # special case for calls
+            op = loop.operations[-1]
+        else:
+            op = self._guard_list[guard_index]
         for i in range(len(op.args)):
             box = op.args[i]
             self.set_value_of_box(box, i, loop.fail_boxes)
@@ -486,16 +493,11 @@
 
     def do_call(self, args, calldescr):
         num_args, size, ptr = self.unpack_calldescr(calldescr)
-        xxx
-        mp = self._get_mp_for_call(num_args, calldescr)
+        loop = self._get_loop_for_call(num_args, calldescr, ptr)
+        op = self.execute_operations(loop, args)
         if size == 0:
-            self.return_value_type = VOID
-        elif ptr:
-            self.return_value_type = PTR
-        else:
-            self.return_value_type = INT
-        result = self.execute_operations(mp, args)
-        return result
+            return None
+        return op.args[0]
 
     # ------------------- helpers and descriptions --------------------
 



More information about the Pypy-commit mailing list