1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Loongson SIMD optimized qpeldsp 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (c) 2016 Loongson Technology Corporation Limited 5cabdff1aSopenharmony_ci * Copyright (c) 2016 Zhou Xiaoyong <zhouxiaoyong@loongson.cn> 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * This file is part of FFmpeg. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17cabdff1aSopenharmony_ci * Lesser General Public License for more details. 18cabdff1aSopenharmony_ci * 19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22cabdff1aSopenharmony_ci */ 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include "hpeldsp_mips.h" 25cabdff1aSopenharmony_ci#include "libavcodec/bit_depth_template.c" 26cabdff1aSopenharmony_ci#include "libavutil/mips/mmiutils.h" 27cabdff1aSopenharmony_ci#include "constants.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_civoid ff_put_pixels4_8_mmi(uint8_t *block, const uint8_t *pixels, 30cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 31cabdff1aSopenharmony_ci{ 32cabdff1aSopenharmony_ci double ftmp[4]; 33cabdff1aSopenharmony_ci DECLARE_VAR_LOW32; 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci __asm__ volatile ( 36cabdff1aSopenharmony_ci "1: \n\t" 37cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp0], %[pixels], 0x00) 38cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 39cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp1], %[pixels], 0x00) 40cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x02 \n\t" 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci MMI_SWC1(%[ftmp0], %[block], 0x00) 45cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[line_size] \n\t" 46cabdff1aSopenharmony_ci MMI_SWC1(%[ftmp1], %[block], 0x00) 47cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[line_size] \n\t" 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 50cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 51cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 52cabdff1aSopenharmony_ci RESTRICT_ASM_LOW32 53cabdff1aSopenharmony_ci [block]"+&r"(block), [pixels]"+&r"(pixels), 54cabdff1aSopenharmony_ci [h]"+&r"(h) 55cabdff1aSopenharmony_ci : [line_size]"r"((mips_reg)line_size) 56cabdff1aSopenharmony_ci : "memory" 57cabdff1aSopenharmony_ci ); 58cabdff1aSopenharmony_ci} 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_civoid ff_put_pixels8_8_mmi(uint8_t *block, const uint8_t *pixels, 61cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 62cabdff1aSopenharmony_ci{ 63cabdff1aSopenharmony_ci double ftmp[4]; 64cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci __asm__ volatile ( 67cabdff1aSopenharmony_ci "1: \n\t" 68cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[pixels], 0x00) 69cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 70cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[pixels], 0x00) 71cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 72cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[pixels], 0x00) 73cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 74cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[pixels], 0x00) 75cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 76cabdff1aSopenharmony_ci 77cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x04 \n\t" 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[block], 0x00) 80cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[line_size] \n\t" 81cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp1], %[block], 0x00) 82cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[line_size] \n\t" 83cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp2], %[block], 0x00) 84cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[line_size] \n\t" 85cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp3], %[block], 0x00) 86cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[line_size] \n\t" 87cabdff1aSopenharmony_ci 88cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 89cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 90cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 91cabdff1aSopenharmony_ci RESTRICT_ASM_ALL64 92cabdff1aSopenharmony_ci [block]"+&r"(block), [pixels]"+&r"(pixels), 93cabdff1aSopenharmony_ci [h]"+&r"(h) 94cabdff1aSopenharmony_ci : [line_size]"r"((mips_reg)line_size) 95cabdff1aSopenharmony_ci : "memory" 96cabdff1aSopenharmony_ci ); 97cabdff1aSopenharmony_ci} 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_civoid ff_put_pixels16_8_mmi(uint8_t *block, const uint8_t *pixels, 100cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 101cabdff1aSopenharmony_ci{ 102cabdff1aSopenharmony_ci double ftmp[8]; 103cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_ci __asm__ volatile ( 106cabdff1aSopenharmony_ci "1: \n\t" 107cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[pixels], 0x00) 108cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[pixels], 0x08) 109cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 110cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[pixels], 0x00) 111cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[pixels], 0x08) 112cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 113cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[pixels], 0x00) 114cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp6], %[pixels], 0x08) 115cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 116cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[pixels], 0x00) 117cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp7], %[pixels], 0x08) 118cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x04 \n\t" 121cabdff1aSopenharmony_ci 122cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[block], 0x00) 123cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp2], %[block], 0x08) 124cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[line_size] \n\t" 125cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp1], %[block], 0x00) 126cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp3], %[block], 0x08) 127cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[line_size] \n\t" 128cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp4], %[block], 0x00) 129cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp6], %[block], 0x08) 130cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[line_size] \n\t" 131cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp5], %[block], 0x00) 132cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp7], %[block], 0x08) 133cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[line_size] \n\t" 134cabdff1aSopenharmony_ci 135cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 136cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 137cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 138cabdff1aSopenharmony_ci [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]), 139cabdff1aSopenharmony_ci [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), 140cabdff1aSopenharmony_ci RESTRICT_ASM_ALL64 141cabdff1aSopenharmony_ci [block]"+&r"(block), [pixels]"+&r"(pixels), 142cabdff1aSopenharmony_ci [h]"+&r"(h) 143cabdff1aSopenharmony_ci : [line_size]"r"((mips_reg)line_size) 144cabdff1aSopenharmony_ci : "memory" 145cabdff1aSopenharmony_ci ); 146cabdff1aSopenharmony_ci} 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_civoid ff_avg_pixels4_8_mmi(uint8_t *block, const uint8_t *pixels, 149cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 150cabdff1aSopenharmony_ci{ 151cabdff1aSopenharmony_ci double ftmp[4]; 152cabdff1aSopenharmony_ci mips_reg addr[2]; 153cabdff1aSopenharmony_ci DECLARE_VAR_LOW32; 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ci __asm__ volatile ( 156cabdff1aSopenharmony_ci "1: \n\t" 157cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[pixels], %[line_size] \n\t" 158cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp0], %[pixels], 0x00) 159cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp1], %[addr0], 0x00) 160cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[block], %[line_size] \n\t" 161cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp2], %[block], 0x00) 162cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp3], %[addr1], 0x00) 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x02 \n\t" 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 167cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 168cabdff1aSopenharmony_ci MMI_SWC1(%[ftmp0], %[block], 0x00) 169cabdff1aSopenharmony_ci MMI_SWC1(%[ftmp1], %[addr1], 0x00) 170cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[addr0], %[line_size] \n\t" 171cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[addr1], %[line_size] \n\t" 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 174cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 175cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 176cabdff1aSopenharmony_ci RESTRICT_ASM_LOW32 177cabdff1aSopenharmony_ci [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]), 178cabdff1aSopenharmony_ci [block]"+&r"(block), [pixels]"+&r"(pixels), 179cabdff1aSopenharmony_ci [h]"+&r"(h) 180cabdff1aSopenharmony_ci : [line_size]"r"((mips_reg)line_size) 181cabdff1aSopenharmony_ci : "memory" 182cabdff1aSopenharmony_ci ); 183cabdff1aSopenharmony_ci} 184cabdff1aSopenharmony_ci 185cabdff1aSopenharmony_civoid ff_avg_pixels8_8_mmi(uint8_t *block, const uint8_t *pixels, 186cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 187cabdff1aSopenharmony_ci{ 188cabdff1aSopenharmony_ci double ftmp[4]; 189cabdff1aSopenharmony_ci mips_reg addr[3]; 190cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 191cabdff1aSopenharmony_ci DECLARE_VAR_ADDRT; 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci __asm__ volatile ( 194cabdff1aSopenharmony_ci PTR_ADDU "%[addr2], %[line_size], %[line_size] \n\t" 195cabdff1aSopenharmony_ci "1: \n\t" 196cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[pixels], 0x00) 197cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[pixels], %[line_size] \n\t" 198cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[addr0], 0x00) 199cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[block], %[line_size] \n\t" 200cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[block], 0x00) 201cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr1], 0x00) 202cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 203cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 204cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[block], 0x00) 205cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp1], %[block], %[line_size], 0x00) 206cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[addr2] \n\t" 207cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[addr2] \n\t" 208cabdff1aSopenharmony_ci 209cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[pixels], 0x00) 210cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[pixels], %[line_size] \n\t" 211cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[addr0], 0x00) 212cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[block], %[line_size] \n\t" 213cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[block], 0x00) 214cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr1], 0x00) 215cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 216cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 217cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[block], 0x00) 218cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp1], %[block], %[line_size], 0x00) 219cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[addr2] \n\t" 220cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[block], %[addr2] \n\t" 221cabdff1aSopenharmony_ci 222cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x04 \n\t" 223cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 224cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 225cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 226cabdff1aSopenharmony_ci RESTRICT_ASM_ALL64 227cabdff1aSopenharmony_ci RESTRICT_ASM_ADDRT 228cabdff1aSopenharmony_ci [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]), 229cabdff1aSopenharmony_ci [addr2]"=&r"(addr[2]), 230cabdff1aSopenharmony_ci [block]"+&r"(block), [pixels]"+&r"(pixels), 231cabdff1aSopenharmony_ci [h]"+&r"(h) 232cabdff1aSopenharmony_ci : [line_size]"r"((mips_reg)line_size) 233cabdff1aSopenharmony_ci : "memory" 234cabdff1aSopenharmony_ci ); 235cabdff1aSopenharmony_ci} 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_civoid ff_avg_pixels16_8_mmi(uint8_t *block, const uint8_t *pixels, 238cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 239cabdff1aSopenharmony_ci{ 240cabdff1aSopenharmony_ci double ftmp[8]; 241cabdff1aSopenharmony_ci mips_reg addr[1]; 242cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 243cabdff1aSopenharmony_ci 244cabdff1aSopenharmony_ci __asm__ volatile ( 245cabdff1aSopenharmony_ci "1: \n\t" 246cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x04 \n\t" 247cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[pixels], 0x00) 248cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[pixels], 0x08) 249cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 250cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[pixels], 0x00) 251cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[pixels], 0x08) 252cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 253cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[block], 0x00) 254cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp6], %[block], 0x08) 255cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[block], %[line_size] \n\t" 256cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr0], 0x00) 257cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp7], %[addr0], 0x08) 258cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 259cabdff1aSopenharmony_ci "pavgb %[ftmp4], %[ftmp4], %[ftmp6] \n\t" 260cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 261cabdff1aSopenharmony_ci "pavgb %[ftmp5], %[ftmp5], %[ftmp7] \n\t" 262cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[block], 0x00) 263cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp4], %[block], 0x08) 264cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp1], %[addr0], 0x00) 265cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp5], %[addr0], 0x08) 266cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[addr0], %[line_size] \n\t" 267cabdff1aSopenharmony_ci 268cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[pixels], 0x00) 269cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[pixels], 0x08) 270cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 271cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[pixels], 0x00) 272cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[pixels], 0x08) 273cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 274cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[block], 0x00) 275cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp6], %[block], 0x08) 276cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[block], %[line_size] \n\t" 277cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr0], 0x00) 278cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp7], %[addr0], 0x08) 279cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 280cabdff1aSopenharmony_ci "pavgb %[ftmp4], %[ftmp4], %[ftmp6] \n\t" 281cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 282cabdff1aSopenharmony_ci "pavgb %[ftmp5], %[ftmp5], %[ftmp7] \n\t" 283cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[block], 0x00) 284cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp4], %[block], 0x08) 285cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp1], %[addr0], 0x00) 286cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp5], %[addr0], 0x08) 287cabdff1aSopenharmony_ci PTR_ADDU "%[block], %[addr0], %[line_size] \n\t" 288cabdff1aSopenharmony_ci 289cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 290cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 291cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 292cabdff1aSopenharmony_ci [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]), 293cabdff1aSopenharmony_ci [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), 294cabdff1aSopenharmony_ci RESTRICT_ASM_ALL64 295cabdff1aSopenharmony_ci [addr0]"=&r"(addr[0]), 296cabdff1aSopenharmony_ci [block]"+&r"(block), [pixels]"+&r"(pixels), 297cabdff1aSopenharmony_ci [h]"+&r"(h) 298cabdff1aSopenharmony_ci : [line_size]"r"((mips_reg)line_size) 299cabdff1aSopenharmony_ci : "memory" 300cabdff1aSopenharmony_ci ); 301cabdff1aSopenharmony_ci} 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ciinline void ff_put_pixels4_l2_8_mmi(uint8_t *dst, const uint8_t *src1, 304cabdff1aSopenharmony_ci const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, 305cabdff1aSopenharmony_ci int h) 306cabdff1aSopenharmony_ci{ 307cabdff1aSopenharmony_ci double ftmp[4]; 308cabdff1aSopenharmony_ci mips_reg addr[5]; 309cabdff1aSopenharmony_ci DECLARE_VAR_LOW32; 310cabdff1aSopenharmony_ci DECLARE_VAR_ADDRT; 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ci __asm__ volatile ( 313cabdff1aSopenharmony_ci "1: \n\t" 314cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[src1], %[src_stride1] \n\t" 315cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp0], %[src1], 0x00) 316cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp1], %[addr0], 0x00) 317cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[src2], %[src_stride2] \n\t" 318cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp2], %[src2], 0x00) 319cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp3], %[addr1], 0x00) 320cabdff1aSopenharmony_ci PTR_ADDU "%[src1], %[addr0], %[src_stride1] \n\t" 321cabdff1aSopenharmony_ci PTR_ADDU "%[src2], %[addr1], %[src_stride2] \n\t" 322cabdff1aSopenharmony_ci 323cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x02 \n\t" 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 326cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 327cabdff1aSopenharmony_ci MMI_SWC1(%[ftmp0], %[dst], 0x00) 328cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[dst_stride] \n\t" 329cabdff1aSopenharmony_ci MMI_SWC1(%[ftmp1], %[dst], 0x00) 330cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[dst_stride] \n\t" 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 333cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 334cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 335cabdff1aSopenharmony_ci RESTRICT_ASM_LOW32 336cabdff1aSopenharmony_ci RESTRICT_ASM_ADDRT 337cabdff1aSopenharmony_ci [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]), 338cabdff1aSopenharmony_ci [dst]"+&r"(dst), [src1]"+&r"(src1), 339cabdff1aSopenharmony_ci [src2]"+&r"(src2), [h]"+&r"(h) 340cabdff1aSopenharmony_ci : [dst_stride]"r"((mips_reg)dst_stride), 341cabdff1aSopenharmony_ci [src_stride1]"r"((mips_reg)src_stride1), 342cabdff1aSopenharmony_ci [src_stride2]"r"((mips_reg)src_stride2) 343cabdff1aSopenharmony_ci : "memory" 344cabdff1aSopenharmony_ci ); 345cabdff1aSopenharmony_ci} 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ciinline void ff_put_pixels8_l2_8_mmi(uint8_t *dst, const uint8_t *src1, 348cabdff1aSopenharmony_ci const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, 349cabdff1aSopenharmony_ci int h) 350cabdff1aSopenharmony_ci{ 351cabdff1aSopenharmony_ci double ftmp[4]; 352cabdff1aSopenharmony_ci mips_reg addr[5]; 353cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 354cabdff1aSopenharmony_ci DECLARE_VAR_ADDRT; 355cabdff1aSopenharmony_ci 356cabdff1aSopenharmony_ci __asm__ volatile ( 357cabdff1aSopenharmony_ci PTR_ADDU "%[addr2], %[src_stride1], %[src_stride1] \n\t" 358cabdff1aSopenharmony_ci PTR_ADDU "%[addr3], %[src_stride2], %[src_stride2] \n\t" 359cabdff1aSopenharmony_ci PTR_ADDU "%[addr4], %[dst_stride], %[dst_stride] \n\t" 360cabdff1aSopenharmony_ci 361cabdff1aSopenharmony_ci "1: \n\t" 362cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[src1], 0x00) 363cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[src1], %[src_stride1] \n\t" 364cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[addr0], 0x00) 365cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[src2], 0x00) 366cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[src2], %[src_stride2] \n\t" 367cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr1], 0x00) 368cabdff1aSopenharmony_ci PTR_ADDU "%[src1], %[src1], %[addr2] \n\t" 369cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 370cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 371cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[dst], 0x00) 372cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp1], %[dst], %[dst_stride], 0x00) 373cabdff1aSopenharmony_ci PTR_ADDU "%[src2], %[src2], %[addr3] \n\t" 374cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[addr4] \n\t" 375cabdff1aSopenharmony_ci 376cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[src1], 0x00) 377cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[src1], %[src_stride1] \n\t" 378cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[addr0], 0x00) 379cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[src2], 0x00) 380cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[src2], %[src_stride2] \n\t" 381cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr1], 0x00) 382cabdff1aSopenharmony_ci PTR_ADDU "%[src1], %[src1], %[addr2] \n\t" 383cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 384cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 385cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[dst], 0x00) 386cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp1], %[dst], %[dst_stride], 0x00) 387cabdff1aSopenharmony_ci PTR_ADDU "%[src2], %[src2], %[addr3] \n\t" 388cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[addr4] \n\t" 389cabdff1aSopenharmony_ci 390cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x04 \n\t" 391cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 392cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 393cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 394cabdff1aSopenharmony_ci RESTRICT_ASM_ALL64 395cabdff1aSopenharmony_ci RESTRICT_ASM_ADDRT 396cabdff1aSopenharmony_ci [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]), 397cabdff1aSopenharmony_ci [addr2]"=&r"(addr[2]), [addr3]"=&r"(addr[3]), 398cabdff1aSopenharmony_ci [addr4]"=&r"(addr[4]), 399cabdff1aSopenharmony_ci [dst]"+&r"(dst), [src1]"+&r"(src1), 400cabdff1aSopenharmony_ci [src2]"+&r"(src2), [h]"+&r"(h) 401cabdff1aSopenharmony_ci : [dst_stride]"r"((mips_reg)dst_stride), 402cabdff1aSopenharmony_ci [src_stride1]"r"((mips_reg)src_stride1), 403cabdff1aSopenharmony_ci [src_stride2]"r"((mips_reg)src_stride2) 404cabdff1aSopenharmony_ci : "memory" 405cabdff1aSopenharmony_ci ); 406cabdff1aSopenharmony_ci} 407cabdff1aSopenharmony_ci 408cabdff1aSopenharmony_ciinline void ff_put_pixels16_l2_8_mmi(uint8_t *dst, const uint8_t *src1, 409cabdff1aSopenharmony_ci const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, 410cabdff1aSopenharmony_ci int h) 411cabdff1aSopenharmony_ci{ 412cabdff1aSopenharmony_ci double ftmp[8]; 413cabdff1aSopenharmony_ci mips_reg addr[5]; 414cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 415cabdff1aSopenharmony_ci DECLARE_VAR_ADDRT; 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci __asm__ volatile ( 418cabdff1aSopenharmony_ci PTR_ADDU "%[addr2], %[src_stride1], %[src_stride1] \n\t" 419cabdff1aSopenharmony_ci PTR_ADDU "%[addr3], %[src_stride2], %[src_stride2] \n\t" 420cabdff1aSopenharmony_ci PTR_ADDU "%[addr4], %[dst_stride], %[dst_stride] \n\t" 421cabdff1aSopenharmony_ci 422cabdff1aSopenharmony_ci "1: \n\t" 423cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[src1], 0x00) 424cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[src1], %[src_stride1] \n\t" 425cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[src1], 0x08) 426cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[addr0], 0x00) 427cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[addr0], 0x08) 428cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[src2], 0x00) 429cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[src2], %[src_stride2] \n\t" 430cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp6], %[src2], 0x08) 431cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr1], 0x00) 432cabdff1aSopenharmony_ci PTR_ADDU "%[src1], %[src1], %[addr2] \n\t" 433cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp7], %[addr1], 0x08) 434cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 435cabdff1aSopenharmony_ci "pavgb %[ftmp4], %[ftmp4], %[ftmp6] \n\t" 436cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 437cabdff1aSopenharmony_ci "pavgb %[ftmp5], %[ftmp5], %[ftmp7] \n\t" 438cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[dst], 0x00) 439cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp1], %[dst], %[dst_stride], 0x00) 440cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp4], %[dst], 0x08) 441cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp5], %[dst], %[dst_stride], 0x08) 442cabdff1aSopenharmony_ci PTR_ADDU "%[src2], %[src2], %[addr3] \n\t" 443cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[addr4] \n\t" 444cabdff1aSopenharmony_ci 445cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[src1], 0x00) 446cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[src1], %[src_stride1] \n\t" 447cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[src1], 0x08) 448cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[addr0], 0x00) 449cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[addr0], 0x08) 450cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[src2], 0x00) 451cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[src2], %[src_stride2] \n\t" 452cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp6], %[src2], 0x08) 453cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr1], 0x00) 454cabdff1aSopenharmony_ci PTR_ADDU "%[src1], %[src1], %[addr2] \n\t" 455cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp7], %[addr1], 0x08) 456cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 457cabdff1aSopenharmony_ci "pavgb %[ftmp4], %[ftmp4], %[ftmp6] \n\t" 458cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 459cabdff1aSopenharmony_ci "pavgb %[ftmp5], %[ftmp5], %[ftmp7] \n\t" 460cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[dst], 0x00) 461cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp1], %[dst], %[dst_stride], 0x00) 462cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp4], %[dst], 0x08) 463cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp5], %[dst], %[dst_stride], 0x08) 464cabdff1aSopenharmony_ci PTR_ADDU "%[src2], %[src2], %[addr3] \n\t" 465cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[addr4] \n\t" 466cabdff1aSopenharmony_ci 467cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x04 \n\t" 468cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 469cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 470cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 471cabdff1aSopenharmony_ci [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]), 472cabdff1aSopenharmony_ci [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), 473cabdff1aSopenharmony_ci RESTRICT_ASM_ALL64 474cabdff1aSopenharmony_ci RESTRICT_ASM_ADDRT 475cabdff1aSopenharmony_ci [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]), 476cabdff1aSopenharmony_ci [addr2]"=&r"(addr[2]), [addr3]"=&r"(addr[3]), 477cabdff1aSopenharmony_ci [addr4]"=&r"(addr[4]), 478cabdff1aSopenharmony_ci [dst]"+&r"(dst), [src1]"+&r"(src1), 479cabdff1aSopenharmony_ci [src2]"+&r"(src2), [h]"+&r"(h) 480cabdff1aSopenharmony_ci : [dst_stride]"r"((mips_reg)dst_stride), 481cabdff1aSopenharmony_ci [src_stride1]"r"((mips_reg)src_stride1), 482cabdff1aSopenharmony_ci [src_stride2]"r"((mips_reg)src_stride2) 483cabdff1aSopenharmony_ci : "memory" 484cabdff1aSopenharmony_ci ); 485cabdff1aSopenharmony_ci} 486cabdff1aSopenharmony_ci 487cabdff1aSopenharmony_ciinline void ff_avg_pixels4_l2_8_mmi(uint8_t *dst, const uint8_t *src1, 488cabdff1aSopenharmony_ci const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, 489cabdff1aSopenharmony_ci int h) 490cabdff1aSopenharmony_ci{ 491cabdff1aSopenharmony_ci double ftmp[6]; 492cabdff1aSopenharmony_ci mips_reg addr[6]; 493cabdff1aSopenharmony_ci DECLARE_VAR_LOW32; 494cabdff1aSopenharmony_ci 495cabdff1aSopenharmony_ci __asm__ volatile ( 496cabdff1aSopenharmony_ci "1: \n\t" 497cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[src1], %[src_stride1] \n\t" 498cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp0], %[src1], 0x00) 499cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp1], %[addr0], 0x00) 500cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[src2], %[src_stride2] \n\t" 501cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp2], %[src2], 0x00) 502cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp3], %[addr1], 0x00) 503cabdff1aSopenharmony_ci PTR_ADDU "%[src1], %[addr0], %[src_stride1] \n\t" 504cabdff1aSopenharmony_ci PTR_ADDU "%[src2], %[addr1], %[src_stride2] \n\t" 505cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 506cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 507cabdff1aSopenharmony_ci PTR_ADDU "%[addr2], %[dst], %[dst_stride] \n\t" 508cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp4], %[dst], 0x00) 509cabdff1aSopenharmony_ci MMI_ULWC1(%[ftmp5], %[addr2], 0x00) 510cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x02 \n\t" 511cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp4] \n\t" 512cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp5] \n\t" 513cabdff1aSopenharmony_ci MMI_SWC1(%[ftmp0], %[dst], 0x00) 514cabdff1aSopenharmony_ci MMI_SWC1(%[ftmp1], %[addr2], 0x00) 515cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[addr2], %[dst_stride] \n\t" 516cabdff1aSopenharmony_ci 517cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 518cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 519cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 520cabdff1aSopenharmony_ci [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]), 521cabdff1aSopenharmony_ci RESTRICT_ASM_LOW32 522cabdff1aSopenharmony_ci [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]), 523cabdff1aSopenharmony_ci [addr2]"=&r"(addr[2]), 524cabdff1aSopenharmony_ci [dst]"+&r"(dst), [src1]"+&r"(src1), 525cabdff1aSopenharmony_ci [src2]"+&r"(src2), [h]"+&r"(h) 526cabdff1aSopenharmony_ci : [dst_stride]"r"((mips_reg)dst_stride), 527cabdff1aSopenharmony_ci [src_stride1]"r"((mips_reg)src_stride1), 528cabdff1aSopenharmony_ci [src_stride2]"r"((mips_reg)src_stride2) 529cabdff1aSopenharmony_ci : "memory" 530cabdff1aSopenharmony_ci ); 531cabdff1aSopenharmony_ci} 532cabdff1aSopenharmony_ci 533cabdff1aSopenharmony_ciinline void ff_avg_pixels8_l2_8_mmi(uint8_t *dst, const uint8_t *src1, 534cabdff1aSopenharmony_ci const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, 535cabdff1aSopenharmony_ci int h) 536cabdff1aSopenharmony_ci{ 537cabdff1aSopenharmony_ci double ftmp[6]; 538cabdff1aSopenharmony_ci mips_reg addr[6]; 539cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 540cabdff1aSopenharmony_ci DECLARE_VAR_ADDRT; 541cabdff1aSopenharmony_ci 542cabdff1aSopenharmony_ci __asm__ volatile ( 543cabdff1aSopenharmony_ci PTR_ADDU "%[addr2], %[src_stride1], %[src_stride1] \n\t" 544cabdff1aSopenharmony_ci PTR_ADDU "%[addr3], %[src_stride2], %[src_stride2] \n\t" 545cabdff1aSopenharmony_ci PTR_ADDU "%[addr4], %[dst_stride], %[dst_stride] \n\t" 546cabdff1aSopenharmony_ci 547cabdff1aSopenharmony_ci "1: \n\t" 548cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[src1], 0x00) 549cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[src1], %[src_stride1] \n\t" 550cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[addr0], 0x00) 551cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[src2], %[src_stride2] \n\t" 552cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[src2], 0x00) 553cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr1], 0x00) 554cabdff1aSopenharmony_ci PTR_ADDU "%[src1], %[src1], %[addr2] \n\t" 555cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 556cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 557cabdff1aSopenharmony_ci PTR_ADDU "%[addr5], %[dst], %[dst_stride] \n\t" 558cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[dst], 0x00) 559cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[addr5], 0x00) 560cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp4] \n\t" 561cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp5] \n\t" 562cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[dst], 0x00) 563cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp1], %[dst], %[dst_stride], 0x00) 564cabdff1aSopenharmony_ci PTR_ADDU "%[src2], %[src2], %[addr3] \n\t" 565cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[addr4] \n\t" 566cabdff1aSopenharmony_ci 567cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[src1], 0x00) 568cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[src1], %[src_stride1] \n\t" 569cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[addr0], 0x00) 570cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[src2], %[src_stride2] \n\t" 571cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[src2], 0x00) 572cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr1], 0x00) 573cabdff1aSopenharmony_ci PTR_ADDU "%[src1], %[src1], %[addr2] \n\t" 574cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 575cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 576cabdff1aSopenharmony_ci PTR_ADDU "%[addr5], %[dst], %[dst_stride] \n\t" 577cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[dst], 0x00) 578cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp5], %[addr5], 0x00) 579cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp4] \n\t" 580cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp5] \n\t" 581cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[dst], 0x00) 582cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp1], %[dst], %[dst_stride], 0x00) 583cabdff1aSopenharmony_ci PTR_ADDU "%[src2], %[src2], %[addr3] \n\t" 584cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[addr4] \n\t" 585cabdff1aSopenharmony_ci 586cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x04 \n\t" 587cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 588cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 589cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 590cabdff1aSopenharmony_ci [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]), 591cabdff1aSopenharmony_ci RESTRICT_ASM_ALL64 592cabdff1aSopenharmony_ci RESTRICT_ASM_ADDRT 593cabdff1aSopenharmony_ci [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]), 594cabdff1aSopenharmony_ci [addr2]"=&r"(addr[2]), [addr3]"=&r"(addr[3]), 595cabdff1aSopenharmony_ci [addr4]"=&r"(addr[4]), [addr5]"=&r"(addr[5]), 596cabdff1aSopenharmony_ci [dst]"+&r"(dst), [src1]"+&r"(src1), 597cabdff1aSopenharmony_ci [src2]"+&r"(src2), [h]"+&r"(h) 598cabdff1aSopenharmony_ci : [dst_stride]"r"((mips_reg)dst_stride), 599cabdff1aSopenharmony_ci [src_stride1]"r"((mips_reg)src_stride1), 600cabdff1aSopenharmony_ci [src_stride2]"r"((mips_reg)src_stride2) 601cabdff1aSopenharmony_ci : "memory" 602cabdff1aSopenharmony_ci ); 603cabdff1aSopenharmony_ci} 604cabdff1aSopenharmony_ci 605cabdff1aSopenharmony_ciinline void ff_avg_pixels16_l2_8_mmi(uint8_t *dst, const uint8_t *src1, 606cabdff1aSopenharmony_ci const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, 607cabdff1aSopenharmony_ci int h) 608cabdff1aSopenharmony_ci{ 609cabdff1aSopenharmony_ci ff_avg_pixels8_l2_8_mmi(dst, src1, src2, dst_stride, src_stride1, 610cabdff1aSopenharmony_ci src_stride2, h); 611cabdff1aSopenharmony_ci ff_avg_pixels8_l2_8_mmi(dst + 8, src1 + 8, src2 + 8, dst_stride, 612cabdff1aSopenharmony_ci src_stride1, src_stride2, h); 613cabdff1aSopenharmony_ci} 614cabdff1aSopenharmony_ci 615cabdff1aSopenharmony_civoid ff_put_pixels4_x2_8_mmi(uint8_t *block, const uint8_t *pixels, 616cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 617cabdff1aSopenharmony_ci{ 618cabdff1aSopenharmony_ci ff_put_pixels4_l2_8_mmi(block, pixels, pixels + 1, line_size, line_size, 619cabdff1aSopenharmony_ci line_size, h); 620cabdff1aSopenharmony_ci} 621cabdff1aSopenharmony_ci 622cabdff1aSopenharmony_civoid ff_put_pixels8_x2_8_mmi(uint8_t *block, const uint8_t *pixels, 623cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 624cabdff1aSopenharmony_ci{ 625cabdff1aSopenharmony_ci ff_put_pixels8_l2_8_mmi(block, pixels, pixels + 1, line_size, line_size, 626cabdff1aSopenharmony_ci line_size, h); 627cabdff1aSopenharmony_ci} 628cabdff1aSopenharmony_ci 629cabdff1aSopenharmony_civoid ff_put_pixels16_x2_8_mmi(uint8_t *block, const uint8_t *pixels, 630cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 631cabdff1aSopenharmony_ci{ 632cabdff1aSopenharmony_ci ff_put_pixels16_l2_8_mmi(block, pixels, pixels + 1, line_size, line_size, 633cabdff1aSopenharmony_ci line_size, h); 634cabdff1aSopenharmony_ci} 635cabdff1aSopenharmony_ci 636cabdff1aSopenharmony_civoid ff_avg_pixels4_x2_8_mmi(uint8_t *block, const uint8_t *pixels, 637cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 638cabdff1aSopenharmony_ci{ 639cabdff1aSopenharmony_ci ff_avg_pixels4_l2_8_mmi(block, pixels, pixels + 1, line_size, line_size, 640cabdff1aSopenharmony_ci line_size, h); 641cabdff1aSopenharmony_ci} 642cabdff1aSopenharmony_ci 643cabdff1aSopenharmony_civoid ff_avg_pixels8_x2_8_mmi(uint8_t *block, const uint8_t *pixels, 644cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 645cabdff1aSopenharmony_ci{ 646cabdff1aSopenharmony_ci ff_avg_pixels8_l2_8_mmi(block, pixels, pixels + 1, line_size, line_size, 647cabdff1aSopenharmony_ci line_size, h); 648cabdff1aSopenharmony_ci} 649cabdff1aSopenharmony_ci 650cabdff1aSopenharmony_civoid ff_avg_pixels16_x2_8_mmi(uint8_t *block, const uint8_t *pixels, 651cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 652cabdff1aSopenharmony_ci{ 653cabdff1aSopenharmony_ci ff_avg_pixels8_x2_8_mmi(block, pixels, line_size, h); 654cabdff1aSopenharmony_ci ff_avg_pixels8_x2_8_mmi(block + 8, pixels + 8, line_size, h); 655cabdff1aSopenharmony_ci} 656cabdff1aSopenharmony_ci 657cabdff1aSopenharmony_ciinline void ff_put_no_rnd_pixels8_l2_8_mmi(uint8_t *dst, const uint8_t *src1, 658cabdff1aSopenharmony_ci const uint8_t *src2, int dst_stride, int src_stride1, int src_stride2, 659cabdff1aSopenharmony_ci int h) 660cabdff1aSopenharmony_ci{ 661cabdff1aSopenharmony_ci double ftmp[5]; 662cabdff1aSopenharmony_ci mips_reg addr[5]; 663cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 664cabdff1aSopenharmony_ci DECLARE_VAR_ADDRT; 665cabdff1aSopenharmony_ci 666cabdff1aSopenharmony_ci __asm__ volatile ( 667cabdff1aSopenharmony_ci "pcmpeqb %[ftmp4], %[ftmp4], %[ftmp4] \n\t" 668cabdff1aSopenharmony_ci PTR_ADDU "%[addr2], %[src_stride1], %[src_stride1] \n\t" 669cabdff1aSopenharmony_ci PTR_ADDU "%[addr3], %[src_stride2], %[src_stride2] \n\t" 670cabdff1aSopenharmony_ci PTR_ADDU "%[addr4], %[dst_stride], %[dst_stride] \n\t" 671cabdff1aSopenharmony_ci 672cabdff1aSopenharmony_ci "1: \n\t" 673cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[src1], 0x00) 674cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[src1], %[src_stride1] \n\t" 675cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[addr0], 0x00) 676cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[src2], 0x00) 677cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[src2], %[src_stride2] \n\t" 678cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr1], 0x00) 679cabdff1aSopenharmony_ci PTR_ADDU "%[src1], %[src1], %[addr2] \n\t" 680cabdff1aSopenharmony_ci "pxor %[ftmp0], %[ftmp0], %[ftmp4] \n\t" 681cabdff1aSopenharmony_ci "pxor %[ftmp1], %[ftmp1], %[ftmp4] \n\t" 682cabdff1aSopenharmony_ci "pxor %[ftmp2], %[ftmp2], %[ftmp4] \n\t" 683cabdff1aSopenharmony_ci "pxor %[ftmp3], %[ftmp3], %[ftmp4] \n\t" 684cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 685cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 686cabdff1aSopenharmony_ci "pxor %[ftmp0], %[ftmp0], %[ftmp4] \n\t" 687cabdff1aSopenharmony_ci "pxor %[ftmp1], %[ftmp1], %[ftmp4] \n\t" 688cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[dst], 0x00) 689cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp1], %[dst], %[dst_stride], 0x00) 690cabdff1aSopenharmony_ci PTR_ADDU "%[src2], %[src2], %[addr3] \n\t" 691cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[addr4] \n\t" 692cabdff1aSopenharmony_ci 693cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[src1], 0x00) 694cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[src1], %[src_stride1] \n\t" 695cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp1], %[addr0], 0x00) 696cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[src2], 0x00) 697cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[src2], %[src_stride2] \n\t" 698cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp3], %[addr1], 0x00) 699cabdff1aSopenharmony_ci PTR_ADDU "%[src1], %[src1], %[addr2] \n\t" 700cabdff1aSopenharmony_ci "pxor %[ftmp0], %[ftmp0], %[ftmp4] \n\t" 701cabdff1aSopenharmony_ci "pxor %[ftmp1], %[ftmp1], %[ftmp4] \n\t" 702cabdff1aSopenharmony_ci "pxor %[ftmp2], %[ftmp2], %[ftmp4] \n\t" 703cabdff1aSopenharmony_ci "pxor %[ftmp3], %[ftmp3], %[ftmp4] \n\t" 704cabdff1aSopenharmony_ci "pavgb %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 705cabdff1aSopenharmony_ci "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 706cabdff1aSopenharmony_ci "pxor %[ftmp0], %[ftmp0], %[ftmp4] \n\t" 707cabdff1aSopenharmony_ci "pxor %[ftmp1], %[ftmp1], %[ftmp4] \n\t" 708cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[dst], 0x00) 709cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp1], %[dst], %[dst_stride], 0x00) 710cabdff1aSopenharmony_ci PTR_ADDU "%[src2], %[src2], %[addr3] \n\t" 711cabdff1aSopenharmony_ci PTR_ADDU "%[dst], %[dst], %[addr4] \n\t" 712cabdff1aSopenharmony_ci 713cabdff1aSopenharmony_ci PTR_ADDI "%[h], %[h], -0x04 \n\t" 714cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 715cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 716cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 717cabdff1aSopenharmony_ci [ftmp4]"=&f"(ftmp[4]), 718cabdff1aSopenharmony_ci RESTRICT_ASM_ALL64 719cabdff1aSopenharmony_ci RESTRICT_ASM_ADDRT 720cabdff1aSopenharmony_ci [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]), 721cabdff1aSopenharmony_ci [addr2]"=&r"(addr[2]), [addr3]"=&r"(addr[3]), 722cabdff1aSopenharmony_ci [addr4]"=&r"(addr[4]), 723cabdff1aSopenharmony_ci [dst]"+&r"(dst), [src1]"+&r"(src1), 724cabdff1aSopenharmony_ci [src2]"+&r"(src2), [h]"+&r"(h) 725cabdff1aSopenharmony_ci : [dst_stride]"r"((mips_reg)dst_stride), 726cabdff1aSopenharmony_ci [src_stride1]"r"((mips_reg)src_stride1), 727cabdff1aSopenharmony_ci [src_stride2]"r"((mips_reg)src_stride2) 728cabdff1aSopenharmony_ci : "memory" 729cabdff1aSopenharmony_ci ); 730cabdff1aSopenharmony_ci} 731cabdff1aSopenharmony_ci 732cabdff1aSopenharmony_civoid ff_put_no_rnd_pixels8_x2_8_mmi(uint8_t *block, const uint8_t *pixels, 733cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 734cabdff1aSopenharmony_ci{ 735cabdff1aSopenharmony_ci ff_put_no_rnd_pixels8_l2_8_mmi(block, pixels, pixels + 1, line_size, 736cabdff1aSopenharmony_ci line_size, line_size, h); 737cabdff1aSopenharmony_ci} 738cabdff1aSopenharmony_ci 739cabdff1aSopenharmony_civoid ff_put_no_rnd_pixels16_x2_8_mmi(uint8_t *block, const uint8_t *pixels, 740cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 741cabdff1aSopenharmony_ci{ 742cabdff1aSopenharmony_ci ff_put_no_rnd_pixels8_x2_8_mmi(block, pixels, line_size, h); 743cabdff1aSopenharmony_ci ff_put_no_rnd_pixels8_x2_8_mmi(block + 8, pixels + 8, line_size, h); 744cabdff1aSopenharmony_ci} 745cabdff1aSopenharmony_ci 746cabdff1aSopenharmony_civoid ff_put_pixels4_y2_8_mmi(uint8_t *block, const uint8_t *pixels, 747cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 748cabdff1aSopenharmony_ci{ 749cabdff1aSopenharmony_ci ff_put_pixels4_l2_8_mmi(block, pixels, pixels + line_size, line_size, 750cabdff1aSopenharmony_ci line_size, line_size, h); 751cabdff1aSopenharmony_ci} 752cabdff1aSopenharmony_ci 753cabdff1aSopenharmony_civoid ff_put_pixels8_y2_8_mmi(uint8_t *block, const uint8_t *pixels, 754cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 755cabdff1aSopenharmony_ci{ 756cabdff1aSopenharmony_ci ff_put_pixels8_l2_8_mmi(block, pixels, pixels + line_size, line_size, 757cabdff1aSopenharmony_ci line_size, line_size, h); 758cabdff1aSopenharmony_ci} 759cabdff1aSopenharmony_ci 760cabdff1aSopenharmony_civoid ff_put_pixels16_y2_8_mmi(uint8_t *block, const uint8_t *pixels, 761cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 762cabdff1aSopenharmony_ci{ 763cabdff1aSopenharmony_ci ff_put_pixels16_l2_8_mmi(block, pixels, pixels + line_size, line_size, 764cabdff1aSopenharmony_ci line_size, line_size, h); 765cabdff1aSopenharmony_ci} 766cabdff1aSopenharmony_ci 767cabdff1aSopenharmony_civoid ff_avg_pixels4_y2_8_mmi(uint8_t *block, const uint8_t *pixels, 768cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 769cabdff1aSopenharmony_ci{ 770cabdff1aSopenharmony_ci ff_avg_pixels4_l2_8_mmi(block, pixels, pixels + line_size, line_size, 771cabdff1aSopenharmony_ci line_size, line_size, h); 772cabdff1aSopenharmony_ci} 773cabdff1aSopenharmony_ci 774cabdff1aSopenharmony_civoid ff_avg_pixels8_y2_8_mmi(uint8_t *block, const uint8_t *pixels, 775cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 776cabdff1aSopenharmony_ci{ 777cabdff1aSopenharmony_ci ff_avg_pixels8_l2_8_mmi(block, pixels, pixels + line_size, line_size, 778cabdff1aSopenharmony_ci line_size, line_size, h); 779cabdff1aSopenharmony_ci} 780cabdff1aSopenharmony_ci 781cabdff1aSopenharmony_civoid ff_avg_pixels16_y2_8_mmi(uint8_t *block, const uint8_t *pixels, 782cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 783cabdff1aSopenharmony_ci{ 784cabdff1aSopenharmony_ci ff_avg_pixels8_y2_8_mmi(block, pixels, line_size, h); 785cabdff1aSopenharmony_ci ff_avg_pixels8_y2_8_mmi(block + 8, pixels + 8, line_size, h); 786cabdff1aSopenharmony_ci} 787cabdff1aSopenharmony_ci 788cabdff1aSopenharmony_civoid ff_put_no_rnd_pixels8_y2_8_mmi(uint8_t *block, const uint8_t *pixels, 789cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 790cabdff1aSopenharmony_ci{ 791cabdff1aSopenharmony_ci ff_put_no_rnd_pixels8_l2_8_mmi(block, pixels, pixels + line_size, 792cabdff1aSopenharmony_ci line_size, line_size, line_size, h); 793cabdff1aSopenharmony_ci} 794cabdff1aSopenharmony_ci 795cabdff1aSopenharmony_civoid ff_put_no_rnd_pixels16_y2_8_mmi(uint8_t *block, const uint8_t *pixels, 796cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 797cabdff1aSopenharmony_ci{ 798cabdff1aSopenharmony_ci ff_put_no_rnd_pixels8_y2_8_mmi(block, pixels, line_size, h); 799cabdff1aSopenharmony_ci ff_put_no_rnd_pixels8_y2_8_mmi(block + 8 , pixels + 8, line_size, h); 800cabdff1aSopenharmony_ci} 801cabdff1aSopenharmony_ci 802cabdff1aSopenharmony_civoid ff_put_pixels4_xy2_8_mmi(uint8_t *block, const uint8_t *pixels, 803cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 804cabdff1aSopenharmony_ci{ 805cabdff1aSopenharmony_ci /* FIXME HIGH BIT DEPTH */ 806cabdff1aSopenharmony_ci int i; 807cabdff1aSopenharmony_ci const uint32_t a = AV_RN32(pixels); 808cabdff1aSopenharmony_ci const uint32_t b = AV_RN32(pixels + 1); 809cabdff1aSopenharmony_ci uint32_t l0 = (a & 0x03030303UL) + 810cabdff1aSopenharmony_ci (b & 0x03030303UL) + 811cabdff1aSopenharmony_ci 0x02020202UL; 812cabdff1aSopenharmony_ci uint32_t h0 = ((a & 0xFCFCFCFCUL) >> 2) + 813cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 814cabdff1aSopenharmony_ci uint32_t l1, h1; 815cabdff1aSopenharmony_ci 816cabdff1aSopenharmony_ci pixels += line_size; 817cabdff1aSopenharmony_ci for (i = 0; i < h; i += 2) { 818cabdff1aSopenharmony_ci uint32_t a = AV_RN32(pixels); 819cabdff1aSopenharmony_ci uint32_t b = AV_RN32(pixels + 1); 820cabdff1aSopenharmony_ci l1 = (a & 0x03030303UL) + 821cabdff1aSopenharmony_ci (b & 0x03030303UL); 822cabdff1aSopenharmony_ci h1 = ((a & 0xFCFCFCFCUL) >> 2) + 823cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 824cabdff1aSopenharmony_ci *((uint32_t *) block) = h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL); 825cabdff1aSopenharmony_ci pixels += line_size; 826cabdff1aSopenharmony_ci block += line_size; 827cabdff1aSopenharmony_ci a = AV_RN32(pixels); 828cabdff1aSopenharmony_ci b = AV_RN32(pixels + 1); 829cabdff1aSopenharmony_ci l0 = (a & 0x03030303UL) + 830cabdff1aSopenharmony_ci (b & 0x03030303UL) + 831cabdff1aSopenharmony_ci 0x02020202UL; 832cabdff1aSopenharmony_ci h0 = ((a & 0xFCFCFCFCUL) >> 2) + 833cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 834cabdff1aSopenharmony_ci *((uint32_t *) block) = h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL); 835cabdff1aSopenharmony_ci pixels += line_size; 836cabdff1aSopenharmony_ci block += line_size; 837cabdff1aSopenharmony_ci } 838cabdff1aSopenharmony_ci} 839cabdff1aSopenharmony_ci 840cabdff1aSopenharmony_civoid ff_put_pixels8_xy2_8_mmi(uint8_t *block, const uint8_t *pixels, 841cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 842cabdff1aSopenharmony_ci{ 843cabdff1aSopenharmony_ci#if 1 844cabdff1aSopenharmony_ci double ftmp[10]; 845cabdff1aSopenharmony_ci mips_reg addr[2]; 846cabdff1aSopenharmony_ci DECLARE_VAR_ALL64; 847cabdff1aSopenharmony_ci DECLARE_VAR_ADDRT; 848cabdff1aSopenharmony_ci 849cabdff1aSopenharmony_ci __asm__ volatile ( 850cabdff1aSopenharmony_ci "pxor %[ftmp7], %[ftmp7], %[ftmp7] \n\t" 851cabdff1aSopenharmony_ci "dli %[addr0], 0x0f \n\t" 852cabdff1aSopenharmony_ci "pcmpeqw %[ftmp6], %[ftmp6], %[ftmp6] \n\t" 853cabdff1aSopenharmony_ci "dmtc1 %[addr0], %[ftmp8] \n\t" 854cabdff1aSopenharmony_ci "dli %[addr0], 0x01 \n\t" 855cabdff1aSopenharmony_ci "psrlh %[ftmp6], %[ftmp6], %[ftmp8] \n\t" 856cabdff1aSopenharmony_ci "dmtc1 %[addr0], %[ftmp8] \n\t" 857cabdff1aSopenharmony_ci "psllh %[ftmp6], %[ftmp6], %[ftmp8] \n\t" 858cabdff1aSopenharmony_ci 859cabdff1aSopenharmony_ci "dli %[addr0], 0x02 \n\t" 860cabdff1aSopenharmony_ci "dmtc1 %[addr0], %[ftmp9] \n\t" 861cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[pixels], 0x00) 862cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[pixels], 0x01) 863cabdff1aSopenharmony_ci "mov.d %[ftmp1], %[ftmp0] \n\t" 864cabdff1aSopenharmony_ci "mov.d %[ftmp5], %[ftmp4] \n\t" 865cabdff1aSopenharmony_ci "punpcklbh %[ftmp0], %[ftmp0], %[ftmp7] \n\t" 866cabdff1aSopenharmony_ci "punpcklbh %[ftmp4], %[ftmp4], %[ftmp7] \n\t" 867cabdff1aSopenharmony_ci "punpckhbh %[ftmp1], %[ftmp1], %[ftmp7] \n\t" 868cabdff1aSopenharmony_ci "punpckhbh %[ftmp5], %[ftmp5], %[ftmp7] \n\t" 869cabdff1aSopenharmony_ci "paddush %[ftmp4], %[ftmp4], %[ftmp0] \n\t" 870cabdff1aSopenharmony_ci "paddush %[ftmp5], %[ftmp5], %[ftmp1] \n\t" 871cabdff1aSopenharmony_ci "xor %[addr0], %[addr0], %[addr0] \n\t" 872cabdff1aSopenharmony_ci PTR_ADDU "%[pixels], %[pixels], %[line_size] \n\t" 873cabdff1aSopenharmony_ci ".p2align 3 \n\t" 874cabdff1aSopenharmony_ci 875cabdff1aSopenharmony_ci "1: \n\t" 876cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[pixels], %[addr0] \n\t" 877cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp0], %[addr1], 0x00) 878cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[addr1], 0x01) 879cabdff1aSopenharmony_ci "mov.d %[ftmp1], %[ftmp0] \n\t" 880cabdff1aSopenharmony_ci "mov.d %[ftmp3], %[ftmp2] \n\t" 881cabdff1aSopenharmony_ci "punpcklbh %[ftmp0], %[ftmp0], %[ftmp7] \n\t" 882cabdff1aSopenharmony_ci "punpcklbh %[ftmp2], %[ftmp2], %[ftmp7] \n\t" 883cabdff1aSopenharmony_ci "punpckhbh %[ftmp1], %[ftmp1], %[ftmp7] \n\t" 884cabdff1aSopenharmony_ci "punpckhbh %[ftmp3], %[ftmp3], %[ftmp7] \n\t" 885cabdff1aSopenharmony_ci "paddush %[ftmp0], %[ftmp0], %[ftmp2] \n\t" 886cabdff1aSopenharmony_ci "paddush %[ftmp1], %[ftmp1], %[ftmp3] \n\t" 887cabdff1aSopenharmony_ci "paddush %[ftmp4], %[ftmp4], %[ftmp6] \n\t" 888cabdff1aSopenharmony_ci "paddush %[ftmp5], %[ftmp5], %[ftmp6] \n\t" 889cabdff1aSopenharmony_ci "paddush %[ftmp4], %[ftmp4], %[ftmp0] \n\t" 890cabdff1aSopenharmony_ci "paddush %[ftmp5], %[ftmp5], %[ftmp1] \n\t" 891cabdff1aSopenharmony_ci "psrlh %[ftmp4], %[ftmp4], %[ftmp9] \n\t" 892cabdff1aSopenharmony_ci "psrlh %[ftmp5], %[ftmp5], %[ftmp9] \n\t" 893cabdff1aSopenharmony_ci "packushb %[ftmp4], %[ftmp4], %[ftmp5] \n\t" 894cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp4], %[block], %[addr0], 0x00) 895cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[addr0], %[line_size] \n\t" 896cabdff1aSopenharmony_ci PTR_ADDU "%[addr1], %[pixels], %[addr0] \n\t" 897cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp2], %[addr1], 0x00) 898cabdff1aSopenharmony_ci MMI_ULDC1(%[ftmp4], %[addr1], 0x01) 899cabdff1aSopenharmony_ci "mov.d %[ftmp3], %[ftmp2] \n\t" 900cabdff1aSopenharmony_ci "mov.d %[ftmp5], %[ftmp4] \n\t" 901cabdff1aSopenharmony_ci "punpcklbh %[ftmp2], %[ftmp2], %[ftmp7] \n\t" 902cabdff1aSopenharmony_ci "punpcklbh %[ftmp4], %[ftmp4], %[ftmp7] \n\t" 903cabdff1aSopenharmony_ci "punpckhbh %[ftmp3], %[ftmp3], %[ftmp7] \n\t" 904cabdff1aSopenharmony_ci "punpckhbh %[ftmp5], %[ftmp5], %[ftmp7] \n\t" 905cabdff1aSopenharmony_ci "paddush %[ftmp4], %[ftmp4], %[ftmp2] \n\t" 906cabdff1aSopenharmony_ci "paddush %[ftmp5], %[ftmp5], %[ftmp3] \n\t" 907cabdff1aSopenharmony_ci "paddush %[ftmp0], %[ftmp0], %[ftmp6] \n\t" 908cabdff1aSopenharmony_ci "paddush %[ftmp1], %[ftmp1], %[ftmp6] \n\t" 909cabdff1aSopenharmony_ci "paddush %[ftmp0], %[ftmp0], %[ftmp4] \n\t" 910cabdff1aSopenharmony_ci "paddush %[ftmp1], %[ftmp1], %[ftmp5] \n\t" 911cabdff1aSopenharmony_ci "psrlh %[ftmp0], %[ftmp0], %[ftmp9] \n\t" 912cabdff1aSopenharmony_ci "psrlh %[ftmp1], %[ftmp1], %[ftmp9] \n\t" 913cabdff1aSopenharmony_ci "packushb %[ftmp0], %[ftmp0], %[ftmp1] \n\t" 914cabdff1aSopenharmony_ci MMI_SDXC1(%[ftmp0], %[block], %[addr0], 0x00) 915cabdff1aSopenharmony_ci PTR_ADDU "%[addr0], %[addr0], %[line_size] \n\t" 916cabdff1aSopenharmony_ci PTR_ADDU "%[h], %[h], -0x02 \n\t" 917cabdff1aSopenharmony_ci "bnez %[h], 1b \n\t" 918cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 919cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 920cabdff1aSopenharmony_ci [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]), 921cabdff1aSopenharmony_ci [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), 922cabdff1aSopenharmony_ci [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]), 923cabdff1aSopenharmony_ci RESTRICT_ASM_ALL64 924cabdff1aSopenharmony_ci RESTRICT_ASM_ADDRT 925cabdff1aSopenharmony_ci [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]), 926cabdff1aSopenharmony_ci [h]"+&r"(h), [pixels]"+&r"(pixels) 927cabdff1aSopenharmony_ci : [block]"r"(block), [line_size]"r"((mips_reg)line_size) 928cabdff1aSopenharmony_ci : "memory" 929cabdff1aSopenharmony_ci ); 930cabdff1aSopenharmony_ci#else 931cabdff1aSopenharmony_ci /* FIXME HIGH BIT DEPTH */ 932cabdff1aSopenharmony_ci int j; 933cabdff1aSopenharmony_ci 934cabdff1aSopenharmony_ci for (j = 0; j < 2; j++) { 935cabdff1aSopenharmony_ci int i; 936cabdff1aSopenharmony_ci const uint32_t a = AV_RN32(pixels); 937cabdff1aSopenharmony_ci const uint32_t b = AV_RN32(pixels + 1); 938cabdff1aSopenharmony_ci uint32_t l0 = (a & 0x03030303UL) + 939cabdff1aSopenharmony_ci (b & 0x03030303UL) + 940cabdff1aSopenharmony_ci 0x02020202UL; 941cabdff1aSopenharmony_ci uint32_t h0 = ((a & 0xFCFCFCFCUL) >> 2) + 942cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 943cabdff1aSopenharmony_ci uint32_t l1, h1; 944cabdff1aSopenharmony_ci 945cabdff1aSopenharmony_ci pixels += line_size; 946cabdff1aSopenharmony_ci for (i = 0; i < h; i += 2) { 947cabdff1aSopenharmony_ci uint32_t a = AV_RN32(pixels); 948cabdff1aSopenharmony_ci uint32_t b = AV_RN32(pixels + 1); 949cabdff1aSopenharmony_ci l1 = (a & 0x03030303UL) + 950cabdff1aSopenharmony_ci (b & 0x03030303UL); 951cabdff1aSopenharmony_ci h1 = ((a & 0xFCFCFCFCUL) >> 2) + 952cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 953cabdff1aSopenharmony_ci *((uint32_t *) block) = h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL); 954cabdff1aSopenharmony_ci pixels += line_size; 955cabdff1aSopenharmony_ci block += line_size; 956cabdff1aSopenharmony_ci a = AV_RN32(pixels); 957cabdff1aSopenharmony_ci b = AV_RN32(pixels + 1); 958cabdff1aSopenharmony_ci l0 = (a & 0x03030303UL) + 959cabdff1aSopenharmony_ci (b & 0x03030303UL) + 960cabdff1aSopenharmony_ci 0x02020202UL; 961cabdff1aSopenharmony_ci h0 = ((a & 0xFCFCFCFCUL) >> 2) + 962cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 963cabdff1aSopenharmony_ci *((uint32_t *) block) = h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL); 964cabdff1aSopenharmony_ci pixels += line_size; 965cabdff1aSopenharmony_ci block += line_size; 966cabdff1aSopenharmony_ci } 967cabdff1aSopenharmony_ci pixels += 4 - line_size * (h + 1); 968cabdff1aSopenharmony_ci block += 4 - line_size * h; 969cabdff1aSopenharmony_ci } 970cabdff1aSopenharmony_ci#endif 971cabdff1aSopenharmony_ci} 972cabdff1aSopenharmony_ci 973cabdff1aSopenharmony_civoid ff_put_pixels16_xy2_8_mmi(uint8_t *block, const uint8_t *pixels, 974cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 975cabdff1aSopenharmony_ci{ 976cabdff1aSopenharmony_ci ff_put_pixels8_xy2_8_mmi(block, pixels, line_size, h); 977cabdff1aSopenharmony_ci ff_put_pixels8_xy2_8_mmi(block + 8, pixels + 8, line_size, h); 978cabdff1aSopenharmony_ci} 979cabdff1aSopenharmony_ci 980cabdff1aSopenharmony_civoid ff_avg_pixels4_xy2_8_mmi(uint8_t *block, const uint8_t *pixels, 981cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 982cabdff1aSopenharmony_ci{ 983cabdff1aSopenharmony_ci /* FIXME HIGH BIT DEPTH */ 984cabdff1aSopenharmony_ci int i; 985cabdff1aSopenharmony_ci const uint32_t a = AV_RN32(pixels); 986cabdff1aSopenharmony_ci const uint32_t b = AV_RN32(pixels + 1); 987cabdff1aSopenharmony_ci uint32_t l0 = (a & 0x03030303UL) + 988cabdff1aSopenharmony_ci (b & 0x03030303UL) + 989cabdff1aSopenharmony_ci 0x02020202UL; 990cabdff1aSopenharmony_ci uint32_t h0 = ((a & 0xFCFCFCFCUL) >> 2) + 991cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 992cabdff1aSopenharmony_ci uint32_t l1, h1; 993cabdff1aSopenharmony_ci 994cabdff1aSopenharmony_ci pixels += line_size; 995cabdff1aSopenharmony_ci for (i = 0; i < h; i += 2) { 996cabdff1aSopenharmony_ci uint32_t a = AV_RN32(pixels); 997cabdff1aSopenharmony_ci uint32_t b = AV_RN32(pixels + 1); 998cabdff1aSopenharmony_ci l1 = (a & 0x03030303UL) + 999cabdff1aSopenharmony_ci (b & 0x03030303UL); 1000cabdff1aSopenharmony_ci h1 = ((a & 0xFCFCFCFCUL) >> 2) + 1001cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 1002cabdff1aSopenharmony_ci *((uint32_t *) block) = rnd_avg32(*((uint32_t *) block), h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL)); 1003cabdff1aSopenharmony_ci pixels += line_size; 1004cabdff1aSopenharmony_ci block += line_size; 1005cabdff1aSopenharmony_ci a = AV_RN32(pixels); 1006cabdff1aSopenharmony_ci b = AV_RN32(pixels + 1); 1007cabdff1aSopenharmony_ci l0 = (a & 0x03030303UL) + 1008cabdff1aSopenharmony_ci (b & 0x03030303UL) + 1009cabdff1aSopenharmony_ci 0x02020202UL; 1010cabdff1aSopenharmony_ci h0 = ((a & 0xFCFCFCFCUL) >> 2) + 1011cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 1012cabdff1aSopenharmony_ci *((uint32_t *) block) = rnd_avg32(*((uint32_t *) block), h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL)); 1013cabdff1aSopenharmony_ci pixels += line_size; 1014cabdff1aSopenharmony_ci block += line_size; 1015cabdff1aSopenharmony_ci } 1016cabdff1aSopenharmony_ci} 1017cabdff1aSopenharmony_ci 1018cabdff1aSopenharmony_civoid ff_avg_pixels8_xy2_8_mmi(uint8_t *block, const uint8_t *pixels, 1019cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 1020cabdff1aSopenharmony_ci{ 1021cabdff1aSopenharmony_ci /* FIXME HIGH BIT DEPTH */ 1022cabdff1aSopenharmony_ci int j; 1023cabdff1aSopenharmony_ci 1024cabdff1aSopenharmony_ci for (j = 0; j < 2; j++) { 1025cabdff1aSopenharmony_ci int i; 1026cabdff1aSopenharmony_ci const uint32_t a = AV_RN32(pixels); 1027cabdff1aSopenharmony_ci const uint32_t b = AV_RN32(pixels + 1); 1028cabdff1aSopenharmony_ci uint32_t l0 = (a & 0x03030303UL) + 1029cabdff1aSopenharmony_ci (b & 0x03030303UL) + 1030cabdff1aSopenharmony_ci 0x02020202UL; 1031cabdff1aSopenharmony_ci uint32_t h0 = ((a & 0xFCFCFCFCUL) >> 2) + 1032cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 1033cabdff1aSopenharmony_ci uint32_t l1, h1; 1034cabdff1aSopenharmony_ci 1035cabdff1aSopenharmony_ci pixels += line_size; 1036cabdff1aSopenharmony_ci for (i = 0; i < h; i += 2) { 1037cabdff1aSopenharmony_ci uint32_t a = AV_RN32(pixels); 1038cabdff1aSopenharmony_ci uint32_t b = AV_RN32(pixels + 1); 1039cabdff1aSopenharmony_ci l1 = (a & 0x03030303UL) + 1040cabdff1aSopenharmony_ci (b & 0x03030303UL); 1041cabdff1aSopenharmony_ci h1 = ((a & 0xFCFCFCFCUL) >> 2) + 1042cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 1043cabdff1aSopenharmony_ci *((uint32_t *) block) = rnd_avg32(*((uint32_t *) block), h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL)); 1044cabdff1aSopenharmony_ci pixels += line_size; 1045cabdff1aSopenharmony_ci block += line_size; 1046cabdff1aSopenharmony_ci a = AV_RN32(pixels); 1047cabdff1aSopenharmony_ci b = AV_RN32(pixels + 1); 1048cabdff1aSopenharmony_ci l0 = (a & 0x03030303UL) + 1049cabdff1aSopenharmony_ci (b & 0x03030303UL) + 1050cabdff1aSopenharmony_ci 0x02020202UL; 1051cabdff1aSopenharmony_ci h0 = ((a & 0xFCFCFCFCUL) >> 2) + 1052cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 1053cabdff1aSopenharmony_ci *((uint32_t *) block) = rnd_avg32(*((uint32_t *) block), h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL)); 1054cabdff1aSopenharmony_ci pixels += line_size; 1055cabdff1aSopenharmony_ci block += line_size; 1056cabdff1aSopenharmony_ci } 1057cabdff1aSopenharmony_ci pixels += 4 - line_size * (h + 1); 1058cabdff1aSopenharmony_ci block += 4 - line_size * h; 1059cabdff1aSopenharmony_ci } 1060cabdff1aSopenharmony_ci} 1061cabdff1aSopenharmony_ci 1062cabdff1aSopenharmony_civoid ff_avg_pixels16_xy2_8_mmi(uint8_t *block, const uint8_t *pixels, 1063cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 1064cabdff1aSopenharmony_ci{ 1065cabdff1aSopenharmony_ci ff_avg_pixels8_xy2_8_mmi(block, pixels, line_size, h); 1066cabdff1aSopenharmony_ci ff_avg_pixels8_xy2_8_mmi(block + 8, pixels + 8, line_size, h); 1067cabdff1aSopenharmony_ci} 1068cabdff1aSopenharmony_ci 1069cabdff1aSopenharmony_civoid ff_put_no_rnd_pixels8_xy2_8_mmi(uint8_t *block, const uint8_t *pixels, 1070cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 1071cabdff1aSopenharmony_ci{ 1072cabdff1aSopenharmony_ci /* FIXME HIGH BIT DEPTH */ 1073cabdff1aSopenharmony_ci int j; 1074cabdff1aSopenharmony_ci 1075cabdff1aSopenharmony_ci for (j = 0; j < 2; j++) { 1076cabdff1aSopenharmony_ci int i; 1077cabdff1aSopenharmony_ci const uint32_t a = AV_RN32(pixels); 1078cabdff1aSopenharmony_ci const uint32_t b = AV_RN32(pixels + 1); 1079cabdff1aSopenharmony_ci uint32_t l0 = (a & 0x03030303UL) + 1080cabdff1aSopenharmony_ci (b & 0x03030303UL) + 1081cabdff1aSopenharmony_ci 0x01010101UL; 1082cabdff1aSopenharmony_ci uint32_t h0 = ((a & 0xFCFCFCFCUL) >> 2) + 1083cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 1084cabdff1aSopenharmony_ci uint32_t l1, h1; 1085cabdff1aSopenharmony_ci 1086cabdff1aSopenharmony_ci pixels += line_size; 1087cabdff1aSopenharmony_ci for (i = 0; i < h; i += 2) { 1088cabdff1aSopenharmony_ci uint32_t a = AV_RN32(pixels); 1089cabdff1aSopenharmony_ci uint32_t b = AV_RN32(pixels + 1); 1090cabdff1aSopenharmony_ci l1 = (a & 0x03030303UL) + 1091cabdff1aSopenharmony_ci (b & 0x03030303UL); 1092cabdff1aSopenharmony_ci h1 = ((a & 0xFCFCFCFCUL) >> 2) + 1093cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 1094cabdff1aSopenharmony_ci *((uint32_t *) block) = h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL); 1095cabdff1aSopenharmony_ci pixels += line_size; 1096cabdff1aSopenharmony_ci block += line_size; 1097cabdff1aSopenharmony_ci a = AV_RN32(pixels); 1098cabdff1aSopenharmony_ci b = AV_RN32(pixels + 1); 1099cabdff1aSopenharmony_ci l0 = (a & 0x03030303UL) + 1100cabdff1aSopenharmony_ci (b & 0x03030303UL) + 1101cabdff1aSopenharmony_ci 0x01010101UL; 1102cabdff1aSopenharmony_ci h0 = ((a & 0xFCFCFCFCUL) >> 2) + 1103cabdff1aSopenharmony_ci ((b & 0xFCFCFCFCUL) >> 2); 1104cabdff1aSopenharmony_ci *((uint32_t *) block) = h0 + h1 + (((l0 + l1) >> 2) & 0x0F0F0F0FUL); 1105cabdff1aSopenharmony_ci pixels += line_size; 1106cabdff1aSopenharmony_ci block += line_size; 1107cabdff1aSopenharmony_ci } 1108cabdff1aSopenharmony_ci pixels += 4 - line_size * (h + 1); 1109cabdff1aSopenharmony_ci block += 4 - line_size * h; 1110cabdff1aSopenharmony_ci } 1111cabdff1aSopenharmony_ci} 1112cabdff1aSopenharmony_ci 1113cabdff1aSopenharmony_civoid ff_put_no_rnd_pixels16_xy2_8_mmi(uint8_t *block, const uint8_t *pixels, 1114cabdff1aSopenharmony_ci ptrdiff_t line_size, int h) 1115cabdff1aSopenharmony_ci{ 1116cabdff1aSopenharmony_ci ff_put_no_rnd_pixels8_xy2_8_mmi(block, pixels, line_size, h); 1117cabdff1aSopenharmony_ci ff_put_no_rnd_pixels8_xy2_8_mmi(block + 8, pixels + 8, line_size, h); 1118cabdff1aSopenharmony_ci} 1119