1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2019 gxw <guxiwei-hf@loongson.cn> 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 "libavcodec/vp9dsp.h" 22cabdff1aSopenharmony_ci#include "libavutil/mips/mmiutils.h" 23cabdff1aSopenharmony_ci#include "vp9dsp_mips.h" 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#define GET_DATA_H_MMI \ 26cabdff1aSopenharmony_ci "pmaddhw %[ftmp4], %[ftmp4], %[filter1] \n\t" \ 27cabdff1aSopenharmony_ci "pmaddhw %[ftmp5], %[ftmp5], %[filter2] \n\t" \ 28cabdff1aSopenharmony_ci "paddw %[ftmp4], %[ftmp4], %[ftmp5] \n\t" \ 29cabdff1aSopenharmony_ci "punpckhwd %[ftmp5], %[ftmp4], %[ftmp0] \n\t" \ 30cabdff1aSopenharmony_ci "paddw %[ftmp4], %[ftmp4], %[ftmp5] \n\t" \ 31cabdff1aSopenharmony_ci "pmaddhw %[ftmp6], %[ftmp6], %[filter1] \n\t" \ 32cabdff1aSopenharmony_ci "pmaddhw %[ftmp7], %[ftmp7], %[filter2] \n\t" \ 33cabdff1aSopenharmony_ci "paddw %[ftmp6], %[ftmp6], %[ftmp7] \n\t" \ 34cabdff1aSopenharmony_ci "punpckhwd %[ftmp7], %[ftmp6], %[ftmp0] \n\t" \ 35cabdff1aSopenharmony_ci "paddw %[ftmp6], %[ftmp6], %[ftmp7] \n\t" \ 36cabdff1aSopenharmony_ci "punpcklwd %[srcl], %[ftmp4], %[ftmp6] \n\t" \ 37cabdff1aSopenharmony_ci "pmaddhw %[ftmp8], %[ftmp8], %[filter1] \n\t" \ 38cabdff1aSopenharmony_ci "pmaddhw %[ftmp9], %[ftmp9], %[filter2] \n\t" \ 39cabdff1aSopenharmony_ci "paddw %[ftmp8], %[ftmp8], %[ftmp9] \n\t" \ 40cabdff1aSopenharmony_ci "punpckhwd %[ftmp9], %[ftmp8], %[ftmp0] \n\t" \ 41cabdff1aSopenharmony_ci "paddw %[ftmp8], %[ftmp8], %[ftmp9] \n\t" \ 42cabdff1aSopenharmony_ci "pmaddhw %[ftmp10], %[ftmp10], %[filter1] \n\t" \ 43cabdff1aSopenharmony_ci "pmaddhw %[ftmp11], %[ftmp11], %[filter2] \n\t" \ 44cabdff1aSopenharmony_ci "paddw %[ftmp10], %[ftmp10], %[ftmp11] \n\t" \ 45cabdff1aSopenharmony_ci "punpckhwd %[ftmp11], %[ftmp10], %[ftmp0] \n\t" \ 46cabdff1aSopenharmony_ci "paddw %[ftmp10], %[ftmp10], %[ftmp11] \n\t" \ 47cabdff1aSopenharmony_ci "punpcklwd %[srch], %[ftmp8], %[ftmp10] \n\t" 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci#define GET_DATA_V_MMI \ 50cabdff1aSopenharmony_ci "punpcklhw %[srcl], %[ftmp4], %[ftmp5] \n\t" \ 51cabdff1aSopenharmony_ci "pmaddhw %[srcl], %[srcl], %[filter10] \n\t" \ 52cabdff1aSopenharmony_ci "punpcklhw %[ftmp12], %[ftmp6], %[ftmp7] \n\t" \ 53cabdff1aSopenharmony_ci "pmaddhw %[ftmp12], %[ftmp12], %[filter32] \n\t" \ 54cabdff1aSopenharmony_ci "paddw %[srcl], %[srcl], %[ftmp12] \n\t" \ 55cabdff1aSopenharmony_ci "punpcklhw %[ftmp12], %[ftmp8], %[ftmp9] \n\t" \ 56cabdff1aSopenharmony_ci "pmaddhw %[ftmp12], %[ftmp12], %[filter54] \n\t" \ 57cabdff1aSopenharmony_ci "paddw %[srcl], %[srcl], %[ftmp12] \n\t" \ 58cabdff1aSopenharmony_ci "punpcklhw %[ftmp12], %[ftmp10], %[ftmp11] \n\t" \ 59cabdff1aSopenharmony_ci "pmaddhw %[ftmp12], %[ftmp12], %[filter76] \n\t" \ 60cabdff1aSopenharmony_ci "paddw %[srcl], %[srcl], %[ftmp12] \n\t" \ 61cabdff1aSopenharmony_ci "punpckhhw %[srch], %[ftmp4], %[ftmp5] \n\t" \ 62cabdff1aSopenharmony_ci "pmaddhw %[srch], %[srch], %[filter10] \n\t" \ 63cabdff1aSopenharmony_ci "punpckhhw %[ftmp12], %[ftmp6], %[ftmp7] \n\t" \ 64cabdff1aSopenharmony_ci "pmaddhw %[ftmp12], %[ftmp12], %[filter32] \n\t" \ 65cabdff1aSopenharmony_ci "paddw %[srch], %[srch], %[ftmp12] \n\t" \ 66cabdff1aSopenharmony_ci "punpckhhw %[ftmp12], %[ftmp8], %[ftmp9] \n\t" \ 67cabdff1aSopenharmony_ci "pmaddhw %[ftmp12], %[ftmp12], %[filter54] \n\t" \ 68cabdff1aSopenharmony_ci "paddw %[srch], %[srch], %[ftmp12] \n\t" \ 69cabdff1aSopenharmony_ci "punpckhhw %[ftmp12], %[ftmp10], %[ftmp11] \n\t" \ 70cabdff1aSopenharmony_ci "pmaddhw %[ftmp12], %[ftmp12], %[filter76] \n\t" \ 71cabdff1aSopenharmony_ci "paddw %[srch], %[srch], %[ftmp12] \n\t" 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_cistatic void convolve_horiz_mmi(const uint8_t *src, int32_t src_stride, 74cabdff1aSopenharmony_ci uint8_t *dst, int32_t dst_stride, 75cabdff1aSopenharmony_ci const uint16_t *filter_x, int32_t w, 76cabdff1aSopenharmony_ci int32_t h) 77cabdff1aSopenharmony_ci{ 78cabdff1aSopenharmony_ci double ftmp[15]; 79cabdff1aSopenharmony_ci uint32_t tmp[2]; 80cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 81cabdff1aSopenharmony_ci src -= 3; 82cabdff1aSopenharmony_ci src_stride -= w; 83cabdff1aSopenharmony_ci dst_stride -= w; 84cabdff1aSopenharmony_ci __asm__ volatile ( 85cabdff1aSopenharmony_ci "move %[tmp1], %[width] \n\t" 86cabdff1aSopenharmony_ci "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" 87cabdff1aSopenharmony_ci MMI_ULDC1(%[filter1], %[filter], 0x00) 88cabdff1aSopenharmony_ci MMI_ULDC1(%[filter2], %[filter], 0x08) 89cabdff1aSopenharmony_ci "li %[tmp0], 0x07 \n\t" 90cabdff1aSopenharmony_ci "dmtc1 %[tmp0], %[ftmp13] \n\t" 91cabdff1aSopenharmony_ci "punpcklwd %[ftmp13], %[ftmp13], %[ftmp13] \n\t" 92cabdff1aSopenharmony_ci "1: \n\t" 93cabdff1aSopenharmony_ci /* Get 8 data per row */ 94cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[src], 0x00) 95cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp7], %[src], 0x01) 96cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp9], %[src], 0x02) 97cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp11], %[src], 0x03) 98cabdff1aSopenharmony_ci "punpcklbh %[ftmp4], %[ftmp5], %[ftmp0] \n\t" 99cabdff1aSopenharmony_ci "punpckhbh %[ftmp5], %[ftmp5], %[ftmp0] \n\t" 100cabdff1aSopenharmony_ci "punpcklbh %[ftmp6], %[ftmp7], %[ftmp0] \n\t" 101cabdff1aSopenharmony_ci "punpckhbh %[ftmp7], %[ftmp7], %[ftmp0] \n\t" 102cabdff1aSopenharmony_ci "punpcklbh %[ftmp8], %[ftmp9], %[ftmp0] \n\t" 103cabdff1aSopenharmony_ci "punpckhbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 104cabdff1aSopenharmony_ci "punpcklbh %[ftmp10], %[ftmp11], %[ftmp0] \n\t" 105cabdff1aSopenharmony_ci "punpckhbh %[ftmp11], %[ftmp11], %[ftmp0] \n\t" 106cabdff1aSopenharmony_ci PTR_ADDIU "%[width], %[width], -0x04 \n\t" 107cabdff1aSopenharmony_ci /* Get raw data */ 108cabdff1aSopenharmony_ci GET_DATA_H_MMI 109cabdff1aSopenharmony_ci ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5], 110cabdff1aSopenharmony_ci %[ftmp6], %[tmp0]) 111cabdff1aSopenharmony_ci ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5], 112cabdff1aSopenharmony_ci %[ftmp6], %[tmp0]) 113cabdff1aSopenharmony_ci "packsswh %[srcl], %[srcl], %[srch] \n\t" 114cabdff1aSopenharmony_ci "packushb %[ftmp12], %[srcl], %[ftmp0] \n\t" 115cabdff1aSopenharmony_ci "swc1 %[ftmp12], 0x00(%[dst]) \n\t" 116cabdff1aSopenharmony_ci PTR_ADDIU "%[dst], %[dst], 0x04 \n\t" 117cabdff1aSopenharmony_ci PTR_ADDIU "%[src], %[src], 0x04 \n\t" 118cabdff1aSopenharmony_ci /* Loop count */ 119cabdff1aSopenharmony_ci "bnez %[width], 1b \n\t" 120cabdff1aSopenharmony_ci "move %[width], %[tmp1] \n\t" 121cabdff1aSopenharmony_ci PTR_ADDU "%[src], %[src], %[src_stride] \n\t" 122cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[dst_stride] \n\t" 123cabdff1aSopenharmony_ci PTR_ADDIU "%[height], %[height], -0x01 \n\t" 124cabdff1aSopenharmony_ci "bnez %[height], 1b \n\t" 125cabdff1aSopenharmony_ci : RESTRICT_ASM_ALL64 126cabdff1aSopenharmony_ci [srcl]"=&f"(ftmp[0]), [srch]"=&f"(ftmp[1]), 127cabdff1aSopenharmony_ci [filter1]"=&f"(ftmp[2]), [filter2]"=&f"(ftmp[3]), 128cabdff1aSopenharmony_ci [ftmp0]"=&f"(ftmp[4]), [ftmp4]"=&f"(ftmp[5]), 129cabdff1aSopenharmony_ci [ftmp5]"=&f"(ftmp[6]), [ftmp6]"=&f"(ftmp[7]), 130cabdff1aSopenharmony_ci [ftmp7]"=&f"(ftmp[8]), [ftmp8]"=&f"(ftmp[9]), 131cabdff1aSopenharmony_ci [ftmp9]"=&f"(ftmp[10]), [ftmp10]"=&f"(ftmp[11]), 132cabdff1aSopenharmony_ci [ftmp11]"=&f"(ftmp[12]), [ftmp12]"=&f"(ftmp[13]), 133cabdff1aSopenharmony_ci [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]), 134cabdff1aSopenharmony_ci [src]"+&r"(src), [width]"+&r"(w), 135cabdff1aSopenharmony_ci [dst]"+&r"(dst), [height]"+&r"(h), 136cabdff1aSopenharmony_ci [ftmp13]"=&f"(ftmp[14]) 137cabdff1aSopenharmony_ci : [filter]"r"(filter_x), 138cabdff1aSopenharmony_ci [src_stride]"r"((mips_reg)src_stride), 139cabdff1aSopenharmony_ci [dst_stride]"r"((mips_reg)dst_stride) 140cabdff1aSopenharmony_ci : "memory" 141cabdff1aSopenharmony_ci ); 142cabdff1aSopenharmony_ci} 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_cistatic void convolve_vert_mmi(const uint8_t *src, int32_t src_stride, 145cabdff1aSopenharmony_ci uint8_t *dst, int32_t dst_stride, 146cabdff1aSopenharmony_ci const int16_t *filter_y, int32_t w, 147cabdff1aSopenharmony_ci int32_t h) 148cabdff1aSopenharmony_ci{ 149cabdff1aSopenharmony_ci double ftmp[17]; 150cabdff1aSopenharmony_ci uint32_t tmp[1]; 151cabdff1aSopenharmony_ci ptrdiff_t addr = src_stride; 152cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 153cabdff1aSopenharmony_ci src_stride -= w; 154cabdff1aSopenharmony_ci dst_stride -= w; 155cabdff1aSopenharmony_ci 156cabdff1aSopenharmony_ci __asm__ volatile ( 157cabdff1aSopenharmony_ci "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" 158cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[filter], 0x00) 159cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[filter], 0x08) 160cabdff1aSopenharmony_ci "punpcklwd %[filter10], %[ftmp4], %[ftmp4] \n\t" 161cabdff1aSopenharmony_ci "punpckhwd %[filter32], %[ftmp4], %[ftmp4] \n\t" 162cabdff1aSopenharmony_ci "punpcklwd %[filter54], %[ftmp5], %[ftmp5] \n\t" 163cabdff1aSopenharmony_ci "punpckhwd %[filter76], %[ftmp5], %[ftmp5] \n\t" 164cabdff1aSopenharmony_ci "li %[tmp0], 0x07 \n\t" 165cabdff1aSopenharmony_ci "dmtc1 %[tmp0], %[ftmp13] \n\t" 166cabdff1aSopenharmony_ci "punpcklwd %[ftmp13], %[ftmp13], %[ftmp13] \n\t" 167cabdff1aSopenharmony_ci "1: \n\t" 168cabdff1aSopenharmony_ci /* Get 8 data per column */ 169cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[src], 0x0) 170cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[src], %[addr] \n\t" 171cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[tmp0], 0x0) 172cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 173cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp6], %[tmp0], 0x0) 174cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 175cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp7], %[tmp0], 0x0) 176cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 177cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp8], %[tmp0], 0x0) 178cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 179cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp9], %[tmp0], 0x0) 180cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 181cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp10], %[tmp0], 0x0) 182cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 183cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp11], %[tmp0], 0x0) 184cabdff1aSopenharmony_ci "punpcklbh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" 185cabdff1aSopenharmony_ci "punpcklbh %[ftmp5], %[ftmp5], %[ftmp0] \n\t" 186cabdff1aSopenharmony_ci "punpcklbh %[ftmp6], %[ftmp6], %[ftmp0] \n\t" 187cabdff1aSopenharmony_ci "punpcklbh %[ftmp7], %[ftmp7], %[ftmp0] \n\t" 188cabdff1aSopenharmony_ci "punpcklbh %[ftmp8], %[ftmp8], %[ftmp0] \n\t" 189cabdff1aSopenharmony_ci "punpcklbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 190cabdff1aSopenharmony_ci "punpcklbh %[ftmp10], %[ftmp10], %[ftmp0] \n\t" 191cabdff1aSopenharmony_ci "punpcklbh %[ftmp11], %[ftmp11], %[ftmp0] \n\t" 192cabdff1aSopenharmony_ci PTR_ADDIU "%[width], %[width], -0x04 \n\t" 193cabdff1aSopenharmony_ci /* Get raw data */ 194cabdff1aSopenharmony_ci GET_DATA_V_MMI 195cabdff1aSopenharmony_ci ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5], 196cabdff1aSopenharmony_ci %[ftmp6], %[tmp0]) 197cabdff1aSopenharmony_ci ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5], 198cabdff1aSopenharmony_ci %[ftmp6], %[tmp0]) 199cabdff1aSopenharmony_ci "packsswh %[srcl], %[srcl], %[srch] \n\t" 200cabdff1aSopenharmony_ci "packushb %[ftmp12], %[srcl], %[ftmp0] \n\t" 201cabdff1aSopenharmony_ci "swc1 %[ftmp12], 0x00(%[dst]) \n\t" 202cabdff1aSopenharmony_ci PTR_ADDIU "%[dst], %[dst], 0x04 \n\t" 203cabdff1aSopenharmony_ci PTR_ADDIU "%[src], %[src], 0x04 \n\t" 204cabdff1aSopenharmony_ci /* Loop count */ 205cabdff1aSopenharmony_ci "bnez %[width], 1b \n\t" 206cabdff1aSopenharmony_ci PTR_SUBU "%[width], %[addr], %[src_stride] \n\t" 207cabdff1aSopenharmony_ci PTR_ADDU "%[src], %[src], %[src_stride] \n\t" 208cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[dst_stride] \n\t" 209cabdff1aSopenharmony_ci PTR_ADDIU "%[height], %[height], -0x01 \n\t" 210cabdff1aSopenharmony_ci "bnez %[height], 1b \n\t" 211cabdff1aSopenharmony_ci : RESTRICT_ASM_ALL64 212cabdff1aSopenharmony_ci [srcl]"=&f"(ftmp[0]), [srch]"=&f"(ftmp[1]), 213cabdff1aSopenharmony_ci [filter10]"=&f"(ftmp[2]), [filter32]"=&f"(ftmp[3]), 214cabdff1aSopenharmony_ci [filter54]"=&f"(ftmp[4]), [filter76]"=&f"(ftmp[5]), 215cabdff1aSopenharmony_ci [ftmp0]"=&f"(ftmp[6]), [ftmp4]"=&f"(ftmp[7]), 216cabdff1aSopenharmony_ci [ftmp5]"=&f"(ftmp[8]), [ftmp6]"=&f"(ftmp[9]), 217cabdff1aSopenharmony_ci [ftmp7]"=&f"(ftmp[10]), [ftmp8]"=&f"(ftmp[11]), 218cabdff1aSopenharmony_ci [ftmp9]"=&f"(ftmp[12]), [ftmp10]"=&f"(ftmp[13]), 219cabdff1aSopenharmony_ci [ftmp11]"=&f"(ftmp[14]), [ftmp12]"=&f"(ftmp[15]), 220cabdff1aSopenharmony_ci [src]"+&r"(src), [dst]"+&r"(dst), 221cabdff1aSopenharmony_ci [width]"+&r"(w), [height]"+&r"(h), 222cabdff1aSopenharmony_ci [tmp0]"=&r"(tmp[0]), [ftmp13]"=&f"(ftmp[16]) 223cabdff1aSopenharmony_ci : [filter]"r"(filter_y), 224cabdff1aSopenharmony_ci [src_stride]"r"((mips_reg)src_stride), 225cabdff1aSopenharmony_ci [dst_stride]"r"((mips_reg)dst_stride), 226cabdff1aSopenharmony_ci [addr]"r"((mips_reg)addr) 227cabdff1aSopenharmony_ci : "memory" 228cabdff1aSopenharmony_ci ); 229cabdff1aSopenharmony_ci} 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_cistatic void convolve_avg_horiz_mmi(const uint8_t *src, int32_t src_stride, 232cabdff1aSopenharmony_ci uint8_t *dst, int32_t dst_stride, 233cabdff1aSopenharmony_ci const uint16_t *filter_x, int32_t w, 234cabdff1aSopenharmony_ci int32_t h) 235cabdff1aSopenharmony_ci{ 236cabdff1aSopenharmony_ci double ftmp[15]; 237cabdff1aSopenharmony_ci uint32_t tmp[2]; 238cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 239cabdff1aSopenharmony_ci src -= 3; 240cabdff1aSopenharmony_ci src_stride -= w; 241cabdff1aSopenharmony_ci dst_stride -= w; 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_ci __asm__ volatile ( 244cabdff1aSopenharmony_ci "move %[tmp1], %[width] \n\t" 245cabdff1aSopenharmony_ci "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" 246cabdff1aSopenharmony_ci MMI_ULDC1(%[filter1], %[filter], 0x00) 247cabdff1aSopenharmony_ci MMI_ULDC1(%[filter2], %[filter], 0x08) 248cabdff1aSopenharmony_ci "li %[tmp0], 0x07 \n\t" 249cabdff1aSopenharmony_ci "dmtc1 %[tmp0], %[ftmp13] \n\t" 250cabdff1aSopenharmony_ci "punpcklwd %[ftmp13], %[ftmp13], %[ftmp13] \n\t" 251cabdff1aSopenharmony_ci "1: \n\t" 252cabdff1aSopenharmony_ci /* Get 8 data per row */ 253cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[src], 0x00) 254cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp7], %[src], 0x01) 255cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp9], %[src], 0x02) 256cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp11], %[src], 0x03) 257cabdff1aSopenharmony_ci "punpcklbh %[ftmp4], %[ftmp5], %[ftmp0] \n\t" 258cabdff1aSopenharmony_ci "punpckhbh %[ftmp5], %[ftmp5], %[ftmp0] \n\t" 259cabdff1aSopenharmony_ci "punpcklbh %[ftmp6], %[ftmp7], %[ftmp0] \n\t" 260cabdff1aSopenharmony_ci "punpckhbh %[ftmp7], %[ftmp7], %[ftmp0] \n\t" 261cabdff1aSopenharmony_ci "punpcklbh %[ftmp8], %[ftmp9], %[ftmp0] \n\t" 262cabdff1aSopenharmony_ci "punpckhbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 263cabdff1aSopenharmony_ci "punpcklbh %[ftmp10], %[ftmp11], %[ftmp0] \n\t" 264cabdff1aSopenharmony_ci "punpckhbh %[ftmp11], %[ftmp11], %[ftmp0] \n\t" 265cabdff1aSopenharmony_ci PTR_ADDIU "%[width], %[width], -0x04 \n\t" 266cabdff1aSopenharmony_ci /* Get raw data */ 267cabdff1aSopenharmony_ci GET_DATA_H_MMI 268cabdff1aSopenharmony_ci ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5], 269cabdff1aSopenharmony_ci %[ftmp6], %[tmp0]) 270cabdff1aSopenharmony_ci ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5], 271cabdff1aSopenharmony_ci %[ftmp6], %[tmp0]) 272cabdff1aSopenharmony_ci "packsswh %[srcl], %[srcl], %[srch] \n\t" 273cabdff1aSopenharmony_ci "packushb %[ftmp12], %[srcl], %[ftmp0] \n\t" 274cabdff1aSopenharmony_ci "punpcklbh %[ftmp12], %[ftmp12], %[ftmp0] \n\t" 275cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[dst], 0x0) 276cabdff1aSopenharmony_ci "punpcklbh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" 277cabdff1aSopenharmony_ci "paddh %[ftmp12], %[ftmp12], %[ftmp4] \n\t" 278cabdff1aSopenharmony_ci "li %[tmp0], 0x10001 \n\t" 279cabdff1aSopenharmony_ci "dmtc1 %[tmp0], %[ftmp5] \n\t" 280cabdff1aSopenharmony_ci "punpcklhw %[ftmp5], %[ftmp5], %[ftmp5] \n\t" 281cabdff1aSopenharmony_ci "paddh %[ftmp12], %[ftmp12], %[ftmp5] \n\t" 282cabdff1aSopenharmony_ci "psrah %[ftmp12], %[ftmp12], %[ftmp5] \n\t" 283cabdff1aSopenharmony_ci "packushb %[ftmp12], %[ftmp12], %[ftmp0] \n\t" 284cabdff1aSopenharmony_ci "swc1 %[ftmp12], 0x00(%[dst]) \n\t" 285cabdff1aSopenharmony_ci PTR_ADDIU "%[dst], %[dst], 0x04 \n\t" 286cabdff1aSopenharmony_ci PTR_ADDIU "%[src], %[src], 0x04 \n\t" 287cabdff1aSopenharmony_ci /* Loop count */ 288cabdff1aSopenharmony_ci "bnez %[width], 1b \n\t" 289cabdff1aSopenharmony_ci "move %[width], %[tmp1] \n\t" 290cabdff1aSopenharmony_ci PTR_ADDU "%[src], %[src], %[src_stride] \n\t" 291cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[dst_stride] \n\t" 292cabdff1aSopenharmony_ci PTR_ADDIU "%[height], %[height], -0x01 \n\t" 293cabdff1aSopenharmony_ci "bnez %[height], 1b \n\t" 294cabdff1aSopenharmony_ci : RESTRICT_ASM_ALL64 295cabdff1aSopenharmony_ci [srcl]"=&f"(ftmp[0]), [srch]"=&f"(ftmp[1]), 296cabdff1aSopenharmony_ci [filter1]"=&f"(ftmp[2]), [filter2]"=&f"(ftmp[3]), 297cabdff1aSopenharmony_ci [ftmp0]"=&f"(ftmp[4]), [ftmp4]"=&f"(ftmp[5]), 298cabdff1aSopenharmony_ci [ftmp5]"=&f"(ftmp[6]), [ftmp6]"=&f"(ftmp[7]), 299cabdff1aSopenharmony_ci [ftmp7]"=&f"(ftmp[8]), [ftmp8]"=&f"(ftmp[9]), 300cabdff1aSopenharmony_ci [ftmp9]"=&f"(ftmp[10]), [ftmp10]"=&f"(ftmp[11]), 301cabdff1aSopenharmony_ci [ftmp11]"=&f"(ftmp[12]), [ftmp12]"=&f"(ftmp[13]), 302cabdff1aSopenharmony_ci [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]), 303cabdff1aSopenharmony_ci [src]"+&r"(src), [width]"+&r"(w), 304cabdff1aSopenharmony_ci [dst]"+&r"(dst), [height]"+&r"(h), 305cabdff1aSopenharmony_ci [ftmp13]"=&f"(ftmp[14]) 306cabdff1aSopenharmony_ci : [filter]"r"(filter_x), 307cabdff1aSopenharmony_ci [src_stride]"r"((mips_reg)src_stride), 308cabdff1aSopenharmony_ci [dst_stride]"r"((mips_reg)dst_stride) 309cabdff1aSopenharmony_ci : "memory" 310cabdff1aSopenharmony_ci ); 311cabdff1aSopenharmony_ci} 312cabdff1aSopenharmony_ci 313cabdff1aSopenharmony_cistatic void convolve_avg_vert_mmi(const uint8_t *src, int32_t src_stride, 314cabdff1aSopenharmony_ci uint8_t *dst, int32_t dst_stride, 315cabdff1aSopenharmony_ci const int16_t *filter_y, int32_t w, 316cabdff1aSopenharmony_ci int32_t h) 317cabdff1aSopenharmony_ci{ 318cabdff1aSopenharmony_ci double ftmp[17]; 319cabdff1aSopenharmony_ci uint32_t tmp[1]; 320cabdff1aSopenharmony_ci ptrdiff_t addr = src_stride; 321cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 322cabdff1aSopenharmony_ci src_stride -= w; 323cabdff1aSopenharmony_ci dst_stride -= w; 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_ci __asm__ volatile ( 326cabdff1aSopenharmony_ci "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" 327cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[filter], 0x00) 328cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[filter], 0x08) 329cabdff1aSopenharmony_ci "punpcklwd %[filter10], %[ftmp4], %[ftmp4] \n\t" 330cabdff1aSopenharmony_ci "punpckhwd %[filter32], %[ftmp4], %[ftmp4] \n\t" 331cabdff1aSopenharmony_ci "punpcklwd %[filter54], %[ftmp5], %[ftmp5] \n\t" 332cabdff1aSopenharmony_ci "punpckhwd %[filter76], %[ftmp5], %[ftmp5] \n\t" 333cabdff1aSopenharmony_ci "li %[tmp0], 0x07 \n\t" 334cabdff1aSopenharmony_ci "dmtc1 %[tmp0], %[ftmp13] \n\t" 335cabdff1aSopenharmony_ci "punpcklwd %[ftmp13], %[ftmp13], %[ftmp13] \n\t" 336cabdff1aSopenharmony_ci "1: \n\t" 337cabdff1aSopenharmony_ci /* Get 8 data per column */ 338cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[src], 0x0) 339cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[src], %[addr] \n\t" 340cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[tmp0], 0x0) 341cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 342cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp6], %[tmp0], 0x0) 343cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 344cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp7], %[tmp0], 0x0) 345cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 346cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp8], %[tmp0], 0x0) 347cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 348cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp9], %[tmp0], 0x0) 349cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 350cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp10], %[tmp0], 0x0) 351cabdff1aSopenharmony_ci PTR_ADDU "%[tmp0], %[tmp0], %[addr] \n\t" 352cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp11], %[tmp0], 0x0) 353cabdff1aSopenharmony_ci "punpcklbh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" 354cabdff1aSopenharmony_ci "punpcklbh %[ftmp5], %[ftmp5], %[ftmp0] \n\t" 355cabdff1aSopenharmony_ci "punpcklbh %[ftmp6], %[ftmp6], %[ftmp0] \n\t" 356cabdff1aSopenharmony_ci "punpcklbh %[ftmp7], %[ftmp7], %[ftmp0] \n\t" 357cabdff1aSopenharmony_ci "punpcklbh %[ftmp8], %[ftmp8], %[ftmp0] \n\t" 358cabdff1aSopenharmony_ci "punpcklbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 359cabdff1aSopenharmony_ci "punpcklbh %[ftmp10], %[ftmp10], %[ftmp0] \n\t" 360cabdff1aSopenharmony_ci "punpcklbh %[ftmp11], %[ftmp11], %[ftmp0] \n\t" 361cabdff1aSopenharmony_ci PTR_ADDIU "%[width], %[width], -0x04 \n\t" 362cabdff1aSopenharmony_ci /* Get raw data */ 363cabdff1aSopenharmony_ci GET_DATA_V_MMI 364cabdff1aSopenharmony_ci ROUND_POWER_OF_TWO_MMI(%[srcl], %[ftmp13], %[ftmp5], 365cabdff1aSopenharmony_ci %[ftmp6], %[tmp0]) 366cabdff1aSopenharmony_ci ROUND_POWER_OF_TWO_MMI(%[srch], %[ftmp13], %[ftmp5], 367cabdff1aSopenharmony_ci %[ftmp6], %[tmp0]) 368cabdff1aSopenharmony_ci "packsswh %[srcl], %[srcl], %[srch] \n\t" 369cabdff1aSopenharmony_ci "packushb %[ftmp12], %[srcl], %[ftmp0] \n\t" 370cabdff1aSopenharmony_ci "punpcklbh %[ftmp12], %[ftmp12], %[ftmp0] \n\t" 371cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[dst], 0x00) 372cabdff1aSopenharmony_ci "punpcklbh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" 373cabdff1aSopenharmony_ci "paddh %[ftmp12], %[ftmp12], %[ftmp4] \n\t" 374cabdff1aSopenharmony_ci "li %[tmp0], 0x10001 \n\t" 375cabdff1aSopenharmony_ci "dmtc1 %[tmp0], %[ftmp5] \n\t" 376cabdff1aSopenharmony_ci "punpcklhw %[ftmp5], %[ftmp5], %[ftmp5] \n\t" 377cabdff1aSopenharmony_ci "paddh %[ftmp12], %[ftmp12], %[ftmp5] \n\t" 378cabdff1aSopenharmony_ci "psrah %[ftmp12], %[ftmp12], %[ftmp5] \n\t" 379cabdff1aSopenharmony_ci "packushb %[ftmp12], %[ftmp12], %[ftmp0] \n\t" 380cabdff1aSopenharmony_ci "swc1 %[ftmp12], 0x00(%[dst]) \n\t" 381cabdff1aSopenharmony_ci PTR_ADDIU "%[dst], %[dst], 0x04 \n\t" 382cabdff1aSopenharmony_ci PTR_ADDIU "%[src], %[src], 0x04 \n\t" 383cabdff1aSopenharmony_ci /* Loop count */ 384cabdff1aSopenharmony_ci "bnez %[width], 1b \n\t" 385cabdff1aSopenharmony_ci PTR_SUBU "%[width], %[addr], %[src_stride] \n\t" 386cabdff1aSopenharmony_ci PTR_ADDU "%[src], %[src], %[src_stride] \n\t" 387cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[dst_stride] \n\t" 388cabdff1aSopenharmony_ci PTR_ADDIU "%[height], %[height], -0x01 \n\t" 389cabdff1aSopenharmony_ci "bnez %[height], 1b \n\t" 390cabdff1aSopenharmony_ci : RESTRICT_ASM_ALL64 391cabdff1aSopenharmony_ci [srcl]"=&f"(ftmp[0]), [srch]"=&f"(ftmp[1]), 392cabdff1aSopenharmony_ci [filter10]"=&f"(ftmp[2]), [filter32]"=&f"(ftmp[3]), 393cabdff1aSopenharmony_ci [filter54]"=&f"(ftmp[4]), [filter76]"=&f"(ftmp[5]), 394cabdff1aSopenharmony_ci [ftmp0]"=&f"(ftmp[6]), [ftmp4]"=&f"(ftmp[7]), 395cabdff1aSopenharmony_ci [ftmp5]"=&f"(ftmp[8]), [ftmp6]"=&f"(ftmp[9]), 396cabdff1aSopenharmony_ci [ftmp7]"=&f"(ftmp[10]), [ftmp8]"=&f"(ftmp[11]), 397cabdff1aSopenharmony_ci [ftmp9]"=&f"(ftmp[12]), [ftmp10]"=&f"(ftmp[13]), 398cabdff1aSopenharmony_ci [ftmp11]"=&f"(ftmp[14]), [ftmp12]"=&f"(ftmp[15]), 399cabdff1aSopenharmony_ci [src]"+&r"(src), [dst]"+&r"(dst), 400cabdff1aSopenharmony_ci [width]"+&r"(w), [height]"+&r"(h), 401cabdff1aSopenharmony_ci [tmp0]"=&r"(tmp[0]), [ftmp13]"=&f"(ftmp[16]) 402cabdff1aSopenharmony_ci : [filter]"r"(filter_y), 403cabdff1aSopenharmony_ci [src_stride]"r"((mips_reg)src_stride), 404cabdff1aSopenharmony_ci [dst_stride]"r"((mips_reg)dst_stride), 405cabdff1aSopenharmony_ci [addr]"r"((mips_reg)addr) 406cabdff1aSopenharmony_ci : "memory" 407cabdff1aSopenharmony_ci ); 408cabdff1aSopenharmony_ci} 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_cistatic void convolve_avg_mmi(const uint8_t *src, int32_t src_stride, 411cabdff1aSopenharmony_ci uint8_t *dst, int32_t dst_stride, 412cabdff1aSopenharmony_ci int32_t w, int32_t h) 413cabdff1aSopenharmony_ci{ 414cabdff1aSopenharmony_ci double ftmp[4]; 415cabdff1aSopenharmony_ci uint32_t tmp[2]; 416cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 417cabdff1aSopenharmony_ci src_stride -= w; 418cabdff1aSopenharmony_ci dst_stride -= w; 419cabdff1aSopenharmony_ci 420cabdff1aSopenharmony_ci __asm__ volatile ( 421cabdff1aSopenharmony_ci "move %[tmp1], %[width] \n\t" 422cabdff1aSopenharmony_ci "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" 423cabdff1aSopenharmony_ci "li %[tmp0], 0x10001 \n\t" 424cabdff1aSopenharmony_ci "dmtc1 %[tmp0], %[ftmp3] \n\t" 425cabdff1aSopenharmony_ci "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" 426cabdff1aSopenharmony_ci "1: \n\t" 427cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[src], 0x00) 428cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[dst], 0x00) 429cabdff1aSopenharmony_ci "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t" 430cabdff1aSopenharmony_ci "punpcklbh %[ftmp2], %[ftmp2], %[ftmp0] \n\t" 431cabdff1aSopenharmony_ci "paddh %[ftmp1], %[ftmp1], %[ftmp2] \n\t" 432cabdff1aSopenharmony_ci "paddh %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 433cabdff1aSopenharmony_ci "psrah %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 434cabdff1aSopenharmony_ci "packushb %[ftmp1], %[ftmp1], %[ftmp0] \n\t" 435cabdff1aSopenharmony_ci "swc1 %[ftmp1], 0x00(%[dst]) \n\t" 436cabdff1aSopenharmony_ci PTR_ADDIU "%[width], %[width], -0x04 \n\t" 437cabdff1aSopenharmony_ci PTR_ADDIU "%[dst], %[dst], 0x04 \n\t" 438cabdff1aSopenharmony_ci PTR_ADDIU "%[src], %[src], 0x04 \n\t" 439cabdff1aSopenharmony_ci "bnez %[width], 1b \n\t" 440cabdff1aSopenharmony_ci "move %[width], %[tmp1] \n\t" 441cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[dst_stride] \n\t" 442cabdff1aSopenharmony_ci PTR_ADDU "%[src], %[src], %[src_stride] \n\t" 443cabdff1aSopenharmony_ci PTR_ADDIU "%[height], %[height], -0x01 \n\t" 444cabdff1aSopenharmony_ci "bnez %[height], 1b \n\t" 445cabdff1aSopenharmony_ci : RESTRICT_ASM_ALL64 446cabdff1aSopenharmony_ci [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 447cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 448cabdff1aSopenharmony_ci [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]), 449cabdff1aSopenharmony_ci [src]"+&r"(src), [dst]"+&r"(dst), 450cabdff1aSopenharmony_ci [width]"+&r"(w), [height]"+&r"(h) 451cabdff1aSopenharmony_ci : [src_stride]"r"((mips_reg)src_stride), 452cabdff1aSopenharmony_ci [dst_stride]"r"((mips_reg)dst_stride) 453cabdff1aSopenharmony_ci : "memory" 454cabdff1aSopenharmony_ci ); 455cabdff1aSopenharmony_ci} 456cabdff1aSopenharmony_ci 457cabdff1aSopenharmony_cistatic const int16_t vp9_subpel_filters_mmi[3][15][8] = { 458cabdff1aSopenharmony_ci [FILTER_8TAP_REGULAR] = { 459cabdff1aSopenharmony_ci {0, 1, -5, 126, 8, -3, 1, 0}, 460cabdff1aSopenharmony_ci {-1, 3, -10, 122, 18, -6, 2, 0}, 461cabdff1aSopenharmony_ci {-1, 4, -13, 118, 27, -9, 3, -1}, 462cabdff1aSopenharmony_ci {-1, 4, -16, 112, 37, -11, 4, -1}, 463cabdff1aSopenharmony_ci {-1, 5, -18, 105, 48, -14, 4, -1}, 464cabdff1aSopenharmony_ci {-1, 5, -19, 97, 58, -16, 5, -1}, 465cabdff1aSopenharmony_ci {-1, 6, -19, 88, 68, -18, 5, -1}, 466cabdff1aSopenharmony_ci {-1, 6, -19, 78, 78, -19, 6, -1}, 467cabdff1aSopenharmony_ci {-1, 5, -18, 68, 88, -19, 6, -1}, 468cabdff1aSopenharmony_ci {-1, 5, -16, 58, 97, -19, 5, -1}, 469cabdff1aSopenharmony_ci {-1, 4, -14, 48, 105, -18, 5, -1}, 470cabdff1aSopenharmony_ci {-1, 4, -11, 37, 112, -16, 4, -1}, 471cabdff1aSopenharmony_ci {-1, 3, -9, 27, 118, -13, 4, -1}, 472cabdff1aSopenharmony_ci {0, 2, -6, 18, 122, -10, 3, -1}, 473cabdff1aSopenharmony_ci {0, 1, -3, 8, 126, -5, 1, 0}, 474cabdff1aSopenharmony_ci }, [FILTER_8TAP_SHARP] = { 475cabdff1aSopenharmony_ci {-1, 3, -7, 127, 8, -3, 1, 0}, 476cabdff1aSopenharmony_ci {-2, 5, -13, 125, 17, -6, 3, -1}, 477cabdff1aSopenharmony_ci {-3, 7, -17, 121, 27, -10, 5, -2}, 478cabdff1aSopenharmony_ci {-4, 9, -20, 115, 37, -13, 6, -2}, 479cabdff1aSopenharmony_ci {-4, 10, -23, 108, 48, -16, 8, -3}, 480cabdff1aSopenharmony_ci {-4, 10, -24, 100, 59, -19, 9, -3}, 481cabdff1aSopenharmony_ci {-4, 11, -24, 90, 70, -21, 10, -4}, 482cabdff1aSopenharmony_ci {-4, 11, -23, 80, 80, -23, 11, -4}, 483cabdff1aSopenharmony_ci {-4, 10, -21, 70, 90, -24, 11, -4}, 484cabdff1aSopenharmony_ci {-3, 9, -19, 59, 100, -24, 10, -4}, 485cabdff1aSopenharmony_ci {-3, 8, -16, 48, 108, -23, 10, -4}, 486cabdff1aSopenharmony_ci {-2, 6, -13, 37, 115, -20, 9, -4}, 487cabdff1aSopenharmony_ci {-2, 5, -10, 27, 121, -17, 7, -3}, 488cabdff1aSopenharmony_ci {-1, 3, -6, 17, 125, -13, 5, -2}, 489cabdff1aSopenharmony_ci {0, 1, -3, 8, 127, -7, 3, -1}, 490cabdff1aSopenharmony_ci }, [FILTER_8TAP_SMOOTH] = { 491cabdff1aSopenharmony_ci {-3, -1, 32, 64, 38, 1, -3, 0}, 492cabdff1aSopenharmony_ci {-2, -2, 29, 63, 41, 2, -3, 0}, 493cabdff1aSopenharmony_ci {-2, -2, 26, 63, 43, 4, -4, 0}, 494cabdff1aSopenharmony_ci {-2, -3, 24, 62, 46, 5, -4, 0}, 495cabdff1aSopenharmony_ci {-2, -3, 21, 60, 49, 7, -4, 0}, 496cabdff1aSopenharmony_ci {-1, -4, 18, 59, 51, 9, -4, 0}, 497cabdff1aSopenharmony_ci {-1, -4, 16, 57, 53, 12, -4, -1}, 498cabdff1aSopenharmony_ci {-1, -4, 14, 55, 55, 14, -4, -1}, 499cabdff1aSopenharmony_ci {-1, -4, 12, 53, 57, 16, -4, -1}, 500cabdff1aSopenharmony_ci {0, -4, 9, 51, 59, 18, -4, -1}, 501cabdff1aSopenharmony_ci {0, -4, 7, 49, 60, 21, -3, -2}, 502cabdff1aSopenharmony_ci {0, -4, 5, 46, 62, 24, -3, -2}, 503cabdff1aSopenharmony_ci {0, -4, 4, 43, 63, 26, -2, -2}, 504cabdff1aSopenharmony_ci {0, -3, 2, 41, 63, 29, -2, -2}, 505cabdff1aSopenharmony_ci {0, -3, 1, 38, 64, 32, -1, -3}, 506cabdff1aSopenharmony_ci } 507cabdff1aSopenharmony_ci}; 508cabdff1aSopenharmony_ci 509cabdff1aSopenharmony_ci#define VP9_8TAP_MIPS_MMI_FUNC(SIZE, TYPE, TYPE_IDX) \ 510cabdff1aSopenharmony_civoid ff_put_8tap_##TYPE##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride, \ 511cabdff1aSopenharmony_ci const uint8_t *src, \ 512cabdff1aSopenharmony_ci ptrdiff_t srcstride, \ 513cabdff1aSopenharmony_ci int h, int mx, int my) \ 514cabdff1aSopenharmony_ci{ \ 515cabdff1aSopenharmony_ci const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1]; \ 516cabdff1aSopenharmony_ci \ 517cabdff1aSopenharmony_ci convolve_horiz_mmi(src, srcstride, dst, dststride, filter, SIZE, h); \ 518cabdff1aSopenharmony_ci} \ 519cabdff1aSopenharmony_ci \ 520cabdff1aSopenharmony_civoid ff_put_8tap_##TYPE##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride, \ 521cabdff1aSopenharmony_ci const uint8_t *src, \ 522cabdff1aSopenharmony_ci ptrdiff_t srcstride, \ 523cabdff1aSopenharmony_ci int h, int mx, int my) \ 524cabdff1aSopenharmony_ci{ \ 525cabdff1aSopenharmony_ci const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][my-1]; \ 526cabdff1aSopenharmony_ci \ 527cabdff1aSopenharmony_ci src -= (3 * srcstride); \ 528cabdff1aSopenharmony_ci convolve_vert_mmi(src, srcstride, dst, dststride, filter, SIZE, h); \ 529cabdff1aSopenharmony_ci} \ 530cabdff1aSopenharmony_ci \ 531cabdff1aSopenharmony_civoid ff_put_8tap_##TYPE##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride, \ 532cabdff1aSopenharmony_ci const uint8_t *src, \ 533cabdff1aSopenharmony_ci ptrdiff_t srcstride, \ 534cabdff1aSopenharmony_ci int h, int mx, int my) \ 535cabdff1aSopenharmony_ci{ \ 536cabdff1aSopenharmony_ci const uint16_t *hfilter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1]; \ 537cabdff1aSopenharmony_ci const uint16_t *vfilter = vp9_subpel_filters_mmi[TYPE_IDX][my-1]; \ 538cabdff1aSopenharmony_ci \ 539cabdff1aSopenharmony_ci int tmp_h = h + 7; \ 540cabdff1aSopenharmony_ci uint8_t temp[64 * 71]; \ 541cabdff1aSopenharmony_ci src -= (3 * srcstride); \ 542cabdff1aSopenharmony_ci convolve_horiz_mmi(src, srcstride, temp, 64, hfilter, SIZE, tmp_h); \ 543cabdff1aSopenharmony_ci convolve_vert_mmi(temp, 64, dst, dststride, vfilter, SIZE, h); \ 544cabdff1aSopenharmony_ci} \ 545cabdff1aSopenharmony_ci \ 546cabdff1aSopenharmony_civoid ff_avg_8tap_##TYPE##_##SIZE##h_mmi(uint8_t *dst, ptrdiff_t dststride, \ 547cabdff1aSopenharmony_ci const uint8_t *src, \ 548cabdff1aSopenharmony_ci ptrdiff_t srcstride, \ 549cabdff1aSopenharmony_ci int h, int mx, int my) \ 550cabdff1aSopenharmony_ci{ \ 551cabdff1aSopenharmony_ci const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1]; \ 552cabdff1aSopenharmony_ci \ 553cabdff1aSopenharmony_ci convolve_avg_horiz_mmi(src, srcstride, dst, dststride, filter, SIZE, h); \ 554cabdff1aSopenharmony_ci} \ 555cabdff1aSopenharmony_ci \ 556cabdff1aSopenharmony_civoid ff_avg_8tap_##TYPE##_##SIZE##v_mmi(uint8_t *dst, ptrdiff_t dststride, \ 557cabdff1aSopenharmony_ci const uint8_t *src, \ 558cabdff1aSopenharmony_ci ptrdiff_t srcstride, \ 559cabdff1aSopenharmony_ci int h, int mx, int my) \ 560cabdff1aSopenharmony_ci{ \ 561cabdff1aSopenharmony_ci const int16_t *filter = vp9_subpel_filters_mmi[TYPE_IDX][my-1]; \ 562cabdff1aSopenharmony_ci \ 563cabdff1aSopenharmony_ci src -= (3 * srcstride); \ 564cabdff1aSopenharmony_ci convolve_avg_vert_mmi(src, srcstride, dst, dststride, filter, SIZE, h); \ 565cabdff1aSopenharmony_ci} \ 566cabdff1aSopenharmony_ci \ 567cabdff1aSopenharmony_civoid ff_avg_8tap_##TYPE##_##SIZE##hv_mmi(uint8_t *dst, ptrdiff_t dststride, \ 568cabdff1aSopenharmony_ci const uint8_t *src, \ 569cabdff1aSopenharmony_ci ptrdiff_t srcstride, \ 570cabdff1aSopenharmony_ci int h, int mx, int my) \ 571cabdff1aSopenharmony_ci{ \ 572cabdff1aSopenharmony_ci const uint16_t *hfilter = vp9_subpel_filters_mmi[TYPE_IDX][mx-1]; \ 573cabdff1aSopenharmony_ci const uint16_t *vfilter = vp9_subpel_filters_mmi[TYPE_IDX][my-1]; \ 574cabdff1aSopenharmony_ci \ 575cabdff1aSopenharmony_ci uint8_t temp1[64 * 64]; \ 576cabdff1aSopenharmony_ci uint8_t temp2[64 * 71]; \ 577cabdff1aSopenharmony_ci int tmp_h = h + 7; \ 578cabdff1aSopenharmony_ci src -= (3 * srcstride); \ 579cabdff1aSopenharmony_ci convolve_horiz_mmi(src, srcstride, temp2, 64, hfilter, SIZE, tmp_h); \ 580cabdff1aSopenharmony_ci convolve_vert_mmi(temp2, 64, temp1, 64, vfilter, SIZE, h); \ 581cabdff1aSopenharmony_ci convolve_avg_mmi(temp1, 64, dst, dststride, SIZE, h); \ 582cabdff1aSopenharmony_ci} 583cabdff1aSopenharmony_ci 584cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(64, regular, FILTER_8TAP_REGULAR); 585cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(32, regular, FILTER_8TAP_REGULAR); 586cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(16, regular, FILTER_8TAP_REGULAR); 587cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(8, regular, FILTER_8TAP_REGULAR); 588cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(4, regular, FILTER_8TAP_REGULAR); 589cabdff1aSopenharmony_ci 590cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(64, sharp, FILTER_8TAP_SHARP); 591cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(32, sharp, FILTER_8TAP_SHARP); 592cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(16, sharp, FILTER_8TAP_SHARP); 593cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(8, sharp, FILTER_8TAP_SHARP); 594cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(4, sharp, FILTER_8TAP_SHARP); 595cabdff1aSopenharmony_ci 596cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(64, smooth, FILTER_8TAP_SMOOTH); 597cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(32, smooth, FILTER_8TAP_SMOOTH); 598cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(16, smooth, FILTER_8TAP_SMOOTH); 599cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(8, smooth, FILTER_8TAP_SMOOTH); 600cabdff1aSopenharmony_ciVP9_8TAP_MIPS_MMI_FUNC(4, smooth, FILTER_8TAP_SMOOTH); 601cabdff1aSopenharmony_ci 602cabdff1aSopenharmony_ci#undef VP9_8TAP_MIPS_MMI_FUNC 603