[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