Author: Richard Plangger <planri...@gmail.com> Branch: vecopt-merge Changeset: r79641:d3aaa1983ac4 Date: 2015-09-14 20:31 +0200 http://bitbucket.org/pypy/pypy/changeset/d3aaa1983ac4/
Log: work in progress moving vecop creation to OpHelpers 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 @@ -165,17 +165,9 @@ # raise AssertionError("getunpackopnum type %s not supported" % (type,)) -def getexpandopnum(type): - if type == INT: - return rop.VEC_INT_EXPAND - elif type == FLOAT: - return rop.VEC_FLOAT_EXPAND - # - raise AssertionError("getexpandopnum type %s not supported" % (type,)) - -UNSIGNED_OPS = (rop.UINT_FLOORDIV, rop.UINT_RSHIFT, - rop.UINT_LT, rop.UINT_LE, - rop.UINT_GT, rop.UINT_GE) +#UNSIGNED_OPS = (rop.UINT_FLOORDIV, rop.UINT_RSHIFT, +# rop.UINT_LT, rop.UINT_LE, +# rop.UINT_GT, rop.UINT_GE) #class Type(object): # """ The type of one operation. Saves type, size and sign. """ @@ -446,7 +438,7 @@ if not vecop: # 2) constant/variable expand this box # TODO just as one function call - vecop = self.expand(arg, i) + vecop = expand(state, pack, args, arg, i) state.setvector_of_box(arg, 0, vecop) pos = 0 continue @@ -696,26 +688,24 @@ assert index.value + count.value <= result.getcount() assert result.getcount() > arg0.getcount() -def expand(self, arg, argidx): +def expand(state, pack, op, arg, argidx): """ Expand a value into a vector box. useful for arith metic of one vector with a scalar (either constant/varialbe) """ - elem_count = self.input_type.getcount() - vbox = self.input_type.new_vector_box(elem_count) + vecop = OpHelpers.create_vec(OpHelpers.vector_for_type(arg.type), None, + arg.type, op.bytesize, op.signed, op.count) box_type = arg.type - expanded_map = self.sched_data.expanded_map - # note that heterogenous nodes are not yet tracked - already_expanded = expanded_map.get(arg, None) - if already_expanded: - return already_expanded + #expanded_map = state.expanded_map + ## note that heterogenous nodes are not yet tracked + #already_expanded = expanded_map.get(arg, None) + #if already_expanded: + # return already_expanded - ops = self.sched_data.invariant_oplist - variables = self.sched_data.invariant_vector_vars - if isinstance(arg,Box) and arg not in self.sched_data.inputargs: + ops = state.invariant_oplist + variables = state.invariant_vector_vars + if not arg.is_constant() and arg not in state.inputargs: ops = self.vecops variables = None - if isinstance(arg, BoxVector): - box_type = arg.gettype() for i, node in enumerate(self.getoperations()): op = node.getoperation() @@ -723,12 +713,12 @@ break i += 1 else: - expand_opnum = getexpandopnum(box_type) - op = ResOperation(expand_opnum, [arg, ConstInt(vbox.item_count)], vbox) + vecop = OpHelpers.create_expand(arg.type, arg, op.count) + ops.append(vecop) ops.append(op) if variables is not None: - variables.append(vbox) - expanded_map[arg] = vbox + variables.append(vecop) + expanded_map[arg] = vecop return vbox op = ResOperation(rop.VEC_BOX, [ConstInt(elem_count)], vbox) 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 @@ -173,7 +173,7 @@ i10 = int_add(i0, 73) i11 = int_add(i1, 73) """) - pack1 = self.pack(loop1, 0, 2, I64, I64) + pack1 = self.pack(loop1, 0, 2) loop2 = self.schedule(loop1, [pack1], prepend_invariant=True) loop3 = self.parse_trace(""" v10[2xi64] = vec_box_i() diff --git a/rpython/jit/metainterp/optimizeopt/vector.py b/rpython/jit/metainterp/optimizeopt/vector.py --- a/rpython/jit/metainterp/optimizeopt/vector.py +++ b/rpython/jit/metainterp/optimizeopt/vector.py @@ -825,6 +825,7 @@ state.renamer.start_renaming(accum.getoriginalbox(), result) def split_overloaded_packs(self): + import pdb; pdb. set_trace() newpacks = [] for i,pack in enumerate(self.packs): load = pack.pack_load(self.vec_reg_size) 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 @@ -4,6 +4,8 @@ from rpython.rlib.objectmodel import compute_identity_hash from rpython.rtyper.lltypesystem import lltype, llmemory from rpython.jit.codewriter import longlong +from rpython.jit.backend.llsupport.symbolic import (WORD as INT_WORD, + SIZEOF_FLOAT as FLOAT_WORD) class SettingForwardedOnAbstractValue(Exception): pass @@ -127,13 +129,24 @@ # pass through the type of the first input argument if self.numargs() == 0: return - arg0 = self.getarg(0) - self.setdatatype(arg0.datatype, arg0.bytesize, arg0.signed) + i = 0 + arg = self.getarg(i) + while arg.is_constant() and i+1 < self.numargs(): + i += 1 + arg = self.getarg(i) + if arg.is_constant(): + return + self.setdatatype(arg.datatype, arg.bytesize, arg.signed) assert self.datatype != '\x00' #assert self.bytesize > 0 def setdatatype(self, data_type, bytesize, signed): self.datatype = data_type + if bytesize == -1: + if data_type == 'i': + bytesize = INT_WORD + elif data_type == 'f': + bytesize = FLOAT_WORD self.bytesize = bytesize self.signed = signed @@ -994,13 +1007,10 @@ 'VEC_CAST_INT_TO_FLOAT/1/f', '_VEC_CAST_LAST', - 'VEC_BOX/0/if', - 'VEC_INT_UNPACK/3/i', # iX|fX = VEC_INT_UNPACK(vX, index, item_count) - 'VEC_INT_PACK/4/i', # VEC_INT_PACK(vX, var/const, index, item_count) - 'VEC_INT_EXPAND/2/i', # vX = VEC_INT_EXPAND(var/const, item_count) - 'VEC_FLOAT_UNPACK/3/f', # iX|fX = VEC_FLOAT_UNPACK(vX, index, item_count) - 'VEC_FLOAT_PACK/4/f', # VEC_FLOAT_PACK(vX, var/const, index, item_count) - 'VEC_FLOAT_EXPAND/2/f', # vX = VEC_FLOAT_EXPAND(var/const, item_count) + 'VEC/0/if', + 'VEC_UNPACK/3/if', # iX|fX = VEC_INT_UNPACK(vX, index, item_count) + 'VEC_PACK/4/if', # VEC_INT_PACK(vX, var/const, index, item_count) + 'VEC_EXPAND/2/if', # vX = VEC_INT_EXPAND(var/const, item_count) '_VEC_PURE_LAST', # 'INT_LT/2b/i', @@ -1554,3 +1564,22 @@ else: assert tp == 'f' return InputArgFloat() + + @staticmethod + def create_expand(datatype, arg, bytesize, signed, count): + if datatype == 'i': + opnum = rop.VEC_EXPAND_I + else: + assert datatype == 'f' + opnum = rop.VEC_EXPAND_F + return VecOperationNew(opnum, [arg], datatype, bytesize, signed, count) + + @staticmethod + def create_vec(datatype, arg, bytesize, signed, count): + if type == 'i': + opnum = rop.VEC_I + else: + assert type == 'f' + opnum = rop.VEC_F + return VecOperationNew(opnum, [arg], datatype, bytesize, signed, count) + _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit