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