1 /*
2 * Loongson SIMD optimized h264dsp
3 *
4 * Copyright (c) 2015 Loongson Technology Corporation Limited
5 * Copyright (c) 2015 Zhou Xiaoyong <zhouxiaoyong@loongson.cn>
6 * Zhang Shuangshuang <zhangshuangshuang@ict.ac.cn>
7 * Heiher <r@hev.cc>
8 *
9 * This file is part of FFmpeg.
10 *
11 * FFmpeg is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
15 *
16 * FFmpeg is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with FFmpeg; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 */
25
26 #include "libavcodec/bit_depth_template.c"
27 #include "h264dsp_mips.h"
28 #include "libavutil/mips/mmiutils.h"
29 #include "libavutil/mem_internal.h"
30
ff_h264_add_pixels4_8_mmi(uint8_t * dst,int16_t * src,int stride)31 void ff_h264_add_pixels4_8_mmi(uint8_t *dst, int16_t *src, int stride)
32 {
33 double ftmp[9];
34 DECLARE_VAR_LOW32;
35
36 __asm__ volatile (
37 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
38 MMI_LDC1(%[ftmp1], %[src], 0x00)
39 MMI_LDC1(%[ftmp2], %[src], 0x08)
40 MMI_LDC1(%[ftmp3], %[src], 0x10)
41 MMI_LDC1(%[ftmp4], %[src], 0x18)
42 /* memset(src, 0, 32); */
43 "gssqc1 %[ftmp0], %[ftmp0], 0x00(%[src]) \n\t"
44 "gssqc1 %[ftmp0], %[ftmp0], 0x10(%[src]) \n\t"
45 MMI_ULWC1(%[ftmp5], %[dst0], 0x00)
46 MMI_ULWC1(%[ftmp6], %[dst1], 0x00)
47 MMI_ULWC1(%[ftmp7], %[dst2], 0x00)
48 MMI_ULWC1(%[ftmp8], %[dst3], 0x00)
49 "punpcklbh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
50 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
51 "punpcklbh %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
52 "punpcklbh %[ftmp8], %[ftmp8], %[ftmp0] \n\t"
53 "paddh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
54 "paddh %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
55 "paddh %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
56 "paddh %[ftmp4], %[ftmp4], %[ftmp8] \n\t"
57 "packushb %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
58 "packushb %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
59 "packushb %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
60 "packushb %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
61 MMI_SWC1(%[ftmp1], %[dst0], 0x00)
62 MMI_SWC1(%[ftmp2], %[dst1], 0x00)
63 MMI_SWC1(%[ftmp3], %[dst2], 0x00)
64 MMI_SWC1(%[ftmp4], %[dst3], 0x00)
65 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
66 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
67 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
68 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
69 RESTRICT_ASM_LOW32
70 [ftmp8]"=&f"(ftmp[8])
71 : [dst0]"r"(dst), [dst1]"r"(dst+stride),
72 [dst2]"r"(dst+2*stride), [dst3]"r"(dst+3*stride),
73 [src]"r"(src)
74 : "memory"
75 );
76
77 }
78
ff_h264_idct_add_8_mmi(uint8_t * dst,int16_t * block,int stride)79 void ff_h264_idct_add_8_mmi(uint8_t *dst, int16_t *block, int stride)
80 {
81 double ftmp[12];
82 uint64_t tmp[1];
83 DECLARE_VAR_LOW32;
84 DECLARE_VAR_ADDRT;
85
86 __asm__ volatile (
87 MMI_LDC1(%[ftmp0], %[block], 0x00)
88 MMI_LDC1(%[ftmp1], %[block], 0x08)
89 MMI_LDC1(%[ftmp2], %[block], 0x10)
90 MMI_LDC1(%[ftmp3], %[block], 0x18)
91 /* memset(block, 0, 32) */
92 "xor %[ftmp4], %[ftmp4], %[ftmp4] \n\t"
93 "gssqc1 %[ftmp4], %[ftmp4], 0x00(%[block]) \n\t"
94 "gssqc1 %[ftmp4], %[ftmp4], 0x10(%[block]) \n\t"
95 "dli %[tmp0], 0x01 \n\t"
96 "mtc1 %[tmp0], %[ftmp8] \n\t"
97 "dli %[tmp0], 0x06 \n\t"
98 "mtc1 %[tmp0], %[ftmp9] \n\t"
99 "psrah %[ftmp4], %[ftmp1], %[ftmp8] \n\t"
100 "psrah %[ftmp5], %[ftmp3], %[ftmp8] \n\t"
101 "psubh %[ftmp4], %[ftmp4], %[ftmp3] \n\t"
102 "paddh %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
103 "paddh %[ftmp10], %[ftmp2], %[ftmp0] \n\t"
104 "psubh %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
105 "paddh %[ftmp11], %[ftmp5], %[ftmp10] \n\t"
106 "psubh %[ftmp2], %[ftmp10], %[ftmp5] \n\t"
107 "paddh %[ftmp10], %[ftmp4], %[ftmp0] \n\t"
108 "psubh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
109 "punpckhhw %[ftmp1], %[ftmp11], %[ftmp10] \n\t"
110 "punpcklhw %[ftmp5], %[ftmp11], %[ftmp10] \n\t"
111 "punpckhhw %[ftmp4], %[ftmp0], %[ftmp2] \n\t"
112 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
113 "punpckhwd %[ftmp2], %[ftmp5], %[ftmp0] \n\t"
114 "punpcklwd %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
115 "punpcklwd %[ftmp10], %[ftmp1], %[ftmp4] \n\t"
116 "punpckhwd %[ftmp0], %[ftmp1], %[ftmp4] \n\t"
117 "paddh %[ftmp5], %[ftmp5], %[ff_pw_32] \n\t"
118 "psrah %[ftmp4], %[ftmp2], %[ftmp8] \n\t"
119 "psrah %[ftmp3], %[ftmp0], %[ftmp8] \n\t"
120 "psubh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
121 "paddh %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
122 "paddh %[ftmp1], %[ftmp10], %[ftmp5] \n\t"
123 "psubh %[ftmp5], %[ftmp5], %[ftmp10] \n\t"
124 "paddh %[ftmp10], %[ftmp3], %[ftmp1] \n\t"
125 "psubh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
126 "paddh %[ftmp11], %[ftmp4], %[ftmp5] \n\t"
127 "psubh %[ftmp5], %[ftmp5], %[ftmp4] \n\t"
128 MMI_ULWC1(%[ftmp2], %[dst], 0x00)
129 MMI_LWXC1(%[ftmp0], %[dst], %[stride], 0x00)
130 "xor %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
131 "psrah %[ftmp3], %[ftmp10], %[ftmp9] \n\t"
132 "psrah %[ftmp4], %[ftmp11], %[ftmp9] \n\t"
133 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
134 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
135 "paddh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
136 "paddh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
137 "packushb %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
138 "packushb %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
139 MMI_SWC1(%[ftmp2], %[dst], 0x00)
140 MMI_SWXC1(%[ftmp0], %[dst], %[stride], 0x00)
141 PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
142 PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
143 MMI_ULWC1(%[ftmp2], %[dst], 0x00)
144 "psrah %[ftmp5], %[ftmp5], %[ftmp9] \n\t"
145 MMI_LWXC1(%[ftmp0], %[dst], %[stride], 0x00)
146 "psrah %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
147 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
148 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
149 "paddh %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
150 "paddh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
151 "packushb %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
152 MMI_SWC1(%[ftmp2], %[dst], 0x00)
153 "packushb %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
154 MMI_SWXC1(%[ftmp0], %[dst], %[stride], 0x00)
155 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
156 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
157 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
158 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
159 [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),
160 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
161 RESTRICT_ASM_LOW32
162 RESTRICT_ASM_ADDRT
163 [tmp0]"=&r"(tmp[0])
164 : [dst]"r"(dst), [block]"r"(block),
165 [stride]"r"((mips_reg)stride), [ff_pw_32]"f"(ff_pw_32)
166 : "memory"
167 );
168
169 }
170
ff_h264_idct8_add_8_mmi(uint8_t * dst,int16_t * block,int stride)171 void ff_h264_idct8_add_8_mmi(uint8_t *dst, int16_t *block, int stride)
172 {
173 double ftmp[16];
174 uint64_t tmp[7];
175 mips_reg addr[1];
176 DECLARE_VAR_LOW32;
177 DECLARE_VAR_ADDRT;
178
179 __asm__ volatile (
180 "lhu %[tmp0], 0x00(%[block]) \n\t"
181 PTR_ADDI "$sp, $sp, -0x20 \n\t"
182 PTR_ADDIU "%[tmp0], %[tmp0], 0x20 \n\t"
183 MMI_LDC1(%[ftmp1], %[block], 0x10)
184 "sh %[tmp0], 0x00(%[block]) \n\t"
185 MMI_LDC1(%[ftmp2], %[block], 0x20)
186 "dli %[tmp0], 0x01 \n\t"
187 MMI_LDC1(%[ftmp3], %[block], 0x30)
188 "mtc1 %[tmp0], %[ftmp8] \n\t"
189 MMI_LDC1(%[ftmp5], %[block], 0x50)
190 MMI_LDC1(%[ftmp6], %[block], 0x60)
191 MMI_LDC1(%[ftmp7], %[block], 0x70)
192 "mov.d %[ftmp0], %[ftmp1] \n\t"
193 "psrah %[ftmp1], %[ftmp1], %[ftmp8] \n\t"
194 "psrah %[ftmp4], %[ftmp5], %[ftmp8] \n\t"
195 "paddh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
196 "paddh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
197 "paddh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
198 "paddh %[ftmp4], %[ftmp4], %[ftmp7] \n\t"
199 "paddh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
200 "psubh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
201 "psubh %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
202 "psubh %[ftmp5], %[ftmp5], %[ftmp3] \n\t"
203 "psrah %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
204 "paddh %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
205 "psubh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
206 "psrah %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
207 "psubh %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
208 "dli %[tmp0], 0x02 \n\t"
209 "psubh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
210 "mtc1 %[tmp0], %[ftmp9] \n\t"
211 "mov.d %[ftmp7], %[ftmp1] \n\t"
212 "psrah %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
213 "psrah %[ftmp3], %[ftmp4], %[ftmp9] \n\t"
214 "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
215 "psrah %[ftmp0], %[ftmp0], %[ftmp9] \n\t"
216 "paddh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
217 "psrah %[ftmp5], %[ftmp5], %[ftmp9] \n\t"
218 "psubh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
219 "psubh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
220 "mov.d %[ftmp5], %[ftmp6] \n\t"
221 "psrah %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
222 "psrah %[ftmp4], %[ftmp2], %[ftmp8] \n\t"
223 "paddh %[ftmp6], %[ftmp6], %[ftmp2] \n\t"
224 "psubh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
225 MMI_LDC1(%[ftmp2], %[block], 0x00)
226 MMI_LDC1(%[ftmp5], %[block], 0x40)
227 "paddh %[ftmp5], %[ftmp5], %[ftmp2] \n\t"
228 "paddh %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
229 "paddh %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
230 "psubh %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
231 "paddh %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
232 "paddh %[ftmp4], %[ftmp4], %[ftmp2] \n\t"
233 "psubh %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
234 "paddh %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
235 "paddh %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
236 "psubh %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
237 "paddh %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
238 "paddh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
239 "psubh %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
240 "paddh %[ftmp4], %[ftmp4], %[ftmp4] \n\t"
241 "paddh %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
242 "psubh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
243 "paddh %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
244 "paddh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
245 "psubh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
246 "paddh %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
247 MMI_SDC1(%[ftmp6], %[block], 0x00)
248 "psubh %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
249 "punpckhhw %[ftmp6], %[ftmp7], %[ftmp0] \n\t"
250 "punpcklhw %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
251 "punpckhhw %[ftmp0], %[ftmp3], %[ftmp1] \n\t"
252 "punpcklhw %[ftmp3], %[ftmp3], %[ftmp1] \n\t"
253 "punpckhwd %[ftmp1], %[ftmp7], %[ftmp3] \n\t"
254 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
255 "punpckhwd %[ftmp3], %[ftmp6], %[ftmp0] \n\t"
256 "punpcklwd %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
257 MMI_LDC1(%[ftmp0], %[block], 0x00)
258 MMI_SDC1(%[ftmp7], $sp, 0x00)
259 MMI_SDC1(%[ftmp1], $sp, 0x10)
260 "dmfc1 %[tmp1], %[ftmp6] \n\t"
261 "dmfc1 %[tmp3], %[ftmp3] \n\t"
262 "punpckhhw %[ftmp3], %[ftmp5], %[ftmp2] \n\t"
263 "punpcklhw %[ftmp5], %[ftmp5], %[ftmp2] \n\t"
264 "punpckhhw %[ftmp2], %[ftmp4], %[ftmp0] \n\t"
265 "punpcklhw %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
266 "punpckhwd %[ftmp0], %[ftmp5], %[ftmp4] \n\t"
267 "punpcklwd %[ftmp5], %[ftmp5], %[ftmp4] \n\t"
268 "punpckhwd %[ftmp4], %[ftmp3], %[ftmp2] \n\t"
269 "punpcklwd %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
270 MMI_SDC1(%[ftmp5], $sp, 0x08)
271 MMI_SDC1(%[ftmp0], $sp, 0x18)
272 "dmfc1 %[tmp2], %[ftmp3] \n\t"
273 "dmfc1 %[tmp4], %[ftmp4] \n\t"
274 MMI_LDC1(%[ftmp1], %[block], 0x18)
275 MMI_LDC1(%[ftmp6], %[block], 0x28)
276 MMI_LDC1(%[ftmp2], %[block], 0x38)
277 MMI_LDC1(%[ftmp0], %[block], 0x58)
278 MMI_LDC1(%[ftmp3], %[block], 0x68)
279 MMI_LDC1(%[ftmp4], %[block], 0x78)
280 "mov.d %[ftmp7], %[ftmp1] \n\t"
281 "psrah %[ftmp5], %[ftmp0], %[ftmp8] \n\t"
282 "psrah %[ftmp1], %[ftmp1], %[ftmp8] \n\t"
283 "paddh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
284 "paddh %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
285 "paddh %[ftmp5], %[ftmp5], %[ftmp4] \n\t"
286 "paddh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
287 "psubh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
288 "paddh %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
289 "psubh %[ftmp7], %[ftmp7], %[ftmp2] \n\t"
290 "psubh %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
291 "psrah %[ftmp2], %[ftmp2], %[ftmp8] \n\t"
292 "paddh %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
293 "psubh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
294 "psrah %[ftmp4], %[ftmp4], %[ftmp8] \n\t"
295 "psubh %[ftmp7], %[ftmp7], %[ftmp2] \n\t"
296 "psubh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
297 "mov.d %[ftmp4], %[ftmp1] \n\t"
298 "psrah %[ftmp2], %[ftmp5], %[ftmp9] \n\t"
299 "psrah %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
300 "paddh %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
301 "psrah %[ftmp7], %[ftmp7], %[ftmp9] \n\t"
302 "paddh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
303 "psrah %[ftmp0], %[ftmp0], %[ftmp9] \n\t"
304 "psubh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
305 "psubh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
306 "mov.d %[ftmp0], %[ftmp3] \n\t"
307 "psrah %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
308 "psrah %[ftmp5], %[ftmp6], %[ftmp8] \n\t"
309 "paddh %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
310 "psubh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
311 MMI_LDC1(%[ftmp6], %[block], 0x08)
312 MMI_LDC1(%[ftmp0], %[block], 0x48)
313 "paddh %[ftmp0], %[ftmp0], %[ftmp6] \n\t"
314 "paddh %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
315 "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
316 "psubh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
317 "paddh %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
318 "paddh %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
319 "psubh %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
320 "paddh %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
321 "paddh %[ftmp4], %[ftmp4], %[ftmp3] \n\t"
322 "psubh %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
323 "paddh %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
324 "paddh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
325 "psubh %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
326 "paddh %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
327 "paddh %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
328 "psubh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
329 "paddh %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
330 "paddh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
331 "psubh %[ftmp6], %[ftmp6], %[ftmp2] \n\t"
332 "paddh %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
333 MMI_SDC1(%[ftmp3], %[block], 0x08)
334 "psubh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
335 "punpckhhw %[ftmp3], %[ftmp4], %[ftmp7] \n\t"
336 "punpcklhw %[ftmp4], %[ftmp4], %[ftmp7] \n\t"
337 "punpckhhw %[ftmp7], %[ftmp2], %[ftmp1] \n\t"
338 "punpcklhw %[ftmp2], %[ftmp2], %[ftmp1] \n\t"
339 "punpckhwd %[ftmp1], %[ftmp4], %[ftmp2] \n\t"
340 "punpcklwd %[ftmp4], %[ftmp4], %[ftmp2] \n\t"
341 "punpckhwd %[ftmp2], %[ftmp3], %[ftmp7] \n\t"
342 "punpcklwd %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
343 MMI_LDC1(%[ftmp7], %[block], 0x08)
344 "dmfc1 %[tmp5], %[ftmp4] \n\t"
345 "mov.d %[ftmp10], %[ftmp1] \n\t"
346 "mov.d %[ftmp12], %[ftmp3] \n\t"
347 "mov.d %[ftmp14], %[ftmp2] \n\t"
348 "punpckhhw %[ftmp2], %[ftmp0], %[ftmp6] \n\t"
349 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp6] \n\t"
350 "punpckhhw %[ftmp6], %[ftmp5], %[ftmp7] \n\t"
351 "punpcklhw %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
352 "punpckhwd %[ftmp7], %[ftmp0], %[ftmp5] \n\t"
353 "punpcklwd %[ftmp0], %[ftmp0], %[ftmp5] \n\t"
354 "punpckhwd %[ftmp5], %[ftmp2], %[ftmp6] \n\t"
355 "punpcklwd %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
356 "dmfc1 %[tmp6], %[ftmp0] \n\t"
357 "mov.d %[ftmp11], %[ftmp7] \n\t"
358 "mov.d %[ftmp13], %[ftmp2] \n\t"
359 "mov.d %[ftmp15], %[ftmp5] \n\t"
360 PTR_ADDIU "%[addr0], %[dst], 0x04 \n\t"
361 "mov.d %[ftmp7], %[ftmp10] \n\t"
362 "dmtc1 %[tmp3], %[ftmp6] \n\t"
363 MMI_LDC1(%[ftmp1], $sp, 0x10)
364 "dmtc1 %[tmp1], %[ftmp3] \n\t"
365 "mov.d %[ftmp4], %[ftmp1] \n\t"
366 "psrah %[ftmp1], %[ftmp1], %[ftmp8] \n\t"
367 "psrah %[ftmp0], %[ftmp7], %[ftmp8] \n\t"
368 "paddh %[ftmp1], %[ftmp1], %[ftmp4] \n\t"
369 "paddh %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
370 "paddh %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
371 "paddh %[ftmp0], %[ftmp0], %[ftmp14] \n\t"
372 "paddh %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
373 "psubh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
374 "psubh %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
375 "psubh %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
376 "psrah %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
377 "paddh %[ftmp4], %[ftmp4], %[ftmp14] \n\t"
378 "psubh %[ftmp7], %[ftmp7], %[ftmp14] \n\t"
379 "psrah %[ftmp5], %[ftmp14], %[ftmp8] \n\t"
380 "psubh %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
381 "psubh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
382 "mov.d %[ftmp5], %[ftmp1] \n\t"
383 "psrah %[ftmp1], %[ftmp1], %[ftmp9] \n\t"
384 "psrah %[ftmp6], %[ftmp0], %[ftmp9] \n\t"
385 "paddh %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
386 "paddh %[ftmp6], %[ftmp6], %[ftmp4] \n\t"
387 "psrah %[ftmp4], %[ftmp4], %[ftmp9] \n\t"
388 "psrah %[ftmp7], %[ftmp7], %[ftmp9] \n\t"
389 "psubh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
390 "psubh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
391 "mov.d %[ftmp7], %[ftmp12] \n\t"
392 "psrah %[ftmp2], %[ftmp12], %[ftmp8] \n\t"
393 "psrah %[ftmp0], %[ftmp3], %[ftmp8] \n\t"
394 "paddh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
395 "psubh %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
396 MMI_LDC1(%[ftmp3], $sp, 0x00)
397 "dmtc1 %[tmp5], %[ftmp7] \n\t"
398 "paddh %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
399 "paddh %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
400 "paddh %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
401 "psubh %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
402 "paddh %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
403 "paddh %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
404 "psubh %[ftmp7], %[ftmp7], %[ftmp2] \n\t"
405 "paddh %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
406 "paddh %[ftmp5], %[ftmp5], %[ftmp2] \n\t"
407 "psubh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
408 "paddh %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
409 "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
410 "psubh %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
411 "paddh %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
412 "paddh %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
413 "psubh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
414 "paddh %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
415 "paddh %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
416 "psubh %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
417 "paddh %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
418 MMI_SDC1(%[ftmp3], $sp, 0x00)
419 "psubh %[ftmp7], %[ftmp7], %[ftmp1] \n\t"
420 MMI_SDC1(%[ftmp0], $sp, 0x10)
421 "dmfc1 %[tmp1], %[ftmp2] \n\t"
422 "xor %[ftmp2], %[ftmp2], %[ftmp2] \n\t"
423 MMI_SDC1(%[ftmp2], %[block], 0x00)
424 MMI_SDC1(%[ftmp2], %[block], 0x08)
425 MMI_SDC1(%[ftmp2], %[block], 0x10)
426 MMI_SDC1(%[ftmp2], %[block], 0x18)
427 MMI_SDC1(%[ftmp2], %[block], 0x20)
428 MMI_SDC1(%[ftmp2], %[block], 0x28)
429 MMI_SDC1(%[ftmp2], %[block], 0x30)
430 MMI_SDC1(%[ftmp2], %[block], 0x38)
431 MMI_SDC1(%[ftmp2], %[block], 0x40)
432 MMI_SDC1(%[ftmp2], %[block], 0x48)
433 MMI_SDC1(%[ftmp2], %[block], 0x50)
434 MMI_SDC1(%[ftmp2], %[block], 0x58)
435 MMI_SDC1(%[ftmp2], %[block], 0x60)
436 MMI_SDC1(%[ftmp2], %[block], 0x68)
437 MMI_SDC1(%[ftmp2], %[block], 0x70)
438 MMI_SDC1(%[ftmp2], %[block], 0x78)
439 "dli %[tmp3], 0x06 \n\t"
440 "mtc1 %[tmp3], %[ftmp10] \n\t"
441 MMI_ULWC1(%[ftmp3], %[dst], 0x00)
442 MMI_LWXC1(%[ftmp0], %[dst], %[stride], 0x00)
443 "psrah %[ftmp5], %[ftmp5], %[ftmp10] \n\t"
444 "psrah %[ftmp4], %[ftmp4], %[ftmp10] \n\t"
445 "punpcklbh %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
446 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
447 "paddh %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
448 "paddh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
449 "packushb %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
450 "packushb %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
451 MMI_SWC1(%[ftmp3], %[dst], 0x00)
452 MMI_SWXC1(%[ftmp0], %[dst], %[stride], 0x00)
453 PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
454 PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
455 MMI_ULWC1(%[ftmp3], %[dst], 0x00)
456 MMI_LWXC1(%[ftmp0], %[dst], %[stride], 0x00)
457 "psrah %[ftmp6], %[ftmp6], %[ftmp10] \n\t"
458 "psrah %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
459 "punpcklbh %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
460 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
461 "paddh %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
462 "paddh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
463 "packushb %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
464 "packushb %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
465 MMI_SWC1(%[ftmp3], %[dst], 0x00)
466 MMI_SWXC1(%[ftmp0], %[dst], %[stride], 0x00)
467 MMI_LDC1(%[ftmp5], $sp, 0x00)
468 MMI_LDC1(%[ftmp4], $sp, 0x10)
469 "dmtc1 %[tmp1], %[ftmp6] \n\t"
470 PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
471 PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
472 MMI_ULWC1(%[ftmp3], %[dst], 0x00)
473 MMI_LWXC1(%[ftmp0], %[dst], %[stride], 0x00)
474 "psrah %[ftmp7], %[ftmp7], %[ftmp10] \n\t"
475 "psrah %[ftmp5], %[ftmp5], %[ftmp10] \n\t"
476 "punpcklbh %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
477 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
478 "paddh %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
479 "paddh %[ftmp0], %[ftmp0], %[ftmp5] \n\t"
480 "packushb %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
481 "packushb %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
482 MMI_SWC1(%[ftmp3], %[dst], 0x00)
483 MMI_SWXC1(%[ftmp0], %[dst], %[stride], 0x00)
484 PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
485 PTR_ADDU "%[dst], %[dst], %[stride] \n\t"
486 MMI_ULWC1(%[ftmp3], %[dst], 0x00)
487 MMI_LWXC1(%[ftmp0], %[dst], %[stride], 0x00)
488 "psrah %[ftmp4], %[ftmp4], %[ftmp10] \n\t"
489 "psrah %[ftmp6], %[ftmp6], %[ftmp10] \n\t"
490 "punpcklbh %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
491 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
492 "paddh %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
493 "paddh %[ftmp0], %[ftmp0], %[ftmp6] \n\t"
494 "packushb %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
495 "packushb %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
496 MMI_SWC1(%[ftmp3], %[dst], 0x00)
497 MMI_SWXC1(%[ftmp0], %[dst], %[stride], 0x00)
498 "dmtc1 %[tmp4], %[ftmp1] \n\t"
499 "dmtc1 %[tmp2], %[ftmp6] \n\t"
500 MMI_LDC1(%[ftmp4], $sp, 0x18)
501 "mov.d %[ftmp5], %[ftmp4] \n\t"
502 "psrah %[ftmp4], %[ftmp4], %[ftmp8] \n\t"
503 "psrah %[ftmp7], %[ftmp11], %[ftmp8] \n\t"
504 "paddh %[ftmp7], %[ftmp7], %[ftmp11] \n\t"
505 "paddh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
506 "paddh %[ftmp7], %[ftmp7], %[ftmp15] \n\t"
507 "paddh %[ftmp4], %[ftmp4], %[ftmp11] \n\t"
508 "psubh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
509 "paddh %[ftmp4], %[ftmp4], %[ftmp1] \n\t"
510 "psubh %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
511 "psubh %[ftmp3], %[ftmp11], %[ftmp1] \n\t"
512 "psrah %[ftmp1], %[ftmp1], %[ftmp8] \n\t"
513 "paddh %[ftmp5], %[ftmp5], %[ftmp15] \n\t"
514 "psubh %[ftmp3], %[ftmp3], %[ftmp15] \n\t"
515 "psrah %[ftmp2], %[ftmp15], %[ftmp8] \n\t"
516 "psubh %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
517 "psubh %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
518 "mov.d %[ftmp2], %[ftmp4] \n\t"
519 "psrah %[ftmp4], %[ftmp4], %[ftmp9] \n\t"
520 "psrah %[ftmp1], %[ftmp7], %[ftmp9] \n\t"
521 "paddh %[ftmp4], %[ftmp4], %[ftmp3] \n\t"
522 "paddh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
523 "psrah %[ftmp5], %[ftmp5], %[ftmp9] \n\t"
524 "psrah %[ftmp3], %[ftmp3], %[ftmp9] \n\t"
525 "psubh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
526 "psubh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
527 "mov.d %[ftmp3], %[ftmp13] \n\t"
528 "psrah %[ftmp0], %[ftmp13], %[ftmp8] \n\t"
529 "psrah %[ftmp7], %[ftmp6], %[ftmp8] \n\t"
530 "paddh %[ftmp0], %[ftmp0], %[ftmp6] \n\t"
531 "psubh %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
532 MMI_LDC1(%[ftmp6], $sp, 0x08)
533 "dmtc1 %[tmp6], %[ftmp3] \n\t"
534 "paddh %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
535 "paddh %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
536 "paddh %[ftmp0], %[ftmp0], %[ftmp3] \n\t"
537 "psubh %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
538 "paddh %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
539 "paddh %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
540 "psubh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
541 "paddh %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
542 "paddh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
543 "psubh %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
544 "paddh %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
545 "paddh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
546 "psubh %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
547 "paddh %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
548 "paddh %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
549 "psubh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
550 "paddh %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
551 "paddh %[ftmp4], %[ftmp4], %[ftmp3] \n\t"
552 "psubh %[ftmp6], %[ftmp6], %[ftmp1] \n\t"
553 "paddh %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
554 MMI_SDC1(%[ftmp6], $sp, 0x08)
555 "psubh %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
556 MMI_SDC1(%[ftmp7], $sp, 0x18)
557 "dmfc1 %[tmp2], %[ftmp0] \n\t"
558 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
559 MMI_ULWC1(%[ftmp6], %[addr0], 0x00)
560 MMI_LWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
561 "psrah %[ftmp2], %[ftmp2], %[ftmp10] \n\t"
562 "psrah %[ftmp5], %[ftmp5], %[ftmp10] \n\t"
563 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
564 "punpcklbh %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
565 "paddh %[ftmp6], %[ftmp6], %[ftmp2] \n\t"
566 "paddh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
567 "packushb %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
568 "packushb %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
569 MMI_SWC1(%[ftmp6], %[addr0], 0x00)
570 MMI_SWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
571 PTR_ADDU "%[addr0], %[addr0], %[stride] \n\t"
572 PTR_ADDU "%[addr0], %[addr0], %[stride] \n\t"
573 MMI_ULWC1(%[ftmp6], %[addr0], 0x00)
574 MMI_LWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
575 "psrah %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
576 "psrah %[ftmp4], %[ftmp4], %[ftmp10] \n\t"
577 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
578 "punpcklbh %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
579 "paddh %[ftmp6], %[ftmp6], %[ftmp1] \n\t"
580 "paddh %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
581 "packushb %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
582 "packushb %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
583 MMI_SWC1(%[ftmp6], %[addr0], 0x00)
584 MMI_SWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
585 MMI_LDC1(%[ftmp2], $sp, 0x08)
586 MMI_LDC1(%[ftmp5], $sp, 0x18)
587 PTR_ADDU "%[addr0], %[addr0], %[stride] \n\t"
588 "dmtc1 %[tmp2], %[ftmp1] \n\t"
589 PTR_ADDU "%[addr0], %[addr0], %[stride] \n\t"
590 MMI_ULWC1(%[ftmp6], %[addr0], 0x00)
591 MMI_LWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
592 "psrah %[ftmp3], %[ftmp3], %[ftmp10] \n\t"
593 "psrah %[ftmp2], %[ftmp2], %[ftmp10] \n\t"
594 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
595 "punpcklbh %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
596 "paddh %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
597 "paddh %[ftmp7], %[ftmp7], %[ftmp2] \n\t"
598 "packushb %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
599 "packushb %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
600 MMI_SWC1(%[ftmp6], %[addr0], 0x00)
601 MMI_SWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
602 PTR_ADDU "%[addr0], %[addr0], %[stride] \n\t"
603 PTR_ADDU "%[addr0], %[addr0], %[stride] \n\t"
604 MMI_ULWC1(%[ftmp6], %[addr0], 0x00)
605 MMI_LWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
606 "psrah %[ftmp5], %[ftmp5], %[ftmp10] \n\t"
607 "psrah %[ftmp1], %[ftmp1], %[ftmp10] \n\t"
608 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
609 "punpcklbh %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
610 "paddh %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
611 "paddh %[ftmp7], %[ftmp7], %[ftmp1] \n\t"
612 "packushb %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
613 "packushb %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
614 MMI_SWC1(%[ftmp6], %[addr0], 0x00)
615 MMI_SWXC1(%[ftmp7], %[addr0], %[stride], 0x00)
616 PTR_ADDIU "$sp, $sp, 0x20 \n\t"
617 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
618 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
619 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
620 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
621 [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),
622 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
623 [ftmp12]"=&f"(ftmp[12]), [ftmp13]"=&f"(ftmp[13]),
624 [ftmp14]"=&f"(ftmp[14]), [ftmp15]"=&f"(ftmp[15]),
625 [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]),
626 [tmp2]"=&r"(tmp[2]), [tmp3]"=&r"(tmp[3]),
627 [tmp4]"=&r"(tmp[4]), [tmp5]"=&r"(tmp[5]),
628 [tmp6]"=&r"(tmp[6]),
629 RESTRICT_ASM_LOW32
630 RESTRICT_ASM_ADDRT
631 [addr0]"=&r"(addr[0])
632 : [dst]"r"(dst), [block]"r"(block),
633 [stride]"r"((mips_reg)stride)
634 : "memory"
635 );
636
637 }
638
ff_h264_idct_dc_add_8_mmi(uint8_t * dst,int16_t * block,int stride)639 void ff_h264_idct_dc_add_8_mmi(uint8_t *dst, int16_t *block, int stride)
640 {
641 int dc = (block[0] + 32) >> 6;
642 double ftmp[6];
643 DECLARE_VAR_LOW32;
644
645 block[0] = 0;
646
647 __asm__ volatile (
648 "mtc1 %[dc], %[ftmp5] \n\t"
649 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
650 "pshufh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
651 MMI_ULWC1(%[ftmp1], %[dst0], 0x00)
652 MMI_ULWC1(%[ftmp2], %[dst1], 0x00)
653 MMI_ULWC1(%[ftmp3], %[dst2], 0x00)
654 MMI_ULWC1(%[ftmp4], %[dst3], 0x00)
655 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
656 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
657 "punpcklbh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
658 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
659 "paddsh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
660 "paddsh %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
661 "paddsh %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
662 "paddsh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
663 "packushb %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
664 "packushb %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
665 "packushb %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
666 "packushb %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
667 MMI_SWC1(%[ftmp1], %[dst0], 0x00)
668 MMI_SWC1(%[ftmp2], %[dst1], 0x00)
669 MMI_SWC1(%[ftmp3], %[dst2], 0x00)
670 MMI_SWC1(%[ftmp4], %[dst3], 0x00)
671 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
672 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
673 [ftmp4]"=&f"(ftmp[4]),
674 RESTRICT_ASM_LOW32
675 [ftmp5]"=&f"(ftmp[5])
676 : [dst0]"r"(dst), [dst1]"r"(dst+stride),
677 [dst2]"r"(dst+2*stride), [dst3]"r"(dst+3*stride),
678 [dc]"r"(dc)
679 : "memory"
680 );
681 }
682
ff_h264_idct8_dc_add_8_mmi(uint8_t * dst,int16_t * block,int stride)683 void ff_h264_idct8_dc_add_8_mmi(uint8_t *dst, int16_t *block, int stride)
684 {
685 int dc = (block[0] + 32) >> 6;
686 double ftmp[10];
687 DECLARE_VAR_ALL64;
688
689 block[0] = 0;
690
691 __asm__ volatile (
692 "mtc1 %[dc], %[ftmp5] \n\t"
693 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
694 "pshufh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
695 MMI_LDC1(%[ftmp1], %[dst0], 0x00)
696 MMI_LDC1(%[ftmp2], %[dst1], 0x00)
697 MMI_LDC1(%[ftmp3], %[dst2], 0x00)
698 MMI_LDC1(%[ftmp4], %[dst3], 0x00)
699 "punpckhbh %[ftmp6], %[ftmp1], %[ftmp0] \n\t"
700 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
701 "punpckhbh %[ftmp7], %[ftmp2], %[ftmp0] \n\t"
702 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
703 "punpckhbh %[ftmp8], %[ftmp3], %[ftmp0] \n\t"
704 "punpcklbh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
705 "punpckhbh %[ftmp9], %[ftmp4], %[ftmp0] \n\t"
706 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
707 "paddsh %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
708 "paddsh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
709 "paddsh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
710 "paddsh %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
711 "paddsh %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
712 "paddsh %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
713 "paddsh %[ftmp9], %[ftmp9], %[ftmp5] \n\t"
714 "paddsh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
715 "packushb %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
716 "packushb %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
717 "packushb %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
718 "packushb %[ftmp4], %[ftmp4], %[ftmp9] \n\t"
719 MMI_SDC1(%[ftmp1], %[dst0], 0x00)
720 MMI_SDC1(%[ftmp2], %[dst1], 0x00)
721 MMI_SDC1(%[ftmp3], %[dst2], 0x00)
722 MMI_SDC1(%[ftmp4], %[dst3], 0x00)
723
724 MMI_LDC1(%[ftmp1], %[dst4], 0x00)
725 MMI_LDC1(%[ftmp2], %[dst5], 0x00)
726 MMI_LDC1(%[ftmp3], %[dst6], 0x00)
727 MMI_LDC1(%[ftmp4], %[dst7], 0x00)
728 "punpckhbh %[ftmp6], %[ftmp1], %[ftmp0] \n\t"
729 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
730 "punpckhbh %[ftmp7], %[ftmp2], %[ftmp0] \n\t"
731 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
732 "punpckhbh %[ftmp8], %[ftmp3], %[ftmp0] \n\t"
733 "punpcklbh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
734 "punpckhbh %[ftmp9], %[ftmp4], %[ftmp0] \n\t"
735 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
736 "paddsh %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
737 "paddsh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
738 "paddsh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
739 "paddsh %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
740 "paddsh %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
741 "paddsh %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
742 "paddsh %[ftmp9], %[ftmp9], %[ftmp5] \n\t"
743 "paddsh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
744 "packushb %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
745 "packushb %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
746 "packushb %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
747 "packushb %[ftmp4], %[ftmp4], %[ftmp9] \n\t"
748 MMI_SDC1(%[ftmp1], %[dst4], 0x00)
749 MMI_SDC1(%[ftmp2], %[dst5], 0x00)
750 MMI_SDC1(%[ftmp3], %[dst6], 0x00)
751 MMI_SDC1(%[ftmp4], %[dst7], 0x00)
752 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
753 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
754 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
755 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
756 [ftmp8]"=&f"(ftmp[8]),
757 RESTRICT_ASM_ALL64
758 [ftmp9]"=&f"(ftmp[9])
759 : [dst0]"r"(dst), [dst1]"r"(dst+stride),
760 [dst2]"r"(dst+2*stride), [dst3]"r"(dst+3*stride),
761 [dst4]"r"(dst+4*stride), [dst5]"r"(dst+5*stride),
762 [dst6]"r"(dst+6*stride), [dst7]"r"(dst+7*stride),
763 [dc]"r"(dc)
764 : "memory"
765 );
766 }
767
ff_h264_idct_add16_8_mmi(uint8_t * dst,const int * block_offset,int16_t * block,int stride,const uint8_t nnzc[15* 8])768 void ff_h264_idct_add16_8_mmi(uint8_t *dst, const int *block_offset,
769 int16_t *block, int stride, const uint8_t nnzc[15*8])
770 {
771 int i;
772 for(i=0; i<16; i++){
773 int nnz = nnzc[ scan8[i] ];
774 if(nnz){
775 if(nnz==1 && ((int16_t*)block)[i*16])
776 ff_h264_idct_dc_add_8_mmi(dst + block_offset[i], block + i*16,
777 stride);
778 else
779 ff_h264_idct_add_8_mmi(dst + block_offset[i], block + i*16,
780 stride);
781 }
782 }
783 }
784
ff_h264_idct_add16intra_8_mmi(uint8_t * dst,const int * block_offset,int16_t * block,int stride,const uint8_t nnzc[15* 8])785 void ff_h264_idct_add16intra_8_mmi(uint8_t *dst, const int *block_offset,
786 int16_t *block, int stride, const uint8_t nnzc[15*8])
787 {
788 int i;
789 for(i=0; i<16; i++){
790 if(nnzc[ scan8[i] ])
791 ff_h264_idct_add_8_mmi(dst + block_offset[i], block + i*16, stride);
792 else if(((int16_t*)block)[i*16])
793 ff_h264_idct_dc_add_8_mmi(dst + block_offset[i], block + i*16,
794 stride);
795 }
796 }
797
ff_h264_idct8_add4_8_mmi(uint8_t * dst,const int * block_offset,int16_t * block,int stride,const uint8_t nnzc[15* 8])798 void ff_h264_idct8_add4_8_mmi(uint8_t *dst, const int *block_offset,
799 int16_t *block, int stride, const uint8_t nnzc[15*8])
800 {
801 int i;
802 for(i=0; i<16; i+=4){
803 int nnz = nnzc[ scan8[i] ];
804 if(nnz){
805 if(nnz==1 && ((int16_t*)block)[i*16])
806 ff_h264_idct8_dc_add_8_mmi(dst + block_offset[i],
807 block + i*16, stride);
808 else
809 ff_h264_idct8_add_8_mmi(dst + block_offset[i], block + i*16,
810 stride);
811 }
812 }
813 }
814
ff_h264_idct_add8_8_mmi(uint8_t ** dest,const int * block_offset,int16_t * block,int stride,const uint8_t nnzc[15* 8])815 void ff_h264_idct_add8_8_mmi(uint8_t **dest, const int *block_offset,
816 int16_t *block, int stride, const uint8_t nnzc[15*8])
817 {
818 int i, j;
819 for(j=1; j<3; j++){
820 for(i=j*16; i<j*16+4; i++){
821 if(nnzc[ scan8[i] ])
822 ff_h264_idct_add_8_mmi(dest[j-1] + block_offset[i],
823 block + i*16, stride);
824 else if(((int16_t*)block)[i*16])
825 ff_h264_idct_dc_add_8_mmi(dest[j-1] + block_offset[i],
826 block + i*16, stride);
827 }
828 }
829 }
830
ff_h264_idct_add8_422_8_mmi(uint8_t ** dest,const int * block_offset,int16_t * block,int stride,const uint8_t nnzc[15* 8])831 void ff_h264_idct_add8_422_8_mmi(uint8_t **dest, const int *block_offset,
832 int16_t *block, int stride, const uint8_t nnzc[15*8])
833 {
834 int i, j;
835
836 for(j=1; j<3; j++){
837 for(i=j*16; i<j*16+4; i++){
838 if(nnzc[ scan8[i] ])
839 ff_h264_idct_add_8_mmi(dest[j-1] + block_offset[i],
840 block + i*16, stride);
841 else if(((int16_t*)block)[i*16])
842 ff_h264_idct_dc_add_8_mmi(dest[j-1] + block_offset[i],
843 block + i*16, stride);
844 }
845 }
846
847 for(j=1; j<3; j++){
848 for(i=j*16+4; i<j*16+8; i++){
849 if(nnzc[ scan8[i+4] ])
850 ff_h264_idct_add_8_mmi(dest[j-1] + block_offset[i+4],
851 block + i*16, stride);
852 else if(((int16_t*)block)[i*16])
853 ff_h264_idct_dc_add_8_mmi(dest[j-1] + block_offset[i+4],
854 block + i*16, stride);
855 }
856 }
857 }
858
ff_h264_luma_dc_dequant_idct_8_mmi(int16_t * output,int16_t * input,int qmul)859 void ff_h264_luma_dc_dequant_idct_8_mmi(int16_t *output, int16_t *input,
860 int qmul)
861 {
862 double ftmp[10];
863 uint64_t tmp[2];
864 DECLARE_VAR_ALL64;
865
866 __asm__ volatile (
867 ".set noreorder \n\t"
868 "dli %[tmp0], 0x08 \n\t"
869 MMI_LDC1(%[ftmp3], %[input], 0x18)
870 "mtc1 %[tmp0], %[ftmp8] \n\t"
871 MMI_LDC1(%[ftmp2], %[input], 0x10)
872 "dli %[tmp0], 0x20 \n\t"
873 MMI_LDC1(%[ftmp1], %[input], 0x08)
874 "mtc1 %[tmp0], %[ftmp9] \n\t"
875 MMI_LDC1(%[ftmp0], %[input], 0x00)
876 "mov.d %[ftmp4], %[ftmp3] \n\t"
877 "paddh %[ftmp3], %[ftmp3], %[ftmp2] \n\t"
878 "psubh %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
879 "mov.d %[ftmp4], %[ftmp1] \n\t"
880 "paddh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
881 "psubh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
882 "mov.d %[ftmp4], %[ftmp3] \n\t"
883 "paddh %[ftmp3], %[ftmp3], %[ftmp1] \n\t"
884 "psubh %[ftmp1], %[ftmp1], %[ftmp4] \n\t"
885 "mov.d %[ftmp4], %[ftmp2] \n\t"
886 "paddh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
887 "psubh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
888 "mov.d %[ftmp4], %[ftmp3] \n\t"
889 "punpcklhw %[ftmp3], %[ftmp3], %[ftmp1] \n\t"
890 "punpckhhw %[ftmp4], %[ftmp4], %[ftmp1] \n\t"
891 "punpckhhw %[ftmp1], %[ftmp0], %[ftmp2] \n\t"
892 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
893 "punpckhwd %[ftmp2], %[ftmp3], %[ftmp0] \n\t"
894 "punpcklwd %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
895 "mov.d %[ftmp0], %[ftmp4] \n\t"
896 "punpcklwd %[ftmp4], %[ftmp4], %[ftmp1] \n\t"
897 "punpckhwd %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
898 "mov.d %[ftmp1], %[ftmp0] \n\t"
899 "paddh %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
900 "psubh %[ftmp4], %[ftmp4], %[ftmp1] \n\t"
901 "mov.d %[ftmp1], %[ftmp2] \n\t"
902 "paddh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
903 "psubh %[ftmp3], %[ftmp3], %[ftmp1] \n\t"
904 "mov.d %[ftmp1], %[ftmp0] \n\t"
905 "paddh %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
906 "psubh %[ftmp2], %[ftmp2], %[ftmp1] \n\t"
907 "mov.d %[ftmp1], %[ftmp4] \n\t"
908 "daddi %[tmp0], %[qmul], -0x7fff \n\t"
909 "paddh %[ftmp4], %[ftmp4], %[ftmp3] \n\t"
910 "bgtz %[tmp0], 1f \n\t"
911 "psubh %[ftmp3], %[ftmp3], %[ftmp1] \n\t"
912 "ori %[tmp0], $0, 0x80 \n\t"
913 "dsll %[tmp0], %[tmp0], 0x10 \n\t"
914 "punpckhhw %[ftmp1], %[ftmp0], %[ff_pw_1] \n\t"
915 "daddu %[qmul], %[qmul], %[tmp0] \n\t"
916 "punpcklhw %[ftmp0], %[ftmp0], %[ff_pw_1] \n\t"
917 "punpckhhw %[ftmp5], %[ftmp2], %[ff_pw_1] \n\t"
918 "punpcklhw %[ftmp2], %[ftmp2], %[ff_pw_1] \n\t"
919 "mtc1 %[qmul], %[ftmp7] \n\t"
920 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
921 "pmaddhw %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
922 "pmaddhw %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
923 "pmaddhw %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
924 "pmaddhw %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
925 "psraw %[ftmp0], %[ftmp0], %[ftmp8] \n\t"
926 "psraw %[ftmp2], %[ftmp2], %[ftmp8] \n\t"
927 "psraw %[ftmp1], %[ftmp1], %[ftmp8] \n\t"
928 "psraw %[ftmp5], %[ftmp5], %[ftmp8] \n\t"
929 "packsswh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
930 "packsswh %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
931 "dmfc1 %[tmp1], %[ftmp0] \n\t"
932 "dsrl %[ftmp0], %[ftmp0], %[ftmp9] \n\t"
933 "mfc1 %[input], %[ftmp0] \n\t"
934 "sh %[tmp1], 0x00(%[output]) \n\t"
935 "sh %[input], 0x80(%[output]) \n\t"
936 "dsrl %[tmp1], %[tmp1], 0x10 \n\t"
937 PTR_SRL "%[input], %[input], 0x10 \n\t"
938 "sh %[tmp1], 0x20(%[output]) \n\t"
939 "sh %[input], 0xa0(%[output]) \n\t"
940 "dmfc1 %[tmp1], %[ftmp2] \n\t"
941 "dsrl %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
942 "mfc1 %[input], %[ftmp2] \n\t"
943 "sh %[tmp1], 0x40(%[output]) \n\t"
944 "sh %[input], 0xc0(%[output]) \n\t"
945 "dsrl %[tmp1], %[tmp1], 0x10 \n\t"
946 PTR_SRL "%[input], %[input], 0x10 \n\t"
947 "sh %[tmp1], 0x60(%[output]) \n\t"
948 "sh %[input], 0xe0(%[output]) \n\t"
949 "punpckhhw %[ftmp1], %[ftmp3], %[ff_pw_1] \n\t"
950 "punpcklhw %[ftmp3], %[ftmp3], %[ff_pw_1] \n\t"
951 "punpckhhw %[ftmp5], %[ftmp4], %[ff_pw_1] \n\t"
952 "punpcklhw %[ftmp4], %[ftmp4], %[ff_pw_1] \n\t"
953 "mtc1 %[qmul], %[ftmp7] \n\t"
954 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
955 "pmaddhw %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
956 "pmaddhw %[ftmp4], %[ftmp4], %[ftmp7] \n\t"
957 "pmaddhw %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
958 "pmaddhw %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
959 "psraw %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
960 "psraw %[ftmp4], %[ftmp4], %[ftmp8] \n\t"
961 "psraw %[ftmp1], %[ftmp1], %[ftmp8] \n\t"
962 "psraw %[ftmp5], %[ftmp5], %[ftmp8] \n\t"
963 "packsswh %[ftmp3], %[ftmp3], %[ftmp1] \n\t"
964 "packsswh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
965 "dmfc1 %[tmp1], %[ftmp3] \n\t"
966 "dsrl %[ftmp3], %[ftmp3], %[ftmp9] \n\t"
967 "mfc1 %[input], %[ftmp3] \n\t"
968 "sh %[tmp1], 0x100(%[output]) \n\t"
969 "sh %[input], 0x180(%[output]) \n\t"
970 "dsrl %[tmp1], %[tmp1], 0x10 \n\t"
971 PTR_SRL "%[input], %[input], 0x10 \n\t"
972 "sh %[tmp1], 0x120(%[output]) \n\t"
973 "sh %[input], 0x1a0(%[output]) \n\t"
974 "dmfc1 %[tmp1], %[ftmp4] \n\t"
975 "dsrl %[ftmp4], %[ftmp4], %[ftmp9] \n\t"
976 "mfc1 %[input], %[ftmp4] \n\t"
977 "sh %[tmp1], 0x140(%[output]) \n\t"
978 "sh %[input], 0x1c0(%[output]) \n\t"
979 "dsrl %[tmp1], %[tmp1], 0x10 \n\t"
980 PTR_SRL "%[input], %[input], 0x10 \n\t"
981 "sh %[tmp1], 0x160(%[output]) \n\t"
982 "j 2f \n\t"
983 "sh %[input], 0x1e0(%[output]) \n\t"
984 "1: \n\t"
985 "ori %[tmp0], $0, 0x1f \n\t"
986 #if HAVE_LOONGSON3
987 "clz %[tmp1], %[qmul] \n\t"
988 #elif HAVE_LOONGSON2
989 #endif
990 "ori %[input], $0, 0x07 \n\t"
991 "dsubu %[tmp1], %[tmp0], %[tmp1] \n\t"
992 "ori %[tmp0], $0, 0x80 \n\t"
993 "dsll %[tmp0], %[tmp0], 0x10 \n\t"
994 "daddu %[qmul], %[qmul], %[tmp0] \n\t"
995 "dsubu %[tmp0], %[tmp1], %[input] \n\t"
996 "movn %[tmp1], %[input], %[tmp0] \n\t"
997 PTR_ADDIU "%[input], %[input], 0x01 \n\t"
998 "andi %[tmp0], %[tmp1], 0xff \n\t"
999 "srlv %[qmul], %[qmul], %[tmp0] \n\t"
1000 PTR_SUBU "%[input], %[input], %[tmp1] \n\t"
1001 "mtc1 %[input], %[ftmp6] \n\t"
1002 "punpckhhw %[ftmp1], %[ftmp0], %[ff_pw_1] \n\t"
1003 "punpcklhw %[ftmp0], %[ftmp0], %[ff_pw_1] \n\t"
1004 "punpckhhw %[ftmp5], %[ftmp2], %[ff_pw_1] \n\t"
1005 "punpcklhw %[ftmp2], %[ftmp2], %[ff_pw_1] \n\t"
1006 "mtc1 %[qmul], %[ftmp7] \n\t"
1007 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
1008 "pmaddhw %[ftmp0], %[ftmp0], %[ftmp7] \n\t"
1009 "pmaddhw %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
1010 "pmaddhw %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
1011 "pmaddhw %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1012 "psraw %[ftmp0], %[ftmp0], %[ftmp6] \n\t"
1013 "psraw %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
1014 "psraw %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
1015 "psraw %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1016 "packsswh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
1017 "packsswh %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
1018 "dmfc1 %[tmp1], %[ftmp0] \n\t"
1019 "dsrl %[ftmp0], %[ftmp0], %[ftmp9] \n\t"
1020 "sh %[tmp1], 0x00(%[output]) \n\t"
1021 "mfc1 %[input], %[ftmp0] \n\t"
1022 "dsrl %[tmp1], %[tmp1], 0x10 \n\t"
1023 "sh %[input], 0x80(%[output]) \n\t"
1024 "sh %[tmp1], 0x20(%[output]) \n\t"
1025 PTR_SRL "%[input], %[input], 0x10 \n\t"
1026 "dmfc1 %[tmp1], %[ftmp2] \n\t"
1027 "sh %[input], 0xa0(%[output]) \n\t"
1028 "dsrl %[ftmp2], %[ftmp2], %[ftmp9] \n\t"
1029 "sh %[tmp1], 0x40(%[output]) \n\t"
1030 "mfc1 %[input], %[ftmp2] \n\t"
1031 "dsrl %[tmp1], %[tmp1], 0x10 \n\t"
1032 "sh %[input], 0xc0(%[output]) \n\t"
1033 "sh %[tmp1], 0x60(%[output]) \n\t"
1034 PTR_SRL "%[input], %[input], 0x10 \n\t"
1035 "sh %[input], 0xe0(%[output]) \n\t"
1036 "punpckhhw %[ftmp1], %[ftmp3], %[ff_pw_1] \n\t"
1037 "punpcklhw %[ftmp3], %[ftmp3], %[ff_pw_1] \n\t"
1038 "punpckhhw %[ftmp5], %[ftmp4], %[ff_pw_1] \n\t"
1039 "punpcklhw %[ftmp4], %[ftmp4], %[ff_pw_1] \n\t"
1040 "mtc1 %[qmul], %[ftmp7] \n\t"
1041 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
1042 "pmaddhw %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
1043 "pmaddhw %[ftmp4], %[ftmp4], %[ftmp7] \n\t"
1044 "pmaddhw %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
1045 "pmaddhw %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1046 "psraw %[ftmp3], %[ftmp3], %[ftmp6] \n\t"
1047 "psraw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
1048 "psraw %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
1049 "psraw %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1050 "packsswh %[ftmp3], %[ftmp3], %[ftmp1] \n\t"
1051 "packsswh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
1052 "dmfc1 %[tmp1], %[ftmp3] \n\t"
1053 "dsrl %[ftmp3], %[ftmp3], %[ftmp9] \n\t"
1054 "mfc1 %[input], %[ftmp3] \n\t"
1055 "sh %[tmp1], 0x100(%[output]) \n\t"
1056 "sh %[input], 0x180(%[output]) \n\t"
1057 "dsrl %[tmp1], %[tmp1], 0x10 \n\t"
1058 PTR_SRL "%[input], %[input], 0x10 \n\t"
1059 "sh %[tmp1], 0x120(%[output]) \n\t"
1060 "sh %[input], 0x1a0(%[output]) \n\t"
1061 "dmfc1 %[tmp1], %[ftmp4] \n\t"
1062 "dsrl %[ftmp4], %[ftmp4], %[ftmp9] \n\t"
1063 "mfc1 %[input], %[ftmp4] \n\t"
1064 "sh %[tmp1], 0x140(%[output]) \n\t"
1065 "sh %[input], 0x1c0(%[output]) \n\t"
1066 "dsrl %[tmp1], %[tmp1], 0x10 \n\t"
1067 PTR_SRL "%[input], %[input], 0x10 \n\t"
1068 "sh %[tmp1], 0x160(%[output]) \n\t"
1069 "sh %[input], 0x1e0(%[output]) \n\t"
1070 "2: \n\t"
1071 ".set reorder \n\t"
1072 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1073 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1074 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
1075 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
1076 [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),
1077 [tmp0]"=&r"(tmp[0]), [tmp1]"=&r"(tmp[1]),
1078 RESTRICT_ASM_ALL64
1079 [output]"+&r"(output), [input]"+&r"(input),
1080 [qmul]"+&r"(qmul)
1081 : [ff_pw_1]"f"(ff_pw_1)
1082 : "memory"
1083 );
1084 }
1085
ff_h264_chroma422_dc_dequant_idct_8_mmi(int16_t * block,int qmul)1086 void ff_h264_chroma422_dc_dequant_idct_8_mmi(int16_t *block, int qmul)
1087 {
1088 int temp[8];
1089 int t[8];
1090
1091 temp[0] = block[0] + block[16];
1092 temp[1] = block[0] - block[16];
1093 temp[2] = block[32] + block[48];
1094 temp[3] = block[32] - block[48];
1095 temp[4] = block[64] + block[80];
1096 temp[5] = block[64] - block[80];
1097 temp[6] = block[96] + block[112];
1098 temp[7] = block[96] - block[112];
1099
1100 t[0] = temp[0] + temp[4] + temp[2] + temp[6];
1101 t[1] = temp[0] - temp[4] + temp[2] - temp[6];
1102 t[2] = temp[0] - temp[4] - temp[2] + temp[6];
1103 t[3] = temp[0] + temp[4] - temp[2] - temp[6];
1104 t[4] = temp[1] + temp[5] + temp[3] + temp[7];
1105 t[5] = temp[1] - temp[5] + temp[3] - temp[7];
1106 t[6] = temp[1] - temp[5] - temp[3] + temp[7];
1107 t[7] = temp[1] + temp[5] - temp[3] - temp[7];
1108
1109 block[ 0]= (t[0]*qmul + 128) >> 8;
1110 block[ 32]= (t[1]*qmul + 128) >> 8;
1111 block[ 64]= (t[2]*qmul + 128) >> 8;
1112 block[ 96]= (t[3]*qmul + 128) >> 8;
1113 block[ 16]= (t[4]*qmul + 128) >> 8;
1114 block[ 48]= (t[5]*qmul + 128) >> 8;
1115 block[ 80]= (t[6]*qmul + 128) >> 8;
1116 block[112]= (t[7]*qmul + 128) >> 8;
1117 }
1118
ff_h264_chroma_dc_dequant_idct_8_mmi(int16_t * block,int qmul)1119 void ff_h264_chroma_dc_dequant_idct_8_mmi(int16_t *block, int qmul)
1120 {
1121 int a,b,c,d;
1122
1123 d = block[0] - block[16];
1124 a = block[0] + block[16];
1125 b = block[32] - block[48];
1126 c = block[32] + block[48];
1127 block[0] = ((a+c)*qmul) >> 7;
1128 block[16]= ((d+b)*qmul) >> 7;
1129 block[32]= ((a-c)*qmul) >> 7;
1130 block[48]= ((d-b)*qmul) >> 7;
1131 }
1132
ff_h264_weight_pixels16_8_mmi(uint8_t * block,ptrdiff_t stride,int height,int log2_denom,int weight,int offset)1133 void ff_h264_weight_pixels16_8_mmi(uint8_t *block, ptrdiff_t stride, int height,
1134 int log2_denom, int weight, int offset)
1135 {
1136 int y;
1137 double ftmp[8];
1138 DECLARE_VAR_ALL64;
1139
1140 offset <<= log2_denom;
1141
1142 if (log2_denom)
1143 offset += 1 << (log2_denom - 1);
1144
1145 for (y=0; y<height; y++, block+=stride) {
1146 __asm__ volatile (
1147 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1148 MMI_LDC1(%[ftmp1], %[block0], 0x00)
1149 MMI_LDC1(%[ftmp2], %[block1], 0x00)
1150 "mtc1 %[weight], %[ftmp3] \n\t"
1151 "mtc1 %[offset], %[ftmp4] \n\t"
1152 "mtc1 %[log2_denom], %[ftmp5] \n\t"
1153 "pshufh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
1154 "pshufh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
1155 "punpckhbh %[ftmp6], %[ftmp1], %[ftmp0] \n\t"
1156 "punpckhbh %[ftmp7], %[ftmp2], %[ftmp0] \n\t"
1157 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
1158 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
1159 "pmullh %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
1160 "pmullh %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
1161 "pmullh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
1162 "pmullh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
1163 "paddsh %[ftmp6], %[ftmp6], %[ftmp4] \n\t"
1164 "paddsh %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
1165 "paddsh %[ftmp1], %[ftmp1], %[ftmp4] \n\t"
1166 "paddsh %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
1167 "psrah %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
1168 "psrah %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
1169 "psrah %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
1170 "psrah %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
1171 "packushb %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
1172 "packushb %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
1173 MMI_SDC1(%[ftmp1], %[block0], 0x00)
1174 MMI_SDC1(%[ftmp2], %[block1], 0x00)
1175 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1176 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1177 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
1178 [ftmp6]"=&f"(ftmp[6]),
1179 RESTRICT_ASM_ALL64
1180 [ftmp7]"=&f"(ftmp[7])
1181 : [block0]"r"(block), [block1]"r"(block+8),
1182 [weight]"r"(weight), [offset]"r"(offset),
1183 [log2_denom]"r"(log2_denom)
1184 : "memory"
1185 );
1186 }
1187 }
1188
ff_h264_biweight_pixels16_8_mmi(uint8_t * dst,uint8_t * src,ptrdiff_t stride,int height,int log2_denom,int weightd,int weights,int offset)1189 void ff_h264_biweight_pixels16_8_mmi(uint8_t *dst, uint8_t *src,
1190 ptrdiff_t stride, int height, int log2_denom, int weightd, int weights,
1191 int offset)
1192 {
1193 int y;
1194 double ftmp[9];
1195 DECLARE_VAR_ALL64;
1196
1197 offset = ((offset + 1) | 1) << log2_denom;
1198
1199 for (y=0; y<height; y++, dst+=stride, src+=stride) {
1200 __asm__ volatile (
1201 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1202 MMI_LDC1(%[ftmp1], %[src0], 0x00)
1203 MMI_LDC1(%[ftmp2], %[dst0], 0x00)
1204 "mtc1 %[weights], %[ftmp3] \n\t"
1205 "mtc1 %[weightd], %[ftmp4] \n\t"
1206 "mtc1 %[offset], %[ftmp5] \n\t"
1207 "mtc1 %[log2_denom], %[ftmp6] \n\t"
1208 "pshufh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
1209 "pshufh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
1210 "pshufh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
1211 "punpckhbh %[ftmp7], %[ftmp1], %[ftmp0] \n\t"
1212 "punpckhbh %[ftmp8], %[ftmp2], %[ftmp0] \n\t"
1213 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
1214 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
1215 "pmullh %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
1216 "pmullh %[ftmp8], %[ftmp8], %[ftmp4] \n\t"
1217 "pmullh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
1218 "pmullh %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
1219 "paddsh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
1220 "paddsh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
1221 "paddsh %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1222 "paddsh %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
1223 "psrah %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
1224 "psrah %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
1225 "packushb %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
1226 MMI_SDC1(%[ftmp1], %[dst0], 0x00)
1227 MMI_LDC1(%[ftmp1], %[src1], 0x00)
1228 MMI_LDC1(%[ftmp2], %[dst1], 0x00)
1229 "punpckhbh %[ftmp7], %[ftmp1], %[ftmp0] \n\t"
1230 "punpckhbh %[ftmp8], %[ftmp2], %[ftmp0] \n\t"
1231 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
1232 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
1233 "pmullh %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
1234 "pmullh %[ftmp8], %[ftmp8], %[ftmp4] \n\t"
1235 "pmullh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
1236 "pmullh %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
1237 "paddsh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
1238 "paddsh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
1239 "paddsh %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1240 "paddsh %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
1241 "psrah %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
1242 "psrah %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
1243 "packushb %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
1244 MMI_SDC1(%[ftmp1], %[dst1], 0x00)
1245 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1246 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1247 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
1248 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
1249 RESTRICT_ASM_ALL64
1250 [ftmp8]"=&f"(ftmp[8])
1251 : [dst0]"r"(dst), [dst1]"r"(dst+8),
1252 [src0]"r"(src), [src1]"r"(src+8),
1253 [weights]"r"(weights), [weightd]"r"(weightd),
1254 [offset]"r"(offset), [log2_denom]"r"(log2_denom+1)
1255 : "memory"
1256 );
1257 }
1258 }
1259
ff_h264_weight_pixels8_8_mmi(uint8_t * block,ptrdiff_t stride,int height,int log2_denom,int weight,int offset)1260 void ff_h264_weight_pixels8_8_mmi(uint8_t *block, ptrdiff_t stride, int height,
1261 int log2_denom, int weight, int offset)
1262 {
1263 int y;
1264 double ftmp[6];
1265 DECLARE_VAR_ALL64;
1266
1267 offset <<= log2_denom;
1268
1269 if (log2_denom)
1270 offset += 1 << (log2_denom - 1);
1271
1272 for (y=0; y<height; y++, block+=stride) {
1273 __asm__ volatile (
1274 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1275 MMI_LDC1(%[ftmp1], %[block], 0x00)
1276 "mtc1 %[weight], %[ftmp2] \n\t"
1277 "mtc1 %[offset], %[ftmp3] \n\t"
1278 "mtc1 %[log2_denom], %[ftmp5] \n\t"
1279 "pshufh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
1280 "pshufh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
1281 "punpckhbh %[ftmp4], %[ftmp1], %[ftmp0] \n\t"
1282 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
1283 "pmullh %[ftmp4], %[ftmp4], %[ftmp2] \n\t"
1284 "pmullh %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
1285 "paddsh %[ftmp4], %[ftmp4], %[ftmp3] \n\t"
1286 "paddsh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
1287 "psrah %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
1288 "psrah %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
1289 "packushb %[ftmp1], %[ftmp1], %[ftmp4] \n\t"
1290 MMI_SDC1(%[ftmp1], %[block], 0x00)
1291 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1292 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1293 [ftmp4]"=&f"(ftmp[4]),
1294 RESTRICT_ASM_ALL64
1295 [ftmp5]"=&f"(ftmp[5])
1296 : [block]"r"(block), [weight]"r"(weight),
1297 [offset]"r"(offset), [log2_denom]"r"(log2_denom)
1298 : "memory"
1299 );
1300 }
1301 }
1302
ff_h264_biweight_pixels8_8_mmi(uint8_t * dst,uint8_t * src,ptrdiff_t stride,int height,int log2_denom,int weightd,int weights,int offset)1303 void ff_h264_biweight_pixels8_8_mmi(uint8_t *dst, uint8_t *src,
1304 ptrdiff_t stride, int height, int log2_denom, int weightd, int weights,
1305 int offset)
1306 {
1307 int y;
1308 double ftmp[9];
1309 DECLARE_VAR_ALL64;
1310
1311 offset = ((offset + 1) | 1) << log2_denom;
1312
1313 for (y=0; y<height; y++, dst+=stride, src+=stride) {
1314 __asm__ volatile (
1315 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1316 MMI_LDC1(%[ftmp1], %[src], 0x00)
1317 MMI_LDC1(%[ftmp2], %[dst], 0x00)
1318 "mtc1 %[weights], %[ftmp3] \n\t"
1319 "mtc1 %[weightd], %[ftmp4] \n\t"
1320 "mtc1 %[offset], %[ftmp5] \n\t"
1321 "mtc1 %[log2_denom], %[ftmp6] \n\t"
1322 "pshufh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
1323 "pshufh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
1324 "pshufh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
1325 "punpckhbh %[ftmp7], %[ftmp1], %[ftmp0] \n\t"
1326 "punpckhbh %[ftmp8], %[ftmp2], %[ftmp0] \n\t"
1327 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
1328 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
1329 "pmullh %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
1330 "pmullh %[ftmp8], %[ftmp8], %[ftmp4] \n\t"
1331 "pmullh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
1332 "pmullh %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
1333 "paddsh %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
1334 "paddsh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
1335 "paddsh %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1336 "paddsh %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
1337 "psrah %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
1338 "psrah %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
1339 "packushb %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
1340 MMI_SDC1(%[ftmp1], %[dst], 0x00)
1341 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1342 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1343 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
1344 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
1345 RESTRICT_ASM_ALL64
1346 [ftmp8]"=&f"(ftmp[8])
1347 : [dst]"r"(dst), [src]"r"(src),
1348 [weights]"r"(weights), [weightd]"r"(weightd),
1349 [offset]"r"(offset), [log2_denom]"r"(log2_denom+1)
1350 : "memory"
1351 );
1352 }
1353 }
1354
ff_h264_weight_pixels4_8_mmi(uint8_t * block,ptrdiff_t stride,int height,int log2_denom,int weight,int offset)1355 void ff_h264_weight_pixels4_8_mmi(uint8_t *block, ptrdiff_t stride, int height,
1356 int log2_denom, int weight, int offset)
1357 {
1358 int y;
1359 double ftmp[5];
1360 DECLARE_VAR_LOW32;
1361
1362 offset <<= log2_denom;
1363
1364 if (log2_denom)
1365 offset += 1 << (log2_denom - 1);
1366
1367 for (y=0; y<height; y++, block+=stride) {
1368 __asm__ volatile (
1369 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1370 MMI_ULWC1(%[ftmp1], %[block], 0x00)
1371 "mtc1 %[weight], %[ftmp2] \n\t"
1372 "mtc1 %[offset], %[ftmp3] \n\t"
1373 "mtc1 %[log2_denom], %[ftmp4] \n\t"
1374 "pshufh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
1375 "pshufh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
1376 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
1377 "pmullh %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
1378 "paddsh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
1379 "psrah %[ftmp1], %[ftmp1], %[ftmp4] \n\t"
1380 "packushb %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
1381 MMI_SWC1(%[ftmp1], %[block], 0x00)
1382 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1383 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1384 RESTRICT_ASM_LOW32
1385 [ftmp4]"=&f"(ftmp[4])
1386 : [block]"r"(block), [weight]"r"(weight),
1387 [offset]"r"(offset), [log2_denom]"r"(log2_denom)
1388 : "memory"
1389 );
1390 }
1391 }
1392
ff_h264_biweight_pixels4_8_mmi(uint8_t * dst,uint8_t * src,ptrdiff_t stride,int height,int log2_denom,int weightd,int weights,int offset)1393 void ff_h264_biweight_pixels4_8_mmi(uint8_t *dst, uint8_t *src,
1394 ptrdiff_t stride, int height, int log2_denom, int weightd, int weights,
1395 int offset)
1396 {
1397 int y;
1398 double ftmp[7];
1399 DECLARE_VAR_LOW32;
1400
1401 offset = ((offset + 1) | 1) << log2_denom;
1402
1403 for (y=0; y<height; y++, dst+=stride, src+=stride) {
1404 __asm__ volatile (
1405 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1406 MMI_ULWC1(%[ftmp1], %[src], 0x00)
1407 MMI_ULWC1(%[ftmp2], %[dst], 0x00)
1408 "mtc1 %[weight], %[ftmp3] \n\t"
1409 "mtc1 %[weightd], %[ftmp4] \n\t"
1410 "mtc1 %[offset], %[ftmp5] \n\t"
1411 "mtc1 %[log2_denom], %[ftmp6] \n\t"
1412 "pshufh %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
1413 "pshufh %[ftmp4], %[ftmp4], %[ftmp0] \n\t"
1414 "pshufh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
1415 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
1416 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
1417 "pmullh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
1418 "pmullh %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
1419 "paddsh %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
1420 "paddsh %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
1421 "psrah %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
1422 "packushb %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
1423 MMI_SWC1(%[ftmp1], %[dst], 0x00)
1424 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1425 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1426 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
1427 RESTRICT_ASM_LOW32
1428 [ftmp6]"=&f"(ftmp[6])
1429 : [dst]"r"(dst), [src]"r"(src),
1430 [weight]"r"(weights), [weightd]"r"(weightd),
1431 [offset]"r"(offset), [log2_denom]"r"(log2_denom+1)
1432 : "memory"
1433 );
1434 }
1435 }
1436
ff_deblock_v8_luma_8_mmi(uint8_t * pix,ptrdiff_t stride,int alpha,int beta,int8_t * tc0)1437 void ff_deblock_v8_luma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
1438 int8_t *tc0)
1439 {
1440 double ftmp[12];
1441 mips_reg addr[2];
1442 DECLARE_VAR_LOW32;
1443 DECLARE_VAR_ALL64;
1444 DECLARE_VAR_ADDRT;
1445
1446 __asm__ volatile (
1447 PTR_ADDU "%[addr0], %[stride], %[stride] \n\t"
1448 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1449 PTR_ADDU "%[addr1], %[stride], %[addr0] \n\t"
1450 "addi %[alpha], %[alpha], -0x01 \n\t"
1451 PTR_SUBU "%[addr1], $0, %[addr1] \n\t"
1452 "addi %[beta], %[beta], -0x01 \n\t"
1453 PTR_ADDU "%[addr1], %[addr1], %[pix] \n\t"
1454 MMI_LDC1(%[ftmp3], %[pix], 0x00)
1455 MMI_LDXC1(%[ftmp1], %[addr1], %[stride], 0x00)
1456 MMI_LDXC1(%[ftmp2], %[addr1], %[addr0], 0x00)
1457 MMI_LDXC1(%[ftmp4], %[pix], %[stride], 0x00)
1458 "mtc1 %[alpha], %[ftmp5] \n\t"
1459 "mtc1 %[beta], %[ftmp6] \n\t"
1460 "pshufh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
1461 "pshufh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
1462 "packushb %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
1463 "packushb %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
1464 "psubusb %[ftmp7], %[ftmp3], %[ftmp2] \n\t"
1465 "psubusb %[ftmp8], %[ftmp2], %[ftmp3] \n\t"
1466 "or %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1467 "psubusb %[ftmp7], %[ftmp2], %[ftmp1] \n\t"
1468 "psubusb %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1469 "psubusb %[ftmp5], %[ftmp1], %[ftmp2] \n\t"
1470 "or %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1471 "psubusb %[ftmp7], %[ftmp3], %[ftmp4] \n\t"
1472 "psubusb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1473 "or %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1474 "psubusb %[ftmp5], %[ftmp4], %[ftmp3] \n\t"
1475 "or %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1476 "psubusb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1477 "or %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1478 "pcmpeqb %[ftmp8], %[ftmp8], %[ftmp0] \n\t"
1479 "pcmpeqb %[ftmp4], %[ftmp4], %[ftmp4] \n\t"
1480 MMI_ULWC1(%[ftmp5], %[tc0], 0x00)
1481 "punpcklbh %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
1482 "punpcklbh %[ftmp9], %[ftmp5], %[ftmp5] \n\t"
1483 "pcmpgtb %[ftmp5], %[ftmp9], %[ftmp4] \n\t"
1484 MMI_LDC1(%[ftmp4], %[addr1], 0x00)
1485 "and %[ftmp10], %[ftmp5], %[ftmp8] \n\t"
1486 "psubusb %[ftmp8], %[ftmp4], %[ftmp2] \n\t"
1487 "psubusb %[ftmp7], %[ftmp2], %[ftmp4] \n\t"
1488 "psubusb %[ftmp8], %[ftmp8], %[ftmp6] \n\t"
1489 "psubusb %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
1490 "pcmpeqb %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1491 "and %[ftmp7], %[ftmp7], %[ftmp10] \n\t"
1492 "and %[ftmp5], %[ftmp10], %[ftmp9] \n\t"
1493 "psubb %[ftmp8], %[ftmp5], %[ftmp7] \n\t"
1494 "and %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
1495 "pavgb %[ftmp5], %[ftmp2], %[ftmp3] \n\t"
1496 MMI_LDC1(%[ftmp11], %[addr1], 0x00)
1497 "pavgb %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
1498 "xor %[ftmp5], %[ftmp5], %[ftmp11] \n\t"
1499 "and %[ftmp5], %[ftmp5], %[ff_pb_1] \n\t"
1500 "psubusb %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
1501 "psubusb %[ftmp5], %[ftmp1], %[ftmp7] \n\t"
1502 "paddusb %[ftmp7], %[ftmp7], %[ftmp1] \n\t"
1503 "pmaxub %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
1504 "pminub %[ftmp4], %[ftmp4], %[ftmp7] \n\t"
1505 MMI_SDXC1(%[ftmp4], %[addr1], %[stride], 0x00)
1506 MMI_LDXC1(%[ftmp5], %[pix], %[addr0], 0x00)
1507 "psubusb %[ftmp4], %[ftmp5], %[ftmp3] \n\t"
1508 "psubusb %[ftmp7], %[ftmp3], %[ftmp5] \n\t"
1509 "psubusb %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
1510 "psubusb %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
1511 "pcmpeqb %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
1512 "and %[ftmp7], %[ftmp7], %[ftmp10] \n\t"
1513 "psubb %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1514 "and %[ftmp6], %[ftmp9], %[ftmp7] \n\t"
1515 MMI_LDXC1(%[ftmp4], %[pix], %[stride], 0x00)
1516 "pavgb %[ftmp7], %[ftmp2], %[ftmp3] \n\t"
1517 MMI_LDXC1(%[ftmp11], %[pix], %[addr0], 0x00)
1518 "pavgb %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1519 "xor %[ftmp7], %[ftmp7], %[ftmp11] \n\t"
1520 "and %[ftmp7], %[ftmp7], %[ff_pb_1] \n\t"
1521 "psubusb %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1522 "psubusb %[ftmp7], %[ftmp4], %[ftmp6] \n\t"
1523 "paddusb %[ftmp6], %[ftmp6], %[ftmp4] \n\t"
1524 "pmaxub %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1525 "pminub %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1526 MMI_SDXC1(%[ftmp5], %[pix], %[stride], 0x00)
1527 "xor %[ftmp6], %[ftmp2], %[ftmp3] \n\t"
1528 "pcmpeqb %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
1529 "and %[ftmp6], %[ftmp6], %[ff_pb_1] \n\t"
1530 "xor %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
1531 "xor %[ftmp5], %[ftmp5], %[ftmp2] \n\t"
1532 "pavgb %[ftmp4], %[ftmp4], %[ftmp1] \n\t"
1533 "pavgb %[ftmp4], %[ftmp4], %[ff_pb_3] \n\t"
1534 "pavgb %[ftmp5], %[ftmp5], %[ftmp3] \n\t"
1535 "pavgb %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
1536 "paddusb %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
1537 "psubusb %[ftmp7], %[ff_pb_A1], %[ftmp4] \n\t"
1538 "psubusb %[ftmp4], %[ftmp4], %[ff_pb_A1] \n\t"
1539 "pminub %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1540 "pminub %[ftmp4], %[ftmp4], %[ftmp8] \n\t"
1541 "psubusb %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
1542 "psubusb %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
1543 "paddusb %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
1544 "paddusb %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
1545 MMI_SDXC1(%[ftmp2], %[addr1], %[addr0], 0x00)
1546 MMI_SDC1(%[ftmp3], %[pix], 0x00)
1547 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1548 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1549 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
1550 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
1551 [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),
1552 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
1553 RESTRICT_ASM_LOW32
1554 RESTRICT_ASM_ALL64
1555 RESTRICT_ASM_ADDRT
1556 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1])
1557 : [pix]"r"(pix), [stride]"r"((mips_reg)stride),
1558 [alpha]"r"((mips_reg)alpha), [beta]"r"((mips_reg)beta),
1559 [tc0]"r"(tc0), [ff_pb_1]"f"(ff_pb_1),
1560 [ff_pb_3]"f"(ff_pb_3), [ff_pb_A1]"f"(ff_pb_A1)
1561 : "memory"
1562 );
1563 }
1564
deblock_v8_luma_intra_8_mmi(uint8_t * pix,ptrdiff_t stride,int alpha,int beta)1565 static void deblock_v8_luma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
1566 int beta)
1567 {
1568 DECLARE_ALIGNED(8, const uint64_t, stack[0x0a]);
1569 double ftmp[16];
1570 uint64_t tmp[1];
1571 mips_reg addr[3];
1572 DECLARE_VAR_ALL64;
1573 DECLARE_VAR_ADDRT;
1574
1575 __asm__ volatile (
1576 "ori %[tmp0], $0, 0x01 \n\t"
1577 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1578 "mtc1 %[tmp0], %[ftmp9] \n\t"
1579 PTR_SLL "%[addr0], %[stride], 0x02 \n\t"
1580 PTR_ADDU "%[addr2], %[stride], %[stride] \n\t"
1581 PTR_ADDIU "%[alpha], %[alpha], -0x01 \n\t"
1582 PTR_SLL "%[ftmp11], %[ftmp9], %[ftmp9] \n\t"
1583 "bltz %[alpha], 1f \n\t"
1584 PTR_ADDU "%[addr1], %[addr2], %[stride] \n\t"
1585 PTR_ADDIU "%[beta], %[beta], -0x01 \n\t"
1586 "bltz %[beta], 1f \n\t"
1587 PTR_SUBU "%[addr0], $0, %[addr0] \n\t"
1588 PTR_ADDU "%[addr0], %[addr0], %[pix] \n\t"
1589 MMI_LDC1(%[ftmp3], %[pix], 0x00)
1590 MMI_LDXC1(%[ftmp1], %[addr0], %[addr2], 0x00)
1591 MMI_LDXC1(%[ftmp2], %[addr0], %[addr1], 0x00)
1592 MMI_LDXC1(%[ftmp4], %[pix], %[stride], 0x00)
1593 "mtc1 %[alpha], %[ftmp5] \n\t"
1594 "mtc1 %[beta], %[ftmp6] \n\t"
1595 "pshufh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
1596 "pshufh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
1597 "packushb %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
1598 "psubusb %[ftmp7], %[ftmp3], %[ftmp2] \n\t"
1599 "psubusb %[ftmp8], %[ftmp2], %[ftmp3] \n\t"
1600 "packushb %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
1601 "or %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1602 MMI_SDC1(%[ftmp5], %[stack], 0x10)
1603 "psubusb %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1604 "psubusb %[ftmp7], %[ftmp2], %[ftmp1] \n\t"
1605 "psubusb %[ftmp5], %[ftmp1], %[ftmp2] \n\t"
1606 "or %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1607 "psubusb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1608 "or %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1609 "psubusb %[ftmp7], %[ftmp3], %[ftmp4] \n\t"
1610 "psubusb %[ftmp5], %[ftmp4], %[ftmp3] \n\t"
1611 "or %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1612 "psubusb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1613 "or %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1614 "xor %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
1615 MMI_LDC1(%[ftmp5], %[stack], 0x10)
1616 "pcmpeqb %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1617 "ldc1 %[ftmp10], %[ff_pb_1] \n\t"
1618 MMI_SDC1(%[ftmp8], %[stack], 0x20)
1619 "pavgb %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
1620 "psubusb %[ftmp8], %[ftmp3], %[ftmp2] \n\t"
1621 "pavgb %[ftmp5], %[ftmp5], %[ftmp10] \n\t"
1622 "psubusb %[ftmp7], %[ftmp2], %[ftmp3] \n\t"
1623 "psubusb %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1624 "psubusb %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
1625 MMI_LDC1(%[ftmp15], %[stack], 0x20)
1626 "pcmpeqb %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1627 "and %[ftmp7], %[ftmp7], %[ftmp15] \n\t"
1628 MMI_LDXC1(%[ftmp15], %[addr0], %[stride], 0x00)
1629 "psubusb %[ftmp8], %[ftmp15], %[ftmp2] \n\t"
1630 "psubusb %[ftmp5], %[ftmp2], %[ftmp15] \n\t"
1631 "psubusb %[ftmp8], %[ftmp8], %[ftmp6] \n\t"
1632 "psubusb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1633 "pcmpeqb %[ftmp5], %[ftmp5], %[ftmp8] \n\t"
1634 "and %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1635 MMI_LDXC1(%[ftmp14], %[pix], %[addr2], 0x00)
1636 MMI_SDC1(%[ftmp5], %[stack], 0x30)
1637 "psubusb %[ftmp8], %[ftmp14], %[ftmp3] \n\t"
1638 "psubusb %[ftmp5], %[ftmp3], %[ftmp14] \n\t"
1639 "psubusb %[ftmp8], %[ftmp8], %[ftmp6] \n\t"
1640 "psubusb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1641 "pcmpeqb %[ftmp5], %[ftmp5], %[ftmp8] \n\t"
1642 "and %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1643 MMI_SDC1(%[ftmp5], %[stack], 0x40)
1644 "pavgb %[ftmp5], %[ftmp15], %[ftmp1] \n\t"
1645 "pavgb %[ftmp6], %[ftmp2], %[ftmp3] \n\t"
1646 "pavgb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1647 MMI_SDC1(%[ftmp6], %[stack], 0x10)
1648 "paddb %[ftmp7], %[ftmp15], %[ftmp1] \n\t"
1649 "paddb %[ftmp8], %[ftmp2], %[ftmp3] \n\t"
1650 "paddb %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1651 "mov.d %[ftmp8], %[ftmp7] \n\t"
1652 MMI_SDC1(%[ftmp7], %[stack], 0x00)
1653 "psrlh %[ftmp7], %[ftmp7], %[ftmp9] \n\t"
1654 "pavgb %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
1655 "xor %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
1656 "and %[ftmp7], %[ftmp7], %[ftmp10] \n\t"
1657 "psubb %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1658 "pavgb %[ftmp6], %[ftmp15], %[ftmp4] \n\t"
1659 "psubb %[ftmp7], %[ftmp15], %[ftmp4] \n\t"
1660 "paddb %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
1661 "psubb %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1662 "and %[ftmp7], %[ftmp7], %[ftmp10] \n\t"
1663 "psubb %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
1664 MMI_LDC1(%[ftmp13], %[stack], 0x10)
1665 "pavgb %[ftmp6], %[ftmp6], %[ftmp1] \n\t"
1666 "psrlh %[ftmp8], %[ftmp8], %[ftmp11] \n\t"
1667 "pavgb %[ftmp6], %[ftmp6], %[ftmp13] \n\t"
1668 "pavgb %[ftmp8], %[ftmp8], %[ftmp0] \n\t"
1669 "xor %[ftmp8], %[ftmp8], %[ftmp6] \n\t"
1670 "and %[ftmp8], %[ftmp8], %[ftmp10] \n\t"
1671 "psubb %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
1672 "xor %[ftmp8], %[ftmp2], %[ftmp4] \n\t"
1673 "pavgb %[ftmp7], %[ftmp2], %[ftmp4] \n\t"
1674 "and %[ftmp8], %[ftmp8], %[ftmp10] \n\t"
1675 "psubb %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1676 MMI_LDC1(%[ftmp13], %[stack], 0x30)
1677 "pavgb %[ftmp7], %[ftmp7], %[ftmp1] \n\t"
1678 MMI_LDC1(%[ftmp12], %[stack], 0x20)
1679 "xor %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
1680 "xor %[ftmp7], %[ftmp7], %[ftmp2] \n\t"
1681 "and %[ftmp6], %[ftmp6], %[ftmp13] \n\t"
1682 "and %[ftmp7], %[ftmp7], %[ftmp12] \n\t"
1683 "xor %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
1684 "xor %[ftmp6], %[ftmp6], %[ftmp2] \n\t"
1685 MMI_SDXC1(%[ftmp6], %[addr0], %[addr1], 0x00)
1686 MMI_LDC1(%[ftmp6], %[addr0], 0x00)
1687 "paddb %[ftmp7], %[ftmp15], %[ftmp6] \n\t"
1688 "pavgb %[ftmp6], %[ftmp6], %[ftmp15] \n\t"
1689 MMI_LDC1(%[ftmp12], %[stack], 0x00)
1690 "pavgb %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
1691 "paddb %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
1692 "paddb %[ftmp7], %[ftmp7], %[ftmp12] \n\t"
1693 "psrlh %[ftmp7], %[ftmp7], %[ftmp11] \n\t"
1694 "pavgb %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
1695 "xor %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
1696 "and %[ftmp7], %[ftmp7], %[ftmp10] \n\t"
1697 MMI_LDC1(%[ftmp12], %[stack], 0x30)
1698 "psubb %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
1699 "xor %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
1700 "xor %[ftmp6], %[ftmp6], %[ftmp15] \n\t"
1701 "and %[ftmp5], %[ftmp5], %[ftmp12] \n\t"
1702 "and %[ftmp6], %[ftmp6], %[ftmp12] \n\t"
1703 "xor %[ftmp5], %[ftmp5], %[ftmp1] \n\t"
1704 "xor %[ftmp6], %[ftmp6], %[ftmp15] \n\t"
1705 MMI_SDXC1(%[ftmp5], %[addr0], %[addr2], 0x00)
1706 MMI_SDXC1(%[ftmp6], %[addr0], %[stride], 0x00)
1707 "pavgb %[ftmp5], %[ftmp14], %[ftmp4] \n\t"
1708 "pavgb %[ftmp6], %[ftmp3], %[ftmp2] \n\t"
1709 "pavgb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1710 MMI_SDC1(%[ftmp6], %[stack], 0x10)
1711 "paddb %[ftmp7], %[ftmp14], %[ftmp4] \n\t"
1712 "paddb %[ftmp8], %[ftmp3], %[ftmp2] \n\t"
1713 "paddb %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1714 "mov.d %[ftmp8], %[ftmp7] \n\t"
1715 MMI_SDC1(%[ftmp7], %[stack], 0x00)
1716 "psrlh %[ftmp7], %[ftmp7], %[ftmp9] \n\t"
1717 "pavgb %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
1718 "xor %[ftmp7], %[ftmp7], %[ftmp5] \n\t"
1719 "and %[ftmp7], %[ftmp7], %[ftmp10] \n\t"
1720 "psubb %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1721 "pavgb %[ftmp6], %[ftmp14], %[ftmp1] \n\t"
1722 "paddb %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
1723 "psubb %[ftmp7], %[ftmp14], %[ftmp1] \n\t"
1724 "psubb %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1725 "and %[ftmp7], %[ftmp7], %[ftmp10] \n\t"
1726 "psubb %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
1727 MMI_LDC1(%[ftmp12], %[stack], 0x10)
1728 "pavgb %[ftmp6], %[ftmp6], %[ftmp4] \n\t"
1729 "pavgb %[ftmp6], %[ftmp6], %[ftmp12] \n\t"
1730 "psrlh %[ftmp8], %[ftmp8], %[ftmp11] \n\t"
1731 "pavgb %[ftmp8], %[ftmp8], %[ftmp0] \n\t"
1732 "xor %[ftmp8], %[ftmp8], %[ftmp6] \n\t"
1733 "and %[ftmp8], %[ftmp8], %[ftmp10] \n\t"
1734 "psubb %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
1735 "xor %[ftmp8], %[ftmp3], %[ftmp1] \n\t"
1736 "pavgb %[ftmp7], %[ftmp3], %[ftmp1] \n\t"
1737 "and %[ftmp8], %[ftmp8], %[ftmp10] \n\t"
1738 MMI_LDC1(%[ftmp12], %[stack], 0x40)
1739 "psubb %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1740 MMI_LDC1(%[ftmp13], %[stack], 0x20)
1741 "pavgb %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
1742 "xor %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
1743 "xor %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
1744 "and %[ftmp6], %[ftmp6], %[ftmp12] \n\t"
1745 "and %[ftmp7], %[ftmp7], %[ftmp13] \n\t"
1746 "xor %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
1747 "xor %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
1748 MMI_SDC1(%[ftmp6], %[pix], 0x00)
1749 MMI_LDXC1(%[ftmp6], %[pix], %[addr1], 0x00)
1750 "paddb %[ftmp7], %[ftmp14], %[ftmp6] \n\t"
1751 "pavgb %[ftmp6], %[ftmp6], %[ftmp14] \n\t"
1752 MMI_LDC1(%[ftmp12], %[stack], 0x00)
1753 "pavgb %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
1754 "paddb %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
1755 "paddb %[ftmp7], %[ftmp7], %[ftmp12] \n\t"
1756 "psrlh %[ftmp7], %[ftmp7], %[ftmp11] \n\t"
1757 "pavgb %[ftmp7], %[ftmp7], %[ftmp0] \n\t"
1758 "xor %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
1759 "and %[ftmp7], %[ftmp7], %[ftmp10] \n\t"
1760 MMI_LDC1(%[ftmp12], %[stack], 0x40)
1761 "psubb %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
1762 "xor %[ftmp5], %[ftmp5], %[ftmp4] \n\t"
1763 "xor %[ftmp6], %[ftmp6], %[ftmp14] \n\t"
1764 "and %[ftmp5], %[ftmp5], %[ftmp12] \n\t"
1765 "and %[ftmp6], %[ftmp6], %[ftmp12] \n\t"
1766 "xor %[ftmp5], %[ftmp5], %[ftmp4] \n\t"
1767 "xor %[ftmp6], %[ftmp6], %[ftmp14] \n\t"
1768 MMI_SDXC1(%[ftmp5], %[pix], %[stride], 0x00)
1769 MMI_SDXC1(%[ftmp6], %[pix], %[addr2], 0x00)
1770 "1: \n\t"
1771 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1772 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1773 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
1774 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
1775 [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),
1776 [ftmp10]"=&f"(ftmp[10]), [ftmp11]"=&f"(ftmp[11]),
1777 [ftmp12]"=&f"(ftmp[12]), [ftmp13]"=&f"(ftmp[13]),
1778 [ftmp14]"=&f"(ftmp[14]), [ftmp15]"=&f"(ftmp[15]),
1779 [tmp0]"=&r"(tmp[0]),
1780 RESTRICT_ASM_ALL64
1781 RESTRICT_ASM_ADDRT
1782 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
1783 [addr2]"=&r"(addr[2]),
1784 [alpha]"+&r"(alpha), [beta]"+&r"(beta)
1785 : [pix]"r"(pix), [stride]"r"((mips_reg)stride),
1786 [stack]"r"(stack), [ff_pb_1]"m"(ff_pb_1)
1787 : "memory"
1788 );
1789 }
1790
ff_deblock_v_chroma_8_mmi(uint8_t * pix,ptrdiff_t stride,int alpha,int beta,int8_t * tc0)1791 void ff_deblock_v_chroma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
1792 int beta, int8_t *tc0)
1793 {
1794 double ftmp[9];
1795 mips_reg addr[1];
1796 DECLARE_VAR_LOW32;
1797 DECLARE_VAR_ALL64;
1798 DECLARE_VAR_ADDRT;
1799
1800 __asm__ volatile (
1801 "addi %[alpha], %[alpha], -0x01 \n\t"
1802 "addi %[beta], %[beta], -0x01 \n\t"
1803 "or %[addr0], $0, %[pix] \n\t"
1804 PTR_SUBU "%[addr0], %[addr0], %[stride] \n\t"
1805 PTR_SUBU "%[addr0], %[addr0], %[stride] \n\t"
1806 MMI_LDC1(%[ftmp1], %[addr0], 0x00)
1807 MMI_LDXC1(%[ftmp2], %[addr0], %[stride], 0x00)
1808 MMI_LDC1(%[ftmp3], %[pix], 0x00)
1809 MMI_LDXC1(%[ftmp4], %[pix], %[stride], 0x00)
1810
1811 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1812 "mtc1 %[alpha], %[ftmp5] \n\t"
1813 "mtc1 %[beta], %[ftmp6] \n\t"
1814 "pshufh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
1815 "pshufh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
1816 "packushb %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
1817 "packushb %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
1818 "psubusb %[ftmp7], %[ftmp3], %[ftmp2] \n\t"
1819 "psubusb %[ftmp8], %[ftmp2], %[ftmp3] \n\t"
1820 "or %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1821 "psubusb %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1822 "psubusb %[ftmp7], %[ftmp2], %[ftmp1] \n\t"
1823 "psubusb %[ftmp5], %[ftmp1], %[ftmp2] \n\t"
1824 "or %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1825 "psubusb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1826 "or %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1827 "psubusb %[ftmp7], %[ftmp3], %[ftmp4] \n\t"
1828 "psubusb %[ftmp5], %[ftmp4], %[ftmp3] \n\t"
1829 "or %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1830 "psubusb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1831 "or %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1832 "xor %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
1833 "pcmpeqb %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1834 MMI_ULWC1(%[ftmp7], %[tc0], 0x00)
1835 "punpcklbh %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
1836 "and %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1837 "pcmpeqb %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
1838 "xor %[ftmp6], %[ftmp2], %[ftmp3] \n\t"
1839 "xor %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
1840 "and %[ftmp6], %[ftmp6], %[ff_pb_1] \n\t"
1841 "pavgb %[ftmp4], %[ftmp4], %[ftmp1] \n\t"
1842 "xor %[ftmp5], %[ftmp5], %[ftmp2] \n\t"
1843 "pavgb %[ftmp4], %[ftmp4], %[ff_pb_3] \n\t"
1844 "pavgb %[ftmp5], %[ftmp5], %[ftmp3] \n\t"
1845 "pavgb %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
1846 "paddusb %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
1847 "psubusb %[ftmp7], %[ff_pb_A1], %[ftmp4] \n\t"
1848 "psubusb %[ftmp4], %[ftmp4], %[ff_pb_A1] \n\t"
1849 "pminub %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
1850 "pminub %[ftmp4], %[ftmp4], %[ftmp8] \n\t"
1851 "psubusb %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
1852 "psubusb %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
1853 "paddusb %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
1854 "paddusb %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
1855
1856 MMI_SDXC1(%[ftmp2], %[addr0], %[stride], 0x00)
1857 MMI_SDC1(%[ftmp3], %[pix], 0x00)
1858 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1859 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1860 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
1861 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
1862 [ftmp8]"=&f"(ftmp[8]),
1863 RESTRICT_ASM_LOW32
1864 RESTRICT_ASM_ALL64
1865 RESTRICT_ASM_ADDRT
1866 [addr0]"=&r"(addr[0])
1867 : [pix]"r"(pix), [stride]"r"((mips_reg)stride),
1868 [alpha]"r"(alpha), [beta]"r"(beta),
1869 [tc0]"r"(tc0), [ff_pb_1]"f"(ff_pb_1),
1870 [ff_pb_3]"f"(ff_pb_3), [ff_pb_A1]"f"(ff_pb_A1)
1871 : "memory"
1872 );
1873 }
1874
ff_deblock_v_chroma_intra_8_mmi(uint8_t * pix,ptrdiff_t stride,int alpha,int beta)1875 void ff_deblock_v_chroma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
1876 int beta)
1877 {
1878 double ftmp[9];
1879 mips_reg addr[1];
1880 DECLARE_VAR_ALL64;
1881 DECLARE_VAR_ADDRT;
1882
1883 __asm__ volatile (
1884 "addi %[alpha], %[alpha], -0x01 \n\t"
1885 "addi %[beta], %[beta], -0x01 \n\t"
1886 "or %[addr0], $0, %[pix] \n\t"
1887 PTR_SUBU "%[addr0], %[addr0], %[stride] \n\t"
1888 PTR_SUBU "%[addr0], %[addr0], %[stride] \n\t"
1889 MMI_LDC1(%[ftmp1], %[addr0], 0x00)
1890 MMI_LDXC1(%[ftmp2], %[addr0], %[stride], 0x00)
1891 MMI_LDC1(%[ftmp3], %[pix], 0x00)
1892 MMI_LDXC1(%[ftmp4], %[pix], %[stride], 0x00)
1893
1894 "xor %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
1895 "mtc1 %[alpha], %[ftmp5] \n\t"
1896 "mtc1 %[beta], %[ftmp6] \n\t"
1897 "pshufh %[ftmp5], %[ftmp5], %[ftmp0] \n\t"
1898 "pshufh %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
1899 "packushb %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
1900 "packushb %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
1901 "psubusb %[ftmp7], %[ftmp3], %[ftmp2] \n\t"
1902 "psubusb %[ftmp8], %[ftmp2], %[ftmp3] \n\t"
1903 "or %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1904 "psubusb %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1905 "psubusb %[ftmp7], %[ftmp2], %[ftmp1] \n\t"
1906 "psubusb %[ftmp5], %[ftmp1], %[ftmp2] \n\t"
1907 "or %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1908 "psubusb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1909 "or %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1910 "psubusb %[ftmp7], %[ftmp3], %[ftmp4] \n\t"
1911 "psubusb %[ftmp5], %[ftmp4], %[ftmp3] \n\t"
1912 "or %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1913 "psubusb %[ftmp5], %[ftmp5], %[ftmp6] \n\t"
1914 "or %[ftmp8], %[ftmp8], %[ftmp5] \n\t"
1915 "xor %[ftmp7], %[ftmp7], %[ftmp7] \n\t"
1916 "pcmpeqb %[ftmp8], %[ftmp8], %[ftmp7] \n\t"
1917 "mov.d %[ftmp6], %[ftmp2] \n\t"
1918 "mov.d %[ftmp7], %[ftmp3] \n\t"
1919 "xor %[ftmp5], %[ftmp2], %[ftmp4] \n\t"
1920 "and %[ftmp5], %[ftmp5], %[ff_pb_1] \n\t"
1921 "pavgb %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
1922 "psubusb %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
1923 "pavgb %[ftmp2], %[ftmp2], %[ftmp1] \n\t"
1924 "xor %[ftmp5], %[ftmp3], %[ftmp1] \n\t"
1925 "and %[ftmp5], %[ftmp5], %[ff_pb_1] \n\t"
1926 "pavgb %[ftmp3], %[ftmp3], %[ftmp1] \n\t"
1927 "psubusb %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
1928 "pavgb %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
1929 "psubb %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
1930 "psubb %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
1931 "and %[ftmp2], %[ftmp2], %[ftmp8] \n\t"
1932 "and %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
1933 "paddb %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
1934 "paddb %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
1935
1936 MMI_SDXC1(%[ftmp2], %[addr0], %[stride], 0x00)
1937 MMI_SDC1(%[ftmp3], %[pix], 0x00)
1938 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
1939 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
1940 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
1941 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
1942 [ftmp8]"=&f"(ftmp[8]),
1943 RESTRICT_ASM_ALL64
1944 RESTRICT_ASM_ADDRT
1945 [addr0]"=&r"(addr[0])
1946 : [pix]"r"(pix), [stride]"r"((mips_reg)stride),
1947 [alpha]"r"(alpha), [beta]"r"(beta),
1948 [ff_pb_1]"f"(ff_pb_1)
1949 : "memory"
1950 );
1951 }
1952
ff_deblock_h_chroma_8_mmi(uint8_t * pix,ptrdiff_t stride,int alpha,int beta,int8_t * tc0)1953 void ff_deblock_h_chroma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
1954 int8_t *tc0)
1955 {
1956 double ftmp[11];
1957 mips_reg addr[6];
1958 DECLARE_VAR_LOW32;
1959
1960 __asm__ volatile (
1961 "addi %[alpha], %[alpha], -0x01 \n\t"
1962 "addi %[beta], %[beta], -0x01 \n\t"
1963 PTR_ADDU "%[addr0], %[stride], %[stride] \n\t"
1964 PTR_ADDI "%[pix], %[pix], -0x02 \n\t"
1965 PTR_ADDU "%[addr1], %[addr0], %[stride] \n\t"
1966 PTR_ADDU "%[addr2], %[addr0], %[addr0] \n\t"
1967 "or %[addr5], $0, %[pix] \n\t"
1968 PTR_ADDU "%[pix], %[pix], %[addr1] \n\t"
1969 MMI_ULWC1(%[ftmp0], %[addr5], 0x00)
1970 PTR_ADDU "%[addr3], %[addr5], %[stride] \n\t"
1971 MMI_ULWC1(%[ftmp2], %[addr3], 0x00)
1972 PTR_ADDU "%[addr4], %[addr5], %[addr0] \n\t"
1973 MMI_ULWC1(%[ftmp1], %[addr4], 0x00)
1974 MMI_ULWC1(%[ftmp3], %[pix], 0x00)
1975 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
1976 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
1977 PTR_ADDU "%[addr3], %[pix], %[stride] \n\t"
1978 "punpckhhw %[ftmp2], %[ftmp0], %[ftmp1] \n\t"
1979 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
1980 MMI_ULWC1(%[ftmp4], %[addr3], 0x00)
1981 PTR_ADDU "%[addr4], %[pix], %[addr0] \n\t"
1982 MMI_ULWC1(%[ftmp6], %[addr4], 0x00)
1983 PTR_ADDU "%[addr3], %[pix], %[addr1] \n\t"
1984 MMI_ULWC1(%[ftmp5], %[addr3], 0x00)
1985 PTR_ADDU "%[addr4], %[pix], %[addr2] \n\t"
1986 MMI_ULWC1(%[ftmp7], %[addr4], 0x00)
1987 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
1988 "punpcklbh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
1989 "mov.d %[ftmp6], %[ftmp4] \n\t"
1990 "punpcklhw %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
1991 "punpckhhw %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
1992 "punpckhwd %[ftmp1], %[ftmp0], %[ftmp4] \n\t"
1993 "punpckhwd %[ftmp3], %[ftmp2], %[ftmp6] \n\t"
1994 "punpcklwd %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
1995 "punpcklwd %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
1996 "mov.d %[ftmp9], %[ftmp0] \n\t"
1997 "mov.d %[ftmp10], %[ftmp3] \n\t"
1998
1999 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
2000 "mtc1 %[alpha], %[ftmp4] \n\t"
2001 "mtc1 %[beta], %[ftmp5] \n\t"
2002 "pshufh %[ftmp4], %[ftmp4], %[ftmp8] \n\t"
2003 "pshufh %[ftmp5], %[ftmp5], %[ftmp8] \n\t"
2004 "packushb %[ftmp4], %[ftmp4], %[ftmp4] \n\t"
2005 "packushb %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
2006 "psubusb %[ftmp6], %[ftmp2], %[ftmp1] \n\t"
2007 "psubusb %[ftmp7], %[ftmp1], %[ftmp2] \n\t"
2008 "or %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
2009 "psubusb %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
2010 "psubusb %[ftmp6], %[ftmp1], %[ftmp0] \n\t"
2011 "psubusb %[ftmp4], %[ftmp0], %[ftmp1] \n\t"
2012 "or %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2013 "psubusb %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2014 "or %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
2015 "psubusb %[ftmp6], %[ftmp2], %[ftmp3] \n\t"
2016 "psubusb %[ftmp4], %[ftmp3], %[ftmp2] \n\t"
2017 "or %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2018 "psubusb %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2019 "or %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
2020 "xor %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
2021 "pcmpeqb %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
2022 MMI_ULWC1(%[ftmp6], %[tc0], 0x00)
2023 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
2024 "and %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
2025 "pcmpeqb %[ftmp4], %[ftmp4], %[ftmp4] \n\t"
2026 "xor %[ftmp5], %[ftmp1], %[ftmp2] \n\t"
2027 "xor %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
2028 "and %[ftmp5], %[ftmp5], %[ff_pb_1] \n\t"
2029 "pavgb %[ftmp3], %[ftmp3], %[ftmp0] \n\t"
2030 "xor %[ftmp4], %[ftmp4], %[ftmp1] \n\t"
2031 "pavgb %[ftmp3], %[ftmp3], %[ff_pb_3] \n\t"
2032 "pavgb %[ftmp4], %[ftmp4], %[ftmp2] \n\t"
2033 "pavgb %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
2034 "paddusb %[ftmp3], %[ftmp3], %[ftmp4] \n\t"
2035 "psubusb %[ftmp6], %[ff_pb_A1], %[ftmp3] \n\t"
2036 "psubusb %[ftmp3], %[ftmp3], %[ff_pb_A1] \n\t"
2037 "pminub %[ftmp6], %[ftmp6], %[ftmp7] \n\t"
2038 "pminub %[ftmp3], %[ftmp3], %[ftmp7] \n\t"
2039 "psubusb %[ftmp1], %[ftmp1], %[ftmp6] \n\t"
2040 "psubusb %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2041 "paddusb %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
2042 "paddusb %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
2043
2044 "punpckhwd %[ftmp4], %[ftmp9], %[ftmp9] \n\t"
2045 "punpckhwd %[ftmp5], %[ftmp1], %[ftmp1] \n\t"
2046 "punpckhwd %[ftmp6], %[ftmp2], %[ftmp2] \n\t"
2047 "punpcklbh %[ftmp0], %[ftmp9], %[ftmp1] \n\t"
2048 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp10] \n\t"
2049 "punpcklhw %[ftmp1], %[ftmp0], %[ftmp2] \n\t"
2050 "punpckhhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2051 MMI_USWC1(%[ftmp1], %[addr5], 0x00)
2052 PTR_ADDU "%[addr3], %[addr5], %[stride] \n\t"
2053 "punpckhwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
2054 MMI_USWC1(%[ftmp1], %[addr3], 0x00)
2055 PTR_ADDU "%[addr4], %[addr5], %[addr0] \n\t"
2056 MMI_USWC1(%[ftmp0], %[addr4], 0x00)
2057 "punpckhwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
2058 "punpckhwd %[ftmp3], %[ftmp10], %[ftmp10] \n\t"
2059 MMI_USWC1(%[ftmp0], %[pix], 0x00)
2060 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2061 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
2062 PTR_ADDU "%[addr3], %[pix], %[stride] \n\t"
2063 "punpcklhw %[ftmp5], %[ftmp4], %[ftmp6] \n\t"
2064 "punpckhhw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2065 MMI_USWC1(%[ftmp5], %[addr3], 0x00)
2066 "punpckhwd %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
2067 PTR_ADDU "%[addr3], %[pix], %[addr0] \n\t"
2068 PTR_ADDU "%[addr4], %[pix], %[addr1] \n\t"
2069 MMI_USWC1(%[ftmp5], %[addr3], 0x00)
2070 MMI_USWC1(%[ftmp4], %[addr4], 0x00)
2071 PTR_ADDU "%[addr3], %[pix], %[addr2] \n\t"
2072 "punpckhwd %[ftmp9], %[ftmp4], %[ftmp4] \n\t"
2073 MMI_USWC1(%[ftmp9], %[addr3], 0x00)
2074 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
2075 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
2076 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
2077 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
2078 [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),
2079 [ftmp10]"=&f"(ftmp[10]),
2080 RESTRICT_ASM_LOW32
2081 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
2082 [addr2]"=&r"(addr[2]), [addr3]"=&r"(addr[3]),
2083 [addr4]"=&r"(addr[4]), [addr5]"=&r"(addr[5]),
2084 [pix]"+&r"(pix)
2085 : [alpha]"r"(alpha), [beta]"r"(beta),
2086 [stride]"r"((mips_reg)stride), [tc0]"r"(tc0),
2087 [ff_pb_1]"f"(ff_pb_1), [ff_pb_3]"f"(ff_pb_3),
2088 [ff_pb_A1]"f"(ff_pb_A1)
2089 : "memory"
2090 );
2091 }
2092
ff_deblock_h_chroma_intra_8_mmi(uint8_t * pix,ptrdiff_t stride,int alpha,int beta)2093 void ff_deblock_h_chroma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
2094 int beta)
2095 {
2096 double ftmp[11];
2097 mips_reg addr[6];
2098 DECLARE_VAR_LOW32;
2099
2100 __asm__ volatile (
2101 "addi %[alpha], %[alpha], -0x01 \n\t"
2102 "addi %[beta], %[beta], -0x01 \n\t"
2103 PTR_ADDU "%[addr0], %[stride], %[stride] \n\t"
2104 PTR_ADDI "%[pix], %[pix], -0x02 \n\t"
2105 PTR_ADDU "%[addr1], %[addr0], %[stride] \n\t"
2106 PTR_ADDU "%[addr2], %[addr0], %[addr0] \n\t"
2107 "or %[addr5], $0, %[pix] \n\t"
2108 PTR_ADDU "%[pix], %[pix], %[addr1] \n\t"
2109 MMI_ULWC1(%[ftmp0], %[addr5], 0x00)
2110 PTR_ADDU "%[addr3], %[addr5], %[stride] \n\t"
2111 MMI_ULWC1(%[ftmp2], %[addr3], 0x00)
2112 PTR_ADDU "%[addr4], %[addr5], %[addr0] \n\t"
2113 MMI_ULWC1(%[ftmp1], %[addr4], 0x00)
2114 MMI_ULWC1(%[ftmp3], %[pix], 0x00)
2115 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2116 "punpcklbh %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
2117 PTR_ADDU "%[addr3], %[pix], %[stride] \n\t"
2118 "punpckhhw %[ftmp2], %[ftmp0], %[ftmp1] \n\t"
2119 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
2120 MMI_ULWC1(%[ftmp4], %[addr3], 0x00)
2121 PTR_ADDU "%[addr4], %[pix], %[addr0] \n\t"
2122 MMI_ULWC1(%[ftmp6], %[addr4], 0x00)
2123 PTR_ADDU "%[addr3], %[pix], %[addr1] \n\t"
2124 MMI_ULWC1(%[ftmp5], %[addr3], 0x00)
2125 PTR_ADDU "%[addr4], %[pix], %[addr2] \n\t"
2126 MMI_ULWC1(%[ftmp7], %[addr4], 0x00)
2127 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2128 "punpcklbh %[ftmp5], %[ftmp5], %[ftmp7] \n\t"
2129 "mov.d %[ftmp6], %[ftmp4] \n\t"
2130 "punpcklhw %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2131 "punpckhhw %[ftmp6], %[ftmp6], %[ftmp5] \n\t"
2132 "punpckhwd %[ftmp1], %[ftmp0], %[ftmp4] \n\t"
2133 "punpckhwd %[ftmp3], %[ftmp2], %[ftmp6] \n\t"
2134 "punpcklwd %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
2135 "punpcklwd %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
2136
2137 "xor %[ftmp8], %[ftmp8], %[ftmp8] \n\t"
2138 "mtc1 %[alpha], %[ftmp4] \n\t"
2139 "mtc1 %[beta], %[ftmp5] \n\t"
2140 "pshufh %[ftmp4], %[ftmp4], %[ftmp8] \n\t"
2141 "pshufh %[ftmp5], %[ftmp5], %[ftmp8] \n\t"
2142 "packushb %[ftmp4], %[ftmp4], %[ftmp4] \n\t"
2143 "packushb %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
2144 "psubusb %[ftmp6], %[ftmp2], %[ftmp1] \n\t"
2145 "psubusb %[ftmp7], %[ftmp1], %[ftmp2] \n\t"
2146 "or %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
2147 "psubusb %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
2148 "psubusb %[ftmp6], %[ftmp1], %[ftmp0] \n\t"
2149 "psubusb %[ftmp4], %[ftmp0], %[ftmp1] \n\t"
2150 "or %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2151 "psubusb %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2152 "or %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
2153 "psubusb %[ftmp6], %[ftmp2], %[ftmp3] \n\t"
2154 "psubusb %[ftmp4], %[ftmp3], %[ftmp2] \n\t"
2155 "or %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2156 "psubusb %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2157 "or %[ftmp7], %[ftmp7], %[ftmp4] \n\t"
2158 "xor %[ftmp6], %[ftmp6], %[ftmp6] \n\t"
2159 "pcmpeqb %[ftmp7], %[ftmp7], %[ftmp6] \n\t"
2160 "mov.d %[ftmp5], %[ftmp1] \n\t"
2161 "mov.d %[ftmp6], %[ftmp2] \n\t"
2162 "xor %[ftmp4], %[ftmp1], %[ftmp3] \n\t"
2163 "and %[ftmp4], %[ftmp4], %[ff_pb_1] \n\t"
2164 "pavgb %[ftmp1], %[ftmp1], %[ftmp3] \n\t"
2165 "psubusb %[ftmp1], %[ftmp1], %[ftmp4] \n\t"
2166 "pavgb %[ftmp1], %[ftmp1], %[ftmp0] \n\t"
2167 "xor %[ftmp4], %[ftmp2], %[ftmp0] \n\t"
2168 "and %[ftmp4], %[ftmp4], %[ff_pb_1] \n\t"
2169 "pavgb %[ftmp2], %[ftmp2], %[ftmp0] \n\t"
2170 "psubusb %[ftmp2], %[ftmp2], %[ftmp4] \n\t"
2171 "pavgb %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2172 "psubb %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
2173 "psubb %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
2174 "and %[ftmp1], %[ftmp1], %[ftmp7] \n\t"
2175 "and %[ftmp2], %[ftmp2], %[ftmp7] \n\t"
2176 "paddb %[ftmp1], %[ftmp1], %[ftmp5] \n\t"
2177 "paddb %[ftmp2], %[ftmp2], %[ftmp6] \n\t"
2178
2179 "punpckhwd %[ftmp4], %[ftmp0], %[ftmp0] \n\t"
2180 "punpckhwd %[ftmp5], %[ftmp1], %[ftmp1] \n\t"
2181 "punpckhwd %[ftmp6], %[ftmp2], %[ftmp2] \n\t"
2182 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
2183 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2184 "punpcklhw %[ftmp1], %[ftmp0], %[ftmp2] \n\t"
2185 "punpckhhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2186 MMI_USWC1(%[ftmp1], %[addr5], 0x00)
2187 PTR_ADDU "%[addr3], %[addr5], %[stride] \n\t"
2188 "punpckhwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
2189 PTR_ADDU "%[addr4], %[addr5], %[addr0] \n\t"
2190 MMI_USWC1(%[ftmp1], %[addr3], 0x00)
2191 MMI_USWC1(%[ftmp0], %[addr4], 0x00)
2192 "punpckhwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
2193 "punpckhwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
2194 MMI_USWC1(%[ftmp0], %[pix], 0x00)
2195 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2196 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
2197 PTR_ADDU "%[addr3], %[pix], %[stride] \n\t"
2198 "punpcklhw %[ftmp5], %[ftmp4], %[ftmp6] \n\t"
2199 "punpckhhw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2200 MMI_USWC1(%[ftmp5], %[addr3], 0x00)
2201 "punpckhwd %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
2202 PTR_ADDU "%[addr3], %[pix], %[addr0] \n\t"
2203 PTR_ADDU "%[addr4], %[pix], %[addr1] \n\t"
2204 MMI_USWC1(%[ftmp5], %[addr3], 0x00)
2205 PTR_ADDU "%[addr3], %[pix], %[addr2] \n\t"
2206 MMI_USWC1(%[ftmp4], %[addr4], 0x00)
2207 "punpckhwd %[ftmp9], %[ftmp4], %[ftmp4] \n\t"
2208 MMI_USWC1(%[ftmp9], %[addr3], 0x00)
2209 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
2210 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
2211 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
2212 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
2213 [ftmp8]"=&f"(ftmp[8]), [ftmp9]"=&f"(ftmp[9]),
2214 [ftmp10]"=&f"(ftmp[10]),
2215 RESTRICT_ASM_LOW32
2216 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
2217 [addr2]"=&r"(addr[2]), [addr3]"=&r"(addr[3]),
2218 [addr4]"=&r"(addr[4]), [addr5]"=&r"(addr[5]),
2219 [pix]"+&r"(pix)
2220 : [alpha]"r"(alpha), [beta]"r"(beta),
2221 [stride]"r"((mips_reg)stride), [ff_pb_1]"f"(ff_pb_1)
2222 : "memory"
2223 );
2224 }
2225
ff_deblock_v_luma_8_mmi(uint8_t * pix,ptrdiff_t stride,int alpha,int beta,int8_t * tc0)2226 void ff_deblock_v_luma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
2227 int8_t *tc0)
2228 {
2229 if ((tc0[0] & tc0[1]) >= 0)
2230 ff_deblock_v8_luma_8_mmi(pix + 0, stride, alpha, beta, tc0);
2231 if ((tc0[2] & tc0[3]) >= 0)
2232 ff_deblock_v8_luma_8_mmi(pix + 8, stride, alpha, beta, tc0 + 2);
2233 }
2234
ff_deblock_v_luma_intra_8_mmi(uint8_t * pix,ptrdiff_t stride,int alpha,int beta)2235 void ff_deblock_v_luma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
2236 int beta)
2237 {
2238 deblock_v8_luma_intra_8_mmi(pix + 0, stride, alpha, beta);
2239 deblock_v8_luma_intra_8_mmi(pix + 8, stride, alpha, beta);
2240 }
2241
ff_deblock_h_luma_8_mmi(uint8_t * pix,ptrdiff_t stride,int alpha,int beta,int8_t * tc0)2242 void ff_deblock_h_luma_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha, int beta,
2243 int8_t *tc0)
2244 {
2245 DECLARE_ALIGNED(8, const uint64_t, stack[0x0d]);
2246 double ftmp[9];
2247 mips_reg addr[8];
2248 DECLARE_VAR_LOW32;
2249 DECLARE_VAR_ALL64;
2250
2251 __asm__ volatile (
2252 PTR_ADDU "%[addr0], %[stride], %[stride] \n\t"
2253 PTR_ADDI "%[addr1], %[pix], -0x4 \n\t"
2254 PTR_ADDU "%[addr2], %[stride], %[addr0] \n\t"
2255 MMI_ULDC1(%[ftmp0], %[addr1], 0x00)
2256 PTR_ADDU "%[addr3], %[addr1], %[stride] \n\t"
2257 PTR_ADDU "%[addr4], %[addr1], %[addr2] \n\t"
2258 MMI_ULDC1(%[ftmp1], %[addr3], 0x00)
2259 PTR_ADDU "%[addr5], %[addr1], %[addr0] \n\t"
2260 MMI_ULDC1(%[ftmp2], %[addr5], 0x00)
2261 MMI_ULDC1(%[ftmp3], %[addr4], 0x00)
2262 PTR_ADDU "%[addr3], %[addr4], %[stride] \n\t"
2263 MMI_ULDC1(%[ftmp4], %[addr3], 0x00)
2264 PTR_ADDU "%[addr5], %[addr4], %[addr0] \n\t"
2265 MMI_ULDC1(%[ftmp5], %[addr5], 0x00)
2266 PTR_ADDU "%[addr3], %[addr4], %[addr2] \n\t"
2267 MMI_ULDC1(%[ftmp6], %[addr3], 0x00)
2268 PTR_ADDU "%[addr6], %[addr0], %[addr0] \n\t"
2269 "punpckhbh %[ftmp7], %[ftmp0], %[ftmp1] \n\t"
2270 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
2271 "punpckhbh %[ftmp1], %[ftmp2], %[ftmp3] \n\t"
2272 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2273 "punpckhbh %[ftmp3], %[ftmp4], %[ftmp5] \n\t"
2274 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2275 PTR_ADDU "%[addr3], %[addr4], %[addr6] \n\t"
2276 MMI_SDC1(%[ftmp1], %[stack], 0x10)
2277 MMI_ULDC1(%[ftmp8], %[addr3], 0x00)
2278 PTR_ADDU "%[addr7], %[addr6], %[addr6] \n\t"
2279 "punpckhbh %[ftmp5], %[ftmp6], %[ftmp8] \n\t"
2280 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
2281 "punpckhhw %[ftmp1], %[ftmp0], %[ftmp2] \n\t"
2282 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2283 "punpckhhw %[ftmp2], %[ftmp4], %[ftmp6] \n\t"
2284 "punpcklhw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2285 MMI_LDC1(%[ftmp8], %[stack], 0x10)
2286 "punpckhwd %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
2287 MMI_SDC1(%[ftmp0], %[stack], 0x00)
2288 "punpckhhw %[ftmp6], %[ftmp7], %[ftmp8] \n\t"
2289 "punpcklhw %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
2290 "punpckhhw %[ftmp0], %[ftmp3], %[ftmp5] \n\t"
2291 "punpcklhw %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
2292 "punpcklwd %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
2293 "punpckhwd %[ftmp5], %[ftmp7], %[ftmp3] \n\t"
2294 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
2295 "punpckhwd %[ftmp3], %[ftmp1], %[ftmp2] \n\t"
2296 "punpcklwd %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
2297 MMI_SDC1(%[ftmp1], %[stack], 0x10)
2298 MMI_SDC1(%[ftmp3], %[stack], 0x20)
2299 MMI_SDC1(%[ftmp7], %[stack], 0x30)
2300 MMI_SDC1(%[ftmp5], %[stack], 0x40)
2301 MMI_SDC1(%[ftmp6], %[stack], 0x50)
2302 PTR_ADDU "%[addr1], %[addr1], %[addr7] \n\t"
2303 PTR_ADDU "%[addr4], %[addr4], %[addr7] \n\t"
2304 MMI_ULDC1(%[ftmp0], %[addr1], 0x00)
2305 PTR_ADDU "%[addr3], %[addr1], %[stride] \n\t"
2306 MMI_ULDC1(%[ftmp1], %[addr3], 0x00)
2307 PTR_ADDU "%[addr5], %[addr1], %[addr0] \n\t"
2308 MMI_ULDC1(%[ftmp2], %[addr5], 0x00)
2309 MMI_ULDC1(%[ftmp3], %[addr4], 0x00)
2310 PTR_ADDU "%[addr3], %[addr4], %[stride] \n\t"
2311 MMI_ULDC1(%[ftmp4], %[addr3], 0x00)
2312 PTR_ADDU "%[addr5], %[addr4], %[addr0] \n\t"
2313 MMI_ULDC1(%[ftmp5], %[addr5], 0x00)
2314 PTR_ADDU "%[addr3], %[addr4], %[addr2] \n\t"
2315 MMI_ULDC1(%[ftmp6], %[addr3], 0x00)
2316 "punpckhbh %[ftmp7], %[ftmp0], %[ftmp1] \n\t"
2317 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
2318 "punpckhbh %[ftmp1], %[ftmp2], %[ftmp3] \n\t"
2319 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2320 "punpckhbh %[ftmp3], %[ftmp4], %[ftmp5] \n\t"
2321 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2322 PTR_ADDU "%[addr3], %[addr4], %[addr6] \n\t"
2323 MMI_SDC1(%[ftmp1], %[stack], 0x18)
2324 MMI_ULDC1(%[ftmp8], %[addr3], 0x00)
2325 "punpckhhw %[ftmp1], %[ftmp0], %[ftmp2] \n\t"
2326 "punpckhbh %[ftmp5], %[ftmp6], %[ftmp8] \n\t"
2327 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
2328 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2329 "punpckhhw %[ftmp2], %[ftmp4], %[ftmp6] \n\t"
2330 "punpcklhw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2331 "punpckhwd %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
2332 MMI_LDC1(%[ftmp8], %[stack], 0x18)
2333 MMI_SDC1(%[ftmp0], %[stack], 0x08)
2334 "punpckhhw %[ftmp6], %[ftmp7], %[ftmp8] \n\t"
2335 "punpcklhw %[ftmp7], %[ftmp7], %[ftmp8] \n\t"
2336 "punpckhhw %[ftmp0], %[ftmp3], %[ftmp5] \n\t"
2337 "punpcklhw %[ftmp3], %[ftmp3], %[ftmp5] \n\t"
2338 "punpckhwd %[ftmp5], %[ftmp7], %[ftmp3] \n\t"
2339 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp3] \n\t"
2340 "punpckhwd %[ftmp3], %[ftmp1], %[ftmp2] \n\t"
2341 "punpcklwd %[ftmp1], %[ftmp1], %[ftmp2] \n\t"
2342 "punpcklwd %[ftmp6], %[ftmp6], %[ftmp0] \n\t"
2343 MMI_SDC1(%[ftmp1], %[stack], 0x18)
2344 MMI_SDC1(%[ftmp3], %[stack], 0x28)
2345 MMI_SDC1(%[ftmp7], %[stack], 0x38)
2346 MMI_SDC1(%[ftmp5], %[stack], 0x48)
2347 MMI_SDC1(%[ftmp6], %[stack], 0x58)
2348 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
2349 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
2350 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
2351 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
2352 [ftmp8]"=&f"(ftmp[8]),
2353 RESTRICT_ASM_ALL64
2354 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
2355 [addr2]"=&r"(addr[2]), [addr3]"=&r"(addr[3]),
2356 [addr4]"=&r"(addr[4]), [addr5]"=&r"(addr[5]),
2357 [addr6]"=&r"(addr[6]), [addr7]"=&r"(addr[7])
2358 : [pix]"r"(pix), [stride]"r"((mips_reg)stride),
2359 [stack]"r"(stack)
2360 : "memory"
2361 );
2362
2363 ff_deblock_v_luma_8_mmi((uint8_t *) &stack[6], 0x10, alpha, beta, tc0);
2364
2365 __asm__ volatile (
2366 PTR_ADDU "%[addr0], %[stride], %[stride] \n\t"
2367 PTR_ADDI "%[addr1], %[pix], -0x02 \n\t"
2368 PTR_ADDU "%[addr6], %[addr0], %[addr0] \n\t"
2369 PTR_ADDU "%[addr2], %[addr0], %[stride] \n\t"
2370 PTR_ADDU "%[addr7], %[addr6], %[addr6] \n\t"
2371 PTR_ADDU "%[addr4], %[addr1], %[addr2] \n\t"
2372 MMI_LDC1(%[ftmp0], %[stack], 0x10)
2373 MMI_LDC1(%[ftmp1], %[stack], 0x20)
2374 MMI_LDC1(%[ftmp2], %[stack], 0x30)
2375 MMI_LDC1(%[ftmp3], %[stack], 0x40)
2376 "punpckhwd %[ftmp4], %[ftmp0], %[ftmp0] \n\t"
2377 "punpckhwd %[ftmp5], %[ftmp1], %[ftmp1] \n\t"
2378 "punpckhwd %[ftmp6], %[ftmp2], %[ftmp2] \n\t"
2379 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
2380 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2381 "punpcklhw %[ftmp1], %[ftmp0], %[ftmp2] \n\t"
2382 "punpckhhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2383 MMI_USWC1(%[ftmp1], %[addr1], 0x00)
2384 PTR_ADDU "%[addr3], %[addr1], %[stride] \n\t"
2385 "punpckhwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
2386 PTR_ADDU "%[addr5], %[addr1], %[addr0] \n\t"
2387 MMI_USWC1(%[ftmp1], %[addr3], 0x00)
2388 MMI_USWC1(%[ftmp0], %[addr5], 0x00)
2389 "punpckhwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
2390 "punpckhwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
2391 MMI_USWC1(%[ftmp0], %[addr4], 0x00)
2392 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2393 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
2394 "punpcklhw %[ftmp5], %[ftmp4], %[ftmp6] \n\t"
2395 PTR_ADDU "%[addr3], %[addr4], %[stride] \n\t"
2396 "punpckhhw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2397 MMI_USWC1(%[ftmp5], %[addr3], 0x00)
2398 PTR_ADDU "%[addr3], %[addr4], %[addr0] \n\t"
2399 "punpckhwd %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
2400 PTR_ADDU "%[addr5], %[addr4], %[addr2] \n\t"
2401 MMI_USWC1(%[ftmp5], %[addr3], 0x00)
2402 MMI_USWC1(%[ftmp4], %[addr5], 0x00)
2403 PTR_ADDU "%[addr3], %[addr4], %[addr6] \n\t"
2404 "punpckhwd %[ftmp4], %[ftmp4], %[ftmp4] \n\t"
2405 PTR_ADDU "%[addr1], %[addr1], %[addr7] \n\t"
2406 MMI_USWC1(%[ftmp4], %[addr3], 0x00)
2407 PTR_ADDU "%[addr4], %[addr4], %[addr7] \n\t"
2408 MMI_LDC1(%[ftmp0], %[stack], 0x18)
2409 MMI_LDC1(%[ftmp1], %[stack], 0x28)
2410 MMI_LDC1(%[ftmp2], %[stack], 0x38)
2411 MMI_LDC1(%[ftmp3], %[stack], 0x48)
2412 PTR_ADDU "%[addr0], %[stride], %[stride] \n\t"
2413 "punpckhwd %[ftmp4], %[ftmp0], %[ftmp0] \n\t"
2414 PTR_ADDU "%[addr6], %[addr0], %[addr0] \n\t"
2415 "punpckhwd %[ftmp5], %[ftmp1], %[ftmp1] \n\t"
2416 "punpckhwd %[ftmp6], %[ftmp2], %[ftmp2] \n\t"
2417 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
2418 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2419 PTR_ADDU "%[addr3], %[addr1], %[stride] \n\t"
2420 "punpcklhw %[ftmp1], %[ftmp0], %[ftmp2] \n\t"
2421 "punpckhhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2422 MMI_USWC1(%[ftmp1], %[addr1], 0x00)
2423 "punpckhwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t"
2424 PTR_ADDU "%[addr5], %[addr1], %[addr0] \n\t"
2425 MMI_USWC1(%[ftmp1], %[addr3], 0x00)
2426 MMI_USWC1(%[ftmp0], %[addr5], 0x00)
2427 "punpckhwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t"
2428 "punpckhwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t"
2429 MMI_USWC1(%[ftmp0], %[addr4], 0x00)
2430 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2431 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp3] \n\t"
2432 PTR_ADDU "%[addr3], %[addr4], %[stride] \n\t"
2433 "punpcklhw %[ftmp5], %[ftmp4], %[ftmp6] \n\t"
2434 "punpckhhw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2435 MMI_USWC1(%[ftmp5], %[addr3], 0x00)
2436 PTR_ADDU "%[addr3], %[addr4], %[addr0] \n\t"
2437 "punpckhwd %[ftmp5], %[ftmp5], %[ftmp5] \n\t"
2438 PTR_ADDU "%[addr5], %[addr4], %[addr2] \n\t"
2439 MMI_USWC1(%[ftmp5], %[addr3], 0x00)
2440 MMI_USWC1(%[ftmp4], %[addr5], 0x00)
2441 PTR_ADDU "%[addr3], %[addr4], %[addr6] \n\t"
2442 "punpckhwd %[ftmp4], %[ftmp4], %[ftmp4] \n\t"
2443 MMI_USWC1(%[ftmp4], %[addr3], 0x00)
2444 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
2445 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
2446 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
2447 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
2448 [ftmp8]"=&f"(ftmp[8]),
2449 RESTRICT_ASM_LOW32
2450 RESTRICT_ASM_ALL64
2451 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
2452 [addr2]"=&r"(addr[2]), [addr3]"=&r"(addr[3]),
2453 [addr4]"=&r"(addr[4]), [addr5]"=&r"(addr[5]),
2454 [addr6]"=&r"(addr[6]), [addr7]"=&r"(addr[7])
2455 : [pix]"r"(pix), [stride]"r"((mips_reg)stride),
2456 [stack]"r"(stack)
2457 : "memory"
2458 );
2459 }
2460
ff_deblock_h_luma_intra_8_mmi(uint8_t * pix,ptrdiff_t stride,int alpha,int beta)2461 void ff_deblock_h_luma_intra_8_mmi(uint8_t *pix, ptrdiff_t stride, int alpha,
2462 int beta)
2463 {
2464 DECLARE_ALIGNED(8, const uint64_t, ptmp[0x11]);
2465 DECLARE_ALIGNED(8, const uint64_t, pdat[0x04]);
2466 double ftmp[9];
2467 mips_reg addr[7];
2468 DECLARE_VAR_ALL64;
2469
2470 __asm__ volatile (
2471 PTR_ADDU "%[addr0], %[stride], %[stride] \n\t"
2472 PTR_ADDI "%[addr1], %[pix], -0x04 \n\t"
2473 PTR_ADDU "%[addr2], %[addr0], %[stride] \n\t"
2474 PTR_ADDU "%[addr3], %[addr0], %[addr0] \n\t"
2475 PTR_ADDU "%[addr4], %[addr1], %[addr2] \n\t"
2476 PTR_ADDU "%[addr5], %[addr1], %[stride] \n\t"
2477 MMI_ULDC1(%[ftmp0], %[addr1], 0x00)
2478 PTR_ADDU "%[addr6], %[addr1], %[addr0] \n\t"
2479 MMI_ULDC1(%[ftmp1], %[addr5], 0x00)
2480 MMI_ULDC1(%[ftmp2], %[addr6], 0x00)
2481 PTR_ADDU "%[addr5], %[addr4], %[stride] \n\t"
2482 MMI_ULDC1(%[ftmp3], %[addr4], 0x00)
2483 PTR_ADDU "%[addr6], %[addr4], %[addr0] \n\t"
2484 MMI_ULDC1(%[ftmp4], %[addr5], 0x00)
2485 PTR_ADDU "%[addr5], %[addr4], %[addr2] \n\t"
2486 MMI_ULDC1(%[ftmp5], %[addr6], 0x00)
2487 MMI_ULDC1(%[ftmp6], %[addr5], 0x00)
2488 PTR_ADDU "%[addr5], %[addr4], %[addr3] \n\t"
2489 "punpckhbh %[ftmp7], %[ftmp0], %[ftmp1] \n\t"
2490 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
2491 "punpckhbh %[ftmp1], %[ftmp2], %[ftmp3] \n\t"
2492 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2493 "punpckhbh %[ftmp3], %[ftmp4], %[ftmp5] \n\t"
2494 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2495 MMI_ULDC1(%[ftmp8], %[addr5], 0x00)
2496 "punpckhbh %[ftmp5], %[ftmp6], %[ftmp8] \n\t"
2497 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
2498 MMI_SDC1(%[ftmp3], %[ptmp], 0x00)
2499 "punpckhhw %[ftmp3], %[ftmp0], %[ftmp2] \n\t"
2500 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2501 "punpckhhw %[ftmp2], %[ftmp4], %[ftmp6] \n\t"
2502 "punpcklhw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2503 "punpckhhw %[ftmp6], %[ftmp7], %[ftmp1] \n\t"
2504 "punpcklhw %[ftmp7], %[ftmp7], %[ftmp1] \n\t"
2505 MMI_SDC1(%[ftmp2], %[ptmp], 0x20)
2506 MMI_LDC1(%[ftmp2], %[ptmp], 0x00)
2507 "punpckhhw %[ftmp1], %[ftmp2], %[ftmp5] \n\t"
2508 "punpcklhw %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
2509 "punpckhwd %[ftmp5], %[ftmp0], %[ftmp4] \n\t"
2510 "punpcklwd %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
2511 "punpckhwd %[ftmp4], %[ftmp7], %[ftmp2] \n\t"
2512 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp2] \n\t"
2513 MMI_SDC1(%[ftmp0], %[ptmp], 0x00)
2514 MMI_SDC1(%[ftmp5], %[ptmp], 0x10)
2515 MMI_SDC1(%[ftmp7], %[ptmp], 0x40)
2516 MMI_SDC1(%[ftmp4], %[ptmp], 0x50)
2517 MMI_LDC1(%[ftmp8], %[ptmp], 0x20)
2518 "punpckhwd %[ftmp0], %[ftmp3], %[ftmp8] \n\t"
2519 "punpcklwd %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
2520 "punpckhwd %[ftmp5], %[ftmp6], %[ftmp1] \n\t"
2521 "punpcklwd %[ftmp6], %[ftmp6], %[ftmp1] \n\t"
2522 PTR_ADDU "%[addr5], %[addr3], %[addr3] \n\t"
2523 MMI_SDC1(%[ftmp3], %[ptmp], 0x20)
2524 MMI_SDC1(%[ftmp0], %[ptmp], 0x30)
2525 MMI_SDC1(%[ftmp6], %[ptmp], 0x60)
2526 MMI_SDC1(%[ftmp5], %[ptmp], 0x70)
2527 PTR_ADDU "%[addr1], %[addr1], %[addr5] \n\t"
2528 PTR_ADDU "%[addr4], %[addr4], %[addr5] \n\t"
2529 PTR_ADDU "%[addr5], %[addr1], %[stride] \n\t"
2530 MMI_ULDC1(%[ftmp0], %[addr1], 0x00)
2531 PTR_ADDU "%[addr6], %[addr1], %[addr0] \n\t"
2532 MMI_ULDC1(%[ftmp1], %[addr5], 0x00)
2533 MMI_ULDC1(%[ftmp2], %[addr6], 0x00)
2534 PTR_ADDU "%[addr5], %[addr4], %[stride] \n\t"
2535 MMI_ULDC1(%[ftmp3], %[addr4], 0x00)
2536 PTR_ADDU "%[addr6], %[addr4], %[addr0] \n\t"
2537 MMI_ULDC1(%[ftmp4], %[addr5], 0x00)
2538 PTR_ADDU "%[addr5], %[addr4], %[addr2] \n\t"
2539 MMI_ULDC1(%[ftmp5], %[addr6], 0x00)
2540 MMI_ULDC1(%[ftmp6], %[addr5], 0x00)
2541 PTR_ADDU "%[addr5], %[addr4], %[addr3] \n\t"
2542 "punpckhbh %[ftmp7], %[ftmp0], %[ftmp1] \n\t"
2543 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
2544 "punpckhbh %[ftmp1], %[ftmp2], %[ftmp3] \n\t"
2545 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2546 "punpckhbh %[ftmp3], %[ftmp4], %[ftmp5] \n\t"
2547 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2548 MMI_ULDC1(%[ftmp8], %[addr5], 0x00)
2549 "punpckhbh %[ftmp5], %[ftmp6], %[ftmp8] \n\t"
2550 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
2551 MMI_SDC1(%[ftmp3], %[ptmp], 0x08)
2552 "punpckhhw %[ftmp3], %[ftmp0], %[ftmp2] \n\t"
2553 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2554 "punpckhhw %[ftmp2], %[ftmp4], %[ftmp6] \n\t"
2555 "punpcklhw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2556 "punpckhhw %[ftmp6], %[ftmp7], %[ftmp1] \n\t"
2557 "punpcklhw %[ftmp7], %[ftmp7], %[ftmp1] \n\t"
2558 MMI_SDC1(%[ftmp2], %[ptmp], 0x28)
2559 MMI_LDC1(%[ftmp2], %[ptmp], 0x08)
2560 "punpckhhw %[ftmp1], %[ftmp2], %[ftmp5] \n\t"
2561 "punpcklhw %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
2562 "punpckhwd %[ftmp5], %[ftmp0], %[ftmp4] \n\t"
2563 "punpcklwd %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
2564 "punpckhwd %[ftmp4], %[ftmp7], %[ftmp2] \n\t"
2565 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp2] \n\t"
2566 MMI_SDC1(%[ftmp0], %[ptmp], 0x08)
2567 MMI_SDC1(%[ftmp5], %[ptmp], 0x18)
2568 MMI_SDC1(%[ftmp7], %[ptmp], 0x48)
2569 MMI_SDC1(%[ftmp4], %[ptmp], 0x58)
2570 MMI_LDC1(%[ftmp8], %[ptmp], 0x28)
2571 "punpckhwd %[ftmp0], %[ftmp3], %[ftmp8] \n\t"
2572 "punpcklwd %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
2573 "punpckhwd %[ftmp5], %[ftmp6], %[ftmp1] \n\t"
2574 "punpcklwd %[ftmp6], %[ftmp6], %[ftmp1] \n\t"
2575 MMI_SDC1(%[ftmp3], %[ptmp], 0x28)
2576 MMI_SDC1(%[ftmp0], %[ptmp], 0x38)
2577 MMI_SDC1(%[ftmp6], %[ptmp], 0x68)
2578 MMI_SDC1(%[ftmp5], %[ptmp], 0x78)
2579 PTR_S "%[addr1], 0x00(%[pdat]) \n\t"
2580 PTR_S "%[addr2], 0x08(%[pdat]) \n\t"
2581 PTR_S "%[addr0], 0x10(%[pdat]) \n\t"
2582 PTR_S "%[addr3], 0x18(%[pdat]) \n\t"
2583 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
2584 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
2585 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
2586 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
2587 [ftmp8]"=&f"(ftmp[8]),
2588 RESTRICT_ASM_ALL64
2589 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
2590 [addr2]"=&r"(addr[2]), [addr3]"=&r"(addr[3]),
2591 [addr4]"=&r"(addr[4]), [addr5]"=&r"(addr[5]),
2592 [addr6]"=&r"(addr[6])
2593 : [pix]"r"(pix), [stride]"r"((mips_reg)stride),
2594 [ptmp]"r"(ptmp), [pdat]"r"(pdat)
2595 : "memory"
2596 );
2597
2598 ff_deblock_v_luma_intra_8_mmi((uint8_t *) &ptmp[8], 0x10, alpha, beta);
2599
2600 __asm__ volatile (
2601 PTR_L "%[addr1], 0x00(%[pdat]) \n\t"
2602 PTR_L "%[addr2], 0x08(%[pdat]) \n\t"
2603 PTR_L "%[addr0], 0x10(%[pdat]) \n\t"
2604 PTR_L "%[addr3], 0x18(%[pdat]) \n\t"
2605 PTR_ADDU "%[addr4], %[addr1], %[addr2] \n\t"
2606 MMI_LDC1(%[ftmp0], %[ptmp], 0x08)
2607 MMI_LDC1(%[ftmp1], %[ptmp], 0x18)
2608 MMI_LDC1(%[ftmp2], %[ptmp], 0x28)
2609 MMI_LDC1(%[ftmp3], %[ptmp], 0x38)
2610 MMI_LDC1(%[ftmp4], %[ptmp], 0x48)
2611 MMI_LDC1(%[ftmp5], %[ptmp], 0x58)
2612 MMI_LDC1(%[ftmp6], %[ptmp], 0x68)
2613 "punpckhbh %[ftmp7], %[ftmp0], %[ftmp1] \n\t"
2614 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
2615 "punpckhbh %[ftmp1], %[ftmp2], %[ftmp3] \n\t"
2616 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2617 "punpckhbh %[ftmp3], %[ftmp4], %[ftmp5] \n\t"
2618 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2619 MMI_LDC1(%[ftmp8], %[ptmp], 0x78)
2620 "punpckhbh %[ftmp5], %[ftmp6], %[ftmp8] \n\t"
2621 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
2622 MMI_USDC1(%[ftmp3], %[addr1], 0x00)
2623 PTR_ADDU "%[addr5], %[addr1], %[addr0] \n\t"
2624 "punpckhhw %[ftmp3], %[ftmp0], %[ftmp2] \n\t"
2625 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2626 "punpckhhw %[ftmp2], %[ftmp4], %[ftmp6] \n\t"
2627 "punpcklhw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2628 "punpckhhw %[ftmp6], %[ftmp7], %[ftmp1] \n\t"
2629 "punpcklhw %[ftmp7], %[ftmp7], %[ftmp1] \n\t"
2630 MMI_USDC1(%[ftmp2], %[addr5], 0x00)
2631 MMI_ULDC1(%[ftmp2], %[addr1], 0x00)
2632 "punpckhhw %[ftmp1], %[ftmp2], %[ftmp5] \n\t"
2633 "punpcklhw %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
2634 "punpckhwd %[ftmp5], %[ftmp0], %[ftmp4] \n\t"
2635 "punpcklwd %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
2636 "punpckhwd %[ftmp4], %[ftmp7], %[ftmp2] \n\t"
2637 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp2] \n\t"
2638 PTR_ADDU "%[addr5], %[addr1], %[stride] \n\t"
2639 MMI_USDC1(%[ftmp0], %[addr1], 0x00)
2640 PTR_ADDU "%[addr6], %[addr4], %[stride] \n\t"
2641 MMI_USDC1(%[ftmp5], %[addr5], 0x00)
2642 PTR_ADDU "%[addr5], %[addr4], %[addr0] \n\t"
2643 MMI_USDC1(%[ftmp7], %[addr6], 0x00)
2644 PTR_ADDU "%[addr6], %[addr1], %[addr0] \n\t"
2645 MMI_USDC1(%[ftmp4], %[addr5], 0x00)
2646 MMI_ULDC1(%[ftmp8], %[addr6], 0x00)
2647 PTR_ADDU "%[addr5], %[addr1], %[addr0] \n\t"
2648 "punpckhwd %[ftmp0], %[ftmp3], %[ftmp8] \n\t"
2649 "punpcklwd %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
2650 "punpckhwd %[ftmp5], %[ftmp6], %[ftmp1] \n\t"
2651 "punpcklwd %[ftmp6], %[ftmp6], %[ftmp1] \n\t"
2652 MMI_USDC1(%[ftmp3], %[addr5], 0x00)
2653 PTR_ADDU "%[addr5], %[addr4], %[addr2] \n\t"
2654 MMI_USDC1(%[ftmp0], %[addr4], 0x00)
2655 PTR_ADDU "%[addr6], %[addr4], %[addr3] \n\t"
2656 MMI_USDC1(%[ftmp6], %[addr5], 0x00)
2657 PTR_ADDU "%[addr5], %[addr3], %[addr3] \n\t"
2658 MMI_USDC1(%[ftmp5], %[addr6], 0x00)
2659 PTR_SUBU "%[addr1], %[addr1], %[addr5] \n\t"
2660 PTR_SUBU "%[addr4], %[addr4], %[addr5] \n\t"
2661 MMI_LDC1(%[ftmp0], %[ptmp], 0x00)
2662 MMI_LDC1(%[ftmp1], %[ptmp], 0x10)
2663 MMI_LDC1(%[ftmp2], %[ptmp], 0x20)
2664 MMI_LDC1(%[ftmp3], %[ptmp], 0x30)
2665 MMI_LDC1(%[ftmp4], %[ptmp], 0x40)
2666 MMI_LDC1(%[ftmp5], %[ptmp], 0x50)
2667 MMI_LDC1(%[ftmp6], %[ptmp], 0x60)
2668 "punpckhbh %[ftmp7], %[ftmp0], %[ftmp1] \n\t"
2669 "punpcklbh %[ftmp0], %[ftmp0], %[ftmp1] \n\t"
2670 "punpckhbh %[ftmp1], %[ftmp2], %[ftmp3] \n\t"
2671 "punpcklbh %[ftmp2], %[ftmp2], %[ftmp3] \n\t"
2672 "punpckhbh %[ftmp3], %[ftmp4], %[ftmp5] \n\t"
2673 "punpcklbh %[ftmp4], %[ftmp4], %[ftmp5] \n\t"
2674 MMI_LDC1(%[ftmp8], %[ptmp], 0x70)
2675 "punpckhbh %[ftmp5], %[ftmp6], %[ftmp8] \n\t"
2676 "punpcklbh %[ftmp6], %[ftmp6], %[ftmp8] \n\t"
2677 MMI_USDC1(%[ftmp3], %[addr1], 0x00)
2678 PTR_ADDU "%[addr5], %[addr1], %[addr0] \n\t"
2679 "punpckhhw %[ftmp3], %[ftmp0], %[ftmp2] \n\t"
2680 "punpcklhw %[ftmp0], %[ftmp0], %[ftmp2] \n\t"
2681 "punpckhhw %[ftmp2], %[ftmp4], %[ftmp6] \n\t"
2682 "punpcklhw %[ftmp4], %[ftmp4], %[ftmp6] \n\t"
2683 "punpckhhw %[ftmp6], %[ftmp7], %[ftmp1] \n\t"
2684 "punpcklhw %[ftmp7], %[ftmp7], %[ftmp1] \n\t"
2685 MMI_USDC1(%[ftmp2], %[addr5], 0x00)
2686 MMI_ULDC1(%[ftmp2], %[addr1], 0x00)
2687 "punpckhhw %[ftmp1], %[ftmp2], %[ftmp5] \n\t"
2688 "punpcklhw %[ftmp2], %[ftmp2], %[ftmp5] \n\t"
2689 "punpckhwd %[ftmp5], %[ftmp0], %[ftmp4] \n\t"
2690 "punpcklwd %[ftmp0], %[ftmp0], %[ftmp4] \n\t"
2691 "punpckhwd %[ftmp4], %[ftmp7], %[ftmp2] \n\t"
2692 "punpcklwd %[ftmp7], %[ftmp7], %[ftmp2] \n\t"
2693 PTR_ADDU "%[addr5], %[addr1], %[stride] \n\t"
2694 MMI_USDC1(%[ftmp0], %[addr1], 0x00)
2695 PTR_ADDU "%[addr6], %[addr4], %[stride] \n\t"
2696 MMI_USDC1(%[ftmp5], %[addr5], 0x00)
2697 PTR_ADDU "%[addr5], %[addr4], %[addr0] \n\t"
2698 MMI_USDC1(%[ftmp7], %[addr6], 0x00)
2699 PTR_ADDU "%[addr6], %[addr1], %[addr0] \n\t"
2700 MMI_USDC1(%[ftmp4], %[addr5], 0x00)
2701 MMI_ULDC1(%[ftmp8], %[addr6], 0x00)
2702 PTR_ADDU "%[addr5], %[addr1], %[addr0] \n\t"
2703 "punpckhwd %[ftmp0], %[ftmp3], %[ftmp8] \n\t"
2704 "punpcklwd %[ftmp3], %[ftmp3], %[ftmp8] \n\t"
2705 "punpckhwd %[ftmp5], %[ftmp6], %[ftmp1] \n\t"
2706 "punpcklwd %[ftmp6], %[ftmp6], %[ftmp1] \n\t"
2707 MMI_USDC1(%[ftmp3], %[addr5], 0x00)
2708 PTR_ADDU "%[addr5], %[addr4], %[addr2] \n\t"
2709 MMI_USDC1(%[ftmp0], %[addr4], 0x00)
2710 PTR_ADDU "%[addr6], %[addr4], %[addr3] \n\t"
2711 MMI_USDC1(%[ftmp6], %[addr5], 0x00)
2712 MMI_USDC1(%[ftmp5], %[addr6], 0x00)
2713 : [ftmp0]"=&f"(ftmp[0]), [ftmp1]"=&f"(ftmp[1]),
2714 [ftmp2]"=&f"(ftmp[2]), [ftmp3]"=&f"(ftmp[3]),
2715 [ftmp4]"=&f"(ftmp[4]), [ftmp5]"=&f"(ftmp[5]),
2716 [ftmp6]"=&f"(ftmp[6]), [ftmp7]"=&f"(ftmp[7]),
2717 [ftmp8]"=&f"(ftmp[8]),
2718 RESTRICT_ASM_ALL64
2719 [addr0]"=&r"(addr[0]), [addr1]"=&r"(addr[1]),
2720 [addr2]"=&r"(addr[2]), [addr3]"=&r"(addr[3]),
2721 [addr4]"=&r"(addr[4]), [addr5]"=&r"(addr[5]),
2722 [addr6]"=&r"(addr[6])
2723 : [pix]"r"(pix), [stride]"r"((mips_reg)stride),
2724 [ptmp]"r"(ptmp), [pdat]"r"(pdat)
2725 : "memory"
2726 );
2727 }
2728