1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * WMV2 - DSP functions Loongson MMI-optimized 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (c) 2016 Zhou Xiaoyong <zhouxiaoyong@loongson.cn> 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 24cabdff1aSopenharmony_ci#include "constants.h" 25cabdff1aSopenharmony_ci#include "wmv2dsp_mips.h" 26cabdff1aSopenharmony_ci#include "libavutil/mips/mmiutils.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#define W0 2048 29cabdff1aSopenharmony_ci#define W1 2841 /* 2048*sqrt (2)*cos (1*pi/16) */ 30cabdff1aSopenharmony_ci#define W2 2676 /* 2048*sqrt (2)*cos (2*pi/16) */ 31cabdff1aSopenharmony_ci#define W3 2408 /* 2048*sqrt (2)*cos (3*pi/16) */ 32cabdff1aSopenharmony_ci#define W4 2048 /* 2048*sqrt (2)*cos (4*pi/16) */ 33cabdff1aSopenharmony_ci#define W5 1609 /* 2048*sqrt (2)*cos (5*pi/16) */ 34cabdff1aSopenharmony_ci#define W6 1108 /* 2048*sqrt (2)*cos (6*pi/16) */ 35cabdff1aSopenharmony_ci#define W7 565 /* 2048*sqrt (2)*cos (7*pi/16) */ 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_cistatic void wmv2_idct_row_mmi(short * b) 38cabdff1aSopenharmony_ci{ 39cabdff1aSopenharmony_ci int s1, s2; 40cabdff1aSopenharmony_ci int a0, a1, a2, a3, a4, a5, a6, a7; 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci /* step 1 */ 43cabdff1aSopenharmony_ci a0 = W0 * b[0] + W0 * b[4]; 44cabdff1aSopenharmony_ci a1 = W1 * b[1] + W7 * b[7]; 45cabdff1aSopenharmony_ci a2 = W2 * b[2] + W6 * b[6]; 46cabdff1aSopenharmony_ci a3 = W3 * b[5] - W5 * b[3]; 47cabdff1aSopenharmony_ci a4 = W0 * b[0] - W0 * b[4]; 48cabdff1aSopenharmony_ci a5 = W5 * b[5] + W3 * b[3]; 49cabdff1aSopenharmony_ci a6 = W6 * b[2] - W2 * b[6]; 50cabdff1aSopenharmony_ci a7 = W7 * b[1] - W1 * b[7]; 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_ci /* step 2 */ 53cabdff1aSopenharmony_ci s1 = (181 * (a1 - a5 + a7 - a3) + 128) >> 8; // 1, 3, 5, 7 54cabdff1aSopenharmony_ci s2 = (181 * (a1 - a5 - a7 + a3) + 128) >> 8; 55cabdff1aSopenharmony_ci 56cabdff1aSopenharmony_ci /* step 3 */ 57cabdff1aSopenharmony_ci b[0] = (a0 + a2 + a1 + a5 + 128) >> 8; 58cabdff1aSopenharmony_ci b[1] = (a4 + a6 + s1 + 128) >> 8; 59cabdff1aSopenharmony_ci b[2] = (a4 - a6 + s2 + 128) >> 8; 60cabdff1aSopenharmony_ci b[3] = (a0 - a2 + a7 + a3 + 128) >> 8; 61cabdff1aSopenharmony_ci b[4] = (a0 - a2 - a7 - a3 + 128) >> 8; 62cabdff1aSopenharmony_ci b[5] = (a4 - a6 - s2 + 128) >> 8; 63cabdff1aSopenharmony_ci b[6] = (a4 + a6 - s1 + 128) >> 8; 64cabdff1aSopenharmony_ci b[7] = (a0 + a2 - a1 - a5 + 128) >> 8; 65cabdff1aSopenharmony_ci} 66cabdff1aSopenharmony_ci 67cabdff1aSopenharmony_cistatic void wmv2_idct_col_mmi(short * b) 68cabdff1aSopenharmony_ci{ 69cabdff1aSopenharmony_ci int s1, s2; 70cabdff1aSopenharmony_ci int a0, a1, a2, a3, a4, a5, a6, a7; 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci /* step 1, with extended precision */ 73cabdff1aSopenharmony_ci a0 = (W0 * b[ 0] + W0 * b[32] ) >> 3; 74cabdff1aSopenharmony_ci a1 = (W1 * b[ 8] + W7 * b[56] + 4) >> 3; 75cabdff1aSopenharmony_ci a2 = (W2 * b[16] + W6 * b[48] + 4) >> 3; 76cabdff1aSopenharmony_ci a3 = (W3 * b[40] - W5 * b[24] + 4) >> 3; 77cabdff1aSopenharmony_ci a4 = (W0 * b[ 0] - W0 * b[32] ) >> 3; 78cabdff1aSopenharmony_ci a5 = (W5 * b[40] + W3 * b[24] + 4) >> 3; 79cabdff1aSopenharmony_ci a6 = (W6 * b[16] - W2 * b[48] + 4) >> 3; 80cabdff1aSopenharmony_ci a7 = (W7 * b[ 8] - W1 * b[56] + 4) >> 3; 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci /* step 2 */ 83cabdff1aSopenharmony_ci s1 = (181 * (a1 - a5 + a7 - a3) + 128) >> 8; 84cabdff1aSopenharmony_ci s2 = (181 * (a1 - a5 - a7 + a3) + 128) >> 8; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_ci /* step 3 */ 87cabdff1aSopenharmony_ci b[ 0] = (a0 + a2 + a1 + a5 + 8192) >> 14; 88cabdff1aSopenharmony_ci b[ 8] = (a4 + a6 + s1 + 8192) >> 14; 89cabdff1aSopenharmony_ci b[16] = (a4 - a6 + s2 + 8192) >> 14; 90cabdff1aSopenharmony_ci b[24] = (a0 - a2 + a7 + a3 + 8192) >> 14; 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci b[32] = (a0 - a2 - a7 - a3 + 8192) >> 14; 93cabdff1aSopenharmony_ci b[40] = (a4 - a6 - s2 + 8192) >> 14; 94cabdff1aSopenharmony_ci b[48] = (a4 + a6 - s1 + 8192) >> 14; 95cabdff1aSopenharmony_ci b[56] = (a0 + a2 - a1 - a5 + 8192) >> 14; 96cabdff1aSopenharmony_ci} 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_civoid ff_wmv2_idct_add_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block) 99cabdff1aSopenharmony_ci{ 100cabdff1aSopenharmony_ci int i; 101cabdff1aSopenharmony_ci double ftmp[11]; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci for (i = 0; i < 64; i += 8) 104cabdff1aSopenharmony_ci wmv2_idct_row_mmi(block + i); 105cabdff1aSopenharmony_ci for (i = 0; i < 8; i++) 106cabdff1aSopenharmony_ci wmv2_idct_col_mmi(block + i); 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci __asm__ volatile ( 109cabdff1aSopenharmony_ci "pxor %[ftmp0], %[ftmp0], %[ftmp0] \n\t" 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci // low 4 loop 112cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp1], %[block], 0x00) 113cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp2], %[block], 0x08) 114cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp3], %[block], 0x10) 115cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp4], %[block], 0x18) 116cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp5], %[block], 0x20) 117cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp6], %[block], 0x28) 118cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp7], %[block], 0x30) 119cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp8], %[block], 0x38) 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp9], %[dest], 0x00) 122cabdff1aSopenharmony_ci "punpckhbh %[ftmp10], %[ftmp9], %[ftmp0] \n\t" 123cabdff1aSopenharmony_ci "punpcklbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 124cabdff1aSopenharmony_ci "paddh %[ftmp1], %[ftmp1], %[ftmp9] \n\t" 125cabdff1aSopenharmony_ci "paddh %[ftmp2], %[ftmp2], %[ftmp10] \n\t" 126cabdff1aSopenharmony_ci "packushb %[ftmp1], %[ftmp1], %[ftmp2] \n\t" 127cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp1], %[dest], 0x00) 128cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 129cabdff1aSopenharmony_ci 130cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp9], %[dest], 0x00) 131cabdff1aSopenharmony_ci "punpckhbh %[ftmp10], %[ftmp9], %[ftmp0] \n\t" 132cabdff1aSopenharmony_ci "punpcklbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 133cabdff1aSopenharmony_ci "paddh %[ftmp3], %[ftmp3], %[ftmp9] \n\t" 134cabdff1aSopenharmony_ci "paddh %[ftmp4], %[ftmp4], %[ftmp10] \n\t" 135cabdff1aSopenharmony_ci "packushb %[ftmp3], %[ftmp3], %[ftmp4] \n\t" 136cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp3], %[dest], 0x00) 137cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp9], %[dest], 0x00) 140cabdff1aSopenharmony_ci "punpckhbh %[ftmp10], %[ftmp9], %[ftmp0] \n\t" 141cabdff1aSopenharmony_ci "punpcklbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 142cabdff1aSopenharmony_ci "paddh %[ftmp5], %[ftmp5], %[ftmp9] \n\t" 143cabdff1aSopenharmony_ci "paddh %[ftmp6], %[ftmp6], %[ftmp10] \n\t" 144cabdff1aSopenharmony_ci "packushb %[ftmp5], %[ftmp5], %[ftmp6] \n\t" 145cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp5], %[dest], 0x00) 146cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp9], %[dest], 0x00) 149cabdff1aSopenharmony_ci "punpckhbh %[ftmp10], %[ftmp9], %[ftmp0] \n\t" 150cabdff1aSopenharmony_ci "punpcklbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 151cabdff1aSopenharmony_ci "paddh %[ftmp7], %[ftmp7], %[ftmp9] \n\t" 152cabdff1aSopenharmony_ci "paddh %[ftmp8], %[ftmp8], %[ftmp10] \n\t" 153cabdff1aSopenharmony_ci "packushb %[ftmp7], %[ftmp7], %[ftmp8] \n\t" 154cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp7], %[dest], 0x00) 155cabdff1aSopenharmony_ci 156cabdff1aSopenharmony_ci PTR_ADDIU "%[block], %[block], 0x40 \n\t" 157cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 158cabdff1aSopenharmony_ci 159cabdff1aSopenharmony_ci // high 4 loop 160cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp1], %[block], 0x00) 161cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp2], %[block], 0x08) 162cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp3], %[block], 0x10) 163cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp4], %[block], 0x18) 164cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp5], %[block], 0x20) 165cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp6], %[block], 0x28) 166cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp7], %[block], 0x30) 167cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp8], %[block], 0x38) 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp9], %[dest], 0x00) 170cabdff1aSopenharmony_ci "punpckhbh %[ftmp10], %[ftmp9], %[ftmp0] \n\t" 171cabdff1aSopenharmony_ci "punpcklbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 172cabdff1aSopenharmony_ci "paddh %[ftmp1], %[ftmp1], %[ftmp9] \n\t" 173cabdff1aSopenharmony_ci "paddh %[ftmp2], %[ftmp2], %[ftmp10] \n\t" 174cabdff1aSopenharmony_ci "packushb %[ftmp1], %[ftmp1], %[ftmp2] \n\t" 175cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp1], %[dest], 0x00) 176cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 177cabdff1aSopenharmony_ci 178cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp9], %[dest], 0x00) 179cabdff1aSopenharmony_ci "punpckhbh %[ftmp10], %[ftmp9], %[ftmp0] \n\t" 180cabdff1aSopenharmony_ci "punpcklbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 181cabdff1aSopenharmony_ci "paddh %[ftmp3], %[ftmp3], %[ftmp9] \n\t" 182cabdff1aSopenharmony_ci "paddh %[ftmp4], %[ftmp4], %[ftmp10] \n\t" 183cabdff1aSopenharmony_ci "packushb %[ftmp3], %[ftmp3], %[ftmp4] \n\t" 184cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp3], %[dest], 0x00) 185cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp9], %[dest], 0x00) 188cabdff1aSopenharmony_ci "punpckhbh %[ftmp10], %[ftmp9], %[ftmp0] \n\t" 189cabdff1aSopenharmony_ci "punpcklbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 190cabdff1aSopenharmony_ci "paddh %[ftmp5], %[ftmp5], %[ftmp9] \n\t" 191cabdff1aSopenharmony_ci "paddh %[ftmp6], %[ftmp6], %[ftmp10] \n\t" 192cabdff1aSopenharmony_ci "packushb %[ftmp5], %[ftmp5], %[ftmp6] \n\t" 193cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp5], %[dest], 0x00) 194cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 195cabdff1aSopenharmony_ci 196cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp9], %[dest], 0x00) 197cabdff1aSopenharmony_ci "punpckhbh %[ftmp10], %[ftmp9], %[ftmp0] \n\t" 198cabdff1aSopenharmony_ci "punpcklbh %[ftmp9], %[ftmp9], %[ftmp0] \n\t" 199cabdff1aSopenharmony_ci "paddh %[ftmp7], %[ftmp7], %[ftmp9] \n\t" 200cabdff1aSopenharmony_ci "paddh %[ftmp8], %[ftmp8], %[ftmp10] \n\t" 201cabdff1aSopenharmony_ci "packushb %[ftmp7], %[ftmp7], %[ftmp8] \n\t" 202cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp7], %[dest], 0x00) 203cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 204cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 205cabdff1aSopenharmony_ci [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]), 206cabdff1aSopenharmony_ci [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), 207cabdff1aSopenharmony_ci [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]), 208cabdff1aSopenharmony_ci [ftmp10]"=&f"(ftmp[10]), 209cabdff1aSopenharmony_ci [block]"+&r"(block), [dest]"+&r"(dest) 210cabdff1aSopenharmony_ci : [line_size]"r"((mips_reg)line_size) 211cabdff1aSopenharmony_ci : "memory" 212cabdff1aSopenharmony_ci ); 213cabdff1aSopenharmony_ci} 214cabdff1aSopenharmony_ci 215cabdff1aSopenharmony_civoid ff_wmv2_idct_put_mmi(uint8_t *dest, ptrdiff_t line_size, int16_t *block) 216cabdff1aSopenharmony_ci{ 217cabdff1aSopenharmony_ci int i; 218cabdff1aSopenharmony_ci double ftmp[8]; 219cabdff1aSopenharmony_ci 220cabdff1aSopenharmony_ci for (i = 0; i < 64; i += 8) 221cabdff1aSopenharmony_ci wmv2_idct_row_mmi(block + i); 222cabdff1aSopenharmony_ci for (i = 0; i < 8; i++) 223cabdff1aSopenharmony_ci wmv2_idct_col_mmi(block + i); 224cabdff1aSopenharmony_ci 225cabdff1aSopenharmony_ci __asm__ volatile ( 226cabdff1aSopenharmony_ci // low 4 loop 227cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp0], %[block], 0x00) 228cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp1], %[block], 0x08) 229cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp2], %[block], 0x10) 230cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp3], %[block], 0x18) 231cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp4], %[block], 0x20) 232cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp5], %[block], 0x28) 233cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp6], %[block], 0x30) 234cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp7], %[block], 0x38) 235cabdff1aSopenharmony_ci "packushb %[ftmp0], %[ftmp0], %[ftmp1] \n\t" 236cabdff1aSopenharmony_ci "packushb %[ftmp2], %[ftmp2], %[ftmp3] \n\t" 237cabdff1aSopenharmony_ci "packushb %[ftmp4], %[ftmp4], %[ftmp5] \n\t" 238cabdff1aSopenharmony_ci "packushb %[ftmp6], %[ftmp6], %[ftmp7] \n\t" 239cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[dest], 0x00) 240cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 241cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp2], %[dest], 0x00) 242cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 243cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp4], %[dest], 0x00) 244cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 245cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp6], %[dest], 0x00) 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci PTR_ADDIU "%[block], %[block], 0x40 \n\t" 248cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci // high 4 loop 251cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp0], %[block], 0x00) 252cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp1], %[block], 0x08) 253cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp2], %[block], 0x10) 254cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp3], %[block], 0x18) 255cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp4], %[block], 0x20) 256cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp5], %[block], 0x28) 257cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp6], %[block], 0x30) 258cabdff1aSopenharmony_ci MMI_LDC1(%[ftmp7], %[block], 0x38) 259cabdff1aSopenharmony_ci "packushb %[ftmp0], %[ftmp0], %[ftmp1] \n\t" 260cabdff1aSopenharmony_ci "packushb %[ftmp2], %[ftmp2], %[ftmp3] \n\t" 261cabdff1aSopenharmony_ci "packushb %[ftmp4], %[ftmp4], %[ftmp5] \n\t" 262cabdff1aSopenharmony_ci "packushb %[ftmp6], %[ftmp6], %[ftmp7] \n\t" 263cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp0], %[dest], 0x00) 264cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 265cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp2], %[dest], 0x00) 266cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 267cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp4], %[dest], 0x00) 268cabdff1aSopenharmony_ci PTR_ADDU "%[dest], %[dest], %[line_size] \n\t" 269cabdff1aSopenharmony_ci MMI_SDC1(%[ftmp6], %[dest], 0x00) 270cabdff1aSopenharmony_ci : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]), 271cabdff1aSopenharmony_ci [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]), 272cabdff1aSopenharmony_ci [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]), 273cabdff1aSopenharmony_ci [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]), 274cabdff1aSopenharmony_ci [block]"+&r"(block), [dest]"+&r"(dest) 275cabdff1aSopenharmony_ci : [line_size]"r"((mips_reg)line_size) 276cabdff1aSopenharmony_ci : "memory" 277cabdff1aSopenharmony_ci ); 278cabdff1aSopenharmony_ci} 279