[pypy-commit] pypy zarch-simd-support: a nearly complete vector backend for s390x

plan_rich pypy.commits at gmail.com
Fri Sep 16 08:42:09 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: zarch-simd-support
Changeset: r87133:22a63dae82b3
Date: 2016-09-16 14:41 +0200
http://bitbucket.org/pypy/pypy/changeset/22a63dae82b3/

Log:	a nearly complete vector backend for s390x

diff --git a/rpython/jit/backend/zarch/vector_ext.py b/rpython/jit/backend/zarch/vector_ext.py
--- a/rpython/jit/backend/zarch/vector_ext.py
+++ b/rpython/jit/backend/zarch/vector_ext.py
@@ -62,19 +62,6 @@
     # TODO VEC_DOUBLE_WORD_ONES = 0
 
     def setup_once_vector(self):
-        # TODO if IS_BIG_ENDIAN:
-        # TODO     # 2x 64 bit signed integer(1) BE
-        # TODO     data = (b'\x00' * 7 + b'\x01') * 2
-        # TODO else:
-        # TODO     # 2x 64 bit signed integer(1) LE
-        # TODO     data = (b'\x01' + b'\x00' * 7) * 2
-        # TODO datablockwrapper = MachineDataBlockWrapper(self.cpu.asmmemmgr, [])
-        # TODO mem = datablockwrapper.malloc_aligned(len(data), alignment=16)
-        # TODO datablockwrapper.done()
-        # TODO addr = rffi.cast(rffi.CArrayPtr(lltype.Char), mem)
-        # TODO for i in range(len(data)):
-        # TODO     addr[i] = data[i]
-        # TODO self.VEC_DOUBLE_WORD_ONES = mem
         pass
 
     def emit_vec_load_f(self, op, arglocs, regalloc):
@@ -195,21 +182,12 @@
 
     def emit_vec_int_is_true(self, op, arglocs, regalloc):
         assert isinstance(op, VectorOp)
-        # TODO
         resloc, argloc, sizeloc = arglocs
         size = sizeloc.value
-        tmp = regalloc.vrm.get_scratch_reg(type=INT).value
-        self.mc.vxor(tmp, tmp, tmp)
-        # argloc[i] > 0:
-        # For an unsigned integer that is equivalent to argloc[i] != 0
-        if size == 1:
-            self.mc.vcmpgtubx(resloc.value, argloc.value, tmp)
-        elif size == 2:
-            self.mc.vcmpgtuhx(resloc.value, argloc.value, tmp)
-        elif size == 4:
-            self.mc.vcmpgtuwx(resloc.value, argloc.value, tmp)
-        elif size == 8:
-            self.mc.vcmpgtudx(resloc.value, argloc.value, tmp)
+        tmploc = regalloc.vrm.get_scratch_reg()
+        self.mc.VX(tmploc, tmploc, tmploc) # all zero
+        self.mc.VNO(tmploc, tmploc, tmploc) # all one
+        self.mc.VCEQ(resloc, argloc, tmploc, l.itemsize_to_mask(size), 0b0001)
         flush_vec_cc(self, regalloc, c.VNEI, op.bytesize, resloc)
 
     def emit_vec_float_eq(self, op, arglocs, regalloc):
@@ -596,8 +574,8 @@
     prepare_vec_cast_int_to_float = prepare_vec_cast_float_to_int
 
     def prepare_vec_guard_true(self, op):
-        self.assembler.guard_success_cc = c.VEQ
+        self.assembler.guard_success_cc = c.VEQI
         return self._prepare_guard(op)
 
     def prepare_vec_guard_false(self, op):
-        self.assembler.guard_success_cc = c.VNE
+        self.assembler.guard_success_cc = c.VNEI


More information about the pypy-commit mailing list