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