Index: common/mc.c<br>===================================================================<br>--- common/mc.c&nbsp;&nbsp;&nbsp; (revision 745)<br>+++ common/mc.c&nbsp;&nbsp;&nbsp; (working copy)<br>@@ -336,6 +336,52 @@<br>&nbsp;void prefetch_ref_null( uint8_t *pix, int stride, int parity )<br>
&nbsp;{}<br>&nbsp;<br>+void x264_frame_init_lowres( x264_t *h, x264_frame_t *frame )<br>+{<br>+&nbsp;&nbsp;&nbsp; const int i_stride = frame-&gt;i_stride[0];<br>+&nbsp;&nbsp;&nbsp; const int i_stride2 = frame-&gt;i_stride_lowres;<br>+&nbsp;&nbsp;&nbsp; const int i_width2 = frame-&gt;i_width_lowres;<br>
+&nbsp;&nbsp;&nbsp; int x, y;<br>+&nbsp;&nbsp;&nbsp; uint8_t *src0 = frame-&gt;plane[0];<br>+&nbsp;&nbsp;&nbsp; uint8_t *dst0 = frame-&gt;lowres[0];<br>+&nbsp;&nbsp;&nbsp; uint8_t *dsth = frame-&gt;lowres[1];<br>+&nbsp;&nbsp;&nbsp; uint8_t *dstv = frame-&gt;lowres[2];<br>+&nbsp;&nbsp;&nbsp; uint8_t *dstc = frame-&gt;lowres[3];<br>
+&nbsp;&nbsp;&nbsp; /* Duplicate last column and row of pixels. */<br>+&nbsp;&nbsp;&nbsp; for(y=0; y&lt;frame-&gt;i_lines[0]; y++) src0[frame-&gt;i_width[0]+y*i_stride] = src0[frame-&gt;i_width[0]-1+y*i_stride];<br>+&nbsp;&nbsp;&nbsp; for(y=0; y&lt;frame-&gt;i_width[0]; y++) src0[y+i_stride*frame-&gt;i_lines[0]] = src0[y+i_stride*(frame-&gt;i_lines[0]-1)];<br>
+&nbsp;&nbsp;&nbsp; h-&gt;mc.frame_init_lowres_core(i_stride, i_stride2, frame-&gt;i_lines_lowres, i_width2, src0, dst0, dsth, dstv, dstc );<br>+<br>+&nbsp;&nbsp;&nbsp; for( y = 0; y &lt; 16; y++ )<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( x = 0; x &lt; 16; x++ )<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame-&gt;i_cost_est[x][y] = -1;<br>
+<br>+&nbsp;&nbsp;&nbsp; x264_frame_expand_border_lowres( frame );<br>+}<br>+<br>+void frame_init_lowres_core(int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc)<br>
+{<br>+&nbsp;&nbsp;&nbsp; int x,y;<br>+&nbsp;&nbsp;&nbsp; for( y = 0; y &lt; height; y++ )<br>+&nbsp;&nbsp;&nbsp; {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src1 = src0+src_stride;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src2 = src1+src_stride;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( x = 0; x &lt; width; x++ )<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Slower in order to match assembly output.<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst0[x] = (((src0[2*x&nbsp; ] + src0[2*x+1] + 1) &gt;&gt; 1) + ((src1[2*x&nbsp; ] + src1[2*x+1] + 1) &gt;&gt; 1) + 1) &gt;&gt; 1;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsth[x] = (((src0[2*x+1] + src0[2*x+2] + 1) &gt;&gt; 1) + ((src1[2*x+1] + src1[2*x+2] + 1) &gt;&gt; 1) + 1) &gt;&gt; 1;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstv[x] = (((src1[2*x&nbsp; ] + src1[2*x+1] + 1) &gt;&gt; 1) + ((src2[2*x&nbsp; ] + src2[2*x+1] + 1) &gt;&gt; 1) + 1) &gt;&gt; 1;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstc[x] = (((src1[2*x+1] + src1[2*x+2] + 1) &gt;&gt; 1) + ((src2[2*x+1] + src2[2*x+2] + 1) &gt;&gt; 1) + 1) &gt;&gt; 1;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src0 += src_stride*2;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst0 += dest_stride;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsth += dest_stride;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstv += dest_stride;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstc += dest_stride;<br>+&nbsp;&nbsp;&nbsp; }<br>+}<br>+<br>&nbsp;void x264_mc_init( int cpu, x264_mc_functions_t *pf )<br>
&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;mc_luma&nbsp;&nbsp; = mc_luma;<br>@@ -373,11 +419,14 @@<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;prefetch_fenc = prefetch_fenc_null;<br>&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;prefetch_ref&nbsp; = prefetch_ref_null;<br>+&nbsp;&nbsp;&nbsp; pf-&gt;frame_init_lowres_core = frame_init_lowres_core;<br>
&nbsp;<br>&nbsp;#ifdef HAVE_MMX<br>&nbsp;&nbsp;&nbsp;&nbsp; x264_mc_init_mmx( cpu, pf );<br>&nbsp;&nbsp;&nbsp;&nbsp; if( cpu&amp;X264_CPU_MMXEXT )<br>+&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;mc_chroma = x264_mc_chroma_mmxext;<br>+&nbsp;&nbsp;&nbsp; }<br>&nbsp;#endif<br>&nbsp;#ifdef ARCH_PPC<br>&nbsp;&nbsp;&nbsp;&nbsp; if( cpu&amp;X264_CPU_ALTIVEC )<br>
@@ -442,42 +491,3 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;}<br>-<br>-void x264_frame_init_lowres( x264_t *h, x264_frame_t *frame )<br>-{<br>-&nbsp;&nbsp;&nbsp; // FIXME: tapfilter?<br>-&nbsp;&nbsp;&nbsp; const int i_stride = frame-&gt;i_stride[0];<br>-&nbsp;&nbsp;&nbsp; const int i_stride2 = frame-&gt;i_stride_lowres;<br>
-&nbsp;&nbsp;&nbsp; const int i_width2 = frame-&gt;i_width_lowres;<br>-&nbsp;&nbsp;&nbsp; int x, y, i;<br>-&nbsp;&nbsp;&nbsp; for( y = 0; y &lt; frame-&gt;i_lines_lowres - 1; y++ )<br>-&nbsp;&nbsp;&nbsp; {<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src0 = &amp;frame-&gt;plane[0][2*y*i_stride];<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src1 = src0+i_stride;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src2 = src1+i_stride;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *dst0 = &amp;frame-&gt;lowres[0][y*i_stride2];<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *dsth = &amp;frame-&gt;lowres[1][y*i_stride2];<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *dstv = &amp;frame-&gt;lowres[2][y*i_stride2];<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *dstc = &amp;frame-&gt;lowres[3][y*i_stride2];<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( x = 0; x &lt; i_width2 - 1; x++ )<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst0[x] = (src0[2*x&nbsp; ] + src0[2*x+1] + src1[2*x&nbsp; ] + src1[2*x+1] + 2) &gt;&gt; 2;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsth[x] = (src0[2*x+1] + src0[2*x+2] + src1[2*x+1] + src1[2*x+2] + 2) &gt;&gt; 2;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstv[x] = (src1[2*x&nbsp; ] + src1[2*x+1] + src2[2*x&nbsp; ] + src2[2*x+1] + 2) &gt;&gt; 2;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstc[x] = (src1[2*x+1] + src1[2*x+2] + src2[2*x+1] + src2[2*x+2] + 2) &gt;&gt; 2;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst0[x] = (src0[2*x&nbsp; ] + src0[2*x+1] + src1[2*x&nbsp; ] + src1[2*x+1] + 2) &gt;&gt; 2;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstv[x] = (src1[2*x&nbsp; ] + src1[2*x+1] + src2[2*x&nbsp; ] + src2[2*x+1] + 2) &gt;&gt; 2;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsth[x] = (src0[2*x+1] + src1[2*x+1] + 1) &gt;&gt; 1;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstc[x] = (src1[2*x+1] + src2[2*x+1] + 1) &gt;&gt; 1;<br>-&nbsp;&nbsp;&nbsp; }<br>-&nbsp;&nbsp;&nbsp; for( i = 0; i &lt; 4; i++ )<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy( &amp;frame-&gt;lowres[i][y*i_stride2], &amp;frame-&gt;lowres[i][(y-1)*i_stride2], i_width2 );<br>
-<br>-&nbsp;&nbsp;&nbsp; for( y = 0; y &lt; 16; y++ )<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( x = 0; x &lt; 16; x++ )<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame-&gt;i_cost_est[x][y] = -1;<br>-<br>-&nbsp;&nbsp;&nbsp; x264_frame_expand_border_lowres( frame );<br>-}<br>-<br>Index: common/mc.h<br>===================================================================<br>
--- common/mc.h&nbsp;&nbsp;&nbsp; (revision 745)<br>+++ common/mc.h&nbsp;&nbsp;&nbsp; (working copy)<br>@@ -65,7 +65,9 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *pix_uv, int stride_uv, int mb_x );<br>&nbsp;&nbsp;&nbsp;&nbsp; /* prefetch the next few macroblocks of a hpel reference frame */<br>
&nbsp;&nbsp;&nbsp;&nbsp; void (*prefetch_ref)( uint8_t *pix, int stride, int parity );<br>-<br>+&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp; /* Lowres frame context init */<br>+&nbsp;&nbsp;&nbsp; void (*frame_init_lowres_core)( int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc );<br>
&nbsp;} x264_mc_functions_t;<br>&nbsp;<br>&nbsp;void x264_mc_init( int cpu, x264_mc_functions_t *pf );<br>Index: common/i386/mc-a.asm<br>===================================================================<br>--- common/i386/mc-a.asm&nbsp;&nbsp;&nbsp; (revision 745)<br>
+++ common/i386/mc-a.asm&nbsp;&nbsp;&nbsp; (working copy)<br>@@ -128,21 +128,23 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; movdqa [eax+ebx], xmm1<br>&nbsp;AVG_END<br>&nbsp;<br>-%macro AVGH 2<br>-cglobal x264_pixel_avg_%1x%2_mmxext<br>+%macro AVGH 3<br>+cglobal x264_pixel_avg_%1x%2_%3<br>
&nbsp;&nbsp;&nbsp;&nbsp; push esi<br>&nbsp;&nbsp;&nbsp;&nbsp; mov esi, %2<br>-&nbsp;&nbsp;&nbsp; jmp x264_pixel_avg_w%1_mmxext<br>+&nbsp;&nbsp;&nbsp; jmp x264_pixel_avg_w%1_%3<br>&nbsp;%endmacro<br>&nbsp;<br>-AVGH 16, 16<br>-AVGH 16, 8<br>-AVGH 8, 16<br>-AVGH 8, 8<br>-AVGH 8, 4<br>-AVGH 4, 8<br>-AVGH 4, 4<br>
-AVGH 4, 2<br>+AVGH 16, 16, mmxext<br>+AVGH 16, 8, mmxext<br>+AVGH 8, 16, mmxext<br>+AVGH 8, 8, mmxext<br>+AVGH 8, 4, mmxext<br>+AVGH 4, 8, mmxext<br>+AVGH 4, 4, mmxext<br>+AVGH 4, 2, mmxext<br>+AVGH 16, 16, sse2<br>+AVGH 16, 8, sse2<br>
&nbsp;<br>&nbsp;%macro AVG2_START 1<br>&nbsp;cglobal %1<br>@@ -191,6 +193,21 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; movq&nbsp;&nbsp; [eax+ebx], mm1<br>&nbsp;AVG2_END<br>&nbsp;<br>+AVG2_START x264_pixel_avg2_w12_mmxext<br>+&nbsp;&nbsp;&nbsp; movq&nbsp;&nbsp; mm0, [ecx]<br>+&nbsp;&nbsp;&nbsp; movd&nbsp;&nbsp; mm1, [ecx+8]<br>+&nbsp;&nbsp;&nbsp; movq&nbsp;&nbsp; mm2, [ecx+edx]<br>
+&nbsp;&nbsp;&nbsp; movd&nbsp;&nbsp; mm3, [ecx+edx+8]<br>+&nbsp;&nbsp;&nbsp; pavgb&nbsp; mm0, [ecx+edi]<br>+&nbsp;&nbsp;&nbsp; pavgb&nbsp; mm1, [ecx+edi+8]<br>+&nbsp;&nbsp;&nbsp; pavgb&nbsp; mm2, [ecx+ebp]<br>+&nbsp;&nbsp;&nbsp; pavgb&nbsp; mm3, [ecx+ebp+8]<br>+&nbsp;&nbsp;&nbsp; movq&nbsp;&nbsp; [eax], mm0<br>+&nbsp;&nbsp;&nbsp; movd&nbsp;&nbsp; [eax+8], mm1<br>+&nbsp;&nbsp;&nbsp; movq&nbsp;&nbsp; [eax+ebx], mm2<br>
+&nbsp;&nbsp;&nbsp; movd&nbsp;&nbsp; [eax+ebx+8], mm3<br>+AVG2_END<br>+<br>&nbsp;AVG2_START x264_pixel_avg2_w16_mmxext<br>&nbsp;&nbsp;&nbsp;&nbsp; movq&nbsp;&nbsp; mm0, [ecx]<br>&nbsp;&nbsp;&nbsp;&nbsp; movq&nbsp;&nbsp; mm1, [ecx+8]<br>@@ -227,7 +244,33 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; movd&nbsp;&nbsp; [eax+ebx+16], mm5<br>&nbsp;AVG2_END<br>&nbsp;<br>
+AVG2_START x264_pixel_avg2_w16_sse2<br>+&nbsp;&nbsp;&nbsp; movdqu xmm0, [ecx]<br>+&nbsp;&nbsp;&nbsp; movdqu xmm2, [ecx+edi]<br>+&nbsp;&nbsp;&nbsp; movdqu xmm1, [ecx+edx]<br>+&nbsp;&nbsp;&nbsp; movdqu xmm3, [ecx+ebp]<br>+&nbsp;&nbsp;&nbsp; pavgb&nbsp; xmm0, xmm2<br>+&nbsp;&nbsp;&nbsp; pavgb&nbsp; xmm1, xmm3<br>+&nbsp;&nbsp;&nbsp; movdqa [eax], xmm0<br>
+&nbsp;&nbsp;&nbsp; movdqa [eax+ebx], xmm1<br>+AVG2_END<br>&nbsp;<br>+AVG2_START x264_pixel_avg2_w20_sse2<br>+&nbsp;&nbsp;&nbsp; movdqu xmm0, [ecx]<br>+&nbsp;&nbsp;&nbsp; movdqu xmm2, [ecx+edi]<br>+&nbsp;&nbsp;&nbsp; movdqu xmm1, [ecx+edx]<br>+&nbsp;&nbsp;&nbsp; movdqu xmm3, [ecx+ebp]<br>+&nbsp;&nbsp;&nbsp; movd&nbsp;&nbsp; mm2,&nbsp; [ecx+16]<br>
+&nbsp;&nbsp;&nbsp; movd&nbsp;&nbsp; mm5,&nbsp; [ecx+edx+16]<br>+&nbsp;&nbsp;&nbsp; pavgb&nbsp; xmm0, xmm2<br>+&nbsp;&nbsp;&nbsp; pavgb&nbsp; xmm1, xmm3<br>+&nbsp;&nbsp;&nbsp; pavgb&nbsp; mm2,&nbsp; [ecx+edi+16]<br>+&nbsp;&nbsp;&nbsp; pavgb&nbsp; mm5,&nbsp; [ecx+ebp+16]<br>+&nbsp;&nbsp;&nbsp; movdqa [eax], xmm0<br>+&nbsp;&nbsp;&nbsp; movd&nbsp;&nbsp; [eax+16], mm2<br>+&nbsp;&nbsp;&nbsp; movdqa [eax+ebx], xmm1<br>
+&nbsp;&nbsp;&nbsp; movd&nbsp;&nbsp; [eax+ebx+16], mm5<br>+AVG2_END<br>&nbsp;<br>&nbsp;;=============================================================================<br>&nbsp;; weighted prediction<br>Index: common/i386/mc-c.c<br>===================================================================<br>
--- common/i386/mc-c.c&nbsp;&nbsp;&nbsp; (revision 745)<br>+++ common/i386/mc-c.c&nbsp;&nbsp;&nbsp; (working copy)<br>@@ -28,6 +28,8 @@<br>&nbsp;#include &quot;common/common.h&quot;<br>&nbsp;<br>&nbsp;/* NASM functions */<br>+extern void x264_pixel_avg_16x16_sse2( uint8_t *, int, uint8_t *, int );<br>
+extern void x264_pixel_avg_16x8_sse2( uint8_t *, int, uint8_t *, int );<br>&nbsp;extern void x264_pixel_avg_16x16_mmxext( uint8_t *, int, uint8_t *, int );<br>&nbsp;extern void x264_pixel_avg_16x8_mmxext( uint8_t *, int, uint8_t *, int );<br>
&nbsp;extern void x264_pixel_avg_8x16_mmxext( uint8_t *, int, uint8_t *, int );<br>@@ -38,8 +40,11 @@<br>&nbsp;extern void x264_pixel_avg_4x2_mmxext( uint8_t *, int, uint8_t *, int );<br>&nbsp;extern void x264_pixel_avg2_w4_mmxext( uint8_t *, int, uint8_t *, int, uint8_t *, int );<br>
&nbsp;extern void x264_pixel_avg2_w8_mmxext( uint8_t *, int, uint8_t *, int, uint8_t *, int );<br>+extern void x264_pixel_avg2_w12_mmxext( uint8_t *, int, uint8_t *, int, uint8_t *, int );<br>&nbsp;extern void x264_pixel_avg2_w16_mmxext( uint8_t *, int, uint8_t *, int, uint8_t *, int );<br>
&nbsp;extern void x264_pixel_avg2_w20_mmxext( uint8_t *, int, uint8_t *, int, uint8_t *, int );<br>+extern void x264_pixel_avg2_w16_sse2( uint8_t *, int, uint8_t *, int, uint8_t *, int );<br>+extern void x264_pixel_avg2_w20_sse2( uint8_t *, int, uint8_t *, int, uint8_t *, int );<br>
&nbsp;extern void x264_pixel_avg_weight_4x4_mmxext( uint8_t *, int, uint8_t *, int, int );<br>&nbsp;extern void x264_pixel_avg_weight_w8_mmxext( uint8_t *, int, uint8_t *, int, int, int );<br>&nbsp;extern void x264_pixel_avg_weight_w16_mmxext( uint8_t *, int, uint8_t *, int, int, int );<br>
@@ -52,7 +57,16 @@<br>&nbsp;extern void x264_prefetch_ref_mmxext( uint8_t *, int, int );<br>&nbsp;extern void x264_hpel_filter_mmxext( uint8_t *dsth, uint8_t *dstv, uint8_t *dstc, uint8_t *src,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i_stride, int i_width, int i_height );<br>
+extern void frame_init_lowres_core_ssse3_w64( int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc );<br>+extern void frame_init_lowres_core_ssse3_w32( int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc );<br>
+extern void frame_init_lowres_core_ssse3_w16( int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc );<br>+extern void frame_init_lowres_core_sse2_w64( int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc );<br>
+extern void frame_init_lowres_core_sse2_w32( int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc );<br>+extern void frame_init_lowres_core_sse2_w16( int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc );<br>
+extern void frame_init_lowres_core_mmx_w32( int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc );<br>+extern void frame_init_lowres_core_mmx_w16( int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc );<br>
&nbsp;<br>+<br>&nbsp;#define AVG_WEIGHT(W,H) \<br>&nbsp;void x264_pixel_avg_weight_ ## W ## x ## H ## _mmxext( uint8_t *dst, int i_dst, uint8_t *src, int i_src, int i_weight_dst ) \<br>&nbsp;{ \<br>@@ -69,9 +83,9 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; NULL,<br>&nbsp;&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w4_mmxext,<br>
&nbsp;&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w8_mmxext,<br>+&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w12_mmxext,<br>&nbsp;&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w16_mmxext,<br>-&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w16_mmxext,<br>-&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w20_mmxext,<br>+&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w20_mmxext<br>&nbsp;};<br>
&nbsp;static void (* const x264_mc_copy_wtab_mmx[5])( uint8_t *, int, uint8_t *, int, int ) =<br>&nbsp;{<br>@@ -81,57 +95,122 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; NULL,<br>&nbsp;&nbsp;&nbsp;&nbsp; x264_mc_copy_w16_mmx<br>&nbsp;};<br>+static void (* const x264_pixel_avg_wtab_sse2[6])( uint8_t *, int, uint8_t *, int, uint8_t *, int ) =<br>
+{<br>+&nbsp;&nbsp;&nbsp; NULL,<br>+&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w4_mmxext,<br>+&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w8_mmxext,<br>+&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w12_mmxext,<br>+&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w16_sse2,<br>+&nbsp;&nbsp;&nbsp; x264_pixel_avg2_w20_sse2<br>+};<br>+static void (* const x264_mc_copy_wtab_sse2[5])( uint8_t *, int, uint8_t *, int, int ) =<br>
+{<br>+&nbsp;&nbsp;&nbsp; NULL,<br>+&nbsp;&nbsp;&nbsp; x264_mc_copy_w4_mmx,<br>+&nbsp;&nbsp;&nbsp; x264_mc_copy_w8_mmx,<br>+&nbsp;&nbsp;&nbsp; NULL,<br>+&nbsp;&nbsp;&nbsp; x264_mc_copy_w16_sse2<br>+};<br>&nbsp;static const int hpel_ref0[16] = {0,1,1,1,0,1,1,1,2,3,3,3,0,1,1,1};<br>&nbsp;static const int hpel_ref1[16] = {0,0,0,0,2,2,3,2,2,2,3,2,2,2,3,2};<br>
&nbsp;<br>-void mc_luma_mmxext( uint8_t *dst,&nbsp;&nbsp;&nbsp; int i_dst_stride,<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src[4], int i_src_stride,<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mvx, int mvy,<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i_width, int i_height )<br>
-{<br>-&nbsp;&nbsp;&nbsp; int qpel_idx = ((mvy&amp;3)&lt;&lt;2) + (mvx&amp;3);<br>-&nbsp;&nbsp;&nbsp; int offset = (mvy&gt;&gt;2)*i_src_stride + (mvx&gt;&gt;2);<br>-&nbsp;&nbsp;&nbsp; uint8_t *src1 = src[hpel_ref0[qpel_idx]] + offset + ((mvy&amp;3) == 3) * i_src_stride;<br>
+#define MC_LUMA(name,instr1,instr2)\<br>+void mc_luma_##name( uint8_t *dst,&nbsp;&nbsp;&nbsp; int i_dst_stride,\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src[4], int i_src_stride,\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mvx, int mvy,\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i_width, int i_height )\<br>
+{\<br>+&nbsp;&nbsp;&nbsp; int qpel_idx = ((mvy&amp;3)&lt;&lt;2) + (mvx&amp;3);\<br>+&nbsp;&nbsp;&nbsp; int offset = (mvy&gt;&gt;2)*i_src_stride + (mvx&gt;&gt;2);\<br>+&nbsp;&nbsp;&nbsp; uint8_t *src1 = src[hpel_ref0[qpel_idx]] + offset + ((mvy&amp;3) == 3) * i_src_stride;\<br>
+&nbsp;&nbsp;&nbsp; if( qpel_idx &amp; 5 ) /* qpel interpolation needed */\<br>+&nbsp;&nbsp;&nbsp; {\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src2 = src[hpel_ref1[qpel_idx]] + offset + ((mvx&amp;3) == 3);\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x264_pixel_avg_wtab_##instr1[i_width&gt;&gt;2](\<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst, i_dst_stride, src1, i_src_stride,\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src2, i_height );\<br>+&nbsp;&nbsp;&nbsp; }\<br>+&nbsp;&nbsp;&nbsp; else\<br>+&nbsp;&nbsp;&nbsp; {\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x264_mc_copy_wtab_##instr2[i_width&gt;&gt;2](\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst, i_dst_stride, src1, i_src_stride, i_height );\<br>
+&nbsp;&nbsp;&nbsp; }\<br>+}<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp; if( qpel_idx &amp; 5 ) /* qpel interpolation needed */<br>-&nbsp;&nbsp;&nbsp; {<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src2 = src[hpel_ref1[qpel_idx]] + offset + ((mvx&amp;3) == 3);<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x264_pixel_avg_wtab_mmxext[i_width&gt;&gt;2](<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst, i_dst_stride, src1, i_src_stride,<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src2, i_height );<br>-&nbsp;&nbsp;&nbsp; }<br>-&nbsp;&nbsp;&nbsp; else<br>-&nbsp;&nbsp;&nbsp; {<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x264_mc_copy_wtab_mmx[i_width&gt;&gt;2](<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst, i_dst_stride, src1, i_src_stride, i_height );<br>
-&nbsp;&nbsp;&nbsp; }<br>+MC_LUMA(mmxext,mmxext,mmx)<br>+MC_LUMA(sse2,sse2,sse2)<br>+#include &quot;bench.h&quot;<br>+#define GET_REF(name)\<br>+uint8_t *get_ref_##name( uint8_t *dst,&nbsp;&nbsp; int *i_dst_stride,\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src[4], int i_src_stride,\<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mvx, int mvy,\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i_width, int i_height )\<br>+{\<br>+&nbsp;&nbsp;&nbsp; int qpel_idx = ((mvy&amp;3)&lt;&lt;2) + (mvx&amp;3);\<br>+&nbsp;&nbsp;&nbsp; int offset = (mvy&gt;&gt;2)*i_src_stride + (mvx&gt;&gt;2);\<br>
+&nbsp;&nbsp;&nbsp; uint8_t *src1 = src[hpel_ref0[qpel_idx]] + offset + ((mvy&amp;3) == 3) * i_src_stride;\<br>+&nbsp;&nbsp;&nbsp; if( qpel_idx &amp; 5 ) /* qpel interpolation needed */\<br>+&nbsp;&nbsp;&nbsp; {\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src2 = src[hpel_ref1[qpel_idx]] + offset + ((mvx&amp;3) == 3);\<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x264_pixel_avg_wtab_##name[i_width&gt;&gt;2](\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst, *i_dst_stride, src1, i_src_stride,\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src2, i_height );\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return dst;\<br>+&nbsp;&nbsp;&nbsp; }\<br>+&nbsp;&nbsp;&nbsp; else\<br>+&nbsp;&nbsp;&nbsp; {\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *i_dst_stride = i_src_stride;\<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return src1;\<br>+&nbsp;&nbsp;&nbsp; }\<br>&nbsp;}<br>&nbsp;<br>-uint8_t *get_ref_mmxext( uint8_t *dst,&nbsp;&nbsp; int *i_dst_stride,<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src[4], int i_src_stride,<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int mvx, int mvy,<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i_width, int i_height )<br>+GET_REF(mmxext)<br>+GET_REF(sse2)<br>+<br>+void frame_init_lowres_core_mmx(int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc)<br>
&nbsp;{<br>-&nbsp;&nbsp;&nbsp; int qpel_idx = ((mvy&amp;3)&lt;&lt;2) + (mvx&amp;3);<br>-&nbsp;&nbsp;&nbsp; int offset = (mvy&gt;&gt;2)*i_src_stride + (mvx&gt;&gt;2);<br>-&nbsp;&nbsp;&nbsp; uint8_t *src1 = src[hpel_ref0[qpel_idx]] + offset + ((mvy&amp;3) == 3) * i_src_stride;<br>
-<br>-&nbsp;&nbsp;&nbsp; if( qpel_idx &amp; 5 ) /* qpel interpolation needed */<br>+&nbsp;&nbsp;&nbsp; int x;<br>+&nbsp;&nbsp;&nbsp; width = width &gt;&gt; 2;<br>+&nbsp;&nbsp;&nbsp; for( x = 0; width - x &gt;= 2; x++ )<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src2 = src[hpel_ref1[qpel_idx]] + offset + ((mvx&amp;3) == 3);<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x264_pixel_avg_wtab_mmxext[i_width&gt;&gt;2](<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst, *i_dst_stride, src1, i_src_stride,<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src2, i_height );<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return dst;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame_init_lowres_core_sse2_w32(src_stride, dest_stride, height, width, src0, dst0, dsth, dstv, dstc );<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src0 += 32;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dst0 += 16;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dsth += 16;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstv += 16;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dstc += 16;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x++;<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>-&nbsp;&nbsp;&nbsp; else<br>+&nbsp;&nbsp;&nbsp; if(width - x == 1)<br>&nbsp;&nbsp;&nbsp;&nbsp; {<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *i_dst_stride = i_src_stride;<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return src1;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame_init_lowres_core_sse2_w16(src_stride, dest_stride, height, width, src0, dst0, dsth, dstv, dstc );<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;}<br>&nbsp;<br>+#define FRAME_INIT_SSE(name)\<br>+void frame_init_lowres_core_##name(int src_stride, int dest_stride, int height, int width, uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc)\<br>
+{\<br>+&nbsp;&nbsp;&nbsp; int x; width = width &gt;&gt; 3;\<br>+&nbsp;&nbsp;&nbsp; for( x = 0; width - x &gt;= 4; x++ )\<br>+&nbsp;&nbsp;&nbsp; {\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame_init_lowres_core_##name##_w64(src_stride, dest_stride, height, width, src0, dst0, dsth, dstv, dstc );\<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src0 += 64; dst0 += 32; dsth += 32; dstv += 32; dstc += 32; x+=3;\<br>+&nbsp;&nbsp;&nbsp; }\<br>+&nbsp;&nbsp;&nbsp; for( x = 0; width - x &gt;= 2; x++ )\<br>+&nbsp;&nbsp;&nbsp; {\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame_init_lowres_core_##name##_w32(src_stride, dest_stride, height, width, src0, dst0, dsth, dstv, dstc );\<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src0 += 32; dst0 += 16; dsth += 16; dstv += 16; dstc += 16; x++;\<br>+&nbsp;&nbsp;&nbsp; }\<br>+&nbsp;&nbsp;&nbsp; if(width - x == 1)\<br>+&nbsp;&nbsp;&nbsp; {\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame_init_lowres_core_##name##_w16(src_stride, dest_stride, height, width, src0, dst0, dsth, dstv, dstc );\<br>
+&nbsp;&nbsp;&nbsp; }\<br>+}<br>&nbsp;<br>+FRAME_INIT_SSE(sse2)<br>+FRAME_INIT_SSE(ssse3)<br>+<br>&nbsp;void x264_mc_init_mmx( int cpu, x264_mc_functions_t *pf )<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp; if( !(cpu&amp;X264_CPU_MMX) )<br>@@ -169,6 +248,19 @@<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;prefetch_fenc = x264_prefetch_fenc_mmxext;<br>
&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;prefetch_ref&nbsp; = x264_prefetch_ref_mmxext;<br>-<br>-&nbsp;&nbsp;&nbsp; /* todo: use sse2 */<br>+&nbsp;&nbsp;&nbsp; // disable on AMD processors since it is slower<br>+&nbsp;&nbsp;&nbsp; if( (cpu&amp;X264_CPU_SSE2) &amp;&amp; !(cpu&amp;X264_CPU_3DNOW) )<br>
+&nbsp;&nbsp;&nbsp; {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;avg[PIXEL_16x16] = x264_pixel_avg_16x16_sse2;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;avg[PIXEL_16x8]&nbsp; = x264_pixel_avg_16x8_sse2;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;mc_luma = mc_luma_sse2;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;get_ref = get_ref_sse2;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;frame_init_lowres_core = frame_init_lowres_core_sse2;<br>+&nbsp;&nbsp;&nbsp; }<br>+&nbsp;&nbsp;&nbsp; #ifdef HAVE_SSE3<br>+&nbsp;&nbsp;&nbsp; if( cpu&amp;X264_CPU_SSSE3 )<br>+&nbsp;&nbsp;&nbsp; {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pf-&gt;frame_init_lowres_core = frame_init_lowres_core_ssse3;<br>
+&nbsp;&nbsp;&nbsp; }<br>+#endif //HAVE_SSE3<br>&nbsp;}<br>Index: common/i386/dct-a.asm<br>===================================================================<br>--- common/i386/dct-a.asm&nbsp;&nbsp;&nbsp; (revision 745)<br>+++ common/i386/dct-a.asm&nbsp;&nbsp;&nbsp; (working copy)<br>
@@ -711,7 +711,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; MMX_STORE_DIFF_8P xmm0, [ecx+FDEC_STRIDE*6], xmm6, xmm7<br>&nbsp;&nbsp;&nbsp;&nbsp; MMX_STORE_DIFF_8P xmm1, [ecx+FDEC_STRIDE*7], xmm6, xmm7<br>&nbsp;&nbsp;&nbsp;&nbsp; ret<br>-<br>+&nbsp;&nbsp; <br>&nbsp;;-----------------------------------------------------------------------------<br>
&nbsp;;&nbsp;&nbsp; void __cdecl x264_sub8x8_dct_mmx( int16_t dct[4][4][4],<br>&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *pix1, uint8_t *pix2 )<br>Index: common/i386/mc-a2.asm<br>===================================================================<br>
--- common/i386/mc-a2.asm&nbsp;&nbsp;&nbsp; (revision 745)<br>+++ common/i386/mc-a2.asm&nbsp;&nbsp;&nbsp; (working copy)<br>@@ -33,6 +33,7 @@<br>&nbsp;SECTION_RODATA<br>&nbsp;<br>&nbsp;ALIGN 16<br>+pw_255: times 8 dw 255<br>&nbsp;pw_1:&nbsp; times 4 dw 1<br>&nbsp;pw_16: times 4 dw 16<br>
&nbsp;pw_32: times 4 dw 32<br>@@ -324,4 +325,266 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; edi<br>&nbsp;&nbsp;&nbsp;&nbsp; emms<br>&nbsp;&nbsp;&nbsp;&nbsp; ret<br>+&nbsp;&nbsp;&nbsp; <br>+%macro FILTER_START 2<br>+&nbsp;&nbsp;&nbsp; picgetgot eax<br>+&nbsp;&nbsp;&nbsp; mov%2 %1, [pw_255 GLOBAL]<br>+&nbsp;&nbsp;&nbsp; push ebx<br>+&nbsp;&nbsp;&nbsp; push edi<br>+&nbsp;&nbsp;&nbsp; push esi<br>
+&nbsp;&nbsp;&nbsp; push ebp<br>+&nbsp;&nbsp;&nbsp; mov ebp, [esp+4+16 ]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;src_stride&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp; mov eax, [esp+20+16]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;source<br>+&nbsp;&nbsp;&nbsp; mov ebx, [esp+24+16]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;dest0<br>+&nbsp;&nbsp;&nbsp; mov ecx, [esp+28+16]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;desth<br>+&nbsp;&nbsp;&nbsp; mov edx, [esp+32+16]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;destv<br>
+&nbsp;&nbsp;&nbsp; mov edi, [esp+36+16]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;destc<br>+&nbsp;&nbsp;&nbsp; mov esi, [esp+8+16 ]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;dest_stride<br>+%endmacro<br>&nbsp;<br>+%macro FILTER_END 0<br>+&nbsp;&nbsp;&nbsp; pop ebp<br>+&nbsp;&nbsp;&nbsp; pop esi<br>+&nbsp;&nbsp;&nbsp; pop edi<br>+&nbsp;&nbsp;&nbsp; pop ebx<br>+&nbsp;&nbsp;&nbsp; ret<br>+%endmacro<br>
+<br>+%macro FILTER_PREFETCH 1<br>+&nbsp;&nbsp;&nbsp; prefetch [eax+ebp*%1]<br>+&nbsp;&nbsp;&nbsp; prefetch [ebx+esi*%1]<br>+&nbsp;&nbsp;&nbsp; prefetch [ecx+esi*%1]<br>+&nbsp;&nbsp;&nbsp; prefetch [edx+esi*%1]<br>+&nbsp;&nbsp;&nbsp; prefetch [edi+esi*%1]<br>+%endmacro<br>+<br>+%macro INIT_LOAD 3<br>
+&nbsp;&nbsp;&nbsp; mov%3 %1, [eax+1+%2]<br>+&nbsp;&nbsp;&nbsp; pavgb %1, [eax+%2]<br>+%endmacro<br>+<br>+%macro WIDTH_FILTER 11<br>+&nbsp;&nbsp;&nbsp; mov%8 %1, [eax+1+ebp+%6]<br>+&nbsp;&nbsp;&nbsp; pavgb %1, [eax+ebp+%6]<br>+&nbsp;&nbsp;&nbsp; mov%9 %2, %1<br>+&nbsp;&nbsp;&nbsp; pavgb %1, %3<br>+&nbsp;&nbsp;&nbsp; mov%9 %3, %2<br>
+&nbsp;&nbsp;&nbsp; pand %1, %11<br>+&nbsp;&nbsp;&nbsp; psrlw %2, 8<br>+&nbsp;&nbsp;&nbsp; packuswb %1, %1<br>+&nbsp;&nbsp;&nbsp; packuswb %2, %2<br>+&nbsp;&nbsp;&nbsp; mov%10 [%4+%7], %1<br>+&nbsp;&nbsp;&nbsp; mov%10 [%5+%7], %2<br>+%endmacro<br>+<br>+%macro WIDTH16_FILTER_SSSE3 7<br>+&nbsp;&nbsp;&nbsp; movdqa %2, [eax+ebp+%6]<br>
+&nbsp;&nbsp;&nbsp; movdqa xmm6, [eax+16+ebp+%6]<br>+&nbsp;&nbsp;&nbsp; movdqa %1, %2<br>+&nbsp;&nbsp;&nbsp; palignr %2, xmm6, 1<br>+&nbsp;&nbsp;&nbsp; movdqa %2, %1<br>+&nbsp;&nbsp;&nbsp; pavgb %1, %3<br>+&nbsp;&nbsp;&nbsp; movdqa %3, %2<br>+&nbsp;&nbsp;&nbsp; pand %1, xmm7<br>+&nbsp;&nbsp;&nbsp; psrlw %2, 8<br>+&nbsp;&nbsp;&nbsp; packuswb %1, %1<br>+&nbsp;&nbsp;&nbsp; packuswb %2, %2<br>
+&nbsp;&nbsp;&nbsp; movq [%4+%7], %1<br>+&nbsp;&nbsp;&nbsp; movq [%5+%7], %2<br>+%endmacro<br>+<br>+%macro WIDTH8_FILTER_MMX 7<br>+&nbsp;&nbsp;&nbsp; WIDTH_FILTER %1, %2, %3, %4, %5, %6, %7, q, q, d, mm7<br>+%endmacro<br>+<br>+%macro WIDTH16_FILTER_SSE2 7<br>+&nbsp;&nbsp;&nbsp; WIDTH_FILTER %1, %2, %3, %4, %5, %6, %7, dqu, dqa, q, xmm7<br>
+%endmacro<br>+<br>+%macro LOWRES_FILTER_STEP_W64_SSE 3<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm2, %1, %2, 0, 0<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm3, %1, %2, 16, 8<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm4, %1, %2, 32, 16<br>
+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm5, %1, %2, 48, 24<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm2, %1, %2, 0, 0<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm3, %1, %2, 16, 8<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm4, %1, %2, 32, 16<br>
+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm5, %1, %2, 48, 24<br>+&nbsp;&nbsp;&nbsp; add eax, ebp<br>+&nbsp;&nbsp;&nbsp; add %1, esi<br>+&nbsp;&nbsp;&nbsp; add %2, esi<br>+%endmacro<br>+<br>+%macro LOWRES_FILTER_STEP_W32_SSE 3<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm2, %1, %2, 0, 0<br>
+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm3, %1, %2, 16, 8<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm2, %1, %2, 0, 0<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm3, %1, %2, 16, 8<br>+&nbsp;&nbsp;&nbsp; add eax, ebp<br>+&nbsp;&nbsp;&nbsp; add %1, esi<br>+&nbsp;&nbsp;&nbsp; add %2, esi<br>
+%endmacro<br>+<br>+%macro LOWRES_FILTER_STEP_W16_SSE 3<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm2, %1, %2, 0, 0<br>+&nbsp;&nbsp;&nbsp; WIDTH16_FILTER_%3 xmm0, xmm1, xmm2, %1, %2, 0, 0<br>+&nbsp;&nbsp;&nbsp; add eax, ebp<br>+&nbsp;&nbsp;&nbsp; add %1, esi<br>+&nbsp;&nbsp;&nbsp; add %2, esi<br>
+%endmacro<br>+<br>+;-----------------------------------------------------------------------------<br>+; void frame_init_lowres_core_sse2_w64(&nbsp; int src_stride, int dest_stride, int height, int width, <br>+;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc )<br>
+;-----------------------------------------------------------------------------<br>+cglobal frame_init_lowres_core_sse2_w64<br>+&nbsp;&nbsp;&nbsp; FILTER_START xmm7, dqa<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm2, 0, dqu<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm3, 16, dqu<br>
+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm4, 32, dqu<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm5, 48, dqu<br>+&nbsp;&nbsp;&nbsp; .vloop:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILTER_PREFETCH 2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W64_SSE ebx, ecx, SSE2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W64_SSE edx, edi, SSE2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dec dword [esp+12+16]<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jg .vloop<br>+&nbsp;&nbsp;&nbsp; FILTER_END<br>+<br>+;-----------------------------------------------------------------------------<br>+; void frame_init_lowres_core_sse2_w32(&nbsp; int src_stride, int dest_stride, int height, int width, <br>
+;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc )<br>+;-----------------------------------------------------------------------------<br>+cglobal frame_init_lowres_core_sse2_w32<br>
+&nbsp;&nbsp;&nbsp; FILTER_START xmm7, dqa<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm2, 0, dqu<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm3, 16, dqu<br>+&nbsp;&nbsp;&nbsp; .vloop:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILTER_PREFETCH 2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W32_SSE ebx, ecx, SSE2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W32_SSE edx, edi, SSE2<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dec dword [esp+12+16]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jg .vloop<br>+&nbsp;&nbsp;&nbsp; FILTER_END<br>+<br>+;-----------------------------------------------------------------------------<br>+; void frame_init_lowres_core_sse2_w16(&nbsp; int src_stride, int dest_stride, int height, int width, <br>
+;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc )<br>+;-----------------------------------------------------------------------------<br>+cglobal frame_init_lowres_core_sse2_w16<br>
+&nbsp;&nbsp;&nbsp; FILTER_START xmm7, dqa<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm2, 0, dqu<br>+&nbsp;&nbsp;&nbsp; .vloop:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILTER_PREFETCH 4<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W16_SSE ebx, ecx, SSE2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W16_SSE edx, edi, SSE2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dec dword [esp+12+16]<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jg .vloop<br>+&nbsp;&nbsp;&nbsp; FILTER_END<br>+<br>+%macro LOWRES_FILTER_STEP_W32_MMX 2<br>+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm2, %1, %2, 0, 0<br>+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm3, %1, %2, 8, 4<br>+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm4, %1, %2, 16, 8<br>
+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm5, %1, %2, 24, 12<br>+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm2, %1, %2, 0, 0<br>+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm3, %1, %2, 8, 4<br>+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm4, %1, %2, 16, 8<br>+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm5, %1, %2, 24, 12<br>
+&nbsp;&nbsp;&nbsp; add eax, ebp<br>+&nbsp;&nbsp;&nbsp; add %1, esi<br>+&nbsp;&nbsp;&nbsp; add %2, esi<br>+%endmacro<br>+<br>+%macro LOWRES_FILTER_STEP_W16_MMX 2<br>+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm2, %1, %2, 0, 0<br>+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm3, %1, %2, 8, 4<br>
+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm2, %1, %2, 0, 0<br>+&nbsp;&nbsp;&nbsp; WIDTH8_FILTER_MMX mm0, mm1, mm3, %1, %2, 8, 4<br>+&nbsp;&nbsp;&nbsp; add eax, ebp<br>+&nbsp;&nbsp;&nbsp; add %1, esi<br>+&nbsp;&nbsp;&nbsp; add %2, esi<br>+%endmacro<br>+<br>+;-----------------------------------------------------------------------------<br>
+; void frame_init_lowres_core_mmx_w32(&nbsp; int src_stride, int dest_stride, int height, int width, <br>+;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc )<br>
+;-----------------------------------------------------------------------------<br>+cglobal frame_init_lowres_core_mmx_w32<br>+&nbsp;&nbsp;&nbsp; FILTER_START mm7, q<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD mm2, 0, q<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD mm3, 8, q<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD mm4, 16, q<br>
+&nbsp;&nbsp;&nbsp; INIT_LOAD mm5, 24, q<br>+&nbsp;&nbsp;&nbsp; .vloop:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILTER_PREFETCH 2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W32_MMX ebx, ecx<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W32_MMX edx, edi<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dec dword [esp+12+16]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jg .vloop<br>
+&nbsp;&nbsp;&nbsp; FILTER_END<br>+<br>+;-----------------------------------------------------------------------------<br>+; void frame_init_lowres_core_mmx_w16(&nbsp; int src_stride, int dest_stride, int height, int width, <br>+;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc )<br>
+;-----------------------------------------------------------------------------<br>+cglobal frame_init_lowres_core_mmx_w16<br>+&nbsp;&nbsp;&nbsp; FILTER_START mm7, q<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD mm2, 0, q<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD mm3, 8, q<br>+&nbsp;&nbsp;&nbsp; .vloop:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILTER_PREFETCH 2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W16_MMX ebx, ecx<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W16_MMX edx, edi<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dec dword [esp+12+16]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jg .vloop<br>+&nbsp;&nbsp;&nbsp; FILTER_END<br>+&nbsp;&nbsp;&nbsp; <br>+;-----------------------------------------------------------------------------<br>
+; void frame_init_lowres_core_ssse3_w64(&nbsp; int src_stride, int dest_stride, int height, int width, <br>+;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc )<br>
+;-----------------------------------------------------------------------------<br>+cglobal frame_init_lowres_core_ssse3_w64<br>+&nbsp;&nbsp;&nbsp; FILTER_START xmm7, dqa<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm2, 0, dqu<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm3, 16, dqu<br>
+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm4, 32, dqu<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm5, 48, dqu<br>+&nbsp;&nbsp;&nbsp; .vloop:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILTER_PREFETCH 2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W64_SSE ebx, ecx, SSSE3<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W64_SSE edx, edi, SSSE3<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dec dword [esp+12+16]<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jg .vloop<br>+&nbsp;&nbsp;&nbsp; FILTER_END<br>+<br>+;-----------------------------------------------------------------------------<br>+; void frame_init_lowres_core_ssse3_w32(&nbsp; int src_stride, int dest_stride, int height, int width, <br>
+;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc )<br>+;-----------------------------------------------------------------------------<br>+cglobal frame_init_lowres_core_ssse3_w32<br>
+&nbsp;&nbsp;&nbsp; FILTER_START xmm7, dqa<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm2, 0, dqu<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm3, 16, dqu<br>+&nbsp;&nbsp;&nbsp; .vloop:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILTER_PREFETCH 2<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W32_SSE ebx, ecx, SSSE3<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W32_SSE edx, edi, SSSE3<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dec dword [esp+12+16]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jg .vloop<br>+&nbsp;&nbsp;&nbsp; FILTER_END<br>+<br>+;-----------------------------------------------------------------------------<br>+; void frame_init_lowres_core_ssse3_w16(&nbsp; int src_stride, int dest_stride, int height, int width, <br>
+;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src0, uint8_t *dst0, uint8_t *dsth, uint8_t *dstv, uint8_t *dstc )<br>+;-----------------------------------------------------------------------------<br>+cglobal frame_init_lowres_core_ssse3_w16<br>
+&nbsp;&nbsp;&nbsp; FILTER_START xmm7, dqa<br>+&nbsp;&nbsp;&nbsp; INIT_LOAD xmm2, 0, dqu<br>+&nbsp;&nbsp;&nbsp; .vloop:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FILTER_PREFETCH 4<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W16_SSE ebx, ecx, SSSE3<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOWRES_FILTER_STEP_W16_SSE edx, edi, SSSE3<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dec dword [esp+12+16]<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jg .vloop<br>+&nbsp;&nbsp;&nbsp; FILTER_END<br>\ No newline at end of file<br>Index: tools/checkasm.c<br>===================================================================<br>--- tools/checkasm.c&nbsp;&nbsp;&nbsp; (revision 745)<br>+++ tools/checkasm.c&nbsp;&nbsp;&nbsp; (working copy)<br>
@@ -407,8 +407,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src&nbsp;&nbsp;&nbsp;&nbsp; = &amp;buf1[2*32+2];<br>&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *src2[4] = { &amp;buf1[2*32+2],&nbsp; &amp;buf1[6*32+2],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;buf1[10*32+2], &amp;buf1[14*32+2] };<br>-&nbsp;&nbsp;&nbsp; uint8_t *dst1&nbsp;&nbsp;&nbsp; = &amp;buf3[2*32+2];<br>
-&nbsp;&nbsp;&nbsp; uint8_t *dst2&nbsp;&nbsp;&nbsp; = &amp;buf4[2*32+2];<br>+&nbsp;&nbsp;&nbsp; uint8_t *dst1&nbsp;&nbsp;&nbsp; = &amp;buf3[2*32];<br>+&nbsp;&nbsp;&nbsp; uint8_t *dst2&nbsp;&nbsp;&nbsp; = &amp;buf4[2*32];<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; int dx, dy, i, j, w;<br>&nbsp;&nbsp;&nbsp;&nbsp; int ret = 0, ok, used_asm;<br>@@ -519,7 +519,43 @@<br>
&nbsp;&nbsp;&nbsp;&nbsp; for( w = -64; w &lt;= 128 &amp;&amp; ok; w++ )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MC_TEST_AVG( avg_weight, w );<br>&nbsp;&nbsp;&nbsp;&nbsp; report( &quot;mc wpredb :&quot; );<br>-<br>+&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp; DECLARE_ALIGNED( uint8_t, src1[64*64], 16 );<br>+&nbsp;&nbsp;&nbsp; DECLARE_ALIGNED( uint8_t, dst1a[64*64], 16 );<br>
+&nbsp;&nbsp;&nbsp; DECLARE_ALIGNED( uint8_t, dst2a[64*64], 16 );<br>+&nbsp;&nbsp;&nbsp; DECLARE_ALIGNED( uint8_t, dst3a[64*64], 16 );<br>+&nbsp;&nbsp;&nbsp; DECLARE_ALIGNED( uint8_t, dst4a[64*64], 16 );<br>+&nbsp;&nbsp;&nbsp; DECLARE_ALIGNED( uint8_t, dst1b[64*64], 16 );<br>+&nbsp;&nbsp;&nbsp; DECLARE_ALIGNED( uint8_t, dst2b[64*64], 16 );<br>
+&nbsp;&nbsp;&nbsp; DECLARE_ALIGNED( uint8_t, dst3b[64*64], 16 );<br>+&nbsp;&nbsp;&nbsp; DECLARE_ALIGNED( uint8_t, dst4b[64*64], 16 );<br>+&nbsp;&nbsp;&nbsp; #define MC_TEST_LOWRES(w,h) \<br>+&nbsp;&nbsp;&nbsp; if( mc_a.frame_init_lowres_core != mc_ref.frame_init_lowres_core ) \<br>
+&nbsp;&nbsp;&nbsp; { \<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used_asm = 1; \<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(src1, 0xCD, w*h); \<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc_c.frame_init_lowres_core( w, w/2, h/2, w/2, src1, dst1a, dst2a, dst3a, dst4a);\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc_a.frame_init_lowres_core( w, w/2, h/2, w/2, src1, dst1b, dst2b, dst3b, dst4b);\<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( memcmp( dst1a, dst1b, w*h/4 ) &amp;&amp; memcmp( dst2a, dst2b, w*h/4 )\<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; memcmp( dst3a, dst3b, w*h/4 ) &amp;&amp; memcmp( dst4a, dst4b, w*h/4 )) \<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { \<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok = 0; \<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } \<br>+&nbsp;&nbsp;&nbsp; }<br>+&nbsp;&nbsp;&nbsp; for( j = 0; j &lt; 1000; j++)<br>+&nbsp;&nbsp;&nbsp; {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( i = 0; i &lt; 64*64; i++ )<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src1[i] = rand() &amp; 0xFF;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MC_TEST_LOWRES(16,16);<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MC_TEST_LOWRES(32,48);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MC_TEST_LOWRES(48,16);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MC_TEST_LOWRES(16,32);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MC_TEST_LOWRES(32,16);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MC_TEST_LOWRES(32,32);<br>+&nbsp;&nbsp;&nbsp; }<br>+&nbsp;&nbsp;&nbsp; report( &quot;frame_init_lowres:&quot; );<br>
&nbsp;&nbsp;&nbsp;&nbsp; return ret;<br>&nbsp;}<br>&nbsp;<br><br>