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