[pypy-svn] r74292 - pypy/branch/blackhole-improvement/pypy/jit/metainterp
arigo at codespeak.net
arigo at codespeak.net
Fri Apr 30 17:14:45 CEST 2010
Author: arigo
Date: Fri Apr 30 17:14:43 2010
New Revision: 74292
Modified:
pypy/branch/blackhole-improvement/pypy/jit/metainterp/blackhole.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
Log:
Enough to make test_format pass also on pyjitpl.
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 Fri Apr 30 17:14:43 2010
@@ -125,6 +125,8 @@
position += length
elif argtype == 'self':
value = self
+ elif argtype == 'cpu':
+ value = self.cpu
elif argtype == 'pc':
value = position
elif argtype == 'd':
@@ -706,67 +708,67 @@
# ----------
# the following operations are directly implemented by the backend
- @arguments("self", "i", "d", "R", returns="i")
- def bhimpl_residual_call_r_i(self, func, calldescr, args_r):
- return self.cpu.bh_call_i(func, calldescr, None, args_r, None)
- @arguments("self", "i", "d", "R", returns="r")
- def bhimpl_residual_call_r_r(self, func, calldescr, args_r):
- return self.cpu.bh_call_r(func, calldescr, None, args_r, None)
- @arguments("self", "i", "d", "R", returns="f")
- def bhimpl_residual_call_r_f(self, func, calldescr, args_r):
- return self.cpu.bh_call_f(func, calldescr, None, args_r, None)
- @arguments("self", "i", "d", "R")
- def bhimpl_residual_call_r_v(self, func, calldescr, args_r):
- self.cpu.bh_call_v(func, calldescr, None, args_r, None)
-
- @arguments("self", "i", "d", "I", "R", returns="i")
- def bhimpl_residual_call_ir_i(self, func, calldescr, args_i, args_r):
- return self.cpu.bh_call_i(func, calldescr, args_i, args_r, None)
- @arguments("self", "i", "d", "I", "R", returns="r")
- def bhimpl_residual_call_ir_r(self, func, calldescr, args_i, args_r):
- return self.cpu.bh_call_r(func, calldescr, args_i, args_r, None)
- @arguments("self", "i", "d", "I", "R", returns="f")
- def bhimpl_residual_call_ir_f(self, func, calldescr, args_i, args_r):
- return self.cpu.bh_call_f(func, calldescr, args_i, args_r, None)
- @arguments("self", "i", "d", "I", "R")
- def bhimpl_residual_call_ir_v(self, func, calldescr, args_i, args_r):
- self.cpu.bh_call_v(func, calldescr, args_i, args_r, None)
-
- @arguments("self", "i", "d", "I", "R", "F", returns="i")
- def bhimpl_residual_call_irf_i(self, func, calldescr,args_i,args_r,args_f):
- return self.cpu.bh_call_i(func, calldescr, args_i, args_r, args_f)
- @arguments("self", "i", "d", "I", "R", "F", returns="r")
- def bhimpl_residual_call_irf_r(self, func, calldescr,args_i,args_r,args_f):
- return self.cpu.bh_call_r(func, calldescr, args_i, args_r, args_f)
- @arguments("self", "i", "d", "I", "R", "F", returns="f")
- def bhimpl_residual_call_irf_f(self, func, calldescr,args_i,args_r,args_f):
- return self.cpu.bh_call_f(func, calldescr, args_i, args_r, args_f)
- @arguments("self", "i", "d", "I", "R", "F")
- def bhimpl_residual_call_irf_v(self, func, calldescr,args_i,args_r,args_f):
- self.cpu.bh_call_v(func, calldescr, args_i, args_r, args_f)
-
- @arguments("self", "d", "i", returns="r")
- def bhimpl_new_array(self, arraydescr, length):
- return self.cpu.bh_new_array(arraydescr, length)
- @arguments("self", "d", "r", "i", "r")
- def bhimpl_setarrayitem_gc_r(self, arraydescr, array, index, newvalue):
- self.cpu.bh_setarrayitem_gc_r(arraydescr, array, index, newvalue)
-
- @arguments("self", "r", "d", returns="i")
- def bhimpl_getfield_gc_i(self, struct, fielddescr):
- return self.cpu.bh_getfield_gc_i(struct, fielddescr)
- @arguments("self", "r", "d", returns="i")
- def bhimpl_getfield_gc_c(self, struct, fielddescr):
- return self.cpu.bh_getfield_gc_c(struct, fielddescr)
- @arguments("self", "r", "d", returns="i")
- def bhimpl_getfield_gc_u(self, struct, fielddescr):
- return self.cpu.bh_getfield_gc_u(struct, fielddescr)
- @arguments("self", "r", "d", returns="r")
- def bhimpl_getfield_gc_r(self, struct, fielddescr):
- return self.cpu.bh_getfield_gc_r(struct, fielddescr)
- @arguments("self", "r", "d", returns="f")
- def bhimpl_getfield_gc_f(self, struct, fielddescr):
- return self.cpu.bh_getfield_gc_f(struct, fielddescr)
+ @arguments("cpu", "i", "d", "R", returns="i")
+ def bhimpl_residual_call_r_i(cpu, func, calldescr, args_r):
+ return cpu.bh_call_i(func, calldescr, None, args_r, None)
+ @arguments("cpu", "i", "d", "R", returns="r")
+ def bhimpl_residual_call_r_r(cpu, func, calldescr, args_r):
+ return cpu.bh_call_r(func, calldescr, None, args_r, None)
+ @arguments("cpu", "i", "d", "R", returns="f")
+ def bhimpl_residual_call_r_f(cpu, func, calldescr, args_r):
+ return cpu.bh_call_f(func, calldescr, None, args_r, None)
+ @arguments("cpu", "i", "d", "R")
+ def bhimpl_residual_call_r_v(cpu, func, calldescr, args_r):
+ cpu.bh_call_v(func, calldescr, None, args_r, None)
+
+ @arguments("cpu", "i", "d", "I", "R", returns="i")
+ def bhimpl_residual_call_ir_i(cpu, func, calldescr, args_i, args_r):
+ return cpu.bh_call_i(func, calldescr, args_i, args_r, None)
+ @arguments("cpu", "i", "d", "I", "R", returns="r")
+ def bhimpl_residual_call_ir_r(cpu, func, calldescr, args_i, args_r):
+ return cpu.bh_call_r(func, calldescr, args_i, args_r, None)
+ @arguments("cpu", "i", "d", "I", "R", returns="f")
+ def bhimpl_residual_call_ir_f(cpu, func, calldescr, args_i, args_r):
+ return cpu.bh_call_f(func, calldescr, args_i, args_r, None)
+ @arguments("cpu", "i", "d", "I", "R")
+ def bhimpl_residual_call_ir_v(cpu, func, calldescr, args_i, args_r):
+ cpu.bh_call_v(func, calldescr, args_i, args_r, None)
+
+ @arguments("cpu", "i", "d", "I", "R", "F", returns="i")
+ def bhimpl_residual_call_irf_i(cpu, func, calldescr,args_i,args_r,args_f):
+ return cpu.bh_call_i(func, calldescr, args_i, args_r, args_f)
+ @arguments("cpu", "i", "d", "I", "R", "F", returns="r")
+ def bhimpl_residual_call_irf_r(cpu, func, calldescr,args_i,args_r,args_f):
+ return cpu.bh_call_r(func, calldescr, args_i, args_r, args_f)
+ @arguments("cpu", "i", "d", "I", "R", "F", returns="f")
+ def bhimpl_residual_call_irf_f(cpu, func, calldescr,args_i,args_r,args_f):
+ return cpu.bh_call_f(func, calldescr, args_i, args_r, args_f)
+ @arguments("cpu", "i", "d", "I", "R", "F")
+ def bhimpl_residual_call_irf_v(cpu, func, calldescr,args_i,args_r,args_f):
+ cpu.bh_call_v(func, calldescr, args_i, args_r, args_f)
+
+ @arguments("cpu", "d", "i", returns="r")
+ def bhimpl_new_array(cpu, arraydescr, length):
+ return cpu.bh_new_array(arraydescr, length)
+ @arguments("cpu", "d", "r", "i", "r")
+ def bhimpl_setarrayitem_gc_r(cpu, arraydescr, array, index, newvalue):
+ cpu.bh_setarrayitem_gc_r(arraydescr, array, index, newvalue)
+
+ @arguments("cpu", "r", "d", returns="i")
+ def bhimpl_getfield_gc_i(cpu, struct, fielddescr):
+ return cpu.bh_getfield_gc_i(struct, fielddescr)
+ @arguments("cpu", "r", "d", returns="i")
+ def bhimpl_getfield_gc_c(cpu, struct, fielddescr):
+ return cpu.bh_getfield_gc_c(struct, fielddescr)
+ @arguments("cpu", "r", "d", returns="i")
+ def bhimpl_getfield_gc_u(cpu, struct, fielddescr):
+ return cpu.bh_getfield_gc_u(struct, fielddescr)
+ @arguments("cpu", "r", "d", returns="r")
+ def bhimpl_getfield_gc_r(cpu, struct, fielddescr):
+ return cpu.bh_getfield_gc_r(struct, fielddescr)
+ @arguments("cpu", "r", "d", returns="f")
+ def bhimpl_getfield_gc_f(cpu, struct, fielddescr):
+ return cpu.bh_getfield_gc_f(struct, fielddescr)
bhimpl_getfield_gc_i_pure = bhimpl_getfield_gc_i
bhimpl_getfield_gc_c_pure = bhimpl_getfield_gc_c
@@ -774,21 +776,21 @@
bhimpl_getfield_gc_r_pure = bhimpl_getfield_gc_r
bhimpl_getfield_gc_f_pure = bhimpl_getfield_gc_f
- @arguments("self", "i", "d", returns="i")
- def bhimpl_getfield_raw_i(self, struct, fielddescr):
- return self.cpu.bh_getfield_raw_i(struct, fielddescr)
- @arguments("self", "i", "d", returns="i")
- def bhimpl_getfield_raw_c(self, struct, fielddescr):
- return self.cpu.bh_getfield_raw_c(struct, fielddescr)
- @arguments("self", "i", "d", returns="i")
- def bhimpl_getfield_raw_u(self, struct, fielddescr):
- return self.cpu.bh_getfield_raw_u(struct, fielddescr)
- @arguments("self", "i", "d", returns="r")
- def bhimpl_getfield_raw_r(self, struct, fielddescr):
- return self.cpu.bh_getfield_raw_r(struct, fielddescr)
- @arguments("self", "i", "d", returns="f")
- def bhimpl_getfield_raw_f(self, struct, fielddescr):
- return self.cpu.bh_getfield_raw_f(struct, fielddescr)
+ @arguments("cpu", "i", "d", returns="i")
+ def bhimpl_getfield_raw_i(cpu, struct, fielddescr):
+ return cpu.bh_getfield_raw_i(struct, fielddescr)
+ @arguments("cpu", "i", "d", returns="i")
+ def bhimpl_getfield_raw_c(cpu, struct, fielddescr):
+ return cpu.bh_getfield_raw_c(struct, fielddescr)
+ @arguments("cpu", "i", "d", returns="i")
+ def bhimpl_getfield_raw_u(cpu, struct, fielddescr):
+ return cpu.bh_getfield_raw_u(struct, fielddescr)
+ @arguments("cpu", "i", "d", returns="r")
+ def bhimpl_getfield_raw_r(cpu, struct, fielddescr):
+ return cpu.bh_getfield_raw_r(struct, fielddescr)
+ @arguments("cpu", "i", "d", returns="f")
+ def bhimpl_getfield_raw_f(cpu, struct, fielddescr):
+ return cpu.bh_getfield_raw_f(struct, fielddescr)
bhimpl_getfield_raw_i_pure = bhimpl_getfield_raw_i
bhimpl_getfield_raw_c_pure = bhimpl_getfield_raw_c
@@ -796,50 +798,50 @@
bhimpl_getfield_raw_r_pure = bhimpl_getfield_raw_r
bhimpl_getfield_raw_f_pure = bhimpl_getfield_raw_f
- @arguments("self", "r", "d", "i")
- def bhimpl_setfield_gc_i(self, struct, fielddescr, newvalue):
- self.cpu.bh_setfield_gc_i(struct, fielddescr, newvalue)
- @arguments("self", "r", "d", "i")
- def bhimpl_setfield_gc_c(self, struct, fielddescr, newvalue):
- self.cpu.bh_setfield_gc_c(struct, fielddescr, newvalue)
- @arguments("self", "r", "d", "i")
- def bhimpl_setfield_gc_u(self, struct, fielddescr, newvalue):
- self.cpu.bh_setfield_gc_u(struct, fielddescr, newvalue)
- @arguments("self", "r", "d", "r")
- def bhimpl_setfield_gc_r(self, struct, fielddescr, newvalue):
- self.cpu.bh_setfield_gc_r(struct, fielddescr, newvalue)
- @arguments("self", "r", "d", "f")
- def bhimpl_setfield_gc_f(self, struct, fielddescr, newvalue):
- self.cpu.bh_setfield_gc_f(struct, fielddescr, newvalue)
-
- @arguments("self", "i", "d", "i")
- def bhimpl_setfield_raw_i(self, struct, fielddescr, newvalue):
- self.cpu.bh_setfield_raw_i(struct, fielddescr, newvalue)
- @arguments("self", "i", "d", "i")
- def bhimpl_setfield_raw_c(self, struct, fielddescr, newvalue):
- self.cpu.bh_setfield_raw_c(struct, fielddescr, newvalue)
- @arguments("self", "i", "d", "i")
- def bhimpl_setfield_raw_u(self, struct, fielddescr, newvalue):
- self.cpu.bh_setfield_raw_u(struct, fielddescr, newvalue)
- @arguments("self", "i", "d", "r")
- def bhimpl_setfield_raw_r(self, struct, fielddescr, newvalue):
- self.cpu.bh_setfield_raw_r(struct, fielddescr, newvalue)
- @arguments("self", "i", "d", "f")
- def bhimpl_setfield_raw_f(self, struct, fielddescr, newvalue):
- self.cpu.bh_setfield_raw_f(struct, fielddescr, newvalue)
-
- @arguments("self", "d", returns="r")
- def bhimpl_new(self, descr):
- return self.cpu.bh_new(descr)
-
- @arguments("self", "d", returns="r")
- def bhimpl_new_with_vtable(self, descr):
- return self.cpu.bh_new_with_vtable(descr)
-
- @arguments("self", "r", returns="i")
- def bhimpl_guard_class(self, struct):
- return self.cpu.bh_classof(struct)
-
- @arguments("self", "r", returns="i")
- def bhimpl_cast_ptr_to_int(self, p):
- return self.cpu.bh_cast_ptr_to_int(p)
+ @arguments("cpu", "r", "d", "i")
+ def bhimpl_setfield_gc_i(cpu, struct, fielddescr, newvalue):
+ cpu.bh_setfield_gc_i(struct, fielddescr, newvalue)
+ @arguments("cpu", "r", "d", "i")
+ def bhimpl_setfield_gc_c(cpu, struct, fielddescr, newvalue):
+ cpu.bh_setfield_gc_c(struct, fielddescr, newvalue)
+ @arguments("cpu", "r", "d", "i")
+ def bhimpl_setfield_gc_u(cpu, struct, fielddescr, newvalue):
+ cpu.bh_setfield_gc_u(struct, fielddescr, newvalue)
+ @arguments("cpu", "r", "d", "r")
+ def bhimpl_setfield_gc_r(cpu, struct, fielddescr, newvalue):
+ cpu.bh_setfield_gc_r(struct, fielddescr, newvalue)
+ @arguments("cpu", "r", "d", "f")
+ def bhimpl_setfield_gc_f(cpu, struct, fielddescr, newvalue):
+ cpu.bh_setfield_gc_f(struct, fielddescr, newvalue)
+
+ @arguments("cpu", "i", "d", "i")
+ def bhimpl_setfield_raw_i(cpu, struct, fielddescr, newvalue):
+ cpu.bh_setfield_raw_i(struct, fielddescr, newvalue)
+ @arguments("cpu", "i", "d", "i")
+ def bhimpl_setfield_raw_c(cpu, struct, fielddescr, newvalue):
+ cpu.bh_setfield_raw_c(struct, fielddescr, newvalue)
+ @arguments("cpu", "i", "d", "i")
+ def bhimpl_setfield_raw_u(cpu, struct, fielddescr, newvalue):
+ cpu.bh_setfield_raw_u(struct, fielddescr, newvalue)
+ @arguments("cpu", "i", "d", "r")
+ def bhimpl_setfield_raw_r(cpu, struct, fielddescr, newvalue):
+ cpu.bh_setfield_raw_r(struct, fielddescr, newvalue)
+ @arguments("cpu", "i", "d", "f")
+ def bhimpl_setfield_raw_f(cpu, struct, fielddescr, newvalue):
+ cpu.bh_setfield_raw_f(struct, fielddescr, newvalue)
+
+ @arguments("cpu", "d", returns="r")
+ def bhimpl_new(cpu, descr):
+ return cpu.bh_new(descr)
+
+ @arguments("cpu", "d", returns="r")
+ def bhimpl_new_with_vtable(cpu, descr):
+ return cpu.bh_new_with_vtable(descr)
+
+ @arguments("cpu", "r", returns="i")
+ def bhimpl_guard_class(cpu, struct):
+ return cpu.bh_classof(struct)
+
+ @arguments("cpu", "r", returns="i")
+ def bhimpl_cast_ptr_to_int(cpu, p):
+ return cpu.bh_cast_ptr_to_int(p)
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py Fri Apr 30 17:14:43 2010
@@ -61,6 +61,21 @@
return None
raise AssertionError("bad rettype")
+def do_setarrayitem_gc(cpu, arraybox, indexbox, itembox, arraydescr):
+ array = arraybox.getref_base()
+ index = indexbox.getint()
+ if itembox.type == INT:
+ item = itembox.getint()
+ cpu.bh_setarrayitem_gc_i(arraydescr, array, index, item)
+ elif itembox.type == REF:
+ item = itembox.getref_base()
+ cpu.bh_setarrayitem_gc_r(arraydescr, array, index, item)
+ elif itembox.type == FLOAT:
+ item = itembox.getfloat()
+ cpu.bh_setarrayitem_gc_f(arraydescr, array, index, item)
+ else:
+ raise AssertionError("bad itembox.type")
+
# ____________________________________________________________
##def do_force_token(cpu):
@@ -114,6 +129,19 @@
raise Exception("duplicate entry for op number %d" % value)
if key.endswith('_PURE'):
key = key[:-5]
+ #
+ # Fish for a way for the pyjitpl interpreter to delegate
+ # really running the operation to the blackhole interpreter
+ # or directly to the cpu. First try the do_xxx() functions
+ # explicitly encoded above:
+ name = 'do_' + key.lower()
+ if name in globals():
+ execute[value] = globals()[name]
+ continue
+ # If missing, fallback to the bhimpl_xxx() method of the
+ # blackhole interpreter. This only works if there is a
+ # method of the exact same name and it accepts simple
+ # parameters.
name = 'bhimpl_' + key.lower()
if hasattr(BlackholeInterpreter, name):
func = make_execute_function_with_boxes(
@@ -122,11 +150,7 @@
if func is not None:
execute[value] = func
continue
- name = 'do_' + key.lower()
- if name in globals():
- execute[value] = globals()[name]
- continue
- pass # XXX...
+ print "XXX warning: missing", key
cpuclass._execute_by_num_args = execute_by_num_args
def make_execute_function_with_boxes(name, func):
@@ -134,7 +158,7 @@
# from the BlackholeInterpreter class. The wrapper is a new function
# that receives and returns boxed values.
for argtype in func.argtypes:
- if argtype not in ('i', 'r', 'f'):
+ if argtype not in ('i', 'r', 'f', 'd', 'cpu'):
return None
if func.resulttype not in ('i', 'r', 'f', None):
return None
@@ -144,11 +168,17 @@
def do(cpu, *argboxes):
newargs = ()
for argtype in argtypes:
- argbox = argboxes[0]
- argboxes = argboxes[1:]
- if argtype == 'i': value = argbox.getint()
- elif argtype == 'r': value = argbox.getref_base()
- elif argtype == 'f': value = argbox.getfloat()
+ if argtype == 'cpu':
+ value = cpu
+ elif argtype == 'd':
+ value = argboxes[-1]
+ argboxes = argboxes[:-1]
+ else:
+ argbox = argboxes[0]
+ argboxes = argboxes[1:]
+ if argtype == 'i': value = argbox.getint()
+ elif argtype == 'r': value = argbox.getref_base()
+ elif argtype == 'f': value = argbox.getfloat()
newargs = newargs + (value,)
assert not argboxes
#
@@ -190,7 +220,8 @@
assert descr is None
func = get_execute_function(cpu, opnum, len(argboxes))
assert func is not None
- return func(cpu, *argboxes)
+ return func(cpu, *argboxes) # note that the 'argboxes' tuple
+ # optionally ends with the descr
execute._annspecialcase_ = 'specialize:arg(1)'
def execute_varargs(cpu, opnum, argboxes, descr):
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py Fri Apr 30 17:14:43 2010
@@ -32,10 +32,11 @@
return func
return decorate
-def XXX(func):
- def cannot_call(*args, **kwds):
- raise Exception('not implemented: %s' % func.__name__)
- return cannot_call
+class XXX: # XXX temporary hack
+ def __init__(self, func):
+ self.func = func
+ def __getattr__(self, _):
+ raise Exception("@XXX: " + self.func.__name__)
# ____________________________________________________________
@@ -279,9 +280,9 @@
def opimpl_subclassof(self, box1, box2):
self.execute(rop.SUBCLASSOF, box1, box2)
- @XXX #arguments("descr", "box")
- def opimpl_new_array(self, itemsize, countbox):
- self.execute_with_descr(rop.NEW_ARRAY, itemsize, countbox)
+ @arguments("descr", "box")
+ def opimpl_new_array(self, itemsizedescr, countbox):
+ return self.execute_with_descr(rop.NEW_ARRAY, itemsizedescr, countbox)
@XXX #arguments("box", "descr", "box")
def opimpl_getarrayitem_gc(self, arraybox, arraydesc, indexbox):
@@ -291,9 +292,14 @@
def opimpl_getarrayitem_gc_pure(self, arraybox, arraydesc, indexbox):
self.execute_with_descr(rop.GETARRAYITEM_GC_PURE, arraydesc, arraybox, indexbox)
- @XXX #arguments("box", "descr", "box", "box")
- def opimpl_setarrayitem_gc(self, arraybox, arraydesc, indexbox, itembox):
- self.execute_with_descr(rop.SETARRAYITEM_GC, arraydesc, arraybox, indexbox, itembox)
+ @arguments("descr", "box", "box", "box")
+ def _opimpl_setarrayitem_gc(self, arraydesc, arraybox, indexbox, itembox):
+ self.execute_with_descr(rop.SETARRAYITEM_GC, arraydesc, arraybox,
+ indexbox, itembox)
+
+ opimpl_setarrayitem_gc_i = _opimpl_setarrayitem_gc
+ opimpl_setarrayitem_gc_r = _opimpl_setarrayitem_gc
+ opimpl_setarrayitem_gc_f = _opimpl_setarrayitem_gc
@XXX #arguments("box", "descr")
def opimpl_arraylen_gc(self, arraybox, arraydesc):
More information about the Pypy-commit
mailing list