Commit | Line | Data |
---|---|---|
72b9787e JB |
1 | ;***************************************************************************** |
2 | ;* x86util.asm: x86 utility macros | |
3 | ;***************************************************************************** | |
4 | ;* Copyright (C) 2008-2013 x264 project | |
5 | ;* | |
6 | ;* Authors: Holger Lubitz <holger@lubitz.org> | |
7 | ;* Loren Merritt <lorenm@u.washington.edu> | |
8 | ;* | |
9 | ;* This program is free software; you can redistribute it and/or modify | |
10 | ;* it under the terms of the GNU General Public License as published by | |
11 | ;* the Free Software Foundation; either version 2 of the License, or | |
12 | ;* (at your option) any later version. | |
13 | ;* | |
14 | ;* This program is distributed in the hope that it will be useful, | |
15 | ;* but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | ;* GNU General Public License for more details. | |
18 | ;* | |
19 | ;* You should have received a copy of the GNU General Public License | |
20 | ;* along with this program; if not, write to the Free Software | |
21 | ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA. | |
22 | ;* | |
23 | ;* This program is also available under a commercial proprietary license. | |
24 | ;* For more information, contact us at license @ x265.com. | |
25 | ;***************************************************************************** | |
26 | ||
27 | %assign FENC_STRIDE 64 | |
28 | %assign FDEC_STRIDE 32 | |
29 | ||
30 | %assign SIZEOF_PIXEL 1 | |
31 | %assign SIZEOF_DCTCOEF 2 | |
32 | %define pixel byte | |
33 | %define vpbroadcastdct vpbroadcastw | |
34 | %define vpbroadcastpix vpbroadcastb | |
35 | %if HIGH_BIT_DEPTH | |
36 | %assign SIZEOF_PIXEL 2 | |
37 | %assign SIZEOF_DCTCOEF 4 | |
38 | %define pixel word | |
39 | %define vpbroadcastdct vpbroadcastd | |
40 | %define vpbroadcastpix vpbroadcastw | |
41 | %endif | |
42 | ||
43 | %assign FENC_STRIDEB SIZEOF_PIXEL*FENC_STRIDE | |
44 | %assign FDEC_STRIDEB SIZEOF_PIXEL*FDEC_STRIDE | |
45 | ||
46 | %assign PIXEL_MAX ((1 << BIT_DEPTH)-1) | |
47 | ||
48 | %macro FIX_STRIDES 1-* | |
49 | %if HIGH_BIT_DEPTH | |
50 | %rep %0 | |
51 | add %1, %1 | |
52 | %rotate 1 | |
53 | %endrep | |
54 | %endif | |
55 | %endmacro | |
56 | ||
57 | ||
58 | %macro SBUTTERFLY 4 | |
59 | %ifidn %1, dqqq | |
60 | vperm2i128 m%4, m%2, m%3, q0301 ; punpckh | |
61 | vinserti128 m%2, m%2, xm%3, 1 ; punpckl | |
62 | %elif avx_enabled && mmsize >= 16 | |
63 | punpckh%1 m%4, m%2, m%3 | |
64 | punpckl%1 m%2, m%3 | |
65 | %else | |
66 | mova m%4, m%2 | |
67 | punpckl%1 m%2, m%3 | |
68 | punpckh%1 m%4, m%3 | |
69 | %endif | |
70 | SWAP %3, %4 | |
71 | %endmacro | |
72 | ||
73 | %macro SBUTTERFLY2 4 | |
74 | punpckl%1 m%4, m%2, m%3 | |
75 | punpckh%1 m%2, m%2, m%3 | |
76 | SWAP %2, %4, %3 | |
77 | %endmacro | |
78 | ||
79 | %macro TRANSPOSE4x4W 5 | |
80 | SBUTTERFLY wd, %1, %2, %5 | |
81 | SBUTTERFLY wd, %3, %4, %5 | |
82 | SBUTTERFLY dq, %1, %3, %5 | |
83 | SBUTTERFLY dq, %2, %4, %5 | |
84 | SWAP %2, %3 | |
85 | %endmacro | |
86 | ||
87 | %macro TRANSPOSE2x4x4W 5 | |
88 | SBUTTERFLY wd, %1, %2, %5 | |
89 | SBUTTERFLY wd, %3, %4, %5 | |
90 | SBUTTERFLY dq, %1, %3, %5 | |
91 | SBUTTERFLY dq, %2, %4, %5 | |
92 | SBUTTERFLY qdq, %1, %2, %5 | |
93 | SBUTTERFLY qdq, %3, %4, %5 | |
94 | %endmacro | |
95 | ||
96 | %macro TRANSPOSE4x4D 5 | |
97 | SBUTTERFLY dq, %1, %2, %5 | |
98 | SBUTTERFLY dq, %3, %4, %5 | |
99 | SBUTTERFLY qdq, %1, %3, %5 | |
100 | SBUTTERFLY qdq, %2, %4, %5 | |
101 | SWAP %2, %3 | |
102 | %endmacro | |
103 | ||
104 | %macro TRANSPOSE8x8W 9-11 | |
105 | %if ARCH_X86_64 | |
106 | SBUTTERFLY wd, %1, %2, %9 | |
107 | SBUTTERFLY wd, %3, %4, %9 | |
108 | SBUTTERFLY wd, %5, %6, %9 | |
109 | SBUTTERFLY wd, %7, %8, %9 | |
110 | SBUTTERFLY dq, %1, %3, %9 | |
111 | SBUTTERFLY dq, %2, %4, %9 | |
112 | SBUTTERFLY dq, %5, %7, %9 | |
113 | SBUTTERFLY dq, %6, %8, %9 | |
114 | SBUTTERFLY qdq, %1, %5, %9 | |
115 | SBUTTERFLY qdq, %2, %6, %9 | |
116 | SBUTTERFLY qdq, %3, %7, %9 | |
117 | SBUTTERFLY qdq, %4, %8, %9 | |
118 | SWAP %2, %5 | |
119 | SWAP %4, %7 | |
120 | %else | |
121 | ; in: m0..m7, unless %11 in which case m6 is in %9 | |
122 | ; out: m0..m7, unless %11 in which case m4 is in %10 | |
123 | ; spills into %9 and %10 | |
124 | %if %0<11 | |
125 | movdqa %9, m%7 | |
126 | %endif | |
127 | SBUTTERFLY wd, %1, %2, %7 | |
128 | movdqa %10, m%2 | |
129 | movdqa m%7, %9 | |
130 | SBUTTERFLY wd, %3, %4, %2 | |
131 | SBUTTERFLY wd, %5, %6, %2 | |
132 | SBUTTERFLY wd, %7, %8, %2 | |
133 | SBUTTERFLY dq, %1, %3, %2 | |
134 | movdqa %9, m%3 | |
135 | movdqa m%2, %10 | |
136 | SBUTTERFLY dq, %2, %4, %3 | |
137 | SBUTTERFLY dq, %5, %7, %3 | |
138 | SBUTTERFLY dq, %6, %8, %3 | |
139 | SBUTTERFLY qdq, %1, %5, %3 | |
140 | SBUTTERFLY qdq, %2, %6, %3 | |
141 | movdqa %10, m%2 | |
142 | movdqa m%3, %9 | |
143 | SBUTTERFLY qdq, %3, %7, %2 | |
144 | SBUTTERFLY qdq, %4, %8, %2 | |
145 | SWAP %2, %5 | |
146 | SWAP %4, %7 | |
147 | %if %0<11 | |
148 | movdqa m%5, %10 | |
149 | %endif | |
150 | %endif | |
151 | %endmacro | |
152 | ||
153 | %macro WIDEN_SXWD 2 | |
154 | punpckhwd m%2, m%1 | |
155 | psrad m%2, 16 | |
156 | %if cpuflag(sse4) | |
157 | pmovsxwd m%1, m%1 | |
158 | %else | |
159 | punpcklwd m%1, m%1 | |
160 | psrad m%1, 16 | |
161 | %endif | |
162 | %endmacro | |
163 | ||
164 | %macro ABSW 2-3 ; dst, src, tmp (tmp used only if dst==src) | |
165 | %if cpuflag(ssse3) | |
166 | pabsw %1, %2 | |
167 | %elifidn %3, sign ; version for pairing with PSIGNW: modifies src | |
168 | pxor %1, %1 | |
169 | pcmpgtw %1, %2 | |
170 | pxor %2, %1 | |
171 | psubw %2, %1 | |
172 | SWAP %1, %2 | |
173 | %elifidn %1, %2 | |
174 | pxor %3, %3 | |
175 | psubw %3, %1 | |
176 | pmaxsw %1, %3 | |
177 | %elifid %2 | |
178 | pxor %1, %1 | |
179 | psubw %1, %2 | |
180 | pmaxsw %1, %2 | |
181 | %elif %0 == 2 | |
182 | pxor %1, %1 | |
183 | psubw %1, %2 | |
184 | pmaxsw %1, %2 | |
185 | %else | |
186 | mova %1, %2 | |
187 | pxor %3, %3 | |
188 | psubw %3, %1 | |
189 | pmaxsw %1, %3 | |
190 | %endif | |
191 | %endmacro | |
192 | ||
193 | %macro ABSW2 6 ; dst1, dst2, src1, src2, tmp, tmp | |
194 | %if cpuflag(ssse3) | |
195 | pabsw %1, %3 | |
196 | pabsw %2, %4 | |
197 | %elifidn %1, %3 | |
198 | pxor %5, %5 | |
199 | pxor %6, %6 | |
200 | psubw %5, %1 | |
201 | psubw %6, %2 | |
202 | pmaxsw %1, %5 | |
203 | pmaxsw %2, %6 | |
204 | %else | |
205 | pxor %1, %1 | |
206 | pxor %2, %2 | |
207 | psubw %1, %3 | |
208 | psubw %2, %4 | |
209 | pmaxsw %1, %3 | |
210 | pmaxsw %2, %4 | |
211 | %endif | |
212 | %endmacro | |
213 | ||
214 | %macro ABSB 2 | |
215 | %if cpuflag(ssse3) | |
216 | pabsb %1, %1 | |
217 | %else | |
218 | pxor %2, %2 | |
219 | psubb %2, %1 | |
220 | pminub %1, %2 | |
221 | %endif | |
222 | %endmacro | |
223 | ||
224 | %macro ABSD 2-3 | |
225 | %if cpuflag(ssse3) | |
226 | pabsd %1, %2 | |
227 | %else | |
228 | %define %%s %2 | |
229 | %if %0 == 3 | |
230 | mova %3, %2 | |
231 | %define %%s %3 | |
232 | %endif | |
233 | pxor %1, %1 | |
234 | pcmpgtd %1, %%s | |
235 | pxor %%s, %1 | |
236 | psubd %%s, %1 | |
237 | SWAP %1, %%s | |
238 | %endif | |
239 | %endmacro | |
240 | ||
241 | %macro PSIGN 3-4 | |
242 | %if cpuflag(ssse3) && %0 == 4 | |
243 | psign%1 %2, %3, %4 | |
244 | %elif cpuflag(ssse3) | |
245 | psign%1 %2, %3 | |
246 | %elif %0 == 4 | |
247 | pxor %2, %3, %4 | |
248 | psub%1 %2, %4 | |
249 | %else | |
250 | pxor %2, %3 | |
251 | psub%1 %2, %3 | |
252 | %endif | |
253 | %endmacro | |
254 | ||
255 | %define PSIGNW PSIGN w, | |
256 | %define PSIGND PSIGN d, | |
257 | ||
258 | %macro SPLATB_LOAD 3 | |
259 | %if cpuflag(ssse3) | |
260 | movd %1, [%2-3] | |
261 | pshufb %1, %3 | |
262 | %else | |
263 | movd %1, [%2-3] ;to avoid crossing a cacheline | |
264 | punpcklbw %1, %1 | |
265 | SPLATW %1, %1, 3 | |
266 | %endif | |
267 | %endmacro | |
268 | ||
269 | %imacro SPLATW 2-3 0 | |
270 | %if cpuflag(avx2) && %3 == 0 | |
271 | vpbroadcastw %1, %2 | |
272 | %else | |
273 | PSHUFLW %1, %2, (%3)*q1111 | |
274 | %if mmsize == 16 | |
275 | punpcklqdq %1, %1 | |
276 | %endif | |
277 | %endif | |
278 | %endmacro | |
279 | ||
280 | %imacro SPLATD 2-3 0 | |
281 | %if mmsize == 16 | |
282 | pshufd %1, %2, (%3)*q1111 | |
283 | %else | |
284 | pshufw %1, %2, (%3)*q0101 + ((%3)+1)*q1010 | |
285 | %endif | |
286 | %endmacro | |
287 | ||
288 | %macro CLIPW 3 ;(dst, min, max) | |
289 | pmaxsw %1, %2 | |
290 | pminsw %1, %3 | |
291 | %endmacro | |
292 | ||
293 | %macro CLIPW2 4 ;(dst0, dst1, min, max) | |
294 | pmaxsw %1, %3 | |
295 | pmaxsw %2, %3 | |
296 | pminsw %1, %4 | |
297 | pminsw %2, %4 | |
298 | %endmacro | |
299 | ||
300 | %macro HADDD 2 ; sum junk | |
301 | %if sizeof%1 == 32 | |
302 | %define %2 xmm%2 | |
303 | vextracti128 %2, %1, 1 | |
304 | %define %1 xmm%1 | |
305 | paddd %1, %2 | |
306 | %endif | |
307 | %if mmsize >= 16 | |
308 | %if cpuflag(xop) && sizeof%1 == 16 | |
309 | vphadddq %1, %1 | |
310 | %endif | |
311 | movhlps %2, %1 | |
312 | paddd %1, %2 | |
313 | %endif | |
314 | %if notcpuflag(xop) | |
315 | PSHUFLW %2, %1, q0032 | |
316 | paddd %1, %2 | |
317 | %endif | |
318 | %undef %1 | |
319 | %undef %2 | |
320 | %endmacro | |
321 | ||
322 | %macro HADDW 2 ; reg, tmp | |
323 | %if cpuflag(xop) && sizeof%1 == 16 | |
324 | vphaddwq %1, %1 | |
325 | movhlps %2, %1 | |
326 | paddd %1, %2 | |
327 | %else | |
328 | pmaddwd %1, [pw_1] | |
329 | HADDD %1, %2 | |
330 | %endif | |
331 | %endmacro | |
332 | ||
333 | %macro HADDUWD 2 | |
334 | %if cpuflag(xop) && sizeof%1 == 16 | |
335 | vphadduwd %1, %1 | |
336 | %else | |
337 | psrld %2, %1, 16 | |
338 | pslld %1, 16 | |
339 | psrld %1, 16 | |
340 | paddd %1, %2 | |
341 | %endif | |
342 | %endmacro | |
343 | ||
344 | %macro HADDUW 2 | |
345 | %if cpuflag(xop) && sizeof%1 == 16 | |
346 | vphadduwq %1, %1 | |
347 | movhlps %2, %1 | |
348 | paddd %1, %2 | |
349 | %else | |
350 | HADDUWD %1, %2 | |
351 | HADDD %1, %2 | |
352 | %endif | |
353 | %endmacro | |
354 | ||
355 | %macro PALIGNR 4-5 ; [dst,] src1, src2, imm, tmp | |
356 | ; AVX2 version uses a precalculated extra input that | |
357 | ; can be re-used across calls | |
358 | %if sizeof%1==32 | |
359 | ; %3 = abcdefgh ijklmnop (lower address) | |
360 | ; %2 = ABCDEFGH IJKLMNOP (higher address) | |
361 | ; vperm2i128 %5, %2, %3, q0003 ; %5 = ijklmnop ABCDEFGH | |
362 | %if %4 < 16 | |
363 | palignr %1, %5, %3, %4 ; %1 = bcdefghi jklmnopA | |
364 | %else | |
365 | palignr %1, %2, %5, %4-16 ; %1 = pABCDEFG HIJKLMNO | |
366 | %endif | |
367 | %elif cpuflag(ssse3) | |
368 | %if %0==5 | |
369 | palignr %1, %2, %3, %4 | |
370 | %else | |
371 | palignr %1, %2, %3 | |
372 | %endif | |
373 | %else | |
374 | %define %%dst %1 | |
375 | %if %0==5 | |
376 | %ifnidn %1, %2 | |
377 | mova %%dst, %2 | |
378 | %endif | |
379 | %rotate 1 | |
380 | %endif | |
381 | %ifnidn %4, %2 | |
382 | mova %4, %2 | |
383 | %endif | |
384 | %if mmsize==8 | |
385 | psllq %%dst, (8-%3)*8 | |
386 | psrlq %4, %3*8 | |
387 | %else | |
388 | pslldq %%dst, 16-%3 | |
389 | psrldq %4, %3 | |
390 | %endif | |
391 | por %%dst, %4 | |
392 | %endif | |
393 | %endmacro | |
394 | ||
395 | %macro PSHUFLW 1+ | |
396 | %if mmsize == 8 | |
397 | pshufw %1 | |
398 | %else | |
399 | pshuflw %1 | |
400 | %endif | |
401 | %endmacro | |
402 | ||
403 | ; shift a mmxreg by n bytes, or a xmmreg by 2*n bytes | |
404 | ; values shifted in are undefined | |
405 | ; faster if dst==src | |
406 | %define PSLLPIX PSXLPIX l, -1, ;dst, src, shift | |
407 | %define PSRLPIX PSXLPIX r, 1, ;dst, src, shift | |
408 | %macro PSXLPIX 5 | |
409 | %if mmsize == 8 | |
410 | %if %5&1 | |
411 | ps%1lq %3, %4, %5*8 | |
412 | %else | |
413 | pshufw %3, %4, (q3210<<8>>(8+%2*%5))&0xff | |
414 | %endif | |
415 | %else | |
416 | ps%1ldq %3, %4, %5*2 | |
417 | %endif | |
418 | %endmacro | |
419 | ||
420 | %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from | |
421 | %ifnum %5 | |
422 | pand m%3, m%5, m%4 ; src .. y6 .. y4 | |
423 | pand m%1, m%5, m%2 ; dst .. y6 .. y4 | |
424 | %else | |
425 | mova m%1, %5 | |
426 | pand m%3, m%1, m%4 ; src .. y6 .. y4 | |
427 | pand m%1, m%1, m%2 ; dst .. y6 .. y4 | |
428 | %endif | |
429 | psrlw m%2, 8 ; dst .. y7 .. y5 | |
430 | psrlw m%4, 8 ; src .. y7 .. y5 | |
431 | %endmacro | |
432 | ||
433 | %macro SUMSUB_BA 3-4 | |
434 | %if %0==3 | |
435 | padd%1 m%2, m%3 | |
436 | padd%1 m%3, m%3 | |
437 | psub%1 m%3, m%2 | |
438 | %elif avx_enabled | |
439 | padd%1 m%4, m%2, m%3 | |
440 | psub%1 m%3, m%2 | |
441 | SWAP %2, %4 | |
442 | %else | |
443 | mova m%4, m%2 | |
444 | padd%1 m%2, m%3 | |
445 | psub%1 m%3, m%4 | |
446 | %endif | |
447 | %endmacro | |
448 | ||
449 | %macro SUMSUB_BADC 5-6 | |
450 | %if %0==6 | |
451 | SUMSUB_BA %1, %2, %3, %6 | |
452 | SUMSUB_BA %1, %4, %5, %6 | |
453 | %else | |
454 | padd%1 m%2, m%3 | |
455 | padd%1 m%4, m%5 | |
456 | padd%1 m%3, m%3 | |
457 | padd%1 m%5, m%5 | |
458 | psub%1 m%3, m%2 | |
459 | psub%1 m%5, m%4 | |
460 | %endif | |
461 | %endmacro | |
462 | ||
463 | %macro HADAMARD4_V 4+ | |
464 | SUMSUB_BADC w, %1, %2, %3, %4 | |
465 | SUMSUB_BADC w, %1, %3, %2, %4 | |
466 | %endmacro | |
467 | ||
468 | %macro HADAMARD8_V 8+ | |
469 | SUMSUB_BADC w, %1, %2, %3, %4 | |
470 | SUMSUB_BADC w, %5, %6, %7, %8 | |
471 | SUMSUB_BADC w, %1, %3, %2, %4 | |
472 | SUMSUB_BADC w, %5, %7, %6, %8 | |
473 | SUMSUB_BADC w, %1, %5, %2, %6 | |
474 | SUMSUB_BADC w, %3, %7, %4, %8 | |
475 | %endmacro | |
476 | ||
477 | %macro TRANS_SSE2 5-6 | |
478 | ; TRANSPOSE2x2 | |
479 | ; %1: transpose width (d/q) - use SBUTTERFLY qdq for dq | |
480 | ; %2: ord/unord (for compat with sse4, unused) | |
481 | ; %3/%4: source regs | |
482 | ; %5/%6: tmp regs | |
483 | %ifidn %1, d | |
484 | %define mask [mask_10] | |
485 | %define shift 16 | |
486 | %elifidn %1, q | |
487 | %define mask [mask_1100] | |
488 | %define shift 32 | |
489 | %endif | |
490 | %if %0==6 ; less dependency if we have two tmp | |
491 | mova m%5, mask ; ff00 | |
492 | mova m%6, m%4 ; x5x4 | |
493 | psll%1 m%4, shift ; x4.. | |
494 | pand m%6, m%5 ; x5.. | |
495 | pandn m%5, m%3 ; ..x0 | |
496 | psrl%1 m%3, shift ; ..x1 | |
497 | por m%4, m%5 ; x4x0 | |
498 | por m%3, m%6 ; x5x1 | |
499 | %else ; more dependency, one insn less. sometimes faster, sometimes not | |
500 | mova m%5, m%4 ; x5x4 | |
501 | psll%1 m%4, shift ; x4.. | |
502 | pxor m%4, m%3 ; (x4^x1)x0 | |
503 | pand m%4, mask ; (x4^x1).. | |
504 | pxor m%3, m%4 ; x4x0 | |
505 | psrl%1 m%4, shift ; ..(x1^x4) | |
506 | pxor m%5, m%4 ; x5x1 | |
507 | SWAP %4, %3, %5 | |
508 | %endif | |
509 | %endmacro | |
510 | ||
511 | %macro TRANS_SSE4 5-6 ; see above | |
512 | %ifidn %1, d | |
513 | %ifidn %2, ord | |
514 | psrl%1 m%5, m%3, 16 | |
515 | pblendw m%5, m%4, q2222 | |
516 | psll%1 m%4, 16 | |
517 | pblendw m%4, m%3, q1111 | |
518 | SWAP %3, %5 | |
519 | %else | |
520 | %if avx_enabled | |
521 | pblendw m%5, m%3, m%4, q2222 | |
522 | SWAP %3, %5 | |
523 | %else | |
524 | mova m%5, m%3 | |
525 | pblendw m%3, m%4, q2222 | |
526 | %endif | |
527 | psll%1 m%4, 16 | |
528 | psrl%1 m%5, 16 | |
529 | por m%4, m%5 | |
530 | %endif | |
531 | %elifidn %1, q | |
532 | shufps m%5, m%3, m%4, q3131 | |
533 | shufps m%3, m%3, m%4, q2020 | |
534 | SWAP %4, %5 | |
535 | %endif | |
536 | %endmacro | |
537 | ||
538 | %macro TRANS_XOP 5-6 | |
539 | %ifidn %1, d | |
540 | vpperm m%5, m%3, m%4, [transd_shuf1] | |
541 | vpperm m%3, m%3, m%4, [transd_shuf2] | |
542 | %elifidn %1, q | |
543 | shufps m%5, m%3, m%4, q3131 | |
544 | shufps m%3, m%4, q2020 | |
545 | %endif | |
546 | SWAP %4, %5 | |
547 | %endmacro | |
548 | ||
549 | %macro HADAMARD 5-6 | |
550 | ; %1=distance in words (0 for vertical pass, 1/2/4 for horizontal passes) | |
551 | ; %2=sumsub/max/amax (sum and diff / maximum / maximum of absolutes) | |
552 | ; %3/%4: regs | |
553 | ; %5(%6): tmpregs | |
554 | %if %1!=0 ; have to reorder stuff for horizontal op | |
555 | %ifidn %2, sumsub | |
556 | %define ORDER ord | |
557 | ; sumsub needs order because a-b != b-a unless a=b | |
558 | %else | |
559 | %define ORDER unord | |
560 | ; if we just max, order doesn't matter (allows pblendw+or in sse4) | |
561 | %endif | |
562 | %if %1==1 | |
563 | TRANS d, ORDER, %3, %4, %5, %6 | |
564 | %elif %1==2 | |
565 | %if mmsize==8 | |
566 | SBUTTERFLY dq, %3, %4, %5 | |
567 | %else | |
568 | TRANS q, ORDER, %3, %4, %5, %6 | |
569 | %endif | |
570 | %elif %1==4 | |
571 | SBUTTERFLY qdq, %3, %4, %5 | |
572 | %elif %1==8 | |
573 | SBUTTERFLY dqqq, %3, %4, %5 | |
574 | %endif | |
575 | %endif | |
576 | %ifidn %2, sumsub | |
577 | SUMSUB_BA w, %3, %4, %5 | |
578 | %else | |
579 | %ifidn %2, amax | |
580 | %if %0==6 | |
581 | ABSW2 m%3, m%4, m%3, m%4, m%5, m%6 | |
582 | %else | |
583 | ABSW m%3, m%3, m%5 | |
584 | ABSW m%4, m%4, m%5 | |
585 | %endif | |
586 | %endif | |
587 | pmaxsw m%3, m%4 | |
588 | %endif | |
589 | %endmacro | |
590 | ||
591 | ||
592 | %macro HADAMARD2_2D 6-7 sumsub | |
593 | HADAMARD 0, sumsub, %1, %2, %5 | |
594 | HADAMARD 0, sumsub, %3, %4, %5 | |
595 | SBUTTERFLY %6, %1, %2, %5 | |
596 | %ifnum %7 | |
597 | HADAMARD 0, amax, %1, %2, %5, %7 | |
598 | %else | |
599 | HADAMARD 0, %7, %1, %2, %5 | |
600 | %endif | |
601 | SBUTTERFLY %6, %3, %4, %5 | |
602 | %ifnum %7 | |
603 | HADAMARD 0, amax, %3, %4, %5, %7 | |
604 | %else | |
605 | HADAMARD 0, %7, %3, %4, %5 | |
606 | %endif | |
607 | %endmacro | |
608 | ||
609 | %macro HADAMARD4_2D 5-6 sumsub | |
610 | HADAMARD2_2D %1, %2, %3, %4, %5, wd | |
611 | HADAMARD2_2D %1, %3, %2, %4, %5, dq, %6 | |
612 | SWAP %2, %3 | |
613 | %endmacro | |
614 | ||
615 | %macro HADAMARD4_2D_SSE 5-6 sumsub | |
616 | HADAMARD 0, sumsub, %1, %2, %5 ; 1st V row 0 + 1 | |
617 | HADAMARD 0, sumsub, %3, %4, %5 ; 1st V row 2 + 3 | |
618 | SBUTTERFLY wd, %1, %2, %5 ; %1: m0 1+0 %2: m1 1+0 | |
619 | SBUTTERFLY wd, %3, %4, %5 ; %3: m0 3+2 %4: m1 3+2 | |
620 | HADAMARD2_2D %1, %3, %2, %4, %5, dq | |
621 | SBUTTERFLY qdq, %1, %2, %5 | |
622 | HADAMARD 0, %6, %1, %2, %5 ; 2nd H m1/m0 row 0+1 | |
623 | SBUTTERFLY qdq, %3, %4, %5 | |
624 | HADAMARD 0, %6, %3, %4, %5 ; 2nd H m1/m0 row 2+3 | |
625 | %endmacro | |
626 | ||
627 | %macro HADAMARD8_2D 9-10 sumsub | |
628 | HADAMARD2_2D %1, %2, %3, %4, %9, wd | |
629 | HADAMARD2_2D %5, %6, %7, %8, %9, wd | |
630 | HADAMARD2_2D %1, %3, %2, %4, %9, dq | |
631 | HADAMARD2_2D %5, %7, %6, %8, %9, dq | |
632 | HADAMARD2_2D %1, %5, %3, %7, %9, qdq, %10 | |
633 | HADAMARD2_2D %2, %6, %4, %8, %9, qdq, %10 | |
634 | %ifnidn %10, amax | |
635 | SWAP %2, %5 | |
636 | SWAP %4, %7 | |
637 | %endif | |
638 | %endmacro | |
639 | ||
640 | ; doesn't include the "pmaddubsw hmul_8p" pass | |
641 | %macro HADAMARD8_2D_HMUL 10 | |
642 | HADAMARD4_V %1, %2, %3, %4, %9 | |
643 | HADAMARD4_V %5, %6, %7, %8, %9 | |
644 | SUMSUB_BADC w, %1, %5, %2, %6, %9 | |
645 | HADAMARD 2, sumsub, %1, %5, %9, %10 | |
646 | HADAMARD 2, sumsub, %2, %6, %9, %10 | |
647 | SUMSUB_BADC w, %3, %7, %4, %8, %9 | |
648 | HADAMARD 2, sumsub, %3, %7, %9, %10 | |
649 | HADAMARD 2, sumsub, %4, %8, %9, %10 | |
650 | HADAMARD 1, amax, %1, %5, %9, %10 | |
651 | HADAMARD 1, amax, %2, %6, %9, %5 | |
652 | HADAMARD 1, amax, %3, %7, %9, %5 | |
653 | HADAMARD 1, amax, %4, %8, %9, %5 | |
654 | %endmacro | |
655 | ||
656 | %macro SUMSUB2_AB 4 | |
657 | %if cpuflag(xop) | |
658 | pmacs%1%1 m%4, m%3, [p%1_m2], m%2 | |
659 | pmacs%1%1 m%2, m%2, [p%1_2], m%3 | |
660 | %elifnum %3 | |
661 | psub%1 m%4, m%2, m%3 | |
662 | psub%1 m%4, m%3 | |
663 | padd%1 m%2, m%2 | |
664 | padd%1 m%2, m%3 | |
665 | %else | |
666 | mova m%4, m%2 | |
667 | padd%1 m%2, m%2 | |
668 | padd%1 m%2, %3 | |
669 | psub%1 m%4, %3 | |
670 | psub%1 m%4, %3 | |
671 | %endif | |
672 | %endmacro | |
673 | ||
674 | %macro SUMSUBD2_AB 5 | |
675 | %ifnum %4 | |
676 | psra%1 m%5, m%2, 1 ; %3: %3>>1 | |
677 | psra%1 m%4, m%3, 1 ; %2: %2>>1 | |
678 | padd%1 m%4, m%2 ; %3: %3>>1+%2 | |
679 | psub%1 m%5, m%3 ; %2: %2>>1-%3 | |
680 | SWAP %2, %5 | |
681 | SWAP %3, %4 | |
682 | %else | |
683 | mova %5, m%2 | |
684 | mova %4, m%3 | |
685 | psra%1 m%3, 1 ; %3: %3>>1 | |
686 | psra%1 m%2, 1 ; %2: %2>>1 | |
687 | padd%1 m%3, %5 ; %3: %3>>1+%2 | |
688 | psub%1 m%2, %4 ; %2: %2>>1-%3 | |
689 | %endif | |
690 | %endmacro | |
691 | ||
692 | %macro DCT4_1D 5 | |
693 | %ifnum %5 | |
694 | SUMSUB_BADC w, %4, %1, %3, %2, %5 | |
695 | SUMSUB_BA w, %3, %4, %5 | |
696 | SUMSUB2_AB w, %1, %2, %5 | |
697 | SWAP %1, %3, %4, %5, %2 | |
698 | %else | |
699 | SUMSUB_BADC w, %4, %1, %3, %2 | |
700 | SUMSUB_BA w, %3, %4 | |
701 | mova [%5], m%2 | |
702 | SUMSUB2_AB w, %1, [%5], %2 | |
703 | SWAP %1, %3, %4, %2 | |
704 | %endif | |
705 | %endmacro | |
706 | ||
707 | %macro IDCT4_1D 6-7 | |
708 | %ifnum %6 | |
709 | SUMSUBD2_AB %1, %3, %5, %7, %6 | |
710 | ; %3: %3>>1-%5 %5: %3+%5>>1 | |
711 | SUMSUB_BA %1, %4, %2, %7 | |
712 | ; %4: %2+%4 %2: %2-%4 | |
713 | SUMSUB_BADC %1, %5, %4, %3, %2, %7 | |
714 | ; %5: %2+%4 + (%3+%5>>1) | |
715 | ; %4: %2+%4 - (%3+%5>>1) | |
716 | ; %3: %2-%4 + (%3>>1-%5) | |
717 | ; %2: %2-%4 - (%3>>1-%5) | |
718 | %else | |
719 | %ifidn %1, w | |
720 | SUMSUBD2_AB %1, %3, %5, [%6], [%6+16] | |
721 | %else | |
722 | SUMSUBD2_AB %1, %3, %5, [%6], [%6+32] | |
723 | %endif | |
724 | SUMSUB_BA %1, %4, %2 | |
725 | SUMSUB_BADC %1, %5, %4, %3, %2 | |
726 | %endif | |
727 | SWAP %2, %5, %4 | |
728 | ; %2: %2+%4 + (%3+%5>>1) row0 | |
729 | ; %3: %2-%4 + (%3>>1-%5) row1 | |
730 | ; %4: %2-%4 - (%3>>1-%5) row2 | |
731 | ; %5: %2+%4 - (%3+%5>>1) row3 | |
732 | %endmacro | |
733 | ||
734 | ||
735 | %macro LOAD_DIFF 5-6 1 | |
736 | %if HIGH_BIT_DEPTH | |
737 | %if %6 ; %5 aligned? | |
738 | mova %1, %4 | |
739 | psubw %1, %5 | |
740 | %else | |
741 | movu %1, %4 | |
742 | movu %2, %5 | |
743 | psubw %1, %2 | |
744 | %endif | |
745 | %else ; !HIGH_BIT_DEPTH | |
746 | %ifidn %3, none | |
747 | movh %1, %4 | |
748 | movh %2, %5 | |
749 | punpcklbw %1, %2 | |
750 | punpcklbw %2, %2 | |
751 | psubw %1, %2 | |
752 | %else | |
753 | movh %1, %4 | |
754 | punpcklbw %1, %3 | |
755 | movh %2, %5 | |
756 | punpcklbw %2, %3 | |
757 | psubw %1, %2 | |
758 | %endif | |
759 | %endif ; HIGH_BIT_DEPTH | |
760 | %endmacro | |
761 | ||
762 | %macro LOAD_DIFF8x4 8 ; 4x dst, 1x tmp, 1x mul, 2x ptr | |
763 | %if BIT_DEPTH == 8 && cpuflag(ssse3) | |
764 | movh m%2, [%8+%1*FDEC_STRIDE] | |
765 | movh m%1, [%7+%1*FENC_STRIDE] | |
766 | punpcklbw m%1, m%2 | |
767 | movh m%3, [%8+%2*FDEC_STRIDE] | |
768 | movh m%2, [%7+%2*FENC_STRIDE] | |
769 | punpcklbw m%2, m%3 | |
770 | movh m%4, [%8+%3*FDEC_STRIDE] | |
771 | movh m%3, [%7+%3*FENC_STRIDE] | |
772 | punpcklbw m%3, m%4 | |
773 | movh m%5, [%8+%4*FDEC_STRIDE] | |
774 | movh m%4, [%7+%4*FENC_STRIDE] | |
775 | punpcklbw m%4, m%5 | |
776 | pmaddubsw m%1, m%6 | |
777 | pmaddubsw m%2, m%6 | |
778 | pmaddubsw m%3, m%6 | |
779 | pmaddubsw m%4, m%6 | |
780 | %else | |
781 | LOAD_DIFF m%1, m%5, m%6, [%7+%1*FENC_STRIDEB], [%8+%1*FDEC_STRIDEB] | |
782 | LOAD_DIFF m%2, m%5, m%6, [%7+%2*FENC_STRIDEB], [%8+%2*FDEC_STRIDEB] | |
783 | LOAD_DIFF m%3, m%5, m%6, [%7+%3*FENC_STRIDEB], [%8+%3*FDEC_STRIDEB] | |
784 | LOAD_DIFF m%4, m%5, m%6, [%7+%4*FENC_STRIDEB], [%8+%4*FDEC_STRIDEB] | |
785 | %endif | |
786 | %endmacro | |
787 | ||
788 | %macro STORE_DCT 6 | |
789 | movq [%5+%6+ 0], m%1 | |
790 | movq [%5+%6+ 8], m%2 | |
791 | movq [%5+%6+16], m%3 | |
792 | movq [%5+%6+24], m%4 | |
793 | movhps [%5+%6+32], m%1 | |
794 | movhps [%5+%6+40], m%2 | |
795 | movhps [%5+%6+48], m%3 | |
796 | movhps [%5+%6+56], m%4 | |
797 | %endmacro | |
798 | ||
799 | %macro STORE_IDCT 4 | |
800 | movhps [r0-4*FDEC_STRIDE], %1 | |
801 | movh [r0-3*FDEC_STRIDE], %1 | |
802 | movhps [r0-2*FDEC_STRIDE], %2 | |
803 | movh [r0-1*FDEC_STRIDE], %2 | |
804 | movhps [r0+0*FDEC_STRIDE], %3 | |
805 | movh [r0+1*FDEC_STRIDE], %3 | |
806 | movhps [r0+2*FDEC_STRIDE], %4 | |
807 | movh [r0+3*FDEC_STRIDE], %4 | |
808 | %endmacro | |
809 | ||
810 | %macro LOAD_DIFF_8x4P 7-11 r0,r2,0,1 ; 4x dest, 2x temp, 2x pointer, increment, aligned? | |
811 | LOAD_DIFF m%1, m%5, m%7, [%8], [%9], %11 | |
812 | LOAD_DIFF m%2, m%6, m%7, [%8+r1], [%9+r3], %11 | |
813 | LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3], %11 | |
814 | LOAD_DIFF m%4, m%6, m%7, [%8+r4], [%9+r5], %11 | |
815 | %if %10 | |
816 | lea %8, [%8+4*r1] | |
817 | lea %9, [%9+4*r3] | |
818 | %endif | |
819 | %endmacro | |
820 | ||
821 | ; 2xdst, 2xtmp, 2xsrcrow | |
822 | %macro LOAD_DIFF16x2_AVX2 6 | |
823 | pmovzxbw m%1, [r1+%5*FENC_STRIDE] | |
824 | pmovzxbw m%2, [r1+%6*FENC_STRIDE] | |
825 | pmovzxbw m%3, [r2+(%5-4)*FDEC_STRIDE] | |
826 | pmovzxbw m%4, [r2+(%6-4)*FDEC_STRIDE] | |
827 | psubw m%1, m%3 | |
828 | psubw m%2, m%4 | |
829 | %endmacro | |
830 | ||
831 | %macro DIFFx2 6-7 | |
832 | movh %3, %5 | |
833 | punpcklbw %3, %4 | |
834 | psraw %1, 6 | |
835 | paddsw %1, %3 | |
836 | movh %3, %6 | |
837 | punpcklbw %3, %4 | |
838 | psraw %2, 6 | |
839 | paddsw %2, %3 | |
840 | packuswb %2, %1 | |
841 | %endmacro | |
842 | ||
843 | ; (high depth) in: %1, %2, min to clip, max to clip, mem128 | |
844 | ; in: %1, tmp, %3, mem64 | |
845 | %macro STORE_DIFF 4-5 | |
846 | %if HIGH_BIT_DEPTH | |
847 | psrad %1, 6 | |
848 | psrad %2, 6 | |
849 | packssdw %1, %2 | |
850 | paddw %1, %5 | |
851 | CLIPW %1, %3, %4 | |
852 | mova %5, %1 | |
853 | %else | |
854 | movh %2, %4 | |
855 | punpcklbw %2, %3 | |
856 | psraw %1, 6 | |
857 | paddsw %1, %2 | |
858 | packuswb %1, %1 | |
859 | movh %4, %1 | |
860 | %endif | |
861 | %endmacro | |
862 | ||
863 | %macro SHUFFLE_MASK_W 8 | |
864 | %rep 8 | |
865 | %if %1>=0x80 | |
866 | db %1, %1 | |
867 | %else | |
868 | db %1*2 | |
869 | db %1*2+1 | |
870 | %endif | |
871 | %rotate 1 | |
872 | %endrep | |
873 | %endmacro | |
874 | ||
875 | ; instruction, accum, input, iteration (zero to swap, nonzero to add) | |
876 | %macro ACCUM 4 | |
877 | %if %4 | |
878 | %1 m%2, m%3 | |
879 | %else | |
880 | SWAP %2, %3 | |
881 | %endif | |
882 | %endmacro | |
883 | ||
884 | ; IACA support | |
885 | %macro IACA_START 0 | |
886 | mov ebx, 111 | |
887 | db 0x64, 0x67, 0x90 | |
888 | %endmacro | |
889 | ||
890 | %macro IACA_END 0 | |
891 | mov ebx, 222 | |
892 | db 0x64, 0x67, 0x90 | |
893 | %endmacro |