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