[pypy-commit] pypy cleanup-llgraph-backend: (fijal, arigo) progress
fijal
noreply at buildbot.pypy.org
Wed Oct 17 10:50:19 CEST 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: cleanup-llgraph-backend
Changeset: r58154:716b88c56d65
Date: 2012-10-17 10:50 +0200
http://bitbucket.org/pypy/pypy/changeset/716b88c56d65/
Log: (fijal, arigo) progress
diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -7,7 +7,7 @@
from pypy.jit.metainterp.resoperation import rop
from pypy.rpython.llinterp import LLInterpreter
-from pypy.rpython.lltypesystem import lltype, llmemory, rclass
+from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr
from pypy.rlib.rarithmetic import ovfcheck
@@ -52,6 +52,12 @@
def is_array_of_pointers(self):
return getkind(self.A.OF) == 'ref'
+class InteriorFieldDescr(AbstractDescr):
+ def __init__(self, A, fieldname):
+ self.A = A
+ self.fieldname = fieldname
+ self.FIELD = getattr(A.OF, fieldname)
+
class LLGraphCPU(model.AbstractCPU):
def __init__(self, rtyper):
self.rtyper = rtyper
@@ -131,6 +137,15 @@
self.descrs[key] = descr
return descr
+ def interiorfielddescrof(self, A, fieldname):
+ key = ('interiorfield', A, fieldname)
+ try:
+ return self.descrs[key]
+ except KeyError:
+ descr = InteriorFieldDescr(A, fieldname)
+ self.descrs[key] = descr
+ return descr
+
def _calldescr_dynamic_for_tests(self, atypes, rtype,
abiname='FFI_DEFAULT_ABI'):
# XXX WTF is that and why it breaks all abstractions?
@@ -170,12 +185,36 @@
res = func(*args)
return support.cast_result(RESULT, res)
- def do_call(self, func, calldescr, args_i, args_r, args_f):
+ def _do_call(self, func, calldescr, args_i, args_r, args_f):
TP = llmemory.cast_int_to_adr(func).ptr._obj._TYPE
args = support.cast_call_args(TP.ARGS, args_i, args_r, args_f)
return self.call(func, calldescr, args)
- bh_call_i = do_call
+ bh_call_i = _do_call
+
+ def do_getinteriorfield_gc(self, a, index, descr):
+ array = a._obj.container
+ return support.cast_result(descr.FIELD,
+ getattr(array.getitem(index), descr.fieldname))
+
+ bh_getinteriorfield_gc_f = do_getinteriorfield_gc
+ bh_getinteriorfield_gc_i = do_getinteriorfield_gc
+ bh_getinteriorfield_gc_r = do_getinteriorfield_gc
+
+ def do_setinteriorfield_gc(self, a, index, item, descr):
+ array = a._obj.container
+ setattr(array.getitem(index), descr.fieldname,
+ support.cast_arg(descr.FIELD, item))
+
+ bh_setinteriorfield_gc_f = do_setinteriorfield_gc
+ bh_setinteriorfield_gc_r = do_setinteriorfield_gc
+ bh_setinteriorfield_gc_i = do_setinteriorfield_gc
+
+ def do_newunicode(self, length):
+ return lltype.cast_opaque_ptr(llmemory.GCREF,
+ lltype.malloc(rstr.UNICODE, length))
+
+ bh_newunicode = do_newunicode
class LLFrame(object):
def __init__(self, cpu, argboxes, args):
@@ -351,6 +390,29 @@
array = a._obj.container
return support.cast_result(descr.A.OF, array.getitem(index))
+ def execute_strlen(self, descr, s):
+ return s._obj.container.chars.getlength()
+
+ def execute_strgetitem(self, descr, s, item):
+ return ord(s._obj.container.chars.getitem(item))
+
+ def execute_strsetitem(self, descr, s, item, v):
+ s._obj.container.chars.setitem(item, chr(v))
+
+ def execute_copystrcontent(self, _, src, dst, srcstart, dststart, length):
+ src = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), src)
+ dst = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), dst)
+ assert 0 <= srcstart <= srcstart + length <= len(src.chars)
+ assert 0 <= dststart <= dststart + length <= len(dst.chars)
+ rstr.copy_string_contents(src, dst, srcstart, dststart, length)
+
+ def execute_copyunicodecontent(self, _, src, dst, srcstart, dststart, length):
+ src = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), src)
+ dst = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), dst)
+ assert 0 <= srcstart <= srcstart + length <= len(src.chars)
+ assert 0 <= dststart <= dststart + length <= len(dst.chars)
+ rstr.copy_unicode_contents(src, dst, srcstart, dststart, length)
+
def _setup():
def _make_impl_from_blackhole_interp(opname):
from pypy.jit.metainterp.blackhole import BlackholeInterpreter
@@ -370,11 +432,20 @@
_op_default_implementation.func_name = 'execute_' + opname
return _op_default_implementation
+ def _new_execute(opname):
+ def execute(self, descr, *args):
+ new_args = args + (descr,)
+ return getattr(self.cpu, 'do_' + opname)(*new_args)
+ execute.func_name = 'execute_' + opname
+ return execute
+
for k, v in rop.__dict__.iteritems():
if not k.startswith("_"):
func = _make_impl_from_blackhole_interp(k)
fname = 'execute_' + k.lower()
if func is not None and not hasattr(LLFrame, fname):
setattr(LLFrame, fname, func)
+ elif hasattr(LLGraphCPU, 'do_' + k.lower()):
+ setattr(LLFrame, fname, _new_execute(k.lower()))
_setup()
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -1002,7 +1002,7 @@
'void', descr=kdescr)
f = self.cpu.bh_getinteriorfield_gc_f(a_box.getref_base(), 3, kdescr)
assert longlong.getrealfloat(f) == 1.5
- self.cpu.bh_setinteriorfield_gc_f(a_box.getref_base(), 3, kdescr, longlong.getfloatstorage(2.5))
+ self.cpu.bh_setinteriorfield_gc_f(a_box.getref_base(), 3, longlong.getfloatstorage(2.5), kdescr)
r = self.execute_operation(rop.GETINTERIORFIELD_GC, [a_box, BoxInt(3)],
'float', descr=kdescr)
assert r.getfloat() == 2.5
@@ -1028,7 +1028,7 @@
for name, TYPE in NUMBER_FIELDS[::-1]:
vdescr = self.cpu.interiorfielddescrof(A, name)
self.cpu.bh_setinteriorfield_gc_i(a_box.getref_base(), 3,
- vdescr, -25)
+ -25, vdescr)
for name, TYPE in NUMBER_FIELDS:
vdescr = self.cpu.interiorfielddescrof(A, name)
r = self.execute_operation(rop.GETINTERIORFIELD_GC,
@@ -1041,8 +1041,8 @@
'void', descr=pdescr)
r = self.cpu.bh_getinteriorfield_gc_r(a_box.getref_base(), 4, pdescr)
assert r == s_box.getref_base()
- self.cpu.bh_setinteriorfield_gc_r(a_box.getref_base(), 3, pdescr,
- s_box.getref_base())
+ self.cpu.bh_setinteriorfield_gc_r(a_box.getref_base(), 3,
+ s_box.getref_base(), pdescr)
r = self.execute_operation(rop.GETINTERIORFIELD_GC, [a_box, BoxInt(3)],
'ref', descr=pdescr)
assert r.getref_base() == s_box.getref_base()
diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py
--- a/pypy/jit/metainterp/blackhole.py
+++ b/pypy/jit/metainterp/blackhole.py
@@ -1208,13 +1208,13 @@
@arguments("cpu", "r", "i", "i", "d")
def bhimpl_setinteriorfield_gc_i(cpu, array, index, value, descr):
- cpu.bh_setinteriorfield_gc_i(array, index, descr, value)
+ cpu.bh_setinteriorfield_gc_i(array, index, value, descr)
@arguments("cpu", "r", "i", "r", "d")
def bhimpl_setinteriorfield_gc_r(cpu, array, index, value, descr):
- cpu.bh_setinteriorfield_gc_r(array, index, descr, value)
+ cpu.bh_setinteriorfield_gc_r(array, index, value, descr)
@arguments("cpu", "r", "i", "f", "d")
def bhimpl_setinteriorfield_gc_f(cpu, array, index, value, descr):
- cpu.bh_setinteriorfield_gc_f(array, index, descr, value)
+ cpu.bh_setinteriorfield_gc_f(array, index, value, descr)
@arguments("cpu", "r", "d", returns="i")
def bhimpl_getfield_gc_i(cpu, struct, fielddescr):
More information about the pypy-commit
mailing list