Merge commit '9ce02e14f01de50fcc6f7f459544b140be66d615'
[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 cpuflags_mmxext cpuflags_mmx2
27
28 %include "libavutil/x86/x86inc.asm"
29
30 %macro SBUTTERFLY 4
31 %if avx_enabled == 0
32     mova      m%4, m%2
33     punpckl%1 m%2, m%3
34     punpckh%1 m%4, m%3
35 %else
36     punpckh%1 m%4, m%2, m%3
37     punpckl%1 m%2, m%3
38 %endif
39     SWAP %3, %4
40 %endmacro
41
42 %macro SBUTTERFLY2 4
43     punpckl%1 m%4, m%2, m%3
44     punpckh%1 m%2, m%2, m%3
45     SWAP %2, %4, %3
46 %endmacro
47
48 %macro SBUTTERFLYPS 3
49     unpcklps m%3, m%1, m%2
50     unpckhps m%1, m%1, m%2
51     SWAP %1, %3, %2
52 %endmacro
53
54 %macro TRANSPOSE4x4B 5
55     SBUTTERFLY bw, %1, %2, %5
56     SBUTTERFLY bw, %3, %4, %5
57     SBUTTERFLY wd, %1, %3, %5
58     SBUTTERFLY wd, %2, %4, %5
59     SWAP %2, %3
60 %endmacro
61
62 %macro TRANSPOSE4x4W 5
63     SBUTTERFLY wd, %1, %2, %5
64     SBUTTERFLY wd, %3, %4, %5
65     SBUTTERFLY dq, %1, %3, %5
66     SBUTTERFLY dq, %2, %4, %5
67     SWAP %2, %3
68 %endmacro
69
70 %macro TRANSPOSE2x4x4W 5
71     SBUTTERFLY wd,  %1, %2, %5
72     SBUTTERFLY wd,  %3, %4, %5
73     SBUTTERFLY dq,  %1, %3, %5
74     SBUTTERFLY dq,  %2, %4, %5
75     SBUTTERFLY qdq, %1, %2, %5
76     SBUTTERFLY qdq, %3, %4, %5
77 %endmacro
78
79 %macro TRANSPOSE4x4D 5
80     SBUTTERFLY dq,  %1, %2, %5
81     SBUTTERFLY dq,  %3, %4, %5
82     SBUTTERFLY qdq, %1, %3, %5
83     SBUTTERFLY qdq, %2, %4, %5
84     SWAP %2, %3
85 %endmacro
86
87 ; identical behavior to TRANSPOSE4x4D, but using SSE1 float ops
88 %macro TRANSPOSE4x4PS 5
89     SBUTTERFLYPS %1, %2, %5
90     SBUTTERFLYPS %3, %4, %5
91     movlhps m%5, m%1, m%3
92     movhlps m%3, m%1
93     SWAP %5, %1
94     movlhps m%5, m%2, m%4
95     movhlps m%4, m%2
96     SWAP %5, %2, %3
97 %endmacro
98
99 %macro TRANSPOSE8x8W 9-11
100 %if ARCH_X86_64
101     SBUTTERFLY wd,  %1, %2, %9
102     SBUTTERFLY wd,  %3, %4, %9
103     SBUTTERFLY wd,  %5, %6, %9
104     SBUTTERFLY wd,  %7, %8, %9
105     SBUTTERFLY dq,  %1, %3, %9
106     SBUTTERFLY dq,  %2, %4, %9
107     SBUTTERFLY dq,  %5, %7, %9
108     SBUTTERFLY dq,  %6, %8, %9
109     SBUTTERFLY qdq, %1, %5, %9
110     SBUTTERFLY qdq, %2, %6, %9
111     SBUTTERFLY qdq, %3, %7, %9
112     SBUTTERFLY qdq, %4, %8, %9
113     SWAP %2, %5
114     SWAP %4, %7
115 %else
116 ; in:  m0..m7, unless %11 in which case m6 is in %9
117 ; out: m0..m7, unless %11 in which case m4 is in %10
118 ; spills into %9 and %10
119 %if %0<11
120     movdqa %9, m%7
121 %endif
122     SBUTTERFLY wd,  %1, %2, %7
123     movdqa %10, m%2
124     movdqa m%7, %9
125     SBUTTERFLY wd,  %3, %4, %2
126     SBUTTERFLY wd,  %5, %6, %2
127     SBUTTERFLY wd,  %7, %8, %2
128     SBUTTERFLY dq,  %1, %3, %2
129     movdqa %9, m%3
130     movdqa m%2, %10
131     SBUTTERFLY dq,  %2, %4, %3
132     SBUTTERFLY dq,  %5, %7, %3
133     SBUTTERFLY dq,  %6, %8, %3
134     SBUTTERFLY qdq, %1, %5, %3
135     SBUTTERFLY qdq, %2, %6, %3
136     movdqa %10, m%2
137     movdqa m%3, %9
138     SBUTTERFLY qdq, %3, %7, %2
139     SBUTTERFLY qdq, %4, %8, %2
140     SWAP %2, %5
141     SWAP %4, %7
142 %if %0<11
143     movdqa m%5, %10
144 %endif
145 %endif
146 %endmacro
147
148 ; PABSW macros assume %1 != %2, while ABS1/2 macros work in-place
149 %macro PABSW_MMX 2
150     pxor       %1, %1
151     pcmpgtw    %1, %2
152     pxor       %2, %1
153     psubw      %2, %1
154     SWAP       %1, %2
155 %endmacro
156
157 %macro PSIGNW_MMX 2
158     pxor       %1, %2
159     psubw      %1, %2
160 %endmacro
161
162 %macro PABSW_MMXEXT 2
163     pxor    %1, %1
164     psubw   %1, %2
165     pmaxsw  %1, %2
166 %endmacro
167
168 %macro PABSW_SSSE3 2
169     pabsw      %1, %2
170 %endmacro
171
172 %macro PSIGNW_SSSE3 2
173     psignw     %1, %2
174 %endmacro
175
176 %macro ABS1_MMX 2    ; a, tmp
177     pxor       %2, %2
178     pcmpgtw    %2, %1
179     pxor       %1, %2
180     psubw      %1, %2
181 %endmacro
182
183 %macro ABS2_MMX 4    ; a, b, tmp0, tmp1
184     pxor       %3, %3
185     pxor       %4, %4
186     pcmpgtw    %3, %1
187     pcmpgtw    %4, %2
188     pxor       %1, %3
189     pxor       %2, %4
190     psubw      %1, %3
191     psubw      %2, %4
192 %endmacro
193
194 %macro ABS1_MMXEXT 2 ; a, tmp
195     pxor    %2, %2
196     psubw   %2, %1
197     pmaxsw  %1, %2
198 %endmacro
199
200 %macro ABS2_MMXEXT 4 ; a, b, tmp0, tmp1
201     pxor    %3, %3
202     pxor    %4, %4
203     psubw   %3, %1
204     psubw   %4, %2
205     pmaxsw  %1, %3
206     pmaxsw  %2, %4
207 %endmacro
208
209 %macro ABS1_SSSE3 2
210     pabsw   %1, %1
211 %endmacro
212
213 %macro ABS2_SSSE3 4
214     pabsw   %1, %1
215     pabsw   %2, %2
216 %endmacro
217
218 %macro ABSB_MMX 2
219     pxor    %2, %2
220     psubb   %2, %1
221     pminub  %1, %2
222 %endmacro
223
224 %macro ABSB2_MMX 4
225     pxor    %3, %3
226     pxor    %4, %4
227     psubb   %3, %1
228     psubb   %4, %2
229     pminub  %1, %3
230     pminub  %2, %4
231 %endmacro
232
233 %macro ABSD2_MMX 4
234     pxor    %3, %3
235     pxor    %4, %4
236     pcmpgtd %3, %1
237     pcmpgtd %4, %2
238     pxor    %1, %3
239     pxor    %2, %4
240     psubd   %1, %3
241     psubd   %2, %4
242 %endmacro
243
244 %macro ABSB_SSSE3 2
245     pabsb   %1, %1
246 %endmacro
247
248 %macro ABSB2_SSSE3 4
249     pabsb   %1, %1
250     pabsb   %2, %2
251 %endmacro
252
253 %macro ABS4 6
254     ABS2 %1, %2, %5, %6
255     ABS2 %3, %4, %5, %6
256 %endmacro
257
258 %define ABS1 ABS1_MMX
259 %define ABS2 ABS2_MMX
260 %define ABSB ABSB_MMX
261 %define ABSB2 ABSB2_MMX
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 PALIGNR_MMX 4-5 ; [dst,] src1, src2, imm, tmp
286     %define %%dst %1
287 %if %0==5
288 %ifnidn %1, %2
289     mova    %%dst, %2
290 %endif
291     %rotate 1
292 %endif
293 %ifnidn %4, %2
294     mova    %4, %2
295 %endif
296 %if mmsize==8
297     psllq   %%dst, (8-%3)*8
298     psrlq   %4, %3*8
299 %else
300     pslldq  %%dst, 16-%3
301     psrldq  %4, %3
302 %endif
303     por     %%dst, %4
304 %endmacro
305
306 %macro PALIGNR_SSSE3 4-5
307 %if %0==5
308     palignr %1, %2, %3, %4
309 %else
310     palignr %1, %2, %3
311 %endif
312 %endmacro
313
314 %macro PSHUFLW 1+
315     %if mmsize == 8
316         pshufw %1
317     %else
318         pshuflw %1
319     %endif
320 %endmacro
321
322 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
323 %ifnum %5
324     pand   m%3, m%5, m%4 ; src .. y6 .. y4
325     pand   m%1, m%5, m%2 ; dst .. y6 .. y4
326 %else
327     mova   m%1, %5
328     pand   m%3, m%1, m%4 ; src .. y6 .. y4
329     pand   m%1, m%1, m%2 ; dst .. y6 .. y4
330 %endif
331     psrlw  m%2, 8        ; dst .. y7 .. y5
332     psrlw  m%4, 8        ; src .. y7 .. y5
333 %endmacro
334
335 %macro SUMSUB_BA 3-4
336 %if %0==3
337     padd%1  m%2, m%3
338     padd%1  m%3, m%3
339     psub%1  m%3, m%2
340 %else
341 %if avx_enabled == 0
342     mova    m%4, m%2
343     padd%1  m%2, m%3
344     psub%1  m%3, m%4
345 %else
346     padd%1  m%4, m%2, m%3
347     psub%1  m%3, m%2
348     SWAP    %2, %4
349 %endif
350 %endif
351 %endmacro
352
353 %macro SUMSUB_BADC 5-6
354 %if %0==6
355     SUMSUB_BA %1, %2, %3, %6
356     SUMSUB_BA %1, %4, %5, %6
357 %else
358     padd%1  m%2, m%3
359     padd%1  m%4, m%5
360     padd%1  m%3, m%3
361     padd%1  m%5, m%5
362     psub%1  m%3, m%2
363     psub%1  m%5, m%4
364 %endif
365 %endmacro
366
367 %macro SUMSUB2_AB 4
368 %ifnum %3
369     psub%1  m%4, m%2, m%3
370     psub%1  m%4, m%3
371     padd%1  m%2, m%2
372     padd%1  m%2, m%3
373 %else
374     mova    m%4, m%2
375     padd%1  m%2, m%2
376     padd%1  m%2, %3
377     psub%1  m%4, %3
378     psub%1  m%4, %3
379 %endif
380 %endmacro
381
382 %macro SUMSUB2_BA 4
383 %if avx_enabled == 0
384     mova    m%4, m%2
385     padd%1  m%2, m%3
386     padd%1  m%2, m%3
387     psub%1  m%3, m%4
388     psub%1  m%3, m%4
389 %else
390     padd%1  m%4, m%2, m%3
391     padd%1  m%4, m%3
392     psub%1  m%3, m%2
393     psub%1  m%3, m%2
394     SWAP     %2,  %4
395 %endif
396 %endmacro
397
398 %macro SUMSUBD2_AB 5
399 %ifnum %4
400     psra%1  m%5, m%2, 1  ; %3: %3>>1
401     psra%1  m%4, m%3, 1  ; %2: %2>>1
402     padd%1  m%4, m%2     ; %3: %3>>1+%2
403     psub%1  m%5, m%3     ; %2: %2>>1-%3
404     SWAP     %2, %5
405     SWAP     %3, %4
406 %else
407     mova    %5, m%2
408     mova    %4, m%3
409     psra%1  m%3, 1  ; %3: %3>>1
410     psra%1  m%2, 1  ; %2: %2>>1
411     padd%1  m%3, %5 ; %3: %3>>1+%2
412     psub%1  m%2, %4 ; %2: %2>>1-%3
413 %endif
414 %endmacro
415
416 %macro DCT4_1D 5
417 %ifnum %5
418     SUMSUB_BADC w, %4, %1, %3, %2, %5
419     SUMSUB_BA   w, %3, %4, %5
420     SUMSUB2_AB  w, %1, %2, %5
421     SWAP %1, %3, %4, %5, %2
422 %else
423     SUMSUB_BADC w, %4, %1, %3, %2
424     SUMSUB_BA   w, %3, %4
425     mova     [%5], m%2
426     SUMSUB2_AB  w, %1, [%5], %2
427     SWAP %1, %3, %4, %2
428 %endif
429 %endmacro
430
431 %macro IDCT4_1D 6-7
432 %ifnum %6
433     SUMSUBD2_AB %1, %3, %5, %7, %6
434     ; %3: %3>>1-%5 %5: %3+%5>>1
435     SUMSUB_BA   %1, %4, %2, %7
436     ; %4: %2+%4 %2: %2-%4
437     SUMSUB_BADC %1, %5, %4, %3, %2, %7
438     ; %5: %2+%4 + (%3+%5>>1)
439     ; %4: %2+%4 - (%3+%5>>1)
440     ; %3: %2-%4 + (%3>>1-%5)
441     ; %2: %2-%4 - (%3>>1-%5)
442 %else
443 %ifidn %1, w
444     SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
445 %else
446     SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
447 %endif
448     SUMSUB_BA   %1, %4, %2
449     SUMSUB_BADC %1, %5, %4, %3, %2
450 %endif
451     SWAP %2, %5, %4
452     ; %2: %2+%4 + (%3+%5>>1) row0
453     ; %3: %2-%4 + (%3>>1-%5) row1
454     ; %4: %2-%4 - (%3>>1-%5) row2
455     ; %5: %2+%4 - (%3+%5>>1) row3
456 %endmacro
457
458
459 %macro LOAD_DIFF 5
460 %ifidn %3, none
461     movh       %1, %4
462     movh       %2, %5
463     punpcklbw  %1, %2
464     punpcklbw  %2, %2
465     psubw      %1, %2
466 %else
467     movh       %1, %4
468     punpcklbw  %1, %3
469     movh       %2, %5
470     punpcklbw  %2, %3
471     psubw      %1, %2
472 %endif
473 %endmacro
474
475 %macro STORE_DCT 6
476     movq   [%5+%6+ 0], m%1
477     movq   [%5+%6+ 8], m%2
478     movq   [%5+%6+16], m%3
479     movq   [%5+%6+24], m%4
480     movhps [%5+%6+32], m%1
481     movhps [%5+%6+40], m%2
482     movhps [%5+%6+48], m%3
483     movhps [%5+%6+56], m%4
484 %endmacro
485
486 %macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
487     LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
488     LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
489     LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
490     LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
491 %if %10
492     lea %8, [%8+4*r1]
493     lea %9, [%9+4*r3]
494 %endif
495 %endmacro
496
497 %macro DIFFx2 6-7
498     movh       %3, %5
499     punpcklbw  %3, %4
500     psraw      %1, 6
501     paddsw     %1, %3
502     movh       %3, %6
503     punpcklbw  %3, %4
504     psraw      %2, 6
505     paddsw     %2, %3
506     packuswb   %2, %1
507 %endmacro
508
509 %macro STORE_DIFF 4
510     movh       %2, %4
511     punpcklbw  %2, %3
512     psraw      %1, 6
513     paddsw     %1, %2
514     packuswb   %1, %1
515     movh       %4, %1
516 %endmacro
517
518 %macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
519     movh       %3, [%7]
520     movh       %4, [%7+%8]
521     psraw      %1, %6
522     psraw      %2, %6
523     punpcklbw  %3, %5
524     punpcklbw  %4, %5
525     paddw      %3, %1
526     paddw      %4, %2
527     packuswb   %3, %5
528     packuswb   %4, %5
529     movh     [%7], %3
530     movh  [%7+%8], %4
531 %endmacro
532
533 %macro PMINUB_MMX 3 ; dst, src, tmp
534     mova     %3, %1
535     psubusb  %3, %2
536     psubb    %1, %3
537 %endmacro
538
539 %macro PMINUB_MMXEXT 3 ; dst, src, ignored
540     pminub   %1, %2
541 %endmacro
542
543 %macro SPLATW 2-3 0
544 %if mmsize == 16
545     pshuflw    %1, %2, (%3)*0x55
546     punpcklqdq %1, %1
547 %elif cpuflag(mmx2)
548     pshufw     %1, %2, (%3)*0x55
549 %else
550     %ifnidn %1, %2
551         mova       %1, %2
552     %endif
553     %if %3 & 2
554         punpckhwd  %1, %1
555     %else
556         punpcklwd  %1, %1
557     %endif
558     %if %3 & 1
559         punpckhwd  %1, %1
560     %else
561         punpcklwd  %1, %1
562     %endif
563 %endif
564 %endmacro
565
566 %macro SPLATD 2-3 0
567 %if mmsize == 16
568     pshufd %1, %2, (%3)*0x55
569 %else
570     pshufw %1, %2, (%3)*0x11 + ((%3)+1)*0x44
571 %endif
572 %endmacro
573
574 %macro SPLATD_MMX 1
575     punpckldq  %1, %1
576 %endmacro
577
578 %macro SPLATD_SSE 1
579     shufps  %1, %1, 0
580 %endmacro
581
582 %macro SPLATD_SSE2 1
583     pshufd  %1, %1, 0
584 %endmacro
585
586 %macro CLIPW 3 ;(dst, min, max)
587     pmaxsw %1, %2
588     pminsw %1, %3
589 %endmacro
590
591 %macro PMINSD_MMX 3 ; dst, src, tmp
592     mova      %3, %2
593     pcmpgtd   %3, %1
594     pxor      %1, %2
595     pand      %1, %3
596     pxor      %1, %2
597 %endmacro
598
599 %macro PMAXSD_MMX 3 ; dst, src, tmp
600     mova      %3, %1
601     pcmpgtd   %3, %2
602     pand      %1, %3
603     pandn     %3, %2
604     por       %1, %3
605 %endmacro
606
607 %macro CLIPD_MMX 3-4 ; src/dst, min, max, tmp
608     PMINSD_MMX %1, %3, %4
609     PMAXSD_MMX %1, %2, %4
610 %endmacro
611
612 %macro CLIPD_SSE2 3-4 ; src/dst, min (float), max (float), unused
613     cvtdq2ps  %1, %1
614     minps     %1, %3
615     maxps     %1, %2
616     cvtps2dq  %1, %1
617 %endmacro
618
619 %macro CLIPD_SSE41 3-4 ;  src/dst, min, max, unused
620     pminsd  %1, %3
621     pmaxsd  %1, %2
622 %endmacro
623
624 %macro VBROADCASTSS 2 ; dst xmm/ymm, src m32
625 %if cpuflag(avx)
626     vbroadcastss %1, %2
627 %else ; sse
628     movss        %1, %2
629     shufps       %1, %1, 0
630 %endif
631 %endmacro
632
633 %macro SHUFFLE_MASK_W 8
634     %rep 8
635         %if %1>=0x80
636             db %1, %1
637         %else
638             db %1*2
639             db %1*2+1
640         %endif
641         %rotate 1
642     %endrep
643 %endmacro
644
645 %macro PMOVSXWD 2; dst, src
646 %if cpuflag(sse4)
647     pmovsxwd     %1, %2
648 %else
649     %ifnidn %1, %2
650     mova         %1, %2
651     %endif
652     punpcklwd    %1, %1
653     psrad        %1, 16
654 %endif
655 %endmacro