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