void idct_add_altivec(uint8_t* dest, int stride, vector_s16_t* block)

{

POWERPC_TBL_DECLARE(altivec_idct_add_num, 1);

#ifdef ALTIVEC_USE_REFERENCE_C_CODE

POWERPC_TBL_START_COUNT(altivec_idct_add_num, 1);

    void simple_idct_add(uint8_t *dest, int line_size, int16_t *block);

    simple_idct_add(dest, stride, (int16_t*)block);

POWERPC_TBL_STOP_COUNT(altivec_idct_add_num, 1);

#else /* ALTIVEC_USE_REFERENCE_C_CODE */

    vector_u8_t tmp;

    vector_s16_t tmp2, tmp3;

    vector_u8_t perm0;

    vector_u8_t perm1;

    vector_u8_t p0, p1, p;



POWERPC_TBL_START_COUNT(altivec_idct_add_num, 1);



    IDCT



    p0 = vec_lvsl (0, dest);

    p1 = vec_lvsl (stride, dest);

    p = vec_splat_u8 (-1);

    perm0 = vec_mergeh (p, p0);

    perm1 = vec_mergeh (p, p1);



#define ADD(dest,src,perm)						\

    /* *(uint64_t *)&tmp = *(uint64_t *)dest; */			\

    tmp = vec_ld (0, dest);						\

    tmp2 = (vector_s16_t)vec_perm (tmp, (vector_u8_t)zero, perm);	\

    tmp3 = vec_adds (tmp2, src);					\

    tmp = vec_packsu (tmp3, tmp3);					\

    vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);		\

    vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);



    ADD (dest, vx0, perm0)	dest += stride;

    ADD (dest, vx1, perm1)	dest += stride;

    ADD (dest, vx2, perm0)	dest += stride;

    ADD (dest, vx3, perm1)	dest += stride;

    ADD (dest, vx4, perm0)	dest += stride;

    ADD (dest, vx5, perm1)	dest += stride;

    ADD (dest, vx6, perm0)	dest += stride;

    ADD (dest, vx7, perm1)



POWERPC_TBL_STOP_COUNT(altivec_idct_add_num, 1);

#endif /* ALTIVEC_USE_REFERENCE_C_CODE */

}

void idct_add_altivec(uint8_t* dest, int stride, vector_s16_t* block)

{

POWERPC_TBL_DECLARE(altivec_idct_add_num, 1);

#ifdef ALTIVEC_USE_REFERENCE_C_CODE

POWERPC_TBL_START_COUNT(altivec_idct_add_num, 1);

    void simple_idct_add(uint8_t *dest, int line_size, int16_t *block);

    simple_idct_add(dest, stride, (int16_t*)block);

POWERPC_TBL_STOP_COUNT(altivec_idct_add_num, 1);

#else 

    vector_u8_t tmp;

    vector_s16_t tmp2, tmp3;

    vector_u8_t perm0;

    vector_u8_t perm1;

    vector_u8_t p0, p1, p;



POWERPC_TBL_START_COUNT(altivec_idct_add_num, 1);



    IDCT



    p0 = vec_lvsl (0, dest);

    p1 = vec_lvsl (stride, dest);

    p = vec_splat_u8 (-1);

    perm0 = vec_mergeh (p, p0);

    perm1 = vec_mergeh (p, p1);



#define ADD(dest,src,perm)						\

    			\

    tmp = vec_ld (0, dest);						\

    tmp2 = (vector_s16_t)vec_perm (tmp, (vector_u8_t)zero, perm);	\

    tmp3 = vec_adds (tmp2, src);					\

    tmp = vec_packsu (tmp3, tmp3);					\

    vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)dest);		\

    vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)dest);



    ADD (dest, vx0, perm0)	dest += stride;

    ADD (dest, vx1, perm1)	dest += stride;

    ADD (dest, vx2, perm0)	dest += stride;

    ADD (dest, vx3, perm1)	dest += stride;

    ADD (dest, vx4, perm0)	dest += stride;

    ADD (dest, vx5, perm1)	dest += stride;

    ADD (dest, vx6, perm0)	dest += stride;

    ADD (dest, vx7, perm1)



POWERPC_TBL_STOP_COUNT(altivec_idct_add_num, 1);

#endif 

}

void FUNC_0(uint8_t* VAR_0, int VAR_1, vector_s16_t* VAR_2)

{

POWERPC_TBL_DECLARE(altivec_idct_add_num, 1);

#ifdef ALTIVEC_USE_REFERENCE_C_CODE

POWERPC_TBL_START_COUNT(altivec_idct_add_num, 1);

    void simple_idct_add(uint8_t *VAR_0, int line_size, int16_t *VAR_2);

    simple_idct_add(VAR_0, VAR_1, (int16_t*)VAR_2);

POWERPC_TBL_STOP_COUNT(altivec_idct_add_num, 1);

#else 

    vector_u8_t tmp;

    vector_s16_t tmp2, tmp3;

    vector_u8_t perm0;

    vector_u8_t perm1;

    vector_u8_t p0, p1, p;



POWERPC_TBL_START_COUNT(altivec_idct_add_num, 1);



    IDCT



    p0 = vec_lvsl (0, VAR_0);

    p1 = vec_lvsl (VAR_1, VAR_0);

    p = vec_splat_u8 (-1);

    perm0 = vec_mergeh (p, p0);

    perm1 = vec_mergeh (p, p1);



#define ADD(VAR_0,src,perm)						\

    			\

    tmp = vec_ld (0, VAR_0);						\

    tmp2 = (vector_s16_t)vec_perm (tmp, (vector_u8_t)zero, perm);	\

    tmp3 = vec_adds (tmp2, src);					\

    tmp = vec_packsu (tmp3, tmp3);					\

    vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)VAR_0);		\

    vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)VAR_0);



    ADD (VAR_0, vx0, perm0)	VAR_0 += VAR_1;

    ADD (VAR_0, vx1, perm1)	VAR_0 += VAR_1;

    ADD (VAR_0, vx2, perm0)	VAR_0 += VAR_1;

    ADD (VAR_0, vx3, perm1)	VAR_0 += VAR_1;

    ADD (VAR_0, vx4, perm0)	VAR_0 += VAR_1;

    ADD (VAR_0, vx5, perm1)	VAR_0 += VAR_1;

    ADD (VAR_0, vx6, perm0)	VAR_0 += VAR_1;

    ADD (VAR_0, vx7, perm1)



POWERPC_TBL_STOP_COUNT(altivec_idct_add_num, 1);

#endif 

}

void FUNC_0(uint8_t* VAR_0, int VAR_1, vector_s16_t* VAR_2)
{ POWERPC_TBL_DECLARE(altivec_idct_add_num, 1); #ifdef ALTIVEC_USE_REFERENCE_C_CODE
POWERPC_TBL_START_COUNT(altivec_idct_add_num, 1); void simple_idct_add(uint8_t *VAR_0, int line_size, int16_t *VAR_2); simple_idct_add(VAR_0, VAR_1, (int16_t*)VAR_2); POWERPC_TBL_STOP_COUNT(altivec_idct_add_num, 1); #else
vector_u8_t tmp; vector_s16_t tmp2, tmp3; vector_u8_t perm0; vector_u8_t perm1; vector_u8_t p0, p1, p; POWERPC_TBL_START_COUNT(altivec_idct_add_num, 1); IDCT
p0 = vec_lvsl (0, VAR_0); p1 = vec_lvsl (VAR_1, VAR_0); p = vec_splat_u8 (-1); perm0 = vec_mergeh (p, p0); perm1 = vec_mergeh (p, p1); #define ADD(VAR_0,src,perm)						\
\
tmp = vec_ld (0, VAR_0);						\ tmp2 = (vector_s16_t)vec_perm (tmp, (vector_u8_t)zero, perm);	\ tmp3 = vec_adds (tmp2, src);					\ tmp = vec_packsu (tmp3, tmp3);					\ vec_ste ((vector_u32_t)tmp, 0, (unsigned int *)VAR_0);		\ vec_ste ((vector_u32_t)tmp, 4, (unsigned int *)VAR_0); ADD (VAR_0, vx0, perm0)	VAR_0 += VAR_1; ADD (VAR_0, vx1, perm1)	VAR_0 += VAR_1; ADD (VAR_0, vx2, perm0)	VAR_0 += VAR_1; ADD (VAR_0, vx3, perm1)	VAR_0 += VAR_1; ADD (VAR_0, vx4, perm0)	VAR_0 += VAR_1; ADD (VAR_0, vx5, perm1)	VAR_0 += VAR_1; ADD (VAR_0, vx6, perm0)	VAR_0 += VAR_1; ADD (VAR_0, vx7, perm1)
POWERPC_TBL_STOP_COUNT(altivec_idct_add_num, 1); #endif
}