[pypy-svn] r74047 - in pypy/branch/blackhole-improvement/pypy/jit: backend backend/llgraph codewriter metainterp
arigo at codespeak.net
arigo at codespeak.net
Sun Apr 25 10:55:43 CEST 2010
Author: arigo
Date: Sun Apr 25 10:55:41 2010
New Revision: 74047
Modified:
pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
pypy/branch/blackhole-improvement/pypy/jit/backend/model.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/regalloc.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
Log:
test_basic.test_format passes.
Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/runner.py Sun Apr 25 10:55:41 2010
@@ -422,6 +422,10 @@
count = countbox.getint()
return history.BoxPtr(llimpl.do_new_array(size.ofs, count))
+ def bh_new_array(self, arraydescr, length):
+ assert isinstance(arraydescr, Descr)
+ return llimpl.do_new_array(arraydescr.ofs, length)
+
def do_setarrayitem_gc(self, arraybox, indexbox, newvaluebox, arraydescr):
assert isinstance(arraydescr, Descr)
array = arraybox.getref_base()
@@ -439,6 +443,10 @@
else:
raise NotImplementedError
+ def bh_setarrayitem_gc_r(self, arraydescr, array, index, newvalue):
+ assert isinstance(arraydescr, Descr)
+ llimpl.do_setarrayitem_gc_ptr(array, index, newvalue)
+
def do_setfield_gc(self, structbox, newvaluebox, fielddescr):
assert isinstance(fielddescr, Descr)
struct = structbox.getref_base()
Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/model.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/model.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/model.py Sun Apr 25 10:55:41 2010
@@ -192,13 +192,23 @@
def do_new_with_vtable(self, classbox):
raise NotImplementedError
-
+
def do_new_array(self, lengthbox, arraydescr):
raise NotImplementedError
+
+ def bh_new_array(self, arraydescr, length):
+ raise NotImplementedError
def do_setarrayitem_gc(self, arraybox, indexbox, newvaluebox, arraydescr):
raise NotImplementedError
+ def bh_setarrayitem_gc_i(self, arraydescr, array, index, newvalue):
+ raise NotImplementedError
+ def bh_setarrayitem_gc_r(self, arraydescr, array, index, newvalue):
+ raise NotImplementedError
+ def bh_setarrayitem_gc_f(self, arraydescr, array, index, newvalue):
+ raise NotImplementedError
+
def do_setarrayitem_raw(self, arraybox, indexbox, newvaluebox, arraydescr):
raise NotImplementedError
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/codewriter.py Sun Apr 25 10:55:41 2010
@@ -19,14 +19,35 @@
return self.transform_graph_to_jitcode(graph)
def transform_graph_to_jitcode(self, graph, verbose=False):
+ """Transform a graph into a JitCode containing the same bytecode
+ in a different format. Note that the original 'graph' is mangled
+ by the process and should not be used any more.
+ """
+ #
+ # step 1: mangle the graph so that it contains the final instructions
+ # that we want in the JitCode, but still as a control flow graph
transform_graph(graph, self.cpu)
+ #
+ # step 2: perform register allocation on it
regallocs = {}
for kind in KINDS:
regallocs[kind] = perform_register_allocation(graph, kind)
+ #
+ # step 3: flatten the graph to produce human-readable "assembler",
+ # which means mostly producing a linear list of operations and
+ # inserting jumps or conditional jumps. This is a list of tuples
+ # of the shape ("opname", arg1, ..., argN) or (Label(...),).
ssarepr = flatten_graph(graph, regallocs)
+ #
+ # if 'verbose', print the resulting assembler
if verbose:
print graph
print indent(format_assembler(ssarepr), 4)
+ #
+ # step 4: "assemble" it into a JitCode, which contains a sequence
+ # of bytes and lists of constants. It's during this step that
+ # constants are cast to their normalized type (Signed, GCREF or
+ # Float).
jitcode = self.assembler.assemble(ssarepr)
return jitcode
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py Sun Apr 25 10:55:41 2010
@@ -1,4 +1,4 @@
-from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.lltypesystem import lltype, rstr
from pypy.jit.metainterp.history import getkind
from pypy.objspace.flow.model import SpaceOperation
from pypy.jit.codewriter.flatten import ListOfKind
@@ -119,8 +119,7 @@
hints = op.args[1].value
if hints.get('promote') and op.args[0].concretetype is not lltype.Void:
#self.minimize_variables()
- from pypy.rpython.lltypesystem.rstr import STR
- assert op.args[0].concretetype != lltype.Ptr(STR)
+ assert op.args[0].concretetype != lltype.Ptr(rstr.STR)
kind = getkind(op.args[0].concretetype)
return SpaceOperation('%s_guard_value' % kind,
[op.args[0]], op.result)
@@ -128,6 +127,43 @@
log.WARNING('ignoring hint %r at %r' % (hints, self.graph))
raise NoOp
+ def rewrite_op_malloc_varsize(self, op):
+ assert op.args[1].value == {'flavor': 'gc'}
+ if op.args[0].value == rstr.STR:
+ return SpaceOperation('newstr', [op.args[2]], op.result)
+ elif op.args[0].value == rstr.UNICODE:
+ return SpaceOperation('newunicode', [op.args[2]], op.result)
+ else:
+ # XXX only strings or simple arrays for now
+ ARRAY = op.args[0].value
+ arraydescr = self.cpu.arraydescrof(ARRAY)
+ return SpaceOperation('new_array', [arraydescr, op.args[2]],
+ op.result)
+
+ def rewrite_op_setarrayitem(self, op):
+ ARRAY = op.args[0].concretetype.TO
+ assert ARRAY._gckind == 'gc'
+ if self._array_of_voids(ARRAY):
+ return
+## if op.args[0] in self.vable_array_vars: # for virtualizables
+## (v_base, arrayindex) = self.vable_array_vars[op.args[0]]
+## self.emit('setarrayitem_vable',
+## self.var_position(v_base),
+## arrayindex,
+## self.var_position(op.args[1]),
+## self.var_position(op.args[2]))
+## return
+ arraydescr = self.cpu.arraydescrof(ARRAY)
+ kind = getkind(op.args[2].concretetype)
+ return SpaceOperation('setarrayitem_gc_%s' % kind[0],
+ [arraydescr] + op.args, None)
+
+ def _array_of_voids(self, ARRAY):
+ #if isinstance(ARRAY, ootype.Array):
+ # return ARRAY.ITEM == ootype.Void
+ #else:
+ return ARRAY.OF == lltype.Void
+
# ____________________________________________________________
_rewrite_ops = {}
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/regalloc.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/regalloc.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/regalloc.py Sun Apr 25 10:55:41 2010
@@ -62,7 +62,8 @@
except KeyError:
pass
die_index += 1
- if getkind(op.result.concretetype) == self.kind:
+ if (op.result is not None and
+ getkind(op.result.concretetype) == self.kind):
dg.add_node(op.result)
for v in livevars:
if getkind(v.concretetype) == self.kind:
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py Sun Apr 25 10:55:41 2010
@@ -75,15 +75,20 @@
args = ()
next_argcode = 0
for argtype in argtypes:
- if argtype == 'i':
- # argcode can be 'i' or 'c'; 'c' stands for a single
- # signed byte that gives the value of a small constant.
+ if argtype == 'i' or argtype == 'r' or argtype == 'f':
+ # if argtype is 'i', then argcode can be 'i' or 'c';
+ # 'c' stands for a single signed byte that gives the
+ # value of a small constant.
argcode = argcodes[next_argcode]
next_argcode = next_argcode + 1
if argcode == 'i':
value = self.registers_i[ord(code[position])]
elif argcode == 'c':
value = signedord(code[position])
+ elif argcode == 'r':
+ value = self.registers_r[ord(code[position])]
+ elif argcode == 'f':
+ value = self.registers_f[ord(code[position])]
else:
raise AssertionError("bad argcode")
position += 1
@@ -289,6 +294,9 @@
def opimpl_goto(self, target):
return target
+ # ----------
+ # the following operations are directly implemented by the backend
+
@arguments("i", "d", "R", returns="i")
def opimpl_residual_call_r_i(self, func, calldescr, args_r):
return self.cpu.bh_call_i(func, calldescr, None, args_r, None)
@@ -327,3 +335,10 @@
@arguments("i", "d", "I", "R", "F", returns="v")
def opimpl_residual_call_irf_v(self, func, calldescr,args_i,args_r,args_f):
return self.cpu.bh_call_v(func, calldescr, args_i, args_r, args_f)
+
+ @arguments("d", "i", returns="r")
+ def opimpl_new_array(self, arraydescr, length):
+ return self.cpu.bh_new_array(arraydescr, length)
+ @arguments("d", "r", "i", "r")
+ def opimpl_setarrayitem_gc_r(self, arraydescr, array, index, newvalue):
+ self.cpu.bh_setarrayitem_gc_r(arraydescr, array, index, newvalue)
More information about the Pypy-commit
mailing list