]> git.sesse.net Git - ffmpeg/blob - libavutil/x86/x86util.asm
Merge commit 'c94e2e85cb6af8a570d8542a830556243bd32873'
[ffmpeg] / 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
344 %if cpuflag(mmxext)
345     pavgb   %1, %2
346 %elif cpuflag(3dnow)
347     pavgusb %1, %2
348 %endif
349 %endmacro
350
351 %macro PSHUFLW 1+
352     %if mmsize == 8
353         pshufw %1
354     %else
355         pshuflw %1
356     %endif
357 %endmacro
358
359 %macro PSWAPD 2
360 %if cpuflag(mmxext)
361     pshufw    %1, %2, q1032
362 %elif cpuflag(3dnowext)
363     pswapd    %1, %2
364 %elif cpuflag(3dnow)
365     movq      %1, %2
366     psrlq     %1, 32
367     punpckldq %1, %2
368 %endif
369 %endmacro
370
371 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
372 %ifnum %5
373     pand   m%3, m%5, m%4 ; src .. y6 .. y4
374     pand   m%1, m%5, m%2 ; dst .. y6 .. y4
375 %else
376     mova   m%1, %5
377     pand   m%3, m%1, m%4 ; src .. y6 .. y4
378     pand   m%1, m%1, m%2 ; dst .. y6 .. y4
379 %endif
380     psrlw  m%2, 8        ; dst .. y7 .. y5
381     psrlw  m%4, 8        ; src .. y7 .. y5
382 %endmacro
383
384 %macro SUMSUB_BA 3-4
385 %if %0==3
386     padd%1  m%2, m%3
387     padd%1  m%3, m%3
388     psub%1  m%3, m%2
389 %else
390 %if avx_enabled == 0
391     mova    m%4, m%2
392     padd%1  m%2, m%3
393     psub%1  m%3, m%4
394 %else
395     padd%1  m%4, m%2, m%3
396     psub%1  m%3, m%2
397     SWAP    %2, %4
398 %endif
399 %endif
400 %endmacro
401
402 %macro SUMSUB_BADC 5-6
403 %if %0==6
404     SUMSUB_BA %1, %2, %3, %6
405     SUMSUB_BA %1, %4, %5, %6
406 %else
407     padd%1  m%2, m%3
408     padd%1  m%4, m%5
409     padd%1  m%3, m%3
410     padd%1  m%5, m%5
411     psub%1  m%3, m%2
412     psub%1  m%5, m%4
413 %endif
414 %endmacro
415
416 %macro SUMSUB2_AB 4
417 %ifnum %3
418     psub%1  m%4, m%2, m%3
419     psub%1  m%4, m%3
420     padd%1  m%2, m%2
421     padd%1  m%2, m%3
422 %else
423     mova    m%4, m%2
424     padd%1  m%2, m%2
425     padd%1  m%2, %3
426     psub%1  m%4, %3
427     psub%1  m%4, %3
428 %endif
429 %endmacro
430
431 %macro SUMSUB2_BA 4
432 %if avx_enabled == 0
433     mova    m%4, m%2
434     padd%1  m%2, m%3
435     padd%1  m%2, m%3
436     psub%1  m%3, m%4
437     psub%1  m%3, m%4
438 %else
439     padd%1  m%4, m%2, m%3
440     padd%1  m%4, m%3
441     psub%1  m%3, m%2
442     psub%1  m%3, m%2
443     SWAP     %2,  %4
444 %endif
445 %endmacro
446
447 %macro SUMSUBD2_AB 5
448 %ifnum %4
449     psra%1  m%5, m%2, 1  ; %3: %3>>1
450     psra%1  m%4, m%3, 1  ; %2: %2>>1
451     padd%1  m%4, m%2     ; %3: %3>>1+%2
452     psub%1  m%5, m%3     ; %2: %2>>1-%3
453     SWAP     %2, %5
454     SWAP     %3, %4
455 %else
456     mova    %5, m%2
457     mova    %4, m%3
458     psra%1  m%3, 1  ; %3: %3>>1
459     psra%1  m%2, 1  ; %2: %2>>1
460     padd%1  m%3, %5 ; %3: %3>>1+%2
461     psub%1  m%2, %4 ; %2: %2>>1-%3
462 %endif
463 %endmacro
464
465 %macro DCT4_1D 5
466 %ifnum %5
467     SUMSUB_BADC w, %4, %1, %3, %2, %5
468     SUMSUB_BA   w, %3, %4, %5
469     SUMSUB2_AB  w, %1, %2, %5
470     SWAP %1, %3, %4, %5, %2
471 %else
472     SUMSUB_BADC w, %4, %1, %3, %2
473     SUMSUB_BA   w, %3, %4
474     mova     [%5], m%2
475     SUMSUB2_AB  w, %1, [%5], %2
476     SWAP %1, %3, %4, %2
477 %endif
478 %endmacro
479
480 %macro IDCT4_1D 6-7
481 %ifnum %6
482     SUMSUBD2_AB %1, %3, %5, %7, %6
483     ; %3: %3>>1-%5 %5: %3+%5>>1
484     SUMSUB_BA   %1, %4, %2, %7
485     ; %4: %2+%4 %2: %2-%4
486     SUMSUB_BADC %1, %5, %4, %3, %2, %7
487     ; %5: %2+%4 + (%3+%5>>1)
488     ; %4: %2+%4 - (%3+%5>>1)
489     ; %3: %2-%4 + (%3>>1-%5)
490     ; %2: %2-%4 - (%3>>1-%5)
491 %else
492 %ifidn %1, w
493     SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
494 %else
495     SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
496 %endif
497     SUMSUB_BA   %1, %4, %2
498     SUMSUB_BADC %1, %5, %4, %3, %2
499 %endif
500     SWAP %2, %5, %4
501     ; %2: %2+%4 + (%3+%5>>1) row0
502     ; %3: %2-%4 + (%3>>1-%5) row1
503     ; %4: %2-%4 - (%3>>1-%5) row2
504     ; %5: %2+%4 - (%3+%5>>1) row3
505 %endmacro
506
507
508 %macro LOAD_DIFF 5
509 %ifidn %3, none
510     movh       %1, %4
511     movh       %2, %5
512     punpcklbw  %1, %2
513     punpcklbw  %2, %2
514     psubw      %1, %2
515 %else
516     movh       %1, %4
517     punpcklbw  %1, %3
518     movh       %2, %5
519     punpcklbw  %2, %3
520     psubw      %1, %2
521 %endif
522 %endmacro
523
524 %macro STORE_DCT 6
525     movq   [%5+%6+ 0], m%1
526     movq   [%5+%6+ 8], m%2
527     movq   [%5+%6+16], m%3
528     movq   [%5+%6+24], m%4
529     movhps [%5+%6+32], m%1
530     movhps [%5+%6+40], m%2
531     movhps [%5+%6+48], m%3
532     movhps [%5+%6+56], m%4
533 %endmacro
534
535 %macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
536     LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
537     LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
538     LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
539     LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
540 %if %10
541     lea %8, [%8+4*r1]
542     lea %9, [%9+4*r3]
543 %endif
544 %endmacro
545
546 %macro DIFFx2 6-7
547     movh       %3, %5
548     punpcklbw  %3, %4
549     psraw      %1, 6
550     paddsw     %1, %3
551     movh       %3, %6
552     punpcklbw  %3, %4
553     psraw      %2, 6
554     paddsw     %2, %3
555     packuswb   %2, %1
556 %endmacro
557
558 %macro STORE_DIFF 4
559     movh       %2, %4
560     punpcklbw  %2, %3
561     psraw      %1, 6
562     paddsw     %1, %2
563     packuswb   %1, %1
564     movh       %4, %1
565 %endmacro
566
567 %macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
568     movh       %3, [%7]
569     movh       %4, [%7+%8]
570     psraw      %1, %6
571     psraw      %2, %6
572     punpcklbw  %3, %5
573     punpcklbw  %4, %5
574     paddw      %3, %1
575     paddw      %4, %2
576     packuswb   %3, %5
577     packuswb   %4, %5
578     movh     [%7], %3
579     movh  [%7+%8], %4
580 %endmacro
581
582 %macro PMINUB 3 ; dst, src, ignored
583 %if cpuflag(mmxext)
584     pminub   %1, %2
585 %else ; dst, src, tmp
586     mova     %3, %1
587     psubusb  %3, %2
588     psubb    %1, %3
589 %endif
590 %endmacro
591
592 %macro SPLATW 2-3 0
593 %if mmsize == 16
594     pshuflw    %1, %2, (%3)*0x55
595     punpcklqdq %1, %1
596 %elif cpuflag(mmxext)
597     pshufw     %1, %2, (%3)*0x55
598 %else
599     %ifnidn %1, %2
600         mova       %1, %2
601     %endif
602     %if %3 & 2
603         punpckhwd  %1, %1
604     %else
605         punpcklwd  %1, %1
606     %endif
607     %if %3 & 1
608         punpckhwd  %1, %1
609     %else
610         punpcklwd  %1, %1
611     %endif
612 %endif
613 %endmacro
614
615 %macro SPLATD 1
616 %if mmsize == 8
617     punpckldq  %1, %1
618 %elif cpuflag(sse2)
619     pshufd  %1, %1, 0
620 %elif cpuflag(sse)
621     shufps  %1, %1, 0
622 %endif
623 %endmacro
624
625 %macro CLIPW 3 ;(dst, min, max)
626     pmaxsw %1, %2
627     pminsw %1, %3
628 %endmacro
629
630 %macro PMINSD_MMX 3 ; dst, src, tmp
631     mova      %3, %2
632     pcmpgtd   %3, %1
633     pxor      %1, %2
634     pand      %1, %3
635     pxor      %1, %2
636 %endmacro
637
638 %macro PMAXSD_MMX 3 ; dst, src, tmp
639     mova      %3, %1
640     pcmpgtd   %3, %2
641     pand      %1, %3
642     pandn     %3, %2
643     por       %1, %3
644 %endmacro
645
646 %macro CLIPD_MMX 3-4 ; src/dst, min, max, tmp
647     PMINSD_MMX %1, %3, %4
648     PMAXSD_MMX %1, %2, %4
649 %endmacro
650
651 %macro CLIPD_SSE2 3-4 ; src/dst, min (float), max (float), unused
652     cvtdq2ps  %1, %1
653     minps     %1, %3
654     maxps     %1, %2
655     cvtps2dq  %1, %1
656 %endmacro
657
658 %macro CLIPD_SSE41 3-4 ;  src/dst, min, max, unused
659     pminsd  %1, %3
660     pmaxsd  %1, %2
661 %endmacro
662
663 %macro VBROADCASTSS 2 ; dst xmm/ymm, src m32
664 %if cpuflag(avx)
665     vbroadcastss %1, %2
666 %else ; sse
667     movss        %1, %2
668     shufps       %1, %1, 0
669 %endif
670 %endmacro
671
672 %macro VBROADCASTSD 2 ; dst xmm/ymm, src m64
673 %if cpuflag(avx) && mmsize == 32
674     vbroadcastsd %1, %2
675 %elif cpuflag(sse3)
676     movddup      %1, %2
677 %else ; sse2
678     movsd        %1, %2
679     movlhps      %1, %1
680 %endif
681 %endmacro
682
683 %macro SHUFFLE_MASK_W 8
684     %rep 8
685         %if %1>=0x80
686             db %1, %1
687         %else
688             db %1*2
689             db %1*2+1
690         %endif
691         %rotate 1
692     %endrep
693 %endmacro
694
695 %macro PMOVSXWD 2; dst, src
696 %if cpuflag(sse4)
697     pmovsxwd     %1, %2
698 %else
699     %ifnidn %1, %2
700     mova         %1, %2
701     %endif
702     punpcklwd    %1, %1
703     psrad        %1, 16
704 %endif
705 %endmacro
706
707 %macro PMA_EMU 4
708     %macro %1 5-8 %2, %3, %4
709         %if cpuflag(xop)
710             v%6 %1, %2, %3, %4
711         %elifidn %1, %4
712             %7 %5, %2, %3
713             %8 %1, %4, %5
714         %else
715             %7 %1, %2, %3
716             %8 %1, %4
717         %endif
718     %endmacro
719 %endmacro
720
721 PMA_EMU  PMACSWW,  pmacsww,  pmullw, paddw
722 PMA_EMU  PMACSDD,  pmacsdd,  pmulld, paddd ; sse4 emulation
723 PMA_EMU PMACSDQL, pmacsdql,  pmuldq, paddq ; sse4 emulation
724 PMA_EMU PMADCSWD, pmadcswd, pmaddwd, paddd
725
726 ; Wrapper for non-FMA version of fmaddps
727 %macro FMULADD_PS 5
728     %if cpuflag(fma3) || cpuflag(fma4)
729         fmaddps %1, %2, %3, %4
730     %elifidn %1, %4
731         mulps   %5, %2, %3
732         addps   %1, %4, %5
733     %else
734         mulps   %1, %2, %3
735         addps   %1, %4
736     %endif
737 %endmacro