[pypy-svn] r51266 - in pypy/branch/jit-refactoring/pypy/jit: rainbow rainbow/test timeshifter
cfbolz at codespeak.net
cfbolz at codespeak.net
Mon Feb 4 21:10:18 CET 2008
Author: cfbolz
Date: Mon Feb 4 21:10:16 2008
New Revision: 51266
Modified:
pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py
Log:
simple virtual container test passes
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/codewriter.py Mon Feb 4 21:10:16 2008
@@ -144,7 +144,21 @@
linkfalse, linktrue = linktrue, linkfalse
color = self.varcolor(block.exitswitch)
index = self.serialize_oparg(color, block.exitswitch)
- self.emit("%s_goto_iftrue" % color)
+ srcopname, srcargs = self.trace_back_bool_var(
+ block, block.exitswitch)
+ if color == "red" and srcopname is not None:
+ if srcopname == 'ptr_nonzero':
+ reverse = False
+ split_extras = srcargs
+ elif srcopname == 'ptr_iszero':
+ reverse = True
+ split_extras = srcargs
+ ptrindex = self.serialize_oparg("red", srcargs[0])
+ self.emit("red_goto_ifptrnonzero")
+ self.emit(reverse)
+ self.emit(ptrindex)
+ else:
+ self.emit("%s_goto_iftrue" % color)
self.emit(index)
self.emit(tlabel(linktrue))
self.insert_renaming(linkfalse)
@@ -192,7 +206,10 @@
def serialize_op(self, op):
specialcase = getattr(self, "serialize_op_%s" % (op.opname, ), None)
if specialcase is not None:
- return specialcase(op)
+ try:
+ return specialcase(op)
+ except NotImplementedError:
+ pass
color = self.opcolor(op)
args = []
for arg in op.args:
@@ -445,6 +462,14 @@
def serialize_op_indirect_call(self, op):
XXX
+ def serialize_op_malloc(self, op):
+ index = self.structtypedesc_position(op.args[0].value)
+ self.emit("red_malloc", index)
+ self.register_redvar(op.result)
+
+ def serialize_op_zero_gc_pointers_inside(self, op):
+ pass # XXX is that right?
+
def serialize_op_getfield(self, op):
assert self.opcolor(op) == "red"
args = op.args
@@ -478,6 +503,33 @@
self.register_redvar(op.result)
+ def serialize_op_setfield(self, op):
+ args = op.args
+ PTRTYPE = args[0].concretetype
+ VALUETYPE = args[2].concretetype
+ if VALUETYPE is lltype.Void:
+ return
+ if args[0] == self.exceptiondesc.cexcdata:
+ # reading one of the exception boxes (exc_type or exc_value)
+ fieldname = args[1].value
+ val = self.serialize_oparg("red", args[2])
+ if fieldname == 'exc_type':
+ self.emit("write_exctype", val)
+ elif fieldname == 'exc_value':
+ self.emit("write_excvalue", val)
+ else:
+ raise Exception("getfield(exc_data, %r)" % (fieldname,))
+ return
+ # non virtual case
+ destboxindex = self.serialize_oparg("red", args[0])
+ valboxindex = self.serialize_oparg("red", args[2])
+ fieldname = args[1].value
+ fielddescindex = self.fielddesc_position(PTRTYPE.TO, fieldname)
+ if fielddescindex == -1: # Void field
+ return
+ self.emit("red_setfield", destboxindex, fielddescindex, valboxindex)
+
+
# call handling
def graphs_from(self, spaceop):
@@ -505,6 +557,29 @@
tsgraph = self.specialized_graph_of(graph, args_v, spaceop.result)
yield graph, tsgraph
+ def trace_back_bool_var(self, block, v):
+ """Return the (opname, arguments) that created the exitswitch of
+ the block. The opname is None if not found.
+ """
+ inverted = False
+ for i in range(len(block.operations)-1, -1, -1):
+ op = block.operations[i]
+ if op.result is v:
+ if op.opname == 'bool_not':
+ inverted = not inverted
+ [v] = op.args
+ elif op.opname == 'same_as':
+ [v] = op.args
+ else:
+ opname = op.opname
+ opargs = op.args
+ if inverted:
+ opname = {'ptr_nonzero': 'ptr_iszero',
+ 'ptr_iszero' : 'ptr_nonzero'}.get(opname)
+ return opname, opargs # found
+ # not found, comes from earlier block - give up
+ return None, None
+
def guess_call_kind(self, spaceop):
if spaceop.opname == 'direct_call':
c_func = spaceop.args[0]
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/interpreter.py Mon Feb 4 21:10:16 2008
@@ -1,6 +1,6 @@
from pypy.rlib.rarithmetic import intmask
from pypy.rlib.unroll import unrolling_iterable
-from pypy.jit.timeshifter import rtimeshift
+from pypy.jit.timeshifter import rtimeshift, rcontainer
from pypy.jit.timeshifter.greenkey import empty_key, GreenKey
from pypy.rpython.lltypesystem import lltype
@@ -201,6 +201,35 @@
if descision:
self.frame.pc = target
+ def opimpl_red_goto_ifptrnonzero(self):
+ reverse = self.load_bool()
+ ptrbox = self.get_redarg()
+ switchbox = self.get_redarg()
+ target = self.load_4byte()
+ # XXX not sure about passing no green vars
+ descision = rtimeshift.split_ptr_nonzero(self.jitstate, switchbox,
+ self.frame.pc, ptrbox, reverse)
+ if descision:
+ self.frame.pc = target
+
+ def opimpl_red_ptr_nonzero(self, reverse=False):
+ ptrbox = self.get_redarg()
+ resultbox = rtimeshift.genptrnonzero(self.jitstate, ptrbox, reverse)
+ self.red_result(resultbox)
+
+ def opimpl_red_ptr_iszero(self):
+ self.opimpl_red_ptr_nonzero(reverse=True)
+
+ def opimpl_red_ptr_eq(self, reverse=False):
+ ptrbox1 = self.get_redarg()
+ ptrbox2 = self.get_redarg()
+ resultbox = rtimeshift.genptreq(self.jitstate, ptrbox1,
+ ptrbox2, reverse)
+ self.red_result(resultbox)
+
+ def opimpl_red_ptr_ne(self):
+ self.opimpl_red_ptr_eq(reverse=True)
+
def opimpl_red_return(self):
rtimeshift.save_return(self.jitstate)
return self.dispatch()
@@ -296,8 +325,21 @@
def opimpl_read_excvalue(self):
XXX
+ def opimpl_write_exctype(self):
+ typebox = self.get_redarg()
+ rtimeshift.setexctypebox(self.jitstate, typebox)
+
+ def opimpl_write_excvalue(self):
+ valuebox = self.get_redarg()
+ rtimeshift.setexcvaluebox(self.jitstate, valuebox)
+
# structs and arrays
+ def opimpl_red_malloc(self):
+ structtypedesc = self.frame.bytecode.structtypedescs[self.load_2byte()]
+ redbox = rcontainer.create(self.jitstate, structtypedesc)
+ self.red_result(redbox)
+
def opimpl_red_getfield(self):
structbox = self.get_redarg()
fielddesc = self.frame.bytecode.fielddescs[self.load_2byte()]
@@ -306,6 +348,12 @@
structbox)
self.red_result(resbox)
+ def opimpl_red_setfield(self):
+ destbox = self.get_redarg()
+ fielddesc = self.frame.bytecode.fielddescs[self.load_2byte()]
+ valuebox = self.get_redarg()
+ resbox = rtimeshift.gensetfield(self.jitstate, fielddesc, destbox,
+ valuebox)
# ____________________________________________________________
# construction-time interface
Modified: pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/rainbow/test/test_interpreter.py Mon Feb 4 21:10:16 2008
@@ -708,7 +708,6 @@
self.check_insns({'int_add': 2, 'int_sub': 1})
def test_red_virtual_container(self):
- py.test.skip("arrays and structs are not working")
# this checks that red boxes are able to be virtualized dynamically by
# the compiler (the P_NOVIRTUAL policy prevents the hint-annotator from
# marking variables in blue)
@@ -717,7 +716,7 @@
s = lltype.malloc(S)
s.n = n
return s.n
- res = self.interpret(ll_function, [42], [], policy=P_NOVIRTUAL)
+ res = self.interpret(ll_function, [42], [])
assert res == 42
self.check_insns({})
Modified: pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py (original)
+++ pypy/branch/jit-refactoring/pypy/jit/timeshifter/rtimeshift.py Mon Feb 4 21:10:16 2008
@@ -222,7 +222,7 @@
return interiordesc.gengetinteriorarraysize(jitstate, argbox, *indexboxes)
-def ll_genptrnonzero(jitstate, argbox, reverse):
+def genptrnonzero(jitstate, argbox, reverse):
if argbox.is_constant():
addr = rvalue.ll_getvalue(argbox, llmemory.Address)
return rvalue.ll_fromvalue(jitstate, bool(addr) ^ reverse)
@@ -237,7 +237,7 @@
gv_res = builder.genop_ptr_nonzero(argbox.kind, gv_addr)
return rvalue.IntRedBox(builder.rgenop.kindToken(lltype.Bool), gv_res)
-def ll_genptreq(jitstate, argbox0, argbox1, reverse):
+def genptreq(jitstate, argbox0, argbox1, reverse):
builder = jitstate.curbuilder
if argbox0.is_constant() and argbox1.is_constant():
addr0 = rvalue.ll_getvalue(argbox0, llmemory.Address)
More information about the Pypy-commit
mailing list