⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motion_comp_altivec.c

📁 mpeg2 decoder filter过滤服务端
💻 C
📖 第 1 页 / 共 2 页
字号:
    ones = vec_splat_u8 (1);    permA = vec_lvsl (0, ref);    permB = vec_add (permA, ones);    zero = vec_splat_u8 (0);    splat2 = vec_splat_u16 (2);    do {	ref0 = vec_ld (0, ref);	ref1 = vec_ld (8, ref);	ref += stride;	A = vec_perm (ref0, ref1, permA);	B = vec_perm (ref0, ref1, permB);	ref0 = vec_ld (0, ref);	ref1 = vec_ld (8, ref);	C = vec_perm (ref0, ref1, permA);	D = vec_perm (ref0, ref1, permB);	temp = vec_add (vec_add ((vector_u16_t)vec_mergeh (zero, A),				(vector_u16_t)vec_mergeh (zero, B)),		       vec_add ((vector_u16_t)vec_mergeh (zero, C),				(vector_u16_t)vec_mergeh (zero, D)));	temp = vec_sr (vec_add (temp, splat2), splat2);	tmp = vec_pack (temp, temp);	vec_st (tmp, 0, dest);	dest += stride;	tmp = vec_avg (vec_perm (ref0, ref1, permA),		       vec_perm (ref0, ref1, permB));    } while (--height);}#endifstatic void MC_avg_o_16_altivec (uint8_t * dest, const uint8_t * ref,				 const int stride, int height){    vector_u8_t perm, ref0, ref1, tmp, prev;    perm = vec_lvsl (0, ref);    height = (height >> 1) - 1;    ref0 = vec_ld (0, ref);    ref1 = vec_ld (15, ref);    ref += stride;    prev = vec_ld (0, dest);    tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));    do {	ref0 = vec_ld (0, ref);	ref1 = vec_ld (15, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_st (tmp, 0, dest);	tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));	ref0 = vec_ld (0, ref);	ref1 = vec_ld (15, ref);	ref += stride;	prev = vec_ld (2*stride, dest);	vec_st (tmp, stride, dest);	dest += 2*stride;	tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));    } while (--height);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (15, ref);    prev = vec_ld (stride, dest);    vec_st (tmp, 0, dest);    tmp = vec_avg (prev, vec_perm (ref0, ref1, perm));    vec_st (tmp, stride, dest);}static void MC_avg_o_8_altivec (uint8_t * dest, const uint8_t * ref,				const int stride, int height){    vector_u8_t perm0, perm1, tmp0, tmp1, ref0, ref1, prev;    tmp0 = vec_lvsl (0, ref);    tmp0 = vec_mergeh (tmp0, tmp0);    perm0 = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);    tmp1 = vec_lvsl (stride, ref);    tmp1 = vec_mergeh (tmp1, tmp1);    perm1 = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);    height = (height >> 1) - 1;    ref0 = vec_ld (0, ref);    ref1 = vec_ld (7, ref);    ref += stride;    prev = vec_ld (0, dest);    tmp0 = vec_avg (prev, vec_perm (ref0, ref1, perm0));    do {	ref0 = vec_ld (0, ref);	ref1 = vec_ld (7, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);	vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);	dest += stride;	tmp1 = vec_avg (prev, vec_perm (ref0, ref1, perm1));	ref0 = vec_ld (0, ref);	ref1 = vec_ld (7, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);	vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);	dest += stride;	tmp0 = vec_avg (prev, vec_perm (ref0, ref1, perm0));    } while (--height);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (7, ref);    prev = vec_ld (stride, dest);    vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);    vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);    dest += stride;    tmp1 = vec_avg (prev, vec_perm (ref0, ref1, perm1));    vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);    vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);}static void MC_avg_x_16_altivec (uint8_t * dest, const uint8_t * ref,				 const int stride, int height){    vector_u8_t permA, permB, ref0, ref1, tmp, prev;    permA = vec_lvsl (0, ref);    permB = vec_add (permA, vec_splat_u8 (1));    height = (height >> 1) - 1;    ref0 = vec_ld (0, ref);    ref1 = vec_ld (16, ref);    prev = vec_ld (0, dest);    ref += stride;    tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),				  vec_perm (ref0, ref1, permB)));    do {	ref0 = vec_ld (0, ref);	ref1 = vec_ld (16, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_st (tmp, 0, dest);	tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),				      vec_perm (ref0, ref1, permB)));	ref0 = vec_ld (0, ref);	ref1 = vec_ld (16, ref);	ref += stride;	prev = vec_ld (2*stride, dest);	vec_st (tmp, stride, dest);	dest += 2*stride;	tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),				      vec_perm (ref0, ref1, permB)));    } while (--height);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (16, ref);    prev = vec_ld (stride, dest);    vec_st (tmp, 0, dest);    tmp = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, permA),				  vec_perm (ref0, ref1, permB)));    vec_st (tmp, stride, dest);}static void MC_avg_x_8_altivec (uint8_t * dest, const uint8_t * ref,				const int stride, int height){    vector_u8_t perm0A, perm0B, perm1A, perm1B, ones, tmp0, tmp1, ref0, ref1;    vector_u8_t prev;    ones = vec_splat_u8 (1);    tmp0 = vec_lvsl (0, ref);    tmp0 = vec_mergeh (tmp0, tmp0);    perm0A = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);    perm0B = vec_add (perm0A, ones);    tmp1 = vec_lvsl (stride, ref);    tmp1 = vec_mergeh (tmp1, tmp1);    perm1A = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);    perm1B = vec_add (perm1A, ones);    height = (height >> 1) - 1;    ref0 = vec_ld (0, ref);    ref1 = vec_ld (8, ref);    prev = vec_ld (0, dest);    ref += stride;    tmp0 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm0A),				   vec_perm (ref0, ref1, perm0B)));    do {	ref0 = vec_ld (0, ref);	ref1 = vec_ld (8, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);	vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);	dest += stride;	tmp1 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm1A),				       vec_perm (ref0, ref1, perm1B)));	ref0 = vec_ld (0, ref);	ref1 = vec_ld (8, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);	vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);	dest += stride;	tmp0 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm0A),				       vec_perm (ref0, ref1, perm0B)));    } while (--height);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (8, ref);    prev = vec_ld (stride, dest);    vec_ste ((vector_u32_t)tmp0, 0, (unsigned int *)dest);    vec_ste ((vector_u32_t)tmp0, 4, (unsigned int *)dest);    dest += stride;    tmp1 = vec_avg (prev, vec_avg (vec_perm (ref0, ref1, perm1A),				   vec_perm (ref0, ref1, perm1B)));    vec_ste ((vector_u32_t)tmp1, 0, (unsigned int *)dest);    vec_ste ((vector_u32_t)tmp1, 4, (unsigned int *)dest);}static void MC_avg_y_16_altivec (uint8_t * dest, const uint8_t * ref,				 const int stride, int height){    vector_u8_t perm, ref0, ref1, tmp0, tmp1, tmp, prev;    perm = vec_lvsl (0, ref);    height = (height >> 1) - 1;    ref0 = vec_ld (0, ref);    ref1 = vec_ld (15, ref);    ref += stride;    tmp0 = vec_perm (ref0, ref1, perm);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (15, ref);    ref += stride;    prev = vec_ld (0, dest);    tmp1 = vec_perm (ref0, ref1, perm);    tmp = vec_avg (prev, vec_avg (tmp0, tmp1));    do {	ref0 = vec_ld (0, ref);	ref1 = vec_ld (15, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_st (tmp, 0, dest);	tmp0 = vec_perm (ref0, ref1, perm);	tmp = vec_avg (prev, vec_avg (tmp0, tmp1));	ref0 = vec_ld (0, ref);	ref1 = vec_ld (15, ref);	ref += stride;	prev = vec_ld (2*stride, dest);	vec_st (tmp, stride, dest);	dest += 2*stride;	tmp1 = vec_perm (ref0, ref1, perm);	tmp = vec_avg (prev, vec_avg (tmp0, tmp1));    } while (--height);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (15, ref);    prev = vec_ld (stride, dest);    vec_st (tmp, 0, dest);    tmp0 = vec_perm (ref0, ref1, perm);    tmp = vec_avg (prev, vec_avg (tmp0, tmp1));    vec_st (tmp, stride, dest);}static void MC_avg_y_8_altivec (uint8_t * dest, const uint8_t * ref,				const int stride, int height){    vector_u8_t perm0, perm1, tmp0, tmp1, tmp, ref0, ref1, prev;    tmp0 = vec_lvsl (0, ref);    tmp0 = vec_mergeh (tmp0, tmp0);    perm0 = vec_pack ((vector_u16_t)tmp0, (vector_u16_t)tmp0);    tmp1 = vec_lvsl (stride, ref);    tmp1 = vec_mergeh (tmp1, tmp1);    perm1 = vec_pack ((vector_u16_t)tmp1, (vector_u16_t)tmp1);    height = (height >> 1) - 1;    ref0 = vec_ld (0, ref);    ref1 = vec_ld (7, ref);    ref += stride;    tmp0 = vec_perm (ref0, ref1, perm0);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (7, ref);    ref += stride;    prev = vec_ld (0, dest);    tmp1 = vec_perm (ref0, ref1, perm1);    tmp = vec_avg (prev, vec_avg (tmp0, tmp1));    do {	ref0 = vec_ld (0, ref);	ref1 = vec_ld (7, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);	vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);	dest += stride;	tmp0 = vec_perm (ref0, ref1, perm0);	tmp = vec_avg (prev, vec_avg (tmp0, tmp1));	ref0 = vec_ld (0, ref);	ref1 = vec_ld (7, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);	vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);	dest += stride;	tmp1 = vec_perm (ref0, ref1, perm1);	tmp = vec_avg (prev, vec_avg (tmp0, tmp1));    } while (--height);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (7, ref);    prev = vec_ld (stride, dest);    vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);    vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);    dest += stride;    tmp0 = vec_perm (ref0, ref1, perm0);    tmp = vec_avg (prev, vec_avg (tmp0, tmp1));    vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);    vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);}static void MC_avg_xy_16_altivec (uint8_t * dest, const uint8_t * ref,				  const int stride, int height){    vector_u8_t permA, permB, ref0, ref1, A, B, avg0, avg1, xor0, xor1, tmp;    vector_u8_t ones, prev;    ones = vec_splat_u8 (1);    permA = vec_lvsl (0, ref);    permB = vec_add (permA, ones);    height = (height >> 1) - 1;    ref0 = vec_ld (0, ref);    ref1 = vec_ld (16, ref);    ref += stride;    A = vec_perm (ref0, ref1, permA);    B = vec_perm (ref0, ref1, permB);    avg0 = vec_avg (A, B);    xor0 = vec_xor (A, B);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (16, ref);    ref += stride;    prev = vec_ld (0, dest);    A = vec_perm (ref0, ref1, permA);    B = vec_perm (ref0, ref1, permB);    avg1 = vec_avg (A, B);    xor1 = vec_xor (A, B);    tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),				  vec_and (vec_and (ones, vec_or (xor0, xor1)),					   vec_xor (avg0, avg1))));    do {	ref0 = vec_ld (0, ref);	ref1 = vec_ld (16, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_st (tmp, 0, dest);	A = vec_perm (ref0, ref1, permA);	B = vec_perm (ref0, ref1, permB);	avg0 = vec_avg (A, B);	xor0 = vec_xor (A, B);	tmp = vec_avg (prev,		       vec_sub (vec_avg (avg0, avg1),				vec_and (vec_and (ones, vec_or (xor0, xor1)),					 vec_xor (avg0, avg1))));	ref0 = vec_ld (0, ref);	ref1 = vec_ld (16, ref);	ref += stride;	prev = vec_ld (2*stride, dest);	vec_st (tmp, stride, dest);	dest += 2*stride;	A = vec_perm (ref0, ref1, permA);	B = vec_perm (ref0, ref1, permB);	avg1 = vec_avg (A, B);	xor1 = vec_xor (A, B);	tmp = vec_avg (prev,		       vec_sub (vec_avg (avg0, avg1),				vec_and (vec_and (ones, vec_or (xor0, xor1)),					 vec_xor (avg0, avg1))));    } while (--height);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (16, ref);    prev = vec_ld (stride, dest);    vec_st (tmp, 0, dest);    A = vec_perm (ref0, ref1, permA);    B = vec_perm (ref0, ref1, permB);    avg0 = vec_avg (A, B);    xor0 = vec_xor (A, B);    tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),				  vec_and (vec_and (ones, vec_or (xor0, xor1)),					   vec_xor (avg0, avg1))));    vec_st (tmp, stride, dest);}static void MC_avg_xy_8_altivec (uint8_t * dest, const uint8_t * ref,				 const int stride, int height){    vector_u8_t perm0A, perm0B, perm1A, perm1B, ref0, ref1, A, B;    vector_u8_t avg0, avg1, xor0, xor1, tmp, ones, prev;    ones = vec_splat_u8 (1);    perm0A = vec_lvsl (0, ref);    perm0A = vec_mergeh (perm0A, perm0A);    perm0A = vec_pack ((vector_u16_t)perm0A, (vector_u16_t)perm0A);    perm0B = vec_add (perm0A, ones);    perm1A = vec_lvsl (stride, ref);    perm1A = vec_mergeh (perm1A, perm1A);    perm1A = vec_pack ((vector_u16_t)perm1A, (vector_u16_t)perm1A);    perm1B = vec_add (perm1A, ones);    height = (height >> 1) - 1;    ref0 = vec_ld (0, ref);    ref1 = vec_ld (8, ref);    ref += stride;    A = vec_perm (ref0, ref1, perm0A);    B = vec_perm (ref0, ref1, perm0B);    avg0 = vec_avg (A, B);    xor0 = vec_xor (A, B);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (8, ref);    ref += stride;    prev = vec_ld (0, dest);    A = vec_perm (ref0, ref1, perm1A);    B = vec_perm (ref0, ref1, perm1B);    avg1 = vec_avg (A, B);    xor1 = vec_xor (A, B);    tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),				  vec_and (vec_and (ones, vec_or (xor0, xor1)),					   vec_xor (avg0, avg1))));    do {	ref0 = vec_ld (0, ref);	ref1 = vec_ld (8, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);	vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);	dest += stride;	A = vec_perm (ref0, ref1, perm0A);	B = vec_perm (ref0, ref1, perm0B);	avg0 = vec_avg (A, B);	xor0 = vec_xor (A, B);	tmp = vec_avg (prev,		       vec_sub (vec_avg (avg0, avg1),				vec_and (vec_and (ones, vec_or (xor0, xor1)),					 vec_xor (avg0, avg1))));	ref0 = vec_ld (0, ref);	ref1 = vec_ld (8, ref);	ref += stride;	prev = vec_ld (stride, dest);	vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);	vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);	dest += stride;	A = vec_perm (ref0, ref1, perm1A);	B = vec_perm (ref0, ref1, perm1B);	avg1 = vec_avg (A, B);	xor1 = vec_xor (A, B);	tmp = vec_avg (prev,		       vec_sub (vec_avg (avg0, avg1),				vec_and (vec_and (ones, vec_or (xor0, xor1)),					 vec_xor (avg0, avg1))));    } while (--height);    ref0 = vec_ld (0, ref);    ref1 = vec_ld (8, ref);    prev = vec_ld (stride, dest);    vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);    vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);    dest += stride;    A = vec_perm (ref0, ref1, perm0A);    B = vec_perm (ref0, ref1, perm0B);    avg0 = vec_avg (A, B);    xor0 = vec_xor (A, B);    tmp = vec_avg (prev, vec_sub (vec_avg (avg0, avg1),				  vec_and (vec_and (ones, vec_or (xor0, xor1)),					   vec_xor (avg0, avg1))));    vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);    vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);}MPEG2_MC_EXTERN (altivec)#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -