Imported Upstream version 1.4
[deb_x265.git] / source / common / x86 / x86util.asm
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