[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