Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r78703:4fead7c7623f
Date: 2015-07-29 11:46 +0200
http://bitbucket.org/pypy/pypy/changeset/4fead7c7623f/
Log: bool(0.1) return True, in the jit bool(0.1) transforms to
cast_float_to_int which is wrong, updated the jtransform.py to emit
float_is_true instead (similar to the issue with cast int -> bool
added implementation for both float_ne, float_eq as vector
operations
diff --git a/pypy/module/micronumpy/test/test_compile.py
b/pypy/module/micronumpy/test/test_compile.py
--- a/pypy/module/micronumpy/test/test_compile.py
+++ b/pypy/module/micronumpy/test/test_compile.py
@@ -272,6 +272,14 @@
""")
assert interp.results[0].value == 3
+ def test_any(self):
+ interp = self.run("""
+ a = [0,0,0,0,0.1,0,0,0,0]
+ b = any(a)
+ b -> 0
+ """)
+ assert interp.results[0].value == 1
+
def test_where(self):
interp = self.run('''
a = [1, 0, 3, 0]
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
@@ -580,7 +580,7 @@
def define_float_any():
return """
- a = [0,0,0,0,0,0,0,0.9,0,0,0]
+ a = [0,0,0,0,0,0,0,0.1,0,0,0]
any(a)
"""
diff --git a/rpython/jit/backend/x86/rx86.py b/rpython/jit/backend/x86/rx86.py
--- a/rpython/jit/backend/x86/rx86.py
+++ b/rpython/jit/backend/x86/rx86.py
@@ -768,6 +768,8 @@
PTEST_xx = xmminsn('\x66', rex_nw, '\x0F\x38\x17', register(1,8),
register(2), '\xC0')
PBLENDW_xxi = xmminsn('\x66', rex_nw, '\x0F\x3A\x0E', register(1,8),
register(2), '\xC0', immediate(3, 'b'))
+ CMPPD_xxi = xmminsn('\x66', rex_nw, '\x0F\xC2', register(1,8),
register(2), '\xC0', immediate(3, 'b'))
+ CMPPS_xxi = xmminsn( rex_nw, '\x0F\xC2', register(1,8),
register(2), '\xC0', immediate(3, 'b'))
# ------------------------------------------------------------
diff --git a/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
b/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
--- a/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
+++ b/rpython/jit/backend/x86/test/test_rx86_32_auto_encoding.py
@@ -389,7 +389,8 @@
instrname.find('EXTRACT') != -1 or \
instrname.find('SRLDQ') != -1 or \
instrname.find('SHUF') != -1 or \
- instrname.find('PBLEND') != -1:
+ instrname.find('PBLEND') != -1 or \
+ instrname.find('CMPP') != -1:
realargmodes = []
for mode in argmodes:
if mode == 'i':
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
@@ -289,6 +289,43 @@
elif size == 8:
self.mc.XORPD(src, heap(self.float_const_neg_addr))
+ def genop_guard_vec_float_eq(self, op, guard_op, guard_token, arglocs,
resloc):
+ lhsloc, rhsloc, sizeloc = arglocs
+ self.genop_vec_float_eq(op, arglocs, lhsloc) # yields one bits if they
are equal
+ self.mc.PTEST(lhsloc, lhsloc)
+ guard_opnum = guard_op.getopnum()
+ if guard_opnum == rop.GUARD_TRUE:
+ self.implement_guard(guard_token, 'NZ')
+ else:
+ self.implement_guard(guard_token, 'Z')
+
+ def genop_vec_float_eq(self, op, arglocs, resloc):
+ _, rhsloc, sizeloc = arglocs
+ size = sizeloc.value
+ if size == 4:
+ self.mc.CMPPS_xxi(resloc.value, rhsloc.value, 0) # 0 means equal
+ else:
+ self.mc.CMPPD_xxi(resloc.value, rhsloc.value, 0)
+
+ def genop_guard_vec_float_ne(self, op, guard_op, guard_token, arglocs,
resloc):
+ lhsloc, rhsloc, sizeloc = arglocs
+ self.genop_vec_float_ne(op, arglocs, lhsloc) # yields one bits if they
are equal
+ self.mc.PTEST(lhsloc, lhsloc)
+ guard_opnum = guard_op.getopnum()
+ if guard_opnum == rop.GUARD_TRUE:
+ self.implement_guard(guard_token, 'NZ')
+ else:
+ self.implement_guard(guard_token, 'Z')
+
+ def genop_vec_float_ne(self, op, arglocs, resloc):
+ _, rhsloc, sizeloc = arglocs
+ size = sizeloc.value
+ # b(100) == 1 << 2 means not equal
+ if size == 4:
+ self.mc.CMPPS_xxi(resloc.value, rhsloc.value, 1 << 2)
+ else:
+ self.mc.CMPPD_xxi(resloc.value, rhsloc.value, 1 << 2)
+
def genop_vec_int_signext(self, op, arglocs, resloc):
srcloc, sizeloc, tosizeloc = arglocs
size = sizeloc.value
@@ -556,7 +593,20 @@
result = self.xrm.force_result_in_reg(op.result, op.getarg(0), args)
self.perform(op, [source, imm(size)], result)
- consider_vec_float_eq = consider_vec_logic
+ 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.result, 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)
+ else:
+ self.perform(op, [lhsloc, rhsloc, imm(size)], lhsloc)
+
+ consider_vec_float_ne = consider_vec_float_eq
+
consider_vec_int_and = consider_vec_logic
consider_vec_int_or = consider_vec_logic
consider_vec_int_xor = consider_vec_logic
diff --git a/rpython/jit/codewriter/jtransform.py
b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -1178,7 +1178,12 @@
else:
v1 = v_arg
sizesign = rffi.size_and_sign(v_result.concretetype)
- if sizesign <= rffi.size_and_sign(lltype.Signed):
+ if v_result.concretetype is lltype.Bool:
+ op = self.rewrite_operation(
+ SpaceOperation('float_is_true', [v1], v_result)
+ )
+ ops.append(op)
+ elif sizesign <= rffi.size_and_sign(lltype.Signed):
# cast to a type that fits in an int: either the size is
# smaller, or it is equal and it is not unsigned
v2 = varoftype(lltype.Signed)
diff --git a/rpython/jit/codewriter/test/test_flatten.py
b/rpython/jit/codewriter/test/test_flatten.py
--- a/rpython/jit/codewriter/test/test_flatten.py
+++ b/rpython/jit/codewriter/test/test_flatten.py
@@ -858,6 +858,12 @@
cast_int_to_float %i0 -> %f0
float_return %f0
""", transform=True)
+ def f(n):
+ return rffi.cast(lltype.Bool, n)
+ self.encoding_test(f, [0.1], """
+ float_ne %f0, $0.0 -> %i0
+ int_return %i0
+ """, transform=True)
# Casts to lltype.SingleFloat
def g(n):
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
@@ -750,6 +750,7 @@
rop.VEC_FLOAT_ABS: FLOAT_SINGLE_ARG_OP_TO_VOP,
rop.VEC_FLOAT_NEG: FLOAT_SINGLE_ARG_OP_TO_VOP,
rop.VEC_FLOAT_EQ: OpToVectorOp((PT_FLOAT_GENERIC,PT_FLOAT_GENERIC),
INT_RES),
+ rop.VEC_FLOAT_NE: OpToVectorOp((PT_FLOAT_GENERIC,PT_FLOAT_GENERIC),
INT_RES),
rop.VEC_INT_IS_TRUE: OpToVectorOp((PT_INT_GENERIC,PT_INT_GENERIC),
PT_INT_GENERIC),
rop.VEC_RAW_LOAD: LOAD_TRANS,
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
@@ -496,7 +496,8 @@
'VEC_FLOAT_NEG/1',
'VEC_FLOAT_ABS/1',
'_VEC_ARITHMETIC_LAST',
- 'VEC_FLOAT_EQ/2',
+ 'VEC_FLOAT_EQ/2b',
+ 'VEC_FLOAT_NE/2b',
'VEC_INT_IS_TRUE/1b',
'_VEC_CAST_FIRST',
@@ -806,6 +807,7 @@
rop.FLOAT_ABS: rop.VEC_FLOAT_ABS,
rop.FLOAT_NEG: rop.VEC_FLOAT_NEG,
rop.FLOAT_EQ: rop.VEC_FLOAT_EQ,
+ rop.FLOAT_NE: rop.VEC_FLOAT_NE,
rop.INT_IS_TRUE: rop.VEC_INT_IS_TRUE,
# casts
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit