Author: Richard Plangger <planri...@gmail.com>
Branch: vecopt-merge
Changeset: r79818:fd5cdd7ddc3e
Date: 2015-09-25 10:51 +0200
http://bitbucket.org/pypy/pypy/changeset/fd5cdd7ddc3e/

Log:    7 new test cases to check the guard_true/false assembler for vector
        parameters

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
@@ -118,20 +118,6 @@
         retval = self.interp.eval_graph(self.graph, [i])
         return retval
 
-    def define_dot_matrix():
-        return """
-        mat = |16|
-        m = reshape(mat, [4,4])
-        vec = [0,1,2,3]
-        a = dot(m, vec)
-        a -> 3
-        """
-
-    def test_dot_matrix(self):
-        result = self.run("dot_matrix")
-        assert int(result) == 86
-        self.check_vectorized(2, 1)
-
     def define_float32_copy():
         return """
         a = astype(|30|, float32)
@@ -916,6 +902,21 @@
         # that iterates continous chunks of the matrix
         self.check_vectorized(1,1) 
 
+    def define_dot_matrix():
+        return """
+        mat = |16|
+        m = reshape(mat, [4,4])
+        vec = [0,1,2,3]
+        a = dot(m, vec)
+        a -> 3
+        """
+
+    def test_dot_matrix(self):
+        result = self.run("dot_matrix")
+        assert int(result) == 86
+        self.check_vectorized(2, 1)
+
+
     # NOT WORKING
 
     def define_pow():
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
@@ -1075,12 +1075,22 @@
     def execute_guard_early_exit(self, descr):
         pass
 
+    def _check_true(self, arg):
+        if isinstance(arg, list):
+            return all(arg)
+        return arg
+
+    def _check_false(self, arg):
+        if isinstance(arg, list):
+            return any(arg)
+        return arg
+
     def execute_guard_true(self, descr, arg):
-        if not arg:
+        if not self._check_true(arg):
             self.fail_guard(descr)
 
     def execute_guard_false(self, descr, arg):
-        if arg:
+        if self._check_false(arg):
             self.fail_guard(descr)
 
     def execute_guard_value(self, descr, arg1, arg2):
diff --git a/rpython/jit/backend/llsupport/descr.py 
b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -248,7 +248,7 @@
     all_interiorfielddescrs = None
     concrete_type = '\x00'
 
-    def __init__(self, basesize, itemsize, lendescr, flag, 
concrete_type='\x00', is_pure=False):
+    def __init__(self, basesize, itemsize, lendescr, flag, is_pure=False, 
concrete_type='\x00'):
         self.basesize = basesize
         self.itemsize = itemsize
         self.lendescr = lendescr    # or None, if no length
@@ -339,13 +339,13 @@
             descrs = heaptracker.all_interiorfielddescrs(gccache,
                 ARRAY_INSIDE, get_field_descr=get_interiorfield_descr)
             arraydescr.all_interiorfielddescrs = descrs
-        concreate_type = '\x00'
+        concrete_type = '\x00'
         if ARRAY_INSIDE.OF is lltype.SingleFloat or \
            ARRAY_INSIDE.OF is lltype.Float:
             # it would be better to set the flag as FLOAT_TYPE
             # for single float -> leads to problems
-            concrete_type = FLOAT
-        arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag, 
concreate_type)
+            concrete_type = 'f'
+        arraydescr = ArrayDescr(basesize, itemsize, lendescr, flag, is_pure, 
concrete_type=concrete_type)
         if ARRAY_OR_STRUCT._gckind == 'gc':
             gccache.init_array_descr(ARRAY_OR_STRUCT, arraydescr)
         return arraydescr
diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1658,14 +1658,6 @@
             self.mc.PUNPCKLDQ_xx(resloc.value, loc1.value)
 
     def genop_guard_guard_true(self, guard_op, guard_token, locs, resloc):
-        #loc = locs[0]
-        #if isinstance(loc, RegLoc):
-        #    if loc.is_xmm:
-        #        self._guard_vector_true(guard_op, loc)
-        #        # XXX
-        #        self.implement_guard(guard_token, 'NZ')
-        #        return
-        #self.mc.TEST(loc, loc)
         self.implement_guard(guard_token)
     genop_guard_guard_nonnull = genop_guard_guard_true
 
diff --git a/rpython/jit/backend/x86/vector_ext.py 
b/rpython/jit/backend/x86/vector_ext.py
--- a/rpython/jit/backend/x86/vector_ext.py
+++ b/rpython/jit/backend/x86/vector_ext.py
@@ -43,9 +43,9 @@
         self.mc.PBLENDW_xxi(loc.value, temp.value, select)
 
     def _guard_vector_true(self, guard_op, loc, zero=False):
+        return
         arg = guard_op.getarg(0)
-        assert isinstance(arg, BoxVector)
-        size = arg.item_size
+        size = arg.bytesize
         temp = X86_64_XMM_SCRATCH_REG
         #
         self.mc.PXOR(temp, temp)
@@ -65,7 +65,6 @@
 
     def _guard_vector_false(self, guard_op, loc):
         arg = guard_op.getarg(0)
-        assert isinstance(arg, BoxVector)
         #
         # if the vector is not fully packed blend 1s
         if not arg.fully_packed(self.cpu.vector_register_size):
@@ -204,6 +203,17 @@
         # a second time -> every zero entry (corresponding to non zero
         # entries before) become ones
         self.mc.PCMPEQ(loc, temp, sizeloc.value)
+        # TODO
+        #self.flush_cc(rx86.Conditions['NZ'], resloc)
+        #loc = locs[0]
+        #if isinstance(loc, RegLoc):
+        #    if loc.is_xmm:
+        #        self._guard_vector_true(guard_op, loc)
+        #        # XXX
+        #        self.implement_guard(guard_token, 'NZ')
+        #        return
+        #self.mc.TEST(loc, loc)
+
 
     def genop_guard_vec_int_is_true(self, op, guard_op, guard_token, arglocs, 
resloc):
         guard_opnum = guard_op.getopnum()
@@ -618,11 +628,9 @@
 
     def consider_vec_arith_unary(self, op):
         lhs = op.getarg(0)
-        assert isinstance(lhs, BoxVector)
-        size = lhs.item_size
         args = op.getarglist()
         res = self.xrm.force_result_in_reg(op, op.getarg(0), args)
-        self.perform(op, [res, imm(size)], res)
+        self.perform(op, [res, imm(lhs.bytesize)], res)
 
     consider_vec_float_neg = consider_vec_arith_unary
     consider_vec_float_abs = consider_vec_arith_unary
@@ -637,15 +645,13 @@
 
     def consider_vec_float_eq(self, op, guard_op):
         lhs = op.getarg(0)
-        assert isinstance(lhs, BoxVector)
-        size = lhs.item_size
         args = op.getarglist()
         lhsloc = self.xrm.force_result_in_reg(op, op.getarg(0), args)
         rhsloc = self.make_sure_var_in_reg(op.getarg(1), args)
         if guard_op:
-            self.perform_with_guard(op, guard_op, [lhsloc, rhsloc, imm(size)], 
None)
+            self.perform_with_guard(op, guard_op, [lhsloc, rhsloc, 
imm(lhs.bytesize)], None)
         else:
-            self.perform(op, [lhsloc, rhsloc, imm(size)], lhsloc)
+            self.perform(op, [lhsloc, rhsloc, imm(lhs.bytesize)], lhsloc)
 
     consider_vec_float_ne = consider_vec_float_eq
     consider_vec_int_eq = consider_vec_float_eq
@@ -681,16 +687,14 @@
         assert isinstance(count, ConstInt)
         args = op.getarglist()
         srcloc = self.make_sure_var_in_reg(op.getarg(0), args)
-        if isinstance(op.result, BoxVector):
+        if op.is_vector():
             resloc =  self.xrm.force_result_in_reg(op.result, op.getarg(0), 
args)
-            assert isinstance(op.result, BoxVector)
-            size = op.result.getsize()
+            size = op.bytesize
         else:
             # unpack into iX box
             resloc =  self.force_allocate_reg(op.result, args)
             arg = op.getarg(0)
-            assert isinstance(arg, BoxVector)
-            size = arg.getsize()
+            size = arg.bytesize
         residx = 0
         args = op.getarglist()
         arglocs = [resloc, srcloc, imm(residx), imm(index.value), 
imm(count.value), imm(size)]
@@ -726,16 +730,13 @@
         assert size > 0
         self.perform(op, [resloc, imm(size), imm(op.bytesize)], resloc)
 
-    def consider_vec_int_is_true(self, op, guard_op):
+    def consider_vec_int_is_true(self, op):
         args = op.getarglist()
-        resloc = self.xrm.force_result_in_reg(op.result, op.getarg(0), args)
-        sizearg = op.getarg(0)
-        assert isinstance(sizearg, BoxVector)
-        size = sizearg.getsize()
-        if guard_op is not None:
-            self.perform_with_guard(op, guard_op, [resloc,imm(size)], None)
-        else:
-            self.perform(op, [resloc,imm(size)], None)
+        #resloc = self.xrm.force_result_in_reg(op, op.getarg(0), args)
+        arg = op.getarg(0)
+        argloc = self.loc(arg)
+        resloc = self.force_allocate_reg_or_cc(op)
+        self.perform(op, [resloc,imm(size)], None)
 
     def _consider_vec(self, op):
         # pseudo instruction, needed to create a new variable
diff --git a/rpython/jit/metainterp/optimizeopt/version.py 
b/rpython/jit/metainterp/optimizeopt/version.py
--- a/rpython/jit/metainterp/optimizeopt/version.py
+++ b/rpython/jit/metainterp/optimizeopt/version.py
@@ -32,7 +32,6 @@
             self.descrs.append(descr)
         assert descr not in self.leads_to
         self.leads_to[descr] = version
-        assert version.renamed_inputargs is not None
 
     def remove(self, descr):
         if descr in self.leads_to:
@@ -90,12 +89,11 @@
         create one instance and attach it to a guard descr.
         If not attached to a descriptor, it will not be compiled.
     """
