1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2015 - 2017 Manojkumar Bhosale (Manojkumar.Bhosale@imgtec.com) 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#include "libavutil/mips/generic_macros_msa.h" 22cabdff1aSopenharmony_ci#include "h264dsp_mips.h" 23cabdff1aSopenharmony_ci#include "libavcodec/bit_depth_template.c" 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#define AVC_ITRANS_H(in0, in1, in2, in3, out0, out1, out2, out3) \ 26cabdff1aSopenharmony_ci{ \ 27cabdff1aSopenharmony_ci v8i16 tmp0_m, tmp1_m, tmp2_m, tmp3_m; \ 28cabdff1aSopenharmony_ci \ 29cabdff1aSopenharmony_ci tmp0_m = in0 + in2; \ 30cabdff1aSopenharmony_ci tmp1_m = in0 - in2; \ 31cabdff1aSopenharmony_ci tmp2_m = in1 >> 1; \ 32cabdff1aSopenharmony_ci tmp2_m = tmp2_m - in3; \ 33cabdff1aSopenharmony_ci tmp3_m = in3 >> 1; \ 34cabdff1aSopenharmony_ci tmp3_m = in1 + tmp3_m; \ 35cabdff1aSopenharmony_ci \ 36cabdff1aSopenharmony_ci BUTTERFLY_4(tmp0_m, tmp1_m, tmp2_m, tmp3_m, out0, out1, out2, out3); \ 37cabdff1aSopenharmony_ci} 38cabdff1aSopenharmony_ci 39cabdff1aSopenharmony_cistatic void avc_deq_idct_luma_dc_msa(int16_t *dst, int16_t *src, 40cabdff1aSopenharmony_ci int32_t de_q_val) 41cabdff1aSopenharmony_ci{ 42cabdff1aSopenharmony_ci#define DC_DEST_STRIDE 16 43cabdff1aSopenharmony_ci int16_t out0, out1, out2, out3, out4, out5, out6, out7; 44cabdff1aSopenharmony_ci v8i16 src1, src3; 45cabdff1aSopenharmony_ci v8i16 vec0, vec1, vec2, vec3; 46cabdff1aSopenharmony_ci v8i16 tmp0, tmp1, tmp2, tmp3; 47cabdff1aSopenharmony_ci v8i16 hres0, hres1, hres2, hres3; 48cabdff1aSopenharmony_ci v8i16 vres0, vres1, vres2, vres3; 49cabdff1aSopenharmony_ci v4i32 vres0_r, vres1_r, vres2_r, vres3_r; 50cabdff1aSopenharmony_ci const v4i32 de_q_vec = __msa_fill_w(de_q_val); 51cabdff1aSopenharmony_ci const v8i16 src0 = LD_SH(src); 52cabdff1aSopenharmony_ci const v8i16 src2 = LD_SH(src + 8); 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ci ILVL_D2_SH(src0, src0, src2, src2, src1, src3); 55cabdff1aSopenharmony_ci TRANSPOSE4x4_SH_SH(src0, src1, src2, src3, tmp0, tmp1, tmp2, tmp3); 56cabdff1aSopenharmony_ci BUTTERFLY_4(tmp0, tmp2, tmp3, tmp1, vec0, vec3, vec2, vec1); 57cabdff1aSopenharmony_ci BUTTERFLY_4(vec0, vec1, vec2, vec3, hres0, hres3, hres2, hres1); 58cabdff1aSopenharmony_ci TRANSPOSE4x4_SH_SH(hres0, hres1, hres2, hres3, hres0, hres1, hres2, hres3); 59cabdff1aSopenharmony_ci BUTTERFLY_4(hres0, hres1, hres3, hres2, vec0, vec3, vec2, vec1); 60cabdff1aSopenharmony_ci BUTTERFLY_4(vec0, vec1, vec2, vec3, vres0, vres1, vres2, vres3); 61cabdff1aSopenharmony_ci UNPCK_R_SH_SW(vres0, vres0_r); 62cabdff1aSopenharmony_ci UNPCK_R_SH_SW(vres1, vres1_r); 63cabdff1aSopenharmony_ci UNPCK_R_SH_SW(vres2, vres2_r); 64cabdff1aSopenharmony_ci UNPCK_R_SH_SW(vres3, vres3_r); 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci vres0_r *= de_q_vec; 67cabdff1aSopenharmony_ci vres1_r *= de_q_vec; 68cabdff1aSopenharmony_ci vres2_r *= de_q_vec; 69cabdff1aSopenharmony_ci vres3_r *= de_q_vec; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci SRARI_W4_SW(vres0_r, vres1_r, vres2_r, vres3_r, 8); 72cabdff1aSopenharmony_ci PCKEV_H2_SH(vres1_r, vres0_r, vres3_r, vres2_r, vec0, vec1); 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci out0 = __msa_copy_s_h(vec0, 0); 75cabdff1aSopenharmony_ci out1 = __msa_copy_s_h(vec0, 1); 76cabdff1aSopenharmony_ci out2 = __msa_copy_s_h(vec0, 2); 77cabdff1aSopenharmony_ci out3 = __msa_copy_s_h(vec0, 3); 78cabdff1aSopenharmony_ci out4 = __msa_copy_s_h(vec0, 4); 79cabdff1aSopenharmony_ci out5 = __msa_copy_s_h(vec0, 5); 80cabdff1aSopenharmony_ci out6 = __msa_copy_s_h(vec0, 6); 81cabdff1aSopenharmony_ci out7 = __msa_copy_s_h(vec0, 7); 82cabdff1aSopenharmony_ci SH(out0, (dst + 0 * DC_DEST_STRIDE)); 83cabdff1aSopenharmony_ci SH(out1, (dst + 2 * DC_DEST_STRIDE)); 84cabdff1aSopenharmony_ci SH(out2, (dst + 8 * DC_DEST_STRIDE)); 85cabdff1aSopenharmony_ci SH(out3, (dst + 10 * DC_DEST_STRIDE)); 86cabdff1aSopenharmony_ci SH(out4, (dst + 1 * DC_DEST_STRIDE)); 87cabdff1aSopenharmony_ci SH(out5, (dst + 3 * DC_DEST_STRIDE)); 88cabdff1aSopenharmony_ci SH(out6, (dst + 9 * DC_DEST_STRIDE)); 89cabdff1aSopenharmony_ci SH(out7, (dst + 11 * DC_DEST_STRIDE)); 90cabdff1aSopenharmony_ci 91cabdff1aSopenharmony_ci out0 = __msa_copy_s_h(vec1, 0); 92cabdff1aSopenharmony_ci out1 = __msa_copy_s_h(vec1, 1); 93cabdff1aSopenharmony_ci out2 = __msa_copy_s_h(vec1, 2); 94cabdff1aSopenharmony_ci out3 = __msa_copy_s_h(vec1, 3); 95cabdff1aSopenharmony_ci out4 = __msa_copy_s_h(vec1, 4); 96cabdff1aSopenharmony_ci out5 = __msa_copy_s_h(vec1, 5); 97cabdff1aSopenharmony_ci out6 = __msa_copy_s_h(vec1, 6); 98cabdff1aSopenharmony_ci out7 = __msa_copy_s_h(vec1, 7); 99cabdff1aSopenharmony_ci SH(out0, (dst + 4 * DC_DEST_STRIDE)); 100cabdff1aSopenharmony_ci SH(out1, (dst + 6 * DC_DEST_STRIDE)); 101cabdff1aSopenharmony_ci SH(out2, (dst + 12 * DC_DEST_STRIDE)); 102cabdff1aSopenharmony_ci SH(out3, (dst + 14 * DC_DEST_STRIDE)); 103cabdff1aSopenharmony_ci SH(out4, (dst + 5 * DC_DEST_STRIDE)); 104cabdff1aSopenharmony_ci SH(out5, (dst + 7 * DC_DEST_STRIDE)); 105cabdff1aSopenharmony_ci SH(out6, (dst + 13 * DC_DEST_STRIDE)); 106cabdff1aSopenharmony_ci SH(out7, (dst + 15 * DC_DEST_STRIDE)); 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci#undef DC_DEST_STRIDE 109cabdff1aSopenharmony_ci} 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_cistatic void avc_idct8_addblk_msa(uint8_t *dst, int16_t *src, int32_t dst_stride) 112cabdff1aSopenharmony_ci{ 113cabdff1aSopenharmony_ci v8i16 src0, src1, src2, src3, src4, src5, src6, src7; 114cabdff1aSopenharmony_ci v8i16 vec0, vec1, vec2, vec3; 115cabdff1aSopenharmony_ci v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; 116cabdff1aSopenharmony_ci v8i16 res0, res1, res2, res3, res4, res5, res6, res7; 117cabdff1aSopenharmony_ci v4i32 tmp0_r, tmp1_r, tmp2_r, tmp3_r, tmp4_r, tmp5_r, tmp6_r, tmp7_r; 118cabdff1aSopenharmony_ci v4i32 tmp0_l, tmp1_l, tmp2_l, tmp3_l, tmp4_l, tmp5_l, tmp6_l, tmp7_l; 119cabdff1aSopenharmony_ci v4i32 vec0_r, vec1_r, vec2_r, vec3_r, vec0_l, vec1_l, vec2_l, vec3_l; 120cabdff1aSopenharmony_ci v4i32 res0_r, res1_r, res2_r, res3_r, res4_r, res5_r, res6_r, res7_r; 121cabdff1aSopenharmony_ci v4i32 res0_l, res1_l, res2_l, res3_l, res4_l, res5_l, res6_l, res7_l; 122cabdff1aSopenharmony_ci v16i8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7; 123cabdff1aSopenharmony_ci v8i16 zeros = { 0 }; 124cabdff1aSopenharmony_ci 125cabdff1aSopenharmony_ci src[0] += 32; 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci LD_SH8(src, 8, src0, src1, src2, src3, src4, src5, src6, src7); 128cabdff1aSopenharmony_ci ST_SH8(zeros, zeros, zeros, zeros, zeros, zeros, zeros, zeros, src, 8); 129cabdff1aSopenharmony_ci 130cabdff1aSopenharmony_ci vec0 = src0 + src4; 131cabdff1aSopenharmony_ci vec1 = src0 - src4; 132cabdff1aSopenharmony_ci vec2 = src2 >> 1; 133cabdff1aSopenharmony_ci vec2 = vec2 - src6; 134cabdff1aSopenharmony_ci vec3 = src6 >> 1; 135cabdff1aSopenharmony_ci vec3 = src2 + vec3; 136cabdff1aSopenharmony_ci 137cabdff1aSopenharmony_ci BUTTERFLY_4(vec0, vec1, vec2, vec3, tmp0, tmp1, tmp2, tmp3); 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci vec0 = src7 >> 1; 140cabdff1aSopenharmony_ci vec0 = src5 - vec0 - src3 - src7; 141cabdff1aSopenharmony_ci vec1 = src3 >> 1; 142cabdff1aSopenharmony_ci vec1 = src1 - vec1 + src7 - src3; 143cabdff1aSopenharmony_ci vec2 = src5 >> 1; 144cabdff1aSopenharmony_ci vec2 = vec2 - src1 + src7 + src5; 145cabdff1aSopenharmony_ci vec3 = src1 >> 1; 146cabdff1aSopenharmony_ci vec3 = vec3 + src3 + src5 + src1; 147cabdff1aSopenharmony_ci tmp4 = vec3 >> 2; 148cabdff1aSopenharmony_ci tmp4 += vec0; 149cabdff1aSopenharmony_ci tmp5 = vec2 >> 2; 150cabdff1aSopenharmony_ci tmp5 += vec1; 151cabdff1aSopenharmony_ci tmp6 = vec1 >> 2; 152cabdff1aSopenharmony_ci tmp6 -= vec2; 153cabdff1aSopenharmony_ci tmp7 = vec0 >> 2; 154cabdff1aSopenharmony_ci tmp7 = vec3 - tmp7; 155cabdff1aSopenharmony_ci 156cabdff1aSopenharmony_ci BUTTERFLY_8(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, 157cabdff1aSopenharmony_ci res0, res1, res2, res3, res4, res5, res6, res7); 158cabdff1aSopenharmony_ci TRANSPOSE8x8_SH_SH(res0, res1, res2, res3, res4, res5, res6, res7, 159cabdff1aSopenharmony_ci res0, res1, res2, res3, res4, res5, res6, res7); 160cabdff1aSopenharmony_ci UNPCK_SH_SW(res0, tmp0_r, tmp0_l); 161cabdff1aSopenharmony_ci UNPCK_SH_SW(res1, tmp1_r, tmp1_l); 162cabdff1aSopenharmony_ci UNPCK_SH_SW(res2, tmp2_r, tmp2_l); 163cabdff1aSopenharmony_ci UNPCK_SH_SW(res3, tmp3_r, tmp3_l); 164cabdff1aSopenharmony_ci UNPCK_SH_SW(res4, tmp4_r, tmp4_l); 165cabdff1aSopenharmony_ci UNPCK_SH_SW(res5, tmp5_r, tmp5_l); 166cabdff1aSopenharmony_ci UNPCK_SH_SW(res6, tmp6_r, tmp6_l); 167cabdff1aSopenharmony_ci UNPCK_SH_SW(res7, tmp7_r, tmp7_l); 168cabdff1aSopenharmony_ci BUTTERFLY_4(tmp0_r, tmp0_l, tmp4_l, tmp4_r, vec0_r, vec0_l, vec1_l, vec1_r); 169cabdff1aSopenharmony_ci 170cabdff1aSopenharmony_ci vec2_r = tmp2_r >> 1; 171cabdff1aSopenharmony_ci vec2_l = tmp2_l >> 1; 172cabdff1aSopenharmony_ci vec2_r -= tmp6_r; 173cabdff1aSopenharmony_ci vec2_l -= tmp6_l; 174cabdff1aSopenharmony_ci vec3_r = tmp6_r >> 1; 175cabdff1aSopenharmony_ci vec3_l = tmp6_l >> 1; 176cabdff1aSopenharmony_ci vec3_r += tmp2_r; 177cabdff1aSopenharmony_ci vec3_l += tmp2_l; 178cabdff1aSopenharmony_ci 179cabdff1aSopenharmony_ci BUTTERFLY_4(vec0_r, vec1_r, vec2_r, vec3_r, tmp0_r, tmp2_r, tmp4_r, tmp6_r); 180cabdff1aSopenharmony_ci BUTTERFLY_4(vec0_l, vec1_l, vec2_l, vec3_l, tmp0_l, tmp2_l, tmp4_l, tmp6_l); 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_ci vec0_r = tmp7_r >> 1; 183cabdff1aSopenharmony_ci vec0_l = tmp7_l >> 1; 184cabdff1aSopenharmony_ci vec0_r = tmp5_r - vec0_r - tmp3_r - tmp7_r; 185cabdff1aSopenharmony_ci vec0_l = tmp5_l - vec0_l - tmp3_l - tmp7_l; 186cabdff1aSopenharmony_ci vec1_r = tmp3_r >> 1; 187cabdff1aSopenharmony_ci vec1_l = tmp3_l >> 1; 188cabdff1aSopenharmony_ci vec1_r = tmp1_r - vec1_r + tmp7_r - tmp3_r; 189cabdff1aSopenharmony_ci vec1_l = tmp1_l - vec1_l + tmp7_l - tmp3_l; 190cabdff1aSopenharmony_ci vec2_r = tmp5_r >> 1; 191cabdff1aSopenharmony_ci vec2_l = tmp5_l >> 1; 192cabdff1aSopenharmony_ci vec2_r = vec2_r - tmp1_r + tmp7_r + tmp5_r; 193cabdff1aSopenharmony_ci vec2_l = vec2_l - tmp1_l + tmp7_l + tmp5_l; 194cabdff1aSopenharmony_ci vec3_r = tmp1_r >> 1; 195cabdff1aSopenharmony_ci vec3_l = tmp1_l >> 1; 196cabdff1aSopenharmony_ci vec3_r = vec3_r + tmp3_r + tmp5_r + tmp1_r; 197cabdff1aSopenharmony_ci vec3_l = vec3_l + tmp3_l + tmp5_l + tmp1_l; 198cabdff1aSopenharmony_ci tmp1_r = vec3_r >> 2; 199cabdff1aSopenharmony_ci tmp1_l = vec3_l >> 2; 200cabdff1aSopenharmony_ci tmp1_r += vec0_r; 201cabdff1aSopenharmony_ci tmp1_l += vec0_l; 202cabdff1aSopenharmony_ci tmp3_r = vec2_r >> 2; 203cabdff1aSopenharmony_ci tmp3_l = vec2_l >> 2; 204cabdff1aSopenharmony_ci tmp3_r += vec1_r; 205cabdff1aSopenharmony_ci tmp3_l += vec1_l; 206cabdff1aSopenharmony_ci tmp5_r = vec1_r >> 2; 207cabdff1aSopenharmony_ci tmp5_l = vec1_l >> 2; 208cabdff1aSopenharmony_ci tmp5_r -= vec2_r; 209cabdff1aSopenharmony_ci tmp5_l -= vec2_l; 210cabdff1aSopenharmony_ci tmp7_r = vec0_r >> 2; 211cabdff1aSopenharmony_ci tmp7_l = vec0_l >> 2; 212cabdff1aSopenharmony_ci tmp7_r = vec3_r - tmp7_r; 213cabdff1aSopenharmony_ci tmp7_l = vec3_l - tmp7_l; 214cabdff1aSopenharmony_ci 215cabdff1aSopenharmony_ci BUTTERFLY_4(tmp0_r, tmp0_l, tmp7_l, tmp7_r, res0_r, res0_l, res7_l, res7_r); 216cabdff1aSopenharmony_ci BUTTERFLY_4(tmp2_r, tmp2_l, tmp5_l, tmp5_r, res1_r, res1_l, res6_l, res6_r); 217cabdff1aSopenharmony_ci BUTTERFLY_4(tmp4_r, tmp4_l, tmp3_l, tmp3_r, res2_r, res2_l, res5_l, res5_r); 218cabdff1aSopenharmony_ci BUTTERFLY_4(tmp6_r, tmp6_l, tmp1_l, tmp1_r, res3_r, res3_l, res4_l, res4_r); 219cabdff1aSopenharmony_ci SRA_4V(res0_r, res0_l, res1_r, res1_l, 6); 220cabdff1aSopenharmony_ci SRA_4V(res2_r, res2_l, res3_r, res3_l, 6); 221cabdff1aSopenharmony_ci SRA_4V(res4_r, res4_l, res5_r, res5_l, 6); 222cabdff1aSopenharmony_ci SRA_4V(res6_r, res6_l, res7_r, res7_l, 6); 223cabdff1aSopenharmony_ci PCKEV_H4_SH(res0_l, res0_r, res1_l, res1_r, res2_l, res2_r, res3_l, res3_r, 224cabdff1aSopenharmony_ci res0, res1, res2, res3); 225cabdff1aSopenharmony_ci PCKEV_H4_SH(res4_l, res4_r, res5_l, res5_r, res6_l, res6_r, res7_l, res7_r, 226cabdff1aSopenharmony_ci res4, res5, res6, res7); 227cabdff1aSopenharmony_ci LD_SB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7); 228cabdff1aSopenharmony_ci ILVR_B4_SH(zeros, dst0, zeros, dst1, zeros, dst2, zeros, dst3, 229cabdff1aSopenharmony_ci tmp0, tmp1, tmp2, tmp3); 230cabdff1aSopenharmony_ci ILVR_B4_SH(zeros, dst4, zeros, dst5, zeros, dst6, zeros, dst7, 231cabdff1aSopenharmony_ci tmp4, tmp5, tmp6, tmp7); 232cabdff1aSopenharmony_ci ADD4(res0, tmp0, res1, tmp1, res2, tmp2, res3, tmp3, 233cabdff1aSopenharmony_ci res0, res1, res2, res3); 234cabdff1aSopenharmony_ci ADD4(res4, tmp4, res5, tmp5, res6, tmp6, res7, tmp7, 235cabdff1aSopenharmony_ci res4, res5, res6, res7); 236cabdff1aSopenharmony_ci CLIP_SH8_0_255(res0, res1, res2, res3, res4, res5, res6, res7); 237cabdff1aSopenharmony_ci PCKEV_B4_SB(res1, res0, res3, res2, res5, res4, res7, res6, 238cabdff1aSopenharmony_ci dst0, dst1, dst2, dst3); 239cabdff1aSopenharmony_ci ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride) 240cabdff1aSopenharmony_ci} 241cabdff1aSopenharmony_ci 242cabdff1aSopenharmony_cistatic void avc_idct8_dc_addblk_msa(uint8_t *dst, int16_t *src, 243cabdff1aSopenharmony_ci int32_t dst_stride) 244cabdff1aSopenharmony_ci{ 245cabdff1aSopenharmony_ci int32_t dc_val; 246cabdff1aSopenharmony_ci v16i8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7; 247cabdff1aSopenharmony_ci v8i16 dst0_r, dst1_r, dst2_r, dst3_r, dst4_r, dst5_r, dst6_r, dst7_r; 248cabdff1aSopenharmony_ci v8i16 dc; 249cabdff1aSopenharmony_ci v16i8 zeros = { 0 }; 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci dc_val = (src[0] + 32) >> 6; 252cabdff1aSopenharmony_ci dc = __msa_fill_h(dc_val); 253cabdff1aSopenharmony_ci 254cabdff1aSopenharmony_ci src[0] = 0; 255cabdff1aSopenharmony_ci 256cabdff1aSopenharmony_ci LD_SB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7); 257cabdff1aSopenharmony_ci ILVR_B4_SH(zeros, dst0, zeros, dst1, zeros, dst2, zeros, dst3, 258cabdff1aSopenharmony_ci dst0_r, dst1_r, dst2_r, dst3_r); 259cabdff1aSopenharmony_ci ILVR_B4_SH(zeros, dst4, zeros, dst5, zeros, dst6, zeros, dst7, 260cabdff1aSopenharmony_ci dst4_r, dst5_r, dst6_r, dst7_r); 261cabdff1aSopenharmony_ci ADD4(dst0_r, dc, dst1_r, dc, dst2_r, dc, dst3_r, dc, 262cabdff1aSopenharmony_ci dst0_r, dst1_r, dst2_r, dst3_r); 263cabdff1aSopenharmony_ci ADD4(dst4_r, dc, dst5_r, dc, dst6_r, dc, dst7_r, dc, 264cabdff1aSopenharmony_ci dst4_r, dst5_r, dst6_r, dst7_r); 265cabdff1aSopenharmony_ci CLIP_SH8_0_255(dst0_r, dst1_r, dst2_r, dst3_r, 266cabdff1aSopenharmony_ci dst4_r, dst5_r, dst6_r, dst7_r); 267cabdff1aSopenharmony_ci PCKEV_B4_SB(dst1_r, dst0_r, dst3_r, dst2_r, dst5_r, dst4_r, dst7_r, dst6_r, 268cabdff1aSopenharmony_ci dst0, dst1, dst2, dst3); 269cabdff1aSopenharmony_ci ST_D8(dst0, dst1, dst2, dst3, 0, 1, 0, 1, 0, 1, 0, 1, dst, dst_stride) 270cabdff1aSopenharmony_ci} 271cabdff1aSopenharmony_ci 272cabdff1aSopenharmony_civoid ff_h264_idct_add_msa(uint8_t *dst, int16_t *src, int32_t dst_stride) 273cabdff1aSopenharmony_ci{ 274cabdff1aSopenharmony_ci uint32_t src0_m, src1_m, src2_m, src3_m, out0_m, out1_m, out2_m, out3_m; 275cabdff1aSopenharmony_ci v16i8 dst0_m = { 0 }; 276cabdff1aSopenharmony_ci v16i8 dst1_m = { 0 }; 277cabdff1aSopenharmony_ci v8i16 hres0, hres1, hres2, hres3, vres0, vres1, vres2, vres3; 278cabdff1aSopenharmony_ci v8i16 inp0_m, inp1_m, res0_m, res1_m, src1, src3; 279cabdff1aSopenharmony_ci const v8i16 src0 = LD_SH(src); 280cabdff1aSopenharmony_ci const v8i16 src2 = LD_SH(src + 8); 281cabdff1aSopenharmony_ci const v8i16 zero = { 0 }; 282cabdff1aSopenharmony_ci const uint8_t *dst1 = dst + dst_stride; 283cabdff1aSopenharmony_ci const uint8_t *dst2 = dst + 2 * dst_stride; 284cabdff1aSopenharmony_ci const uint8_t *dst3 = dst + 3 * dst_stride; 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_ci ILVL_D2_SH(src0, src0, src2, src2, src1, src3); 287cabdff1aSopenharmony_ci ST_SH2(zero, zero, src, 8); 288cabdff1aSopenharmony_ci AVC_ITRANS_H(src0, src1, src2, src3, hres0, hres1, hres2, hres3); 289cabdff1aSopenharmony_ci TRANSPOSE4x4_SH_SH(hres0, hres1, hres2, hres3, hres0, hres1, hres2, hres3); 290cabdff1aSopenharmony_ci AVC_ITRANS_H(hres0, hres1, hres2, hres3, vres0, vres1, vres2, vres3); 291cabdff1aSopenharmony_ci src0_m = LW(dst); 292cabdff1aSopenharmony_ci src1_m = LW(dst1); 293cabdff1aSopenharmony_ci SRARI_H4_SH(vres0, vres1, vres2, vres3, 6); 294cabdff1aSopenharmony_ci src2_m = LW(dst2); 295cabdff1aSopenharmony_ci src3_m = LW(dst3); 296cabdff1aSopenharmony_ci ILVR_D2_SH(vres1, vres0, vres3, vres2, inp0_m, inp1_m); 297cabdff1aSopenharmony_ci INSERT_W2_SB(src0_m, src1_m, dst0_m); 298cabdff1aSopenharmony_ci INSERT_W2_SB(src2_m, src3_m, dst1_m); 299cabdff1aSopenharmony_ci ILVR_B2_SH(zero, dst0_m, zero, dst1_m, res0_m, res1_m); 300cabdff1aSopenharmony_ci ADD2(res0_m, inp0_m, res1_m, inp1_m, res0_m, res1_m); 301cabdff1aSopenharmony_ci CLIP_SH2_0_255(res0_m, res1_m); 302cabdff1aSopenharmony_ci PCKEV_B2_SB(res0_m, res0_m, res1_m, res1_m, dst0_m, dst1_m); 303cabdff1aSopenharmony_ci out0_m = __msa_copy_u_w((v4i32) dst0_m, 0); 304cabdff1aSopenharmony_ci out1_m = __msa_copy_u_w((v4i32) dst0_m, 1); 305cabdff1aSopenharmony_ci out2_m = __msa_copy_u_w((v4i32) dst1_m, 0); 306cabdff1aSopenharmony_ci out3_m = __msa_copy_u_w((v4i32) dst1_m, 1); 307cabdff1aSopenharmony_ci SW(out0_m, dst); 308cabdff1aSopenharmony_ci SW(out1_m, dst1); 309cabdff1aSopenharmony_ci SW(out2_m, dst2); 310cabdff1aSopenharmony_ci SW(out3_m, dst3); 311cabdff1aSopenharmony_ci} 312cabdff1aSopenharmony_ci 313cabdff1aSopenharmony_civoid ff_h264_idct8_addblk_msa(uint8_t *dst, int16_t *src, 314cabdff1aSopenharmony_ci int32_t dst_stride) 315cabdff1aSopenharmony_ci{ 316cabdff1aSopenharmony_ci avc_idct8_addblk_msa(dst, src, dst_stride); 317cabdff1aSopenharmony_ci} 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_civoid ff_h264_idct4x4_addblk_dc_msa(uint8_t *dst, int16_t *src, 320cabdff1aSopenharmony_ci int32_t dst_stride) 321cabdff1aSopenharmony_ci{ 322cabdff1aSopenharmony_ci v16u8 pred = { 0 }; 323cabdff1aSopenharmony_ci v16i8 out; 324cabdff1aSopenharmony_ci v8i16 pred_r, pred_l; 325cabdff1aSopenharmony_ci const uint32_t src0 = LW(dst); 326cabdff1aSopenharmony_ci const uint32_t src1 = LW(dst + dst_stride); 327cabdff1aSopenharmony_ci const uint32_t src2 = LW(dst + 2 * dst_stride); 328cabdff1aSopenharmony_ci const uint32_t src3 = LW(dst + 3 * dst_stride); 329cabdff1aSopenharmony_ci const int16_t dc = (src[0] + 32) >> 6; 330cabdff1aSopenharmony_ci const v8i16 input_dc = __msa_fill_h(dc); 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ci src[0] = 0; 333cabdff1aSopenharmony_ci INSERT_W4_UB(src0, src1, src2, src3, pred); 334cabdff1aSopenharmony_ci UNPCK_UB_SH(pred, pred_r, pred_l); 335cabdff1aSopenharmony_ci ADD2(pred_r, input_dc, pred_l, input_dc, pred_r, pred_l); 336cabdff1aSopenharmony_ci CLIP_SH2_0_255(pred_r, pred_l); 337cabdff1aSopenharmony_ci out = __msa_pckev_b((v16i8) pred_l, (v16i8) pred_r); 338cabdff1aSopenharmony_ci ST_W4(out, 0, 1, 2, 3, dst, dst_stride); 339cabdff1aSopenharmony_ci} 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_civoid ff_h264_idct8_dc_addblk_msa(uint8_t *dst, int16_t *src, 342cabdff1aSopenharmony_ci int32_t dst_stride) 343cabdff1aSopenharmony_ci{ 344cabdff1aSopenharmony_ci avc_idct8_dc_addblk_msa(dst, src, dst_stride); 345cabdff1aSopenharmony_ci} 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_civoid ff_h264_idct_add16_msa(uint8_t *dst, 348cabdff1aSopenharmony_ci const int32_t *blk_offset, 349cabdff1aSopenharmony_ci int16_t *block, int32_t dst_stride, 350cabdff1aSopenharmony_ci const uint8_t nzc[5 * 8]) 351cabdff1aSopenharmony_ci{ 352cabdff1aSopenharmony_ci int32_t i; 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_ci for (i = 0; i < 16; i++) { 355cabdff1aSopenharmony_ci int32_t nnz = nzc[scan8[i]]; 356cabdff1aSopenharmony_ci 357cabdff1aSopenharmony_ci if (nnz) { 358cabdff1aSopenharmony_ci if (nnz == 1 && ((dctcoef *) block)[i * 16]) 359cabdff1aSopenharmony_ci ff_h264_idct4x4_addblk_dc_msa(dst + blk_offset[i], 360cabdff1aSopenharmony_ci block + i * 16 * sizeof(pixel), 361cabdff1aSopenharmony_ci dst_stride); 362cabdff1aSopenharmony_ci else 363cabdff1aSopenharmony_ci ff_h264_idct_add_msa(dst + blk_offset[i], 364cabdff1aSopenharmony_ci block + i * 16 * sizeof(pixel), 365cabdff1aSopenharmony_ci dst_stride); 366cabdff1aSopenharmony_ci } 367cabdff1aSopenharmony_ci } 368cabdff1aSopenharmony_ci} 369cabdff1aSopenharmony_ci 370cabdff1aSopenharmony_civoid ff_h264_idct8_add4_msa(uint8_t *dst, const int32_t *blk_offset, 371cabdff1aSopenharmony_ci int16_t *block, int32_t dst_stride, 372cabdff1aSopenharmony_ci const uint8_t nzc[5 * 8]) 373cabdff1aSopenharmony_ci{ 374cabdff1aSopenharmony_ci int32_t cnt; 375cabdff1aSopenharmony_ci 376cabdff1aSopenharmony_ci for (cnt = 0; cnt < 16; cnt += 4) { 377cabdff1aSopenharmony_ci int32_t nnz = nzc[scan8[cnt]]; 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci if (nnz) { 380cabdff1aSopenharmony_ci if (nnz == 1 && ((dctcoef *) block)[cnt * 16]) 381cabdff1aSopenharmony_ci ff_h264_idct8_dc_addblk_msa(dst + blk_offset[cnt], 382cabdff1aSopenharmony_ci block + cnt * 16 * sizeof(pixel), 383cabdff1aSopenharmony_ci dst_stride); 384cabdff1aSopenharmony_ci else 385cabdff1aSopenharmony_ci ff_h264_idct8_addblk_msa(dst + blk_offset[cnt], 386cabdff1aSopenharmony_ci block + cnt * 16 * sizeof(pixel), 387cabdff1aSopenharmony_ci dst_stride); 388cabdff1aSopenharmony_ci } 389cabdff1aSopenharmony_ci } 390cabdff1aSopenharmony_ci} 391cabdff1aSopenharmony_ci 392cabdff1aSopenharmony_civoid ff_h264_idct_add8_msa(uint8_t **dst, 393cabdff1aSopenharmony_ci const int32_t *blk_offset, 394cabdff1aSopenharmony_ci int16_t *block, int32_t dst_stride, 395cabdff1aSopenharmony_ci const uint8_t nzc[15 * 8]) 396cabdff1aSopenharmony_ci{ 397cabdff1aSopenharmony_ci int32_t i, j; 398cabdff1aSopenharmony_ci 399cabdff1aSopenharmony_ci for (j = 1; j < 3; j++) { 400cabdff1aSopenharmony_ci for (i = (j * 16); i < (j * 16 + 4); i++) { 401cabdff1aSopenharmony_ci if (nzc[scan8[i]]) 402cabdff1aSopenharmony_ci ff_h264_idct_add_msa(dst[j - 1] + blk_offset[i], 403cabdff1aSopenharmony_ci block + i * 16 * sizeof(pixel), 404cabdff1aSopenharmony_ci dst_stride); 405cabdff1aSopenharmony_ci else if (((dctcoef *) block)[i * 16]) 406cabdff1aSopenharmony_ci ff_h264_idct4x4_addblk_dc_msa(dst[j - 1] + blk_offset[i], 407cabdff1aSopenharmony_ci block + i * 16 * sizeof(pixel), 408cabdff1aSopenharmony_ci dst_stride); 409cabdff1aSopenharmony_ci } 410cabdff1aSopenharmony_ci } 411cabdff1aSopenharmony_ci} 412cabdff1aSopenharmony_ci 413cabdff1aSopenharmony_civoid ff_h264_idct_add8_422_msa(uint8_t **dst, 414cabdff1aSopenharmony_ci const int32_t *blk_offset, 415cabdff1aSopenharmony_ci int16_t *block, int32_t dst_stride, 416cabdff1aSopenharmony_ci const uint8_t nzc[15 * 8]) 417cabdff1aSopenharmony_ci{ 418cabdff1aSopenharmony_ci int32_t i, j; 419cabdff1aSopenharmony_ci 420cabdff1aSopenharmony_ci for (j = 1; j < 3; j++) { 421cabdff1aSopenharmony_ci for (i = (j * 16); i < (j * 16 + 4); i++) { 422cabdff1aSopenharmony_ci if (nzc[scan8[i]]) 423cabdff1aSopenharmony_ci ff_h264_idct_add_msa(dst[j - 1] + blk_offset[i], 424cabdff1aSopenharmony_ci block + i * 16 * sizeof(pixel), 425cabdff1aSopenharmony_ci dst_stride); 426cabdff1aSopenharmony_ci else if (((dctcoef *) block)[i * 16]) 427cabdff1aSopenharmony_ci ff_h264_idct4x4_addblk_dc_msa(dst[j - 1] + blk_offset[i], 428cabdff1aSopenharmony_ci block + i * 16 * sizeof(pixel), 429cabdff1aSopenharmony_ci dst_stride); 430cabdff1aSopenharmony_ci } 431cabdff1aSopenharmony_ci } 432cabdff1aSopenharmony_ci 433cabdff1aSopenharmony_ci for (j = 1; j < 3; j++) { 434cabdff1aSopenharmony_ci for (i = (j * 16 + 4); i < (j * 16 + 8); i++) { 435cabdff1aSopenharmony_ci if (nzc[scan8[i + 4]]) 436cabdff1aSopenharmony_ci ff_h264_idct_add_msa(dst[j - 1] + blk_offset[i + 4], 437cabdff1aSopenharmony_ci block + i * 16 * sizeof(pixel), 438cabdff1aSopenharmony_ci dst_stride); 439cabdff1aSopenharmony_ci else if (((dctcoef *) block)[i * 16]) 440cabdff1aSopenharmony_ci ff_h264_idct4x4_addblk_dc_msa(dst[j - 1] + blk_offset[i + 4], 441cabdff1aSopenharmony_ci block + i * 16 * sizeof(pixel), 442cabdff1aSopenharmony_ci dst_stride); 443cabdff1aSopenharmony_ci } 444cabdff1aSopenharmony_ci } 445cabdff1aSopenharmony_ci} 446cabdff1aSopenharmony_ci 447cabdff1aSopenharmony_civoid ff_h264_idct_add16_intra_msa(uint8_t *dst, 448cabdff1aSopenharmony_ci const int32_t *blk_offset, 449cabdff1aSopenharmony_ci int16_t *block, 450cabdff1aSopenharmony_ci int32_t dst_stride, 451cabdff1aSopenharmony_ci const uint8_t nzc[5 * 8]) 452cabdff1aSopenharmony_ci{ 453cabdff1aSopenharmony_ci int32_t i; 454cabdff1aSopenharmony_ci 455cabdff1aSopenharmony_ci for (i = 0; i < 16; i++) { 456cabdff1aSopenharmony_ci if (nzc[scan8[i]]) 457cabdff1aSopenharmony_ci ff_h264_idct_add_msa(dst + blk_offset[i], 458cabdff1aSopenharmony_ci block + i * 16 * sizeof(pixel), dst_stride); 459cabdff1aSopenharmony_ci else if (((dctcoef *) block)[i * 16]) 460cabdff1aSopenharmony_ci ff_h264_idct4x4_addblk_dc_msa(dst + blk_offset[i], 461cabdff1aSopenharmony_ci block + i * 16 * sizeof(pixel), 462cabdff1aSopenharmony_ci dst_stride); 463cabdff1aSopenharmony_ci } 464cabdff1aSopenharmony_ci} 465cabdff1aSopenharmony_ci 466cabdff1aSopenharmony_civoid ff_h264_deq_idct_luma_dc_msa(int16_t *dst, int16_t *src, 467cabdff1aSopenharmony_ci int32_t de_qval) 468cabdff1aSopenharmony_ci{ 469cabdff1aSopenharmony_ci avc_deq_idct_luma_dc_msa(dst, src, de_qval); 470cabdff1aSopenharmony_ci} 471