]> git.sesse.net Git - x264/blob - common/x86/x86util.asm
x86util: Support ymm registers in HADD macros
[x264] / 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 licensing@x264.com.
25 ;*****************************************************************************
26
27 %assign FENC_STRIDE 16
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     PSHUFLW    %1, %2, (%3)*q1111
271 %if mmsize == 16
272     punpcklqdq %1, %1
273 %endif
274 %endmacro
275
276 %imacro SPLATD 2-3 0
277 %if mmsize == 16
278     pshufd %1, %2, (%3)*q1111
279 %else
280     pshufw %1, %2, (%3)*q0101 + ((%3)+1)*q1010
281 %endif
282 %endmacro
283
284 %macro CLIPW 3 ;(dst, min, max)
285     pmaxsw %1, %2
286     pminsw %1, %3
287 %endmacro
288
289 %macro HADDD 2 ; sum junk
290 %if sizeof%1 == 32
291 %define %2 xmm%2
292     vextracti128 %2, %1, 1
293 %define %1 xmm%1
294     paddd   %1, %2
295 %endif
296 %if mmsize >= 16
297     movhlps %2, %1
298     paddd   %1, %2
299 %endif
300     PSHUFLW %2, %1, q0032
301     paddd   %1, %2
302 %undef %1
303 %undef %2
304 %endmacro
305
306 %macro HADDW 2 ; reg, tmp
307 %if cpuflag(xop) && sizeof%1 == 16
308     vphaddwq  %1, %1
309     movhlps   %2, %1
310     paddd     %1, %2
311 %else
312     pmaddwd %1, [pw_1]
313     HADDD   %1, %2
314 %endif
315 %endmacro
316
317 %macro HADDUWD 2
318 %if cpuflag(xop) && sizeof%1 == 16
319     vphadduwd %1, %1
320 %else
321     psrld %2, %1, 16
322     pslld %1, 16
323     psrld %1, 16
324     paddd %1, %2
325 %endif
326 %endmacro
327
328 %macro HADDUW 2
329 %if cpuflag(xop) && sizeof%1 == 16
330     vphadduwq %1, %1
331     movhlps   %2, %1
332     paddd     %1, %2
333 %else
334     HADDUWD   %1, %2
335     HADDD     %1, %2
336 %endif
337 %endmacro
338
339 %macro PALIGNR 4-5 ; [dst,] src1, src2, imm, tmp
340 %if cpuflag(ssse3)
341     %if %0==5
342         palignr %1, %2, %3, %4
343     %else
344         palignr %1, %2, %3
345     %endif
346 %else
347     %define %%dst %1
348     %if %0==5
349         %ifnidn %1, %2
350             mova %%dst, %2
351         %endif
352         %rotate 1
353     %endif
354     %ifnidn %4, %2
355         mova %4, %2
356     %endif
357     %if mmsize==8
358         psllq  %%dst, (8-%3)*8
359         psrlq  %4, %3*8
360     %else
361         pslldq %%dst, 16-%3
362         psrldq %4, %3
363     %endif
364     por %%dst, %4
365 %endif
366 %endmacro
367
368 %macro PSHUFLW 1+
369     %if mmsize == 8
370         pshufw %1
371     %else
372         pshuflw %1
373     %endif
374 %endmacro
375
376 ; shift a mmxreg by n bytes, or a xmmreg by 2*n bytes
377 ; values shifted in are undefined
378 ; faster if dst==src
379 %define PSLLPIX PSXLPIX l, -1, ;dst, src, shift
380 %define PSRLPIX PSXLPIX r,  1, ;dst, src, shift
381 %macro PSXLPIX 5
382     %if mmsize == 8
383         %if %5&1
384             ps%1lq %3, %4, %5*8
385         %else
386             pshufw %3, %4, (q3210<<8>>(8+%2*%5))&0xff
387         %endif
388     %else
389         ps%1ldq %3, %4, %5*2
390     %endif
391 %endmacro
392
393 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
394 %ifnum %5
395     pand   m%3, m%5, m%4 ; src .. y6 .. y4
396     pand   m%1, m%5, m%2 ; dst .. y6 .. y4
397 %else
398     mova   m%1, %5
399     pand   m%3, m%1, m%4 ; src .. y6 .. y4
400     pand   m%1, m%1, m%2 ; dst .. y6 .. y4
401 %endif
402     psrlw  m%2, 8        ; dst .. y7 .. y5
403     psrlw  m%4, 8        ; src .. y7 .. y5
404 %endmacro
405
406 %macro SUMSUB_BA 3-4
407 %if %0==3
408     padd%1  m%2, m%3
409     padd%1  m%3, m%3
410     psub%1  m%3, m%2
411 %elif avx_enabled
412     padd%1  m%4, m%2, m%3
413     psub%1  m%3, m%2
414     SWAP    %2, %4
415 %else
416     mova    m%4, m%2
417     padd%1  m%2, m%3
418     psub%1  m%3, m%4
419 %endif
420 %endmacro
421
422 %macro SUMSUB_BADC 5-6
423 %if %0==6
424     SUMSUB_BA %1, %2, %3, %6
425     SUMSUB_BA %1, %4, %5, %6
426 %else
427     padd%1  m%2, m%3
428     padd%1  m%4, m%5
429     padd%1  m%3, m%3
430     padd%1  m%5, m%5
431     psub%1  m%3, m%2
432     psub%1  m%5, m%4
433 %endif
434 %endmacro
435
436 %macro HADAMARD4_V 4+
437     SUMSUB_BADC w, %1, %2, %3, %4
438     SUMSUB_BADC w, %1, %3, %2, %4
439 %endmacro
440
441 %macro HADAMARD8_V 8+
442     SUMSUB_BADC w, %1, %2, %3, %4
443     SUMSUB_BADC w, %5, %6, %7, %8
444     SUMSUB_BADC w, %1, %3, %2, %4
445     SUMSUB_BADC w, %5, %7, %6, %8
446     SUMSUB_BADC w, %1, %5, %2, %6
447     SUMSUB_BADC w, %3, %7, %4, %8
448 %endmacro
449
450 %macro TRANS_SSE2 5-6
451 ; TRANSPOSE2x2
452 ; %1: transpose width (d/q) - use SBUTTERFLY qdq for dq
453 ; %2: ord/unord (for compat with sse4, unused)
454 ; %3/%4: source regs
455 ; %5/%6: tmp regs
456 %ifidn %1, d
457 %define mask [mask_10]
458 %define shift 16
459 %elifidn %1, q
460 %define mask [mask_1100]
461 %define shift 32
462 %endif
463 %if %0==6 ; less dependency if we have two tmp
464     mova   m%5, mask   ; ff00
465     mova   m%6, m%4    ; x5x4
466     psll%1 m%4, shift  ; x4..
467     pand   m%6, m%5    ; x5..
468     pandn  m%5, m%3    ; ..x0
469     psrl%1 m%3, shift  ; ..x1
470     por    m%4, m%5    ; x4x0
471     por    m%3, m%6    ; x5x1
472 %else ; more dependency, one insn less. sometimes faster, sometimes not
473     mova   m%5, m%4    ; x5x4
474     psll%1 m%4, shift  ; x4..
475     pxor   m%4, m%3    ; (x4^x1)x0
476     pand   m%4, mask   ; (x4^x1)..
477     pxor   m%3, m%4    ; x4x0
478     psrl%1 m%4, shift  ; ..(x1^x4)
479     pxor   m%5, m%4    ; x5x1
480     SWAP   %4, %3, %5
481 %endif
482 %endmacro
483
484 %macro TRANS_SSE4 5-6 ; see above
485 %ifidn %1, d
486 %ifidn %2, ord
487     psrl%1  m%5, m%3, 16
488     pblendw m%5, m%4, q2222
489     psll%1  m%4, 16
490     pblendw m%4, m%3, q1111
491     SWAP     %3, %5
492 %else
493 %if avx_enabled
494     pblendw m%5, m%3, m%4, q2222
495     SWAP     %3, %5
496 %else
497     mova    m%5, m%3
498     pblendw m%3, m%4, q2222
499 %endif
500     psll%1  m%4, 16
501     psrl%1  m%5, 16
502     por     m%4, m%5
503 %endif
504 %elifidn %1, q
505     shufps m%5, m%3, m%4, q3131
506     shufps m%3, m%3, m%4, q2020
507     SWAP    %4, %5
508 %endif
509 %endmacro
510
511 %macro TRANS_XOP 5-6
512 %ifidn %1, d
513     vpperm m%5, m%3, m%4, [transd_shuf1]
514     vpperm m%3, m%3, m%4, [transd_shuf2]
515 %elifidn %1, q
516     shufps m%5, m%3, m%4, q3131
517     shufps m%3, m%4, q2020
518 %endif
519     SWAP    %4, %5
520 %endmacro
521
522 %macro HADAMARD 5-6
523 ; %1=distance in words (0 for vertical pass, 1/2/4 for horizontal passes)
524 ; %2=sumsub/max/amax (sum and diff / maximum / maximum of absolutes)
525 ; %3/%4: regs
526 ; %5(%6): tmpregs
527 %if %1!=0 ; have to reorder stuff for horizontal op
528     %ifidn %2, sumsub
529         %define ORDER ord
530         ; sumsub needs order because a-b != b-a unless a=b
531     %else
532         %define ORDER unord
533         ; if we just max, order doesn't matter (allows pblendw+or in sse4)
534     %endif
535     %if %1==1
536         TRANS d, ORDER, %3, %4, %5, %6
537     %elif %1==2
538         %if mmsize==8
539             SBUTTERFLY dq, %3, %4, %5
540         %else
541             TRANS q, ORDER, %3, %4, %5, %6
542         %endif
543     %elif %1==4
544         SBUTTERFLY qdq, %3, %4, %5
545     %elif %1==8
546         SBUTTERFLY dqqq, %3, %4, %5
547     %endif
548 %endif
549 %ifidn %2, sumsub
550     SUMSUB_BA w, %3, %4, %5
551 %else
552     %ifidn %2, amax
553         %if %0==6
554             ABSW2 m%3, m%4, m%3, m%4, m%5, m%6
555         %else
556             ABSW m%3, m%3, m%5
557             ABSW m%4, m%4, m%5
558         %endif
559     %endif
560     pmaxsw m%3, m%4
561 %endif
562 %endmacro
563
564
565 %macro HADAMARD2_2D 6-7 sumsub
566     HADAMARD 0, sumsub, %1, %2, %5
567     HADAMARD 0, sumsub, %3, %4, %5
568     SBUTTERFLY %6, %1, %2, %5
569 %ifnum %7
570     HADAMARD 0, amax, %1, %2, %5, %7
571 %else
572     HADAMARD 0, %7, %1, %2, %5
573 %endif
574     SBUTTERFLY %6, %3, %4, %5
575 %ifnum %7
576     HADAMARD 0, amax, %3, %4, %5, %7
577 %else
578     HADAMARD 0, %7, %3, %4, %5
579 %endif
580 %endmacro
581
582 %macro HADAMARD4_2D 5-6 sumsub
583     HADAMARD2_2D %1, %2, %3, %4, %5, wd
584     HADAMARD2_2D %1, %3, %2, %4, %5, dq, %6
585     SWAP %2, %3
586 %endmacro
587
588 %macro HADAMARD4_2D_SSE 5-6 sumsub
589     HADAMARD  0, sumsub, %1, %2, %5 ; 1st V row 0 + 1
590     HADAMARD  0, sumsub, %3, %4, %5 ; 1st V row 2 + 3
591     SBUTTERFLY   wd, %1, %2, %5     ; %1: m0 1+0 %2: m1 1+0
592     SBUTTERFLY   wd, %3, %4, %5     ; %3: m0 3+2 %4: m1 3+2
593     HADAMARD2_2D %1, %3, %2, %4, %5, dq
594     SBUTTERFLY  qdq, %1, %2, %5
595     HADAMARD  0, %6, %1, %2, %5     ; 2nd H m1/m0 row 0+1
596     SBUTTERFLY  qdq, %3, %4, %5
597     HADAMARD  0, %6, %3, %4, %5     ; 2nd H m1/m0 row 2+3
598 %endmacro
599
600 %macro HADAMARD8_2D 9-10 sumsub
601     HADAMARD2_2D %1, %2, %3, %4, %9, wd
602     HADAMARD2_2D %5, %6, %7, %8, %9, wd
603     HADAMARD2_2D %1, %3, %2, %4, %9, dq
604     HADAMARD2_2D %5, %7, %6, %8, %9, dq
605     HADAMARD2_2D %1, %5, %3, %7, %9, qdq, %10
606     HADAMARD2_2D %2, %6, %4, %8, %9, qdq, %10
607 %ifnidn %10, amax
608     SWAP %2, %5
609     SWAP %4, %7
610 %endif
611 %endmacro
612
613 ; doesn't include the "pmaddubsw hmul_8p" pass
614 %macro HADAMARD8_2D_HMUL 10
615     HADAMARD4_V %1, %2, %3, %4, %9
616     HADAMARD4_V %5, %6, %7, %8, %9
617     SUMSUB_BADC w, %1, %5, %2, %6, %9
618     HADAMARD 2, sumsub, %1, %5, %9, %10
619     HADAMARD 2, sumsub, %2, %6, %9, %10
620     SUMSUB_BADC w, %3, %7, %4, %8, %9
621     HADAMARD 2, sumsub, %3, %7, %9, %10
622     HADAMARD 2, sumsub, %4, %8, %9, %10
623     HADAMARD 1, amax, %1, %5, %9, %10
624     HADAMARD 1, amax, %2, %6, %9, %5
625     HADAMARD 1, amax, %3, %7, %9, %5
626     HADAMARD 1, amax, %4, %8, %9, %5
627 %endmacro
628
629 %macro SUMSUB2_AB 4
630 %if cpuflag(xop)
631     pmacs%1%1 m%4, m%3, [p%1_m2], m%2
632     pmacs%1%1 m%2, m%2, [p%1_2], m%3
633 %elifnum %3
634     psub%1  m%4, m%2, m%3
635     psub%1  m%4, m%3
636     padd%1  m%2, m%2
637     padd%1  m%2, m%3
638 %else
639     mova    m%4, m%2
640     padd%1  m%2, m%2
641     padd%1  m%2, %3
642     psub%1  m%4, %3
643     psub%1  m%4, %3
644 %endif
645 %endmacro
646
647 %macro SUMSUBD2_AB 5
648 %ifnum %4
649     psra%1  m%5, m%2, 1  ; %3: %3>>1
650     psra%1  m%4, m%3, 1  ; %2: %2>>1
651     padd%1  m%4, m%2     ; %3: %3>>1+%2
652     psub%1  m%5, m%3     ; %2: %2>>1-%3
653     SWAP     %2, %5
654     SWAP     %3, %4
655 %else
656     mova    %5, m%2
657     mova    %4, m%3
658     psra%1  m%3, 1  ; %3: %3>>1
659     psra%1  m%2, 1  ; %2: %2>>1
660     padd%1  m%3, %5 ; %3: %3>>1+%2
661     psub%1  m%2, %4 ; %2: %2>>1-%3
662 %endif
663 %endmacro
664
665 %macro DCT4_1D 5
666 %ifnum %5
667     SUMSUB_BADC w, %4, %1, %3, %2, %5
668     SUMSUB_BA   w, %3, %4, %5
669     SUMSUB2_AB  w, %1, %2, %5
670     SWAP %1, %3, %4, %5, %2
671 %else
672     SUMSUB_BADC w, %4, %1, %3, %2
673     SUMSUB_BA   w, %3, %4
674     mova     [%5], m%2
675     SUMSUB2_AB  w, %1, [%5], %2
676     SWAP %1, %3, %4, %2
677 %endif
678 %endmacro
679
680 %macro IDCT4_1D 6-7
681 %ifnum %6
682     SUMSUBD2_AB %1, %3, %5, %7, %6
683     ; %3: %3>>1-%5 %5: %3+%5>>1
684     SUMSUB_BA   %1, %4, %2, %7
685     ; %4: %2+%4 %2: %2-%4
686     SUMSUB_BADC %1, %5, %4, %3, %2, %7
687     ; %5: %2+%4 + (%3+%5>>1)
688     ; %4: %2+%4 - (%3+%5>>1)
689     ; %3: %2-%4 + (%3>>1-%5)
690     ; %2: %2-%4 - (%3>>1-%5)
691 %else
692 %ifidn %1, w
693     SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
694 %else
695     SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
696 %endif
697     SUMSUB_BA   %1, %4, %2
698     SUMSUB_BADC %1, %5, %4, %3, %2
699 %endif
700     SWAP %2, %5, %4
701     ; %2: %2+%4 + (%3+%5>>1) row0
702     ; %3: %2-%4 + (%3>>1-%5) row1
703     ; %4: %2-%4 - (%3>>1-%5) row2
704     ; %5: %2+%4 - (%3+%5>>1) row3
705 %endmacro
706
707
708 %macro LOAD_DIFF 5-6 1
709 %if HIGH_BIT_DEPTH
710 %if %6 ; %5 aligned?
711     mova       %1, %4
712     psubw      %1, %5
713 %else
714     movu       %1, %4
715     movu       %2, %5
716     psubw      %1, %2
717 %endif
718 %else ; !HIGH_BIT_DEPTH
719 %ifidn %3, none
720     movh       %1, %4
721     movh       %2, %5
722     punpcklbw  %1, %2
723     punpcklbw  %2, %2
724     psubw      %1, %2
725 %else
726     movh       %1, %4
727     punpcklbw  %1, %3
728     movh       %2, %5
729     punpcklbw  %2, %3
730     psubw      %1, %2
731 %endif
732 %endif ; HIGH_BIT_DEPTH
733 %endmacro
734
735 %macro LOAD_DIFF8x4 8 ; 4x dst, 1x tmp, 1x mul, 2x ptr
736 %if BIT_DEPTH == 8 && cpuflag(ssse3)
737     movh       m%2, [%8+%1*FDEC_STRIDE]
738     movh       m%1, [%7+%1*FENC_STRIDE]
739     punpcklbw  m%1, m%2
740     movh       m%3, [%8+%2*FDEC_STRIDE]
741     movh       m%2, [%7+%2*FENC_STRIDE]
742     punpcklbw  m%2, m%3
743     movh       m%4, [%8+%3*FDEC_STRIDE]
744     movh       m%3, [%7+%3*FENC_STRIDE]
745     punpcklbw  m%3, m%4
746     movh       m%5, [%8+%4*FDEC_STRIDE]
747     movh       m%4, [%7+%4*FENC_STRIDE]
748     punpcklbw  m%4, m%5
749     pmaddubsw  m%1, m%6
750     pmaddubsw  m%2, m%6
751     pmaddubsw  m%3, m%6
752     pmaddubsw  m%4, m%6
753 %else
754     LOAD_DIFF  m%1, m%5, m%6, [%7+%1*FENC_STRIDEB], [%8+%1*FDEC_STRIDEB]
755     LOAD_DIFF  m%2, m%5, m%6, [%7+%2*FENC_STRIDEB], [%8+%2*FDEC_STRIDEB]
756     LOAD_DIFF  m%3, m%5, m%6, [%7+%3*FENC_STRIDEB], [%8+%3*FDEC_STRIDEB]
757     LOAD_DIFF  m%4, m%5, m%6, [%7+%4*FENC_STRIDEB], [%8+%4*FDEC_STRIDEB]
758 %endif
759 %endmacro
760
761 %macro STORE_DCT 6
762     movq   [%5+%6+ 0], m%1
763     movq   [%5+%6+ 8], m%2
764     movq   [%5+%6+16], m%3
765     movq   [%5+%6+24], m%4
766     movhps [%5+%6+32], m%1
767     movhps [%5+%6+40], m%2
768     movhps [%5+%6+48], m%3
769     movhps [%5+%6+56], m%4
770 %endmacro
771
772 %macro STORE_IDCT 4
773     movhps [r0-4*FDEC_STRIDE], %1
774     movh   [r0-3*FDEC_STRIDE], %1
775     movhps [r0-2*FDEC_STRIDE], %2
776     movh   [r0-1*FDEC_STRIDE], %2
777     movhps [r0+0*FDEC_STRIDE], %3
778     movh   [r0+1*FDEC_STRIDE], %3
779     movhps [r0+2*FDEC_STRIDE], %4
780     movh   [r0+3*FDEC_STRIDE], %4
781 %endmacro
782
783 %macro LOAD_DIFF_8x4P 7-11 r0,r2,0,1 ; 4x dest, 2x temp, 2x pointer, increment, aligned?
784     LOAD_DIFF m%1, m%5, m%7, [%8],      [%9],      %11
785     LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3],   %11
786     LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3], %11
787     LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5],   %11
788 %if %10
789     lea %8, [%8+4*r1]
790     lea %9, [%9+4*r3]
791 %endif
792 %endmacro
793
794 ; 2xdst, 2xtmp, 2xsrcrow
795 %macro LOAD_DIFF16x2_AVX2 6
796     pmovzxbw m%1, [r1+%5*FENC_STRIDE]
797     pmovzxbw m%2, [r1+%6*FENC_STRIDE]
798     pmovzxbw m%3, [r2+(%5-4)*FDEC_STRIDE]
799     pmovzxbw m%4, [r2+(%6-4)*FDEC_STRIDE]
800     psubw    m%1, m%3
801     psubw    m%2, m%4
802 %endmacro
803
804 %macro DIFFx2 6-7
805     movh       %3, %5
806     punpcklbw  %3, %4
807     psraw      %1, 6
808     paddsw     %1, %3
809     movh       %3, %6
810     punpcklbw  %3, %4
811     psraw      %2, 6
812     paddsw     %2, %3
813     packuswb   %2, %1
814 %endmacro
815
816 ; (high depth) in: %1, %2, min to clip, max to clip, mem128
817 ; in: %1, tmp, %3, mem64
818 %macro STORE_DIFF 4-5
819 %if HIGH_BIT_DEPTH
820     psrad      %1, 6
821     psrad      %2, 6
822     packssdw   %1, %2
823     paddw      %1, %5
824     CLIPW      %1, %3, %4
825     mova       %5, %1
826 %else
827     movh       %2, %4
828     punpcklbw  %2, %3
829     psraw      %1, 6
830     paddsw     %1, %2
831     packuswb   %1, %1
832     movh       %4, %1
833 %endif
834 %endmacro
835
836 %macro SHUFFLE_MASK_W 8
837     %rep 8
838         %if %1>=0x80
839             db %1, %1
840         %else
841             db %1*2
842             db %1*2+1
843         %endif
844         %rotate 1
845     %endrep
846 %endmacro
847
848 ; instruction, accum, input, iteration (zero to swap, nonzero to add)
849 %macro ACCUM 4
850 %if %4
851     %1        m%2, m%3
852 %else
853     SWAP       %2, %3
854 %endif
855 %endmacro