Fix some store forwarding stalls
authorFiona Glaser <fiona@x264.com>
Thu, 7 Feb 2013 00:55:39 +0000 (16:55 -0800)
committerFiona Glaser <fiona@x264.com>
Tue, 26 Feb 2013 07:22:55 +0000 (23:22 -0800)
There's quite a few others, but most of them don't help to fix or there's no
easy way to avoid them.

common/x86/pixel-a.asm
encoder/slicetype.c

index df446b1..e34fec0 100644 (file)
@@ -4410,8 +4410,8 @@ cglobal pixel_ads4, 5,7,12
     punpckhqdq xmm5, xmm5
     punpckhqdq xmm4, xmm4
 %if ARCH_X86_64
-    pshuflw xmm8, r6m, 0
-    punpcklqdq xmm8, xmm8
+    movd    xmm8, r6m
+    SPLATW  xmm8, xmm8
     ADS_START
     movdqu  xmm10, [r1]
     movdqu  xmm11, [r1+r2]
index 0ecd91e..d57748a 100644 (file)
@@ -633,15 +633,16 @@ lowres_intra_mb:
     if( !fenc->b_intra_calculated )
     {
         ALIGNED_ARRAY_16( pixel, edge,[36] );
-        pixel *pix = &pix1[8+FDEC_STRIDE - 1];
-        pixel *src = &fenc->lowres[0][i_pel_offset - 1];
+        pixel *pix = &pix1[8+FDEC_STRIDE];
+        pixel *src = &fenc->lowres[0][i_pel_offset];
         const int intra_penalty = 5 * a->i_lambda;
         int satds[3];
+        int pixoff = 4 / sizeof(pixel);
 
-        memcpy( pix-FDEC_STRIDE, src-i_stride, 17 * sizeof(pixel) );
-        for( int i = 0; i < 8; i++ )
-            pix[i*FDEC_STRIDE] = src[i*i_stride];
-        pix++;
+        /* Avoid store forwarding stalls by writing larger chunks */
+        memcpy( pix-FDEC_STRIDE, src-i_stride, 16 * sizeof(pixel) );
+        for( int i = -1; i < 8; i++ )
+            M32( &pix[i*FDEC_STRIDE-pixoff] ) = M32( &src[i*i_stride-pixoff] );
 
         h->pixf.intra_mbcmp_x3_8x8c( h->mb.pic.p_fenc[0], pix, satds );
         int i_icost = X264_MIN3( satds[0], satds[1], satds[2] );