avcodec/x86: deduplicate PASS8ROWS macro
[ffmpeg.git] / libavutil / x86 / x86util.asm
1 ;*****************************************************************************
2 ;* x86util.asm
3 ;*****************************************************************************
4 ;* Copyright (C) 2008-2010 x264 project
5 ;*
6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
7 ;*          Holger Lubitz <holger@lubitz.org>
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 %define private_prefix ff
27 %define public_prefix  avpriv
28 %define cpuflags_mmxext cpuflags_mmx2
29
30 %include "libavutil/x86/x86inc.asm"
31
32 ; expands to [base],...,[base+7*stride]
33 %define PASS8ROWS(base, base3, stride, stride3) \
34     [base],           [base  + stride],   [base  + 2*stride], [base3], \
35     [base3 + stride], [base3 + 2*stride], [base3 + stride3],  [base3 + stride*4]
36
37 %macro SBUTTERFLY 4
38 %ifidn %1, dqqq
39     vperm2i128  m%4, m%2, m%3, q0301
40     vinserti128 m%2, m%2, xm%3, 1
41 %elif avx_enabled == 0
42     mova      m%4, m%2
43     punpckl%1 m%2, m%3
44     punpckh%1 m%4, m%3
45 %else
46     punpckh%1 m%4, m%2, m%3
47     punpckl%1 m%2, m%3
48 %endif
49     SWAP %3, %4
50 %endmacro
51
52 %macro SBUTTERFLY2 4
53     punpckl%1 m%4, m%2, m%3
54     punpckh%1 m%2, m%2, m%3
55     SWAP %2, %4, %3
56 %endmacro
57
58 %macro SBUTTERFLYPS 3
59     unpcklps m%3, m%1, m%2
60     unpckhps m%1, m%1, m%2
61     SWAP %1, %3, %2
62 %endmacro
63
64 %macro TRANSPOSE4x4B 5
65     SBUTTERFLY bw, %1, %2, %5
66     SBUTTERFLY bw, %3, %4, %5
67     SBUTTERFLY wd, %1, %3, %5
68     SBUTTERFLY wd, %2, %4, %5
69     SWAP %2, %3
70 %endmacro
71
72 %macro TRANSPOSE4x4W 5
73     SBUTTERFLY wd, %1, %2, %5
74     SBUTTERFLY wd, %3, %4, %5
75     SBUTTERFLY dq, %1, %3, %5
76     SBUTTERFLY dq, %2, %4, %5
77     SWAP %2, %3
78 %endmacro
79
80 %macro TRANSPOSE2x4x4B 5
81     SBUTTERFLY bw,  %1, %2, %5
82     SBUTTERFLY bw,  %3, %4, %5
83     SBUTTERFLY wd,  %1, %3, %5
84     SBUTTERFLY wd,  %2, %4, %5
85     SBUTTERFLY dq,  %1, %2, %5
86     SBUTTERFLY dq,  %3, %4, %5
87 %endmacro
88
89 %macro TRANSPOSE2x4x4W 5
90     SBUTTERFLY wd,  %1, %2, %5
91     SBUTTERFLY wd,  %3, %4, %5
92     SBUTTERFLY dq,  %1, %3, %5
93     SBUTTERFLY dq,  %2, %4, %5
94     SBUTTERFLY qdq, %1, %2, %5
95     SBUTTERFLY qdq, %3, %4, %5
96 %endmacro
97
98 %macro TRANSPOSE4x4D 5
99     SBUTTERFLY dq,  %1, %2, %5
100     SBUTTERFLY dq,  %3, %4, %5
101     SBUTTERFLY qdq, %1, %3, %5
102     SBUTTERFLY qdq, %2, %4, %5
103     SWAP %2, %3
104 %endmacro
105
106 ; identical behavior to TRANSPOSE4x4D, but using SSE1 float ops
107 %macro TRANSPOSE4x4PS 5
108     SBUTTERFLYPS %1, %2, %5
109     SBUTTERFLYPS %3, %4, %5
110     movlhps m%5, m%1, m%3
111     movhlps m%3, m%1
112     SWAP %5, %1
113     movlhps m%5, m%2, m%4
114     movhlps m%4, m%2
115     SWAP %5, %2, %3
116 %endmacro
117
118 %macro TRANSPOSE8x4D 9-11
119 %if ARCH_X86_64
120     SBUTTERFLY dq,  %1, %2, %9
121     SBUTTERFLY dq,  %3, %4, %9
122     SBUTTERFLY dq,  %5, %6, %9
123     SBUTTERFLY dq,  %7, %8, %9
124     SBUTTERFLY qdq, %1, %3, %9
125     SBUTTERFLY qdq, %2, %4, %9
126     SBUTTERFLY qdq, %5, %7, %9
127     SBUTTERFLY qdq, %6, %8, %9
128     SWAP %2, %5
129     SWAP %4, %7
130 %else
131 ; in:  m0..m7
132 ; out: m0..m7, unless %11 in which case m2 is in %9
133 ; spills into %9 and %10
134     movdqa %9, m%7
135     SBUTTERFLY dq,  %1, %2, %7
136     movdqa %10, m%2
137     movdqa m%7, %9
138     SBUTTERFLY dq,  %3, %4, %2
139     SBUTTERFLY dq,  %5, %6, %2
140     SBUTTERFLY dq,  %7, %8, %2
141     SBUTTERFLY qdq, %1, %3, %2
142     movdqa %9, m%3
143     movdqa m%2, %10
144     SBUTTERFLY qdq, %2, %4, %3
145     SBUTTERFLY qdq, %5, %7, %3
146     SBUTTERFLY qdq, %6, %8, %3
147     SWAP %2, %5
148     SWAP %4, %7
149 %if %0<11
150     movdqa m%3, %9
151 %endif
152 %endif
153 %endmacro
154
155 %macro TRANSPOSE8x8W 9-11
156 %if ARCH_X86_64
157     SBUTTERFLY wd,  %1, %2, %9
158     SBUTTERFLY wd,  %3, %4, %9
159     SBUTTERFLY wd,  %5, %6, %9
160     SBUTTERFLY wd,  %7, %8, %9
161     SBUTTERFLY dq,  %1, %3, %9
162     SBUTTERFLY dq,  %2, %4, %9
163     SBUTTERFLY dq,  %5, %7, %9
164     SBUTTERFLY dq,  %6, %8, %9
165     SBUTTERFLY qdq, %1, %5, %9
166     SBUTTERFLY qdq, %2, %6, %9
167     SBUTTERFLY qdq, %3, %7, %9
168     SBUTTERFLY qdq, %4, %8, %9
169     SWAP %2, %5
170     SWAP %4, %7
171 %else
172 ; in:  m0..m7, unless %11 in which case m6 is in %9
173 ; out: m0..m7, unless %11 in which case m4 is in %10
174 ; spills into %9 and %10
175 %if %0<11
176     movdqa %9, m%7
177 %endif
178     SBUTTERFLY wd,  %1, %2, %7
179     movdqa %10, m%2
180     movdqa m%7, %9
181     SBUTTERFLY wd,  %3, %4, %2
182     SBUTTERFLY wd,  %5, %6, %2
183     SBUTTERFLY wd,  %7, %8, %2
184     SBUTTERFLY dq,  %1, %3, %2
185     movdqa %9, m%3
186     movdqa m%2, %10
187     SBUTTERFLY dq,  %2, %4, %3
188     SBUTTERFLY dq,  %5, %7, %3
189     SBUTTERFLY dq,  %6, %8, %3
190     SBUTTERFLY qdq, %1, %5, %3
191     SBUTTERFLY qdq, %2, %6, %3
192     movdqa %10, m%2
193     movdqa m%3, %9
194     SBUTTERFLY qdq, %3, %7, %2
195     SBUTTERFLY qdq, %4, %8, %2
196     SWAP %2, %5
197     SWAP %4, %7
198 %if %0<11
199     movdqa m%5, %10
200 %endif
201 %endif
202 %endmacro
203
204 %macro TRANSPOSE16x16W 18-19
205 ; in:  m0..m15, unless %19 in which case m6 is in %17
206 ; out: m0..m15, unless %19 in which case m4 is in %18
207 ; spills into %17 and %18
208 %if %0 < 19
209     mova       %17, m%7
210 %endif
211
212     SBUTTERFLY dqqq, %1,  %9, %7
213     SBUTTERFLY dqqq, %2, %10, %7
214     SBUTTERFLY dqqq, %3, %11, %7
215     SBUTTERFLY dqqq, %4, %12, %7
216     SBUTTERFLY dqqq, %5, %13, %7
217     SBUTTERFLY dqqq, %6, %14, %7
218     mova       %18, m%14
219     mova       m%7, %17
220     SBUTTERFLY dqqq, %7, %15, %14
221     SBUTTERFLY dqqq, %8, %16, %14
222
223     SBUTTERFLY  wd,  %1,  %2, %14
224     SBUTTERFLY  wd,  %3,  %4, %14
225     SBUTTERFLY  wd,  %5,  %6, %14
226     SBUTTERFLY  wd,  %7,  %8, %14
227     SBUTTERFLY  wd,  %9, %10, %14
228     SBUTTERFLY  wd, %11, %12, %14
229     mova       %17, m%12
230     mova      m%14, %18
231     SBUTTERFLY  wd, %13, %14, %12
232     SBUTTERFLY  wd, %15, %16, %12
233
234     SBUTTERFLY  dq,  %1,  %3, %12
235     SBUTTERFLY  dq,  %2,  %4, %12
236     SBUTTERFLY  dq,  %5,  %7, %12
237     SBUTTERFLY  dq,  %6,  %8, %12
238     SBUTTERFLY  dq,  %9, %11, %12
239     mova       %18, m%11
240     mova      m%12, %17
241     SBUTTERFLY  dq, %10, %12, %11
242     SBUTTERFLY  dq, %13, %15, %11
243     SBUTTERFLY  dq, %14, %16, %11
244
245     SBUTTERFLY qdq,  %1,  %5, %11
246     SBUTTERFLY qdq,  %2,  %6, %11
247     SBUTTERFLY qdq,  %3,  %7, %11
248     SBUTTERFLY qdq,  %4,  %8, %11
249
250     SWAP        %2, %5
251     SWAP        %4, %7
252
253     SBUTTERFLY qdq,  %9, %13, %11
254     SBUTTERFLY qdq, %10, %14, %11
255     mova      m%11, %18
256     mova       %18, m%5
257     SBUTTERFLY qdq, %11, %15, %5
258     SBUTTERFLY qdq, %12, %16, %5
259
260 %if %0 < 19
261     mova       m%5, %18
262 %endif
263
264     SWAP       %10, %13
265     SWAP       %12, %15
266 %endmacro
267
268 ; PABSW macro assumes %1 != %2, while ABS1/2 macros work in-place
269 %macro PABSW 2
270 %if cpuflag(ssse3)
271     pabsw      %1, %2
272 %elif cpuflag(mmxext)
273     pxor    %1, %1
274     psubw   %1, %2
275     pmaxsw  %1, %2
276 %else
277     pxor       %1, %1
278     pcmpgtw    %1, %2
279     pxor       %2, %1
280     psubw      %2, %1
281     SWAP       %1, %2
282 %endif
283 %endmacro
284
285 %macro PSIGNW 2
286 %if cpuflag(ssse3)
287     psignw     %1, %2
288 %else
289     pxor       %1, %2
290     psubw      %1, %2
291 %endif
292 %endmacro
293
294 %macro ABS1 2
295 %if cpuflag(ssse3)
296     pabsw   %1, %1
297 %elif cpuflag(mmxext) ; a, tmp
298     pxor    %2, %2
299     psubw   %2, %1
300     pmaxsw  %1, %2
301 %else ; a, tmp
302     pxor       %2, %2
303     pcmpgtw    %2, %1
304     pxor       %1, %2
305     psubw      %1, %2
306 %endif
307 %endmacro
308
309 %macro ABS2 4
310 %if cpuflag(ssse3)
311     pabsw   %1, %1
312     pabsw   %2, %2
313 %elif cpuflag(mmxext) ; a, b, tmp0, tmp1
314     pxor    %3, %3
315     pxor    %4, %4
316     psubw   %3, %1
317     psubw   %4, %2
318     pmaxsw  %1, %3
319     pmaxsw  %2, %4
320 %else ; a, b, tmp0, tmp1
321     pxor       %3, %3
322     pxor       %4, %4
323     pcmpgtw    %3, %1
324     pcmpgtw    %4, %2
325     pxor       %1, %3
326     pxor       %2, %4
327     psubw      %1, %3
328     psubw      %2, %4
329 %endif
330 %endmacro
331
332 %macro ABSB 2 ; source mmreg, temp mmreg (unused for ssse3)
333 %if cpuflag(ssse3)
334     pabsb   %1, %1
335 %else
336     pxor    %2, %2
337     psubb   %2, %1
338     pminub  %1, %2
339 %endif
340 %endmacro
341
342 %macro ABSB2 4 ; src1, src2, tmp1, tmp2 (tmp1/2 unused for SSSE3)
343 %if cpuflag(ssse3)
344     pabsb   %1, %1
345     pabsb   %2, %2
346 %else
347     pxor    %3, %3
348     pxor    %4, %4
349     psubb   %3, %1
350     psubb   %4, %2
351     pminub  %1, %3
352     pminub  %2, %4
353 %endif
354 %endmacro
355
356 %macro ABSD2_MMX 4
357     pxor    %3, %3
358     pxor    %4, %4
359     pcmpgtd %3, %1
360     pcmpgtd %4, %2
361     pxor    %1, %3
362     pxor    %2, %4
363     psubd   %1, %3
364     psubd   %2, %4
365 %endmacro
366
367 %macro ABS4 6
368     ABS2 %1, %2, %5, %6
369     ABS2 %3, %4, %5, %6
370 %endmacro
371
372 %macro SPLATB_LOAD 3
373 %if cpuflag(ssse3)
374     movd      %1, [%2-3]
375     pshufb    %1, %3
376 %else
377     movd      %1, [%2-3] ;to avoid crossing a cacheline
378     punpcklbw %1, %1
379     SPLATW    %1, %1, 3
380 %endif
381 %endmacro
382
383 %macro SPLATB_REG 3
384 %if cpuflag(ssse3)
385     movd      %1, %2d
386     pshufb    %1, %3
387 %else
388     movd      %1, %2d
389     punpcklbw %1, %1
390     SPLATW    %1, %1, 0
391 %endif
392 %endmacro
393
394 %macro HADDD 2 ; sum junk
395 %if sizeof%1 == 32
396 %define %2 xmm%2
397     vextracti128 %2, %1, 1
398 %define %1 xmm%1
399     paddd   %1, %2
400 %endif
401 %if mmsize >= 16
402 %if cpuflag(xop) && sizeof%1 == 16
403     vphadddq %1, %1
404 %endif
405     movhlps %2, %1
406     paddd   %1, %2
407 %endif
408 %if notcpuflag(xop) || sizeof%1 != 16
409 %if cpuflag(mmxext)
410     PSHUFLW %2, %1, q0032
411 %else ; mmx
412     mova    %2, %1
413     psrlq   %2, 32
414 %endif
415     paddd   %1, %2
416 %endif
417 %undef %1
418 %undef %2
419 %endmacro
420
421 %macro HADDW 2 ; reg, tmp
422 %if cpuflag(xop) && sizeof%1 == 16
423     vphaddwq  %1, %1
424     movhlps   %2, %1
425     paddd     %1, %2
426 %else
427     pmaddwd %1, [pw_1]
428     HADDD   %1, %2
429 %endif
430 %endmacro
431
432 %macro HADDPS 3 ; dst, src, tmp
433 %if cpuflag(sse3)
434     haddps  %1, %1, %2
435 %else
436     movaps  %3, %1
437     shufps  %1, %2, q2020
438     shufps  %3, %2, q3131
439     addps   %1, %3
440 %endif
441 %endmacro
442
443 %macro PALIGNR 4-5
444 %if cpuflag(ssse3)
445 %if %0==5
446     palignr %1, %2, %3, %4
447 %else
448     palignr %1, %2, %3
449 %endif
450 %elif cpuflag(mmx) ; [dst,] src1, src2, imm, tmp
451     %define %%dst %1
452 %if %0==5
453 %ifnidn %1, %2
454     mova    %%dst, %2
455 %endif
456     %rotate 1
457 %endif
458 %ifnidn %4, %2
459     mova    %4, %2
460 %endif
461 %if mmsize==8
462     psllq   %%dst, (8-%3)*8
463     psrlq   %4, %3*8
464 %else
465     pslldq  %%dst, 16-%3
466     psrldq  %4, %3
467 %endif
468     por     %%dst, %4
469 %endif
470 %endmacro
471
472 %macro PAVGB 2-4
473 %if cpuflag(mmxext)
474     pavgb   %1, %2
475 %elif cpuflag(3dnow)
476     pavgusb %1, %2
477 %elif cpuflag(mmx)
478     movu   %3, %2
479     por    %3, %1
480     pxor   %1, %2
481     pand   %1, %4
482     psrlq  %1, 1
483     psubb  %3, %1
484     SWAP   %1, %3
485 %endif
486 %endmacro
487
488 %macro PSHUFLW 1+
489     %if mmsize == 8
490         pshufw %1
491     %else
492         pshuflw %1
493     %endif
494 %endmacro
495
496 %macro PSWAPD 2
497 %if cpuflag(mmxext)
498     pshufw    %1, %2, q1032
499 %elif cpuflag(3dnowext)
500     pswapd    %1, %2
501 %elif cpuflag(3dnow)
502     movq      %1, %2
503     psrlq     %1, 32
504     punpckldq %1, %2
505 %endif
506 %endmacro
507
508 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
509 %ifnum %5
510     pand   m%3, m%5, m%4 ; src .. y6 .. y4
511     pand   m%1, m%5, m%2 ; dst .. y6 .. y4
512 %else
513     mova   m%1, %5
514     pand   m%3, m%1, m%4 ; src .. y6 .. y4
515     pand   m%1, m%1, m%2 ; dst .. y6 .. y4
516 %endif
517     psrlw  m%2, 8        ; dst .. y7 .. y5
518     psrlw  m%4, 8        ; src .. y7 .. y5
519 %endmacro
520
521 %macro SUMSUB_BA 3-4
522 %if %0==3
523     padd%1  m%2, m%3
524     padd%1  m%3, m%3
525     psub%1  m%3, m%2
526 %else
527 %if avx_enabled == 0
528     mova    m%4, m%2
529     padd%1  m%2, m%3
530     psub%1  m%3, m%4
531 %else
532     padd%1  m%4, m%2, m%3
533     psub%1  m%3, m%2
534     SWAP    %2, %4
535 %endif
536 %endif
537 %endmacro
538
539 %macro SUMSUB_BADC 5-6
540 %if %0==6
541     SUMSUB_BA %1, %2, %3, %6
542     SUMSUB_BA %1, %4, %5, %6
543 %else
544     padd%1  m%2, m%3
545     padd%1  m%4, m%5
546     padd%1  m%3, m%3
547     padd%1  m%5, m%5
548     psub%1  m%3, m%2
549     psub%1  m%5, m%4
550 %endif
551 %endmacro
552
553 %macro SUMSUB2_AB 4
554 %ifnum %3
555     psub%1  m%4, m%2, m%3
556     psub%1  m%4, m%3
557     padd%1  m%2, m%2
558     padd%1  m%2, m%3
559 %else
560     mova    m%4, m%2
561     padd%1  m%2, m%2
562     padd%1  m%2, %3
563     psub%1  m%4, %3
564     psub%1  m%4, %3
565 %endif
566 %endmacro
567
568 %macro SUMSUB2_BA 4
569 %if avx_enabled == 0
570     mova    m%4, m%2
571     padd%1  m%2, m%3
572     padd%1  m%2, m%3
573     psub%1  m%3, m%4
574     psub%1  m%3, m%4
575 %else
576     padd%1  m%4, m%2, m%3
577     padd%1  m%4, m%3
578     psub%1  m%3, m%2
579     psub%1  m%3, m%2
580     SWAP     %2,  %4
581 %endif
582 %endmacro
583
584 %macro SUMSUBD2_AB 5
585 %ifnum %4
586     psra%1  m%5, m%2, 1  ; %3: %3>>1
587     psra%1  m%4, m%3, 1  ; %2: %2>>1
588     padd%1  m%4, m%2     ; %3: %3>>1+%2
589     psub%1  m%5, m%3     ; %2: %2>>1-%3
590     SWAP     %2, %5
591     SWAP     %3, %4
592 %else
593     mova    %5, m%2
594     mova    %4, m%3
595     psra%1  m%3, 1  ; %3: %3>>1
596     psra%1  m%2, 1  ; %2: %2>>1
597     padd%1  m%3, %5 ; %3: %3>>1+%2
598     psub%1  m%2, %4 ; %2: %2>>1-%3
599 %endif
600 %endmacro
601
602 %macro DCT4_1D 5
603 %ifnum %5
604     SUMSUB_BADC w, %4, %1, %3, %2, %5
605     SUMSUB_BA   w, %3, %4, %5
606     SUMSUB2_AB  w, %1, %2, %5
607     SWAP %1, %3, %4, %5, %2
608 %else
609     SUMSUB_BADC w, %4, %1, %3, %2
610     SUMSUB_BA   w, %3, %4
611     mova     [%5], m%2
612     SUMSUB2_AB  w, %1, [%5], %2
613     SWAP %1, %3, %4, %2
614 %endif
615 %endmacro
616
617 %macro IDCT4_1D 6-7
618 %ifnum %6
619     SUMSUBD2_AB %1, %3, %5, %7, %6
620     ; %3: %3>>1-%5 %5: %3+%5>>1
621     SUMSUB_BA   %1, %4, %2, %7
622     ; %4: %2+%4 %2: %2-%4
623     SUMSUB_BADC %1, %5, %4, %3, %2, %7
624     ; %5: %2+%4 + (%3+%5>>1)
625     ; %4: %2+%4 - (%3+%5>>1)
626     ; %3: %2-%4 + (%3>>1-%5)
627     ; %2: %2-%4 - (%3>>1-%5)
628 %else
629 %ifidn %1, w
630     SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
631 %else
632     SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
633 %endif
634     SUMSUB_BA   %1, %4, %2
635     SUMSUB_BADC %1, %5, %4, %3, %2
636 %endif
637     SWAP %2, %5, %4
638     ; %2: %2+%4 + (%3+%5>>1) row0
639     ; %3: %2-%4 + (%3>>1-%5) row1
640     ; %4: %2-%4 - (%3>>1-%5) row2
641     ; %5: %2+%4 - (%3+%5>>1) row3
642 %endmacro
643
644
645 %macro LOAD_DIFF 5
646 %ifidn %3, none
647     movh       %1, %4
648     movh       %2, %5
649     punpcklbw  %1, %2
650     punpcklbw  %2, %2
651     psubw      %1, %2
652 %else
653     movh       %1, %4
654     punpcklbw  %1, %3
655     movh       %2, %5
656     punpcklbw  %2, %3
657     psubw      %1, %2
658 %endif
659 %endmacro
660
661 %macro STORE_DCT 6
662     movq   [%5+%6+ 0], m%1
663     movq   [%5+%6+ 8], m%2
664     movq   [%5+%6+16], m%3
665     movq   [%5+%6+24], m%4
666     movhps [%5+%6+32], m%1
667     movhps [%5+%6+40], m%2
668     movhps [%5+%6+48], m%3
669     movhps [%5+%6+56], m%4
670 %endmacro
671
672 %macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
673     LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
674     LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
675     LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
676     LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
677 %if %10
678     lea %8, [%8+4*r1]
679     lea %9, [%9+4*r3]
680 %endif
681 %endmacro
682
683 %macro DIFFx2 6-7
684     movh       %3, %5
685     punpcklbw  %3, %4
686     psraw      %1, 6
687     paddsw     %1, %3
688     movh       %3, %6
689     punpcklbw  %3, %4
690     psraw      %2, 6
691     paddsw     %2, %3
692     packuswb   %2, %1
693 %endmacro
694
695 %macro STORE_DIFF 4
696     movh       %2, %4
697     punpcklbw  %2, %3
698     psraw      %1, 6
699     paddsw     %1, %2
700     packuswb   %1, %1
701     movh       %4, %1
702 %endmacro
703
704 %macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
705     movh       %3, [%7]
706     movh       %4, [%7+%8]
707     psraw      %1, %6
708     psraw      %2, %6
709     punpcklbw  %3, %5
710     punpcklbw  %4, %5
711     paddw      %3, %1
712     paddw      %4, %2
713     packuswb   %3, %5
714     packuswb   %4, %5
715     movh     [%7], %3
716     movh  [%7+%8], %4
717 %endmacro
718
719 %macro PMINUB 3 ; dst, src, ignored
720 %if cpuflag(mmxext)
721     pminub   %1, %2
722 %else ; dst, src, tmp
723     mova     %3, %1
724     psubusb  %3, %2
725     psubb    %1, %3
726 %endif
727 %endmacro
728
729 %macro SPLATW 2-3 0
730 %if cpuflag(avx2) && %3 == 0
731     vpbroadcastw %1, %2
732 %elif mmsize == 16
733     pshuflw    %1, %2, (%3)*0x55
734     punpcklqdq %1, %1
735 %elif cpuflag(mmxext)
736     pshufw     %1, %2, (%3)*0x55
737 %else
738     %ifnidn %1, %2
739         mova       %1, %2
740     %endif
741     %if %3 & 2
742         punpckhwd  %1, %1
743     %else
744         punpcklwd  %1, %1
745     %endif
746     %if %3 & 1
747         punpckhwd  %1, %1
748     %else
749         punpcklwd  %1, %1
750     %endif
751 %endif
752 %endmacro
753
754 %macro SPLATD 1
755 %if mmsize == 8
756     punpckldq  %1, %1
757 %elif cpuflag(sse2)
758     pshufd  %1, %1, 0
759 %elif cpuflag(sse)
760     shufps  %1, %1, 0
761 %endif
762 %endmacro
763
764 %macro CLIPUB 3 ;(dst, min, max)
765     pmaxub %1, %2
766     pminub %1, %3
767 %endmacro
768
769 %macro CLIPW 3 ;(dst, min, max)
770     pmaxsw %1, %2
771     pminsw %1, %3
772 %endmacro
773
774 %macro PMINSD_MMX 3 ; dst, src, tmp
775     mova      %3, %2
776     pcmpgtd   %3, %1
777     pxor      %1, %2
778     pand      %1, %3
779     pxor      %1, %2
780 %endmacro
781
782 %macro PMAXSD_MMX 3 ; dst, src, tmp
783     mova      %3, %1
784     pcmpgtd   %3, %2
785     pand      %1, %3
786     pandn     %3, %2
787     por       %1, %3
788 %endmacro
789
790 %macro CLIPD_MMX 3-4 ; src/dst, min, max, tmp
791     PMINSD_MMX %1, %3, %4
792     PMAXSD_MMX %1, %2, %4
793 %endmacro
794
795 %macro CLIPD_SSE2 3-4 ; src/dst, min (float), max (float), unused
796     cvtdq2ps  %1, %1
797     minps     %1, %3
798     maxps     %1, %2
799     cvtps2dq  %1, %1
800 %endmacro
801
802 %macro CLIPD_SSE41 3-4 ;  src/dst, min, max, unused
803     pminsd  %1, %3
804     pmaxsd  %1, %2
805 %endmacro
806
807 %macro VBROADCASTSS 2 ; dst xmm/ymm, src m32
808 %if cpuflag(avx)
809     vbroadcastss %1, %2
810 %else ; sse
811     movss        %1, %2
812     shufps       %1, %1, 0
813 %endif
814 %endmacro
815
816 %macro VBROADCASTSD 2 ; dst xmm/ymm, src m64
817 %if cpuflag(avx) && mmsize == 32
818     vbroadcastsd %1, %2
819 %elif cpuflag(sse3)
820     movddup      %1, %2
821 %else ; sse2
822     movsd        %1, %2
823     movlhps      %1, %1
824 %endif
825 %endmacro
826
827 %macro SHUFFLE_MASK_W 8
828     %rep 8
829         %if %1>=0x80
830             db %1, %1
831         %else
832             db %1*2
833             db %1*2+1
834         %endif
835         %rotate 1
836     %endrep
837 %endmacro
838
839 %macro PMOVSXWD 2; dst, src
840 %if cpuflag(sse4)
841     pmovsxwd     %1, %2
842 %else
843     %ifnidn %1, %2
844     mova         %1, %2
845     %endif
846     punpcklwd    %1, %1
847     psrad        %1, 16
848 %endif
849 %endmacro
850
851 ; Wrapper for non-FMA version of fmaddps
852 %macro FMULADD_PS 5
853     %if cpuflag(fma3) || cpuflag(fma4)
854         fmaddps %1, %2, %3, %4
855     %elifidn %1, %4
856         mulps   %5, %2, %3
857         addps   %1, %4, %5
858     %else
859         mulps   %1, %2, %3
860         addps   %1, %4
861     %endif
862 %endmacro
863
864 %macro LSHIFT 2
865 %if mmsize > 8
866     pslldq  %1, %2
867 %else
868     psllq   %1, 8*(%2)
869 %endif
870 %endmacro
871
872 %macro RSHIFT 2
873 %if mmsize > 8
874     psrldq  %1, %2
875 %else
876     psrlq   %1, 8*(%2)
877 %endif
878 %endmacro