Commit 6f903d8e authored by Michael Niedermayer's avatar Michael Niedermayer

(commit by michael)

16-bit divide instead of 32-bit on x86 in msmpeg_pred_dc()

Originally committed as revision 264 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 8bdbae01
...@@ -411,10 +411,34 @@ static int msmpeg4_pred_dc(MpegEncContext * s, int n, ...@@ -411,10 +411,34 @@ static int msmpeg4_pred_dc(MpegEncContext * s, int n,
necessitate to modify mpegvideo.c. The problem comes from the necessitate to modify mpegvideo.c. The problem comes from the
fact they decided to store the quantized DC (which would lead fact they decided to store the quantized DC (which would lead
to problems if Q could vary !) */ to problems if Q could vary !) */
#ifdef ARCH_X86
/* using 16bit divisions as they are large enough and 2x as fast */
asm volatile(
"movl %3, %%eax \n\t"
"shrl $1, %%eax \n\t"
"addl %%eax, %2 \n\t"
"addl %%eax, %1 \n\t"
"addl %0, %%eax \n\t"
"xorl %%edx, %%edx \n\t"
"divw %w3 \n\t"
"movzwl %%ax, %0 \n\t"
"movl %1, %%eax \n\t"
"xorl %%edx, %%edx \n\t"
"divw %w3 \n\t"
"movzwl %%ax, %1 \n\t"
"movl %2, %%eax \n\t"
"xorl %%edx, %%edx \n\t"
"divw %w3 \n\t"
"movzwl %%ax, %2 \n\t"
: "+r" (a), "+r" (b), "+r" (c)
: "r" (scale)
: "%eax", "%edx"
);
#else
a = (a + (scale >> 1)) / scale; a = (a + (scale >> 1)) / scale;
b = (b + (scale >> 1)) / scale; b = (b + (scale >> 1)) / scale;
c = (c + (scale >> 1)) / scale; c = (c + (scale >> 1)) / scale;
#endif
/* XXX: WARNING: they did not choose the same test as MPEG4. This /* XXX: WARNING: they did not choose the same test as MPEG4. This
is very important ! */ is very important ! */
if (abs(a - b) <= abs(b - c)) { if (abs(a - b) <= abs(b - c)) {
......
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