-    _attrs_ = ('label', 'operations', 'inputargs', 'renamed_inputargs')
+    _attrs_ = ('label', 'loop', 'inputargs')
 
     def __init__(self, loop):
         self.loop = loop
         self.inputargs = loop.label.getarglist()
-        self.renamed_inputargs = loop.label.getarglist()
 
     def setup_once(self, info):
         for op in self.loop.operations:
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
@@ -28,10 +28,11 @@
     _repr_memo = CountingDict()
     is_info_class = False
     namespace = None
-    _attrs_ = ('datatype', 'bytesize', 'signed')
+    _attrs_ = ('datatype', 'bytesize', 'signed', 'count')
     datatype = '\x00'
     bytesize = -1 # -1 means the biggest size known to the machine
     signed = True
+    count = -1
 
     def _get_hash_(self):
         return compute_identity_hash(self)
@@ -121,15 +122,18 @@
             return
 
         if self.is_primitive_array_access():
+            from rpython.jit.backend.llsupport.descr import ArrayDescr
             descr = self.getdescr()
             if not we_are_translated():
                 from rpython.jit.backend.llgraph.runner import _getdescr
                 descr = _getdescr(self)
             type = self.type
-            if descr.is_array_of_floats() or descr.concrete_type == 'f':
+            if descr.is_array_of_floats():
+                type = 'f'
+            if isinstance(descr, ArrayDescr) and descr.getconcrete_type() == 
'f':
                 type = 'f'
             self.bytesize = descr.get_item_size_in_bytes()
