Author: Richard Plangger <planri...@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit