[pypy-commit] pypy default: apply the same fix to ppc

plan_rich pypy.commits at gmail.com
Fri Nov 4 16:38:31 EDT 2016


Author: Richard Plangger <planrichi at gmail.com>
Branch: 
Changeset: r88142:eeebf588aa7e
Date: 2016-11-04 21:30 +0100
http://bitbucket.org/pypy/pypy/changeset/eeebf588aa7e/

Log:	apply the same fix to 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
@@ -12,7 +12,6 @@
 from rpython.rtyper.lltypesystem import lltype
 from rpython.jit.backend.ppc.locations import imm, RegisterLocation
 from rpython.jit.backend.ppc.arch import IS_BIG_ENDIAN
-from rpython.jit.backend.llsupport.vector_ext import VectorExt
 from rpython.jit.backend.ppc.arch import PARAM_SAVE_AREA_OFFSET, WORD
 import rpython.jit.backend.ppc.register as r
 import rpython.jit.backend.ppc.condition as c
@@ -22,6 +21,8 @@
 from rpython.jit.codewriter import longlong
 from rpython.jit.backend.ppc.detect_feature import detect_vsx
 from rpython.rlib.objectmodel import always_inline
+from rpython.jit.backend.llsupport.vector_ext import (VectorExt,
+        OpRestrict, TR_INT64_2)
 
 def not_implemented(msg):
     msg = '[ppc/vector_ext] %s\n' % msg
@@ -89,6 +90,7 @@
             self.enable(16, accum=True)
             asm.setup_once_vector()
         self._setup = True
+AltiVectorExt.TR_MAPPING[rop.VEC_CAST_INT_TO_FLOAT] = OpRestrict([TR_INT64_2])
 
 class VectorAssembler(object):
     _mixin_ = True
@@ -201,8 +203,7 @@
             self.mc.xvdivdp(resloc.value, loc0.value, loc1.value)
 
     def emit_vec_int_mul(self, op, arglocs, regalloc):
-        raise NotImplementedError
-        pass # TODO
+        not_implemented("vec_int_mul must never be emitted by the backend")
 
     def emit_vec_int_and(self, op, arglocs, regalloc):
         resloc, loc0, loc1, sizeloc = arglocs
@@ -217,9 +218,42 @@
         self.mc.vxor(resloc.value, loc0.value, loc1.value)
 
     def emit_vec_int_signext(self, op, arglocs, regalloc):
-        resloc, loc0 = arglocs
-        # TODO
-        self.regalloc_mov(loc0, resloc)
+        resloc, loc0, osizeloc, nsizeloc = arglocs
+        # signext is only allowed if the data type sizes do not change.
+        # e.g. [byte,byte] = sign_ext([byte, byte]), a simple move is sufficient!
+        src = loc0.value
+        res = resloc.value
+        osize = osizeloc.value
+        nsize = nsizeloc.value
+        if osize == nsize:
+            self.regalloc_mov(loc0, resloc)
+        else:
+            assert (osize == 4 and nsize == 8) or (osize == 8 and nsize == 4)
+            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)
+            for i in range(2): # at most 2 operations
+                if IS_BIG_ENDIAN:
+                    srcoff = (i * osize)
+                    resoff = (i * nsize)
+                else:
+                    if osize == 4:
+                        srcoff = 8 + (i * osize)
+                        resoff = (i * nsize)
+                    else:
+                        srcoff = (i * osize)
+                        resoff = 8 + (i * nsize)
+                if osize == 8:
+                    self.mc.load(r.SCRATCH.value, r.SP.value, srcoff + PARAM_SAVE_AREA_OFFSET)
+                else:
+                    self.mc.lwa(r.SCRATCH.value, r.SP.value, srcoff + PARAM_SAVE_AREA_OFFSET)
+                if nsize == 8:
+                    self.mc.store(r.SCRATCH.value, r.SP.value, resoff + PARAM_SAVE_AREA_OFFSET+16)
+                else:
+                    self.mc.stw(r.SCRATCH.value, r.SP.value, resoff + PARAM_SAVE_AREA_OFFSET+16)
+
+            self.mc.lvx(res, r.SCRATCH2.value, r.SP.value)
 
     def emit_vec_float_abs(self, op, arglocs, regalloc):
         resloc, argloc, sizeloc = arglocs
@@ -724,9 +758,10 @@
     def prepare_vec_int_signext(self, op):
         assert isinstance(op, VectorOp)
         a0 = op.getarg(0)
+        assert isinstance(a0, VectorOp)
         loc0 = self.ensure_vector_reg(a0)
         resloc = self.force_allocate_vector_reg(op)
-        return [resloc, loc0]
+        return [resloc, loc0, imm(a0.bytesize), imm(op.bytesize)]
 
     def prepare_vec_arith_unary(self, op):
         assert isinstance(op, VectorOp)


More information about the pypy-commit mailing list