-            self.sign = descr.is_item_signed()
+            self.signed = descr.is_item_signed()
             self.datatype = type
         elif self.opnum == rop.INT_SIGNEXT:
             from rpython.jit.metainterp import history
@@ -166,6 +170,8 @@
                     self.setdatatype('r', INT_WORD, False)
                 return
             self.setdatatype(arg.datatype, arg.bytesize, arg.signed)
+            if self.returns_bool_result():
+                self.datatype = 'i'
         assert self.datatype != '\x00'
         #assert self.bytesize > 0
 
@@ -209,7 +215,6 @@
     boolinverse = -1
     vector = -1 # -1 means, no vector equivalent, -2 it is a vector statement
     casts = ('\x00', -1, '\x00', -1, -1)
-    count = -1 
 
     def getopnum(self):
         return self.opnum
diff --git a/rpython/jit/metainterp/test/test_vector.py 
b/rpython/jit/metainterp/test/test_vector.py
--- a/rpython/jit/metainterp/test/test_vector.py
+++ b/rpython/jit/metainterp/test/test_vector.py
@@ -157,6 +157,38 @@
         res = self.meta_interp(f, [30])
         assert res == f(30) == 128
 
+    @py.test.mark.parametrize('func,init,insert,at,count,breaks',
+            # all
+           [(lambda x: not bool(x), 1.0, None, -1,32, False),
+            (lambda x: x == 0.0,    1.0, None, -1,33, False),
+            (lambda x: x == 0.0,    1.0, 0.0,  33,34, True),
+            # any
+            (lambda x: x != 0.0,    0.0, 1.0,  33,35, True),
+            (lambda x: x != 0.0,    0.0, 1.0,  -1,36, False),
+            (lambda x: bool(x),     0.0, 1.0,  33,37, True),
+            (lambda x: bool(x),     0.0, 1.0,  -1,38, False),
+           ])
+    def test_bool_reduction(self, func, init, insert, at, count, breaks):
+        myjitdriver = JitDriver(greens = [], reds = 'auto', vectorize=True)
+        T = lltype.Array(rffi.DOUBLE, hints={'nolength': True})
+        def f(d):
+            va = lltype.malloc(T, d, flavor='raw', zero=True)
+            for i in range(d): va[i] = init
+            if at != -1:
+                va[at] = insert
+            i = 0 ; nobreak = False
+            while i < d:
+                myjitdriver.jit_merge_point()
+                if func(va[i]):
+                    break
+                i += 1
+            else:
+                nobreak = True
+            lltype.free(va, flavor='raw')
+            return not nobreak
+        res = self.meta_interp(f, [count])
+        assert res == f(count) == breaks
+
     def test_sum(self):
         myjitdriver = JitDriver(greens = [], reds = 'auto', vectorize=True)
         T = lltype.Array(rffi.DOUBLE, hints={'nolength': True})
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to