[pypy-commit] pypy vecopt: finished impl of float_ne with guards
plan_rich
noreply at buildbot.pypy.org
Wed Jul 29 13:00:55 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r78706:924ff20716c0
Date: 2015-07-29 13:00 +0200
http://bitbucket.org/pypy/pypy/changeset/924ff20716c0/
Log: finished impl of float_ne with guards
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
@@ -197,9 +197,10 @@
guard_opnum = guard_op.getopnum()
if guard_opnum == rop.GUARD_TRUE:
self._guard_vector_true(op, arglocs[0])
+ self.implement_guard(guard_token, 'NZ')
else:
self._guard_vector_false(op, arglocs[0])
- self.implement_guard(guard_token, 'NZ')
+ self.implement_guard(guard_token, 'NZ')
def genop_vec_int_mul(self, op, arglocs, resloc):
loc0, loc1, itemsize_loc = arglocs
@@ -289,16 +290,6 @@
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
@@ -307,16 +298,6 @@
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
@@ -326,6 +307,28 @@
else:
self.mc.CMPPD_xxi(resloc.value, rhsloc.value, 1 << 2)
+ def gen_float_cmp(func):
+ def genop_float_cmp(self, op, guard_op, guard_token, arglocs, resloc):
+ lhsloc, rhsloc, sizeloc = arglocs
+ size = sizeloc.value
+ func(self, op, arglocs, lhsloc) # yields one bits if they are equal
+ guard_opnum = guard_op.getopnum()
+ if guard_opnum == rop.GUARD_TRUE:
+ temp = X86_64_XMM_SCRATCH_REG
+ self.mc.PXOR(temp, temp) # set all to zero
+ self.mc.PCMPEQ(lhsloc, temp, size)
+ self.mc.PCMPEQQ(temp, temp) # set all bits to 1
+ self.mc.PTEST(lhsloc, temp)
+ self.implement_guard(guard_token, 'NZ')
+ else:
+ self.mc.PTEST(lhsloc, lhsloc)
+ self.implement_guard(guard_token, 'NZ')
+ return genop_float_cmp
+
+ genop_guard_vec_float_eq = gen_float_cmp(genop_vec_float_eq)
+ genop_guard_vec_float_ne = gen_float_cmp(genop_vec_float_ne)
+ del gen_float_cmp
+
def genop_vec_int_signext(self, op, arglocs, resloc):
srcloc, sizeloc, tosizeloc = arglocs
size = sizeloc.value
More information about the pypy-commit
mailing list