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

Reply via email to