* reenabled original xy2 put routine - rounding error is really bad with
authorZdenek Kabelac <kabi@informatics.muni.cz>
Wed, 29 May 2002 19:57:21 +0000 (19:57 +0000)
committerZdenek Kabelac <kabi@informatics.muni.cz>
Wed, 29 May 2002 19:57:21 +0000 (19:57 +0000)
  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

libavcodec/i386/dsputil_mmx.c

index 58b0c23..2e8baef 100644 (file)
@@ -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;