Author: Richard Plangger <planri...@gmail.com> Branch: ppc-vsx-support Changeset: r85955:84c8a9345e22 Date: 2016-08-01 16:22 +0200 http://bitbucket.org/pypy/pypy/changeset/84c8a9345e22/
Log: correct the scaling for vec_load/store diff --git a/rpython/jit/backend/llsupport/vector_ext.py b/rpython/jit/backend/llsupport/vector_ext.py --- a/rpython/jit/backend/llsupport/vector_ext.py +++ b/rpython/jit/backend/llsupport/vector_ext.py @@ -2,7 +2,7 @@ from rpython.jit.backend.llsupport.descr import (unpack_arraydescr, unpack_fielddescr, unpack_interiorfielddescr, ArrayDescr) from rpython.rlib.objectmodel import specialize, always_inline -from rpython.jit.metainterp.history import (VECTOR, FLOAT, INT) +from rpython.jit.metainterp.history import (VECTOR, FLOAT, INT, ConstInt) from rpython.jit.metainterp.resoperation import rop from rpython.jit.metainterp.optimizeopt.schedule import (forwarded_vecinfo, failnbail_transformation) @@ -72,7 +72,7 @@ self.argument_restrictions = argument_restris def check_operation(self, state, pack, op): - pass + return None def crop_vector(self, op, newsize, size): return newsize, size @@ -111,19 +111,25 @@ class LoadRestrict(OpRestrict): def check_operation(self, state, pack, op): opnum = op.getopnum() + descr = op.getdescr() + if not we_are_translated() and not isinstance(descr, ArrayDescr): + itemsize = descr.get_item_size_in_bytes() + ofs = 0 + else: + itemsize, ofs, _ = unpack_arraydescr(op.getdescr()) + args = [op.getarg(0), op.getarg(1), ConstInt(1), ConstInt(ofs)] if rop.is_getarrayitem(opnum) or \ opnum in (rop.GETARRAYITEM_RAW_I, rop.GETARRAYITEM_RAW_F): - descr = op.getdescr() - if not we_are_translated() and not isinstance(descr, ArrayDescr): - itemsize = descr.get_item_size_in_bytes() - ofs = 0 - else: - itemsize, ofs, _ = unpack_arraydescr(op.getdescr()) index_box = op.getarg(1) - _, _, changed, emit = cpu_simplify_scale(state.cpu, index_box, itemsize, ofs) + scale, offset, changed, emit = cpu_simplify_scale(state.cpu, index_box, itemsize, ofs) + args[2] = ConstInt(scale) + args[3] = ConstInt(offset) if emit: state.oplist.append(changed) - op.setarg(1, changed) + args[1] = changed + + return args + def opcount_filling_vector_register(self, op, vec_reg_size): assert rop.is_primitive_load(op.opnum) @@ -136,18 +142,22 @@ def check_operation(self, state, pack, op): opnum = op.getopnum() + descr = op.getdescr() + if not we_are_translated() and not isinstance(descr, ArrayDescr): + itemsize = descr.get_item_size_in_bytes() + ofs = 0 + else: + itemsize, ofs, _ = unpack_arraydescr(op.getdescr()) + args = [op.getarg(0), op.getarg(1), op.getarg(2), ConstInt(1), ConstInt(ofs)] if opnum in (rop.SETARRAYITEM_GC, rop.SETARRAYITEM_RAW): - descr = op.getdescr() - if not we_are_translated() and not isinstance(descr, ArrayDescr): - itemsize = descr.get_item_size_in_bytes() - basesize= 0 - else: - itemsize, basesize, _ = unpack_arraydescr(op.getdescr()) index_box = op.getarg(1) - _, _, changed, emit = cpu_simplify_scale(state.cpu, index_box, itemsize, basesize) + scale, offset, changed, emit = cpu_simplify_scale(state.cpu, index_box, itemsize, ofs) + args[3] = ConstInt(scale) + args[4] = ConstInt(offset) if emit: state.oplist.append(changed) - op.setarg(1, changed) + args[1] = changed + return args def must_crop_vector(self, op, index): vecinfo = forwarded_vecinfo(op.getarg(index)) @@ -185,6 +195,7 @@ raise NotAVectorizeableLoop() if curvecinfo.datatype != datatype: raise NotAVectorizeableLoop() + return None TR_ANY = TypeRestrict() TR_ANY_FLOAT = TypeRestrict(FLOAT) diff --git a/rpython/jit/backend/x86/vector_ext.py b/rpython/jit/backend/x86/vector_ext.py --- a/rpython/jit/backend/x86/vector_ext.py +++ b/rpython/jit/backend/x86/vector_ext.py @@ -150,26 +150,11 @@ not_implemented("reduce sum for %s not impl." % arg) - # TODO remove - #def _genop_vec_getarrayitem(self, op, arglocs, resloc): - # # considers item scale (raw_load does not) - # base_loc, ofs_loc, size_loc, ofs, integer_loc, aligned_loc = arglocs - # scale = get_scale(size_loc.value) - # src_addr = addr_add(base_loc, ofs_loc, ofs.value, scale) - # self._vec_load(resloc, src_addr, integer_loc.value, - # size_loc.value, aligned_loc.value) - # - #genop_vec_getarrayitem_raw_i = _genop_vec_getarrayitem - #genop_vec_getarrayitem_raw_f = _genop_vec_getarrayitem - # - #genop_vec_getarrayitem_gc_i = _genop_vec_getarrayitem - #genop_vec_getarrayitem_gc_f = _genop_vec_getarrayitem - def _genop_vec_load(self, op, arglocs, resloc): - base_loc, ofs_loc, size_loc, ofs, integer_loc, aligned_loc = arglocs - src_addr = addr_add(base_loc, ofs_loc, ofs.value, 0) + base_loc, ofs_loc, size_loc, scale, ofs, integer_loc = arglocs + src_addr = addr_add(base_loc, ofs_loc, ofs.value, scale.value) self._vec_load(resloc, src_addr, integer_loc.value, - size_loc.value, aligned_loc.value) + size_loc.value, False) genop_vec_load_i = _genop_vec_load genop_vec_load_f = _genop_vec_load @@ -187,23 +172,12 @@ elif itemsize == 8: self.mc.MOVUPD(resloc, src_addr) - # TODO remove - #def _genop_discard_vec_setarrayitem(self, op, arglocs): - # # considers item scale (raw_store does not) - # base_loc, ofs_loc, value_loc, size_loc, baseofs, integer_loc, aligned_loc = arglocs - # scale = get_scale(size_loc.value) - # dest_loc = addr_add(base_loc, ofs_loc, baseofs.value, scale) - # self._vec_store(dest_loc, value_loc, integer_loc.value, - # size_loc.value, aligned_loc.value) - - #genop_discard_vec_setarrayitem_raw = _genop_discard_vec_setarrayitem - #genop_discard_vec_setarrayitem_gc = _genop_discard_vec_setarrayitem - def genop_discard_vec_store(self, op, arglocs): - base_loc, ofs_loc, value_loc, size_loc, baseofs, integer_loc, aligned_loc = arglocs - dest_loc = addr_add(base_loc, ofs_loc, baseofs.value, 0) + base_loc, ofs_loc, value_loc, size_loc, scale,\ + baseofs, integer_loc = arglocs + dest_loc = addr_add(base_loc, ofs_loc, baseofs.value, scale.value) self._vec_store(dest_loc, value_loc, integer_loc.value, - size_loc.value, aligned_loc.value) + size_loc.value, False) @always_inline def _vec_store(self, dest_loc, value_loc, integer, itemsize, aligned): @@ -550,20 +524,17 @@ assert isinstance(descr, ArrayDescr) assert not descr.is_array_of_pointers() and \ not descr.is_array_of_structs() - itemsize, ofs, _ = unpack_arraydescr(descr) + itemsize, _, _ = unpack_arraydescr(descr) integer = not (descr.is_array_of_floats() or descr.getconcrete_type() == FLOAT) - aligned = False args = op.getarglist() + scale = get_scale(op.getarg(2).getint()) + ofs = op.getarg(3).getint() base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args) ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args) result_loc = self.force_allocate_reg(op) - self.perform(op, [base_loc, ofs_loc, imm(itemsize), imm(ofs), - imm(integer), imm(aligned)], result_loc) + self.perform(op, [base_loc, ofs_loc, imm(itemsize), imm(scale), + imm(ofs), imm(integer)], result_loc) - #consider_vec_getarrayitem_raw_i = _consider_vec_getarrayitem - #consider_vec_getarrayitem_raw_f = _consider_vec_getarrayitem - #consider_vec_getarrayitem_gc_i = _consider_vec_getarrayitem - #consider_vec_getarrayitem_gc_f = _consider_vec_getarrayitem consider_vec_load_i = _consider_vec_load consider_vec_load_f = _consider_vec_load @@ -573,20 +544,18 @@ assert isinstance(descr, ArrayDescr) assert not descr.is_array_of_pointers() and \ not descr.is_array_of_structs() - itemsize, ofs, _ = unpack_arraydescr(descr) + itemsize, _, _ = unpack_arraydescr(descr) args = op.getarglist() base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args) value_loc = self.make_sure_var_in_reg(op.getarg(2), args) ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args) + scale = get_scale(op.getarg(3).getint()) + ofs = op.getarg(4).getint() - integer = not (descr.is_array_of_floats() or descr.getconcrete_type() == FLOAT) - aligned = False - self.perform_discard(op, [base_loc, ofs_loc, value_loc, - imm(itemsize), imm(ofs), imm(integer), imm(aligned)]) - - #consider_vec_setarrayitem_raw = _consider_vec_setarrayitem - #consider_vec_setarrayitem_gc = _consider_vec_setarrayitem - #consider_vec_store = _consider_vec_setarrayitem + integer = not (descr.is_array_of_floats() or \ + descr.getconcrete_type() == FLOAT) + self.perform_discard(op, [base_loc, ofs_loc, value_loc, imm(itemsize), + imm(scale), imm(ofs), imm(integer)]) def consider_vec_arith(self, op): lhs = op.getarg(0) diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py b/rpython/jit/metainterp/optimizeopt/schedule.py --- a/rpython/jit/metainterp/optimizeopt/schedule.py +++ b/rpython/jit/metainterp/optimizeopt/schedule.py @@ -220,11 +220,17 @@ left = pack.leftmost() oprestrict = state.cpu.vector_ext.get_operation_restriction(left) if oprestrict is not None: - oprestrict.check_operation(state, pack, left) - args = left.getarglist_copy() + newargs = oprestrict.check_operation(state, pack, left) + if newargs: + args = newargs + else: + args = left.getarglist_copy() + else: + args = left.getarglist_copy() prepare_arguments(state, oprestrict, pack, args) vecop = VecOperation(left.vector, args, left, pack.numops(), left.getdescr()) + for i,node in enumerate(pack.operations): op = node.getoperation() if op.returns_void(): diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -1077,7 +1077,7 @@ 'GETARRAYITEM_GC/2d/rfi', 'GETARRAYITEM_RAW/2d/fi', 'RAW_LOAD/2d/fi', - 'VEC_LOAD/2d/fi', + 'VEC_LOAD/4d/fi', '_RAW_LOAD_LAST', 'GETINTERIORFIELD_GC/2d/rfi', @@ -1112,7 +1112,7 @@ 'SETARRAYITEM_GC/3d/n', 'SETARRAYITEM_RAW/3d/n', 'RAW_STORE/3d/n', - 'VEC_STORE/3d/n', + 'VEC_STORE/5d/n', '_RAW_STORE_LAST', 'SETINTERIORFIELD_GC/3d/n', 'SETINTERIORFIELD_RAW/3d/n', # right now, only used by tests _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit