[pypy-commit] pypy ppc-vsx-support: correct the scaling for vec_load/store

plan_rich pypy.commits at gmail.com
Mon Aug 1 10:23:28 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: ppc-vsx-support
Changeset: r85955:84c8a9345e22
Date: 2016-08-01 16:22 +0200
http://bitbucket.org/pypy/pypy/changeset/84c8a9345e22/

Log:	correct the scaling for vec_load/store

diff --git a/rpython/jit/backend/llsupport/vector_ext.py b/rpython/jit/backend/llsupport/vector_ext.py
--- a/rpython/jit/backend/llsupport/vector_ext.py
+++ b/rpython/jit/backend/llsupport/vector_ext.py
@@ -2,7 +2,7 @@
 from rpython.jit.backend.llsupport.descr import (unpack_arraydescr,
         unpack_fielddescr, unpack_interiorfielddescr, ArrayDescr)
 from rpython.rlib.objectmodel import specialize, always_inline
-from rpython.jit.metainterp.history import (VECTOR, FLOAT, INT)
+from rpython.jit.metainterp.history import (VECTOR, FLOAT, INT, ConstInt)
 from rpython.jit.metainterp.resoperation import rop
 from rpython.jit.metainterp.optimizeopt.schedule import (forwarded_vecinfo,
         failnbail_transformation)
@@ -72,7 +72,7 @@
         self.argument_restrictions = argument_restris
 
     def check_operation(self, state, pack, op):
-        pass
+        return None
 
     def crop_vector(self, op, newsize, size):
         return newsize, size
@@ -111,19 +111,25 @@
 class LoadRestrict(OpRestrict):
     def check_operation(self, state, pack, op):
         opnum = op.getopnum()
+        descr = op.getdescr()
+        if not we_are_translated() and not isinstance(descr, ArrayDescr):
+            itemsize = descr.get_item_size_in_bytes()
+            ofs = 0
+        else:
+            itemsize, ofs, _ = unpack_arraydescr(op.getdescr())
+        args = [op.getarg(0), op.getarg(1), ConstInt(1), ConstInt(ofs)]
         if rop.is_getarrayitem(opnum) or \
              opnum in (rop.GETARRAYITEM_RAW_I, rop.GETARRAYITEM_RAW_F):
-            descr = op.getdescr()
-            if not we_are_translated() and not isinstance(descr, ArrayDescr):
-                itemsize = descr.get_item_size_in_bytes()
-                ofs = 0
-            else:
-                itemsize, ofs, _ = unpack_arraydescr(op.getdescr())
             index_box = op.getarg(1)
-            _, _, changed, emit = cpu_simplify_scale(state.cpu, index_box, itemsize, ofs)
+            scale, offset, changed, emit = cpu_simplify_scale(state.cpu, index_box, itemsize, ofs)
+            args[2] = ConstInt(scale)
+            args[3] = ConstInt(offset)
             if emit:
                 state.oplist.append(changed)
-                op.setarg(1, changed)
+                args[1] = changed
+
+        return args
+
 
     def opcount_filling_vector_register(self, op, vec_reg_size):
         assert rop.is_primitive_load(op.opnum)
@@ -136,18 +142,22 @@
 
     def check_operation(self, state, pack, op):
         opnum = op.getopnum()
+        descr = op.getdescr()
+        if not we_are_translated() and not isinstance(descr, ArrayDescr):
+            itemsize = descr.get_item_size_in_bytes()
+            ofs = 0
+        else:
+            itemsize, ofs, _ = unpack_arraydescr(op.getdescr())
+        args = [op.getarg(0), op.getarg(1), op.getarg(2), ConstInt(1), ConstInt(ofs)]
         if opnum in (rop.SETARRAYITEM_GC, rop.SETARRAYITEM_RAW):
-            descr = op.getdescr()
-            if not we_are_translated() and not isinstance(descr, ArrayDescr):
-                itemsize = descr.get_item_size_in_bytes()
-                basesize= 0
-            else:
-                itemsize, basesize, _ = unpack_arraydescr(op.getdescr())
             index_box = op.getarg(1)
-            _, _, changed, emit = cpu_simplify_scale(state.cpu, index_box, itemsize, basesize)
+            scale, offset, changed, emit = cpu_simplify_scale(state.cpu, index_box, itemsize, ofs)
+            args[3] = ConstInt(scale)
+            args[4] = ConstInt(offset)
             if emit:
                 state.oplist.append(changed)
-                op.setarg(1, changed)
+                args[1] = changed
+        return args
 
     def must_crop_vector(self, op, index):
         vecinfo = forwarded_vecinfo(op.getarg(index))
@@ -185,6 +195,7 @@
                 raise NotAVectorizeableLoop()
             if curvecinfo.datatype != datatype:
                 raise NotAVectorizeableLoop()
+        return None
 
 TR_ANY = TypeRestrict()
 TR_ANY_FLOAT = TypeRestrict(FLOAT)
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
@@ -150,26 +150,11 @@
 
         not_implemented("reduce sum for %s not impl." % arg)
 
-    # TODO remove
-    #def _genop_vec_getarrayitem(self, op, arglocs, resloc):
-    #    # considers item scale (raw_load does not)
-    #    base_loc, ofs_loc, size_loc, ofs, integer_loc, aligned_loc = arglocs
-    #    scale = get_scale(size_loc.value)
-    #    src_addr = addr_add(base_loc, ofs_loc, ofs.value, scale)
-    #    self._vec_load(resloc, src_addr, integer_loc.value,
-    #                   size_loc.value, aligned_loc.value)
-    #
-    #genop_vec_getarrayitem_raw_i = _genop_vec_getarrayitem
-    #genop_vec_getarrayitem_raw_f = _genop_vec_getarrayitem
-    #
-    #genop_vec_getarrayitem_gc_i = _genop_vec_getarrayitem
-    #genop_vec_getarrayitem_gc_f = _genop_vec_getarrayitem
-
     def _genop_vec_load(self, op, arglocs, resloc):
-        base_loc, ofs_loc, size_loc, ofs, integer_loc, aligned_loc = arglocs
-        src_addr = addr_add(base_loc, ofs_loc, ofs.value, 0)
+        base_loc, ofs_loc, size_loc, scale, ofs, integer_loc = arglocs
+        src_addr = addr_add(base_loc, ofs_loc, ofs.value, scale.value)
         self._vec_load(resloc, src_addr, integer_loc.value,
-                       size_loc.value, aligned_loc.value)
+                       size_loc.value, False)
 
     genop_vec_load_i = _genop_vec_load
     genop_vec_load_f = _genop_vec_load
@@ -187,23 +172,12 @@
             elif itemsize == 8:
                 self.mc.MOVUPD(resloc, src_addr)
 
-    # TODO remove
-    #def _genop_discard_vec_setarrayitem(self, op, arglocs):
-    #    # considers item scale (raw_store does not)
-    #    base_loc, ofs_loc, value_loc, size_loc, baseofs, integer_loc, aligned_loc = arglocs
-    #    scale = get_scale(size_loc.value)
-    #    dest_loc = addr_add(base_loc, ofs_loc, baseofs.value, scale)
-    #    self._vec_store(dest_loc, value_loc, integer_loc.value,
-    #                    size_loc.value, aligned_loc.value)
-
-    #genop_discard_vec_setarrayitem_raw = _genop_discard_vec_setarrayitem
-    #genop_discard_vec_setarrayitem_gc = _genop_discard_vec_setarrayitem
-
     def genop_discard_vec_store(self, op, arglocs):
-        base_loc, ofs_loc, value_loc, size_loc, baseofs, integer_loc, aligned_loc = arglocs
-        dest_loc = addr_add(base_loc, ofs_loc, baseofs.value, 0)
+        base_loc, ofs_loc, value_loc, size_loc, scale,\
+                baseofs, integer_loc = arglocs
+        dest_loc = addr_add(base_loc, ofs_loc, baseofs.value, scale.value)
         self._vec_store(dest_loc, value_loc, integer_loc.value,
-                        size_loc.value, aligned_loc.value)
+                        size_loc.value, False)
 
     @always_inline
     def _vec_store(self, dest_loc, value_loc, integer, itemsize, aligned):
@@ -550,20 +524,17 @@
         assert isinstance(descr, ArrayDescr)
         assert not descr.is_array_of_pointers() and \
                not descr.is_array_of_structs()
