[pypy-commit] pypy release-pypy2.7-5.x: another big endian issue in the ppc vector backend

plan_rich pypy.commits at gmail.com
Tue Nov 8 13:53:25 EST 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: release-pypy2.7-5.x
Changeset: r88233:575021da212c
Date: 2016-11-08 19:32 +0100
http://bitbucket.org/pypy/pypy/changeset/575021da212c/

Log:	another big endian issue in the ppc vector backend

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
@@ -38,13 +38,10 @@
     # if v2 == 0 unpacks index 0 of param 2
     # if v2 == 1 unpacks index 1 of param 2
     mask = 0
-    if IS_BIG_ENDIAN:
-        not_implemented("no big endian support (yet)")
-    else:
-        if v1 == 0: mask |= 0b01
-        if v1 == 1: mask |= 0b00
-        if v2 == 0: mask |= 0b10
-        if v2 == 1: mask |= 0b00
+    if v1 == 0: mask |= 0b01
+    if v1 == 1: mask |= 0b00
+    if v2 == 0: mask |= 0b10
+    if v2 == 1: mask |= 0b00
     return mask
 
 
@@ -306,10 +303,7 @@
         acc = accumloc.value
         if arg.type == FLOAT:
             # r = (r[0]+r[1],r[0]+r[1])
-            if IS_BIG_ENDIAN:
-                self.mc.xxpermdi(tgt, acc, acc, 0b00)
-            else:
-                self.mc.xxpermdi(tgt, acc, acc, 0b10)
+            self.mc.xxpermdi(tgt, acc, acc, 0b10)
             if op == '+':
                 self.mc.xsadddp(tgt, tgt, acc)
             elif op == '*':
@@ -464,23 +458,26 @@
         res, l0, off = arglocs
         size = op.bytesize
 
+        idx = 0
+        size = op.bytesize
+        if not IS_BIG_ENDIAN:
+            idx = (16 // size) - 1 - idx
+        idx *= size
+        self._store_to_sp(l0.value, size, idx+PARAM_SAVE_AREA_OFFSET)
+        if size == 8:
+            idx = 1
+            if not IS_BIG_ENDIAN:
+                idx = (16 // size) - 1 - idx
+            idx *= size
+            self._store_to_sp(l0.value, size, idx+PARAM_SAVE_AREA_OFFSET)
         self.mc.load_imm(r.SCRATCH2, off.value)
         self.mc.lvx(res.value, r.SCRATCH2.value, r.SP.value)
         if size == 1:
-            if IS_BIG_ENDIAN:
-                self.mc.vspltb(res.value, res.value, 0b0000)
-            else:
-                self.mc.vspltb(res.value, res.value, 0b1111)
+            self.mc.vspltb(res.value, res.value, 0b0000)
         elif size == 2:
-            if IS_BIG_ENDIAN:
-                self.mc.vsplth(res.value, res.value, 0b000)
-            else:
-                self.mc.vsplth(res.value, res.value, 0b111)
+            self.mc.vsplth(res.value, res.value, 0b000)
         elif size == 4:
-            if IS_BIG_ENDIAN:
-                self.mc.vspltw(res.value, res.value, 0b00)
-            else:
-                self.mc.vspltw(res.value, res.value, 0b11)
+            self.mc.vspltw(res.value, res.value, 0b00)
         elif size == 8:
             pass
         else:
@@ -489,7 +486,6 @@
     def emit_vec_pack_i(self, op, arglocs, regalloc):
         assert isinstance(op, VectorOp)
         resultloc, vloc, sourceloc, residxloc, srcidxloc, countloc = arglocs
-        srcidx = srcidxloc.value
         residx = residxloc.value
         count = countloc.value
         res = resultloc.value
@@ -551,7 +547,7 @@
             self.mc.sth(res, r.SP.value, off)
             return True
         elif size == 1:
-            self.mc.stz(res, r.SP.value, off)
+            self.mc.stb(res, r.SP.value, off)
             return True
         return False
 
@@ -610,10 +606,8 @@
         vec = vloc.value
         res = resloc.value
         src = srcloc.value
-        count = countloc.value
         residx = residxloc.value
         srcidx = srcidxloc.value
-        size = op.bytesize
         # srcloc is always a floating point register f, this means it is
         # vsr[0] == valueof(f)
         if srcidx == 0:
@@ -883,10 +877,6 @@
             mc.load_imm(l0, arg.value)
         else:
             l0 = self.ensure_reg(arg)
-        mc.store(l0.value, r.SP.value, PARAM_SAVE_AREA_OFFSET)
-        size = op.bytesize
-        if size == 8:
-            mc.store(l0.value, r.SP.value, PARAM_SAVE_AREA_OFFSET+8)
         res = self.force_allocate_vector_reg(op)
         return [res, l0, imm(PARAM_SAVE_AREA_OFFSET)]
 


More information about the pypy-commit mailing list