[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