shithub: libvpx

Download patch

ref: 298f5ca47d752d6c05f5f27f27e32c936f370752
parent: 392e0188f68b024c6e7f99f1fdc54aa70f755aaa
author: Shiyou Yin <yinshiyou-hf@loongson.cn>
date: Fri Dec 1 08:44:48 EST 2017

vpx_dsp: [loongson] optimize variance v2.

1. Delete unnecessary zero setting process.
2. Optimize the method of calculating SSE in vpx_varianceWxH.

Change-Id: I58890c6a2ed1543379acb48e03e620c144f6515f

--- a/vpx_dsp/mips/variance_mmi.c
+++ b/vpx_dsp/mips/variance_mmi.c
@@ -22,12 +22,20 @@
 /* Use VARIANCE_SSE_SUM_8_FOR_W64 in vpx_variance64x64,vpx_variance64x32,
    vpx_variance32x64. VARIANCE_SSE_SUM_8 will lead to sum overflow. */
 #define VARIANCE_SSE_SUM_8_FOR_W64                                  \
+  /* sse */                                                         \
+  "pasubub    %[ftmp3],   %[ftmp1],       %[ftmp2]            \n\t" \
+  "punpcklbh  %[ftmp4],   %[ftmp3],       %[ftmp0]            \n\t" \
+  "punpckhbh  %[ftmp5],   %[ftmp3],       %[ftmp0]            \n\t" \
+  "pmaddhw    %[ftmp6],   %[ftmp4],       %[ftmp4]            \n\t" \
+  "pmaddhw    %[ftmp7],   %[ftmp5],       %[ftmp5]            \n\t" \
+  "paddw      %[ftmp10],  %[ftmp10],      %[ftmp6]            \n\t" \
+  "paddw      %[ftmp10],  %[ftmp10],      %[ftmp7]            \n\t" \
+                                                                    \
+  /* sum */                                                         \
   "punpcklbh  %[ftmp3],   %[ftmp1],       %[ftmp0]            \n\t" \
   "punpckhbh  %[ftmp4],   %[ftmp1],       %[ftmp0]            \n\t" \
   "punpcklbh  %[ftmp5],   %[ftmp2],       %[ftmp0]            \n\t" \
   "punpckhbh  %[ftmp6],   %[ftmp2],       %[ftmp0]            \n\t" \
-                                                                    \
-  /* sum */                                                         \
   "punpcklhw  %[ftmp1],   %[ftmp3],       %[ftmp0]            \n\t" \
   "punpckhhw  %[ftmp2],   %[ftmp3],       %[ftmp0]            \n\t" \
   "punpcklhw  %[ftmp7],   %[ftmp5],       %[ftmp0]            \n\t" \
@@ -43,29 +51,7 @@
   "paddw      %[ftmp9],   %[ftmp9],       %[ftmp3]            \n\t" \
   "paddw      %[ftmp9],   %[ftmp9],       %[ftmp4]            \n\t" \
   "paddw      %[ftmp9],   %[ftmp9],       %[ftmp5]            \n\t" \
-  "paddw      %[ftmp9],   %[ftmp9],       %[ftmp6]            \n\t" \
-                                                                    \
-  /* *sse */                                                        \
-  "pmuluw     %[ftmp1],   %[ftmp3],       %[ftmp3]            \n\t" \
-  "pmuluw     %[ftmp2],   %[ftmp5],       %[ftmp5]            \n\t" \
-  "pmuluw     %[ftmp7],   %[ftmp4],       %[ftmp4]            \n\t" \
-  "pmuluw     %[ftmp8],   %[ftmp6],       %[ftmp6]            \n\t" \
-  "paddw      %[ftmp10],  %[ftmp10],      %[ftmp1]            \n\t" \
-  "paddw      %[ftmp10],  %[ftmp10],      %[ftmp2]            \n\t" \
-  "paddw      %[ftmp10],  %[ftmp10],      %[ftmp7]            \n\t" \
-  "paddw      %[ftmp10],  %[ftmp10],      %[ftmp8]            \n\t" \
-  "dsrl       %[ftmp3],   %[ftmp3],       %[ftmp11]           \n\t" \
-  "dsrl       %[ftmp5],   %[ftmp5],       %[ftmp11]           \n\t" \
-  "dsrl       %[ftmp4],   %[ftmp4],       %[ftmp11]           \n\t" \
-  "dsrl       %[ftmp6],   %[ftmp6],       %[ftmp11]           \n\t" \
-  "pmuluw     %[ftmp1],   %[ftmp3],       %[ftmp3]            \n\t" \
-  "pmuluw     %[ftmp2],   %[ftmp5],       %[ftmp5]            \n\t" \
-  "pmuluw     %[ftmp7],   %[ftmp4],       %[ftmp4]            \n\t" \
-  "pmuluw     %[ftmp8],   %[ftmp6],       %[ftmp6]            \n\t" \
-  "paddw      %[ftmp10],  %[ftmp10],      %[ftmp1]            \n\t" \
-  "paddw      %[ftmp10],  %[ftmp10],      %[ftmp2]            \n\t" \
-  "paddw      %[ftmp10],  %[ftmp10],      %[ftmp7]            \n\t" \
-  "paddw      %[ftmp10],  %[ftmp10],      %[ftmp8]            \n\t"
+  "paddw      %[ftmp9],   %[ftmp9],       %[ftmp6]            \n\t"
 
 #define VARIANCE_SSE_SUM_4                                          \
   /* sse */                                                         \
