Author: Richard Plangger <r...@pasra.at> Branch: vecopt Changeset: r77202:709297417af9 Date: 2015-05-07 16:44 +0200 http://bitbucket.org/pypy/pypy/changeset/709297417af9/
Log: renamed zjit_test, removed byte count and signed from vector box -> descr in backend provides this added expand operation (scalar box -> vector box) diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py --- a/pypy/module/micronumpy/test/test_zjit.py +++ b/pypy/module/micronumpy/test/test_zjit.py @@ -88,15 +88,15 @@ result = self.run("add") assert result == 3 + 3 - def define_float_add(): + def define_add_const(): return """ a = |30| + 3 - a -> 3 + a -> 29 """ - def test_float_add(self): - result = self.run("float_add") - assert result == 3 + 3 + def test_add_const(self): + result = self.run("add_const") + assert result == 29 + 3 self.check_trace_count(1) self.check_simple_loop({ 'float_add': 1, diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py --- a/rpython/jit/backend/llgraph/runner.py +++ b/rpython/jit/backend/llgraph/runner.py @@ -687,6 +687,9 @@ def bh_vec_box_unpack(self, vx, index): return vx[index] + def bh_vec_expand(self, x, count): + return [x] * count + def bh_vec_int_signext(self, vx, ext, count): return [heaptracker.int_signext(_vx, ext) for _vx in vx] diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py --- a/rpython/jit/metainterp/executor.py +++ b/rpython/jit/metainterp/executor.py @@ -344,6 +344,7 @@ rop.VEC_RAW_STORE, rop.VEC_BOX_PACK, rop.VEC_BOX_UNPACK, + rop.VEC_EXPAND, rop.VEC_GETARRAYITEM_RAW, rop.VEC_SETARRAYITEM_RAW, ): # list of opcodes never executed by pyjitpl diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py --- a/rpython/jit/metainterp/history.py +++ b/rpython/jit/metainterp/history.py @@ -514,14 +514,12 @@ class BoxVector(Box): type = VECTOR - _attrs_ = ('item_type','byte_count','item_count','signed') + _attrs_ = ('item_type','item_count') _extended_display = False - def __init__(self, item_type=FLOAT, item_count=8, bytecount=2, signed=True): + def __init__(self, item_type=FLOAT, item_count=2): self.item_type = item_type self.item_count = item_count - self.byte_count = bytecount - self.signed = signed def forget_value(self): raise NotImplementedError("cannot forget value of vector") diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py --- a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py @@ -982,12 +982,11 @@ pass def test_constant_expansion(self): - py.test.skip() ops = """ [p0,i0] guard_early_exit() [p0,i0] i1 = getarrayitem_raw(p0, i0, descr=floatarraydescr) # constant index - i4 = int_mul(i1, 2) + i4 = int_mul(i1, 42) i3 = int_add(i0,1) i5 = int_lt(i3, 10) guard_true(i5) [p0, i0] @@ -995,14 +994,18 @@ """ opt=""" [p0,i0] - i2 = int_add(i0, 4) + guard_early_exit() [p0,i0] + i20 = int_add(i0, 1) + i30 = int_lt(i20, 10) + i2 = int_add(i0, 2) i3 = int_lt(i2, 10) guard_true(i3) [p0,i0] - v1 = vec_getarrayitem_raw(p0, i0, 4, descr=floatarraydescr) - v2 = int_mul(v1, 2) + v1 = vec_getarrayitem_raw(p0, i0, 2, descr=floatarraydescr) + v3 = vec_expand(42, 2) + v2 = vec_int_mul(v1, v3, 2) jump(p0,i2) """ - vopt = self.vectorize(self.parse_loop(ops),3) + vopt = self.vectorize(self.parse_loop(ops),1) self.assert_equal(vopt.loop, self.parse_loop(opt)) def test_element_f45_in_guard_failargs(self): diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py b/rpython/jit/metainterp/optimizeopt/vectorize.py --- a/rpython/jit/metainterp/optimizeopt/vectorize.py +++ b/rpython/jit/metainterp/optimizeopt/vectorize.py @@ -532,6 +532,8 @@ class VecScheduleData(SchedulerData): def __init__(self): self.box_to_vbox = {} + self.preamble_ops = None + self.expansion_byte_count = -1 def as_vector_operation(self, pack): op_count = len(pack.operations) @@ -544,43 +546,64 @@ args = op0.getarglist()[:] args.append(ConstInt(op_count)) vop = ResOperation(op0.vector, args, op0.result, op0.getdescr()) + self.preamble_ops = [] self._inspect_operation(vop) - return [vop] + self.preamble_ops.append(vop) + return self.preamble_ops def get_vbox_for(self, arg): try: _, vbox = self.box_to_vbox[arg] return vbox except KeyError: - # if this is not the case, then load operations must - # be emitted - assert False, "vector box MUST be defined before" + return None - def vector_result(self, vop, bytecount, signed): + def vector_result(self, vop): ops = self.pack.operations - op0 = ops[0].getoperation() - result = op0.result - vboxcount = len(ops) - vbox = BoxVector(result.type, vboxcount, bytecount, signed) + result = vop.result + vbox = BoxVector(result.type, len(ops)) vop.result = vbox i = 0 - while i < vboxcount: + while i < len(ops): op = ops[i].getoperation() self.box_to_vbox[op.result] = (i, vbox) i += 1 - def vector_arg(self, vop, argidx): + def vector_arg(self, vop, argidx, expand=True): ops = self.pack.operations - op0 = ops[0].getoperation() - vbox = self.get_vbox_for(op0.getarg(argidx)) + vbox = self.get_vbox_for(vop.getarg(argidx)) + if not vbox: + if expand: + vbox = self.expand_box_to_vector_box(vop, argidx) + else: + assert False, "not allowed to expand" \ + ", but do not have a vector box as arg" vop.setarg(argidx, vbox) return vbox + def expand_box_to_vector_box(self, vop, argidx): + arg = vop.getarg(argidx) + all_same_box = True + ops = self.pack.operations + for i in range(len(ops)): + op = ops[i] + if arg is not op.getoperation().getarg(argidx): + all_same_box = False + break + + if all_same_box: + vbox = BoxVector(arg.type, len(ops)) + expand_op = ResOperation(rop.VEC_EXPAND, [arg, ConstInt(len(ops))], vbox) + self.preamble_ops.append(expand_op) + return vbox + else: + assert False, "not yet handled" + bin_arith_trans = """ def _vectorize_{name}(self, vop): vbox = self.vector_arg(vop, 0) self.vector_arg(vop, 1) - self.vector_result(vop, vbox.byte_count, vbox.signed) + self.vector_result(vop) """ exec py.code.Source(bin_arith_trans.format(name='VEC_INT_ADD')).compile() exec py.code.Source(bin_arith_trans.format(name='VEC_INT_MUL')).compile() @@ -591,20 +614,16 @@ del bin_arith_trans def _vectorize_VEC_INT_SIGNEXT(self, vop): - vbox = self.vector_arg(vop, 0) + self.vector_arg(vop, 0) # arg 1 is a constant - self.vector_result(vop, vbox.byte_count, vbox.signed) + self.vector_result(vop) def _vectorize_VEC_RAW_LOAD(self, vop): descr = vop.getdescr() - byte_count = descr.get_item_size_in_bytes() - signed = descr.is_item_signed() - self.vector_result(vop, byte_count, signed) + self.vector_result(vop) def _vectorize_VEC_GETARRAYITEM_RAW(self, vop): descr = vop.getdescr() - byte_count = descr.get_item_size_in_bytes() - signed = descr.is_item_signed() - self.vector_result(vop, byte_count, signed) + self.vector_result(vop) def _vectorize_VEC_RAW_STORE(self, vop): self.vector_arg(vop, 2) 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 @@ -462,6 +462,7 @@ '_VEC_ARITHMETIC_LAST', 'VEC_BOX_UNPACK/2', 'VEC_BOX_PACK/3', + 'VEC_EXPAND/2', # 'INT_LT/2b', 'INT_LE/2b', _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit