📄 dsputil_mmx_avg.h.svn-base
字号:
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 + -