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