1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2022 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/loongarch/variance_lsx.h"
13*fb1b10abSAndroid Build Coastguard Worker
14*fb1b10abSAndroid Build Coastguard Worker #define VARIANCE_WxH(sse, diff, shift) \
15*fb1b10abSAndroid Build Coastguard Worker (sse) - (((uint32_t)(diff) * (diff)) >> (shift))
16*fb1b10abSAndroid Build Coastguard Worker
17*fb1b10abSAndroid Build Coastguard Worker #define VARIANCE_LARGE_WxH(sse, diff, shift) \
18*fb1b10abSAndroid Build Coastguard Worker (sse) - (((int64_t)(diff) * (diff)) >> (shift))
19*fb1b10abSAndroid Build Coastguard Worker
sse_diff_8width_lsx(const uint8_t * src_ptr,int32_t src_stride,const uint8_t * ref_ptr,int32_t ref_stride,int32_t height,int32_t * diff)20*fb1b10abSAndroid Build Coastguard Worker static uint32_t sse_diff_8width_lsx(const uint8_t *src_ptr, int32_t src_stride,
21*fb1b10abSAndroid Build Coastguard Worker const uint8_t *ref_ptr, int32_t ref_stride,
22*fb1b10abSAndroid Build Coastguard Worker int32_t height, int32_t *diff) {
23*fb1b10abSAndroid Build Coastguard Worker int32_t res, ht_cnt = (height >> 2);
24*fb1b10abSAndroid Build Coastguard Worker __m128i src0, src1, src2, src3, ref0, ref1, ref2, ref3, vec;
25*fb1b10abSAndroid Build Coastguard Worker __m128i avg = __lsx_vldi(0);
26*fb1b10abSAndroid Build Coastguard Worker __m128i var = avg;
27*fb1b10abSAndroid Build Coastguard Worker int32_t src_stride2 = src_stride << 1;
28*fb1b10abSAndroid Build Coastguard Worker int32_t src_stride3 = src_stride2 + src_stride;
29*fb1b10abSAndroid Build Coastguard Worker int32_t src_stride4 = src_stride2 << 1;
30*fb1b10abSAndroid Build Coastguard Worker int32_t ref_stride2 = ref_stride << 1;
31*fb1b10abSAndroid Build Coastguard Worker int32_t ref_stride3 = ref_stride2 + ref_stride;
32*fb1b10abSAndroid Build Coastguard Worker int32_t ref_stride4 = ref_stride2 << 1;
33*fb1b10abSAndroid Build Coastguard Worker
34*fb1b10abSAndroid Build Coastguard Worker for (; ht_cnt--;) {
35*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vld, src_ptr, 0, src_ptr + src_stride, 0,
36*fb1b10abSAndroid Build Coastguard Worker src_ptr + src_stride2, 0, src_ptr + src_stride3, 0, src0, src1,
37*fb1b10abSAndroid Build Coastguard Worker src2, src3);
38*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride4;
39*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vld, ref_ptr, 0, ref_ptr + ref_stride, 0,
40*fb1b10abSAndroid Build Coastguard Worker ref_ptr + ref_stride2, 0, ref_ptr + ref_stride3, 0, ref0, ref1,
41*fb1b10abSAndroid Build Coastguard Worker ref2, ref3);
42*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride4;
43*fb1b10abSAndroid Build Coastguard Worker
44*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vpickev_d, src1, src0, src3, src2, ref1, ref0, ref3, ref2,
45*fb1b10abSAndroid Build Coastguard Worker src0, src1, ref0, ref1);
46*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src0, ref0, var, avg);
47*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src1, ref1, var, avg);
48*fb1b10abSAndroid Build Coastguard Worker }
49*fb1b10abSAndroid Build Coastguard Worker
50*fb1b10abSAndroid Build Coastguard Worker vec = __lsx_vhaddw_w_h(avg, avg);
51*fb1b10abSAndroid Build Coastguard Worker HADD_SW_S32(vec, *diff);
52*fb1b10abSAndroid Build Coastguard Worker HADD_SW_S32(var, res);
53*fb1b10abSAndroid Build Coastguard Worker return res;
54*fb1b10abSAndroid Build Coastguard Worker }
55*fb1b10abSAndroid Build Coastguard Worker
sse_diff_16width_lsx(const uint8_t * src_ptr,int32_t src_stride,const uint8_t * ref_ptr,int32_t ref_stride,int32_t height,int32_t * diff)56*fb1b10abSAndroid Build Coastguard Worker static uint32_t sse_diff_16width_lsx(const uint8_t *src_ptr, int32_t src_stride,
57*fb1b10abSAndroid Build Coastguard Worker const uint8_t *ref_ptr, int32_t ref_stride,
58*fb1b10abSAndroid Build Coastguard Worker int32_t height, int32_t *diff) {
59*fb1b10abSAndroid Build Coastguard Worker int32_t res, ht_cnt = (height >> 2);
60*fb1b10abSAndroid Build Coastguard Worker __m128i src, ref, vec;
61*fb1b10abSAndroid Build Coastguard Worker __m128i avg = __lsx_vldi(0);
62*fb1b10abSAndroid Build Coastguard Worker __m128i var = avg;
63*fb1b10abSAndroid Build Coastguard Worker
64*fb1b10abSAndroid Build Coastguard Worker for (; ht_cnt--;) {
65*fb1b10abSAndroid Build Coastguard Worker src = __lsx_vld(src_ptr, 0);
66*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
67*fb1b10abSAndroid Build Coastguard Worker ref = __lsx_vld(ref_ptr, 0);
68*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
69*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src, ref, var, avg);
70*fb1b10abSAndroid Build Coastguard Worker
71*fb1b10abSAndroid Build Coastguard Worker src = __lsx_vld(src_ptr, 0);
72*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
73*fb1b10abSAndroid Build Coastguard Worker ref = __lsx_vld(ref_ptr, 0);
74*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
75*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src, ref, var, avg);
76*fb1b10abSAndroid Build Coastguard Worker src = __lsx_vld(src_ptr, 0);
77*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
78*fb1b10abSAndroid Build Coastguard Worker ref = __lsx_vld(ref_ptr, 0);
79*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
80*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src, ref, var, avg);
81*fb1b10abSAndroid Build Coastguard Worker
82*fb1b10abSAndroid Build Coastguard Worker src = __lsx_vld(src_ptr, 0);
83*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
84*fb1b10abSAndroid Build Coastguard Worker ref = __lsx_vld(ref_ptr, 0);
85*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
86*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src, ref, var, avg);
87*fb1b10abSAndroid Build Coastguard Worker }
88*fb1b10abSAndroid Build Coastguard Worker vec = __lsx_vhaddw_w_h(avg, avg);
89*fb1b10abSAndroid Build Coastguard Worker HADD_SW_S32(vec, *diff);
90*fb1b10abSAndroid Build Coastguard Worker HADD_SW_S32(var, res);
91*fb1b10abSAndroid Build Coastguard Worker return res;
92*fb1b10abSAndroid Build Coastguard Worker }
93*fb1b10abSAndroid Build Coastguard Worker
sse_diff_32width_lsx(const uint8_t * src_ptr,int32_t src_stride,const uint8_t * ref_ptr,int32_t ref_stride,int32_t height,int32_t * diff)94*fb1b10abSAndroid Build Coastguard Worker static uint32_t sse_diff_32width_lsx(const uint8_t *src_ptr, int32_t src_stride,
95*fb1b10abSAndroid Build Coastguard Worker const uint8_t *ref_ptr, int32_t ref_stride,
96*fb1b10abSAndroid Build Coastguard Worker int32_t height, int32_t *diff) {
97*fb1b10abSAndroid Build Coastguard Worker int32_t res, ht_cnt = (height >> 2);
98*fb1b10abSAndroid Build Coastguard Worker __m128i avg = __lsx_vldi(0);
99*fb1b10abSAndroid Build Coastguard Worker __m128i src0, src1, ref0, ref1;
100*fb1b10abSAndroid Build Coastguard Worker __m128i vec;
101*fb1b10abSAndroid Build Coastguard Worker __m128i var = avg;
102*fb1b10abSAndroid Build Coastguard Worker
103*fb1b10abSAndroid Build Coastguard Worker for (; ht_cnt--;) {
104*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, src_ptr, 0, src_ptr, 16, src0, src1);
105*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
106*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, ref_ptr, 0, ref_ptr, 16, ref0, ref1);
107*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
108*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src0, ref0, var, avg);
109*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src1, ref1, var, avg);
110*fb1b10abSAndroid Build Coastguard Worker
111*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, src_ptr, 0, src_ptr, 16, src0, src1);
112*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
113*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, ref_ptr, 0, ref_ptr, 16, ref0, ref1);
114*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
115*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src0, ref0, var, avg);
116*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src1, ref1, var, avg);
117*fb1b10abSAndroid Build Coastguard Worker
118*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, src_ptr, 0, src_ptr, 16, src0, src1);
119*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
120*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, ref_ptr, 0, ref_ptr, 16, ref0, ref1);
121*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
122*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src0, ref0, var, avg);
123*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src1, ref1, var, avg);
124*fb1b10abSAndroid Build Coastguard Worker
125*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, src_ptr, 0, src_ptr, 16, src0, src1);
126*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
127*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, ref_ptr, 0, ref_ptr, 16, ref0, ref1);
128*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
129*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src0, ref0, var, avg);
130*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src1, ref1, var, avg);
131*fb1b10abSAndroid Build Coastguard Worker }
132*fb1b10abSAndroid Build Coastguard Worker
133*fb1b10abSAndroid Build Coastguard Worker vec = __lsx_vhaddw_w_h(avg, avg);
134*fb1b10abSAndroid Build Coastguard Worker HADD_SW_S32(vec, *diff);
135*fb1b10abSAndroid Build Coastguard Worker HADD_SW_S32(var, res);
136*fb1b10abSAndroid Build Coastguard Worker return res;
137*fb1b10abSAndroid Build Coastguard Worker }
138*fb1b10abSAndroid Build Coastguard Worker
sse_diff_64x64_lsx(const uint8_t * src_ptr,int32_t src_stride,const uint8_t * ref_ptr,int32_t ref_stride,int32_t * diff)139*fb1b10abSAndroid Build Coastguard Worker static uint32_t sse_diff_64x64_lsx(const uint8_t *src_ptr, int32_t src_stride,
140*fb1b10abSAndroid Build Coastguard Worker const uint8_t *ref_ptr, int32_t ref_stride,
141*fb1b10abSAndroid Build Coastguard Worker int32_t *diff) {
142*fb1b10abSAndroid Build Coastguard Worker int32_t res, ht_cnt = 32;
143*fb1b10abSAndroid Build Coastguard Worker __m128i avg0 = __lsx_vldi(0);
144*fb1b10abSAndroid Build Coastguard Worker __m128i src0, src1, src2, src3;
145*fb1b10abSAndroid Build Coastguard Worker __m128i ref0, ref1, ref2, ref3;
146*fb1b10abSAndroid Build Coastguard Worker __m128i vec0, vec1;
147*fb1b10abSAndroid Build Coastguard Worker __m128i avg1 = avg0;
148*fb1b10abSAndroid Build Coastguard Worker __m128i avg2 = avg0;
149*fb1b10abSAndroid Build Coastguard Worker __m128i avg3 = avg0;
150*fb1b10abSAndroid Build Coastguard Worker __m128i var = avg0;
151*fb1b10abSAndroid Build Coastguard Worker
152*fb1b10abSAndroid Build Coastguard Worker for (; ht_cnt--;) {
153*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vld, src_ptr, 0, src_ptr, 16, src_ptr, 32, src_ptr, 48,
154*fb1b10abSAndroid Build Coastguard Worker src0, src1, src2, src3);
155*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
156*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vld, ref_ptr, 0, ref_ptr, 16, ref_ptr, 32, ref_ptr, 48,
157*fb1b10abSAndroid Build Coastguard Worker ref0, ref1, ref2, ref3);
158*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
159*fb1b10abSAndroid Build Coastguard Worker
160*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src0, ref0, var, avg0);
161*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src1, ref1, var, avg1);
162*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src2, ref2, var, avg2);
163*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src3, ref3, var, avg3);
164*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vld, src_ptr, 0, src_ptr, 16, src_ptr, 32, src_ptr, 48,
165*fb1b10abSAndroid Build Coastguard Worker src0, src1, src2, src3);
166*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
167*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vld, ref_ptr, 0, ref_ptr, 16, ref_ptr, 32, ref_ptr, 48,
168*fb1b10abSAndroid Build Coastguard Worker ref0, ref1, ref2, ref3);
169*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
170*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src0, ref0, var, avg0);
171*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src1, ref1, var, avg1);
172*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src2, ref2, var, avg2);
173*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_AVG_B(src3, ref3, var, avg3);
174*fb1b10abSAndroid Build Coastguard Worker }
175*fb1b10abSAndroid Build Coastguard Worker vec0 = __lsx_vhaddw_w_h(avg0, avg0);
176*fb1b10abSAndroid Build Coastguard Worker vec1 = __lsx_vhaddw_w_h(avg1, avg1);
177*fb1b10abSAndroid Build Coastguard Worker vec0 = __lsx_vadd_w(vec0, vec1);
178*fb1b10abSAndroid Build Coastguard Worker vec1 = __lsx_vhaddw_w_h(avg2, avg2);
179*fb1b10abSAndroid Build Coastguard Worker vec0 = __lsx_vadd_w(vec0, vec1);
180*fb1b10abSAndroid Build Coastguard Worker vec1 = __lsx_vhaddw_w_h(avg3, avg3);
181*fb1b10abSAndroid Build Coastguard Worker vec0 = __lsx_vadd_w(vec0, vec1);
182*fb1b10abSAndroid Build Coastguard Worker HADD_SW_S32(vec0, *diff);
183*fb1b10abSAndroid Build Coastguard Worker HADD_SW_S32(var, res);
184*fb1b10abSAndroid Build Coastguard Worker return res;
185*fb1b10abSAndroid Build Coastguard Worker }
186*fb1b10abSAndroid Build Coastguard Worker
187*fb1b10abSAndroid Build Coastguard Worker #define VARIANCE_8Wx8H(sse, diff) VARIANCE_WxH(sse, diff, 6)
188*fb1b10abSAndroid Build Coastguard Worker #define VARIANCE_16Wx16H(sse, diff) VARIANCE_WxH(sse, diff, 8)
189*fb1b10abSAndroid Build Coastguard Worker
190*fb1b10abSAndroid Build Coastguard Worker #define VARIANCE_32Wx32H(sse, diff) VARIANCE_LARGE_WxH(sse, diff, 10)
191*fb1b10abSAndroid Build Coastguard Worker #define VARIANCE_64Wx64H(sse, diff) VARIANCE_LARGE_WxH(sse, diff, 12)
192*fb1b10abSAndroid Build Coastguard Worker
193*fb1b10abSAndroid Build Coastguard Worker #define VPX_VARIANCE_WDXHT_LSX(wd, ht) \
194*fb1b10abSAndroid Build Coastguard Worker uint32_t vpx_variance##wd##x##ht##_lsx( \
195*fb1b10abSAndroid Build Coastguard Worker const uint8_t *src, int32_t src_stride, const uint8_t *ref, \
196*fb1b10abSAndroid Build Coastguard Worker int32_t ref_stride, uint32_t *sse) { \
197*fb1b10abSAndroid Build Coastguard Worker int32_t diff; \
198*fb1b10abSAndroid Build Coastguard Worker \
199*fb1b10abSAndroid Build Coastguard Worker *sse = \
200*fb1b10abSAndroid Build Coastguard Worker sse_diff_##wd##width_lsx(src, src_stride, ref, ref_stride, ht, &diff); \
201*fb1b10abSAndroid Build Coastguard Worker \
202*fb1b10abSAndroid Build Coastguard Worker return VARIANCE_##wd##Wx##ht##H(*sse, diff); \
203*fb1b10abSAndroid Build Coastguard Worker }
204*fb1b10abSAndroid Build Coastguard Worker
sse_16width_lsx(const uint8_t * src_ptr,int32_t src_stride,const uint8_t * ref_ptr,int32_t ref_stride,int32_t height)205*fb1b10abSAndroid Build Coastguard Worker static uint32_t sse_16width_lsx(const uint8_t *src_ptr, int32_t src_stride,
206*fb1b10abSAndroid Build Coastguard Worker const uint8_t *ref_ptr, int32_t ref_stride,
207*fb1b10abSAndroid Build Coastguard Worker int32_t height) {
208*fb1b10abSAndroid Build Coastguard Worker int32_t res, ht_cnt = (height >> 2);
209*fb1b10abSAndroid Build Coastguard Worker __m128i src, ref;
210*fb1b10abSAndroid Build Coastguard Worker __m128i var = __lsx_vldi(0);
211*fb1b10abSAndroid Build Coastguard Worker
212*fb1b10abSAndroid Build Coastguard Worker for (; ht_cnt--;) {
213*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, src_ptr, 0, ref_ptr, 0, src, ref);
214*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
215*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
216*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_B(src, ref, var);
217*fb1b10abSAndroid Build Coastguard Worker
218*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, src_ptr, 0, ref_ptr, 0, src, ref);
219*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
220*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
221*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_B(src, ref, var);
222*fb1b10abSAndroid Build Coastguard Worker
223*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, src_ptr, 0, ref_ptr, 0, src, ref);
224*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
225*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
226*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_B(src, ref, var);
227*fb1b10abSAndroid Build Coastguard Worker
228*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vld, src_ptr, 0, ref_ptr, 0, src, ref);
229*fb1b10abSAndroid Build Coastguard Worker src_ptr += src_stride;
230*fb1b10abSAndroid Build Coastguard Worker ref_ptr += ref_stride;
231*fb1b10abSAndroid Build Coastguard Worker CALC_MSE_B(src, ref, var);
232*fb1b10abSAndroid Build Coastguard Worker }
233*fb1b10abSAndroid Build Coastguard Worker HADD_SW_S32(var, res);
234*fb1b10abSAndroid Build Coastguard Worker return res;
235*fb1b10abSAndroid Build Coastguard Worker }
236*fb1b10abSAndroid Build Coastguard Worker
237*fb1b10abSAndroid Build Coastguard Worker VPX_VARIANCE_WDXHT_LSX(8, 8)
238*fb1b10abSAndroid Build Coastguard Worker VPX_VARIANCE_WDXHT_LSX(16, 16)
239*fb1b10abSAndroid Build Coastguard Worker VPX_VARIANCE_WDXHT_LSX(32, 32)
240*fb1b10abSAndroid Build Coastguard Worker
vpx_variance64x64_lsx(const uint8_t * src,int32_t src_stride,const uint8_t * ref,int32_t ref_stride,uint32_t * sse)241*fb1b10abSAndroid Build Coastguard Worker uint32_t vpx_variance64x64_lsx(const uint8_t *src, int32_t src_stride,
242*fb1b10abSAndroid Build Coastguard Worker const uint8_t *ref, int32_t ref_stride,
243*fb1b10abSAndroid Build Coastguard Worker uint32_t *sse) {
244*fb1b10abSAndroid Build Coastguard Worker int32_t diff;
245*fb1b10abSAndroid Build Coastguard Worker
246*fb1b10abSAndroid Build Coastguard Worker *sse = sse_diff_64x64_lsx(src, src_stride, ref, ref_stride, &diff);
247*fb1b10abSAndroid Build Coastguard Worker
248*fb1b10abSAndroid Build Coastguard Worker return VARIANCE_64Wx64H(*sse, diff);
249*fb1b10abSAndroid Build Coastguard Worker }
250*fb1b10abSAndroid Build Coastguard Worker
vpx_mse16x16_lsx(const uint8_t * src,int32_t src_stride,const uint8_t * ref,int32_t ref_stride,uint32_t * sse)251*fb1b10abSAndroid Build Coastguard Worker uint32_t vpx_mse16x16_lsx(const uint8_t *src, int32_t src_stride,
252*fb1b10abSAndroid Build Coastguard Worker const uint8_t *ref, int32_t ref_stride,
253*fb1b10abSAndroid Build Coastguard Worker uint32_t *sse) {
254*fb1b10abSAndroid Build Coastguard Worker *sse = sse_16width_lsx(src, src_stride, ref, ref_stride, 16);
255*fb1b10abSAndroid Build Coastguard Worker
256*fb1b10abSAndroid Build Coastguard Worker return *sse;
257*fb1b10abSAndroid Build Coastguard Worker }
258*fb1b10abSAndroid Build Coastguard Worker
vpx_get16x16var_lsx(const uint8_t * src,int32_t src_stride,const uint8_t * ref,int32_t ref_stride,uint32_t * sse,int32_t * sum)259*fb1b10abSAndroid Build Coastguard Worker void vpx_get16x16var_lsx(const uint8_t *src, int32_t src_stride,
260*fb1b10abSAndroid Build Coastguard Worker const uint8_t *ref, int32_t ref_stride, uint32_t *sse,
261*fb1b10abSAndroid Build Coastguard Worker int32_t *sum) {
262*fb1b10abSAndroid Build Coastguard Worker *sse = sse_diff_16width_lsx(src, src_stride, ref, ref_stride, 16, sum);
263*fb1b10abSAndroid Build Coastguard Worker }
264