[pypy-commit] pypy ppc-vsx-support: implement unpacking for integers 8, 16, 32 bits if count == 1

plan_rich pypy.commits at gmail.com
Tue Aug 23 05:28:04 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: ppc-vsx-support
Changeset: r86440:eccd7c7028fc
Date: 2016-08-23 11:27 +0200
http://bitbucket.org/pypy/pypy/changeset/eccd7c7028fc/

Log:	implement unpacking for integers 8,16,32 bits if count == 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
@@ -465,21 +465,25 @@
         vector = vloc.value
         src = sourceloc.value
         size = op.bytesize
+        assert resultloc.is_vector_reg() # vector <- reg
+        self.mc.load_imm(r.SCRATCH2, PARAM_SAVE_AREA_OFFSET)
+        self.mc.stvx(vector, r.SCRATCH2.value, r.SP.value)
         if size == 8:
-            if resultloc.is_vector_reg(): # vector <- reg
-                self.mc.load_imm(r.SCRATCH2, PARAM_SAVE_AREA_OFFSET)
-                self.mc.stvx(vector, r.SCRATCH2.value, r.SP.value)
-                idx = residx
-                self.mc.store(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+8*idx)
-                self.mc.lvx(res, r.SCRATCH2.value, r.SP.value)
-            else:
-                not_implemented("64 bit float")
+            idx = residx
+            self.mc.store(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+8*idx)
         elif size == 4:
-            not_implemented("vec_pack_i")
+            for j in range(count):
+                i = j + residx
+                self.mc.stw(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+4*i)
         elif size == 2:
-            not_implemented("vec_pack_i")
+            for j in range(count):
+                i = j + residx
+                self.mc.sth(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+2*i)
         elif size == 1:
-            not_implemented("vec_pack_i")
+            for j in range(count):
+                i = j + residx
+                self.mc.stb(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+i)
+        self.mc.lvx(res, r.SCRATCH2.value, r.SP.value)
 
     def emit_vec_unpack_i(self, op, arglocs, regalloc):
         assert isinstance(op, VectorOp)
@@ -507,7 +511,7 @@
                 return
             elif size == 1:
                 self.mc.lbz(res, r.SP.value, off)
-                self.mc.extsb(res, res)
+                #self.mc.extsb(res, res)
                 return
 
         not_implemented("%d bit integer, count %d" % \
@@ -715,7 +719,7 @@
         return [resloc, vloc, srcloc, imm(residx), imm(srcidx), imm(count.value)]
 
     def prepare_vec_pack_f(self, op):
-        # new_res = vec_pack_i(res, src, index, count)
+        # new_res = vec_pack_f(res, src, index, count)
         assert isinstance(op, VectorOp)
         arg = op.getarg(1)
         index = op.getarg(2)


More information about the pypy-commit mailing list