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