[pypy-commit] pypy ppc-vsx-support: extend the integer vector test
plan_rich
pypy.commits at gmail.com
Tue Jun 21 12:31:03 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch: ppc-vsx-support
Changeset: r85313:277106ec536b
Date: 2016-06-21 18:29 +0200
http://bitbucket.org/pypy/pypy/changeset/277106ec536b/
Log: extend the integer vector test
diff --git a/rpython/jit/backend/ppc/vector_ext.py b/rpython/jit/backend/ppc/vector_ext.py
--- a/rpython/jit/backend/ppc/vector_ext.py
+++ b/rpython/jit/backend/ppc/vector_ext.py
@@ -178,6 +178,29 @@
elif itemsize == 8:
self.mc.xvdivdp(resloc.value, loc0.value, loc1.value)
+ def emit_vec_int_mul(self, op, arglocs, resloc):
+ loc0, loc1, itemsize_loc = arglocs
+ itemsize = itemsize_loc.value
+ if itemsize == 1:
+ self.mc.PMULLW(loc0, loc1)
+ elif itemsize == 2:
+ self.mc.PMULLW(loc0, loc1)
+ elif itemsize == 4:
+ self.mc.PMULLD(loc0, loc1)
+ else:
+ # NOTE see http://stackoverflow.com/questions/8866973/can-long-integer-routines-benefit-from-sse/8867025#8867025
+ # There is no 64x64 bit packed mul. For 8 bit either. It is questionable if it gives any benefit?
+ not_implemented("int8/64 mul")
+
+ def emit_vec_int_and(self, op, arglocs, resloc):
+ self.mc.PAND(resloc, arglocs[0])
+
+ def emit_vec_int_or(self, op, arglocs, resloc):
+ self.mc.POR(resloc, arglocs[0])
+
+ def emit_vec_int_xor(self, op, arglocs, resloc):
+ self.mc.PXOR(resloc, arglocs[0])
+
#def genop_guard_vec_guard_true(self, guard_op, guard_token, locs, resloc):
# self.implement_guard(guard_token)
@@ -293,47 +316,6 @@
# # entries before) become ones
# self.mc.PCMPEQ(loc, temp, sizeloc.value)
- #def genop_vec_int_mul(self, op, arglocs, resloc):
- # loc0, loc1, itemsize_loc = arglocs
- # itemsize = itemsize_loc.value
- # if itemsize == 2:
- # self.mc.PMULLW(loc0, loc1)
- # elif itemsize == 4:
- # self.mc.PMULLD(loc0, loc1)
- # else:
- # # NOTE see http://stackoverflow.com/questions/8866973/can-long-integer-routines-benefit-from-sse/8867025#8867025
- # # There is no 64x64 bit packed mul. For 8 bit either. It is questionable if it gives any benefit?
- # not_implemented("int8/64 mul")
-
- #def genop_vec_int_sub(self, op, arglocs, resloc):
- # loc0, loc1, size_loc = arglocs
- # size = size_loc.value
- # if size == 1:
- # self.mc.PSUBB(loc0, loc1)
- # elif size == 2:
- # self.mc.PSUBW(loc0, loc1)
- # elif size == 4:
- # self.mc.PSUBD(loc0, loc1)
- # elif size == 8:
- # self.mc.PSUBQ(loc0, loc1)
-
- #def genop_vec_int_and(self, op, arglocs, resloc):
- # self.mc.PAND(resloc, arglocs[0])
-
- #def genop_vec_int_or(self, op, arglocs, resloc):
- # self.mc.POR(resloc, arglocs[0])
-
- #def genop_vec_int_xor(self, op, arglocs, resloc):
- # self.mc.PXOR(resloc, arglocs[0])
-
- #def genop_vec_float_truediv(self, op, arglocs, resloc):
- # loc0, loc1, sizeloc = arglocs
- # size = sizeloc.value
- # if size == 4:
- # self.mc.DIVPS(loc0, loc1)
- # elif size == 8:
- # self.mc.DIVPD(loc0, loc1)
-
#def genop_vec_float_abs(self, op, arglocs, resloc):
# src, sizeloc = arglocs
# size = sizeloc.value
@@ -648,12 +630,17 @@
return [resloc, loc0, loc1, imm(size)]
prepare_vec_int_add = prepare_vec_arith
- #prepare_vec_int_sub = prepare_vec_arith
- #prepare_vec_int_mul = prepare_vec_arith
+ prepare_vec_int_sub = prepare_vec_arith
+ prepare_vec_int_mul = prepare_vec_arith
prepare_vec_float_add = prepare_vec_arith
prepare_vec_float_sub = prepare_vec_arith
prepare_vec_float_mul = prepare_vec_arith
prepare_vec_float_truediv = prepare_vec_arith
+
+ # logic functions
+ prepare_vec_int_and = prepare_vec_arith
+ prepare_vec_int_or = prepare_vec_arith
+ prepare_vec_int_xor = prepare_vec_arith
del prepare_vec_arith
def _prepare_vec_store(self, op):
@@ -691,13 +678,6 @@
#prepare_vec_float_abs = prepare_vec_arith_unary
#del prepare_vec_arith_unary
- #def prepare_vec_logic(self, op):
- # lhs = op.getarg(0)
- # assert isinstance(lhs, VectorOp)
- # args = op.getarglist()
- # source = self.make_sure_var_in_reg(op.getarg(1), args)
- # result = self.xrm.force_result_in_reg(op, op.getarg(0), args)
- # self.perform(op, [source, imm(lhs.bytesize)], result)
#def prepare_vec_float_eq(self, op):
# assert isinstance(op, VectorOp)
@@ -712,11 +692,6 @@
#prepare_vec_int_eq = prepare_vec_float_eq
#prepare_vec_int_ne = prepare_vec_float_eq
- #prepare_vec_int_and = prepare_vec_logic
- #prepare_vec_int_or = prepare_vec_logic
- #prepare_vec_int_xor = prepare_vec_logic
- #del prepare_vec_logic
-
#def prepare_vec_pack_i(self, op):
# # new_res = vec_pack_i(res, src, index, count)
# assert isinstance(op, VectorOp)
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
@@ -52,10 +52,11 @@
array = self.arrays.pop()
free_raw_storage(array)
- at pytest.fixture(scope='session')
+ at pytest.fixture(scope='function')
def rawstorage(request):
rs = RawStorage()
request.addfinalizer(rs.clear)
+ request.cls.a
return rs
integers_64bit = st.integers(min_value=-2**63, max_value=2**63-1)
@@ -70,7 +71,7 @@
return rfloat.NAN
return rfloat.copysign(rfloat.INFINITY, v1 * v2)
-class VectorizeTests:
+class VectorizeTests(object):
enable_opts = 'intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll'
def setup_method(self, method):
@@ -126,10 +127,20 @@
rawstorage.clear()
#@given(st.data())
- def test_vector_simple_int(self):
+ @pytest.mark.parametrize('func,type', [
+ (lambda a,b: intmask(a+b), rffi.SIGNED),
+ (lambda a,b: intmask(a+b), rffi.UNSIGNED),
+ (lambda a,b: intmask(a+b), rffi.INT),
+ (lambda a,b: intmask(a+b), rffi.UINT),
+ (lambda a,b: intmask(a+b), rffi.SHORT),
+ (lambda a,b: intmask(a+b), rffi.USHORT),
+ (lambda a,b: intmask(a+b), rffi.CHAR),
+ (lambda a,b: intmask(a+b), rffi.UCHAR),
+ ])
+ def test_vector_simple_int(self, func, type):
+ func = always_inline(func)
- type = rffi.SIGNED
- size = rffi.sizeof(rffi.SIGNED)
+ size = rffi.sizeof(type)
myjitdriver = JitDriver(greens = [], reds = 'auto', vectorize=True)
def f(bytecount, va, vb, vc):
i = 0
@@ -137,25 +148,25 @@
myjitdriver.jit_merge_point()
a = raw_storage_getitem(type,va,i)
b = raw_storage_getitem(type,vb,i)
- c = a+b
+ c = func(a,b)
raw_storage_setitem(vc, i, rffi.cast(type,c))
i += size
- rawstorage = RawStorage()
#la = data.draw(st.lists(integers_64bit, min_size=10, max_size=150))
la = [1] * 10
l = len(la)
#lb = data.draw(st.lists(integers_64bit, min_size=l, max_size=l))
lb = [0] * 10
- va = rawstorage.new(la, lltype.Signed)
- vb = rawstorage.new(lb, lltype.Signed)
- vc = rawstorage.new(None, lltype.Signed, size=l)
+ rawstorage = RawStorage()
+ va = rawstorage.new(la, type)
+ vb = rawstorage.new(lb, type)
+ vc = rawstorage.new(None, type, size=l)
self.meta_interp(f, [l*size, va, vb, vc])
for i in range(l):
c = raw_storage_getitem(type,vc,i*size)
- assert intmask(la[i] + lb[i]) == c
+ assert func(la[i], lb[i]) == c
rawstorage.clear()
More information about the pypy-commit
mailing list