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 "./vp8_rtcd.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "vpx_util/loongson_intrinsics.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "vp8/encoder/block.h"
14*fb1b10abSAndroid Build Coastguard Worker
vp8_block_error_lsx(int16_t * coeff_ptr,int16_t * dq_coeff_ptr)15*fb1b10abSAndroid Build Coastguard Worker int32_t vp8_block_error_lsx(int16_t *coeff_ptr, int16_t *dq_coeff_ptr) {
16*fb1b10abSAndroid Build Coastguard Worker int32_t err = 0;
17*fb1b10abSAndroid Build Coastguard Worker __m128i dq_coeff0, dq_coeff1, coeff0, coeff1;
18*fb1b10abSAndroid Build Coastguard Worker __m128i reg0, reg1, reg2, reg3, error;
19*fb1b10abSAndroid Build Coastguard Worker
20*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vld, coeff_ptr, 0, coeff_ptr, 16, dq_coeff_ptr, 0,
21*fb1b10abSAndroid Build Coastguard Worker dq_coeff_ptr, 16, coeff0, coeff1, dq_coeff0, dq_coeff1);
22*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vsubwev_w_h, coeff0, dq_coeff0, coeff1, dq_coeff1, reg0,
23*fb1b10abSAndroid Build Coastguard Worker reg2);
24*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG2(__lsx_vsubwod_w_h, coeff0, dq_coeff0, coeff1, dq_coeff1, reg1,
25*fb1b10abSAndroid Build Coastguard Worker reg3);
26*fb1b10abSAndroid Build Coastguard Worker error = __lsx_vmul_w(reg0, reg0);
27*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG3(__lsx_vmadd_w, error, reg1, reg1, error, reg2, reg2, error, error);
28*fb1b10abSAndroid Build Coastguard Worker error = __lsx_vmadd_w(error, reg3, reg3);
29*fb1b10abSAndroid Build Coastguard Worker error = __lsx_vhaddw_d_w(error, error);
30*fb1b10abSAndroid Build Coastguard Worker err = __lsx_vpickve2gr_w(error, 0);
31*fb1b10abSAndroid Build Coastguard Worker err += __lsx_vpickve2gr_w(error, 2);
32*fb1b10abSAndroid Build Coastguard Worker return err;
33*fb1b10abSAndroid Build Coastguard Worker }
34*fb1b10abSAndroid Build Coastguard Worker
vp8_mbblock_error_lsx(MACROBLOCK * mb,int32_t dc)35*fb1b10abSAndroid Build Coastguard Worker int32_t vp8_mbblock_error_lsx(MACROBLOCK *mb, int32_t dc) {
36*fb1b10abSAndroid Build Coastguard Worker BLOCK *be;
37*fb1b10abSAndroid Build Coastguard Worker BLOCKD *bd;
38*fb1b10abSAndroid Build Coastguard Worker int16_t *coeff, *dq_coeff;
39*fb1b10abSAndroid Build Coastguard Worker int32_t err = 0;
40*fb1b10abSAndroid Build Coastguard Worker uint32_t loop_cnt;
41*fb1b10abSAndroid Build Coastguard Worker __m128i src0, src1, src2, src3;
42*fb1b10abSAndroid Build Coastguard Worker __m128i tmp0, tmp1, tmp2, tmp3;
43*fb1b10abSAndroid Build Coastguard Worker __m128i reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7, error;
44*fb1b10abSAndroid Build Coastguard Worker __m128i mask0 = __lsx_vldi(0xFF);
45*fb1b10abSAndroid Build Coastguard Worker __m128i zero = __lsx_vldi(0);
46*fb1b10abSAndroid Build Coastguard Worker
47*fb1b10abSAndroid Build Coastguard Worker if (dc == 1) {
48*fb1b10abSAndroid Build Coastguard Worker mask0 = __lsx_vinsgr2vr_w(mask0, 0, 0);
49*fb1b10abSAndroid Build Coastguard Worker }
50*fb1b10abSAndroid Build Coastguard Worker
51*fb1b10abSAndroid Build Coastguard Worker for (loop_cnt = 0; loop_cnt < 8; loop_cnt++) {
52*fb1b10abSAndroid Build Coastguard Worker int32_t loop_tmp = loop_cnt << 1;
53*fb1b10abSAndroid Build Coastguard Worker be = &mb->block[loop_tmp];
54*fb1b10abSAndroid Build Coastguard Worker bd = &mb->e_mbd.block[loop_tmp];
55*fb1b10abSAndroid Build Coastguard Worker coeff = be->coeff;
56*fb1b10abSAndroid Build Coastguard Worker dq_coeff = bd->dqcoeff;
57*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vld, coeff, 0, coeff, 16, dq_coeff, 0, dq_coeff, 16, src0,
58*fb1b10abSAndroid Build Coastguard Worker src1, tmp0, tmp1);
59*fb1b10abSAndroid Build Coastguard Worker be = &mb->block[loop_tmp + 1];
60*fb1b10abSAndroid Build Coastguard Worker bd = &mb->e_mbd.block[loop_tmp + 1];
61*fb1b10abSAndroid Build Coastguard Worker coeff = be->coeff;
62*fb1b10abSAndroid Build Coastguard Worker dq_coeff = bd->dqcoeff;
63*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vld, coeff, 0, coeff, 16, dq_coeff, 0, dq_coeff, 16, src2,
64*fb1b10abSAndroid Build Coastguard Worker src3, tmp2, tmp3);
65*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vsubwev_w_h, src0, tmp0, src1, tmp1, src2, tmp2, src3, tmp3,
66*fb1b10abSAndroid Build Coastguard Worker reg0, reg2, reg4, reg6);
67*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG2(__lsx_vsubwod_w_h, src0, tmp0, src1, tmp1, src2, tmp2, src3, tmp3,
68*fb1b10abSAndroid Build Coastguard Worker reg1, reg3, reg5, reg7);
69*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG3(__lsx_vbitsel_v, zero, reg0, mask0, zero, reg4, mask0, reg0,
70*fb1b10abSAndroid Build Coastguard Worker reg4);
71*fb1b10abSAndroid Build Coastguard Worker error = __lsx_vmul_w(reg0, reg0);
72*fb1b10abSAndroid Build Coastguard Worker DUP4_ARG3(__lsx_vmadd_w, error, reg1, reg1, error, reg2, reg2, error, reg3,
73*fb1b10abSAndroid Build Coastguard Worker reg3, error, reg4, reg4, error, error, error, error);
74*fb1b10abSAndroid Build Coastguard Worker DUP2_ARG3(__lsx_vmadd_w, error, reg5, reg5, error, reg6, reg6, error,
75*fb1b10abSAndroid Build Coastguard Worker error);
76*fb1b10abSAndroid Build Coastguard Worker error = __lsx_vmadd_w(error, reg7, reg7);
77*fb1b10abSAndroid Build Coastguard Worker error = __lsx_vhaddw_d_w(error, error);
78*fb1b10abSAndroid Build Coastguard Worker error = __lsx_vhaddw_q_d(error, error);
79*fb1b10abSAndroid Build Coastguard Worker err += __lsx_vpickve2gr_w(error, 0);
80*fb1b10abSAndroid Build Coastguard Worker }
81*fb1b10abSAndroid Build Coastguard Worker return err;
82*fb1b10abSAndroid Build Coastguard Worker }
83