Author: Richard Plangger <planri...@gmail.com>
Branch: s390x-backend
Changeset: r81782:ffbab923d30d
Date: 2016-01-15 10:29 +0100
http://bitbucket.org/pypy/pypy/changeset/ffbab923d30d/

Log:    libffi issue handled just after calling. narrower integer types
        trigger zero/sign extension

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
@@ -42,6 +42,7 @@
         self.current_clt = None
         self._regalloc = None
         self.datablockwrapper = None
+        self.subject_op = None # needed in call assembler to pass by the 
operation
         self.propagate_exception_path = 0
         self.stack_check_slowpath = 0
         self.loop_run_counters = []
diff --git a/rpython/jit/backend/zarch/callbuilder.py 
b/rpython/jit/backend/zarch/callbuilder.py
--- a/rpython/jit/backend/zarch/callbuilder.py
+++ b/rpython/jit/backend/zarch/callbuilder.py
@@ -10,6 +10,7 @@
 from rpython.rlib.objectmodel import we_are_translated
 from rpython.jit.backend.llsupport import llerrno
 from rpython.rtyper.lltypesystem import rffi
+from rpython.jit.backend.llsupport.descr import CallDescr
 
 class CallBuilder(AbstractCallBuilder):
     GPR_ARGS = [r.r2, r.r3, r.r4, r.r5, r.r6]
@@ -19,9 +20,18 @@
     RSHADOWPTR  = r.r9
     RFASTGILPTR = r.r10
 
-    def __init__(self, assembler, fnloc, arglocs, resloc):
+    def __init__(self, assembler, fnloc, arglocs, resloc, calldescr):
+        type = INT
+        size = None
+        self.ressign = True
+        if calldescr is not None:
+            assert isinstance(calldescr, CallDescr)
+            type = calldescr.get_result_type()
+            size = calldescr.get_result_size()
+            self.ressign = calldescr.is_result_signed()
+
         AbstractCallBuilder.__init__(self, assembler, fnloc, arglocs,
-                                     resloc, restype=INT, ressize=None)
+                                     resloc, restype=type, ressize=size)
 
     def prepare_arguments(self):
         self.subtracted_to_sp = 0
@@ -144,6 +154,30 @@
         # move the frame pointer
         self.mc.LAY(r.SP, l.addr(-self.subtracted_to_sp, r.SP))
         self.mc.raw_call()
+        #
+        self.ensure_correct_signzero_extension()
+
+    def ensure_correct_signzero_extension(self):
+        if self.restype == 'i' and self.ressize != WORD:
+            # we must be sure! libffi (s390x impl) will not return
+            # a sane 64 bit zero/sign extended value. fix for this
+            # has been rejected (Jan. 2016). This will not be updated
+            # any time soon...
+            if self.ressign:
+                # sign extend!
+                if self.ressize == 1: self.mc.LGBR(r.r2, r.r2)
+                elif self.ressize == 2: self.mc.LGHR(r.r2, r.r2)
+                elif self.ressize == 4: self.mc.LGFR(r.r2, r.r2)
+                else:
+                    assert 0, "cannot sign extend size %d" % self.ressize
+            else:
+                # zero extend!
+                if self.ressize == 1: self.mc.LLGCR(r.r2, r.r2)
+                elif self.ressize == 2: self.mc.LLGHR(r.r2, r.r2)
+                elif self.ressize == 4: self.mc.LLGFR(r.r2, r.r2)
+                else:
+                    assert 0, "cannot zero extend size %d" % self.ressize
+
 
     def restore_stack_pointer(self):
         # it must at LEAST be 160 bytes
diff --git a/rpython/jit/backend/zarch/instructions.py 
b/rpython/jit/backend/zarch/instructions.py
--- a/rpython/jit/backend/zarch/instructions.py
+++ b/rpython/jit/backend/zarch/instructions.py
@@ -155,10 +155,14 @@
     'LOCGR':  ('rrf_c',    ['\xB9','\xE2']),
     'LOCG':   ('rsy_b',    ['\xEB','\xE2']),
 
-    # load for sign ext
+    # load with sign ext
     'LGBR':   ('rre',      ['\xB9','\x06']),
     'LGHR':   ('rre',      ['\xB9','\x07']),
     'LGFR':   ('rre',      ['\xB9','\x14']),
+    # load with zero ext
+    'LLGCR':   ('rre',      ['\xB9','\x84']),
+    'LLGHR':   ('rre',      ['\xB9','\x85']),
+    'LLGFR':   ('rre',      ['\xB9','\x16']),
 
     # store memory
     'STMG':    ('rsy_a',   ['\xEB','\x24']),
diff --git a/rpython/jit/backend/zarch/opassembler.py 
b/rpython/jit/backend/zarch/opassembler.py
--- a/rpython/jit/backend/zarch/opassembler.py
+++ b/rpython/jit/backend/zarch/opassembler.py
@@ -279,7 +279,7 @@
         adr = arglocs[func_index]
         arglist = arglocs[func_index+1:]
 
-        cb = callbuilder.CallBuilder(self, adr, arglist, resloc)
+        cb = callbuilder.CallBuilder(self, adr, arglist, resloc, op.getdescr())
 
         descr = op.getdescr()
         assert isinstance(descr, CallDescr)
@@ -1076,7 +1076,9 @@
             vloc = imm(0)
         self._store_force_index(self._find_nearby_operation(regalloc, +1))
         # 'result_loc' is either r2, f0 or None
+        self.subject_op = op
         self.call_assembler(op, argloc, vloc, result_loc, r.r2)
+        self.subject_op = None
         self.mc.LARL(r.POOL, l.halfword(self.pool.pool_start - 
self.mc.get_relative_pos()))
 
     emit_call_assembler_i = _genop_call_assembler
@@ -1090,11 +1092,13 @@
         self.regalloc_mov(argloc, r.r2)
         self.mc.LG(r.r3, l.addr(THREADLOCAL_ADDR_OFFSET, r.SP))
 
-        cb = callbuilder.CallBuilder(self, addr, [r.r2, r.r3], r.r2)
+        descr = self.subject_op.getdescr()
+        cb = callbuilder.CallBuilder(self, addr, [r.r2, r.r3], r.r2, descr)
         cb.emit()
 
     def _call_assembler_emit_helper_call(self, addr, arglocs, result_loc):
-        cb = callbuilder.CallBuilder(self, addr, arglocs, result_loc)
+        descr = self.subject_op.getdescr()
+        cb = callbuilder.CallBuilder(self, addr, arglocs, result_loc, descr)
         cb.emit()
 
     def _call_assembler_check_descr(self, value, tmploc):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to