c963deff8621927ae007c0b21518799788c184ae
[ffmpeg.git] / libavcodec / 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 ;* 51, Inc., Foundation 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 TRANSPOSE4x4B 5
45     SBUTTERFLY bw, %1, %2, %5
46     SBUTTERFLY bw, %3, %4, %5
47     SBUTTERFLY wd, %1, %3, %5
48     SBUTTERFLY wd, %2, %4, %5
49     SWAP %2, %3
50 %endmacro
51
52 %macro TRANSPOSE4x4W 5
53     SBUTTERFLY wd, %1, %2, %5
54     SBUTTERFLY wd, %3, %4, %5
55     SBUTTERFLY dq, %1, %3, %5
56     SBUTTERFLY dq, %2, %4, %5
57     SWAP %2, %3
58 %endmacro
59
60 %macro TRANSPOSE2x4x4W 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     SBUTTERFLY qdq, %1, %2, %5
66     SBUTTERFLY qdq, %3, %4, %5
67 %endmacro
68
69 %macro TRANSPOSE4x4D 5
70     SBUTTERFLY dq,  %1, %2, %5
71     SBUTTERFLY dq,  %3, %4, %5
72     SBUTTERFLY qdq, %1, %3, %5
73     SBUTTERFLY qdq, %2, %4, %5
74     SWAP %2, %3
75 %endmacro
76
77 %macro TRANSPOSE8x8W 9-11
78 %ifdef ARCH_X86_64
79     SBUTTERFLY wd,  %1, %2, %9
80     SBUTTERFLY wd,  %3, %4, %9
81     SBUTTERFLY wd,  %5, %6, %9
82     SBUTTERFLY wd,  %7, %8, %9
83     SBUTTERFLY dq,  %1, %3, %9
84     SBUTTERFLY dq,  %2, %4, %9
85     SBUTTERFLY dq,  %5, %7, %9
86     SBUTTERFLY dq,  %6, %8, %9
87     SBUTTERFLY qdq, %1, %5, %9
88     SBUTTERFLY qdq, %2, %6, %9
89     SBUTTERFLY qdq, %3, %7, %9
90     SBUTTERFLY qdq, %4, %8, %9
91     SWAP %2, %5
92     SWAP %4, %7
93 %else
94 ; in:  m0..m7, unless %11 in which case m6 is in %9
95 ; out: m0..m7, unless %11 in which case m4 is in %10
96 ; spills into %9 and %10
97 %if %0<11
98     movdqa %9, m%7
99 %endif
100     SBUTTERFLY wd,  %1, %2, %7
101     movdqa %10, m%2
102     movdqa m%7, %9
103     SBUTTERFLY wd,  %3, %4, %2
104     SBUTTERFLY wd,  %5, %6, %2
105     SBUTTERFLY wd,  %7, %8, %2
106     SBUTTERFLY dq,  %1, %3, %2
107     movdqa %9, m%3
108     movdqa m%2, %10
109     SBUTTERFLY dq,  %2, %4, %3
110     SBUTTERFLY dq,  %5, %7, %3
111     SBUTTERFLY dq,  %6, %8, %3
112     SBUTTERFLY qdq, %1, %5, %3
113     SBUTTERFLY qdq, %2, %6, %3
114     movdqa %10, m%2
115     movdqa m%3, %9
116     SBUTTERFLY qdq, %3, %7, %2
117     SBUTTERFLY qdq, %4, %8, %2
118     SWAP %2, %5
119     SWAP %4, %7
120 %if %0<11
121     movdqa m%5, %10
122 %endif
123 %endif
124 %endmacro
125
126 ; PABSW macros assume %1 != %2, while ABS1/2 macros work in-place
127 %macro PABSW_MMX 2
128     pxor       %1, %1
129     pcmpgtw    %1, %2
130     pxor       %2, %1
131     psubw      %2, %1
132     SWAP       %1, %2
133 %endmacro
134
135 %macro PSIGNW_MMX 2
136     pxor       %1, %2
137     psubw      %1, %2
138 %endmacro
139
140 %macro PABSW_MMX2 2
141     pxor    %1, %1
142     psubw   %1, %2
143     pmaxsw  %1, %2
144 %endmacro
145
146 %macro PABSW_SSSE3 2
147     pabsw      %1, %2
148 %endmacro
149
150 %macro PSIGNW_SSSE3 2
151     psignw     %1, %2
152 %endmacro
153
154 %macro ABS1_MMX 2    ; a, tmp
155     pxor       %2, %2
156     pcmpgtw    %2, %1
157     pxor       %1, %2
158     psubw      %1, %2
159 %endmacro
160
161 %macro ABS2_MMX 4    ; a, b, tmp0, tmp1
162     pxor       %3, %3
163     pxor       %4, %4
164     pcmpgtw    %3, %1
165     pcmpgtw    %4, %2
166     pxor       %1, %3
167     pxor       %2, %4
168     psubw      %1, %3
169     psubw      %2, %4
170 %endmacro
171
172 %macro ABS1_MMX2 2   ; a, tmp
173     pxor    %2, %2
174     psubw   %2, %1
175     pmaxsw  %1, %2
176 %endmacro
177
178 %macro ABS2_MMX2 4   ; a, b, tmp0, tmp1
179     pxor    %3, %3
180     pxor    %4, %4
181     psubw   %3, %1
182     psubw   %4, %2
183     pmaxsw  %1, %3
184     pmaxsw  %2, %4
185 %endmacro
186
187 %macro ABS1_SSSE3 2
188     pabsw   %1, %1
189 %endmacro
190
191 %macro ABS2_SSSE3 4
192     pabsw   %1, %1
193     pabsw   %2, %2
194 %endmacro
195
196 %macro ABSB_MMX 2
197     pxor    %2, %2
198     psubb   %2, %1
199     pminub  %1, %2
200 %endmacro
201
202 %macro ABSB2_MMX 4
203     pxor    %3, %3
204     pxor    %4, %4
205     psubb   %3, %1
206     psubb   %4, %2
207     pminub  %1, %3
208     pminub  %2, %4
209 %endmacro
210
211 %macro ABSB_SSSE3 2
212     pabsb   %1, %1
213 %endmacro
214
215 %macro ABSB2_SSSE3 4
216     pabsb   %1, %1
217     pabsb   %2, %2
218 %endmacro
219
220 %macro ABS4 6
221     ABS2 %1, %2, %5, %6
222     ABS2 %3, %4, %5, %6
223 %endmacro
224
225 %define ABS1 ABS1_MMX
226 %define ABS2 ABS2_MMX
227 %define ABSB ABSB_MMX
228 %define ABSB2 ABSB2_MMX
229
230 %macro SPLATB_MMX 3
231     movd      %1, [%2-3] ;to avoid crossing a cacheline
232     punpcklbw %1, %1
233 %if mmsize==16
234     pshuflw   %1, %1, 0xff
235     punpcklqdq %1, %1
236 %else
237     pshufw    %1, %1, 0xff
238 %endif
239 %endmacro
240
241 %macro SPLATB_SSSE3 3
242     movd      %1, [%2-3]
243     pshufb    %1, %3
244 %endmacro
245
246 %macro PALIGNR_MMX 4
247     %ifnidn %4, %2
248     mova    %4, %2
249     %endif
250     %if mmsize == 8
251     psllq   %1, (8-%3)*8
252     psrlq   %4, %3*8
253     %else
254     pslldq  %1, 16-%3
255     psrldq  %4, %3
256     %endif
257     por     %1, %4
258 %endmacro
259
260 %macro PALIGNR_SSSE3 4
261     palignr %1, %2, %3
262 %endmacro
263
264 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
265 %ifnum %5
266     mova   m%1, m%5
267     mova   m%3, m%5
268 %else
269     mova   m%1, %5
270     mova   m%3, m%1
271 %endif
272     pand   m%1, m%2 ; dst .. y6 .. y4
273     pand   m%3, m%4 ; src .. y6 .. y4
274     psrlw  m%2, 8   ; dst .. y7 .. y5
275     psrlw  m%4, 8   ; src .. y7 .. y5
276 %endmacro
277
278 %macro SUMSUB_BA 2-3
279 %if %0==2
280     paddw   %1, %2
281     paddw   %2, %2
282     psubw   %2, %1
283 %else
284     mova    %3, %1
285     paddw   %1, %2
286     psubw   %2, %3
287 %endif
288 %endmacro
289
290 %macro SUMSUB_BADC 4-5
291 %if %0==5
292     SUMSUB_BA %1, %2, %5
293     SUMSUB_BA %3, %4, %5
294 %else
295     paddw   %1, %2
296     paddw   %3, %4
297     paddw   %2, %2
298     paddw   %4, %4
299     psubw   %2, %1
300     psubw   %4, %3
301 %endif
302 %endmacro
303
304 %macro SUMSUB2_AB 3
305     mova    %3, %1
306     paddw   %1, %1
307     paddw   %1, %2
308     psubw   %3, %2
309     psubw   %3, %2
310 %endmacro
311
312 %macro SUMSUB2_BA 3
313     mova    m%3, m%1
314     paddw   m%1, m%2
315     paddw   m%1, m%2
316     psubw   m%2, m%3
317     psubw   m%2, m%3
318 %endmacro
319
320 %macro SUMSUBD2_AB 4
321     mova    %4, %1
322     mova    %3, %2
323     psraw   %2, 1  ; %2: %2>>1
324     psraw   %1, 1  ; %1: %1>>1
325     paddw   %2, %4 ; %2: %2>>1+%1
326     psubw   %1, %3 ; %1: %1>>1-%2
327 %endmacro
328
329 %macro DCT4_1D 5
330 %ifnum %5
331     SUMSUB_BADC m%4, m%1, m%3, m%2; m%5
332     SUMSUB_BA   m%3, m%4, m%5
333     SUMSUB2_AB  m%1, m%2, m%5
334     SWAP %1, %3, %4, %5, %2
335 %else
336     SUMSUB_BADC m%4, m%1, m%3, m%2
337     SUMSUB_BA   m%3, m%4
338     mova       [%5], m%2
339     SUMSUB2_AB m%1, [%5], m%2
340     SWAP %1, %3, %4, %2
341 %endif
342 %endmacro
343
344 %macro IDCT4_1D 5-6
345 %ifnum %5
346     SUMSUBD2_AB m%2, m%4, m%6, m%5
347     ; %2: %2>>1-%4 %4: %2+%4>>1
348     SUMSUB_BA   m%3, m%1, m%6
349     ; %3: %1+%3 %1: %1-%3
350     SUMSUB_BADC m%4, m%3, m%2, m%1, m%6
351     ; %4: %1+%3 + (%2+%4>>1)
352     ; %3: %1+%3 - (%2+%4>>1)
353     ; %2: %1-%3 + (%2>>1-%4)
354     ; %1: %1-%3 - (%2>>1-%4)
355 %else
356     SUMSUBD2_AB m%2, m%4, [%5], [%5+16]
357     SUMSUB_BA   m%3, m%1
358     SUMSUB_BADC m%4, m%3, m%2, m%1
359 %endif
360     SWAP %1, %4, %3
361     ; %1: %1+%3 + (%2+%4>>1) row0
362     ; %2: %1-%3 + (%2>>1-%4) row1
363     ; %3: %1-%3 - (%2>>1-%4) row2
364     ; %4: %1+%3 - (%2+%4>>1) row3
365 %endmacro
366
367
368 %macro LOAD_DIFF 5
369 %ifidn %3, none
370     movh       %1, %4
371     movh       %2, %5
372     punpcklbw  %1, %2
373     punpcklbw  %2, %2
374     psubw      %1, %2
375 %else
376     movh       %1, %4
377     punpcklbw  %1, %3
378     movh       %2, %5
379     punpcklbw  %2, %3
380     psubw      %1, %2
381 %endif
382 %endmacro
383
384 %macro STORE_DCT 6
385     movq   [%5+%6+ 0], m%1
386     movq   [%5+%6+ 8], m%2
387     movq   [%5+%6+16], m%3
388     movq   [%5+%6+24], m%4
389     movhps [%5+%6+32], m%1
390     movhps [%5+%6+40], m%2
391     movhps [%5+%6+48], m%3
392     movhps [%5+%6+56], m%4
393 %endmacro
394
395 %macro LOAD_DIFF_8x4P 7-10 r0,r2,0 ; 4x dest, 2x temp, 2x pointer, increment?
396     LOAD_DIFF m%1, m%5, m%7, [%8],      [%9]
397     LOAD_DIFF m%2, m%6, m%7, [%8+r1],   [%9+r3]
398     LOAD_DIFF m%3, m%5, m%7, [%8+2*r1], [%9+2*r3]
399     LOAD_DIFF m%4, m%6, m%7, [%8+r4],   [%9+r5]
400 %if %10
401     lea %8, [%8+4*r1]
402     lea %9, [%9+4*r3]
403 %endif
404 %endmacro
405
406 %macro DIFFx2 6-7
407     movh       %3, %5
408     punpcklbw  %3, %4
409     psraw      %1, 6
410     paddsw     %1, %3
411     movh       %3, %6
412     punpcklbw  %3, %4
413     psraw      %2, 6
414     paddsw     %2, %3
415     packuswb   %2, %1
416 %endmacro
417
418 %macro STORE_DIFF 4
419     movh       %2, %4
420     punpcklbw  %2, %3
421     psraw      %1, 6
422     paddsw     %1, %2
423     packuswb   %1, %1
424     movh       %4, %1
425 %endmacro
426
427 %macro STORE_DIFFx2 8 ; add1, add2, reg1, reg2, zero, shift, source, stride
428     movh       %3, [%7]
429     movh       %4, [%7+%8]
430     punpcklbw  %3, %5
431     punpcklbw  %4, %5
432     psraw      %1, %6
433     psraw      %2, %6
434     paddw      %3, %1
435     paddw      %4, %2
436     packuswb   %3, %5
437     packuswb   %4, %5
438     movh     [%7], %3
439     movh  [%7+%8], %4
440 %endmacro
441
442 %macro PMINUB_MMX 3 ; dst, src, tmp
443     mova     %3, %1
444     psubusb  %3, %2
445     psubb    %1, %3
446 %endmacro
447
448 %macro PMINUB_MMXEXT 3 ; dst, src, ignored
449     pminub   %1, %2
450 %endmacro
451
452 %macro SPLATW 2-3 0
453 %if mmsize == 16
454     pshuflw    %1, %2, (%3)*0x55
455     punpcklqdq %1, %1
456 %else
457     pshufw     %1, %2, (%3)*0x55
458 %endif
459 %endmacro
460
461 %macro CLIPW 3 ;(dst, min, max)
462     pmaxsw %1, %2
463     pminsw %1, %3
464 %endmacro