Author: Richard Plangger <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit