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

Reply via email to