Author: Richard Plangger <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit