Imported Debian version 2.5.0~trusty1.1
[deb_ffmpeg.git] / ffmpeg / libavutil / x86 / x86util.asm
CommitLineData
2ba45a60
DM
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
f6fa7814
DM
644%macro CLIPUB 3 ;(dst, min, max)
645 pmaxub %1, %2
646 pminub %1, %3
647%endmacro
648
2ba45a60
DM
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
745PMA_EMU PMACSWW, pmacsww, pmullw, paddw
746PMA_EMU PMACSDD, pmacsdd, pmulld, paddd ; sse4 emulation
747PMA_EMU PMACSDQL, pmacsdql, pmuldq, paddq ; sse4 emulation
748PMA_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