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

📄 cavsdsp_mmx.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 2 页
字号:
        "pmullw %6, %%mm6           \n\t"\        "movq "#D", %%mm7           \n\t"\        "pmullw %5, %%mm7           \n\t"\        "psllw $3, "#B"             \n\t"\        "psubw "#B", %%mm6          \n\t"\        "psraw $3, "#B"             \n\t"\        "paddw %%mm7, %%mm6         \n\t"\        "paddw "#B", %%mm6          \n\t"\        "paddw "#E", "#E"           \n\t"\        "pxor %%mm7, %%mm7          \n\t"\        "add %2, %0                 \n\t"\        "punpcklbw %%mm7, "#F"      \n\t"\        "psubw "#E", %%mm6          \n\t"\        "psraw $1, "#E"             \n\t"\        "psubw "#F", %%mm6          \n\t"\        "paddw %4, %%mm6            \n\t"\        "psraw $7, %%mm6            \n\t"\        "packuswb %%mm6, %%mm6      \n\t"\        OP(%%mm6, (%1), A, d)            \        "add %3, %1                 \n\t"#define QPEL_CAVSVNUM(VOP,OP,ADD,MUL1,MUL2)\    int w= 2;\    src -= 2*srcStride;\    \    while(w--){\      asm volatile(\        "pxor %%mm7, %%mm7          \n\t"\        "movd (%0), %%mm0           \n\t"\        "add %2, %0                 \n\t"\        "movd (%0), %%mm1           \n\t"\        "add %2, %0                 \n\t"\        "movd (%0), %%mm2           \n\t"\        "add %2, %0                 \n\t"\        "movd (%0), %%mm3           \n\t"\        "add %2, %0                 \n\t"\        "movd (%0), %%mm4           \n\t"\        "add %2, %0                 \n\t"\        "punpcklbw %%mm7, %%mm0     \n\t"\        "punpcklbw %%mm7, %%mm1     \n\t"\        "punpcklbw %%mm7, %%mm2     \n\t"\        "punpcklbw %%mm7, %%mm3     \n\t"\        "punpcklbw %%mm7, %%mm4     \n\t"\        VOP(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, OP)\        VOP(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, OP)\        VOP(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1, OP)\        VOP(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2, OP)\        VOP(%%mm4, %%mm5, %%mm0, %%mm1, %%mm2, %%mm3, OP)\        VOP(%%mm5, %%mm0, %%mm1, %%mm2, %%mm3, %%mm4, OP)\        VOP(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, OP)\        VOP(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, OP)\        \        : "+a"(src), "+c"(dst)\        : "S"((long)srcStride), "D"((long)dstStride), "m"(ADD), "m"(MUL1), "m"(MUL2)\        : "memory"\     );\     if(h==16){\        asm volatile(\            VOP(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1, OP)\            VOP(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2, OP)\            VOP(%%mm4, %%mm5, %%mm0, %%mm1, %%mm2, %%mm3, OP)\            VOP(%%mm5, %%mm0, %%mm1, %%mm2, %%mm3, %%mm4, OP)\            VOP(%%mm0, %%mm1, %%mm2, %%mm3, %%mm4, %%mm5, OP)\            VOP(%%mm1, %%mm2, %%mm3, %%mm4, %%mm5, %%mm0, OP)\            VOP(%%mm2, %%mm3, %%mm4, %%mm5, %%mm0, %%mm1, OP)\            VOP(%%mm3, %%mm4, %%mm5, %%mm0, %%mm1, %%mm2, OP)\            \           : "+a"(src), "+c"(dst)\           : "S"((long)srcStride), "D"((long)dstStride), "m"(ADD),  "m"(MUL1), "m"(MUL2)\           : "memory"\        );\     }\     src += 4-(h+5)*srcStride;\     dst += 4-h*dstStride;\   }#define QPEL_CAVS(OPNAME, OP, MMX)\static void OPNAME ## cavs_qpel8_h_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\    int h=8;\    asm volatile(\        "pxor %%mm7, %%mm7          \n\t"\        "movq %5, %%mm6             \n\t"\        "1:                         \n\t"\        "movq    (%0), %%mm0        \n\t"\        "movq   1(%0), %%mm2        \n\t"\        "movq %%mm0, %%mm1          \n\t"\        "movq %%mm2, %%mm3          \n\t"\        "punpcklbw %%mm7, %%mm0     \n\t"\        "punpckhbw %%mm7, %%mm1     \n\t"\        "punpcklbw %%mm7, %%mm2     \n\t"\        "punpckhbw %%mm7, %%mm3     \n\t"\        "paddw %%mm2, %%mm0         \n\t"\        "paddw %%mm3, %%mm1         \n\t"\        "pmullw %%mm6, %%mm0        \n\t"\        "pmullw %%mm6, %%mm1        \n\t"\        "movq   -1(%0), %%mm2       \n\t"\        "movq    2(%0), %%mm4       \n\t"\        "movq %%mm2, %%mm3          \n\t"\        "movq %%mm4, %%mm5          \n\t"\        "punpcklbw %%mm7, %%mm2     \n\t"\        "punpckhbw %%mm7, %%mm3     \n\t"\        "punpcklbw %%mm7, %%mm4     \n\t"\        "punpckhbw %%mm7, %%mm5     \n\t"\        "paddw %%mm4, %%mm2         \n\t"\        "paddw %%mm3, %%mm5         \n\t"\        "psubw %%mm2, %%mm0         \n\t"\        "psubw %%mm5, %%mm1         \n\t"\        "movq %6, %%mm5             \n\t"\        "paddw %%mm5, %%mm0         \n\t"\        "paddw %%mm5, %%mm1         \n\t"\        "psraw $3, %%mm0            \n\t"\        "psraw $3, %%mm1            \n\t"\        "packuswb %%mm1, %%mm0      \n\t"\        OP(%%mm0, (%1),%%mm5, q)         \        "add %3, %0                 \n\t"\        "add %4, %1                 \n\t"\        "decl %2                    \n\t"\        " jnz 1b                    \n\t"\        : "+a"(src), "+c"(dst), "+m"(h)\        : "d"((long)srcStride), "S"((long)dstStride), "m"(ff_pw_5), "m"(ff_pw_4)\        : "memory"\    );\}\\static inline void OPNAME ## cavs_qpel8or16_v1_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\  QPEL_CAVSVNUM(QPEL_CAVSV1,OP,ff_pw_64,ff_pw_96,ff_pw_42)      \}\\static inline void OPNAME ## cavs_qpel8or16_v2_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\  QPEL_CAVSVNUM(QPEL_CAVSV2,OP,ff_pw_4,ff_pw_5,ff_pw_5)         \}\\static inline void OPNAME ## cavs_qpel8or16_v3_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\  QPEL_CAVSVNUM(QPEL_CAVSV3,OP,ff_pw_64,ff_pw_96,ff_pw_42)      \}\\static void OPNAME ## cavs_qpel8_v1_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\    OPNAME ## cavs_qpel8or16_v1_ ## MMX(dst  , src  , dstStride, srcStride, 8);\}\static void OPNAME ## cavs_qpel16_v1_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\    OPNAME ## cavs_qpel8or16_v1_ ## MMX(dst  , src  , dstStride, srcStride, 16);\    OPNAME ## cavs_qpel8or16_v1_ ## MMX(dst+8, src+8, dstStride, srcStride, 16);\}\\static void OPNAME ## cavs_qpel8_v2_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\    OPNAME ## cavs_qpel8or16_v2_ ## MMX(dst  , src  , dstStride, srcStride, 8);\}\static void OPNAME ## cavs_qpel16_v2_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\    OPNAME ## cavs_qpel8or16_v2_ ## MMX(dst  , src  , dstStride, srcStride, 16);\    OPNAME ## cavs_qpel8or16_v2_ ## MMX(dst+8, src+8, dstStride, srcStride, 16);\}\\static void OPNAME ## cavs_qpel8_v3_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\    OPNAME ## cavs_qpel8or16_v3_ ## MMX(dst  , src  , dstStride, srcStride, 8);\}\static void OPNAME ## cavs_qpel16_v3_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\    OPNAME ## cavs_qpel8or16_v3_ ## MMX(dst  , src  , dstStride, srcStride, 16);\    OPNAME ## cavs_qpel8or16_v3_ ## MMX(dst+8, src+8, dstStride, srcStride, 16);\}\\static void OPNAME ## cavs_qpel16_h_ ## MMX(uint8_t *dst, uint8_t *src, int dstStride, int srcStride){\    OPNAME ## cavs_qpel8_h_ ## MMX(dst  , src  , dstStride, srcStride);\    OPNAME ## cavs_qpel8_h_ ## MMX(dst+8, src+8, dstStride, srcStride);\    src += 8*srcStride;\    dst += 8*dstStride;\    OPNAME ## cavs_qpel8_h_ ## MMX(dst  , src  , dstStride, srcStride);\    OPNAME ## cavs_qpel8_h_ ## MMX(dst+8, src+8, dstStride, srcStride);\}\#define CAVS_MC(OPNAME, SIZE, MMX) \static void ff_ ## OPNAME ## cavs_qpel ## SIZE ## _mc20_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\    OPNAME ## cavs_qpel ## SIZE ## _h_ ## MMX(dst, src, stride, stride);\}\\static void ff_ ## OPNAME ## cavs_qpel ## SIZE ## _mc01_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\    OPNAME ## cavs_qpel ## SIZE ## _v1_ ## MMX(dst, src, stride, stride);\}\\static void ff_ ## OPNAME ## cavs_qpel ## SIZE ## _mc02_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\    OPNAME ## cavs_qpel ## SIZE ## _v2_ ## MMX(dst, src, stride, stride);\}\\static void ff_ ## OPNAME ## cavs_qpel ## SIZE ## _mc03_ ## MMX(uint8_t *dst, uint8_t *src, int stride){\    OPNAME ## cavs_qpel ## SIZE ## _v3_ ## MMX(dst, src, stride, stride);\}\#define PUT_OP(a,b,temp, size) "mov" #size " " #a ", " #b "    \n\t"#define AVG_3DNOW_OP(a,b,temp, size) \"mov" #size " " #b ", " #temp "   \n\t"\"pavgusb " #temp ", " #a "        \n\t"\"mov" #size " " #a ", " #b "      \n\t"#define AVG_MMX2_OP(a,b,temp, size) \"mov" #size " " #b ", " #temp "   \n\t"\"pavgb " #temp ", " #a "          \n\t"\"mov" #size " " #a ", " #b "      \n\t"QPEL_CAVS(put_,       PUT_OP, 3dnow)QPEL_CAVS(avg_, AVG_3DNOW_OP, 3dnow)QPEL_CAVS(put_,       PUT_OP, mmx2)QPEL_CAVS(avg_,  AVG_MMX2_OP, mmx2)CAVS_MC(put_, 8, 3dnow)CAVS_MC(put_, 16,3dnow)CAVS_MC(avg_, 8, 3dnow)CAVS_MC(avg_, 16,3dnow)CAVS_MC(put_, 8, mmx2)CAVS_MC(put_, 16,mmx2)CAVS_MC(avg_, 8, mmx2)CAVS_MC(avg_, 16,mmx2)void ff_put_cavs_qpel8_mc00_mmx2(uint8_t *dst, uint8_t *src, int stride);void ff_avg_cavs_qpel8_mc00_mmx2(uint8_t *dst, uint8_t *src, int stride);void ff_put_cavs_qpel16_mc00_mmx2(uint8_t *dst, uint8_t *src, int stride);void ff_avg_cavs_qpel16_mc00_mmx2(uint8_t *dst, uint8_t *src, int stride);void ff_cavsdsp_init_mmx2(DSPContext* c, AVCodecContext *avctx) {#define dspfunc(PFX, IDX, NUM) \    c->PFX ## _pixels_tab[IDX][ 0] = ff_ ## PFX ## NUM ## _mc00_mmx2; \    c->PFX ## _pixels_tab[IDX][ 2] = ff_ ## PFX ## NUM ## _mc20_mmx2; \    c->PFX ## _pixels_tab[IDX][ 4] = ff_ ## PFX ## NUM ## _mc01_mmx2; \    c->PFX ## _pixels_tab[IDX][ 8] = ff_ ## PFX ## NUM ## _mc02_mmx2; \    c->PFX ## _pixels_tab[IDX][12] = ff_ ## PFX ## NUM ## _mc03_mmx2; \    dspfunc(put_cavs_qpel, 0, 16);    dspfunc(put_cavs_qpel, 1, 8);    dspfunc(avg_cavs_qpel, 0, 16);    dspfunc(avg_cavs_qpel, 1, 8);#undef dspfunc    c->cavs_idct8_add = cavs_idct8_add_mmx;}void ff_cavsdsp_init_3dnow(DSPContext* c, AVCodecContext *avctx) {#define dspfunc(PFX, IDX, NUM) \    c->PFX ## _pixels_tab[IDX][ 0] = ff_ ## PFX ## NUM ## _mc00_mmx2; \    c->PFX ## _pixels_tab[IDX][ 2] = ff_ ## PFX ## NUM ## _mc20_3dnow; \    c->PFX ## _pixels_tab[IDX][ 4] = ff_ ## PFX ## NUM ## _mc01_3dnow; \    c->PFX ## _pixels_tab[IDX][ 8] = ff_ ## PFX ## NUM ## _mc02_3dnow; \    c->PFX ## _pixels_tab[IDX][12] = ff_ ## PFX ## NUM ## _mc03_3dnow; \    dspfunc(put_cavs_qpel, 0, 16);    dspfunc(put_cavs_qpel, 1, 8);    dspfunc(avg_cavs_qpel, 0, 16);    dspfunc(avg_cavs_qpel, 1, 8);#undef dspfunc    c->cavs_idct8_add = cavs_idct8_add_mmx;}

⌨️ 快捷键说明

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