[pypy-commit] pypy ppc-vsx-support: some byte ordering issue remains, fixed all other vector tests on ppc

plan_rich pypy.commits at gmail.com
Tue Aug 23 08:58:30 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: ppc-vsx-support
Changeset: r86444:b8fc16ac0662
Date: 2016-08-23 14:57 +0200
http://bitbucket.org/pypy/pypy/changeset/b8fc16ac0662/

Log:	some byte ordering issue remains, fixed all other vector tests 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
@@ -276,9 +276,9 @@
         if arg.type == FLOAT:
             # r = (r[0]+r[1],r[0]+r[1])
             if IS_BIG_ENDIAN:
-                self.mc.xxspltd(tgt, acc, acc, 0b00)
+                self.mc.xxpermdi(tgt, acc, acc, 0b00)
             else:
-                self.mc.xxspltd(tgt, acc, acc, 0b10)
+                self.mc.xxpermdi(tgt, acc, acc, 0b10)
             if op == '+':
                 self.mc.xsadddp(tgt, tgt, acc)
             elif op == '*':
@@ -468,21 +468,29 @@
         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)
+        idx = residx
         if size == 8:
-            idx = residx
+            if not IS_BIG_ENDIAN:
+                idx = (16 // size) - 1 - idx
             self.mc.store(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+8*idx)
         elif size == 4:
             for j in range(count):
-                i = j + residx
-                self.mc.stw(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+4*i)
+                idx = j + residx
+                if not IS_BIG_ENDIAN:
+                    idx = (16 // size) - 1 - idx
+                self.mc.stw(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+4*idx)
         elif size == 2:
             for j in range(count):
-                i = j + residx
-                self.mc.sth(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+2*i)
+                idx = j + residx
+                if not IS_BIG_ENDIAN:
+                    idx = (16 // size) - 1 - idx
+                self.mc.sth(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+2*idx)
         elif size == 1:
             for j in range(count):
-                i = j + residx
-                self.mc.stb(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+i)
+                idx = j + residx
+                if not IS_BIG_ENDIAN:
+                    idx = (16 // size) - 1 - idx
+                self.mc.stb(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+idx)
         self.mc.lvx(res, r.SCRATCH2.value, r.SP.value)
 
     def emit_vec_unpack_i(self, op, arglocs, regalloc):
@@ -499,7 +507,9 @@
             off = PARAM_SAVE_AREA_OFFSET
             self.mc.load_imm(r.SCRATCH2, off)
             self.mc.stvx(src, r.SCRATCH2.value, r.SP.value)
-            off = off + size * idx
+            if not IS_BIG_ENDIAN:
+                idx = (16 // size) - 1 - idx
+            off += size * idx
             if size == 8:
                 self.mc.load(res, r.SP.value, off)
                 return
@@ -511,32 +521,26 @@
                 return
             elif size == 1:
                 self.mc.lbz(res, r.SP.value, off)
-                #self.mc.extsb(res, res)
+                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
+            src = srcloc.value
+            res = resloc.value
 
             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:
+                stidx = 0
+                if not IS_BIG_ENDIAN:
+                    idx = (16 // size) - 1 - idx
+                    stidx = 0
                 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.store(r.SCRATCH.value, r.SP.value, PARAM_SAVE_AREA_OFFSET+16+stidx)
                 self.mc.lvx(res, r.SCRATCH2.value, r.SP.value)
                 return
 
diff --git a/rpython/jit/metainterp/test/test_vector.py b/rpython/jit/metainterp/test/test_vector.py
--- a/rpython/jit/metainterp/test/test_vector.py
+++ b/rpython/jit/metainterp/test/test_vector.py
@@ -831,21 +831,21 @@
         for i,v in enumerate(values):
             j = (i // 2) * 2
             op = ["v{v}[2xi32] = vec_unpack_i({x}, %d, 2)" % j,
-                  "i{i} = vec_unpack_i(v{v}[2xi32], %d, 1)" % i]
+                  "i{i} = vec_unpack_i(v{v}[2xi32], %d, 1)" % (i % 2)]
             assert self.run_unpack(op, "[4xi32]", {'x': values}, float=False) == v
 
         values = [1,2,3,4,5,6,7,8]
         for i,v in enumerate(values):
             j = (i // 4) * 4
             op = ["v{v}[4xi16] = vec_unpack_i({x}, %d, 4)" % j,
-                  "i{i} = vec_unpack_i(v{v}[4xi16], %d, 1)" % i]
+                  "i{i} = vec_unpack_i(v{v}[4xi16], %d, 1)" % (i % 4)]
             assert self.run_unpack(op, "[8xi16]", {'x': values}, float=False) == v
 
         values = [1,2,3,4,5,6,7,8] * 2
         for i,v in enumerate(values):
             j = (i // 8) * 8
             op = ["v{v}[8xi8] = vec_unpack_i({x}, %d, 8)" % j,
-                  "i{i} = vec_unpack_i(v{v}[8xi8], %d, 1)" % i]
+                  "i{i} = vec_unpack_i(v{v}[8xi8], %d, 1)" % (i % 8)]
             assert self.run_unpack(op, "[16xi8]", {'x': values}, float=False) == v
 
 


More information about the pypy-commit mailing list