-        itemsize, ofs, _ = unpack_arraydescr(descr)
+        itemsize, _, _ = unpack_arraydescr(descr)
         integer = not (descr.is_array_of_floats() or descr.getconcrete_type() == FLOAT)
-        aligned = False
         args = op.getarglist()
+        scale = get_scale(op.getarg(2).getint())
+        ofs = op.getarg(3).getint()
         base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
         ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args)
         result_loc = self.force_allocate_reg(op)
-        self.perform(op, [base_loc, ofs_loc, imm(itemsize), imm(ofs),
-                          imm(integer), imm(aligned)], result_loc)
+        self.perform(op, [base_loc, ofs_loc, imm(itemsize), imm(scale),
+                          imm(ofs), imm(integer)], result_loc)
 
-    #consider_vec_getarrayitem_raw_i = _consider_vec_getarrayitem
-    #consider_vec_getarrayitem_raw_f = _consider_vec_getarrayitem
-    #consider_vec_getarrayitem_gc_i = _consider_vec_getarrayitem
-    #consider_vec_getarrayitem_gc_f = _consider_vec_getarrayitem
     consider_vec_load_i = _consider_vec_load
     consider_vec_load_f = _consider_vec_load
 
@@ -573,20 +544,18 @@
         assert isinstance(descr, ArrayDescr)
         assert not descr.is_array_of_pointers() and \
                not descr.is_array_of_structs()
-        itemsize, ofs, _ = unpack_arraydescr(descr)
+        itemsize, _, _ = unpack_arraydescr(descr)
         args = op.getarglist()
         base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
         value_loc = self.make_sure_var_in_reg(op.getarg(2), args)
         ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args)
+        scale = get_scale(op.getarg(3).getint())
+        ofs = op.getarg(4).getint()
 
-        integer = not (descr.is_array_of_floats() or descr.getconcrete_type() == FLOAT)
-        aligned = False
-        self.perform_discard(op, [base_loc, ofs_loc, value_loc,
-                                 imm(itemsize), imm(ofs), imm(integer), imm(aligned)])
-
-    #consider_vec_setarrayitem_raw = _consider_vec_setarrayitem
-    #consider_vec_setarrayitem_gc = _consider_vec_setarrayitem
-    #consider_vec_store = _consider_vec_setarrayitem
+        integer = not (descr.is_array_of_floats() or \
+                       descr.getconcrete_type() == FLOAT)
+        self.perform_discard(op, [base_loc, ofs_loc, value_loc, imm(itemsize),
+                                  imm(scale), imm(ofs), imm(integer)])
 
     def consider_vec_arith(self, op):
         lhs = op.getarg(0)
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
@@ -220,11 +220,17 @@
     left = pack.leftmost()
     oprestrict = state.cpu.vector_ext.get_operation_restriction(left)
     if oprestrict is not None:
-        oprestrict.check_operation(state, pack, left)
-    args = left.getarglist_copy()
+        newargs = oprestrict.check_operation(state, pack, left)
+        if newargs:
+            args = newargs
+        else:
+            args = left.getarglist_copy()
+    else:
+        args = left.getarglist_copy()
     prepare_arguments(state, oprestrict, pack, args)
     vecop = VecOperation(left.vector, args, left,
                          pack.numops(), left.getdescr())
+
     for i,node in enumerate(pack.operations):
         op = node.getoperation()
         if op.returns_void():
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
@@ -1077,7 +1077,7 @@
     'GETARRAYITEM_GC/2d/rfi',
     'GETARRAYITEM_RAW/2d/fi',
     'RAW_LOAD/2d/fi',
-    'VEC_LOAD/2d/fi',
+    'VEC_LOAD/4d/fi',
     '_RAW_LOAD_LAST',
 
     'GETINTERIORFIELD_GC/2d/rfi',
@@ -1112,7 +1112,7 @@
     'SETARRAYITEM_GC/3d/n',
     'SETARRAYITEM_RAW/3d/n',
     'RAW_STORE/3d/n',
-    'VEC_STORE/3d/n',
+    'VEC_STORE/5d/n',
     '_RAW_STORE_LAST',
     'SETINTERIORFIELD_GC/3d/n',
     'SETINTERIORFIELD_RAW/3d/n',    # right now, only used by tests


More information about the pypy-commit mailing list