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