changeset 446:efe0c0d40577 libavcodec

* 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
author kabi
date Wed, 29 May 2002 19:57:21 +0000
parents 62c01dbdc1e0
children 810f726ee3cc
files i386/dsputil_mmx.c
diffstat 1 files changed, 33 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/i386/dsputil_mmx.c	Wed May 29 17:16:22 2002 +0000
+++ b/i386/dsputil_mmx.c	Wed May 29 19:57:21 2002 +0000
@@ -107,17 +107,47 @@
     "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 @@
 
 #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 @@
 	);
 }
 
-#if 0
+#if 1
 static void put_pixels_xy2_mmx(UINT8 *block, const UINT8 *pixels, int line_size, int h)
 {
   UINT8 *p;