Author: Richard Plangger <planri...@gmail.com> Branch: s390x-backend Changeset: r81668:dab47ded5b1d Date: 2016-01-11 11:29 +0100 http://bitbucket.org/pypy/pypy/changeset/dab47ded5b1d/
Log: translation changes to the instruction builder, this was up to now quite dynamic diff --git a/rpython/jit/backend/zarch/assembler.py b/rpython/jit/backend/zarch/assembler.py --- a/rpython/jit/backend/zarch/assembler.py +++ b/rpython/jit/backend/zarch/assembler.py @@ -512,7 +512,6 @@ # registers). mc = InstrBuilder() # - mc.trap() # mc.STG(r.r14, l.addr(14*WORD, r.SP)) # Do the call mc.push_std_frame() @@ -526,7 +525,7 @@ mc.LG(r.SCRATCH, l.addr(0, r.SCRATCH)) # if this comparison is true, then everything is ok, # else we have an exception - mc.cmp_op(r.SCRATCH, 0, imm=True) + mc.cmp_op(r.SCRATCH, l.imm(0), imm=True) # # So we return to our caller, conditionally if "EQ" # mc.LG(r.r14, l.addr(14*WORD, r.SP)) diff --git a/rpython/jit/backend/zarch/instruction_builder.py b/rpython/jit/backend/zarch/instruction_builder.py --- a/rpython/jit/backend/zarch/instruction_builder.py +++ b/rpython/jit/backend/zarch/instruction_builder.py @@ -436,18 +436,55 @@ return encode_rie_c def build_unpack_func(mnemonic, func): - def function(self, *args): - newargs = [None] * len(func._arguments_) - for i,arg in enumerate(unrolling_iterable(func._arguments_)): - if arg == '-': - newargs[i] = 0 - elif arg == 'r' or arg == 'r/m' or arg == 'f' or arg == 'eo': - newargs[i] = args[i].value - elif arg.startswith('i') or arg.startswith('u') or arg.startswith('h'): - newargs[i] = args[i].value - else: - newargs[i] = args[i] - return func(self, *newargs) + @always_inline + def unpack_arg(arg, argtype): + if argtype == '-': + return 0 + elif argtype == 'r' or argtype == 'r/m' or \ + argtype == 'f' or argtype == 'eo': + return arg.value + elif argtype.startswith('i') or argtype.startswith('u') or argtype.startswith('h'): + return arg.value + else: + return arg + unpack_arg._annspecialcase_ = 'specialize:arg(1)' + argtypes = func._arguments_ + at = argtypes[0] if len(argtypes) >= 1 else '-' + bt = argtypes[1] if len(argtypes) >= 2 else '-' + ct = argtypes[2] if len(argtypes) >= 3 else '-' + dt = argtypes[3] if len(argtypes) >= 4 else '-' + def function0(self): + return func(self) + def function1(self, a): + e = unpack_arg(a, at) + return func(self, e) + def function2(self, a, b): + e = unpack_arg(a, at) + f = unpack_arg(b, bt) + return func(self, e, f) + def function3(self, a, b, c): + e = unpack_arg(a, at) + f = unpack_arg(b, bt) + g = unpack_arg(c, ct) + return func(self, e, f, g) + def function4(self, a, b): + e = unpack_arg(a, at) + f = unpack_arg(b, bt) + g = unpack_arg(c, ct) + h = unpack_arg(d, dt) + return func(self, e, f, g, h) + if len(argtypes) == 0: + function = function0 + elif len(argtypes) == 1: + function = function1 + elif len(argtypes) == 2: + function = function2 + elif len(argtypes) == 3: + function = function3 + elif len(argtypes) == 4: + function = function4 + else: + assert 0, "implement function for argtypes %s" % (argtypes,) function.__name__ = mnemonic return function diff --git a/rpython/jit/backend/zarch/runner.py b/rpython/jit/backend/zarch/runner.py --- a/rpython/jit/backend/zarch/runner.py +++ b/rpython/jit/backend/zarch/runner.py @@ -73,3 +73,8 @@ cast_ptr_to_int._annspecialcase_ = 'specialize:arglltype(0)' cast_ptr_to_int = staticmethod(cast_ptr_to_int) + def build_regalloc(self): + ''' NOT_RPYTHON: for tests ''' + from rpython.jit.backend.zarch.regalloc import Regalloc + assert self.assembler is not None + return Regalloc(self.assembler) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit