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

📄 dsputil_mmx_avg.h.svn-base

📁 mediastreamer2是开源的网络传输媒体流的库
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
        PAVGB" %%mm1, %%mm0             \n\t"        PAVGB" %%mm2, %%mm1             \n\t"        "movq %%mm0, (%2, %3)           \n\t"        "movq %%mm1, (%2, %%"REG_a")    \n\t"        "movq (%1, %3), %%mm1           \n\t"        "movq (%1, %%"REG_a"), %%mm0    \n\t"        "add %%"REG_a", %2              \n\t"        "add %%"REG_a", %1              \n\t"        PAVGB" %%mm1, %%mm2             \n\t"        PAVGB" %%mm0, %%mm1             \n\t"        "movq %%mm2, (%2, %3)           \n\t"        "movq %%mm1, (%2, %%"REG_a")    \n\t"        "add %%"REG_a", %2              \n\t"        "subl $4, %0                    \n\t"        "jnz 1b                         \n\t"        :"+g"(h), "+S"(pixels), "+D" (block)        :"r" ((long)line_size)        :"%"REG_a, "memory");}/* GL: this function does incorrect rounding if overflow */static void DEF(put_no_rnd_pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    MOVQ_BONE(mm6);    __asm __volatile(        "lea (%3, %3), %%"REG_a"        \n\t"        "movq (%1), %%mm0               \n\t"        "sub %3, %2                     \n\t"        "1:                             \n\t"        "movq (%1, %3), %%mm1           \n\t"        "movq (%1, %%"REG_a"), %%mm2    \n\t"        "add %%"REG_a", %1              \n\t"        "psubusb %%mm6, %%mm1           \n\t"        PAVGB" %%mm1, %%mm0             \n\t"        PAVGB" %%mm2, %%mm1             \n\t"        "movq %%mm0, (%2, %3)           \n\t"        "movq %%mm1, (%2, %%"REG_a")    \n\t"        "movq (%1, %3), %%mm1           \n\t"        "movq (%1, %%"REG_a"), %%mm0    \n\t"        "add %%"REG_a", %2              \n\t"        "add %%"REG_a", %1              \n\t"        "psubusb %%mm6, %%mm1           \n\t"        PAVGB" %%mm1, %%mm2             \n\t"        PAVGB" %%mm0, %%mm1             \n\t"        "movq %%mm2, (%2, %3)           \n\t"        "movq %%mm1, (%2, %%"REG_a")    \n\t"        "add %%"REG_a", %2              \n\t"        "subl $4, %0                    \n\t"        "jnz 1b                         \n\t"        :"+g"(h), "+S"(pixels), "+D" (block)        :"r" ((long)line_size)        :"%"REG_a, "memory");}static void DEF(avg_pixels8)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    __asm __volatile(        "lea (%3, %3), %%"REG_a"        \n\t"        "1:                             \n\t"        "movq (%2), %%mm0               \n\t"        "movq (%2, %3), %%mm1           \n\t"        PAVGB" (%1), %%mm0              \n\t"        PAVGB" (%1, %3), %%mm1          \n\t"        "movq %%mm0, (%2)               \n\t"        "movq %%mm1, (%2, %3)           \n\t"        "add %%"REG_a", %1              \n\t"        "add %%"REG_a", %2              \n\t"        "movq (%2), %%mm0               \n\t"        "movq (%2, %3), %%mm1           \n\t"        PAVGB" (%1), %%mm0              \n\t"        PAVGB" (%1, %3), %%mm1          \n\t"        "add %%"REG_a", %1              \n\t"        "movq %%mm0, (%2)               \n\t"        "movq %%mm1, (%2, %3)           \n\t"        "add %%"REG_a", %2              \n\t"        "subl $4, %0                    \n\t"        "jnz 1b                         \n\t"        :"+g"(h), "+S"(pixels), "+D"(block)        :"r" ((long)line_size)        :"%"REG_a, "memory");}static void DEF(avg_pixels8_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    __asm __volatile(        "lea (%3, %3), %%"REG_a"        \n\t"        "1:                             \n\t"        "movq (%1), %%mm0               \n\t"        "movq (%1, %3), %%mm2           \n\t"        PAVGB" 1(%1), %%mm0             \n\t"        PAVGB" 1(%1, %3), %%mm2         \n\t"        PAVGB" (%2), %%mm0              \n\t"        PAVGB" (%2, %3), %%mm2          \n\t"        "add %%"REG_a", %1              \n\t"        "movq %%mm0, (%2)               \n\t"        "movq %%mm2, (%2, %3)           \n\t"        "movq (%1), %%mm0               \n\t"        "movq (%1, %3), %%mm2           \n\t"        PAVGB" 1(%1), %%mm0             \n\t"        PAVGB" 1(%1, %3), %%mm2         \n\t"        "add %%"REG_a", %2              \n\t"        "add %%"REG_a", %1              \n\t"        PAVGB" (%2), %%mm0              \n\t"        PAVGB" (%2, %3), %%mm2          \n\t"        "movq %%mm0, (%2)               \n\t"        "movq %%mm2, (%2, %3)           \n\t"        "add %%"REG_a", %2              \n\t"        "subl $4, %0                    \n\t"        "jnz 1b                         \n\t"        :"+g"(h), "+S"(pixels), "+D"(block)        :"r" ((long)line_size)        :"%"REG_a, "memory");}static void DEF(avg_pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    __asm __volatile(        "lea (%3, %3), %%"REG_a"        \n\t"        "movq (%1), %%mm0               \n\t"        "sub %3, %2                     \n\t"        "1:                             \n\t"        "movq (%1, %3), %%mm1           \n\t"        "movq (%1, %%"REG_a"), %%mm2    \n\t"        "add %%"REG_a", %1              \n\t"        PAVGB" %%mm1, %%mm0             \n\t"        PAVGB" %%mm2, %%mm1             \n\t"        "movq (%2, %3), %%mm3           \n\t"        "movq (%2, %%"REG_a"), %%mm4    \n\t"        PAVGB" %%mm3, %%mm0             \n\t"        PAVGB" %%mm4, %%mm1             \n\t"        "movq %%mm0, (%2, %3)           \n\t"        "movq %%mm1, (%2, %%"REG_a")    \n\t"        "movq (%1, %3), %%mm1           \n\t"        "movq (%1, %%"REG_a"), %%mm0    \n\t"        PAVGB" %%mm1, %%mm2             \n\t"        PAVGB" %%mm0, %%mm1             \n\t"        "add %%"REG_a", %2              \n\t"        "add %%"REG_a", %1              \n\t"        "movq (%2, %3), %%mm3           \n\t"        "movq (%2, %%"REG_a"), %%mm4    \n\t"        PAVGB" %%mm3, %%mm2             \n\t"        PAVGB" %%mm4, %%mm1             \n\t"        "movq %%mm2, (%2, %3)           \n\t"        "movq %%mm1, (%2, %%"REG_a")    \n\t"        "add %%"REG_a", %2              \n\t"        "subl $4, %0                    \n\t"        "jnz 1b                         \n\t"        :"+g"(h), "+S"(pixels), "+D"(block)        :"r" ((long)line_size)        :"%"REG_a, "memory");}/* Note this is not correctly rounded, but this function is only * used for B-frames so it does not matter. */static void DEF(avg_pixels8_xy2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    MOVQ_BONE(mm6);    __asm __volatile(        "lea (%3, %3), %%"REG_a"        \n\t"        "movq (%1), %%mm0               \n\t"        PAVGB" 1(%1), %%mm0             \n\t"         ASMALIGN(3)        "1:                             \n\t"        "movq (%1, %%"REG_a"), %%mm2    \n\t"        "movq (%1, %3), %%mm1           \n\t"        "psubusb %%mm6, %%mm2           \n\t"        PAVGB" 1(%1, %3), %%mm1         \n\t"        PAVGB" 1(%1, %%"REG_a"), %%mm2  \n\t"        "add %%"REG_a", %1              \n\t"        PAVGB" %%mm1, %%mm0             \n\t"        PAVGB" %%mm2, %%mm1             \n\t"        PAVGB" (%2), %%mm0              \n\t"        PAVGB" (%2, %3), %%mm1          \n\t"        "movq %%mm0, (%2)               \n\t"        "movq %%mm1, (%2, %3)           \n\t"        "movq (%1, %3), %%mm1           \n\t"        "movq (%1, %%"REG_a"), %%mm0    \n\t"        PAVGB" 1(%1, %3), %%mm1         \n\t"        PAVGB" 1(%1, %%"REG_a"), %%mm0  \n\t"        "add %%"REG_a", %2              \n\t"        "add %%"REG_a", %1              \n\t"        PAVGB" %%mm1, %%mm2             \n\t"        PAVGB" %%mm0, %%mm1             \n\t"        PAVGB" (%2), %%mm2              \n\t"        PAVGB" (%2, %3), %%mm1          \n\t"        "movq %%mm2, (%2)               \n\t"        "movq %%mm1, (%2, %3)           \n\t"        "add %%"REG_a", %2              \n\t"        "subl $4, %0                    \n\t"        "jnz 1b                         \n\t"        :"+g"(h), "+S"(pixels), "+D"(block)        :"r" ((long)line_size)        :"%"REG_a,  "memory");}static void DEF(avg_pixels4)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    do {        asm volatile(            "movd (%1), %%mm0               \n\t"            "movd (%1, %2), %%mm1           \n\t"            "movd (%1, %2, 2), %%mm2        \n\t"            "movd (%1, %3), %%mm3           \n\t"            PAVGB" (%0), %%mm0              \n\t"            PAVGB" (%0, %2), %%mm1          \n\t"            PAVGB" (%0, %2, 2), %%mm2       \n\t"            PAVGB" (%0, %3), %%mm3          \n\t"            "movd %%mm0, (%1)               \n\t"            "movd %%mm1, (%1, %2)           \n\t"            "movd %%mm2, (%1, %2, 2)        \n\t"            "movd %%mm3, (%1, %3)           \n\t"            ::"S"(pixels), "D"(block),             "r" ((long)line_size), "r"(3L*line_size)            :"memory");        block += 4*line_size;        pixels += 4*line_size;        h -= 4;    } while(h > 0);}//FIXME the following could be optimized too ...static void DEF(put_no_rnd_pixels16_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    DEF(put_no_rnd_pixels8_x2)(block  , pixels  , line_size, h);    DEF(put_no_rnd_pixels8_x2)(block+8, pixels+8, line_size, h);}static void DEF(put_pixels16_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    DEF(put_pixels8_y2)(block  , pixels  , line_size, h);    DEF(put_pixels8_y2)(block+8, pixels+8, line_size, h);}static void DEF(put_no_rnd_pixels16_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    DEF(put_no_rnd_pixels8_y2)(block  , pixels  , line_size, h);    DEF(put_no_rnd_pixels8_y2)(block+8, pixels+8, line_size, h);}static void DEF(avg_pixels16)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    DEF(avg_pixels8)(block  , pixels  , line_size, h);    DEF(avg_pixels8)(block+8, pixels+8, line_size, h);}static void DEF(avg_pixels16_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    DEF(avg_pixels8_x2)(block  , pixels  , line_size, h);    DEF(avg_pixels8_x2)(block+8, pixels+8, line_size, h);}static void DEF(avg_pixels16_y2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    DEF(avg_pixels8_y2)(block  , pixels  , line_size, h);    DEF(avg_pixels8_y2)(block+8, pixels+8, line_size, h);}static void DEF(avg_pixels16_xy2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){    DEF(avg_pixels8_xy2)(block  , pixels  , line_size, h);    DEF(avg_pixels8_xy2)(block+8, pixels+8, line_size, h);}#define QPEL_2TAP_L3(OPNAME) \static void DEF(OPNAME ## 2tap_qpel16_l3)(uint8_t *dst, uint8_t *src, int stride, int h, int off1, int off2){\    asm volatile(\        "1:                    \n\t"\        "movq   (%1,%2), %%mm0 \n\t"\        "movq  8(%1,%2), %%mm1 \n\t"\        PAVGB"  (%1,%3), %%mm0 \n\t"\        PAVGB" 8(%1,%3), %%mm1 \n\t"\        PAVGB"  (%1),    %%mm0 \n\t"\        PAVGB" 8(%1),    %%mm1 \n\t"\        STORE_OP( (%1,%4),%%mm0)\        STORE_OP(8(%1,%4),%%mm1)\        "movq  %%mm0,  (%1,%4) \n\t"\        "movq  %%mm1, 8(%1,%4) \n\t"\        "add   %5, %1          \n\t"\        "decl  %0              \n\t"\        "jnz   1b              \n\t"\        :"+g"(h), "+r"(src)\        :"r"((long)off1), "r"((long)off2),\         "r"((long)(dst-src)), "r"((long)stride)\        :"memory"\    );\}\static void DEF(OPNAME ## 2tap_qpel8_l3)(uint8_t *dst, uint8_t *src, int stride, int h, int off1, int off2){\    asm volatile(\        "1:                    \n\t"\        "movq   (%1,%2), %%mm0 \n\t"\        PAVGB"  (%1,%3), %%mm0 \n\t"\        PAVGB"  (%1),    %%mm0 \n\t"\        STORE_OP((%1,%4),%%mm0)\        "movq  %%mm0,  (%1,%4) \n\t"\        "add   %5, %1          \n\t"\        "decl  %0              \n\t"\        "jnz   1b              \n\t"\        :"+g"(h), "+r"(src)\        :"r"((long)off1), "r"((long)off2),\         "r"((long)(dst-src)), "r"((long)stride)\        :"memory"\    );\}#define STORE_OP(a,b) PAVGB" "#a","#b" \n\t"QPEL_2TAP_L3(avg_)#undef STORE_OP#define STORE_OP(a,b)QPEL_2TAP_L3(put_)#undef STORE_OP#undef QPEL_2TAP_L3

⌨️ 快捷键说明

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