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