Merge commit '930e26a3ea9d223e04bac4cdde13697cec770031'
[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 macro assumes %1 != %2, while ABS1/2 macros work in-place
149 %macro PABSW 2
150 %if cpuflag(ssse3)
151     pabsw      %1, %2
152 %elif cpuflag(mmxext)
153     pxor    %1, %1
154     psubw   %1, %2
155     pmaxsw  %1, %2
156 %else
157     pxor       %1, %1
158     pcmpgtw    %1, %2
159     pxor       %2, %1
160     psubw      %2, %1
161     SWAP       %1, %2
162 %endif
163 %endmacro
164
165 %macro PSIGNW_MMX 2
166     pxor       %1, %2
167     psubw      %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_MMXEXT 2 ; a, tmp
193     pxor    %2, %2
194     psubw   %2, %1
195     pmaxsw  %1, %2
196 %endmacro
197
198 %macro ABS2_MMXEXT 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 PSWAPD 2
321 %if cpuflag(mmxext)
322     pshufw    %1, %2, q1032
323 %elif cpuflag(3dnowext)
324     pswapd    %1, %2
325 %elif cpuflag(3dnow)
326     movq      %1, %2
327     psrlq     %1, 32
328     punpckldq %1, %2
329 %endif
330 %endmacro
331
332 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
333 %ifnum %5
334     pand   m%3, m%5, m%4 ; src .. y6 .. y4
335     pand   m%1, m%5, m%2 ; dst .. y6 .. y4
336 %else
337     mova   m%1, %5
338     pand   m%3, m%1, m%4 ; src .. y6 .. y4
339     pand   m%1, m%1, m%2 ; dst .. y6 .. y4
340 %endif
341     psrlw  m%2, 8        ; dst .. y7 .. y5
342     psrlw  m%4, 8        ; src .. y7 .. y5
343 %endmacro
344
345 %macro SUMSUB_BA 3-4
346 %if %0==3
347     padd%1  m%2, m%3
348     padd%1  m%3, m%3
349     psub%1  m%3, m%2
350 %else
351 %if avx_enabled == 0
352     mova    m%4, m%2
353     padd%1  m%2, m%3
354     psub%1  m%3, m%4
355 %else
356     padd%1  m%4, m%2, m%3
357     psub%1  m%3, m%2
358     SWAP    %2, %4
359 %endif
360 %endif
361 %endmacro
362
363 %macro SUMSUB_BADC 5-6
364 %if %0==6
365     SUMSUB_BA %1, %2, %3, %6
366     SUMSUB_BA %1, %4, %5, %6
367 %else
368     padd%1  m%2, m%3
369     padd%1  m%4, m%5
370     padd%1  m%3, m%3
371     padd%1  m%5, m%5
372     psub%1  m%3, m%2
373     psub%1  m%5, m%4
374 %endif
375 %endmacro
376
377 %macro SUMSUB2_AB 4
378 %ifnum %3
379     psub%1  m%4, m%2, m%3
380     psub%1  m%4, m%3
381     padd%1  m%2, m%2
382     padd%1  m%2, m%3
383 %else
384     mova    m%4, m%2
385     padd%1  m%2, m%2
386     padd%1  m%2, %3
387     psub%1  m%4, %3
388     psub%1  m%4, %3
389 %endif
390 %endmacro
391
392 %macro SUMSUB2_BA 4
393 %if avx_enabled == 0
394     mova    m%4, m%2
395     padd%1  m%2, m%3
396     padd%1  m%2, m%3
397     psub%1  m%3, m%4
398     psub%1  m%3, m%4
399 %else
400     padd%1  m%4, m%2, m%3
401     padd%1  m%4, m%3
402     psub%1  m%3, m%2
403     psub%1  m%3, m%2
404     SWAP     %2,  %4
405 %endif
406 %endmacro
407
408 %macro SUMSUBD2_AB 5
409 %ifnum %4
410     psra%1  m%5, m%2, 1  ; %3: %3>>1
411     psra%1  m%4, m%3, 1  ; %2: %2>>1
412     padd%1  m%4, m%2     ; %3: %3>>1+%2
413     psub%1  m%5, m%3     ; %2: %2>>1-%3
414     SWAP     %2, %5
415     SWAP     %3, %4
416 %else
417     mova    %5, m%2
418     mova    %4, m%3
419     psra%1  m%3, 1  ; %3: %3>>1
420     psra%1  m%2, 1  ; %2: %2>>1
421     padd%1  m%3, %5 ; %3: %3>>1+%2
422     psub%1  m%2, %4 ; %2: %2>>1-%3
423 %endif
424 %endmacro
425
426 %macro DCT4_1D 5
427 %ifnum %5
428     SUMSUB_BADC w, %4, %1, %3, %2, %5
429     SUMSUB_BA   w, %3, %4, %5
430     SUMSUB2_AB  w, %1, %2, %5
431     SWAP %1, %3, %4, %5, %2
432 %else
433     SUMSUB_BADC w, %4, %1, %3, %2
434     SUMSUB_BA   w, %3, %4
435     mova     [%5], m%2
436     SUMSUB2_AB  w, %1, [%5], %2
437     SWAP %1, %3, %4, %2
438 %endif
439 %endmacro
440
441 %macro IDCT4_1D 6-7
442 %ifnum %6
443     SUMSUBD2_AB %1, %3, %5, %7, %6
444     ; %3: %3>>1-%5 %5: %3+%5>>1
445     SUMSUB_BA   %1, %4, %2, %7
446     ; %4: %2+%4 %2: %2-%4
447     SUMSUB_BADC %1, %5, %4, %3, %2, %7
448     ; %5: %2+%4 + (%3+%5>>1)
449     ; %4: %2+%4 - (%3+%5>>1)
450     ; %3: %2-%4 + (%3>>1-%5)
451     ; %2: %2-%4 - (%3>>1-%5)
452 %else
453 %ifidn %1, w
454     SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
455 %else
456     SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
457 %endif
458     SUMSUB_BA   %1, %4, %2
459     SUMSUB_BADC %1, %5, %4, %3, %2
460 %endif
461     SWAP %2, %5, %4
462     ; %2: %2+%4 + (%3+%5>>1) row0
463     ; %3: %2-%4 + (%3>>1-%5) row1
464     ; %4: %2-%4 - (%3>>1-%5) row2
465     ; %5: %2+%4 - (%3+%5>>1) row3
466 %endmacro
467
468
469 %macro LOAD_DIFF 5
470 %ifidn %3, none
471     movh       %1, %4
472     movh       %2, %5
473     punpcklbw  %1, %2
474     punpcklbw  %2, %2
475     psubw      %1, %2
476 %else
477     movh       %1, %4
478     punpcklbw  %1, %3
479     movh       %2, %5
480     punpcklbw  %2, %3
481     psubw      %1, %2
482 %endif
483 %endmacro
484
485 %macro STORE_DCT 6
486     movq   [%5+%6+ 0], m%1
487     movq   [%5+%6+ 8], m%2
488     movq   [%5+%6+16], m%3
489     movq   [%5+%6+24], m%4
490     movhps [%5+%6+32], m%1
491     movhps [%5+%6+40], m%2
492     movhps [%5+%6+48], m%3
493     movhps [%5+%6+56], m%4
494 %endmacro
495
496 %macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
497     LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
498     LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
499     LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
500     LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
501 %if %10
502     lea %8, [%8+4*r1]
503     lea %9, [%9+4*r3]
504 %endif
505 %endmacro
506
507 %macro DIFFx2 6-7
508     movh       %3, %5
509     punpcklbw  %3, %4
510     psraw      %1, 6
511     paddsw     %1, %3
512     movh       %3, %6
513     punpcklbw  %3, %4
514     psraw      %2, 6
515     paddsw     %2, %3
516     packuswb   %2, %1
517 %endmacro
518
519 %macro STORE_DIFF 4
520     movh       %2, %4
521     punpcklbw  %2, %3
522     psraw      %1, 6
523     paddsw     %1, %2
524     packuswb   %1, %1
525     movh       %4, %1
526 %endmacro
527
528 %macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
529     movh       %3, [%7]
530     movh       %4, [%7+%8]
531     psraw      %1, %6
532     psraw      %2, %6
533     punpcklbw  %3, %5
534     punpcklbw  %4, %5
535     paddw      %3, %1
536     paddw      %4, %2
537     packuswb   %3, %5
538     packuswb   %4, %5
539     movh     [%7], %3
540     movh  [%7+%8], %4
541 %endmacro
542
543 %macro PMINUB 3 ; dst, src, ignored
544 %if cpuflag(mmxext)
545     pminub   %1, %2
546 %else ; dst, src, tmp
547     mova     %3, %1
548     psubusb  %3, %2
549     psubb    %1, %3
550 %endif
551 %endmacro
552
553 %macro SPLATW 2-3 0
554 %if mmsize == 16
555     pshuflw    %1, %2, (%3)*0x55
556     punpcklqdq %1, %1
557 %elif cpuflag(mmx2)
558     pshufw     %1, %2, (%3)*0x55
559 %else
560     %ifnidn %1, %2
561         mova       %1, %2
562     %endif
563     %if %3 & 2
564         punpckhwd  %1, %1
565     %else
566         punpcklwd  %1, %1
567     %endif
568     %if %3 & 1
569         punpckhwd  %1, %1
570     %else
571         punpcklwd  %1, %1
572     %endif
573 %endif
574 %endmacro
575
576 %macro SPLATD 2-3 0
577 %if mmsize == 16
578     pshufd %1, %2, (%3)*0x55
579 %else
580     pshufw %1, %2, (%3)*0x11 + ((%3)+1)*0x44
581 %endif
582 %endmacro
583
584 %macro SPLATD_MMX 1
585     punpckldq  %1, %1
586 %endmacro
587
588 %macro SPLATD_SSE 1
589     shufps  %1, %1, 0
590 %endmacro
591
592 %macro SPLATD_SSE2 1
593     pshufd  %1, %1, 0
594 %endmacro
595
596 %macro CLIPW 3 ;(dst, min, max)
597     pmaxsw %1, %2
598     pminsw %1, %3
599 %endmacro
600
601 %macro PMINSD_MMX 3 ; dst, src, tmp
602     mova      %3, %2
603     pcmpgtd   %3, %1
604     pxor      %1, %2
605     pand      %1, %3
606     pxor      %1, %2
607 %endmacro
608
609 %macro PMAXSD_MMX 3 ; dst, src, tmp
610     mova      %3, %1
611     pcmpgtd   %3, %2
612     pand      %1, %3
613     pandn     %3, %2
614     por       %1, %3
615 %endmacro
616
617 %macro CLIPD_MMX 3-4 ; src/dst, min, max, tmp
618     PMINSD_MMX %1, %3, %4
619     PMAXSD_MMX %1, %2, %4
620 %endmacro
621
622 %macro CLIPD_SSE2 3-4 ; src/dst, min (float), max (float), unused
623     cvtdq2ps  %1, %1
624     minps     %1, %3
625     maxps     %1, %2
626     cvtps2dq  %1, %1
627 %endmacro
628
629 %macro CLIPD_SSE41 3-4 ;  src/dst, min, max, unused
630     pminsd  %1, %3
631     pmaxsd  %1, %2
632 %endmacro
633
634 %macro VBROADCASTSS 2 ; dst xmm/ymm, src m32
635 %if cpuflag(avx)
636     vbroadcastss %1, %2
637 %else ; sse
638     movss        %1, %2
639     shufps       %1, %1, 0
640 %endif
641 %endmacro
642
643 %macro SHUFFLE_MASK_W 8
644     %rep 8
645         %if %1>=0x80
646             db %1, %1
647         %else
648             db %1*2
649             db %1*2+1
650         %endif
651         %rotate 1
652     %endrep
653 %endmacro
654
655 %macro PMOVSXWD 2; dst, src
656 %if cpuflag(sse4)
657     pmovsxwd     %1, %2
658 %else
659     %ifnidn %1, %2
660     mova         %1, %2
661     %endif
662     punpcklwd    %1, %1
663     psrad        %1, 16
664 %endif
665 %endmacro