comparison ppc/float_altivec.c @ 7674:e1876d3200ee libavcodec

Introduce float_to_int16_one_altivec
author lu_zero
date Sat, 23 Aug 2008 21:02:30 +0000
parents f7cbb7733146
children ad4bf45b9b63
comparison
equal deleted inserted replaced
7673:adcd246127eb 7674:e1876d3200ee
147 } 147 }
148 else 148 else
149 ff_vector_fmul_add_add_c(dst, src0, src1, src2, src3, len, step); 149 ff_vector_fmul_add_add_c(dst, src0, src1, src2, src3, len, step);
150 } 150 }
151 151
152
153 static vector signed short
154 float_to_int16_one_altivec(const float *src)
155 {
156 vector float s0 = vec_ld(0, src);
157 vector float s1 = vec_ld(16, src);
158 vector signed int t0 = vec_cts(s0, 0);
159 vector signed int t1 = vec_cts(s1, 0);
160 return vec_packs(t0,t1);
161 }
162
152 void float_to_int16_altivec(int16_t *dst, const float *src, int len) 163 void float_to_int16_altivec(int16_t *dst, const float *src, int len)
153 { 164 {
154 int i; 165 int i;
155 vector float s0, s1; 166 vector float s0, s1;
156 vector signed int t0, t1; 167 vector signed int t0, t1;
157 vector signed short d0, d1, d; 168 vector signed short d0, d1, d;
158 vector unsigned char align; 169 vector unsigned char align;
159 if(((long)dst)&15) //FIXME 170 if(((long)dst)&15) //FIXME
160 for(i=0; i<len-7; i+=8) { 171 for(i=0; i<len-7; i+=8) {
161 s0 = vec_ld(0, src+i);
162 s1 = vec_ld(16, src+i);
163 t0 = vec_cts(s0, 0);
164 d0 = vec_ld(0, dst+i); 172 d0 = vec_ld(0, dst+i);
165 t1 = vec_cts(s1, 0); 173 d = float_to_int16_one_altivec(src+i);
166 d1 = vec_ld(15, dst+i); 174 d1 = vec_ld(15, dst+i);
167 d = vec_packs(t0,t1);
168 d1 = vec_perm(d1, d0, vec_lvsl(0,dst+i)); 175 d1 = vec_perm(d1, d0, vec_lvsl(0,dst+i));
169 align = vec_lvsr(0, dst+i); 176 align = vec_lvsr(0, dst+i);
170 d0 = vec_perm(d1, d, align); 177 d0 = vec_perm(d1, d, align);
171 d1 = vec_perm(d, d1, align); 178 d1 = vec_perm(d, d1, align);
172 vec_st(d0, 0, dst+i); 179 vec_st(d0, 0, dst+i);
173 vec_st(d1,15, dst+i); 180 vec_st(d1,15, dst+i);
174 } 181 }
175 else 182 else
176 for(i=0; i<len-7; i+=8) { 183 for(i=0; i<len-7; i+=8) {
177 s0 = vec_ld(0, src+i); 184 d = float_to_int16_one_altivec(src+i);
178 s1 = vec_ld(16, src+i);
179 t0 = vec_cts(s0, 0);
180 t1 = vec_cts(s1, 0);
181 d = vec_packs(t0,t1);
182 vec_st(d, 0, dst+i); 185 vec_st(d, 0, dst+i);
183 } 186 }
184 } 187 }
185 188
186 void float_init_altivec(DSPContext* c, AVCodecContext *avctx) 189 void float_init_altivec(DSPContext* c, AVCodecContext *avctx)