[pypy-svn] r23302 - in pypy/dist/pypy/jit: . test
pedronis at codespeak.net
pedronis at codespeak.net
Mon Feb 13 23:41:25 CET 2006
Author: pedronis
Date: Mon Feb 13 23:41:23 2006
New Revision: 23302
Modified:
pypy/dist/pypy/jit/hintrtyper.py
pypy/dist/pypy/jit/hinttimeshift.py
pypy/dist/pypy/jit/rtimeshift.py
pypy/dist/pypy/jit/test/test_hint_timeshift.py
Log:
experimenting with mix level helpers,
for now using a policy that for functions starting with ll_/_ll_ uses the same specialisation rules
as the low-level policy, we probably need user supplied specialisations for the high/mix level helpers themself.
of course if we start introducing new classes etc, or mixing signatures we will need to be very careful,
and re-invoke as much as necessary of the normalisation logic.
now HintLowLevelOpList has a first sketch of a method .genmixlevelhelpercall(self, function, args_s, args_v)
it is tentatively used to invoke rtimeshift.retrieve_jitstate_for_merge for merge logic blocks.
The dummy code that is there now in rtimeshift.retrieve_jitstate_for_merge is just there for playing with
the concept.
Modified: pypy/dist/pypy/jit/hintrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/hintrtyper.py (original)
+++ pypy/dist/pypy/jit/hintrtyper.py Mon Feb 13 23:41:23 2006
@@ -1,5 +1,6 @@
from pypy.annotation import model as annmodel
from pypy.annotation.pairtype import pair, pairtype
+from pypy.rpython import annlowlevel
from pypy.rpython.rtyper import RPythonTyper, LowLevelOpList
from pypy.rpython.rmodel import Repr, inputconst
from pypy.rpython.rstr import string_repr
@@ -101,6 +102,17 @@
# opname2vstr(hop.spaceop.opname),
# v_args, c_restype)
+class MixLevelAnnotatorPolicy(annlowlevel.LowLevelAnnotatorPolicy):
+
+ def default_specialize(pol, funcdesc, args_s):
+ name = funcdesc.name
+ if name.startswith('ll_') or name.startswith('_ll_'): # xxx can we do better?
+ return annlowlevel.LowLevelAnnotatorPolicy.default_specialize(pol, funcdesc, args_s)
+ else:
+ return funcdesc.cachedgraph(None)
+
+ # TODO finer control specialisations for highlevel helpers ...
+
class HintLowLevelOpList(LowLevelOpList):
"""Warning: the HintLowLevelOpList's rtyper is the *original*
rtyper, while the HighLevelOp's rtyper is actually our HintRTyper...
@@ -112,6 +124,23 @@
def hasparentgraph(self):
return False # for now
+ def genmixlevelhelpercall(self, function, args_s, args_v):
+ # XXX first approximation, will likely need some fine controlled
+ # specialisation for these helpers too
+ rtyper = self.rtyper
+ rtyper.call_all_setups() # compute ForwardReferences now
+ graph = rtyper.annotator.annotate_helper(function, args_s,
+ policy=MixLevelAnnotatorPolicy()
+ )
+ self.record_extra_call(graph) # xxx
+
+ # build the 'direct_call' operation
+ f = rtyper.getcallable(graph)
+ c = inputconst(lltype.typeOf(f), f)
+ fobj = rtyper.type_system_deref(f)
+ return self.genop('direct_call', [c]+args_v,
+ resulttype = lltype.typeOf(fobj).RESULT)
+
def getjitstate(self):
v_jitstate = self.originalblock.inputargs[0]
assert v_jitstate.concretetype == rtimeshift.STATE_PTR
@@ -153,7 +182,7 @@
llops.getjitstate(), v, c_TYPE)
def convert_const(self, ll_value):
- return rtimeshift.REDBOX.make_from_const(ll_value)
+ return rtimeshift.REDBOX.ll_make_from_const(ll_value)
def residual_values(self, ll_value):
return [ll_value]
Modified: pypy/dist/pypy/jit/hinttimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/hinttimeshift.py (original)
+++ pypy/dist/pypy/jit/hinttimeshift.py Mon Feb 13 23:41:23 2006
@@ -108,10 +108,10 @@
v_key = rtuple.newtuple(llops, r_key, key_v)
v_boxes = rlist.newlist(llops, r_box_list, boxes_v)
- v_newjiststate = llops.gendirectcall(rtimeshift.ll_retrieve_jitstate_for_merge,
- c_state_dic,
- newinputargs[0], # jitstate
- v_key, v_boxes)
+
+ v_newjiststate = llops.genmixlevelhelpercall(rtimeshift.retrieve_jitstate_for_merge,
+ [s_state_dic, annmodel.SomePtr(STATE_PTR), s_key_tuple, s_box_list],
+ [c_state_dic, newinputargs[0], v_key, v_boxes])
newinputargs2 = [v_newjiststate]
i = 0
Modified: pypy/dist/pypy/jit/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/rtimeshift.py Mon Feb 13 23:41:23 2006
@@ -17,29 +17,29 @@
STATE_PTR = lltype.Ptr(STATE)
-def make_for_gvar(gvar):
+def ll_make_for_gvar(gvar):
box = lltype.malloc(REDBOX)
box.isvar = True
box.genvar = gvar
return box
-def make_from_const(value):
+def ll_make_from_const(value):
sbox = lltype.malloc(REDBOX_FOR_SIGNED) # XXX Float, Ptr
sbox.value = lltype.cast_primitive(lltype.Signed, value)
box = lltype.cast_pointer(REDBOX_PTR, sbox)
box.genvar = lltype.nullptr(REDBOX.genvar.TO)
return box
-def getvalue(box, T):
+def ll_getvalue(box, T):
sbox = lltype.cast_pointer(REDBOX_FOR_SIGNED_PTR, box)
return lltype.cast_primitive(T, sbox.value)
REDBOX = lltype.GcStruct("redbox", ("genvar", rgenop.CONSTORVAR),
("isvar", lltype.Bool),
adtmeths = {
- 'make_for_gvar': make_for_gvar,
- 'make_from_const': make_from_const,
- 'getvalue': getvalue,
+ 'll_make_for_gvar': ll_make_for_gvar,
+ 'll_make_from_const': ll_make_from_const,
+ 'll_getvalue': ll_getvalue,
})
REDBOX_PTR = lltype.Ptr(REDBOX)
@@ -55,7 +55,7 @@
def ll_gvar_from_redbox(jitstate, box, TYPE):
if not box.genvar:
- value = box.getvalue(TYPE)
+ value = box.ll_getvalue(TYPE)
box.genvar = ll_gvar_from_const(jitstate, value)
return box.genvar
@@ -112,13 +112,13 @@
RESULT = opdesc.RESULT
opname = opdesc.name
if not argbox.isvar: # const propagate
- arg = argbox.getvalue(ARG0)
+ arg = argbox.ll_getvalue(ARG0)
res = opdesc.llop(RESULT, arg)
- return REDBOX.make_from_const(res)
+ return REDBOX.ll_make_from_const(res)
op_args = lltype.malloc(VARLIST.TO, 1)
op_args[0] = ll_gvar_from_redbox(jitstate, argbox, ARG0)
gvar = rgenop.genop(jitstate.curblock, opdesc.opname, op_args, RESULT)
- return REDBOX.make_for_gvar(gvar)
+ return REDBOX.ll_make_for_gvar(gvar)
def ll_generate_operation2(opdesc, jitstate, argbox0, argbox1):
ARG0 = opdesc.ARG0
@@ -126,27 +126,33 @@
RESULT = opdesc.RESULT
opname = opdesc.name
if not argbox0.isvar and not argbox1.isvar: # const propagate
- arg0 = argbox0.getvalue(ARG0)
- arg1 = argbox1.getvalue(ARG1)
+ arg0 = argbox0.ll_getvalue(ARG0)
+ arg1 = argbox1.ll_getvalue(ARG1)
res = opdesc.llop(RESULT, arg0, arg1)
- return REDBOX.make_from_const(res)
+ return REDBOX.ll_make_from_const(res)
op_args = lltype.malloc(VARLIST.TO, 2)
op_args[0] = ll_gvar_from_redbox(jitstate, argbox0, ARG0)
op_args[1] = ll_gvar_from_redbox(jitstate, argbox1, ARG1)
gvar = rgenop.genop(jitstate.curblock, opdesc.opname, op_args, RESULT)
- return REDBOX.make_for_gvar(gvar)
+ return REDBOX.ll_make_for_gvar(gvar)
#def ll_generate_operation(jitstate, opname, args, RESULTTYPE):
# gvar = rgenop.genop(jitstate.curblock, opname, args, RESULTTYPE)
-# return REDBOX.make_for_gvar(gvar)
+# return REDBOX.ll_make_for_gvar(gvar)
# ____________________________________________________________
# other jitstate/graph level operations
-# XXX dummy for now
-def ll_retrieve_jitstate_for_merge(states_dic, jitstate, key, redboxes):
+
+# XXX dummy for now, playing with mix level annotation
+def retrieve_jitstate_for_merge(states_dic, jitstate, key, redboxes):
# modifies redbox in place
+ states_dic[key] = redboxes
+ # fun playing junk
+ if not redboxes[0].isvar and redboxes[0].ll_getvalue(lltype.Signed) == 0:
+ redboxes[0] = redboxes[0]
return jitstate # XXX
+
def ll_setup_jitstate():
jitstate = lltype.malloc(STATE)
@@ -160,4 +166,4 @@
def ll_input_redbox(jitstate, TYPE):
genvar = rgenop.geninputarg(jitstate.curblock, TYPE)
- return REDBOX.make_for_gvar(genvar)
+ return REDBOX.ll_make_for_gvar(genvar)
Modified: pypy/dist/pypy/jit/test/test_hint_timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/test/test_hint_timeshift.py (original)
+++ pypy/dist/pypy/jit/test/test_hint_timeshift.py Mon Feb 13 23:41:23 2006
@@ -62,7 +62,7 @@
TYPE = htshift.originalconcretetype(v)
box = rtimeshift.ll_input_redbox(jitstate, TYPE)
if i in opt_consts: # XXX what should happen here interface wise is unclear
- box = rtimeshift.REDBOX.make_from_const(llvalue)
+ box = rtimeshift.REDBOX.ll_make_from_const(llvalue)
graph1args.append(box)
residual_graph_args.append(llvalue)
llinterp = LLInterpreter(rtyper)
More information about the Pypy-commit
mailing list