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