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