98 const uint8_t *
src, ptrdiff_t src_stride,
99 int h,
int mx,
int w,
int is6tap)
103 vec_u8 align_vec0, align_vec8, permh0, permh8;
104 vec_u8 perm_6tap0, perm_6tap8, perml0, perml8;
111 vec_u8 perm_inner6 = { 1,2,3,4, 2,3,4,5, 3,4,5,6, 4,5,6,7 };
112 vec_u8 perm_inner4 = { 0,1,2,3, 1,2,3,4, 2,3,4,5, 3,4,5,6 };
113 vec_u8 perm_inner = is6tap ? perm_inner6 : perm_inner4;
114 vec_u8 perm_outer = { 4,9, 0,5, 5,10, 1,6, 6,11, 2,7, 7,12, 3,8 };
115 vec_s32 c64 = vec_sl(vec_splat_s32(1), vec_splat_u32(6));
119 align_vec0 = vec_lvsl( -is6tap-1,
src);
120 align_vec8 = vec_lvsl(8-is6tap-1,
src);
122 permh0 = vec_perm(align_vec0, align_vec0, perm_inner);
123 permh8 = vec_perm(align_vec8, align_vec8, perm_inner);
124 perm_inner = vec_add(perm_inner, vec_splat_u8(4));
125 perml0 = vec_perm(align_vec0, align_vec0, perm_inner);
126 perml8 = vec_perm(align_vec8, align_vec8, perm_inner);
127 perm_6tap0 = vec_perm(align_vec0, align_vec0, perm_outer);
128 perm_6tap8 = vec_perm(align_vec8, align_vec8, perm_outer);
136 filt = vec_packsu(f16h, f16l);
139 filt = vec_packsu(f16h, f16h);
152 { 0, 6, 123, 12, 1, 0 },
153 { 2, 11, 108, 36, 8, 1 },
154 { 0, 9, 93, 50, 6, 0 },
155 { 3, 16, 77, 77, 16, 3 },
156 { 0, 6, 50, 93, 9, 0 },
157 { 1, 8, 36, 108, 11, 2 },
158 { 0, 1, 12, 123, 6, 0 },
195 const uint8_t *
src, ptrdiff_t src_stride,
196 int h,
int my,
int w,
int is6tap)
199 vec_u8 s0, s1, s2, s3, s4, s5,
filt, align_vech, perm_vec, align_vecl;
200 vec_s16 s0f, s1f, s2f, s3f, s4f, s5f, f16h, f16l;
201 vec_s16 c64 = vec_sl(vec_splat_s16(1), vec_splat_u16(6));
207 align_vech = vec_lvsl(0,
src);
208 align_vecl = vec_sld(align_vech, align_vech, 8);
210 perm_vec = vec_mergeh(align_vech, align_vecl);
212 perm_vec = vec_mergeh(align_vech, align_vech);
223 src += (2+is6tap)*src_stride;
235 filt = vec_packsu(f16h, f16l);
238 filt = vec_packsu(f16h, f16h);
303 register vector
unsigned char perm;
305 register ptrdiff_t dstride2 = dstride << 1, sstride2 = sstride << 1;
306 register ptrdiff_t dstride3 = dstride2 + dstride, sstride3 = sstride + sstride2;
307 register ptrdiff_t dstride4 = dstride << 2, sstride4 = sstride << 2;
317 for (
i = 0;
i <
h;
i += 4) {
318 unaligned_store(load_with_perm_vec(0,
src,
perm),
dst);
319 unaligned_store(load_with_perm_vec(sstride,
src,
perm),
dst + dstride);
320 unaligned_store(load_with_perm_vec(sstride2,
src,
perm),
dst + dstride2);
321 unaligned_store(load_with_perm_vec(sstride3,
src,
perm),
dst + dstride3);
330 c->put_vp8_epel_pixels_tab[0][0][2] = put_vp8_epel16_h6_altivec;
331 c->put_vp8_epel_pixels_tab[0][2][0] = put_vp8_epel16_v6_altivec;
332 c->put_vp8_epel_pixels_tab[0][2][2] = put_vp8_epel16_h6v6_altivec;
334 c->put_vp8_epel_pixels_tab[1][0][2] = put_vp8_epel8_h6_altivec;
335 c->put_vp8_epel_pixels_tab[1][2][0] = put_vp8_epel8_v6_altivec;
336 c->put_vp8_epel_pixels_tab[1][0][1] = put_vp8_epel8_h4_altivec;
337 c->put_vp8_epel_pixels_tab[1][1][0] = put_vp8_epel8_v4_altivec;
339 c->put_vp8_epel_pixels_tab[1][2][2] = put_vp8_epel8_h6v6_altivec;
340 c->put_vp8_epel_pixels_tab[1][1][1] = put_vp8_epel8_h4v4_altivec;
341 c->put_vp8_epel_pixels_tab[1][1][2] = put_vp8_epel8_h6v4_altivec;
342 c->put_vp8_epel_pixels_tab[1][2][1] = put_vp8_epel8_h4v6_altivec;
344 c->put_vp8_epel_pixels_tab[2][0][2] = put_vp8_epel4_h6_altivec;
345 c->put_vp8_epel_pixels_tab[2][2][0] = put_vp8_epel4_v6_altivec;
346 c->put_vp8_epel_pixels_tab[2][0][1] = put_vp8_epel4_h4_altivec;
347 c->put_vp8_epel_pixels_tab[2][1][0] = put_vp8_epel4_v4_altivec;
349 c->put_vp8_epel_pixels_tab[2][2][2] = put_vp8_epel4_h6v6_altivec;
350 c->put_vp8_epel_pixels_tab[2][1][1] = put_vp8_epel4_h4v4_altivec;
351 c->put_vp8_epel_pixels_tab[2][1][2] = put_vp8_epel4_h6v4_altivec;
352 c->put_vp8_epel_pixels_tab[2][2][1] = put_vp8_epel4_h4v6_altivec;
static av_always_inline void put_vp8_epel_h_altivec_core(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int h, int mx, int w, int is6tap)
static av_always_inline void put_vp8_epel_v_altivec_core(uint8_t *dst, ptrdiff_t dst_stride, const uint8_t *src, ptrdiff_t src_stride, int h, int my, int w, int is6tap)
static void put_vp8_pixels16_altivec(uint8_t *dst, ptrdiff_t dstride, const uint8_t *src, ptrdiff_t sstride, int h, int mx, int my)