@@ -490,10 +476,13 @@
     MMI_ADDU(%[a], %[a], %[a_stride])
     MMI_ADDU(%[b], %[b], %[b_stride])
     "bnez       %[tmp0],    1b                                  \n\t"
+
     "mfc1       %[tmp1],    %[ftmp9]                            \n\t"
     "mfhc1      %[tmp2],    %[ftmp9]                            \n\t"
     "addu       %[sum],     %[tmp1],        %[tmp2]             \n\t"
-    "swc1       %[ftmp10],  0x00(%[sse])                        \n\t"
+    "dsrl       %[ftmp1],   %[ftmp10],      %[ftmp11]           \n\t"
+    "paddw      %[ftmp1],   %[ftmp1],       %[ftmp10]           \n\t"
+    "swc1       %[ftmp1],   0x00(%[sse])                        \n\t"
     : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
       [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
       [ftmp4]"=&f"(ftmp[4]),            [ftmp5]"=&f"(ftmp[5]),
@@ -566,10 +555,13 @@
     MMI_ADDU(%[a], %[a], %[a_stride])
     MMI_ADDU(%[b], %[b], %[b_stride])
     "bnez       %[tmp0],    1b                                  \n\t"
+
     "mfc1       %[tmp1],    %[ftmp9]                            \n\t"
     "mfhc1      %[tmp2],    %[ftmp9]                            \n\t"
     "addu       %[sum],     %[tmp1],        %[tmp2]             \n\t"
-    "swc1       %[ftmp10],  0x00(%[sse])                        \n\t"
+    "dsrl       %[ftmp1],   %[ftmp10],      %[ftmp11]           \n\t"
+    "paddw      %[ftmp1],   %[ftmp1],       %[ftmp10]           \n\t"
+    "swc1       %[ftmp1],   0x00(%[sse])                        \n\t"
     : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
       [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
       [ftmp4]"=&f"(ftmp[4]),            [ftmp5]"=&f"(ftmp[5]),
@@ -603,7 +595,6 @@
     MMI_L(%[tmp0], %[high], 0x00)
     "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
     "xor        %[ftmp8],   %[ftmp8],       %[ftmp8]            \n\t"
-    "xor        %[ftmp9],   %[ftmp9],       %[ftmp9]            \n\t"
     "xor        %[ftmp10],  %[ftmp10],      %[ftmp10]           \n\t"
     "xor        %[ftmp12],  %[ftmp12],      %[ftmp12]           \n\t"
     "1:                                                         \n\t"
@@ -641,13 +632,11 @@
     "punpckhhw  %[ftmp4],   %[ftmp10],      %[ftmp0]            \n\t"
     "punpcklhw  %[ftmp5],   %[ftmp12],      %[ftmp0]            \n\t"
     "punpckhhw  %[ftmp6],   %[ftmp12],      %[ftmp0]            \n\t"
-    "xor        %[ftmp10],  %[ftmp10],      %[ftmp10]           \n\t"
-    "paddw      %[ftmp10],  %[ftmp10],      %[ftmp3]            \n\t"
-    "paddw      %[ftmp10],  %[ftmp10],      %[ftmp4]            \n\t"
-    "psubw      %[ftmp10],  %[ftmp10],      %[ftmp5]            \n\t"
-    "psubw      %[ftmp10],  %[ftmp10],      %[ftmp6]            \n\t"
-    "dsrl       %[ftmp0],   %[ftmp10],      %[ftmp11]           \n\t"
-    "paddw      %[ftmp0],   %[ftmp0],       %[ftmp10]           \n\t"
+    "paddw      %[ftmp3],   %[ftmp3],       %[ftmp4]            \n\t"
+    "psubw      %[ftmp3],   %[ftmp3],       %[ftmp5]            \n\t"
+    "psubw      %[ftmp3],   %[ftmp3],       %[ftmp6]            \n\t"
+    "dsrl       %[ftmp0],   %[ftmp3],       %[ftmp11]           \n\t"
+    "paddw      %[ftmp0],   %[ftmp0],       %[ftmp3]            \n\t"
     "swc1       %[ftmp0],   0x00(%[sum])                        \n\t"
 
     : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
@@ -691,7 +680,6 @@
     MMI_L(%[tmp0], %[high], 0x00)
     "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
     "xor        %[ftmp8],   %[ftmp8],       %[ftmp8]            \n\t"
-    "xor        %[ftmp9],   %[ftmp9],       %[ftmp9]            \n\t"
     "xor        %[ftmp10],  %[ftmp10],      %[ftmp10]           \n\t"
     "xor        %[ftmp12],  %[ftmp12],      %[ftmp12]           \n\t"
     "1:                                                         \n\t"
@@ -719,13 +707,11 @@
     "punpckhhw  %[ftmp4],   %[ftmp10],      %[ftmp0]            \n\t"
     "punpcklhw  %[ftmp5],   %[ftmp12],      %[ftmp0]            \n\t"
     "punpckhhw  %[ftmp6],   %[ftmp12],      %[ftmp0]            \n\t"
-    "xor        %[ftmp10],  %[ftmp10],      %[ftmp10]           \n\t"
-    "paddw      %[ftmp10],  %[ftmp10],      %[ftmp3]            \n\t"
-    "paddw      %[ftmp10],  %[ftmp10],      %[ftmp4]            \n\t"
-    "psubw      %[ftmp10],  %[ftmp10],      %[ftmp5]            \n\t"
-    "psubw      %[ftmp10],  %[ftmp10],      %[ftmp6]            \n\t"
-    "dsrl       %[ftmp0],   %[ftmp10],      %[ftmp11]           \n\t"
-    "paddw      %[ftmp0],   %[ftmp0],       %[ftmp10]           \n\t"
+    "paddw      %[ftmp3],   %[ftmp3],       %[ftmp4]            \n\t"
+    "psubw      %[ftmp3],   %[ftmp3],       %[ftmp5]            \n\t"
+    "psubw      %[ftmp3],   %[ftmp3],       %[ftmp6]            \n\t"
+    "dsrl       %[ftmp0],   %[ftmp3],       %[ftmp11]           \n\t"
+    "paddw      %[ftmp0],   %[ftmp0],       %[ftmp3]            \n\t"
     "swc1       %[ftmp0],   0x00(%[sum])                        \n\t"
 
     : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
@@ -770,7 +756,6 @@
     MMI_L(%[tmp0], %[high], 0x00)
     "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
     "xor        %[ftmp8],   %[ftmp8],       %[ftmp8]            \n\t"
-    "xor        %[ftmp9],   %[ftmp9],       %[ftmp9]            \n\t"
     "xor        %[ftmp10],  %[ftmp10],      %[ftmp10]           \n\t"
     "xor        %[ftmp12],  %[ftmp12],      %[ftmp12]           \n\t"
     "1:                                                         \n\t"
@@ -793,13 +778,11 @@
     "punpckhhw  %[ftmp4],   %[ftmp10],      %[ftmp0]            \n\t"
     "punpcklhw  %[ftmp5],   %[ftmp12],      %[ftmp0]            \n\t"
     "punpckhhw  %[ftmp6],   %[ftmp12],      %[ftmp0]            \n\t"
-    "xor        %[ftmp10],  %[ftmp10],      %[ftmp10]           \n\t"
-    "paddw      %[ftmp10],  %[ftmp10],      %[ftmp3]            \n\t"
-    "paddw      %[ftmp10],  %[ftmp10],      %[ftmp4]            \n\t"
-    "psubw      %[ftmp10],  %[ftmp10],      %[ftmp5]            \n\t"
-    "psubw      %[ftmp10],  %[ftmp10],      %[ftmp6]            \n\t"
-    "dsrl       %[ftmp0],   %[ftmp10],      %[ftmp11]           \n\t"
-    "paddw      %[ftmp0],   %[ftmp0],       %[ftmp10]           \n\t"
+    "paddw      %[ftmp3],   %[ftmp3],       %[ftmp4]            \n\t"
+    "psubw      %[ftmp3],   %[ftmp3],       %[ftmp5]            \n\t"
+    "psubw      %[ftmp3],   %[ftmp3],       %[ftmp6]            \n\t"
+    "dsrl       %[ftmp0],   %[ftmp3],       %[ftmp11]           \n\t"
+    "paddw      %[ftmp0],   %[ftmp0],       %[ftmp3]            \n\t"
     "swc1       %[ftmp0],   0x00(%[sum])                        \n\t"
 
     : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
@@ -846,7 +829,6 @@
     "xor        %[ftmp6],   %[ftmp6],       %[ftmp6]            \n\t"
     "xor        %[ftmp7],   %[ftmp7],       %[ftmp7]            \n\t"
     "xor        %[ftmp8],   %[ftmp8],       %[ftmp8]            \n\t"
-    "xor        %[ftmp9],   %[ftmp9],       %[ftmp9]            \n\t"
     "1:                                                         \n\t"
     "gsldlc1    %[ftmp1],   0x07(%[a])                          \n\t"
     "gsldrc1    %[ftmp1],   0x00(%[a])                          \n\t"
@@ -867,13 +849,11 @@
     "punpckhhw  %[ftmp4],   %[ftmp7],       %[ftmp0]            \n\t"
     "punpcklhw  %[ftmp5],   %[ftmp8],       %[ftmp0]            \n\t"
     "punpckhhw  %[ftmp6],   %[ftmp8],       %[ftmp0]            \n\t"
-    "xor        %[ftmp7],   %[ftmp7],       %[ftmp7]            \n\t"
-    "paddw      %[ftmp7],   %[ftmp7],       %[ftmp3]            \n\t"
-    "paddw      %[ftmp7],   %[ftmp7],       %[ftmp4]            \n\t"
-    "psubw      %[ftmp7],   %[ftmp7],       %[ftmp5]            \n\t"
-    "psubw      %[ftmp7],   %[ftmp7],       %[ftmp6]            \n\t"
-    "dsrl       %[ftmp0],   %[ftmp7],       %[ftmp10]           \n\t"
-    "paddw      %[ftmp0],   %[ftmp0],       %[ftmp7]            \n\t"
+    "paddw      %[ftmp3],   %[ftmp3],       %[ftmp4]            \n\t"
+    "psubw      %[ftmp3],   %[ftmp3],       %[ftmp5]            \n\t"
+    "psubw      %[ftmp3],   %[ftmp3],       %[ftmp6]            \n\t"
+    "dsrl       %[ftmp0],   %[ftmp3],       %[ftmp10]           \n\t"
+    "paddw      %[ftmp0],   %[ftmp0],       %[ftmp3]            \n\t"
     "swc1       %[ftmp0],   0x00(%[sum])                        \n\t"
     : [ftmp0]"=&f"(ftmp[0]),            [ftmp1]"=&f"(ftmp[1]),
       [ftmp2]"=&f"(ftmp[2]),            [ftmp3]"=&f"(ftmp[3]),
@@ -915,7 +895,6 @@
     MMI_L(%[tmp0], %[high], 0x00)
     "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
     "xor        %[ftmp8],   %[ftmp8],       %[ftmp8]            \n\t"
-    "xor        %[ftmp9],   %[ftmp9],       %[ftmp9]            \n\t"
 
     "1:                                                         \n\t"
     VARIANCE_SSE_16
@@ -968,7 +947,6 @@
     MMI_L(%[tmp0], %[high], 0x00)
     "xor        %[ftmp0],   %[ftmp0],       %[ftmp0]            \n\t"
     "xor        %[ftmp8],   %[ftmp8],       %[ftmp8]            \n\t"
-    "xor        %[ftmp9],   %[ftmp9],       %[ftmp9]            \n\t"
 
     "1:                                                         \n\t"
     VARIANCE_SSE_8