From 6f903d8e2793d641ae324ba5d39a7cd436d33a73 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Mon, 14 Jan 2002 04:34:52 +0000 Subject: [PATCH] (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 --- libavcodec/msmpeg4.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/libavcodec/msmpeg4.c b/libavcodec/msmpeg4.c index c8df0c4153..d737bbca47 100644 --- a/libavcodec/msmpeg4.c +++ b/libavcodec/msmpeg4.c @@ -411,10 +411,34 @@ static int msmpeg4_pred_dc(MpegEncContext * s, int n, necessitate to modify mpegvideo.c. The problem comes from the fact they decided to store the quantized DC (which would lead 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; b = (b + (scale >> 1)) / scale; c = (c + (scale >> 1)) / scale; - +#endif /* XXX: WARNING: they did not choose the same test as MPEG4. This is very important ! */ if (abs(a - b) <= abs(b - c)) {