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

📄 dsputil_mmx.c

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.7平台上编译为嵌入式图形界面操作系统。
💻 C
📖 第 1 页 / 共 2 页
字号:
     	 "movq %%mm0, (%2)		\n\t"	 "movq %%mm1, (%2, %3)		\n\t"	 "addl %%eax, %1		\n\t"         "addl %%eax, %2       		\n\t"	 "movq (%1), %%mm0		\n\t"	 "movq (%1, %3), %%mm1		\n\t"	 "movq %%mm0, (%2)		\n\t"	 "movq %%mm1, (%2, %3)		\n\t"	 "addl %%eax, %1		\n\t"	 "addl %%eax, %2       		\n\t"	 "subl $4, %0			\n\t"	 "jnz 1b			\n\t"	 : "+g"(h), "+r" (pixels),  "+r" (block)	 : "r"(line_size)	 : "%eax", "memory"	);}static void put_pixels16_mmx(UINT8 *block, const UINT8 *pixels, int line_size, int h){    __asm __volatile(	 "lea (%3, %3), %%eax		\n\t"	 ".balign 8			\n\t"	 "1:				\n\t"	 "movq (%1), %%mm0		\n\t"	 "movq 8(%1), %%mm4		\n\t"	 "movq (%1, %3), %%mm1		\n\t"	 "movq 8(%1, %3), %%mm5		\n\t"     	 "movq %%mm0, (%2)		\n\t"     	 "movq %%mm4, 8(%2)		\n\t"	 "movq %%mm1, (%2, %3)		\n\t"	 "movq %%mm5, 8(%2, %3)		\n\t"	 "addl %%eax, %1		\n\t"         "addl %%eax, %2       		\n\t"	 "movq (%1), %%mm0		\n\t"	 "movq 8(%1), %%mm4		\n\t"	 "movq (%1, %3), %%mm1		\n\t"	 "movq 8(%1, %3), %%mm5		\n\t"	 "movq %%mm0, (%2)		\n\t"	 "movq %%mm4, 8(%2)		\n\t"	 "movq %%mm1, (%2, %3)		\n\t"	 "movq %%mm5, 8(%2, %3)		\n\t"	 "addl %%eax, %1		\n\t"	 "addl %%eax, %2       		\n\t"	 "subl $4, %0			\n\t"	 "jnz 1b			\n\t"	 : "+g"(h), "+r" (pixels),  "+r" (block)	 : "r"(line_size)	 : "%eax", "memory"	);}static void clear_blocks_mmx(DCTELEM *blocks){    __asm __volatile(                "pxor %%mm7, %%mm7		\n\t"                "movl $-128*6, %%eax		\n\t"                "1:				\n\t"                "movq %%mm7, (%0, %%eax)	\n\t"                "movq %%mm7, 8(%0, %%eax)	\n\t"                "movq %%mm7, 16(%0, %%eax)	\n\t"                "movq %%mm7, 24(%0, %%eax)	\n\t"                "addl $32, %%eax		\n\t"                " js 1b				\n\t"                : : "r" (((int)blocks)+128*6)                : "%eax"        );}static int pix_sum16_mmx(UINT8 * pix, int line_size){    const int h=16;    int sum;    int index= -line_size*h;    __asm __volatile(                "pxor %%mm7, %%mm7		\n\t"                "pxor %%mm6, %%mm6		\n\t"                "1:				\n\t"                "movq (%2, %1), %%mm0		\n\t"                "movq (%2, %1), %%mm1		\n\t"                "movq 8(%2, %1), %%mm2		\n\t"                "movq 8(%2, %1), %%mm3		\n\t"                "punpcklbw %%mm7, %%mm0		\n\t"                "punpckhbw %%mm7, %%mm1		\n\t"                "punpcklbw %%mm7, %%mm2		\n\t"                "punpckhbw %%mm7, %%mm3		\n\t"                "paddw %%mm0, %%mm1		\n\t"                "paddw %%mm2, %%mm3		\n\t"                "paddw %%mm1, %%mm3		\n\t"                "paddw %%mm3, %%mm6		\n\t"                "addl %3, %1			\n\t"                " js 1b				\n\t"                "movq %%mm6, %%mm5		\n\t"                "psrlq $32, %%mm6		\n\t"                "paddw %%mm5, %%mm6		\n\t"                "movq %%mm6, %%mm5		\n\t"                "psrlq $16, %%mm6		\n\t"                "paddw %%mm5, %%mm6		\n\t"                "movd %%mm6, %0			\n\t"                "andl $0xFFFF, %0		\n\t"                : "=&r" (sum), "+r" (index)                : "r" (pix - index), "r" (line_size)        );        return sum;}static void add_bytes_mmx(uint8_t *dst, uint8_t *src, int w){    int i=0;    asm volatile(        "1:				\n\t"        "movq  (%1, %0), %%mm0		\n\t"        "movq  (%2, %0), %%mm1		\n\t"        "paddb %%mm0, %%mm1		\n\t"        "movq %%mm1, (%2, %0)		\n\t"        "movq 8(%1, %0), %%mm0		\n\t"        "movq 8(%2, %0), %%mm1		\n\t"        "paddb %%mm0, %%mm1		\n\t"        "movq %%mm1, 8(%2, %0)		\n\t"        "addl $16, %0			\n\t"        "cmpl %3, %0			\n\t"        " jb 1b				\n\t"        : "+r" (i)        : "r"(src), "r"(dst), "r"(w-15)    );    for(; i<w; i++)        dst[i+0] += src[i+0];}static void diff_bytes_mmx(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){    int i=0;    asm volatile(        "1:				\n\t"        "movq  (%2, %0), %%mm0		\n\t"        "movq  (%1, %0), %%mm1		\n\t"        "psubb %%mm0, %%mm1		\n\t"        "movq %%mm1, (%3, %0)		\n\t"        "movq 8(%2, %0), %%mm0		\n\t"        "movq 8(%1, %0), %%mm1		\n\t"        "psubb %%mm0, %%mm1		\n\t"        "movq %%mm1, 8(%3, %0)		\n\t"        "addl $16, %0			\n\t"        "cmpl %4, %0			\n\t"        " jb 1b				\n\t"        : "+r" (i)        : "r"(src1), "r"(src2), "r"(dst), "r"(w-15)    );    for(; i<w; i++)        dst[i+0] = src1[i+0]-src2[i+0];}#if 0static void just_return() { return; }#endifvoid dsputil_init_mmx(DSPContext* c, unsigned mask){    mm_flags = mm_support();#if 0    fprintf(stderr, "libavcodec: CPU flags:");    if (mm_flags & MM_MMX)        fprintf(stderr, " mmx");    if (mm_flags & MM_MMXEXT)        fprintf(stderr, " mmxext");    if (mm_flags & MM_3DNOW)        fprintf(stderr, " 3dnow");    if (mm_flags & MM_SSE)        fprintf(stderr, " sse");    if (mm_flags & MM_SSE2)        fprintf(stderr, " sse2");    fprintf(stderr, "\n");#endif    if (mm_flags & MM_MMX) {        c->get_pixels = get_pixels_mmx;        c->diff_pixels = diff_pixels_mmx;        c->put_pixels_clamped = put_pixels_clamped_mmx;        c->add_pixels_clamped = add_pixels_clamped_mmx;        c->clear_blocks = clear_blocks_mmx;        c->pix_sum = pix_sum16_mmx;        c->pix_abs16x16     = pix_abs16x16_mmx;        c->pix_abs16x16_x2  = pix_abs16x16_x2_mmx;        c->pix_abs16x16_y2  = pix_abs16x16_y2_mmx;        c->pix_abs16x16_xy2 = pix_abs16x16_xy2_mmx;        c->pix_abs8x8     = pix_abs8x8_mmx;        c->pix_abs8x8_x2  = pix_abs8x8_x2_mmx;        c->pix_abs8x8_y2  = pix_abs8x8_y2_mmx;        c->pix_abs8x8_xy2 = pix_abs8x8_xy2_mmx;        c->put_pixels_tab[0][0] = put_pixels16_mmx;        c->put_pixels_tab[0][1] = put_pixels16_x2_mmx;        c->put_pixels_tab[0][2] = put_pixels16_y2_mmx;        c->put_pixels_tab[0][3] = put_pixels16_xy2_mmx;        c->put_no_rnd_pixels_tab[0][0] = put_pixels16_mmx;        c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_mmx;        c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_mmx;        c->put_no_rnd_pixels_tab[0][3] = put_no_rnd_pixels16_xy2_mmx;        c->avg_pixels_tab[0][0] = avg_pixels16_mmx;        c->avg_pixels_tab[0][1] = avg_pixels16_x2_mmx;        c->avg_pixels_tab[0][2] = avg_pixels16_y2_mmx;        c->avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx;        c->avg_no_rnd_pixels_tab[0][0] = avg_no_rnd_pixels16_mmx;        c->avg_no_rnd_pixels_tab[0][1] = avg_no_rnd_pixels16_x2_mmx;        c->avg_no_rnd_pixels_tab[0][2] = avg_no_rnd_pixels16_y2_mmx;        c->avg_no_rnd_pixels_tab[0][3] = avg_no_rnd_pixels16_xy2_mmx;        c->put_pixels_tab[1][0] = put_pixels8_mmx;        c->put_pixels_tab[1][1] = put_pixels8_x2_mmx;        c->put_pixels_tab[1][2] = put_pixels8_y2_mmx;        c->put_pixels_tab[1][3] = put_pixels8_xy2_mmx;        c->put_no_rnd_pixels_tab[1][0] = put_pixels8_mmx;        c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_mmx;        c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_mmx;        c->put_no_rnd_pixels_tab[1][3] = put_no_rnd_pixels8_xy2_mmx;        c->avg_pixels_tab[1][0] = avg_pixels8_mmx;        c->avg_pixels_tab[1][1] = avg_pixels8_x2_mmx;        c->avg_pixels_tab[1][2] = avg_pixels8_y2_mmx;        c->avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx;        c->avg_no_rnd_pixels_tab[1][0] = avg_no_rnd_pixels8_mmx;        c->avg_no_rnd_pixels_tab[1][1] = avg_no_rnd_pixels8_x2_mmx;        c->avg_no_rnd_pixels_tab[1][2] = avg_no_rnd_pixels8_y2_mmx;        c->avg_no_rnd_pixels_tab[1][3] = avg_no_rnd_pixels8_xy2_mmx;                c->add_bytes= add_bytes_mmx;        c->diff_bytes= diff_bytes_mmx;        if (mm_flags & MM_MMXEXT) {            c->pix_abs16x16     = pix_abs16x16_mmx2;            c->pix_abs16x16_x2  = pix_abs16x16_x2_mmx2;            c->pix_abs16x16_y2  = pix_abs16x16_y2_mmx2;            c->pix_abs16x16_xy2 = pix_abs16x16_xy2_mmx2;            c->pix_abs8x8     = pix_abs8x8_mmx2;            c->pix_abs8x8_x2  = pix_abs8x8_x2_mmx2;            c->pix_abs8x8_y2  = pix_abs8x8_y2_mmx2;            c->pix_abs8x8_xy2 = pix_abs8x8_xy2_mmx2;            c->put_pixels_tab[0][1] = put_pixels16_x2_mmx2;            c->put_pixels_tab[0][2] = put_pixels16_y2_mmx2;            c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_mmx2;            c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_mmx2;            c->avg_pixels_tab[0][0] = avg_pixels16_mmx2;            c->avg_pixels_tab[0][1] = avg_pixels16_x2_mmx2;            c->avg_pixels_tab[0][2] = avg_pixels16_y2_mmx2;            c->avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx2;            c->put_pixels_tab[1][1] = put_pixels8_x2_mmx2;            c->put_pixels_tab[1][2] = put_pixels8_y2_mmx2;            c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_mmx2;            c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_mmx2;            c->avg_pixels_tab[1][0] = avg_pixels8_mmx2;            c->avg_pixels_tab[1][1] = avg_pixels8_x2_mmx2;            c->avg_pixels_tab[1][2] = avg_pixels8_y2_mmx2;            c->avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx2;        } else if (mm_flags & MM_3DNOW) {            c->put_pixels_tab[0][1] = put_pixels16_x2_3dnow;            c->put_pixels_tab[0][2] = put_pixels16_y2_3dnow;            c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_3dnow;            c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_3dnow;            c->avg_pixels_tab[0][0] = avg_pixels16_3dnow;            c->avg_pixels_tab[0][1] = avg_pixels16_x2_3dnow;            c->avg_pixels_tab[0][2] = avg_pixels16_y2_3dnow;            c->avg_pixels_tab[0][3] = avg_pixels16_xy2_3dnow;            c->put_pixels_tab[1][1] = put_pixels8_x2_3dnow;            c->put_pixels_tab[1][2] = put_pixels8_y2_3dnow;            c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_3dnow;            c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_3dnow;            c->avg_pixels_tab[1][0] = avg_pixels8_3dnow;            c->avg_pixels_tab[1][1] = avg_pixels8_x2_3dnow;            c->avg_pixels_tab[1][2] = avg_pixels8_y2_3dnow;            c->avg_pixels_tab[1][3] = avg_pixels8_xy2_3dnow;        }    }#if 0    // for speed testing    get_pixels = just_return;    put_pixels_clamped = just_return;    add_pixels_clamped = just_return;    pix_abs16x16 = just_return;    pix_abs16x16_x2 = just_return;    pix_abs16x16_y2 = just_return;    pix_abs16x16_xy2 = just_return;    put_pixels_tab[0] = just_return;    put_pixels_tab[1] = just_return;    put_pixels_tab[2] = just_return;    put_pixels_tab[3] = just_return;    put_no_rnd_pixels_tab[0] = just_return;    put_no_rnd_pixels_tab[1] = just_return;    put_no_rnd_pixels_tab[2] = just_return;    put_no_rnd_pixels_tab[3] = just_return;    avg_pixels_tab[0] = just_return;    avg_pixels_tab[1] = just_return;    avg_pixels_tab[2] = just_return;    avg_pixels_tab[3] = just_return;    avg_no_rnd_pixels_tab[0] = just_return;    avg_no_rnd_pixels_tab[1] = just_return;    avg_no_rnd_pixels_tab[2] = just_return;    avg_no_rnd_pixels_tab[3] = just_return;    //av_fdct = just_return;    //ff_idct = just_return;#endif}/* remove any non bit exact operation (testing purpose). NOTE that   this function should be kept as small as possible because it is   always difficult to test automatically non bit exact cases. */void dsputil_set_bit_exact_mmx(DSPContext* c, unsigned mask){    if (mm_flags & MM_MMX) {        /* MMX2 & 3DNOW */        c->put_no_rnd_pixels_tab[0][1] = put_no_rnd_pixels16_x2_mmx;        c->put_no_rnd_pixels_tab[0][2] = put_no_rnd_pixels16_y2_mmx;        c->avg_pixels_tab[0][3] = avg_pixels16_xy2_mmx;        c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_mmx;        c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_mmx;        c->avg_pixels_tab[1][3] = avg_pixels8_xy2_mmx;        if (mm_flags & MM_MMXEXT) {            c->pix_abs16x16_x2  = pix_abs16x16_x2_mmx;            c->pix_abs16x16_y2  = pix_abs16x16_y2_mmx;            c->pix_abs16x16_xy2 = pix_abs16x16_xy2_mmx;            c->pix_abs8x8_x2 = pix_abs8x8_x2_mmx;            c->pix_abs8x8_y2 = pix_abs8x8_y2_mmx;            c->pix_abs8x8_xy2= pix_abs8x8_xy2_mmx;        }    }}

⌨️ 快捷键说明

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