[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