Author: Richard Plangger <planri...@gmail.com>
Branch: ppc-vsx-support
Changeset: r86442:05e0d7bb3077
Date: 2016-08-23 12:15 +0200
http://bitbucket.org/pypy/pypy/changeset/05e0d7bb3077/

Log:    pass unpack several on ppc

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
@@ -513,6 +513,32 @@
                 self.mc.lbz(res, r.SP.value, off)
                 #self.mc.extsb(res, res)
                 return
+        else:
+            # count is not 1, but only 2 is supported for i32
+            # 4 for i16 and 8 for i8.
+            src = srcloc.value | 0b100000
+            res = resloc.value | 0b100000
+            residx = 0
+            #assert idx == 0 or idx == 8
+            if (size == 4 and count == 2) or \
+               (size == 2 and count == 4) or \
+               (size == 1 and count == 8):
+                if idx == 0:
+                    self.mc.xxpermdi(res, src, res, permi(0,1))
+                else:
+                    self.mc.xxpermdi(res, src, res, permi(1,1))
+                return
+
+            self.mc.load_imm(r.SCRATCH2, PARAM_SAVE_AREA_OFFSET)
+            self.mc.stvx(src, r.SCRATCH2.value, r.SP.value)
+            self.mc.load_imm(r.SCRATCH2, PARAM_SAVE_AREA_OFFSET+16)
+            self.mc.stvx(res, r.SCRATCH2.value, r.SP.value)
+            if count * size == 8:
+                off = PARAM_SAVE_AREA_OFFSET + idx * size
+                self.mc.load(r.SCRATCH.value, r.SP.value, off)
+                self.mc.store(r.SCRATCH.value, r.SP.value, 
PARAM_SAVE_AREA_OFFSET+16)
+                self.mc.lvx(res, r.SCRATCH2.value, r.SP.value)
+                return
 
         not_implemented("%d bit integer, count %d" % \
                        (size*8, count))
@@ -759,7 +785,10 @@
             # unpack
             srcloc = self.ensure_reg(arg0)
         size = arg.bytesize
-        resloc = self.force_allocate_reg(op)
+        if op.is_vector():
+            resloc = self.force_allocate_vector_reg(op)
+        else:
+            resloc = self.force_allocate_reg(op)
         return [resloc, srcloc, imm(index.value), imm(count.value), imm(size)]
 
     def expand_float(self, size, box):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to