aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/i386/dsputil_mmx.c
diff options
context:
space:
mode:
authorZdenek Kabelac <kabi@informatics.muni.cz>2002-05-29 19:57:21 +0000
committerZdenek Kabelac <kabi@informatics.muni.cz>2002-05-29 19:57:21 +0000
commit6aa6ea8e11ce58543d45e99c37cd3d6179a76af0 (patch)
tree5be620bb874baf5030fd80a02019c3625457fe1d /libavcodec/i386/dsputil_mmx.c
parent91abb473fb8432226918da4fe03365ebaf688978 (diff)
downloadffmpeg-6aa6ea8e11ce58543d45e99c37cd3d6179a76af0.tar.gz
* reenabled original xy2 put routine - rounding error is really bad with
the new code * added PAVGP macros for parallel processing to safe few more cycles on celerons Originally committed as revision 625 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/i386/dsputil_mmx.c')
-rw-r--r--libavcodec/i386/dsputil_mmx.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/libavcodec/i386/dsputil_mmx.c b/libavcodec/i386/dsputil_mmx.c
index 58b0c23bbc..2e8baef4fe 100644
--- a/libavcodec/i386/dsputil_mmx.c
+++ b/libavcodec/i386/dsputil_mmx.c
@@ -107,17 +107,47 @@ static const uint64_t mm_wtwo __attribute__ ((aligned(8))) = 0x0002000200020002U
"psrlq $1, " #regb " \n\t"\
"psubb " #regb ", " #regr " \n\t"
+#define PAVGBP_MMX_NO_RND(rega, regb, regr, regc, regd, regp) \
+ "movq " #rega ", " #regr " \n\t"\
+ "movq " #regc ", " #regp " \n\t"\
+ "pand " #regb ", " #regr " \n\t"\
+ "pand " #regd ", " #regp " \n\t"\
+ "pxor " #rega ", " #regb " \n\t"\
+ "pxor " #regc ", " #regd " \n\t"\
+ "pand %%mm7, " #regb " \n\t"\
+ "pand %%mm7, " #regd " \n\t"\
+ "psrlq $1, " #regb " \n\t"\
+ "psrlq $1, " #regd " \n\t"\
+ "paddb " #regb ", " #regr " \n\t"\
+ "paddb " #regd ", " #regp " \n\t"
+
+#define PAVGBP_MMX(rega, regb, regr, regc, regd, regp) \
+ "movq " #rega ", " #regr " \n\t"\
+ "movq " #regc ", " #regp " \n\t"\
+ "por " #regb ", " #regr " \n\t"\
+ "por " #regd ", " #regp " \n\t"\
+ "pxor " #rega ", " #regb " \n\t"\
+ "pxor " #regc ", " #regd " \n\t"\
+ "pand %%mm7, " #regb " \n\t"\
+ "pand %%mm7, " #regd " \n\t"\
+ "psrlq $1, " #regd " \n\t"\
+ "psrlq $1, " #regb " \n\t"\
+ "psubb " #regb ", " #regr " \n\t"\
+ "psubb " #regd ", " #regp " \n\t"
+
/***********************************/
/* MMX no rounding */
#define DEF(x, y) x ## _no_rnd_ ## y ##_mmx
#define PAVGB(a, b) PAVGB_MMX_NO_RND(a, b, %%mm6)
#define PAVGBR(a, b, c) PAVGB_MMX_NO_RND(a, b, c)
+#define PAVGBP(a, b, c, d, e, f) PAVGBP_MMX_NO_RND(a, b, c, d, e, f)
#include "dsputil_mmx_rnd.h"
#undef DEF
#undef PAVGB
#undef PAVGBR
+#undef PAVGBP
/***********************************/
/* MMX rounding */
@@ -125,11 +155,13 @@ static const uint64_t mm_wtwo __attribute__ ((aligned(8))) = 0x0002000200020002U
#define PAVGB(a, b) PAVGB_MMX(a, b, %%mm6)
#define PAVGBR(a, b, c) PAVGB_MMX(a, b, c)
+#define PAVGBP(a, b, c, d, e, f) PAVGBP_MMX(a, b, c, d, e, f)
#include "dsputil_mmx_rnd.h"
#undef DEF
#undef PAVGB
#undef PAVGBR
+#undef PAVGBP
/***********************************/
/* 3Dnow specific */
@@ -339,7 +371,7 @@ static void put_pixels_mmx(UINT8 *block, const UINT8 *pixels, int line_size, int
);
}
-#if 0
+#if 1
static void put_pixels_xy2_mmx(UINT8 *block, const UINT8 *pixels, int line_size, int h)
{
UINT8 *p;