Commit c21c835b authored by David Conrad's avatar David Conrad

avg_ pixel functions need to use (dst+pix+1)>>1 to average with existing

pixels, not (dst+pix)>>1.
This makes the mmx functions bitexact with the C functions.

Originally committed as revision 18527 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 29382bc1
...@@ -155,6 +155,7 @@ DECLARE_ALIGNED_16(const double, ff_pd_2[2]) = { 2.0, 2.0 }; ...@@ -155,6 +155,7 @@ DECLARE_ALIGNED_16(const double, ff_pd_2[2]) = { 2.0, 2.0 };
#define SET_RND MOVQ_WONE #define SET_RND MOVQ_WONE
#define PAVGBP(a, b, c, d, e, f) PAVGBP_MMX_NO_RND(a, b, c, d, e, f) #define PAVGBP(a, b, c, d, e, f) PAVGBP_MMX_NO_RND(a, b, c, d, e, f)
#define PAVGB(a, b, c, e) PAVGB_MMX_NO_RND(a, b, c, e) #define PAVGB(a, b, c, e) PAVGB_MMX_NO_RND(a, b, c, e)
#define OP_AVG(a, b, c, e) PAVGB_MMX(a, b, c, e)
#include "dsputil_mmx_rnd_template.c" #include "dsputil_mmx_rnd_template.c"
...@@ -176,17 +177,20 @@ DECLARE_ALIGNED_16(const double, ff_pd_2[2]) = { 2.0, 2.0 }; ...@@ -176,17 +177,20 @@ DECLARE_ALIGNED_16(const double, ff_pd_2[2]) = { 2.0, 2.0 };
#undef SET_RND #undef SET_RND
#undef PAVGBP #undef PAVGBP
#undef PAVGB #undef PAVGB
#undef OP_AVG
/***********************************/ /***********************************/
/* 3Dnow specific */ /* 3Dnow specific */
#define DEF(x) x ## _3dnow #define DEF(x) x ## _3dnow
#define PAVGB "pavgusb" #define PAVGB "pavgusb"
#define OP_AVG PAVGB
#include "dsputil_mmx_avg_template.c" #include "dsputil_mmx_avg_template.c"
#undef DEF #undef DEF
#undef PAVGB #undef PAVGB
#undef OP_AVG
/***********************************/ /***********************************/
/* MMX2 specific */ /* MMX2 specific */
...@@ -195,11 +199,13 @@ DECLARE_ALIGNED_16(const double, ff_pd_2[2]) = { 2.0, 2.0 }; ...@@ -195,11 +199,13 @@ DECLARE_ALIGNED_16(const double, ff_pd_2[2]) = { 2.0, 2.0 };
/* Introduced only in MMX2 set */ /* Introduced only in MMX2 set */
#define PAVGB "pavgb" #define PAVGB "pavgb"
#define OP_AVG PAVGB
#include "dsputil_mmx_avg_template.c" #include "dsputil_mmx_avg_template.c"
#undef DEF #undef DEF
#undef PAVGB #undef PAVGB
#undef OP_AVG
#define put_no_rnd_pixels16_mmx put_pixels16_mmx #define put_no_rnd_pixels16_mmx put_pixels16_mmx
#define put_no_rnd_pixels8_mmx put_pixels8_mmx #define put_no_rnd_pixels8_mmx put_pixels8_mmx
......
...@@ -306,7 +306,7 @@ static void av_unused DEF(avg, pixels4)(uint8_t *block, const uint8_t *pixels, i ...@@ -306,7 +306,7 @@ static void av_unused DEF(avg, pixels4)(uint8_t *block, const uint8_t *pixels, i
__asm__ volatile( __asm__ volatile(
"movd %0, %%mm0 \n\t" "movd %0, %%mm0 \n\t"
"movd %1, %%mm1 \n\t" "movd %1, %%mm1 \n\t"
PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) OP_AVG(%%mm0, %%mm1, %%mm2, %%mm6)
"movd %%mm2, %0 \n\t" "movd %%mm2, %0 \n\t"
:"+m"(*block) :"+m"(*block)
:"m"(*pixels) :"m"(*pixels)
...@@ -326,7 +326,7 @@ static void DEF(avg, pixels8)(uint8_t *block, const uint8_t *pixels, int line_si ...@@ -326,7 +326,7 @@ static void DEF(avg, pixels8)(uint8_t *block, const uint8_t *pixels, int line_si
__asm__ volatile( __asm__ volatile(
"movq %0, %%mm0 \n\t" "movq %0, %%mm0 \n\t"
"movq %1, %%mm1 \n\t" "movq %1, %%mm1 \n\t"
PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) OP_AVG(%%mm0, %%mm1, %%mm2, %%mm6)
"movq %%mm2, %0 \n\t" "movq %%mm2, %0 \n\t"
:"+m"(*block) :"+m"(*block)
:"m"(*pixels) :"m"(*pixels)
...@@ -345,11 +345,11 @@ static void DEF(avg, pixels16)(uint8_t *block, const uint8_t *pixels, int line_s ...@@ -345,11 +345,11 @@ static void DEF(avg, pixels16)(uint8_t *block, const uint8_t *pixels, int line_s
__asm__ volatile( __asm__ volatile(
"movq %0, %%mm0 \n\t" "movq %0, %%mm0 \n\t"
"movq %1, %%mm1 \n\t" "movq %1, %%mm1 \n\t"
PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) OP_AVG(%%mm0, %%mm1, %%mm2, %%mm6)
"movq %%mm2, %0 \n\t" "movq %%mm2, %0 \n\t"
"movq 8%0, %%mm0 \n\t" "movq 8%0, %%mm0 \n\t"
"movq 8%1, %%mm1 \n\t" "movq 8%1, %%mm1 \n\t"
PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) OP_AVG(%%mm0, %%mm1, %%mm2, %%mm6)
"movq %%mm2, 8%0 \n\t" "movq %%mm2, 8%0 \n\t"
:"+m"(*block) :"+m"(*block)
:"m"(*pixels) :"m"(*pixels)
...@@ -370,7 +370,7 @@ static void DEF(avg, pixels8_x2)(uint8_t *block, const uint8_t *pixels, int line ...@@ -370,7 +370,7 @@ static void DEF(avg, pixels8_x2)(uint8_t *block, const uint8_t *pixels, int line
"movq 1%1, %%mm1 \n\t" "movq 1%1, %%mm1 \n\t"
"movq %0, %%mm3 \n\t" "movq %0, %%mm3 \n\t"
PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
"movq %%mm0, %0 \n\t" "movq %%mm0, %0 \n\t"
:"+m"(*block) :"+m"(*block)
:"m"(*pixels) :"m"(*pixels)
...@@ -390,7 +390,7 @@ static av_unused void DEF(avg, pixels8_l2)(uint8_t *dst, uint8_t *src1, uint8_t ...@@ -390,7 +390,7 @@ static av_unused void DEF(avg, pixels8_l2)(uint8_t *dst, uint8_t *src1, uint8_t
"movq %2, %%mm1 \n\t" "movq %2, %%mm1 \n\t"
"movq %0, %%mm3 \n\t" "movq %0, %%mm3 \n\t"
PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
"movq %%mm0, %0 \n\t" "movq %%mm0, %0 \n\t"
:"+m"(*dst) :"+m"(*dst)
:"m"(*src1), "m"(*src2) :"m"(*src1), "m"(*src2)
...@@ -411,13 +411,13 @@ static void DEF(avg, pixels16_x2)(uint8_t *block, const uint8_t *pixels, int lin ...@@ -411,13 +411,13 @@ static void DEF(avg, pixels16_x2)(uint8_t *block, const uint8_t *pixels, int lin
"movq 1%1, %%mm1 \n\t" "movq 1%1, %%mm1 \n\t"
"movq %0, %%mm3 \n\t" "movq %0, %%mm3 \n\t"
PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
"movq %%mm0, %0 \n\t" "movq %%mm0, %0 \n\t"
"movq 8%1, %%mm0 \n\t" "movq 8%1, %%mm0 \n\t"
"movq 9%1, %%mm1 \n\t" "movq 9%1, %%mm1 \n\t"
"movq 8%0, %%mm3 \n\t" "movq 8%0, %%mm3 \n\t"
PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
"movq %%mm0, 8%0 \n\t" "movq %%mm0, 8%0 \n\t"
:"+m"(*block) :"+m"(*block)
:"m"(*pixels) :"m"(*pixels)
...@@ -437,13 +437,13 @@ static av_unused void DEF(avg, pixels16_l2)(uint8_t *dst, uint8_t *src1, uint8_t ...@@ -437,13 +437,13 @@ static av_unused void DEF(avg, pixels16_l2)(uint8_t *dst, uint8_t *src1, uint8_t
"movq %2, %%mm1 \n\t" "movq %2, %%mm1 \n\t"
"movq %0, %%mm3 \n\t" "movq %0, %%mm3 \n\t"
PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
"movq %%mm0, %0 \n\t" "movq %%mm0, %0 \n\t"
"movq 8%1, %%mm0 \n\t" "movq 8%1, %%mm0 \n\t"
"movq 8%2, %%mm1 \n\t" "movq 8%2, %%mm1 \n\t"
"movq 8%0, %%mm3 \n\t" "movq 8%0, %%mm3 \n\t"
PAVGB(%%mm0, %%mm1, %%mm2, %%mm6) PAVGB(%%mm0, %%mm1, %%mm2, %%mm6)
PAVGB(%%mm3, %%mm2, %%mm0, %%mm6) OP_AVG(%%mm3, %%mm2, %%mm0, %%mm6)
"movq %%mm0, 8%0 \n\t" "movq %%mm0, 8%0 \n\t"
:"+m"(*dst) :"+m"(*dst)
:"m"(*src1), "m"(*src2) :"m"(*src1), "m"(*src2)
...@@ -466,9 +466,9 @@ static void DEF(avg, pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line ...@@ -466,9 +466,9 @@ static void DEF(avg, pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line
"movq (%1, %%"REG_a"), %%mm2 \n\t" "movq (%1, %%"REG_a"), %%mm2 \n\t"
PAVGBP(%%mm1, %%mm0, %%mm4, %%mm2, %%mm1, %%mm5) PAVGBP(%%mm1, %%mm0, %%mm4, %%mm2, %%mm1, %%mm5)
"movq (%2), %%mm3 \n\t" "movq (%2), %%mm3 \n\t"
PAVGB(%%mm3, %%mm4, %%mm0, %%mm6) OP_AVG(%%mm3, %%mm4, %%mm0, %%mm6)
"movq (%2, %3), %%mm3 \n\t" "movq (%2, %3), %%mm3 \n\t"
PAVGB(%%mm3, %%mm5, %%mm1, %%mm6) OP_AVG(%%mm3, %%mm5, %%mm1, %%mm6)
"movq %%mm0, (%2) \n\t" "movq %%mm0, (%2) \n\t"
"movq %%mm1, (%2, %3) \n\t" "movq %%mm1, (%2, %3) \n\t"
"add %%"REG_a", %1 \n\t" "add %%"REG_a", %1 \n\t"
...@@ -478,9 +478,9 @@ static void DEF(avg, pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line ...@@ -478,9 +478,9 @@ static void DEF(avg, pixels8_y2)(uint8_t *block, const uint8_t *pixels, int line
"movq (%1, %%"REG_a"), %%mm0 \n\t" "movq (%1, %%"REG_a"), %%mm0 \n\t"
PAVGBP(%%mm1, %%mm2, %%mm4, %%mm0, %%mm1, %%mm5) PAVGBP(%%mm1, %%mm2, %%mm4, %%mm0, %%mm1, %%mm5)
"movq (%2), %%mm3 \n\t" "movq (%2), %%mm3 \n\t"
PAVGB(%%mm3, %%mm4, %%mm2, %%mm6) OP_AVG(%%mm3, %%mm4, %%mm2, %%mm6)
"movq (%2, %3), %%mm3 \n\t" "movq (%2, %3), %%mm3 \n\t"
PAVGB(%%mm3, %%mm5, %%mm1, %%mm6) OP_AVG(%%mm3, %%mm5, %%mm1, %%mm6)
"movq %%mm2, (%2) \n\t" "movq %%mm2, (%2) \n\t"
"movq %%mm1, (%2, %3) \n\t" "movq %%mm1, (%2, %3) \n\t"
"add %%"REG_a", %1 \n\t" "add %%"REG_a", %1 \n\t"
...@@ -533,7 +533,7 @@ static void DEF(avg, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, int lin ...@@ -533,7 +533,7 @@ static void DEF(avg, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, int lin
"packuswb %%mm5, %%mm4 \n\t" "packuswb %%mm5, %%mm4 \n\t"
"pcmpeqd %%mm2, %%mm2 \n\t" "pcmpeqd %%mm2, %%mm2 \n\t"
"paddb %%mm2, %%mm2 \n\t" "paddb %%mm2, %%mm2 \n\t"
PAVGB(%%mm3, %%mm4, %%mm5, %%mm2) OP_AVG(%%mm3, %%mm4, %%mm5, %%mm2)
"movq %%mm5, (%2, %%"REG_a") \n\t" "movq %%mm5, (%2, %%"REG_a") \n\t"
"add %3, %%"REG_a" \n\t" "add %3, %%"REG_a" \n\t"
...@@ -557,7 +557,7 @@ static void DEF(avg, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, int lin ...@@ -557,7 +557,7 @@ static void DEF(avg, pixels8_xy2)(uint8_t *block, const uint8_t *pixels, int lin
"packuswb %%mm1, %%mm0 \n\t" "packuswb %%mm1, %%mm0 \n\t"
"pcmpeqd %%mm2, %%mm2 \n\t" "pcmpeqd %%mm2, %%mm2 \n\t"
"paddb %%mm2, %%mm2 \n\t" "paddb %%mm2, %%mm2 \n\t"
PAVGB(%%mm3, %%mm0, %%mm1, %%mm2) OP_AVG(%%mm3, %%mm0, %%mm1, %%mm2)
"movq %%mm1, (%2, %%"REG_a") \n\t" "movq %%mm1, (%2, %%"REG_a") \n\t"
"add %3, %%"REG_a" \n\t" "add %3, %%"REG_a" \n\t"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment