Author: Armin Rigo <ar...@tunes.org> Branch: ec-threadlocal Changeset: r72141:c7e0b0352700 Date: 2014-06-22 22:00 +0200 http://bitbucket.org/pypy/pypy/changeset/c7e0b0352700/
Log: jit-transform threadlocalref_get diff --git a/rpython/jit/codewriter/effectinfo.py b/rpython/jit/codewriter/effectinfo.py --- a/rpython/jit/codewriter/effectinfo.py +++ b/rpython/jit/codewriter/effectinfo.py @@ -22,6 +22,7 @@ OS_STR2UNICODE = 2 # "str.str2unicode" OS_SHRINK_ARRAY = 3 # rgc.ll_shrink_array OS_DICT_LOOKUP = 4 # ll_dict_lookup + OS_THREADLOCALREF_GET = 5 # llop.threadlocalref_get # OS_STR_CONCAT = 22 # "stroruni.concat" OS_STR_SLICE = 23 # "stroruni.slice" diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py --- a/rpython/jit/codewriter/jtransform.py +++ b/rpython/jit/codewriter/jtransform.py @@ -1903,6 +1903,14 @@ None) return [op0, op1] + def rewrite_op_threadlocalref_get(self, op): + opaqueid = op.args[0].value + op1 = self.prepare_builtin_call(op, 'threadlocalref_getter', [], + extra=(opaqueid,), + extrakey=opaqueid._obj) + return self.handle_residual_call(op1, + oopspecindex=EffectInfo.OS_THREADLOCALREF_GET) + # ____________________________________________________________ class NotSupported(Exception): diff --git a/rpython/jit/codewriter/support.py b/rpython/jit/codewriter/support.py --- a/rpython/jit/codewriter/support.py +++ b/rpython/jit/codewriter/support.py @@ -712,6 +712,11 @@ build_ll_1_raw_free_no_track_allocation = ( build_raw_free_builder(track_allocation=False)) + def build_ll_0_threadlocalref_getter(opaqueid): + def _ll_0_threadlocalref_getter(): + return llop.threadlocalref_get(rclass.OBJECTPTR, opaqueid) + return _ll_0_threadlocalref_getter + def _ll_1_weakref_create(obj): return llop.weakref_create(llmemory.WeakRefPtr, obj) diff --git a/rpython/jit/codewriter/test/test_jtransform.py b/rpython/jit/codewriter/test/test_jtransform.py --- a/rpython/jit/codewriter/test/test_jtransform.py +++ b/rpython/jit/codewriter/test/test_jtransform.py @@ -147,6 +147,7 @@ EI.OS_UNIEQ_LENGTHOK: ([PUNICODE, PUNICODE], INT), EI.OS_RAW_MALLOC_VARSIZE_CHAR: ([INT], ARRAYPTR), EI.OS_RAW_FREE: ([ARRAYPTR], lltype.Void), + EI.OS_THREADLOCALREF_GET: ([], rclass.OBJECTPTR), } argtypes = argtypes[oopspecindex] assert argtypes[0] == [v.concretetype for v in op.args[1:]] @@ -157,6 +158,8 @@ assert extraeffect == EI.EF_CAN_RAISE elif oopspecindex == EI.OS_RAW_FREE: assert extraeffect == EI.EF_CANNOT_RAISE + elif oopspecindex == EI.OS_THREADLOCALREF_GET: + assert extraeffect == None else: assert extraeffect == EI.EF_ELIDABLE_CANNOT_RAISE return 'calldescr-%d' % oopspecindex @@ -1300,6 +1303,23 @@ assert op1.result is None assert op2 is None +def test_threadlocalref_get(): + from rpython.rtyper.lltypesystem import rclass + from rpython.rlib.rthread import ThreadLocalReference + OS_THREADLOCALREF_GET = effectinfo.EffectInfo.OS_THREADLOCALREF_GET + class Foo: pass + t = ThreadLocalReference(Foo) + v2 = varoftype(rclass.OBJECTPTR) + c_opaqueid = const(t.opaque_id) + op = SpaceOperation('threadlocalref_get', [c_opaqueid], v2) + tr = Transformer(FakeCPU(), FakeBuiltinCallControl()) + op0 = tr.rewrite_operation(op) + assert op0.opname == 'residual_call_r_r' + assert op0.args[0].value == 'threadlocalref_getter' # pseudo-function as str + assert op0.args[1] == ListOfKind("ref", []) + assert op0.args[2] == 'calldescr-%d' % OS_THREADLOCALREF_GET + assert op0.result == v2 + def test_unknown_operation(): op = SpaceOperation('foobar', [], varoftype(lltype.Void)) tr = Transformer() _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit