Mercurial > libavcodec.hg
comparison ppc/float_altivec.c @ 7675:ad4bf45b9b63 libavcodec
Introduce float_to_int16_interleave_altivec, tested with vorbis
| author | lu_zero |
|---|---|
| date | Sat, 23 Aug 2008 21:09:46 +0000 |
| parents | e1876d3200ee |
| children | d1ec9f6c0be1 |
comparison
equal
deleted
inserted
replaced
| 7674:e1876d3200ee | 7675:ad4bf45b9b63 |
|---|---|
| 184 d = float_to_int16_one_altivec(src+i); | 184 d = float_to_int16_one_altivec(src+i); |
| 185 vec_st(d, 0, dst+i); | 185 vec_st(d, 0, dst+i); |
| 186 } | 186 } |
| 187 } | 187 } |
| 188 | 188 |
| 189 static void | |
| 190 float_to_int16_interleave_altivec(int16_t *dst, const float **src, | |
| 191 long len, int channels) | |
| 192 { | |
| 193 int i; | |
| 194 vector signed short d0, d1, d2, c0, c1, t0, t1; | |
| 195 vector unsigned char align; | |
| 196 if(channels == 1) | |
| 197 float_to_int16_altivec(dst, src[0], len); | |
| 198 else | |
| 199 if (channels == 2) { | |
| 200 if(((long)dst)&15) | |
| 201 for(i=0; i<len-7; i+=8) { | |
| 202 d0 = vec_ld(0, dst + i); | |
| 203 t0 = float_to_int16_one_altivec(src[0] + i); | |
| 204 d1 = vec_ld(31, dst + i); | |
| 205 t1 = float_to_int16_one_altivec(src[1] + i); | |
| 206 c0 = vec_mergeh(t0, t1); | |
| 207 c1 = vec_mergel(t0, t1); | |
| 208 d2 = vec_perm(d1, d0, vec_lvsl(0, dst + i)); | |
| 209 align = vec_lvsr(0, dst + i); | |
| 210 d0 = vec_perm(d2, c0, align); | |
| 211 d1 = vec_perm(c0, c1, align); | |
| 212 vec_st(d0, 0, dst + i); | |
| 213 d0 = vec_perm(c1, d2, align); | |
| 214 vec_st(d1, 15, dst + i); | |
| 215 vec_st(d0, 31, dst + i); | |
| 216 dst+=8; | |
| 217 } | |
| 218 else | |
| 219 for(i=0; i<len-7; i+=8) { | |
| 220 t0 = float_to_int16_one_altivec(src[0] + i); | |
| 221 t1 = float_to_int16_one_altivec(src[1] + i); | |
| 222 d0 = vec_mergeh(t0, t1); | |
| 223 d1 = vec_mergel(t0, t1); | |
| 224 vec_st(d0, 0, dst + i); | |
| 225 vec_st(d1, 16, dst + i); | |
| 226 dst+=8; | |
| 227 } | |
| 228 } else { | |
| 229 DECLARE_ALIGNED(16, int16_t, tmp[len]); | |
| 230 int c, j; | |
| 231 for (c = 0; c < channels; c++) { | |
| 232 float_to_int16_altivec(tmp, src[c], len); | |
| 233 for (i = 0, j = c; i < len; i++, j+=channels) { | |
| 234 dst[j] = tmp[i]; | |
| 235 } | |
| 236 } | |
| 237 } | |
| 238 } | |
| 239 | |
| 189 void float_init_altivec(DSPContext* c, AVCodecContext *avctx) | 240 void float_init_altivec(DSPContext* c, AVCodecContext *avctx) |
| 190 { | 241 { |
| 191 c->vector_fmul = vector_fmul_altivec; | 242 c->vector_fmul = vector_fmul_altivec; |
| 192 c->vector_fmul_reverse = vector_fmul_reverse_altivec; | 243 c->vector_fmul_reverse = vector_fmul_reverse_altivec; |
| 193 c->vector_fmul_add_add = vector_fmul_add_add_altivec; | 244 c->vector_fmul_add_add = vector_fmul_add_add_altivec; |
| 194 if(!(avctx->flags & CODEC_FLAG_BITEXACT)) | 245 if(!(avctx->flags & CODEC_FLAG_BITEXACT)) { |
| 195 c->float_to_int16 = float_to_int16_altivec; | 246 c->float_to_int16 = float_to_int16_altivec; |
| 196 } | 247 c->float_to_int16_interleave = float_to_int16_interleave_altivec; |
| 248 } | |
| 249 } |
