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