[FFmpeg-cvslog] r11829 - in trunk/libavcodec/i386: dsputil_mmx.c dsputil_mmx_avg.h

lorenm subversion
Sun Feb 3 18:04:33 CET 2008


Author: lorenm
Date: Sun Feb  3 18:04:33 2008
New Revision: 11829

Log:
avg_pixels4_mmx2


Modified:
   trunk/libavcodec/i386/dsputil_mmx.c
   trunk/libavcodec/i386/dsputil_mmx_avg.h

Modified: trunk/libavcodec/i386/dsputil_mmx.c
==============================================================================
--- trunk/libavcodec/i386/dsputil_mmx.c	(original)
+++ trunk/libavcodec/i386/dsputil_mmx.c	Sun Feb  3 18:04:33 2008
@@ -206,13 +206,11 @@ DECLARE_ALIGNED_16(const double, ff_pd_2
 #define put_pixels16_mmx2 put_pixels16_mmx
 #define put_pixels8_mmx2 put_pixels8_mmx
 #define put_pixels4_mmx2 put_pixels4_mmx
-#define avg_pixels4_mmx2 avg_pixels4_mmx
 #define put_no_rnd_pixels16_mmx2 put_no_rnd_pixels16_mmx
 #define put_no_rnd_pixels8_mmx2 put_no_rnd_pixels8_mmx
 #define put_pixels16_3dnow put_pixels16_mmx
 #define put_pixels8_3dnow put_pixels8_mmx
 #define put_pixels4_3dnow put_pixels4_mmx
-#define avg_pixels4_3dnow avg_pixels4_mmx
 #define put_no_rnd_pixels16_3dnow put_no_rnd_pixels16_mmx
 #define put_no_rnd_pixels8_3dnow put_no_rnd_pixels8_mmx
 

Modified: trunk/libavcodec/i386/dsputil_mmx_avg.h
==============================================================================
--- trunk/libavcodec/i386/dsputil_mmx_avg.h	(original)
+++ trunk/libavcodec/i386/dsputil_mmx_avg.h	Sun Feb  3 18:04:33 2008
@@ -795,6 +795,31 @@ static void DEF(avg_pixels8_xy2)(uint8_t
         :"%"REG_a,  "memory");
 }
 
+static void DEF(avg_pixels4)(uint8_t *block, const uint8_t *pixels, int line_size, int h)
+{
+    do {
+        asm volatile(
+            "movd (%1), %%mm0               \n\t"
+            "movd (%1, %2), %%mm1           \n\t"
+            "movd (%1, %2, 2), %%mm2        \n\t"
+            "movd (%1, %3), %%mm3           \n\t"
+            PAVGB" (%0), %%mm0              \n\t"
+            PAVGB" (%0, %2), %%mm1          \n\t"
+            PAVGB" (%0, %2, 2), %%mm2       \n\t"
+            PAVGB" (%0, %3), %%mm3          \n\t"
+            "movd %%mm0, (%1)               \n\t"
+            "movd %%mm1, (%1, %2)           \n\t"
+            "movd %%mm2, (%1, %2, 2)        \n\t"
+            "movd %%mm3, (%1, %3)           \n\t"
+            ::"S"(pixels), "D"(block),
+             "r" ((long)line_size), "r"(3L*line_size)
+            :"memory");
+        block += 4*line_size;
+        pixels += 4*line_size;
+        h -= 4;
+    } while(h > 0);
+}
+
 //FIXME the following could be optimized too ...
 static void DEF(put_no_rnd_pixels16_x2)(uint8_t *block, const uint8_t *pixels, int line_size, int h){
     DEF(put_no_rnd_pixels8_x2)(block  , pixels  , line_size, h);




More information about the ffmpeg-cvslog mailing list