xref: /aosp_15_r20/external/libvpx/vpx_dsp/loongarch/variance_lsx.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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 #ifndef VPX_VPX_DSP_LOONGARCH_VARIANCE_LSX_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VPX_DSP_LOONGARCH_VARIANCE_LSX_H_
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include "vpx_util/loongson_intrinsics.h"
15*fb1b10abSAndroid Build Coastguard Worker 
16*fb1b10abSAndroid Build Coastguard Worker #define HADD_SW_S32(in0, in1)                  \
17*fb1b10abSAndroid Build Coastguard Worker   do {                                         \
18*fb1b10abSAndroid Build Coastguard Worker     __m128i res0_m;                            \
19*fb1b10abSAndroid Build Coastguard Worker                                                \
20*fb1b10abSAndroid Build Coastguard Worker     res0_m = __lsx_vhaddw_d_w(in0, in0);       \
21*fb1b10abSAndroid Build Coastguard Worker     res0_m = __lsx_vhaddw_q_d(res0_m, res0_m); \
22*fb1b10abSAndroid Build Coastguard Worker     in1 = __lsx_vpickve2gr_w(res0_m, 0);       \
23*fb1b10abSAndroid Build Coastguard Worker   } while (0)
24*fb1b10abSAndroid Build Coastguard Worker 
25*fb1b10abSAndroid Build Coastguard Worker #define HORIZ_2TAP_FILT_UH(in0, in1, mask, coeff, shift, in2) \
26*fb1b10abSAndroid Build Coastguard Worker   do {                                                        \
27*fb1b10abSAndroid Build Coastguard Worker     __m128i tmp0_m, tmp1_m;                                   \
28*fb1b10abSAndroid Build Coastguard Worker                                                               \
29*fb1b10abSAndroid Build Coastguard Worker     tmp0_m = __lsx_vshuf_b(in1, in0, mask);                   \
30*fb1b10abSAndroid Build Coastguard Worker     tmp1_m = __lsx_vdp2_h_bu(tmp0_m, coeff);                  \
31*fb1b10abSAndroid Build Coastguard Worker     in2 = __lsx_vsrari_h(tmp1_m, shift);                      \
32*fb1b10abSAndroid Build Coastguard Worker   } while (0)
33*fb1b10abSAndroid Build Coastguard Worker 
34*fb1b10abSAndroid Build Coastguard Worker #define CALC_MSE_B(src, ref, var)                                         \
35*fb1b10abSAndroid Build Coastguard Worker   do {                                                                    \
36*fb1b10abSAndroid Build Coastguard Worker     __m128i src_l0_m, src_l1_m;                                           \
37*fb1b10abSAndroid Build Coastguard Worker     __m128i res_l0_m, res_l1_m;                                           \
38*fb1b10abSAndroid Build Coastguard Worker                                                                           \
39*fb1b10abSAndroid Build Coastguard Worker     src_l0_m = __lsx_vilvl_b(src, ref);                                   \
40*fb1b10abSAndroid Build Coastguard Worker     src_l1_m = __lsx_vilvh_b(src, ref);                                   \
41*fb1b10abSAndroid Build Coastguard Worker     DUP2_ARG2(__lsx_vhsubw_hu_bu, src_l0_m, src_l0_m, src_l1_m, src_l1_m, \
42*fb1b10abSAndroid Build Coastguard Worker               res_l0_m, res_l1_m);                                        \
43*fb1b10abSAndroid Build Coastguard Worker     var = __lsx_vdp2add_w_h(var, res_l0_m, res_l0_m);                     \
44*fb1b10abSAndroid Build Coastguard Worker     var = __lsx_vdp2add_w_h(var, res_l1_m, res_l1_m);                     \
45*fb1b10abSAndroid Build Coastguard Worker   } while (0)
46*fb1b10abSAndroid Build Coastguard Worker 
47*fb1b10abSAndroid Build Coastguard Worker #define CALC_MSE_AVG_B(src, ref, var, sub)                                \
48*fb1b10abSAndroid Build Coastguard Worker   do {                                                                    \
49*fb1b10abSAndroid Build Coastguard Worker     __m128i src_l0_m, src_l1_m;                                           \
50*fb1b10abSAndroid Build Coastguard Worker     __m128i res_l0_m, res_l1_m;                                           \
51*fb1b10abSAndroid Build Coastguard Worker                                                                           \
52*fb1b10abSAndroid Build Coastguard Worker     src_l0_m = __lsx_vilvl_b(src, ref);                                   \
53*fb1b10abSAndroid Build Coastguard Worker     src_l1_m = __lsx_vilvh_b(src, ref);                                   \
54*fb1b10abSAndroid Build Coastguard Worker     DUP2_ARG2(__lsx_vhsubw_hu_bu, src_l0_m, src_l0_m, src_l1_m, src_l1_m, \
55*fb1b10abSAndroid Build Coastguard Worker               res_l0_m, res_l1_m);                                        \
56*fb1b10abSAndroid Build Coastguard Worker     var = __lsx_vdp2add_w_h(var, res_l0_m, res_l0_m);                     \
57*fb1b10abSAndroid Build Coastguard Worker     var = __lsx_vdp2add_w_h(var, res_l1_m, res_l1_m);                     \
58*fb1b10abSAndroid Build Coastguard Worker     sub = __lsx_vadd_h(sub, res_l0_m);                                    \
59*fb1b10abSAndroid Build Coastguard Worker     sub = __lsx_vadd_h(sub, res_l1_m);                                    \
60*fb1b10abSAndroid Build Coastguard Worker   } while (0)
61*fb1b10abSAndroid Build Coastguard Worker 
62*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_VPX_DSP_LOONGARCH_VARIANCE_LSX_H_
63