1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2022 Loongson Technology Corporation Limited 3cabdff1aSopenharmony_ci * Contributed by Shiyou Yin <yinshiyou-hf@loongson.cn> 4cabdff1aSopenharmony_ci * Hao Chen <chenhao@loongson.cn> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#include "libavutil/loongarch/loongson_intrinsics.h" 24cabdff1aSopenharmony_ci#include "hevcdsp_lsx.h" 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_cistatic const int16_t gt8x8_cnst[16] __attribute__ ((aligned (64))) = { 27cabdff1aSopenharmony_ci 64, 64, 83, 36, 89, 50, 18, 75, 64, -64, 36, -83, 75, -89, -50, -18 28cabdff1aSopenharmony_ci}; 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_cistatic const int16_t gt16x16_cnst[64] __attribute__ ((aligned (64))) = { 31cabdff1aSopenharmony_ci 64, 83, 64, 36, 89, 75, 50, 18, 90, 80, 57, 25, 70, 87, 9, 43, 32cabdff1aSopenharmony_ci 64, 36, -64, -83, 75, -18, -89, -50, 87, 9, -80, -70, -43, 57, -25, -90, 33cabdff1aSopenharmony_ci 64, -36, -64, 83, 50, -89, 18, 75, 80, -70, -25, 90, -87, 9, 43, 57, 34cabdff1aSopenharmony_ci 64, -83, 64, -36, 18, -50, 75, -89, 70, -87, 90, -80, 9, -43, -57, 25 35cabdff1aSopenharmony_ci}; 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_cistatic const int16_t gt32x32_cnst0[256] __attribute__ ((aligned (64))) = { 38cabdff1aSopenharmony_ci 90, 90, 88, 85, 82, 78, 73, 67, 61, 54, 46, 38, 31, 22, 13, 4, 39cabdff1aSopenharmony_ci 90, 82, 67, 46, 22, -4, -31, -54, -73, -85, -90, -88, -78, -61, -38, -13, 40cabdff1aSopenharmony_ci 88, 67, 31, -13, -54, -82, -90, -78, -46, -4, 38, 73, 90, 85, 61, 22, 41cabdff1aSopenharmony_ci 85, 46, -13, -67, -90, -73, -22, 38, 82, 88, 54, -4, -61, -90, -78, -31, 42cabdff1aSopenharmony_ci 82, 22, -54, -90, -61, 13, 78, 85, 31, -46, -90, -67, 4, 73, 88, 38, 43cabdff1aSopenharmony_ci 78, -4, -82, -73, 13, 85, 67, -22, -88, -61, 31, 90, 54, -38, -90, -46, 44cabdff1aSopenharmony_ci 73, -31, -90, -22, 78, 67, -38, -90, -13, 82, 61, -46, -88, -4, 85, 54, 45cabdff1aSopenharmony_ci 67, -54, -78, 38, 85, -22, -90, 4, 90, 13, -88, -31, 82, 46, -73, -61, 46cabdff1aSopenharmony_ci 61, -73, -46, 82, 31, -88, -13, 90, -4, -90, 22, 85, -38, -78, 54, 67, 47cabdff1aSopenharmony_ci 54, -85, -4, 88, -46, -61, 82, 13, -90, 38, 67, -78, -22, 90, -31, -73, 48cabdff1aSopenharmony_ci 46, -90, 38, 54, -90, 31, 61, -88, 22, 67, -85, 13, 73, -82, 4, 78, 49cabdff1aSopenharmony_ci 38, -88, 73, -4, -67, 90, -46, -31, 85, -78, 13, 61, -90, 54, 22, -82, 50cabdff1aSopenharmony_ci 31, -78, 90, -61, 4, 54, -88, 82, -38, -22, 73, -90, 67, -13, -46, 85, 51cabdff1aSopenharmony_ci 22, -61, 85, -90, 73, -38, -4, 46, -78, 90, -82, 54, -13, -31, 67, -88, 52cabdff1aSopenharmony_ci 13, -38, 61, -78, 88, -90, 85, -73, 54, -31, 4, 22, -46, 67, -82, 90, 53cabdff1aSopenharmony_ci 4, -13, 22, -31, 38, -46, 54, -61, 67, -73, 78, -82, 85, -88, 90, -90 54cabdff1aSopenharmony_ci}; 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_cistatic const int16_t gt32x32_cnst1[64] __attribute__ ((aligned (64))) = { 57cabdff1aSopenharmony_ci 90, 87, 80, 70, 57, 43, 25, 9, 87, 57, 9, -43, -80, -90, -70, -25, 58cabdff1aSopenharmony_ci 80, 9, -70, -87, -25, 57, 90, 43, 70, -43, -87, 9, 90, 25, -80, -57, 59cabdff1aSopenharmony_ci 57, -80, -25, 90, -9, -87, 43, 70, 43, -90, 57, 25, -87, 70, 9, -80, 60cabdff1aSopenharmony_ci 25, -70, 90, -80, 43, 9, -57, 87, 9, -25, 43, -57, 70, -80, 87, -90 61cabdff1aSopenharmony_ci}; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_cistatic const int16_t gt32x32_cnst2[16] __attribute__ ((aligned (64))) = { 64cabdff1aSopenharmony_ci 89, 75, 50, 18, 75, -18, -89, -50, 50, -89, 18, 75, 18, -50, 75, -89 65cabdff1aSopenharmony_ci}; 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_ci#define HEVC_IDCT4x4_COL(in_r0, in_l0, in_r1, in_l1, \ 68cabdff1aSopenharmony_ci sum0, sum1, sum2, sum3, shift) \ 69cabdff1aSopenharmony_ci{ \ 70cabdff1aSopenharmony_ci __m128i vec0, vec1, vec2, vec3, vec4, vec5; \ 71cabdff1aSopenharmony_ci __m128i cnst64 = __lsx_vldi(0x0840); \ 72cabdff1aSopenharmony_ci __m128i cnst83 = __lsx_vldi(0x0853); \ 73cabdff1aSopenharmony_ci __m128i cnst36 = __lsx_vldi(0x0824); \ 74cabdff1aSopenharmony_ci \ 75cabdff1aSopenharmony_ci vec0 = __lsx_vdp2_w_h(in_r0, cnst64); \ 76cabdff1aSopenharmony_ci vec1 = __lsx_vdp2_w_h(in_l0, cnst83); \ 77cabdff1aSopenharmony_ci vec2 = __lsx_vdp2_w_h(in_r1, cnst64); \ 78cabdff1aSopenharmony_ci vec3 = __lsx_vdp2_w_h(in_l1, cnst36); \ 79cabdff1aSopenharmony_ci vec4 = __lsx_vdp2_w_h(in_l0, cnst36); \ 80cabdff1aSopenharmony_ci vec5 = __lsx_vdp2_w_h(in_l1, cnst83); \ 81cabdff1aSopenharmony_ci \ 82cabdff1aSopenharmony_ci sum0 = __lsx_vadd_w(vec0, vec2); \ 83cabdff1aSopenharmony_ci sum1 = __lsx_vsub_w(vec0, vec2); \ 84cabdff1aSopenharmony_ci vec1 = __lsx_vadd_w(vec1, vec3); \ 85cabdff1aSopenharmony_ci vec4 = __lsx_vsub_w(vec4, vec5); \ 86cabdff1aSopenharmony_ci sum2 = __lsx_vsub_w(sum1, vec4); \ 87cabdff1aSopenharmony_ci sum3 = __lsx_vsub_w(sum0, vec1); \ 88cabdff1aSopenharmony_ci sum0 = __lsx_vadd_w(sum0, vec1); \ 89cabdff1aSopenharmony_ci sum1 = __lsx_vadd_w(sum1, vec4); \ 90cabdff1aSopenharmony_ci \ 91cabdff1aSopenharmony_ci sum0 = __lsx_vsrari_w(sum0, shift); \ 92cabdff1aSopenharmony_ci sum1 = __lsx_vsrari_w(sum1, shift); \ 93cabdff1aSopenharmony_ci sum2 = __lsx_vsrari_w(sum2, shift); \ 94cabdff1aSopenharmony_ci sum3 = __lsx_vsrari_w(sum3, shift); \ 95cabdff1aSopenharmony_ci sum0 = __lsx_vsat_w(sum0, 15); \ 96cabdff1aSopenharmony_ci sum1 = __lsx_vsat_w(sum1, 15); \ 97cabdff1aSopenharmony_ci sum2 = __lsx_vsat_w(sum2, 15); \ 98cabdff1aSopenharmony_ci sum3 = __lsx_vsat_w(sum3, 15); \ 99cabdff1aSopenharmony_ci} 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci#define HEVC_IDCT8x8_COL(in0, in1, in2, in3, in4, in5, in6, in7, shift) \ 102cabdff1aSopenharmony_ci{ \ 103cabdff1aSopenharmony_ci __m128i src0_r, src1_r, src2_r, src3_r; \ 104cabdff1aSopenharmony_ci __m128i src0_l, src1_l, src2_l, src3_l; \ 105cabdff1aSopenharmony_ci __m128i filter0, filter1, filter2, filter3; \ 106cabdff1aSopenharmony_ci __m128i temp0_r, temp1_r, temp2_r, temp3_r, temp4_r, temp5_r; \ 107cabdff1aSopenharmony_ci __m128i temp0_l, temp1_l, temp2_l, temp3_l, temp4_l, temp5_l; \ 108cabdff1aSopenharmony_ci __m128i sum0_r, sum1_r, sum2_r, sum3_r; \ 109cabdff1aSopenharmony_ci __m128i sum0_l, sum1_l, sum2_l, sum3_l; \ 110cabdff1aSopenharmony_ci \ 111cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvl_h, in4, in0, in6, in2, in5, in1, in3, in7, \ 112cabdff1aSopenharmony_ci src0_r, src1_r, src2_r, src3_r); \ 113cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvh_h, in4, in0, in6, in2, in5, in1, in3, in7, \ 114cabdff1aSopenharmony_ci src0_l, src1_l, src2_l, src3_l); \ 115cabdff1aSopenharmony_ci \ 116cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vldrepl_w, filter, 0, filter, 4, filter, 8, \ 117cabdff1aSopenharmony_ci filter, 12, filter0, filter1, filter2, filter3); \ 118cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vdp2_w_h, src0_r, filter0, src0_l, filter0, \ 119cabdff1aSopenharmony_ci src1_r, filter1, src1_l, filter1, temp0_r, temp0_l, \ 120cabdff1aSopenharmony_ci temp1_r, temp1_l); \ 121cabdff1aSopenharmony_ci \ 122cabdff1aSopenharmony_ci LSX_BUTTERFLY_4_W(temp0_r, temp0_l, temp1_l, temp1_r, sum0_r, sum0_l,\ 123cabdff1aSopenharmony_ci sum1_l, sum1_r); \ 124cabdff1aSopenharmony_ci sum2_r = sum1_r; \ 125cabdff1aSopenharmony_ci sum2_l = sum1_l; \ 126cabdff1aSopenharmony_ci sum3_r = sum0_r; \ 127cabdff1aSopenharmony_ci sum3_l = sum0_l; \ 128cabdff1aSopenharmony_ci \ 129cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter2, src2_l, filter2, \ 130cabdff1aSopenharmony_ci src3_r, filter3, src3_l, filter3, temp2_r, temp2_l, \ 131cabdff1aSopenharmony_ci temp3_r, temp3_l); \ 132cabdff1aSopenharmony_ci temp2_r = __lsx_vadd_w(temp2_r, temp3_r); \ 133cabdff1aSopenharmony_ci temp2_l = __lsx_vadd_w(temp2_l, temp3_l); \ 134cabdff1aSopenharmony_ci sum0_r = __lsx_vadd_w(sum0_r, temp2_r); \ 135cabdff1aSopenharmony_ci sum0_l = __lsx_vadd_w(sum0_l, temp2_l); \ 136cabdff1aSopenharmony_ci sum3_r = __lsx_vsub_w(sum3_r, temp2_r); \ 137cabdff1aSopenharmony_ci sum3_l = __lsx_vsub_w(sum3_l, temp2_l); \ 138cabdff1aSopenharmony_ci \ 139cabdff1aSopenharmony_ci in0 = __lsx_vssrarni_h_w(sum0_l, sum0_r, shift); \ 140cabdff1aSopenharmony_ci in7 = __lsx_vssrarni_h_w(sum3_l, sum3_r, shift); \ 141cabdff1aSopenharmony_ci \ 142cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter3, src2_l, filter3, \ 143cabdff1aSopenharmony_ci src3_r, filter2, src3_l, filter2, temp4_r, temp4_l, \ 144cabdff1aSopenharmony_ci temp5_r, temp5_l); \ 145cabdff1aSopenharmony_ci temp4_r = __lsx_vsub_w(temp4_r, temp5_r); \ 146cabdff1aSopenharmony_ci temp4_l = __lsx_vsub_w(temp4_l, temp5_l); \ 147cabdff1aSopenharmony_ci sum1_r = __lsx_vadd_w(sum1_r, temp4_r); \ 148cabdff1aSopenharmony_ci sum1_l = __lsx_vadd_w(sum1_l, temp4_l); \ 149cabdff1aSopenharmony_ci sum2_r = __lsx_vsub_w(sum2_r, temp4_r); \ 150cabdff1aSopenharmony_ci sum2_l = __lsx_vsub_w(sum2_l, temp4_l); \ 151cabdff1aSopenharmony_ci \ 152cabdff1aSopenharmony_ci in3 = __lsx_vssrarni_h_w(sum1_l, sum1_r, shift); \ 153cabdff1aSopenharmony_ci in4 = __lsx_vssrarni_h_w(sum2_l, sum2_r, shift); \ 154cabdff1aSopenharmony_ci \ 155cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vldrepl_w, filter, 16, filter, 20, filter, 24, \ 156cabdff1aSopenharmony_ci filter, 28, filter0, filter1, filter2, filter3); \ 157cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vdp2_w_h, src0_r, filter0, src0_l, filter0, \ 158cabdff1aSopenharmony_ci src1_r, filter1, src1_l, filter1, temp0_r, temp0_l, \ 159cabdff1aSopenharmony_ci temp1_r, temp1_l); \ 160cabdff1aSopenharmony_ci \ 161cabdff1aSopenharmony_ci LSX_BUTTERFLY_4_W(temp0_r, temp0_l, temp1_l, temp1_r, sum0_r, sum0_l,\ 162cabdff1aSopenharmony_ci sum1_l, sum1_r); \ 163cabdff1aSopenharmony_ci sum2_r = sum1_r; \ 164cabdff1aSopenharmony_ci sum2_l = sum1_l; \ 165cabdff1aSopenharmony_ci sum3_r = sum0_r; \ 166cabdff1aSopenharmony_ci sum3_l = sum0_l; \ 167cabdff1aSopenharmony_ci \ 168cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter2, src2_l, filter2, \ 169cabdff1aSopenharmony_ci src3_r, filter3, src3_l, filter3, temp2_r, temp2_l, \ 170cabdff1aSopenharmony_ci temp3_r, temp3_l); \ 171cabdff1aSopenharmony_ci temp2_r = __lsx_vadd_w(temp2_r, temp3_r); \ 172cabdff1aSopenharmony_ci temp2_l = __lsx_vadd_w(temp2_l, temp3_l); \ 173cabdff1aSopenharmony_ci sum0_r = __lsx_vadd_w(sum0_r, temp2_r); \ 174cabdff1aSopenharmony_ci sum0_l = __lsx_vadd_w(sum0_l, temp2_l); \ 175cabdff1aSopenharmony_ci sum3_r = __lsx_vsub_w(sum3_r, temp2_r); \ 176cabdff1aSopenharmony_ci sum3_l = __lsx_vsub_w(sum3_l, temp2_l); \ 177cabdff1aSopenharmony_ci \ 178cabdff1aSopenharmony_ci in1 = __lsx_vssrarni_h_w(sum0_l, sum0_r, shift); \ 179cabdff1aSopenharmony_ci in6 = __lsx_vssrarni_h_w(sum3_l, sum3_r, shift); \ 180cabdff1aSopenharmony_ci \ 181cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter3, src2_l, filter3, \ 182cabdff1aSopenharmony_ci src3_r, filter2, src3_l, filter2, temp4_r, temp4_l, \ 183cabdff1aSopenharmony_ci temp5_r, temp5_l); \ 184cabdff1aSopenharmony_ci temp4_r = __lsx_vsub_w(temp4_r, temp5_r); \ 185cabdff1aSopenharmony_ci temp4_l = __lsx_vsub_w(temp4_l, temp5_l); \ 186cabdff1aSopenharmony_ci sum1_r = __lsx_vsub_w(sum1_r, temp4_r); \ 187cabdff1aSopenharmony_ci sum1_l = __lsx_vsub_w(sum1_l, temp4_l); \ 188cabdff1aSopenharmony_ci sum2_r = __lsx_vadd_w(sum2_r, temp4_r); \ 189cabdff1aSopenharmony_ci sum2_l = __lsx_vadd_w(sum2_l, temp4_l); \ 190cabdff1aSopenharmony_ci \ 191cabdff1aSopenharmony_ci in2 = __lsx_vssrarni_h_w(sum1_l, sum1_r, shift); \ 192cabdff1aSopenharmony_ci in5 = __lsx_vssrarni_h_w(sum2_l, sum2_r, shift); \ 193cabdff1aSopenharmony_ci} 194cabdff1aSopenharmony_ci 195cabdff1aSopenharmony_ci#define HEVC_IDCT16x16_COL(src0_r, src1_r, src2_r, src3_r, \ 196cabdff1aSopenharmony_ci src4_r, src5_r, src6_r, src7_r, \ 197cabdff1aSopenharmony_ci src0_l, src1_l, src2_l, src3_l, \ 198cabdff1aSopenharmony_ci src4_l, src5_l, src6_l, src7_l, shift) \ 199cabdff1aSopenharmony_ci{ \ 200cabdff1aSopenharmony_ci int16_t *ptr0, *ptr1; \ 201cabdff1aSopenharmony_ci __m128i dst0, dst1; \ 202cabdff1aSopenharmony_ci __m128i filter0, filter1, filter2, filter3; \ 203cabdff1aSopenharmony_ci __m128i temp0_r, temp1_r, temp0_l, temp1_l; \ 204cabdff1aSopenharmony_ci __m128i sum0_r, sum1_r, sum2_r, sum3_r, sum0_l, sum1_l, sum2_l; \ 205cabdff1aSopenharmony_ci __m128i sum3_l, res0_r, res1_r, res0_l, res1_l; \ 206cabdff1aSopenharmony_ci \ 207cabdff1aSopenharmony_ci ptr0 = (buf_ptr + 112); \ 208cabdff1aSopenharmony_ci ptr1 = (buf_ptr + 128); \ 209cabdff1aSopenharmony_ci k = -1; \ 210cabdff1aSopenharmony_ci \ 211cabdff1aSopenharmony_ci for (j = 0; j < 4; j++) \ 212cabdff1aSopenharmony_ci { \ 213cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vldrepl_w, filter, 0, filter, 4, filter, 16, \ 214cabdff1aSopenharmony_ci filter, 20, filter0, filter1, filter2, filter3); \ 215cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vdp2_w_h, src0_r, filter0, src0_l, filter0, \ 216cabdff1aSopenharmony_ci src4_r, filter2, src4_l, filter2, sum0_r, sum0_l, \ 217cabdff1aSopenharmony_ci sum2_r, sum2_l); \ 218cabdff1aSopenharmony_ci DUP2_ARG2(__lsx_vdp2_w_h, src7_r, filter2, src7_l, filter2, \ 219cabdff1aSopenharmony_ci sum3_r, sum3_l); \ 220cabdff1aSopenharmony_ci DUP4_ARG3(__lsx_vdp2add_w_h, sum0_r, src1_r, filter1, sum0_l, \ 221cabdff1aSopenharmony_ci src1_l, filter1, sum2_r, src5_r, filter3, sum2_l, \ 222cabdff1aSopenharmony_ci src5_l, filter3, sum0_r, sum0_l, sum2_r, sum2_l); \ 223cabdff1aSopenharmony_ci DUP2_ARG3(__lsx_vdp2add_w_h, sum3_r, src6_r, filter3, sum3_l, \ 224cabdff1aSopenharmony_ci src6_l, filter3, sum3_r, sum3_l); \ 225cabdff1aSopenharmony_ci \ 226cabdff1aSopenharmony_ci sum1_r = sum0_r; \ 227cabdff1aSopenharmony_ci sum1_l = sum0_l; \ 228cabdff1aSopenharmony_ci \ 229cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vldrepl_w, filter, 8, filter, 12, filter, 24, \ 230cabdff1aSopenharmony_ci filter, 28, filter0, filter1, filter2, filter3); \ 231cabdff1aSopenharmony_ci filter += 16; \ 232cabdff1aSopenharmony_ci DUP2_ARG2(__lsx_vdp2_w_h, src2_r, filter0, src2_l, filter0, \ 233cabdff1aSopenharmony_ci temp0_r, temp0_l); \ 234cabdff1aSopenharmony_ci DUP2_ARG3(__lsx_vdp2add_w_h, sum2_r, src6_r, filter2, sum2_l, \ 235cabdff1aSopenharmony_ci src6_l, filter2, sum2_r, sum2_l); \ 236cabdff1aSopenharmony_ci DUP2_ARG2(__lsx_vdp2_w_h, src5_r, filter2, src5_l, filter2, \ 237cabdff1aSopenharmony_ci temp1_r, temp1_l); \ 238cabdff1aSopenharmony_ci \ 239cabdff1aSopenharmony_ci sum0_r = __lsx_vadd_w(sum0_r, temp0_r); \ 240cabdff1aSopenharmony_ci sum0_l = __lsx_vadd_w(sum0_l, temp0_l); \ 241cabdff1aSopenharmony_ci sum1_r = __lsx_vsub_w(sum1_r, temp0_r); \ 242cabdff1aSopenharmony_ci sum1_l = __lsx_vsub_w(sum1_l, temp0_l); \ 243cabdff1aSopenharmony_ci sum3_r = __lsx_vsub_w(temp1_r, sum3_r); \ 244cabdff1aSopenharmony_ci sum3_l = __lsx_vsub_w(temp1_l, sum3_l); \ 245cabdff1aSopenharmony_ci \ 246cabdff1aSopenharmony_ci DUP2_ARG2(__lsx_vdp2_w_h, src3_r, filter1, src3_l, filter1, \ 247cabdff1aSopenharmony_ci temp0_r, temp0_l); \ 248cabdff1aSopenharmony_ci DUP4_ARG3(__lsx_vdp2add_w_h, sum2_r, src7_r, filter3, sum2_l, \ 249cabdff1aSopenharmony_ci src7_l, filter3, sum3_r, src4_r, filter3, sum3_l, \ 250cabdff1aSopenharmony_ci src4_l, filter3, sum2_r, sum2_l, sum3_r, sum3_l); \ 251cabdff1aSopenharmony_ci \ 252cabdff1aSopenharmony_ci sum0_r = __lsx_vadd_w(sum0_r, temp0_r); \ 253cabdff1aSopenharmony_ci sum0_l = __lsx_vadd_w(sum0_l, temp0_l); \ 254cabdff1aSopenharmony_ci sum1_r = __lsx_vsub_w(sum1_r, temp0_r); \ 255cabdff1aSopenharmony_ci sum1_l = __lsx_vsub_w(sum1_l, temp0_l); \ 256cabdff1aSopenharmony_ci \ 257cabdff1aSopenharmony_ci LSX_BUTTERFLY_4_W(sum0_r, sum0_l, sum2_l, sum2_r, res0_r, res0_l, \ 258cabdff1aSopenharmony_ci res1_l, res1_r); \ 259cabdff1aSopenharmony_ci dst0 = __lsx_vssrarni_h_w(res0_l, res0_r, shift); \ 260cabdff1aSopenharmony_ci dst1 = __lsx_vssrarni_h_w(res1_l, res1_r, shift); \ 261cabdff1aSopenharmony_ci __lsx_vst(dst0, buf_ptr, 0); \ 262cabdff1aSopenharmony_ci __lsx_vst(dst1, (buf_ptr + ((15 - (j * 2)) << 4)), 0); \ 263cabdff1aSopenharmony_ci \ 264cabdff1aSopenharmony_ci LSX_BUTTERFLY_4_W(sum1_r, sum1_l, sum3_l, sum3_r, res0_r, res0_l, \ 265cabdff1aSopenharmony_ci res1_l, res1_r); \ 266cabdff1aSopenharmony_ci \ 267cabdff1aSopenharmony_ci dst0 = __lsx_vssrarni_h_w(res0_l, res0_r, shift); \ 268cabdff1aSopenharmony_ci dst1 = __lsx_vssrarni_h_w(res1_l, res1_r, shift); \ 269cabdff1aSopenharmony_ci __lsx_vst(dst0, (ptr0 + ((((j + 1) >> 1) * 2 * k) << 4)), 0); \ 270cabdff1aSopenharmony_ci __lsx_vst(dst1, (ptr1 - ((((j + 1) >> 1) * 2 * k) << 4)), 0); \ 271cabdff1aSopenharmony_ci \ 272cabdff1aSopenharmony_ci k *= -1; \ 273cabdff1aSopenharmony_ci buf_ptr += 16; \ 274cabdff1aSopenharmony_ci } \ 275cabdff1aSopenharmony_ci} 276cabdff1aSopenharmony_ci 277cabdff1aSopenharmony_ci#define HEVC_EVEN16_CALC(input, sum0_r, sum0_l, load_idx, store_idx) \ 278cabdff1aSopenharmony_ci{ \ 279cabdff1aSopenharmony_ci tmp0_r = __lsx_vld(input + load_idx * 8, 0); \ 280cabdff1aSopenharmony_ci tmp0_l = __lsx_vld(input + load_idx * 8, 16); \ 281cabdff1aSopenharmony_ci tmp1_r = sum0_r; \ 282cabdff1aSopenharmony_ci tmp1_l = sum0_l; \ 283cabdff1aSopenharmony_ci sum0_r = __lsx_vadd_w(sum0_r, tmp0_r); \ 284cabdff1aSopenharmony_ci sum0_l = __lsx_vadd_w(sum0_l, tmp0_l); \ 285cabdff1aSopenharmony_ci __lsx_vst(sum0_r, (input + load_idx * 8), 0); \ 286cabdff1aSopenharmony_ci __lsx_vst(sum0_l, (input + load_idx * 8), 16); \ 287cabdff1aSopenharmony_ci tmp1_r = __lsx_vsub_w(tmp1_r, tmp0_r); \ 288cabdff1aSopenharmony_ci tmp1_l = __lsx_vsub_w(tmp1_l, tmp0_l); \ 289cabdff1aSopenharmony_ci __lsx_vst(tmp1_r, (input + store_idx * 8), 0); \ 290cabdff1aSopenharmony_ci __lsx_vst(tmp1_l, (input + store_idx * 8), 16); \ 291cabdff1aSopenharmony_ci} 292cabdff1aSopenharmony_ci 293cabdff1aSopenharmony_ci#define HEVC_IDCT_LUMA4x4_COL(in_r0, in_l0, in_r1, in_l1, \ 294cabdff1aSopenharmony_ci res0, res1, res2, res3, shift) \ 295cabdff1aSopenharmony_ci{ \ 296cabdff1aSopenharmony_ci __m128i vec0, vec1, vec2, vec3; \ 297cabdff1aSopenharmony_ci __m128i cnst74 = __lsx_vldi(0x84a); \ 298cabdff1aSopenharmony_ci __m128i cnst55 = __lsx_vldi(0x837); \ 299cabdff1aSopenharmony_ci __m128i cnst29 = __lsx_vldi(0x81d); \ 300cabdff1aSopenharmony_ci \ 301cabdff1aSopenharmony_ci vec0 = __lsx_vadd_w(in_r0, in_r1); \ 302cabdff1aSopenharmony_ci vec2 = __lsx_vsub_w(in_r0, in_l1); \ 303cabdff1aSopenharmony_ci res0 = __lsx_vmul_w(vec0, cnst29); \ 304cabdff1aSopenharmony_ci res1 = __lsx_vmul_w(vec2, cnst55); \ 305cabdff1aSopenharmony_ci res2 = __lsx_vsub_w(in_r0, in_r1); \ 306cabdff1aSopenharmony_ci vec1 = __lsx_vadd_w(in_r1, in_l1); \ 307cabdff1aSopenharmony_ci res2 = __lsx_vadd_w(res2, in_l1); \ 308cabdff1aSopenharmony_ci vec3 = __lsx_vmul_w(in_l0, cnst74); \ 309cabdff1aSopenharmony_ci res3 = __lsx_vmul_w(vec0, cnst55); \ 310cabdff1aSopenharmony_ci \ 311cabdff1aSopenharmony_ci res0 = __lsx_vadd_w(res0, __lsx_vmul_w(vec1, cnst55)); \ 312cabdff1aSopenharmony_ci res1 = __lsx_vsub_w(res1, __lsx_vmul_w(vec1, cnst29)); \ 313cabdff1aSopenharmony_ci res2 = __lsx_vmul_w(res2, cnst74); \ 314cabdff1aSopenharmony_ci res3 = __lsx_vadd_w(res3, __lsx_vmul_w(vec2, cnst29)); \ 315cabdff1aSopenharmony_ci \ 316cabdff1aSopenharmony_ci res0 = __lsx_vadd_w(res0, vec3); \ 317cabdff1aSopenharmony_ci res1 = __lsx_vadd_w(res1, vec3); \ 318cabdff1aSopenharmony_ci res3 = __lsx_vsub_w(res3, vec3); \ 319cabdff1aSopenharmony_ci \ 320cabdff1aSopenharmony_ci res0 = __lsx_vsrari_w(res0, shift); \ 321cabdff1aSopenharmony_ci res1 = __lsx_vsrari_w(res1, shift); \ 322cabdff1aSopenharmony_ci res2 = __lsx_vsrari_w(res2, shift); \ 323cabdff1aSopenharmony_ci res3 = __lsx_vsrari_w(res3, shift); \ 324cabdff1aSopenharmony_ci res0 = __lsx_vsat_w(res0, 15); \ 325cabdff1aSopenharmony_ci res1 = __lsx_vsat_w(res1, 15); \ 326cabdff1aSopenharmony_ci res2 = __lsx_vsat_w(res2, 15); \ 327cabdff1aSopenharmony_ci res3 = __lsx_vsat_w(res3, 15); \ 328cabdff1aSopenharmony_ci} 329cabdff1aSopenharmony_ci 330cabdff1aSopenharmony_civoid ff_hevc_idct_4x4_lsx(int16_t *coeffs, int col_limit) 331cabdff1aSopenharmony_ci{ 332cabdff1aSopenharmony_ci __m128i in0, in1; 333cabdff1aSopenharmony_ci __m128i in_r0, in_l0, in_r1, in_l1; 334cabdff1aSopenharmony_ci __m128i sum0, sum1, sum2, sum3; 335cabdff1aSopenharmony_ci __m128i zero = __lsx_vldi(0x00); 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ci in0 = __lsx_vld(coeffs, 0); 338cabdff1aSopenharmony_ci in1 = __lsx_vld(coeffs, 16); 339cabdff1aSopenharmony_ci in_r0 = __lsx_vilvl_h(zero, in0); 340cabdff1aSopenharmony_ci in_l0 = __lsx_vilvh_h(zero, in0); 341cabdff1aSopenharmony_ci in_r1 = __lsx_vilvl_h(zero, in1); 342cabdff1aSopenharmony_ci in_l1 = __lsx_vilvh_h(zero, in1); 343cabdff1aSopenharmony_ci 344cabdff1aSopenharmony_ci HEVC_IDCT4x4_COL(in_r0, in_l0, in_r1, in_l1, sum0, sum1, sum2, sum3, 7); 345cabdff1aSopenharmony_ci LSX_TRANSPOSE4x4_W(sum0, sum1, sum2, sum3, in_r0, in_l0, in_r1, in_l1); 346cabdff1aSopenharmony_ci HEVC_IDCT4x4_COL(in_r0, in_l0, in_r1, in_l1, sum0, sum1, sum2, sum3, 12); 347cabdff1aSopenharmony_ci 348cabdff1aSopenharmony_ci /* Pack and transpose */ 349cabdff1aSopenharmony_ci in0 = __lsx_vpickev_h(sum2, sum0); 350cabdff1aSopenharmony_ci in1 = __lsx_vpickev_h(sum3, sum1); 351cabdff1aSopenharmony_ci sum0 = __lsx_vilvl_h(in1, in0); 352cabdff1aSopenharmony_ci sum1 = __lsx_vilvh_h(in1, in0); 353cabdff1aSopenharmony_ci in0 = __lsx_vilvl_w(sum1, sum0); 354cabdff1aSopenharmony_ci in1 = __lsx_vilvh_w(sum1, sum0); 355cabdff1aSopenharmony_ci 356cabdff1aSopenharmony_ci __lsx_vst(in0, coeffs, 0); 357cabdff1aSopenharmony_ci __lsx_vst(in1, coeffs, 16); 358cabdff1aSopenharmony_ci} 359cabdff1aSopenharmony_ci 360cabdff1aSopenharmony_civoid ff_hevc_idct_8x8_lsx(int16_t *coeffs, int col_limit) 361cabdff1aSopenharmony_ci{ 362cabdff1aSopenharmony_ci const int16_t *filter = >8x8_cnst[0]; 363cabdff1aSopenharmony_ci __m128i in0, in1, in2, in3, in4, in5, in6, in7; 364cabdff1aSopenharmony_ci 365cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, coeffs, 0, coeffs, 16, coeffs, 32, 366cabdff1aSopenharmony_ci coeffs, 48, in0, in1, in2, in3); 367cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, coeffs, 64, coeffs, 80, coeffs, 96, 368cabdff1aSopenharmony_ci coeffs, 112, in4, in5, in6, in7); 369cabdff1aSopenharmony_ci HEVC_IDCT8x8_COL(in0, in1, in2, in3, in4, in5, in6, in7, 7); 370cabdff1aSopenharmony_ci LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7, 371cabdff1aSopenharmony_ci in0, in1, in2, in3, in4, in5, in6, in7); 372cabdff1aSopenharmony_ci HEVC_IDCT8x8_COL(in0, in1, in2, in3, in4, in5, in6, in7, 12); 373cabdff1aSopenharmony_ci LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7, 374cabdff1aSopenharmony_ci in0, in1, in2, in3, in4, in5, in6, in7); 375cabdff1aSopenharmony_ci 376cabdff1aSopenharmony_ci __lsx_vst(in0, coeffs, 0); 377cabdff1aSopenharmony_ci __lsx_vst(in1, coeffs, 16); 378cabdff1aSopenharmony_ci __lsx_vst(in2, coeffs, 32); 379cabdff1aSopenharmony_ci __lsx_vst(in3, coeffs, 48); 380cabdff1aSopenharmony_ci __lsx_vst(in4, coeffs, 64); 381cabdff1aSopenharmony_ci __lsx_vst(in5, coeffs, 80); 382cabdff1aSopenharmony_ci __lsx_vst(in6, coeffs, 96); 383cabdff1aSopenharmony_ci __lsx_vst(in7, coeffs, 112); 384cabdff1aSopenharmony_ci} 385cabdff1aSopenharmony_ci 386cabdff1aSopenharmony_civoid ff_hevc_idct_16x16_lsx(int16_t *coeffs, int col_limit) 387cabdff1aSopenharmony_ci{ 388cabdff1aSopenharmony_ci int16_t i, j, k; 389cabdff1aSopenharmony_ci int16_t buf[256]; 390cabdff1aSopenharmony_ci int16_t *buf_ptr = &buf[0]; 391cabdff1aSopenharmony_ci int16_t *src = coeffs; 392cabdff1aSopenharmony_ci const int16_t *filter = >16x16_cnst[0]; 393cabdff1aSopenharmony_ci __m128i in0, in1, in2, in3, in4, in5, in6, in7; 394cabdff1aSopenharmony_ci __m128i in8, in9, in10, in11, in12, in13, in14, in15; 395cabdff1aSopenharmony_ci __m128i vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7; 396cabdff1aSopenharmony_ci __m128i src0_r, src1_r, src2_r, src3_r, src4_r, src5_r, src6_r, src7_r; 397cabdff1aSopenharmony_ci __m128i src0_l, src1_l, src2_l, src3_l, src4_l, src5_l, src6_l, src7_l; 398cabdff1aSopenharmony_ci 399cabdff1aSopenharmony_ci for (i = 2; i--;) { 400cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 0, src, 32, src, 64, src, 96, 401cabdff1aSopenharmony_ci in0, in1, in2, in3); 402cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 128, src, 160, src, 192, src, 224, 403cabdff1aSopenharmony_ci in4, in5, in6, in7); 404cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 256, src, 288, src, 320, src, 352, 405cabdff1aSopenharmony_ci in8, in9, in10, in11); 406cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 384, src, 416, src, 448, src, 480, 407cabdff1aSopenharmony_ci in12, in13, in14, in15); 408cabdff1aSopenharmony_ci 409cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvl_h, in4, in0, in12, in8, in6, in2, in14, in10, 410cabdff1aSopenharmony_ci src0_r, src1_r, src2_r, src3_r); 411cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvl_h, in5, in1, in13, in9, in3, in7, in11, in15, 412cabdff1aSopenharmony_ci src4_r, src5_r, src6_r, src7_r); 413cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvh_h, in4, in0, in12, in8, in6, in2, in14, in10, 414cabdff1aSopenharmony_ci src0_l, src1_l, src2_l, src3_l); 415cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvh_h, in5, in1, in13, in9, in3, in7, in11, in15, 416cabdff1aSopenharmony_ci src4_l, src5_l, src6_l, src7_l); 417cabdff1aSopenharmony_ci 418cabdff1aSopenharmony_ci HEVC_IDCT16x16_COL(src0_r, src1_r, src2_r, src3_r, src4_r, src5_r, 419cabdff1aSopenharmony_ci src6_r, src7_r, src0_l, src1_l, src2_l, src3_l, 420cabdff1aSopenharmony_ci src4_l, src5_l, src6_l, src7_l, 7); 421cabdff1aSopenharmony_ci 422cabdff1aSopenharmony_ci src += 8; 423cabdff1aSopenharmony_ci buf_ptr = (&buf[0] + 8); 424cabdff1aSopenharmony_ci filter = >16x16_cnst[0]; 425cabdff1aSopenharmony_ci } 426cabdff1aSopenharmony_ci 427cabdff1aSopenharmony_ci src = &buf[0]; 428cabdff1aSopenharmony_ci buf_ptr = coeffs; 429cabdff1aSopenharmony_ci filter = >16x16_cnst[0]; 430cabdff1aSopenharmony_ci 431cabdff1aSopenharmony_ci for (i = 2; i--;) { 432cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 0, src, 16, src, 32, src, 48, 433cabdff1aSopenharmony_ci in0, in8, in1, in9); 434cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 64, src, 80, src, 96, src, 112, 435cabdff1aSopenharmony_ci in2, in10, in3, in11); 436cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 128, src, 144, src, 160, src, 176, 437cabdff1aSopenharmony_ci in4, in12, in5, in13); 438cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 192, src, 208, src, 224, src, 240, 439cabdff1aSopenharmony_ci in6, in14, in7, in15); 440cabdff1aSopenharmony_ci LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7, 441cabdff1aSopenharmony_ci in0, in1, in2, in3, in4, in5, in6, in7); 442cabdff1aSopenharmony_ci LSX_TRANSPOSE8x8_H(in8, in9, in10, in11, in12, in13, in14, in15, 443cabdff1aSopenharmony_ci in8, in9, in10, in11, in12, in13, in14, in15); 444cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvl_h, in4, in0, in12, in8, in6, in2, in14, in10, 445cabdff1aSopenharmony_ci src0_r, src1_r, src2_r, src3_r); 446cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvl_h, in5, in1, in13, in9, in3, in7, in11, in15, 447cabdff1aSopenharmony_ci src4_r, src5_r, src6_r, src7_r); 448cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvh_h, in4, in0, in12, in8, in6, in2, in14, in10, 449cabdff1aSopenharmony_ci src0_l, src1_l, src2_l, src3_l); 450cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvh_h, in5, in1, in13, in9, in3, in7, in11, in15, 451cabdff1aSopenharmony_ci src4_l, src5_l, src6_l, src7_l); 452cabdff1aSopenharmony_ci HEVC_IDCT16x16_COL(src0_r, src1_r, src2_r, src3_r, src4_r, src5_r, 453cabdff1aSopenharmony_ci src6_r, src7_r, src0_l, src1_l, src2_l, src3_l, 454cabdff1aSopenharmony_ci src4_l, src5_l, src6_l, src7_l, 12); 455cabdff1aSopenharmony_ci 456cabdff1aSopenharmony_ci src += 128; 457cabdff1aSopenharmony_ci buf_ptr = coeffs + 8; 458cabdff1aSopenharmony_ci filter = >16x16_cnst[0]; 459cabdff1aSopenharmony_ci } 460cabdff1aSopenharmony_ci 461cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, coeffs, 0, coeffs, 32, coeffs, 64, coeffs, 96, 462cabdff1aSopenharmony_ci in0, in1, in2, in3); 463cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, coeffs, 128, coeffs, 160, coeffs, 192, coeffs, 224, 464cabdff1aSopenharmony_ci in4, in5, in6, in7); 465cabdff1aSopenharmony_ci LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7, 466cabdff1aSopenharmony_ci vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7); 467cabdff1aSopenharmony_ci __lsx_vst(vec0, coeffs, 0); 468cabdff1aSopenharmony_ci __lsx_vst(vec1, coeffs, 32); 469cabdff1aSopenharmony_ci __lsx_vst(vec2, coeffs, 64); 470cabdff1aSopenharmony_ci __lsx_vst(vec3, coeffs, 96); 471cabdff1aSopenharmony_ci __lsx_vst(vec4, coeffs, 128); 472cabdff1aSopenharmony_ci __lsx_vst(vec5, coeffs, 160); 473cabdff1aSopenharmony_ci __lsx_vst(vec6, coeffs, 192); 474cabdff1aSopenharmony_ci __lsx_vst(vec7, coeffs, 224); 475cabdff1aSopenharmony_ci 476cabdff1aSopenharmony_ci src = coeffs + 8; 477cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 0, src, 32, src, 64, src, 96, in0, in1, in2, in3); 478cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 128, src, 160, src, 192, src, 224, 479cabdff1aSopenharmony_ci in4, in5, in6, in7); 480cabdff1aSopenharmony_ci LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7, 481cabdff1aSopenharmony_ci vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7); 482cabdff1aSopenharmony_ci src = coeffs + 128; 483cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 0, src, 32, src, 64, src, 96, 484cabdff1aSopenharmony_ci in8, in9, in10, in11); 485cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 128, src, 160, src, 192, src, 224, 486cabdff1aSopenharmony_ci in12, in13, in14, in15); 487cabdff1aSopenharmony_ci 488cabdff1aSopenharmony_ci __lsx_vst(vec0, src, 0); 489cabdff1aSopenharmony_ci __lsx_vst(vec1, src, 32); 490cabdff1aSopenharmony_ci __lsx_vst(vec2, src, 64); 491cabdff1aSopenharmony_ci __lsx_vst(vec3, src, 96); 492cabdff1aSopenharmony_ci __lsx_vst(vec4, src, 128); 493cabdff1aSopenharmony_ci __lsx_vst(vec5, src, 160); 494cabdff1aSopenharmony_ci __lsx_vst(vec6, src, 192); 495cabdff1aSopenharmony_ci __lsx_vst(vec7, src, 224); 496cabdff1aSopenharmony_ci LSX_TRANSPOSE8x8_H(in8, in9, in10, in11, in12, in13, in14, in15, 497cabdff1aSopenharmony_ci vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7); 498cabdff1aSopenharmony_ci src = coeffs + 8; 499cabdff1aSopenharmony_ci __lsx_vst(vec0, src, 0); 500cabdff1aSopenharmony_ci __lsx_vst(vec1, src, 32); 501cabdff1aSopenharmony_ci __lsx_vst(vec2, src, 64); 502cabdff1aSopenharmony_ci __lsx_vst(vec3, src, 96); 503cabdff1aSopenharmony_ci __lsx_vst(vec4, src, 128); 504cabdff1aSopenharmony_ci __lsx_vst(vec5, src, 160); 505cabdff1aSopenharmony_ci __lsx_vst(vec6, src, 192); 506cabdff1aSopenharmony_ci __lsx_vst(vec7, src, 224); 507cabdff1aSopenharmony_ci 508cabdff1aSopenharmony_ci src = coeffs + 136; 509cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 0, src, 32, src, 64, src, 96, 510cabdff1aSopenharmony_ci in0, in1, in2, in3); 511cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, src, 128, src, 160, src, 192, src, 224, 512cabdff1aSopenharmony_ci in4, in5, in6, in7); 513cabdff1aSopenharmony_ci LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7, 514cabdff1aSopenharmony_ci vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7); 515cabdff1aSopenharmony_ci __lsx_vst(vec0, src, 0); 516cabdff1aSopenharmony_ci __lsx_vst(vec1, src, 32); 517cabdff1aSopenharmony_ci __lsx_vst(vec2, src, 64); 518cabdff1aSopenharmony_ci __lsx_vst(vec3, src, 96); 519cabdff1aSopenharmony_ci __lsx_vst(vec4, src, 128); 520cabdff1aSopenharmony_ci __lsx_vst(vec5, src, 160); 521cabdff1aSopenharmony_ci __lsx_vst(vec6, src, 192); 522cabdff1aSopenharmony_ci __lsx_vst(vec7, src, 224); 523cabdff1aSopenharmony_ci} 524cabdff1aSopenharmony_ci 525cabdff1aSopenharmony_cistatic void hevc_idct_8x32_column_lsx(int16_t *coeffs, int32_t buf_pitch, 526cabdff1aSopenharmony_ci uint8_t round) 527cabdff1aSopenharmony_ci{ 528cabdff1aSopenharmony_ci uint8_t i; 529cabdff1aSopenharmony_ci int32_t buf_pitch_2 = buf_pitch << 1; 530cabdff1aSopenharmony_ci int32_t buf_pitch_4 = buf_pitch << 2; 531cabdff1aSopenharmony_ci int32_t buf_pitch_8 = buf_pitch << 3; 532cabdff1aSopenharmony_ci int32_t buf_pitch_16 = buf_pitch << 4; 533cabdff1aSopenharmony_ci 534cabdff1aSopenharmony_ci const int16_t *filter_ptr0 = >32x32_cnst0[0]; 535cabdff1aSopenharmony_ci const int16_t *filter_ptr1 = >32x32_cnst1[0]; 536cabdff1aSopenharmony_ci const int16_t *filter_ptr2 = >32x32_cnst2[0]; 537cabdff1aSopenharmony_ci const int16_t *filter_ptr3 = >8x8_cnst[0]; 538cabdff1aSopenharmony_ci int16_t *src0 = (coeffs + buf_pitch); 539cabdff1aSopenharmony_ci int16_t *src1 = (coeffs + buf_pitch_2); 540cabdff1aSopenharmony_ci int16_t *src2 = (coeffs + buf_pitch_4); 541cabdff1aSopenharmony_ci int16_t *src3 = (coeffs); 542cabdff1aSopenharmony_ci int32_t tmp_buf[8 * 32 + 15]; 543cabdff1aSopenharmony_ci int32_t *tmp_buf_ptr = tmp_buf + 15; 544cabdff1aSopenharmony_ci __m128i in0, in1, in2, in3, in4, in5, in6, in7; 545cabdff1aSopenharmony_ci __m128i src0_r, src1_r, src2_r, src3_r, src4_r, src5_r, src6_r, src7_r; 546cabdff1aSopenharmony_ci __m128i src0_l, src1_l, src2_l, src3_l, src4_l, src5_l, src6_l, src7_l; 547cabdff1aSopenharmony_ci __m128i filter0, filter1, filter2, filter3; 548cabdff1aSopenharmony_ci __m128i sum0_r, sum0_l, sum1_r, sum1_l, tmp0_r, tmp0_l, tmp1_r, tmp1_l; 549cabdff1aSopenharmony_ci 550cabdff1aSopenharmony_ci /* Align pointer to 64 byte boundary */ 551cabdff1aSopenharmony_ci tmp_buf_ptr = (int32_t *)(((uintptr_t) tmp_buf_ptr) & ~(uintptr_t) 63); 552cabdff1aSopenharmony_ci 553cabdff1aSopenharmony_ci /* process coeff 4, 12, 20, 28 */ 554cabdff1aSopenharmony_ci in0 = __lsx_vld(src2, 0); 555cabdff1aSopenharmony_ci in1 = __lsx_vld(src2 + buf_pitch_8, 0); 556cabdff1aSopenharmony_ci in2 = __lsx_vld(src2 + buf_pitch_16, 0); 557cabdff1aSopenharmony_ci in3 = __lsx_vld(src2 + buf_pitch_16 + buf_pitch_8, 0); 558cabdff1aSopenharmony_ci in4 = __lsx_vld(src3, 0); 559cabdff1aSopenharmony_ci in5 = __lsx_vld(src3 + buf_pitch_8, 0); 560cabdff1aSopenharmony_ci in6 = __lsx_vld(src3 + buf_pitch_16, 0); 561cabdff1aSopenharmony_ci in7 = __lsx_vld(src3 + buf_pitch_16 + buf_pitch_8, 0); 562cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvl_h, in1, in0, in3, in2, in6, in4, in7, in5, 563cabdff1aSopenharmony_ci src0_r, src1_r, src2_r, src3_r); 564cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvh_h, in1, in0, in3, in2, in6, in4, in7, in5, 565cabdff1aSopenharmony_ci src0_l, src1_l, src2_l, src3_l); 566cabdff1aSopenharmony_ci 567cabdff1aSopenharmony_ci filter0 = __lsx_vldrepl_w(filter_ptr2, 0); 568cabdff1aSopenharmony_ci filter1 = __lsx_vldrepl_w(filter_ptr2, 4); 569cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2_w_h(src0_r, filter0); 570cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2_w_h(src0_l, filter0); 571cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1); 572cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1); 573cabdff1aSopenharmony_ci __lsx_vst(sum0_r, tmp_buf_ptr, 0); 574cabdff1aSopenharmony_ci __lsx_vst(sum0_l, tmp_buf_ptr, 16); 575cabdff1aSopenharmony_ci 576cabdff1aSopenharmony_ci filter0 = __lsx_vldrepl_w(filter_ptr2, 8); 577cabdff1aSopenharmony_ci filter1 = __lsx_vldrepl_w(filter_ptr2, 12); 578cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2_w_h(src0_r, filter0); 579cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2_w_h(src0_l, filter0); 580cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1); 581cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1); 582cabdff1aSopenharmony_ci __lsx_vst(sum0_r, tmp_buf_ptr, 32); 583cabdff1aSopenharmony_ci __lsx_vst(sum0_l, tmp_buf_ptr, 48); 584cabdff1aSopenharmony_ci 585cabdff1aSopenharmony_ci filter0 = __lsx_vldrepl_w(filter_ptr2, 16); 586cabdff1aSopenharmony_ci filter1 = __lsx_vldrepl_w(filter_ptr2, 20); 587cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2_w_h(src0_r, filter0); 588cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2_w_h(src0_l, filter0); 589cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1); 590cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1); 591cabdff1aSopenharmony_ci __lsx_vst(sum0_r, tmp_buf_ptr, 64); 592cabdff1aSopenharmony_ci __lsx_vst(sum0_l, tmp_buf_ptr, 80); 593cabdff1aSopenharmony_ci 594cabdff1aSopenharmony_ci filter0 = __lsx_vldrepl_w(filter_ptr2, 24); 595cabdff1aSopenharmony_ci filter1 = __lsx_vldrepl_w(filter_ptr2, 28); 596cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2_w_h(src0_r, filter0); 597cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2_w_h(src0_l, filter0); 598cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1); 599cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1); 600cabdff1aSopenharmony_ci __lsx_vst(sum0_r, tmp_buf_ptr, 96); 601cabdff1aSopenharmony_ci __lsx_vst(sum0_l, tmp_buf_ptr, 112); 602cabdff1aSopenharmony_ci 603cabdff1aSopenharmony_ci /* process coeff 0, 8, 16, 24 */ 604cabdff1aSopenharmony_ci filter0 = __lsx_vldrepl_w(filter_ptr3, 0); 605cabdff1aSopenharmony_ci filter1 = __lsx_vldrepl_w(filter_ptr3, 4); 606cabdff1aSopenharmony_ci 607cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter0, src2_l, filter0, 608cabdff1aSopenharmony_ci src3_r, filter1, src3_l, filter1, sum0_r, sum0_l, tmp1_r, tmp1_l); 609cabdff1aSopenharmony_ci sum1_r = __lsx_vsub_w(sum0_r, tmp1_r); 610cabdff1aSopenharmony_ci sum1_l = __lsx_vsub_w(sum0_l, tmp1_l); 611cabdff1aSopenharmony_ci sum0_r = __lsx_vadd_w(sum0_r, tmp1_r); 612cabdff1aSopenharmony_ci sum0_l = __lsx_vadd_w(sum0_l, tmp1_l); 613cabdff1aSopenharmony_ci 614cabdff1aSopenharmony_ci HEVC_EVEN16_CALC(tmp_buf_ptr, sum0_r, sum0_l, 0, 7); 615cabdff1aSopenharmony_ci HEVC_EVEN16_CALC(tmp_buf_ptr, sum1_r, sum1_l, 3, 4); 616cabdff1aSopenharmony_ci 617cabdff1aSopenharmony_ci filter0 = __lsx_vldrepl_w(filter_ptr3, 16); 618cabdff1aSopenharmony_ci filter1 = __lsx_vldrepl_w(filter_ptr3, 20); 619cabdff1aSopenharmony_ci 620cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vdp2_w_h, src2_r, filter0, src2_l, filter0, 621cabdff1aSopenharmony_ci src3_r, filter1, src3_l, filter1, sum0_r, sum0_l, tmp1_r, tmp1_l); 622cabdff1aSopenharmony_ci sum1_r = __lsx_vsub_w(sum0_r, tmp1_r); 623cabdff1aSopenharmony_ci sum1_l = __lsx_vsub_w(sum0_l, tmp1_l); 624cabdff1aSopenharmony_ci sum0_r = __lsx_vadd_w(sum0_r, tmp1_r); 625cabdff1aSopenharmony_ci sum0_l = __lsx_vadd_w(sum0_l, tmp1_l); 626cabdff1aSopenharmony_ci 627cabdff1aSopenharmony_ci HEVC_EVEN16_CALC(tmp_buf_ptr, sum0_r, sum0_l, 1, 6); 628cabdff1aSopenharmony_ci HEVC_EVEN16_CALC(tmp_buf_ptr, sum1_r, sum1_l, 2, 5); 629cabdff1aSopenharmony_ci 630cabdff1aSopenharmony_ci /* process coeff 2 6 10 14 18 22 26 30 */ 631cabdff1aSopenharmony_ci in0 = __lsx_vld(src1, 0); 632cabdff1aSopenharmony_ci in1 = __lsx_vld(src1 + buf_pitch_4, 0); 633cabdff1aSopenharmony_ci in2 = __lsx_vld(src1 + buf_pitch_8, 0); 634cabdff1aSopenharmony_ci in3 = __lsx_vld(src1 + buf_pitch_8 + buf_pitch_4, 0); 635cabdff1aSopenharmony_ci in4 = __lsx_vld(src1 + buf_pitch_16, 0); 636cabdff1aSopenharmony_ci in5 = __lsx_vld(src1 + buf_pitch_16 + buf_pitch_4, 0); 637cabdff1aSopenharmony_ci in6 = __lsx_vld(src1 + buf_pitch_16 + buf_pitch_8, 0); 638cabdff1aSopenharmony_ci in7 = __lsx_vld(src1 + buf_pitch_16 + buf_pitch_8 + buf_pitch_4, 0); 639cabdff1aSopenharmony_ci 640cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvl_h, in1, in0, in3, in2, in5, in4, in7, in6, 641cabdff1aSopenharmony_ci src0_r, src1_r, src2_r, src3_r); 642cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvh_h, in1, in0, in3, in2, in5, in4, in7, in6, 643cabdff1aSopenharmony_ci src0_l, src1_l, src2_l, src3_l); 644cabdff1aSopenharmony_ci 645cabdff1aSopenharmony_ci /* loop for all columns of constants */ 646cabdff1aSopenharmony_ci for (i = 0; i < 8; i++) { 647cabdff1aSopenharmony_ci /* processing single column of constants */ 648cabdff1aSopenharmony_ci filter0 = __lsx_vldrepl_w(filter_ptr1, 0); 649cabdff1aSopenharmony_ci filter1 = __lsx_vldrepl_w(filter_ptr1, 4); 650cabdff1aSopenharmony_ci filter2 = __lsx_vldrepl_w(filter_ptr1, 8); 651cabdff1aSopenharmony_ci filter3 = __lsx_vldrepl_w(filter_ptr1, 12); 652cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2_w_h(src0_r, filter0); 653cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2_w_h(src0_l, filter0); 654cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1); 655cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1); 656cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src2_r, filter2); 657cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src2_l, filter2); 658cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src3_r, filter3); 659cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src3_l, filter3); 660cabdff1aSopenharmony_ci 661cabdff1aSopenharmony_ci tmp0_r = __lsx_vld(tmp_buf_ptr + (i << 3), 0); 662cabdff1aSopenharmony_ci tmp0_l = __lsx_vld(tmp_buf_ptr + (i << 3), 16); 663cabdff1aSopenharmony_ci tmp1_r = tmp0_r; 664cabdff1aSopenharmony_ci tmp1_l = tmp0_l; 665cabdff1aSopenharmony_ci tmp0_r = __lsx_vadd_w(tmp0_r, sum0_r); 666cabdff1aSopenharmony_ci tmp0_l = __lsx_vadd_w(tmp0_l, sum0_l); 667cabdff1aSopenharmony_ci tmp1_r = __lsx_vsub_w(tmp1_r, sum0_r); 668cabdff1aSopenharmony_ci tmp1_l = __lsx_vsub_w(tmp1_l, sum0_l); 669cabdff1aSopenharmony_ci __lsx_vst(tmp0_r, tmp_buf_ptr + (i << 3), 0); 670cabdff1aSopenharmony_ci __lsx_vst(tmp0_l, tmp_buf_ptr + (i << 3), 16); 671cabdff1aSopenharmony_ci __lsx_vst(tmp1_r, tmp_buf_ptr + ((15 - i) * 8), 0); 672cabdff1aSopenharmony_ci __lsx_vst(tmp1_l, tmp_buf_ptr + ((15 - i) * 8), 16); 673cabdff1aSopenharmony_ci 674cabdff1aSopenharmony_ci filter_ptr1 += 8; 675cabdff1aSopenharmony_ci } 676cabdff1aSopenharmony_ci 677cabdff1aSopenharmony_ci /* process coeff 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 */ 678cabdff1aSopenharmony_ci in0 = __lsx_vld(src0, 0); 679cabdff1aSopenharmony_ci in1 = __lsx_vld(src0 + buf_pitch_2, 0); 680cabdff1aSopenharmony_ci in2 = __lsx_vld(src0 + buf_pitch_4, 0); 681cabdff1aSopenharmony_ci in3 = __lsx_vld(src0 + buf_pitch_4 + buf_pitch_2, 0); 682cabdff1aSopenharmony_ci in4 = __lsx_vld(src0 + buf_pitch_8, 0); 683cabdff1aSopenharmony_ci in5 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_2, 0); 684cabdff1aSopenharmony_ci in6 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_4, 0); 685cabdff1aSopenharmony_ci in7 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_4 + buf_pitch_2, 0); 686cabdff1aSopenharmony_ci 687cabdff1aSopenharmony_ci src0 += 16 * buf_pitch; 688cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvl_h, in1, in0, in3, in2, in5, in4, in7, in6, 689cabdff1aSopenharmony_ci src0_r, src1_r, src2_r, src3_r); 690cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvh_h, in1, in0, in3, in2, in5, in4, in7, in6, 691cabdff1aSopenharmony_ci src0_l, src1_l, src2_l, src3_l); 692cabdff1aSopenharmony_ci in0 = __lsx_vld(src0, 0); 693cabdff1aSopenharmony_ci in1 = __lsx_vld(src0 + buf_pitch_2, 0); 694cabdff1aSopenharmony_ci in2 = __lsx_vld(src0 + buf_pitch_4, 0); 695cabdff1aSopenharmony_ci in3 = __lsx_vld(src0 + buf_pitch_4 + buf_pitch_2, 0); 696cabdff1aSopenharmony_ci in4 = __lsx_vld(src0 + buf_pitch_8, 0); 697cabdff1aSopenharmony_ci in5 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_2, 0); 698cabdff1aSopenharmony_ci in6 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_4, 0); 699cabdff1aSopenharmony_ci in7 = __lsx_vld(src0 + buf_pitch_8 + buf_pitch_4 + buf_pitch_2, 0); 700cabdff1aSopenharmony_ci 701cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvl_h, in1, in0, in3, in2, in5, in4, in7, in6, 702cabdff1aSopenharmony_ci src4_r, src5_r, src6_r, src7_r); 703cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vilvh_h, in1, in0, in3, in2, in5, in4, in7, in6, 704cabdff1aSopenharmony_ci src4_l, src5_l, src6_l, src7_l); 705cabdff1aSopenharmony_ci 706cabdff1aSopenharmony_ci /* loop for all columns of filter constants */ 707cabdff1aSopenharmony_ci for (i = 0; i < 16; i++) { 708cabdff1aSopenharmony_ci /* processing single column of constants */ 709cabdff1aSopenharmony_ci filter0 = __lsx_vldrepl_w(filter_ptr0, 0); 710cabdff1aSopenharmony_ci filter1 = __lsx_vldrepl_w(filter_ptr0, 4); 711cabdff1aSopenharmony_ci filter2 = __lsx_vldrepl_w(filter_ptr0, 8); 712cabdff1aSopenharmony_ci filter3 = __lsx_vldrepl_w(filter_ptr0, 12); 713cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2_w_h(src0_r, filter0); 714cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2_w_h(src0_l, filter0); 715cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src1_r, filter1); 716cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src1_l, filter1); 717cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src2_r, filter2); 718cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src2_l, filter2); 719cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src3_r, filter3); 720cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src3_l, filter3); 721cabdff1aSopenharmony_ci tmp1_r = sum0_r; 722cabdff1aSopenharmony_ci tmp1_l = sum0_l; 723cabdff1aSopenharmony_ci 724cabdff1aSopenharmony_ci filter0 = __lsx_vldrepl_w(filter_ptr0, 16); 725cabdff1aSopenharmony_ci filter1 = __lsx_vldrepl_w(filter_ptr0, 20); 726cabdff1aSopenharmony_ci filter2 = __lsx_vldrepl_w(filter_ptr0, 24); 727cabdff1aSopenharmony_ci filter3 = __lsx_vldrepl_w(filter_ptr0, 28); 728cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2_w_h(src4_r, filter0); 729cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2_w_h(src4_l, filter0); 730cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src5_r, filter1); 731cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src5_l, filter1); 732cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src6_r, filter2); 733cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src6_l, filter2); 734cabdff1aSopenharmony_ci sum0_r = __lsx_vdp2add_w_h(sum0_r, src7_r, filter3); 735cabdff1aSopenharmony_ci sum0_l = __lsx_vdp2add_w_h(sum0_l, src7_l, filter3); 736cabdff1aSopenharmony_ci sum0_r = __lsx_vadd_w(sum0_r, tmp1_r); 737cabdff1aSopenharmony_ci sum0_l = __lsx_vadd_w(sum0_l, tmp1_l); 738cabdff1aSopenharmony_ci 739cabdff1aSopenharmony_ci tmp0_r = __lsx_vld(tmp_buf_ptr + i * 8, 0); 740cabdff1aSopenharmony_ci tmp0_l = __lsx_vld(tmp_buf_ptr + i * 8, 16); 741cabdff1aSopenharmony_ci tmp1_r = tmp0_r; 742cabdff1aSopenharmony_ci tmp1_l = tmp0_l; 743cabdff1aSopenharmony_ci tmp0_r = __lsx_vadd_w(tmp0_r, sum0_r); 744cabdff1aSopenharmony_ci tmp0_l = __lsx_vadd_w(tmp0_l, sum0_l); 745cabdff1aSopenharmony_ci sum1_r = __lsx_vreplgr2vr_w(round); 746cabdff1aSopenharmony_ci tmp0_r = __lsx_vssrarn_h_w(tmp0_r, sum1_r); 747cabdff1aSopenharmony_ci tmp0_l = __lsx_vssrarn_h_w(tmp0_l, sum1_r); 748cabdff1aSopenharmony_ci in0 = __lsx_vpackev_d(tmp0_l, tmp0_r); 749cabdff1aSopenharmony_ci __lsx_vst(in0, (coeffs + i * buf_pitch), 0); 750cabdff1aSopenharmony_ci tmp1_r = __lsx_vsub_w(tmp1_r, sum0_r); 751cabdff1aSopenharmony_ci tmp1_l = __lsx_vsub_w(tmp1_l, sum0_l); 752cabdff1aSopenharmony_ci tmp1_r = __lsx_vssrarn_h_w(tmp1_r, sum1_r); 753cabdff1aSopenharmony_ci tmp1_l = __lsx_vssrarn_h_w(tmp1_l, sum1_r); 754cabdff1aSopenharmony_ci in0 = __lsx_vpackev_d(tmp1_l, tmp1_r); 755cabdff1aSopenharmony_ci __lsx_vst(in0, (coeffs + (31 - i) * buf_pitch), 0); 756cabdff1aSopenharmony_ci 757cabdff1aSopenharmony_ci filter_ptr0 += 16; 758cabdff1aSopenharmony_ci } 759cabdff1aSopenharmony_ci} 760cabdff1aSopenharmony_ci 761cabdff1aSopenharmony_cistatic void hevc_idct_transpose_32x8_to_8x32(int16_t *coeffs, int16_t *tmp_buf) 762cabdff1aSopenharmony_ci{ 763cabdff1aSopenharmony_ci uint8_t i; 764cabdff1aSopenharmony_ci __m128i in0, in1, in2, in3, in4, in5, in6, in7; 765cabdff1aSopenharmony_ci 766cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) { 767cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, coeffs, 0, coeffs, 64, coeffs, 128, 768cabdff1aSopenharmony_ci coeffs, 192, in0, in1, in2, in3); 769cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, coeffs, 256, coeffs, 320, coeffs, 384, 770cabdff1aSopenharmony_ci coeffs, 448, in4, in5, in6, in7); 771cabdff1aSopenharmony_ci coeffs += 8; 772cabdff1aSopenharmony_ci LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7, 773cabdff1aSopenharmony_ci in0, in1, in2, in3, in4, in5, in6, in7); 774cabdff1aSopenharmony_ci __lsx_vst(in0, tmp_buf, 0); 775cabdff1aSopenharmony_ci __lsx_vst(in1, tmp_buf, 16); 776cabdff1aSopenharmony_ci __lsx_vst(in2, tmp_buf, 32); 777cabdff1aSopenharmony_ci __lsx_vst(in3, tmp_buf, 48); 778cabdff1aSopenharmony_ci __lsx_vst(in4, tmp_buf, 64); 779cabdff1aSopenharmony_ci __lsx_vst(in5, tmp_buf, 80); 780cabdff1aSopenharmony_ci __lsx_vst(in6, tmp_buf, 96); 781cabdff1aSopenharmony_ci __lsx_vst(in7, tmp_buf, 112); 782cabdff1aSopenharmony_ci tmp_buf += 64; 783cabdff1aSopenharmony_ci } 784cabdff1aSopenharmony_ci} 785cabdff1aSopenharmony_ci 786cabdff1aSopenharmony_cistatic void hevc_idct_transpose_8x32_to_32x8(int16_t *tmp_buf, int16_t *coeffs) 787cabdff1aSopenharmony_ci{ 788cabdff1aSopenharmony_ci uint8_t i; 789cabdff1aSopenharmony_ci __m128i in0, in1, in2, in3, in4, in5, in6, in7; 790cabdff1aSopenharmony_ci 791cabdff1aSopenharmony_ci for (i = 0; i < 4; i++) { 792cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, tmp_buf, 0, tmp_buf, 16, tmp_buf, 32, 793cabdff1aSopenharmony_ci tmp_buf, 48, in0, in1, in2, in3); 794cabdff1aSopenharmony_ci DUP4_ARG2(__lsx_vld, tmp_buf, 64, tmp_buf, 80, tmp_buf, 96, 795cabdff1aSopenharmony_ci tmp_buf, 112, in4, in5, in6, in7); 796cabdff1aSopenharmony_ci tmp_buf += 64; 797cabdff1aSopenharmony_ci LSX_TRANSPOSE8x8_H(in0, in1, in2, in3, in4, in5, in6, in7, 798cabdff1aSopenharmony_ci in0, in1, in2, in3, in4, in5, in6, in7); 799cabdff1aSopenharmony_ci __lsx_vst(in0, coeffs, 0); 800cabdff1aSopenharmony_ci __lsx_vst(in1, coeffs, 64); 801cabdff1aSopenharmony_ci __lsx_vst(in2, coeffs, 128); 802cabdff1aSopenharmony_ci __lsx_vst(in3, coeffs, 192); 803cabdff1aSopenharmony_ci __lsx_vst(in4, coeffs, 256); 804cabdff1aSopenharmony_ci __lsx_vst(in5, coeffs, 320); 805cabdff1aSopenharmony_ci __lsx_vst(in6, coeffs, 384); 806cabdff1aSopenharmony_ci __lsx_vst(in7, coeffs, 448); 807cabdff1aSopenharmony_ci coeffs += 8; 808cabdff1aSopenharmony_ci } 809cabdff1aSopenharmony_ci} 810cabdff1aSopenharmony_ci 811cabdff1aSopenharmony_civoid ff_hevc_idct_32x32_lsx(int16_t *coeffs, int col_limit) 812cabdff1aSopenharmony_ci{ 813cabdff1aSopenharmony_ci uint8_t row_cnt, col_cnt; 814cabdff1aSopenharmony_ci int16_t *src = coeffs; 815cabdff1aSopenharmony_ci int16_t tmp_buf[8 * 32 + 31]; 816cabdff1aSopenharmony_ci int16_t *tmp_buf_ptr = tmp_buf + 31; 817cabdff1aSopenharmony_ci uint8_t round; 818cabdff1aSopenharmony_ci int32_t buf_pitch; 819cabdff1aSopenharmony_ci 820cabdff1aSopenharmony_ci /* Align pointer to 64 byte boundary */ 821cabdff1aSopenharmony_ci tmp_buf_ptr = (int16_t *)(((uintptr_t) tmp_buf_ptr) & ~(uintptr_t) 63); 822cabdff1aSopenharmony_ci 823cabdff1aSopenharmony_ci /* column transform */ 824cabdff1aSopenharmony_ci round = 7; 825cabdff1aSopenharmony_ci buf_pitch = 32; 826cabdff1aSopenharmony_ci for (col_cnt = 0; col_cnt < 4; col_cnt++) { 827cabdff1aSopenharmony_ci /* process 8x32 blocks */ 828cabdff1aSopenharmony_ci hevc_idct_8x32_column_lsx((coeffs + col_cnt * 8), buf_pitch, round); 829cabdff1aSopenharmony_ci } 830cabdff1aSopenharmony_ci 831cabdff1aSopenharmony_ci /* row transform */ 832cabdff1aSopenharmony_ci round = 12; 833cabdff1aSopenharmony_ci buf_pitch = 8; 834cabdff1aSopenharmony_ci for (row_cnt = 0; row_cnt < 4; row_cnt++) { 835cabdff1aSopenharmony_ci /* process 32x8 blocks */ 836cabdff1aSopenharmony_ci src = (coeffs + 32 * 8 * row_cnt); 837cabdff1aSopenharmony_ci 838cabdff1aSopenharmony_ci hevc_idct_transpose_32x8_to_8x32(src, tmp_buf_ptr); 839cabdff1aSopenharmony_ci hevc_idct_8x32_column_lsx(tmp_buf_ptr, buf_pitch, round); 840cabdff1aSopenharmony_ci hevc_idct_transpose_8x32_to_32x8(tmp_buf_ptr, src); 841cabdff1aSopenharmony_ci } 842cabdff1aSopenharmony_ci} 843