summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-01-14 04:34:52 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-01-14 04:34:52 +0000
commit6f903d8e2793d641ae324ba5d39a7cd436d33a73 (patch)
treeec7910bef4d4cb2c75fcb97a4147516efcd0d6fc /libavcodec
parent8bdbae01fec3bb8395a6f90bf5a92a58ad2102f8 (diff)
(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
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/msmpeg4.c26
1 files changed, 25 insertions, 1 deletions
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)) {