Index: common/mc.c<br>===================================================================<br>--- common/mc.c&nbsp;&nbsp;&nbsp; (revision 745)<br>+++ common/mc.c&nbsp;&nbsp;&nbsp; (working copy)<br>@@ -377,7 +377,9 @@<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>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>@@ -69,9 +74,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,56 +86,80 @@<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>
-<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>+#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>&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>-{<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; {<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; }<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>+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; START_TIMER;\<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; if(i_width&gt;&gt;2 == 5) STOP_TIMER(&quot;w20&quot;);\<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>+GET_REF(mmxext)<br>+GET_REF(sse2)<br>&nbsp;<br>&nbsp;void x264_mc_init_mmx( int cpu, x264_mc_functions_t *pf )<br>&nbsp;{<br>@@ -169,6 +198,12 @@<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; }<br>&nbsp;}<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><br><br>