summaryrefslogtreecommitdiff
path: root/libavcodec/ppc
diff options
context:
space:
mode:
authorMans Rullgard <mans@mansr.com>2012-10-08 23:01:02 +0100
committerMans Rullgard <mans@mansr.com>2012-10-08 23:14:51 +0100
commitf79364b2c30aaaec9f0b1500a74da5a859c2ff37 (patch)
treed62b0d4830e7f90ae54efacd6af9b9a9bfa9c57c /libavcodec/ppc
parent643933f51d1cf0efedece07b058d46c87deb0b2d (diff)
ppc: fix Altivec build with old compilers
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>
Diffstat (limited to 'libavcodec/ppc')
-rw-r--r--libavcodec/ppc/fmtconvert_altivec.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/libavcodec/ppc/fmtconvert_altivec.c b/libavcodec/ppc/fmtconvert_altivec.c
index 129891ad9b..68e5e0079e 100644
--- a/libavcodec/ppc/fmtconvert_altivec.c
+++ b/libavcodec/ppc/fmtconvert_altivec.c
@@ -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);
}
}