Commit 90ce21e5 authored by Shiyou Yin's avatar Shiyou Yin Committed by Gerrit Code Review

Merge "vpx_dsp: [loongson] optimize variance v2."

parents e83d00f5 298f5ca4
...@@ -22,12 +22,20 @@ static const uint8_t bilinear_filters[8][2] = { ...@@ -22,12 +22,20 @@ static const uint8_t bilinear_filters[8][2] = {
/* Use VARIANCE_SSE_SUM_8_FOR_W64 in vpx_variance64x64,vpx_variance64x32, /* Use VARIANCE_SSE_SUM_8_FOR_W64 in vpx_variance64x64,vpx_variance64x32,
vpx_variance32x64. VARIANCE_SSE_SUM_8 will lead to sum overflow. */ vpx_variance32x64. VARIANCE_SSE_SUM_8 will lead to sum overflow. */
#define VARIANCE_SSE_SUM_8_FOR_W64 \ #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" \ "punpcklbh %[ftmp3], %[ftmp1], %[ftmp0] \n\t" \
"punpckhbh %[ftmp4], %[ftmp1], %[ftmp0] \n\t" \ "punpckhbh %[ftmp4], %[ftmp1], %[ftmp0] \n\t" \
"punpcklbh %[ftmp5], %[ftmp2], %[ftmp0] \n\t" \ "punpcklbh %[ftmp5], %[ftmp2], %[ftmp0] \n\t" \
"punpckhbh %[ftmp6], %[ftmp2], %[ftmp0] \n\t" \ "punpckhbh %[ftmp6], %[ftmp2], %[ftmp0] \n\t" \
\
/* sum */ \
"punpcklhw %[ftmp1], %[ftmp3], %[ftmp0] \n\t" \ "punpcklhw %[ftmp1], %[ftmp3], %[ftmp0] \n\t" \
"punpckhhw %[ftmp2], %[ftmp3], %[ftmp0] \n\t" \ "punpckhhw %[ftmp2], %[ftmp3], %[ftmp0] \n\t" \
"punpcklhw %[ftmp7], %[ftmp5], %[ftmp0] \n\t" \ "punpcklhw %[ftmp7], %[ftmp5], %[ftmp0] \n\t" \
...@@ -43,29 +51,7 @@ static const uint8_t bilinear_filters[8][2] = { ...@@ -43,29 +51,7 @@ static const uint8_t bilinear_filters[8][2] = {
"paddw %[ftmp9], %[ftmp9], %[ftmp3] \n\t" \ "paddw %[ftmp9], %[ftmp9], %[ftmp3] \n\t" \
"paddw %[ftmp9], %[ftmp9], %[ftmp4] \n\t" \ "paddw %[ftmp9], %[ftmp9], %[ftmp4] \n\t" \
"paddw %[ftmp9], %[ftmp9], %[ftmp5] \n\t" \ "paddw %[ftmp9], %[ftmp9], %[ftmp5] \n\t" \
"paddw %[ftmp9], %[ftmp9], %[ftmp6] \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"
#define VARIANCE_SSE_SUM_4 \ #define VARIANCE_SSE_SUM_4 \
/* sse */ \ /* sse */ \
...@@ -490,10 +476,13 @@ static inline uint32_t vpx_variance64x(const uint8_t *a, int a_stride, ...@@ -490,10 +476,13 @@ static inline uint32_t vpx_variance64x(const uint8_t *a, int a_stride,
MMI_ADDU(%[a], %[a], %[a_stride]) MMI_ADDU(%[a], %[a], %[a_stride])
MMI_ADDU(%[b], %[b], %[b_stride]) MMI_ADDU(%[b], %[b], %[b_stride])
"bnez %[tmp0], 1b \n\t" "bnez %[tmp0], 1b \n\t"
"mfc1 %[tmp1], %[ftmp9] \n\t" "mfc1 %[tmp1], %[ftmp9] \n\t"
"mfhc1 %[tmp2], %[ftmp9] \n\t" "mfhc1 %[tmp2], %[ftmp9] \n\t"
"addu %[sum], %[tmp1], %[tmp2] \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]), : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
[ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
[ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
...@@ -566,10 +555,13 @@ uint32_t vpx_variance32x64_mmi(const uint8_t *a, int a_stride, const uint8_t *b, ...@@ -566,10 +555,13 @@ uint32_t vpx_variance32x64_mmi(const uint8_t *a, int a_stride, const uint8_t *b,
MMI_ADDU(%[a], %[a], %[a_stride]) MMI_ADDU(%[a], %[a], %[a_stride])
MMI_ADDU(%[b], %[b], %[b_stride]) MMI_ADDU(%[b], %[b], %[b_stride])
"bnez %[tmp0], 1b \n\t" "bnez %[tmp0], 1b \n\t"
"mfc1 %[tmp1], %[ftmp9] \n\t" "mfc1 %[tmp1], %[ftmp9] \n\t"
"mfhc1 %[tmp2], %[ftmp9] \n\t" "mfhc1 %[tmp2], %[ftmp9] \n\t"
"addu %[sum], %[tmp1], %[tmp2] \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]), : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
[ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
[ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]), [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
...@@ -603,7 +595,6 @@ static inline uint32_t vpx_variance32x(const uint8_t *a, int a_stride, ...@@ -603,7 +595,6 @@ static inline uint32_t vpx_variance32x(const uint8_t *a, int a_stride,
MMI_L(%[tmp0], %[high], 0x00) MMI_L(%[tmp0], %[high], 0x00)
"xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
"xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t" "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
"xor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
"xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t" "xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
"xor %[ftmp12], %[ftmp12], %[ftmp12] \n\t" "xor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
"1: \n\t" "1: \n\t"
...@@ -641,13 +632,11 @@ static inline uint32_t vpx_variance32x(const uint8_t *a, int a_stride, ...@@ -641,13 +632,11 @@ static inline uint32_t vpx_variance32x(const uint8_t *a, int a_stride,
"punpckhhw %[ftmp4], %[ftmp10], %[ftmp0] \n\t" "punpckhhw %[ftmp4], %[ftmp10], %[ftmp0] \n\t"
"punpcklhw %[ftmp5], %[ftmp12], %[ftmp0] \n\t" "punpcklhw %[ftmp5], %[ftmp12], %[ftmp0] \n\t"
"punpckhhw %[ftmp6], %[ftmp12], %[ftmp0] \n\t" "punpckhhw %[ftmp6], %[ftmp12], %[ftmp0] \n\t"
"xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t" "paddw %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
"paddw %[ftmp10], %[ftmp10], %[ftmp3] \n\t" "psubw %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
"paddw %[ftmp10], %[ftmp10], %[ftmp4] \n\t" "psubw %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
"psubw %[ftmp10], %[ftmp10], %[ftmp5] \n\t" "dsrl %[ftmp0], %[ftmp3], %[ftmp11] \n\t"
"psubw %[ftmp10], %[ftmp10], %[ftmp6] \n\t" "paddw %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
"dsrl %[ftmp0], %[ftmp10], %[ftmp11] \n\t"
"paddw %[ftmp0], %[ftmp0], %[ftmp10] \n\t"
"swc1 %[ftmp0], 0x00(%[sum]) \n\t" "swc1 %[ftmp0], 0x00(%[sum]) \n\t"
: [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
...@@ -691,7 +680,6 @@ static inline uint32_t vpx_variance16x(const uint8_t *a, int a_stride, ...@@ -691,7 +680,6 @@ static inline uint32_t vpx_variance16x(const uint8_t *a, int a_stride,
MMI_L(%[tmp0], %[high], 0x00) MMI_L(%[tmp0], %[high], 0x00)
"xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
"xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t" "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
"xor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
"xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t" "xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
"xor %[ftmp12], %[ftmp12], %[ftmp12] \n\t" "xor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
"1: \n\t" "1: \n\t"
...@@ -719,13 +707,11 @@ static inline uint32_t vpx_variance16x(const uint8_t *a, int a_stride, ...@@ -719,13 +707,11 @@ static inline uint32_t vpx_variance16x(const uint8_t *a, int a_stride,
"punpckhhw %[ftmp4], %[ftmp10], %[ftmp0] \n\t" "punpckhhw %[ftmp4], %[ftmp10], %[ftmp0] \n\t"
"punpcklhw %[ftmp5], %[ftmp12], %[ftmp0] \n\t" "punpcklhw %[ftmp5], %[ftmp12], %[ftmp0] \n\t"
"punpckhhw %[ftmp6], %[ftmp12], %[ftmp0] \n\t" "punpckhhw %[ftmp6], %[ftmp12], %[ftmp0] \n\t"
"xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t" "paddw %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
"paddw %[ftmp10], %[ftmp10], %[ftmp3] \n\t" "psubw %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
"paddw %[ftmp10], %[ftmp10], %[ftmp4] \n\t" "psubw %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
"psubw %[ftmp10], %[ftmp10], %[ftmp5] \n\t" "dsrl %[ftmp0], %[ftmp3], %[ftmp11] \n\t"
"psubw %[ftmp10], %[ftmp10], %[ftmp6] \n\t" "paddw %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
"dsrl %[ftmp0], %[ftmp10], %[ftmp11] \n\t"
"paddw %[ftmp0], %[ftmp0], %[ftmp10] \n\t"
"swc1 %[ftmp0], 0x00(%[sum]) \n\t" "swc1 %[ftmp0], 0x00(%[sum]) \n\t"
: [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
...@@ -770,7 +756,6 @@ static inline uint32_t vpx_variance8x(const uint8_t *a, int a_stride, ...@@ -770,7 +756,6 @@ static inline uint32_t vpx_variance8x(const uint8_t *a, int a_stride,
MMI_L(%[tmp0], %[high], 0x00) MMI_L(%[tmp0], %[high], 0x00)
"xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
"xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t" "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
"xor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
"xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t" "xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t"
"xor %[ftmp12], %[ftmp12], %[ftmp12] \n\t" "xor %[ftmp12], %[ftmp12], %[ftmp12] \n\t"
"1: \n\t" "1: \n\t"
...@@ -793,13 +778,11 @@ static inline uint32_t vpx_variance8x(const uint8_t *a, int a_stride, ...@@ -793,13 +778,11 @@ static inline uint32_t vpx_variance8x(const uint8_t *a, int a_stride,
"punpckhhw %[ftmp4], %[ftmp10], %[ftmp0] \n\t" "punpckhhw %[ftmp4], %[ftmp10], %[ftmp0] \n\t"
"punpcklhw %[ftmp5], %[ftmp12], %[ftmp0] \n\t" "punpcklhw %[ftmp5], %[ftmp12], %[ftmp0] \n\t"
"punpckhhw %[ftmp6], %[ftmp12], %[ftmp0] \n\t" "punpckhhw %[ftmp6], %[ftmp12], %[ftmp0] \n\t"
"xor %[ftmp10], %[ftmp10], %[ftmp10] \n\t" "paddw %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
"paddw %[ftmp10], %[ftmp10], %[ftmp3] \n\t" "psubw %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
"paddw %[ftmp10], %[ftmp10], %[ftmp4] \n\t" "psubw %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
"psubw %[ftmp10], %[ftmp10], %[ftmp5] \n\t" "dsrl %[ftmp0], %[ftmp3], %[ftmp11] \n\t"
"psubw %[ftmp10], %[ftmp10], %[ftmp6] \n\t" "paddw %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
"dsrl %[ftmp0], %[ftmp10], %[ftmp11] \n\t"
"paddw %[ftmp0], %[ftmp0], %[ftmp10] \n\t"
"swc1 %[ftmp0], 0x00(%[sum]) \n\t" "swc1 %[ftmp0], 0x00(%[sum]) \n\t"
: [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
...@@ -846,7 +829,6 @@ static inline uint32_t vpx_variance4x(const uint8_t *a, int a_stride, ...@@ -846,7 +829,6 @@ static inline uint32_t vpx_variance4x(const uint8_t *a, int a_stride,
"xor %[ftmp6], %[ftmp6], %[ftmp6] \n\t" "xor %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
"xor %[ftmp7], %[ftmp7], %[ftmp7] \n\t" "xor %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
"xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t" "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
"xor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
"1: \n\t" "1: \n\t"
"gsldlc1 %[ftmp1], 0x07(%[a]) \n\t" "gsldlc1 %[ftmp1], 0x07(%[a]) \n\t"
"gsldrc1 %[ftmp1], 0x00(%[a]) \n\t" "gsldrc1 %[ftmp1], 0x00(%[a]) \n\t"
...@@ -867,13 +849,11 @@ static inline uint32_t vpx_variance4x(const uint8_t *a, int a_stride, ...@@ -867,13 +849,11 @@ static inline uint32_t vpx_variance4x(const uint8_t *a, int a_stride,
"punpckhhw %[ftmp4], %[ftmp7], %[ftmp0] \n\t" "punpckhhw %[ftmp4], %[ftmp7], %[ftmp0] \n\t"
"punpcklhw %[ftmp5], %[ftmp8], %[ftmp0] \n\t" "punpcklhw %[ftmp5], %[ftmp8], %[ftmp0] \n\t"
"punpckhhw %[ftmp6], %[ftmp8], %[ftmp0] \n\t" "punpckhhw %[ftmp6], %[ftmp8], %[ftmp0] \n\t"
"xor %[ftmp7], %[ftmp7], %[ftmp7] \n\t" "paddw %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
"paddw %[ftmp7], %[ftmp7], %[ftmp3] \n\t" "psubw %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
"paddw %[ftmp7], %[ftmp7], %[ftmp4] \n\t" "psubw %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
"psubw %[ftmp7], %[ftmp7], %[ftmp5] \n\t" "dsrl %[ftmp0], %[ftmp3], %[ftmp10] \n\t"
"psubw %[ftmp7], %[ftmp7], %[ftmp6] \n\t" "paddw %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
"dsrl %[ftmp0], %[ftmp7], %[ftmp10] \n\t"
"paddw %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
"swc1 %[ftmp0], 0x00(%[sum]) \n\t" "swc1 %[ftmp0], 0x00(%[sum]) \n\t"
: [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
[ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
...@@ -915,7 +895,6 @@ static inline uint32_t vpx_mse16x(const uint8_t *a, int a_stride, ...@@ -915,7 +895,6 @@ static inline uint32_t vpx_mse16x(const uint8_t *a, int a_stride,
MMI_L(%[tmp0], %[high], 0x00) MMI_L(%[tmp0], %[high], 0x00)
"xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
"xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t" "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
"xor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
"1: \n\t" "1: \n\t"
VARIANCE_SSE_16 VARIANCE_SSE_16
...@@ -968,7 +947,6 @@ static inline uint32_t vpx_mse8x(const uint8_t *a, int a_stride, ...@@ -968,7 +947,6 @@ static inline uint32_t vpx_mse8x(const uint8_t *a, int a_stride,
MMI_L(%[tmp0], %[high], 0x00) MMI_L(%[tmp0], %[high], 0x00)
"xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
"xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t" "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
"xor %[ftmp9], %[ftmp9], %[ftmp9] \n\t"
"1: \n\t" "1: \n\t"
VARIANCE_SSE_8 VARIANCE_SSE_8
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment