Imported Debian version 2.5.0~trusty1.1
[deb_ffmpeg.git] / 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 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