ppc: fix Altivec build with old compilers
authorMans Rullgard <mans@mansr.com>
Mon, 8 Oct 2012 22:01:02 +0000 (23:01 +0100)
committerMans Rullgard <mans@mansr.com>
Mon, 8 Oct 2012 22:14:51 +0000 (23:14 +0100)
The vec_splat() intrinsic requires a constant argument for the
element number, and the code relies on the compiler unrolling
the loop to provide this.  Manually unrolling the loop avoids
this reliance and works with all compilers.

Signed-off-by: Mans Rullgard <mans@mansr.com>
libavcodec/ppc/fmtconvert_altivec.c

index 129891ad9b54792c2ba2adb3ad8a7353f0bf48f2..68e5e0079e8a9350c50c0a5e0adb273f38197c0a 100644 (file)
@@ -83,6 +83,12 @@ static void float_to_int16_altivec(int16_t *dst, const float *src, long len)
     }
 }
 
+#define VSTE_INC(dst, v, elem, inc) do {                \
+        vector signed short s = vec_splat(v, elem);     \
+        vec_ste(s, 0, dst);                             \
+        dst += inc;                                     \
+    } while (0)
+
 static void float_to_int16_stride_altivec(int16_t *dst, const float *src,
                                           long len, int stride)
 {
@@ -91,11 +97,14 @@ static void float_to_int16_stride_altivec(int16_t *dst, const float *src,
 
     for (i = 0; i < len - 7; i += 8) {
         d = float_to_int16_one_altivec(src + i);
-        for (j = 0; j < 8; j++) {
-            s = vec_splat(d, j);
-            vec_ste(s, 0, dst);
-            dst += stride;
-        }
+        VSTE_INC(dst, d, 0, stride);
+        VSTE_INC(dst, d, 1, stride);
+        VSTE_INC(dst, d, 2, stride);
+        VSTE_INC(dst, d, 3, stride);
+        VSTE_INC(dst, d, 4, stride);
+        VSTE_INC(dst, d, 5, stride);
+        VSTE_INC(dst, d, 6, stride);
+        VSTE_INC(dst, d, 7, stride);
     }
 }