Author: Richard Plangger <r...@pasra.at> Branch: vecopt Changeset: r77759:20d16b623806 Date: 2015-06-02 14:43 +0200 http://bitbucket.org/pypy/pypy/changeset/20d16b623806/
Log: removed primitive type mixin added two schedule tests for constant/variable expansion, need to move the instructions before the label 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 @@ -519,38 +519,7 @@ # ____________________________________________________________ -class PrimitiveTypeMixin(object): - _mixin_ = True - - def gettype(self): - raise NotImplementedError - def getsize(self): - raise NotImplementedError - def getsigned(self): - raise NotImplementedError - - def matches_type(self, other): - assert isinstance(other, PrimitiveTypeMixin) - return self.gettype() == other.gettype() - - def matches_size(self, other): - assert isinstance(other, PrimitiveTypeMixin) - return self.getsize() == other.getsize() - - def matches_sign(self, other): - assert isinstance(other, PrimitiveTypeMixin) - return self.getsigend() == other.signed() - - def matches(self, other): - if isinstance(other, PrimitiveTypeMixin): - return self.matches_type(other) and \ - self.matches_size(other) and \ - self.matches_sign(other) - return False - - - -class BoxVector(Box, PrimitiveTypeMixin): +class BoxVector(Box): type = VECTOR _attrs_ = ('item_type','item_count','item_size','item_signed') _extended_display = False diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py b/rpython/jit/metainterp/optimizeopt/dependency.py --- a/rpython/jit/metainterp/optimizeopt/dependency.py +++ b/rpython/jit/metainterp/optimizeopt/dependency.py @@ -602,7 +602,7 @@ while i >= 0: node = self.nodes[i] op = node.getoperation() - if node.is_ovf(): + if op.is_ovf(): break i -= 1 else: diff --git a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py --- a/rpython/jit/metainterp/optimizeopt/test/test_schedule.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_schedule.py @@ -93,3 +93,34 @@ v3[f64#2] = vec_cast_int_to_float(v2[i32#2]) """, False) self.assert_equal(loop2, loop3) + + def test_scalar_pack(self): + loop1 = self.parse(""" + i10 = int_add(i0, 73) + i11 = int_add(i1, 73) + """) + pack1 = self.pack(loop1, 0, 2) + loop2 = self.schedule(loop1, [pack1]) + loop3 = self.parse(""" + v1[i64#2] = vec_box(2) + v2[i64#2] = vec_int_pack(v1[i64#2], i0, 0, 1) + v3[i64#2] = vec_int_pack(v2[i64#2], i1, 1, 1) + v4[i64#2] = vec_int_expand(73) + v5[i64#2] = vec_int_add(v3[i64#2], v4[i64#2]) + """, False) + self.assert_equal(loop2, loop3) + + loop1 = self.parse(""" + f10 = float_add(f0, 73.0) + f11 = float_add(f1, 73.0) + """) + pack1 = self.pack(loop1, 0, 2) + loop2 = self.schedule(loop1, [pack1]) + loop3 = self.parse(""" + v1[f64#2] = vec_box(2) + v2[f64#2] = vec_float_pack(v1[f64#2], f0, 0, 1) + v3[f64#2] = vec_float_pack(v2[f64#2], f1, 1, 1) + v4[f64#2] = vec_float_expand(73.0) + v5[f64#2] = vec_float_add(v3[f64#2], v4[f64#2]) + """, False) + self.assert_equal(loop2, loop3) 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 @@ -5,7 +5,7 @@ from rpython.jit.metainterp.optimizeopt.unroll import optimize_unroll from rpython.jit.metainterp.compile import ResumeAtLoopHeaderDescr, invent_fail_descr_for_op from rpython.jit.metainterp.history import (ConstInt, VECTOR, FLOAT, INT, - BoxVector, TargetToken, JitCellToken, Box, PrimitiveTypeMixin) + BoxVector, BoxFloat, BoxInt, ConstFloat, TargetToken, JitCellToken, Box) from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer, Optimization from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method from rpython.jit.metainterp.optimizeopt.dependency import (DependencyGraph, @@ -593,7 +593,7 @@ assert isinstance(key2, IndexVar) return key1.compare(key2) # - raise RuntimeError("cannot compare: " + str(key1) + " <=> " + str(key2)) + raise AssertionError("cannot compare: " + str(key1) + " <=> " + str(key2)) def emit_varops(self, opt, var, old_arg): if isinstance(var, IndexVar): @@ -630,7 +630,7 @@ return op i -= 1 - raise RuntimeError("guard_true/false first arg not defined") + raise AssertionError("guard_true/false first arg not defined") def _get_key(self, cmp_op): if cmp_op and rop.INT_LT <= cmp_op.getopnum() <= rop.INT_GE: @@ -772,7 +772,7 @@ return 1 -class PackType(PrimitiveTypeMixin): +class PackType(object): UNKNOWN_TYPE = '-' def __init__(self, type, size, signed, count=-1, scalar_cost=1, vector_cost=1): @@ -845,11 +845,18 @@ return self.input_type.getsize() def determine_input_type(self, op): + arg = op.getarg(0) _, vbox = self.sched_data.getvector_of_box(op.getarg(0)) if vbox: return PackType.of(vbox) else: - raise RuntimeError("fatal: box %s is not in a vector box" % (op.getarg(0),)) + vec_reg_size = self.sched_data.vec_reg_size + if isinstance(arg, ConstInt) or isinstance(arg, BoxInt): + return PackType(INT, 8, True, 2) + elif isinstance(arg, ConstFloat) or isinstance(arg, BoxFloat): + return PackType(FLOAT, 8, True, 2) + else: + raise NotImplementedError("arg %s not supported" % (arg,)) def determine_output_type(self, op): return self.determine_input_type(op) @@ -1010,7 +1017,8 @@ op = ResOperation(opnum, [tgt_box, src_box, ConstInt(i), ConstInt(src_box.item_count)], new_box) self.preamble_ops.append(op) - self._check_vec_pack(op) + if not we_are_translated(): + self._check_vec_pack(op) i += src_box.item_count # overwrite the new positions, arguments now live in new_box @@ -1041,10 +1049,11 @@ assert index.value + count.value <= result.item_count assert result.item_count > arg0.item_count - def expand_box_to_vector_box(self, vbox, ops, arg, argidx): + def expand_box_to_vector_box(self, vbox, nodes, arg, argidx): all_same_box = True - for i, op in enumerate(ops): - if arg is not op.getoperation().getarg(argidx): + for i, node in enumerate(nodes): + op = node.getoperation() + if not arg.same_box(op.getarg(argidx)): all_same_box = False break i += 1 @@ -1060,16 +1069,17 @@ expand_op = ResOperation(expand_opnum, [arg], vbox) self.preamble_ops.append(expand_op) else: - resop = ResOperation(rop.VEC_BOX, [ConstInt(len(ops))], vbox) + resop = ResOperation(rop.VEC_BOX, [ConstInt(len(nodes))], vbox) self.preamble_ops.append(resop) opnum = rop.VEC_FLOAT_PACK if arg.type == INT: opnum = rop.VEC_INT_PACK - for i,op in enumerate(ops): - arg = op.getoperation().getarg(argidx) + for i,node in enumerate(nodes): + op = node.getoperation() + arg = op.getarg(argidx) new_box = vbox.clonebox() resop = ResOperation(opnum, - [vbox,arg,ConstInt(i),ConstInt(0)], new_box) + [vbox,arg,ConstInt(i),ConstInt(1)], new_box) vbox = new_box self.preamble_ops.append(resop) return vbox _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit