Merge remote-tracking branch 'qatar/master'
[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 %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     movaps   m%3, m%1
46     unpcklps m%1, m%2
47     unpckhps m%3, m%2
48     SWAP %2, %3
49 %endmacro
50
51 %macro TRANSPOSE4x4B 5
52     SBUTTERFLY bw, %1, %2, %5
53     SBUTTERFLY bw, %3, %4, %5
54     SBUTTERFLY wd, %1, %3, %5
55     SBUTTERFLY wd, %2, %4, %5
56     SWAP %2, %3
57 %endmacro
58
59 %macro TRANSPOSE4x4W 5
60     SBUTTERFLY wd, %1, %2, %5
61     SBUTTERFLY wd, %3, %4, %5
62     SBUTTERFLY dq, %1, %3, %5
63     SBUTTERFLY dq, %2, %4, %5
64     SWAP %2, %3
65 %endmacro
66
67 %macro TRANSPOSE2x4x4W 5
68     SBUTTERFLY wd,  %1, %2, %5
69     SBUTTERFLY wd,  %3, %4, %5
70     SBUTTERFLY dq,  %1, %3, %5
71     SBUTTERFLY dq,  %2, %4, %5
72     SBUTTERFLY qdq, %1, %2, %5
73     SBUTTERFLY qdq, %3, %4, %5
74 %endmacro
75
76 %macro TRANSPOSE4x4D 5
77     SBUTTERFLY dq,  %1, %2, %5
78     SBUTTERFLY dq,  %3, %4, %5
79     SBUTTERFLY qdq, %1, %3, %5
80     SBUTTERFLY qdq, %2, %4, %5
81     SWAP %2, %3
82 %endmacro
83
84 ; identical behavior to TRANSPOSE4x4D, but using SSE1 float ops
85 %macro TRANSPOSE4x4PS 5
86     SBUTTERFLYPS %1, %2, %5
87     SBUTTERFLYPS %3, %4, %5
88     movaps  m%5, m%1
89     movlhps m%1, m%3
90     movhlps m%3, m%5
91     movaps  m%5, m%2
92     movlhps m%2, m%4
93     movhlps m%4, m%5
94     SWAP %2, %3
95 %endmacro
96
97 %macro TRANSPOSE8x8W 9-11
98 %ifdef 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_MMX 3
262     movd      %1, [%2-3] ;to avoid crossing a cacheline
263     punpcklbw %1, %1
264     SPLATW    %1, %1, 3
265 %endmacro
266
267 %macro SPLATB_SSSE3 3
268     movd      %1, [%2-3]
269     pshufb    %1, %3
270 %endmacro
271
272 %macro PALIGNR_MMX 4-5 ; [dst,] src1, src2, imm, tmp
273     %define %%dst %1
274 %if %0==5
275 %ifnidn %1, %2
276     mova    %%dst, %2
277 %endif
278     %rotate 1
279 %endif
280 %ifnidn %4, %2
281     mova    %4, %2
282 %endif
283 %if mmsize==8
284     psllq   %%dst, (8-%3)*8
285     psrlq   %4, %3*8
286 %else
287     pslldq  %%dst, 16-%3
288     psrldq  %4, %3
289 %endif
290     por     %%dst, %4
291 %endmacro
292
293 %macro PALIGNR_SSSE3 4-5
294 %if %0==5
295     palignr %1, %2, %3, %4
296 %else
297     palignr %1, %2, %3
298 %endif
299 %endmacro
300
301 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
302 %ifnum %5
303     pand   m%3, m%5, m%4 ; src .. y6 .. y4
304     pand   m%1, m%5, m%2 ; dst .. y6 .. y4
305 %else
306     mova   m%1, %5
307     pand   m%3, m%1, m%4 ; src .. y6 .. y4
308     pand   m%1, m%1, m%2 ; dst .. y6 .. y4
309 %endif
310     psrlw  m%2, 8        ; dst .. y7 .. y5
311     psrlw  m%4, 8        ; src .. y7 .. y5
312 %endmacro
313
314 %macro SUMSUB_BA 3-4
315 %if %0==3
316     padd%1  m%2, m%3
317     padd%1  m%3, m%3
318     psub%1  m%3, m%2
319 %else
320 %if avx_enabled == 0
321     mova    m%4, m%2
322     padd%1  m%2, m%3
323     psub%1  m%3, m%4
324 %else
325     padd%1  m%4, m%2, m%3
326     psub%1  m%3, m%2
327     SWAP    %2, %4
328 %endif
329 %endif
330 %endmacro
331
332 %macro SUMSUB_BADC 5-6
333 %if %0==6
334     SUMSUB_BA %1, %2, %3, %6
335     SUMSUB_BA %1, %4, %5, %6
336 %else
337     padd%1  m%2, m%3
338     padd%1  m%4, m%5
339     padd%1  m%3, m%3
340     padd%1  m%5, m%5
341     psub%1  m%3, m%2
342     psub%1  m%5, m%4
343 %endif
344 %endmacro
345
346 %macro SUMSUB2_AB 4
347 %ifnum %3
348     psub%1  m%4, m%2, m%3
349     psub%1  m%4, m%3
350     padd%1  m%2, m%2
351     padd%1  m%2, m%3
352 %else
353     mova    m%4, m%2
354     padd%1  m%2, m%2
355     padd%1  m%2, %3
356     psub%1  m%4, %3
357     psub%1  m%4, %3
358 %endif
359 %endmacro
360
361 %macro SUMSUB2_BA 4
362 %if avx_enabled == 0
363     mova    m%4, m%2
364     padd%1  m%2, m%3
365     padd%1  m%2, m%3
366     psub%1  m%3, m%4
367     psub%1  m%3, m%4
368 %else
369     padd%1  m%4, m%2, m%3
370     padd%1  m%4, m%3
371     psub%1  m%3, m%2
372     psub%1  m%3, m%2
373     SWAP     %2,  %4
374 %endif
375 %endmacro
376
377 %macro SUMSUBD2_AB 5
378 %ifnum %4
379     psra%1  m%5, m%2, 1  ; %3: %3>>1
380     psra%1  m%4, m%3, 1  ; %2: %2>>1
381     padd%1  m%4, m%2     ; %3: %3>>1+%2
382     psub%1  m%5, m%3     ; %2: %2>>1-%3
383     SWAP     %2, %5
384     SWAP     %3, %4
385 %else
386     mova    %5, m%2
387     mova    %4, m%3
388     psra%1  m%3, 1  ; %3: %3>>1
389     psra%1  m%2, 1  ; %2: %2>>1
390     padd%1  m%3, %5 ; %3: %3>>1+%2
391     psub%1  m%2, %4 ; %2: %2>>1-%3
392 %endif
393 %endmacro
394
395 %macro DCT4_1D 5
396 %ifnum %5
397     SUMSUB_BADC w, %4, %1, %3, %2, %5
398     SUMSUB_BA   w, %3, %4, %5
399     SUMSUB2_AB  w, %1, %2, %5
400     SWAP %1, %3, %4, %5, %2
401 %else
402     SUMSUB_BADC w, %4, %1, %3, %2
403     SUMSUB_BA   w, %3, %4
404     mova     [%5], m%2
405     SUMSUB2_AB  w, %1, [%5], %2
406     SWAP %1, %3, %4, %2
407 %endif
408 %endmacro
409
410 %macro IDCT4_1D 6-7
411 %ifnum %6
412     SUMSUBD2_AB %1, %3, %5, %7, %6
413     ; %3: %3>>1-%5 %5: %3+%5>>1
414     SUMSUB_BA   %1, %4, %2, %7
415     ; %4: %2+%4 %2: %2-%4
416     SUMSUB_BADC %1, %5, %4, %3, %2, %7
417     ; %5: %2+%4 + (%3+%5>>1)
418     ; %4: %2+%4 - (%3+%5>>1)
419     ; %3: %2-%4 + (%3>>1-%5)
420     ; %2: %2-%4 - (%3>>1-%5)
421 %else
422 %ifidn %1, w
423     SUMSUBD2_AB %1, %3, %5, [%6], [%6+16]
424 %else
425     SUMSUBD2_AB %1, %3, %5, [%6], [%6+32]
426 %endif
427     SUMSUB_BA   %1, %4, %2
428     SUMSUB_BADC %1, %5, %4, %3, %2
429 %endif
430     SWAP %2, %5, %4
431     ; %2: %2+%4 + (%3+%5>>1) row0
432     ; %3: %2-%4 + (%3>>1-%5) row1
433     ; %4: %2-%4 - (%3>>1-%5) row2
434     ; %5: %2+%4 - (%3+%5>>1) row3
435 %endmacro
436
437
438 %macro LOAD_DIFF 5
439 %ifidn %3, none
440     movh       %1, %4
441     movh       %2, %5
442     punpcklbw  %1, %2
443     punpcklbw  %2, %2
444     psubw      %1, %2
445 %else
446     movh       %1, %4
447     punpcklbw  %1, %3
448     movh       %2, %5
449     punpcklbw  %2, %3
450     psubw      %1, %2
451 %endif
452 %endmacro
453
454 %macro STORE_DCT 6
455     movq   [%5+%6+ 0], m%1
456     movq   [%5+%6+ 8], m%2
457     movq   [%5+%6+16], m%3
458     movq   [%5+%6+24], m%4
459     movhps [%5+%6+32], m%1
460     movhps [%5+%6+40], m%2
461     movhps [%5+%6+48], m%3
462     movhps [%5+%6+56], m%4
463 %endmacro
464
465 %macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
466     LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
467     LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
468     LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
469     LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
470 %if %10
471     lea %8, [%8+4*r1]
472     lea %9, [%9+4*r3]
473 %endif
474 %endmacro
475
476 %macro DIFFx2 6-7
477     movh       %3, %5
478     punpcklbw  %3, %4
479     psraw      %1, 6
480     paddsw     %1, %3
481     movh       %3, %6
482     punpcklbw  %3, %4
483     psraw      %2, 6
484     paddsw     %2, %3
485     packuswb   %2, %1
486 %endmacro
487
488 %macro STORE_DIFF 4
489     movh       %2, %4
490     punpcklbw  %2, %3
491     psraw      %1, 6
492     paddsw     %1, %2
493     packuswb   %1, %1
494     movh       %4, %1
495 %endmacro
496
497 %macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
498     movh       %3, [%7]
499     movh       %4, [%7+%8]
500     psraw      %1, %6
501     psraw      %2, %6
502     punpcklbw  %3, %5
503     punpcklbw  %4, %5
504     paddw      %3, %1
505     paddw      %4, %2
506     packuswb   %3, %5
507     packuswb   %4, %5
508     movh     [%7], %3
509     movh  [%7+%8], %4
510 %endmacro
511
512 %macro PMINUB_MMX 3 ; dst, src, tmp
513     mova     %3, %1
514     psubusb  %3, %2
515     psubb    %1, %3
516 %endmacro
517
518 %macro PMINUB_MMXEXT 3 ; dst, src, ignored
519     pminub   %1, %2
520 %endmacro
521
522 %macro SPLATW 2-3 0
523 %if mmsize == 16
524     pshuflw    %1, %2, (%3)*0x55
525     punpcklqdq %1, %1
526 %else
527     pshufw     %1, %2, (%3)*0x55
528 %endif
529 %endmacro
530
531 %macro SPLATD 2-3 0
532 %if mmsize == 16
533     pshufd %1, %2, (%3)*0x55
534 %else
535     pshufw %1, %2, (%3)*0x11 + ((%3)+1)*0x44
536 %endif
537 %endmacro
538
539 %macro SPLATD_MMX 1
540     punpckldq  %1, %1
541 %endmacro
542
543 %macro SPLATD_SSE 1
544     shufps  %1, %1, 0
545 %endmacro
546
547 %macro SPLATD_SSE2 1
548     pshufd  %1, %1, 0
549 %endmacro
550
551 %macro CLIPW 3 ;(dst, min, max)
552     pmaxsw %1, %2
553     pminsw %1, %3
554 %endmacro
555
556 %macro PMINSD_MMX 3 ; dst, src, tmp
557     mova      %3, %2
558     pcmpgtd   %3, %1
559     pxor      %1, %2
560     pand      %1, %3
561     pxor      %1, %2
562 %endmacro
563
564 %macro PMAXSD_MMX 3 ; dst, src, tmp
565     mova      %3, %1
566     pcmpgtd   %3, %2
567     pand      %1, %3
568     pandn     %3, %2
569     por       %1, %3
570 %endmacro
571
572 %macro CLIPD_MMX 3-4 ; src/dst, min, max, tmp
573     PMINSD_MMX %1, %3, %4
574     PMAXSD_MMX %1, %2, %4
575 %endmacro
576
577 %macro CLIPD_SSE2 3-4 ; src/dst, min (float), max (float), unused
578     cvtdq2ps  %1, %1
579     minps     %1, %3
580     maxps     %1, %2
581     cvtps2dq  %1, %1
582 %endmacro
583
584 %macro CLIPD_SSE41 3-4 ;  src/dst, min, max, unused
585     pminsd  %1, %3
586     pmaxsd  %1, %2
587 %endmacro