[pypy-commit] pypy ppc-vsx-support: implement more unpack_i combinations, conversion function float -> int

plan_rich pypy.commits at gmail.com
Tue Jul 5 09:43:00 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: ppc-vsx-support
Changeset: r85561:e9942271f923
Date: 2016-07-05 15:42 +0200
http://bitbucket.org/pypy/pypy/changeset/e9942271f923/

Log:	implement more unpack_i combinations, conversion function float ->
	int

diff --git a/rpython/jit/backend/ppc/codebuilder.py b/rpython/jit/backend/ppc/codebuilder.py
--- a/rpython/jit/backend/ppc/codebuilder.py
+++ b/rpython/jit/backend/ppc/codebuilder.py
@@ -635,6 +635,7 @@
 
     # conversion from/to
     xvcvsxddp = XX2(60, XO6=504)
+    xvcvdpsxds = XX2(60, XO6=472)
 
     # compare greater than unsigned int
     vcmpgtubx = VC(4, XO12=518, OE=1)
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
@@ -545,14 +545,27 @@
         res = resloc.value
         src = srcloc.value
         size = op.bytesize
-        if size == 8:
-            if srcloc.is_vector_reg(): # reg <- vector
-                assert not resloc.is_vector_reg()
-                self.mc.load_imm(r.SCRATCH2, PARAM_SAVE_AREA_OFFSET)
-                self.mc.stvx(src, r.SCRATCH2.value, r.SP.value)
-                self.mc.load(res, r.SP.value, PARAM_SAVE_AREA_OFFSET+8*idx)
-            else:
-                notimplemented("[ppc/vec_unpack_i] 64 bit integer")
+        count = countloc.value
+        if count == 1:
+            assert srcloc.is_vector_reg()
+            assert not resloc.is_vector_reg()
+            off = PARAM_SAVE_AREA_OFFSET
+            self.mc.load_imm(r.SCRATCH2, off)
+            off = off + size*idx
+            self.mc.stvx(src, r.SCRATCH2.value, r.SP.value)
+            if size == 8:
+                self.mc.load(res, r.SP.value, off+size*idx)
+            elif size == 4:
+                self.mc.lwa(res, r.SP.value, off)
+            elif size == 2:
+                self.mc.lha(res, r.SP.value, off)
+            elif size == 1:
+                self.mc.lbz(res, r.SP.value, off)
+                self.mc.extsb(res, res)
+            return
+
+        notimplemented("[ppc/vec_unpack_i] %d bit integer, count %d" % \
+                       (size*8, count))
 
     def emit_vec_pack_f(self, op, arglocs, regalloc):
         resloc, vloc, srcloc, residxloc, srcidxloc, countloc = arglocs
@@ -600,9 +613,18 @@
         resloc, srcloc, idxloc, countloc = arglocs
         self.emit_vec_pack_f(op, [resloc, srcloc, srcloc, imm(0), idxloc, countloc], regalloc)
 
+    def emit_vec_cast_float_to_int(self, op, arglocs, regalloc):
+        res, l0 = arglocs
+        offloc = regalloc.rm.get_scratch_reg()
+        v0 = regalloc.vrm.get_scratch_reg()
+        off = offloc.value
+        # SP is always 16 byte aligned, and PARAM_SAVE_AREA_OFFSET % 16 == 0
+        self.mc.load_imm(offloc, PARAM_SAVE_AREA_OFFSET)
+        self.mc.xvcvdpsxds(v0.value, l0.value)
+        self.mc.stxvd2x(v0.value, off, r.SP.value)
+        self.mc.lvx(res.value, off, r.SP.value)
+
     # needed as soon as PPC's support_singlefloat is implemented!
-    #def genop_vec_cast_float_to_int(self, op, arglocs, regalloc):
-    #    self.mc.CVTPD2DQ(resloc, arglocs[0])
     #def genop_vec_cast_singlefloat_to_float(self, op, arglocs, regalloc):
     #    self.mc.CVTPS2PD(resloc, arglocs[0])
 


More information about the pypy-commit mailing list