Author: Richard Plangger <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit