]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/hpeldsp.asm
dsputil: Move LOCAL_ALIGNED macros to libavutil
[ffmpeg] / libavcodec / x86 / hpeldsp.asm
1 ;******************************************************************************
2 ;* MMX optimized hpel functions
3 ;*
4 ;* This file is part of Libav.
5 ;*
6 ;* Libav is free software; you can redistribute it and/or
7 ;* modify it under the terms of the GNU Lesser General Public
8 ;* License as published by the Free Software Foundation; either
9 ;* version 2.1 of the License, or (at your option) any later version.
10 ;*
11 ;* Libav is distributed in the hope that it will be useful,
12 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 ;* Lesser General Public License for more details.
15 ;*
16 ;* You should have received a copy of the GNU Lesser General Public
17 ;* License along with Libav; if not, write to the Free Software
18 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 ;******************************************************************************
20
21 %include "libavutil/x86/x86util.asm"
22
23 SECTION_RODATA
24 cextern pb_1
25
26 SECTION_TEXT
27
28 ; put_pixels8_x2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
29 %macro PUT_PIXELS8_X2 0
30 cglobal put_pixels8_x2, 4,5
31     lea          r4, [r2*2]
32 .loop:
33     mova         m0, [r1]
34     mova         m1, [r1+r2]
35     PAVGB        m0, [r1+1]
36     PAVGB        m1, [r1+r2+1]
37     mova       [r0], m0
38     mova    [r0+r2], m1
39     add          r1, r4
40     add          r0, r4
41     mova         m0, [r1]
42     mova         m1, [r1+r2]
43     PAVGB        m0, [r1+1]
44     PAVGB        m1, [r1+r2+1]
45     add          r1, r4
46     mova       [r0], m0
47     mova    [r0+r2], m1
48     add          r0, r4
49     sub         r3d, 4
50     jne .loop
51     REP_RET
52 %endmacro
53
54 INIT_MMX mmxext
55 PUT_PIXELS8_X2
56 INIT_MMX 3dnow
57 PUT_PIXELS8_X2
58
59
60 ; put_pixels16_x2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
61 %macro PUT_PIXELS_16 0
62 cglobal put_pixels16_x2, 4,5
63     lea          r4, [r2*2]
64 .loop:
65     mova         m0, [r1]
66     mova         m1, [r1+r2]
67     mova         m2, [r1+8]
68     mova         m3, [r1+r2+8]
69     PAVGB        m0, [r1+1]
70     PAVGB        m1, [r1+r2+1]
71     PAVGB        m2, [r1+9]
72     PAVGB        m3, [r1+r2+9]
73     mova       [r0], m0
74     mova    [r0+r2], m1
75     mova     [r0+8], m2
76     mova  [r0+r2+8], m3
77     add          r1, r4
78     add          r0, r4
79     mova         m0, [r1]
80     mova         m1, [r1+r2]
81     mova         m2, [r1+8]
82     mova         m3, [r1+r2+8]
83     PAVGB        m0, [r1+1]
84     PAVGB        m1, [r1+r2+1]
85     PAVGB        m2, [r1+9]
86     PAVGB        m3, [r1+r2+9]
87     add          r1, r4
88     mova       [r0], m0
89     mova    [r0+r2], m1
90     mova     [r0+8], m2
91     mova  [r0+r2+8], m3
92     add          r0, r4
93     sub         r3d, 4
94     jne .loop
95     REP_RET
96 %endmacro
97
98 INIT_MMX mmxext
99 PUT_PIXELS_16
100 INIT_MMX 3dnow
101 PUT_PIXELS_16
102
103
104 ; put_no_rnd_pixels8_x2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
105 %macro PUT_NO_RND_PIXELS8_X2 0
106 cglobal put_no_rnd_pixels8_x2, 4,5
107     mova         m6, [pb_1]
108     lea          r4, [r2*2]
109 .loop:
110     mova         m0, [r1]
111     mova         m2, [r1+r2]
112     mova         m1, [r1+1]
113     mova         m3, [r1+r2+1]
114     add          r1, r4
115     psubusb      m0, m6
116     psubusb      m2, m6
117     PAVGB        m0, m1
118     PAVGB        m2, m3
119     mova       [r0], m0
120     mova    [r0+r2], m2
121     mova         m0, [r1]
122     mova         m1, [r1+1]
123     mova         m2, [r1+r2]
124     mova         m3, [r1+r2+1]
125     add          r0, r4
126     add          r1, r4
127     psubusb      m0, m6
128     psubusb      m2, m6
129     PAVGB        m0, m1
130     PAVGB        m2, m3
131     mova       [r0], m0
132     mova    [r0+r2], m2
133     add          r0, r4
134     sub         r3d, 4
135     jne .loop
136     REP_RET
137 %endmacro
138
139 INIT_MMX mmxext
140 PUT_NO_RND_PIXELS8_X2
141 INIT_MMX 3dnow
142 PUT_NO_RND_PIXELS8_X2
143
144
145 ; put_no_rnd_pixels8_x2_exact(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
146 %macro PUT_NO_RND_PIXELS8_X2_EXACT 0
147 cglobal put_no_rnd_pixels8_x2_exact, 4,5
148     lea          r4, [r2*3]
149     pcmpeqb      m6, m6
150 .loop:
151     mova         m0, [r1]
152     mova         m2, [r1+r2]
153     mova         m1, [r1+1]
154     mova         m3, [r1+r2+1]
155     pxor         m0, m6
156     pxor         m2, m6
157     pxor         m1, m6
158     pxor         m3, m6
159     PAVGB        m0, m1
160     PAVGB        m2, m3
161     pxor         m0, m6
162     pxor         m2, m6
163     mova       [r0], m0
164     mova    [r0+r2], m2
165     mova         m0, [r1+r2*2]
166     mova         m1, [r1+r2*2+1]
167     mova         m2, [r1+r4]
168     mova         m3, [r1+r4+1]
169     pxor         m0, m6
170     pxor         m1, m6
171     pxor         m2, m6
172     pxor         m3, m6
173     PAVGB        m0, m1
174     PAVGB        m2, m3
175     pxor         m0, m6
176     pxor         m2, m6
177     mova  [r0+r2*2], m0
178     mova    [r0+r4], m2
179     lea          r1, [r1+r2*4]
180     lea          r0, [r0+r2*4]
181     sub         r3d, 4
182     jg .loop
183     REP_RET
184 %endmacro
185
186 INIT_MMX mmxext
187 PUT_NO_RND_PIXELS8_X2_EXACT
188 INIT_MMX 3dnow
189 PUT_NO_RND_PIXELS8_X2_EXACT
190
191
192 ; put_pixels8_y2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
193 %macro PUT_PIXELS8_Y2 0
194 cglobal put_pixels8_y2, 4,5
195     lea          r4, [r2*2]
196     mova         m0, [r1]
197     sub          r0, r2
198 .loop:
199     mova         m1, [r1+r2]
200     mova         m2, [r1+r4]
201     add          r1, r4
202     PAVGB        m0, m1
203     PAVGB        m1, m2
204     mova    [r0+r2], m0
205     mova    [r0+r4], m1
206     mova         m1, [r1+r2]
207     mova         m0, [r1+r4]
208     add          r0, r4
209     add          r1, r4
210     PAVGB        m2, m1
211     PAVGB        m1, m0
212     mova    [r0+r2], m2
213     mova    [r0+r4], m1
214     add          r0, r4
215     sub         r3d, 4
216     jne .loop
217     REP_RET
218 %endmacro
219
220 INIT_MMX mmxext
221 PUT_PIXELS8_Y2
222 INIT_MMX 3dnow
223 PUT_PIXELS8_Y2
224
225
226 ; put_no_rnd_pixels8_y2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
227 %macro PUT_NO_RND_PIXELS8_Y2 0
228 cglobal put_no_rnd_pixels8_y2, 4,5
229     mova         m6, [pb_1]
230     lea          r4, [r2+r2]
231     mova         m0, [r1]
232     sub          r0, r2
233 .loop:
234     mova         m1, [r1+r2]
235     mova         m2, [r1+r4]
236     add          r1, r4
237     psubusb      m1, m6
238     PAVGB        m0, m1
239     PAVGB        m1, m2
240     mova    [r0+r2], m0
241     mova    [r0+r4], m1
242     mova         m1, [r1+r2]
243     mova         m0, [r1+r4]
244     add          r0, r4
245     add          r1, r4
246     psubusb      m1, m6
247     PAVGB        m2, m1
248     PAVGB        m1, m0
249     mova    [r0+r2], m2
250     mova    [r0+r4], m1
251     add          r0, r4
252     sub         r3d, 4
253     jne .loop
254     REP_RET
255 %endmacro
256
257 INIT_MMX mmxext
258 PUT_NO_RND_PIXELS8_Y2
259 INIT_MMX 3dnow
260 PUT_NO_RND_PIXELS8_Y2
261
262
263 ; put_no_rnd_pixels8_y2_exact(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
264 %macro PUT_NO_RND_PIXELS8_Y2_EXACT 0
265 cglobal put_no_rnd_pixels8_y2_exact, 4,5
266     lea          r4, [r2*3]
267     mova         m0, [r1]
268     pcmpeqb      m6, m6
269     add          r1, r2
270     pxor         m0, m6
271 .loop:
272     mova         m1, [r1]
273     mova         m2, [r1+r2]
274     pxor         m1, m6
275     pxor         m2, m6
276     PAVGB        m0, m1
277     PAVGB        m1, m2
278     pxor         m0, m6
279     pxor         m1, m6
280     mova       [r0], m0
281     mova    [r0+r2], m1
282     mova         m1, [r1+r2*2]
283     mova         m0, [r1+r4]
284     pxor         m1, m6
285     pxor         m0, m6
286     PAVGB        m2, m1
287     PAVGB        m1, m0
288     pxor         m2, m6
289     pxor         m1, m6
290     mova  [r0+r2*2], m2
291     mova    [r0+r4], m1
292     lea          r1, [r1+r2*4]
293     lea          r0, [r0+r2*4]
294     sub         r3d, 4
295     jg .loop
296     REP_RET
297 %endmacro
298
299 INIT_MMX mmxext
300 PUT_NO_RND_PIXELS8_Y2_EXACT
301 INIT_MMX 3dnow
302 PUT_NO_RND_PIXELS8_Y2_EXACT
303
304
305 ; avg_pixels8(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
306 %macro AVG_PIXELS8 0
307 cglobal avg_pixels8, 4,5
308     lea          r4, [r2*2]
309 .loop:
310     mova         m0, [r0]
311     mova         m1, [r0+r2]
312     PAVGB        m0, [r1]
313     PAVGB        m1, [r1+r2]
314     mova       [r0], m0
315     mova    [r0+r2], m1
316     add          r1, r4
317     add          r0, r4
318     mova         m0, [r0]
319     mova         m1, [r0+r2]
320     PAVGB        m0, [r1]
321     PAVGB        m1, [r1+r2]
322     add          r1, r4
323     mova       [r0], m0
324     mova    [r0+r2], m1
325     add          r0, r4
326     sub         r3d, 4
327     jne .loop
328     REP_RET
329 %endmacro
330
331 INIT_MMX 3dnow
332 AVG_PIXELS8
333
334
335 ; avg_pixels8_x2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
336 %macro AVG_PIXELS8_X2 0
337 cglobal avg_pixels8_x2, 4,5
338     lea          r4, [r2*2]
339 .loop:
340     mova         m0, [r1]
341     mova         m2, [r1+r2]
342     PAVGB        m0, [r1+1]
343     PAVGB        m2, [r1+r2+1]
344     PAVGB        m0, [r0]
345     PAVGB        m2, [r0+r2]
346     add          r1, r4
347     mova       [r0], m0
348     mova    [r0+r2], m2
349     mova         m0, [r1]
350     mova         m2, [r1+r2]
351     PAVGB        m0, [r1+1]
352     PAVGB        m2, [r1+r2+1]
353     add          r0, r4
354     add          r1, r4
355     PAVGB        m0, [r0]
356     PAVGB        m2, [r0+r2]
357     mova       [r0], m0
358     mova    [r0+r2], m2
359     add          r0, r4
360     sub         r3d, 4
361     jne .loop
362     REP_RET
363 %endmacro
364
365 INIT_MMX mmxext
366 AVG_PIXELS8_X2
367 INIT_MMX 3dnow
368 AVG_PIXELS8_X2
369
370
371 ; avg_pixels8_y2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
372 %macro AVG_PIXELS8_Y2 0
373 cglobal avg_pixels8_y2, 4,5
374     lea          r4, [r2*2]
375     mova         m0, [r1]
376     sub          r0, r2
377 .loop:
378     mova         m1, [r1+r2]
379     mova         m2, [r1+r4]
380     add          r1, r4
381     PAVGB        m0, m1
382     PAVGB        m1, m2
383     mova         m3, [r0+r2]
384     mova         m4, [r0+r4]
385     PAVGB        m0, m3
386     PAVGB        m1, m4
387     mova    [r0+r2], m0
388     mova    [r0+r4], m1
389     mova         m1, [r1+r2]
390     mova         m0, [r1+r4]
391     PAVGB        m2, m1
392     PAVGB        m1, m0
393     add          r0, r4
394     add          r1, r4
395     mova         m3, [r0+r2]
396     mova         m4, [r0+r4]
397     PAVGB        m2, m3
398     PAVGB        m1, m4
399     mova    [r0+r2], m2
400     mova    [r0+r4], m1
401     add          r0, r4
402     sub         r3d, 4
403     jne .loop
404     REP_RET
405 %endmacro
406
407 INIT_MMX mmxext
408 AVG_PIXELS8_Y2
409 INIT_MMX 3dnow
410 AVG_PIXELS8_Y2
411
412
413 ; avg_pixels8_xy2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
414 %macro AVG_PIXELS8_XY2 0
415 cglobal avg_pixels8_xy2, 4,5
416     mova         m6, [pb_1]
417     lea          r4, [r2*2]
418     mova         m0, [r1]
419     pavgb        m0, [r1+1]
420 .loop:
421     mova         m2, [r1+r4]
422     mova         m1, [r1+r2]
423     psubusb      m2, m6
424     pavgb        m1, [r1+r2+1]
425     pavgb        m2, [r1+r4+1]
426     add          r1, r4
427     pavgb        m0, m1
428     pavgb        m1, m2
429     pavgb        m0, [r0]
430     pavgb        m1, [r0+r2]
431     mova       [r0], m0
432     mova    [r0+r2], m1
433     mova         m1, [r1+r2]
434     mova         m0, [r1+r4]
435     pavgb        m1, [r1+r2+1]
436     pavgb        m0, [r1+r4+1]
437     add          r0, r4
438     add          r1, r4
439     pavgb        m2, m1
440     pavgb        m1, m0
441     pavgb        m2, [r0]
442     pavgb        m1, [r0+r2]
443     mova       [r0], m2
444     mova    [r0+r2], m1
445     add          r0, r4
446     sub         r3d, 4
447     jne .loop
448     REP_RET
449 %endmacro
450
451 INIT_MMX mmxext
452 AVG_PIXELS8_XY2
453 INIT_MMX 3dnow
454 AVG_PIXELS8_XY2
455
456 INIT_XMM sse2
457 ; void put_pixels16_sse2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
458 cglobal put_pixels16, 4,5,4
459     lea          r4, [r2*3]
460 .loop:
461     movu         m0, [r1]
462     movu         m1, [r1+r2]
463     movu         m2, [r1+r2*2]
464     movu         m3, [r1+r4]
465     lea          r1, [r1+r2*4]
466     mova       [r0], m0
467     mova    [r0+r2], m1
468     mova  [r0+r2*2], m2
469     mova    [r0+r4], m3
470     sub         r3d, 4
471     lea          r0, [r0+r2*4]
472     jnz       .loop
473     REP_RET
474
475 ; void avg_pixels16_sse2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
476 cglobal avg_pixels16, 4,5,4
477     lea          r4, [r2*3]
478 .loop:
479     movu         m0, [r1]
480     movu         m1, [r1+r2]
481     movu         m2, [r1+r2*2]
482     movu         m3, [r1+r4]
483     lea          r1, [r1+r2*4]
484     pavgb        m0, [r0]
485     pavgb        m1, [r0+r2]
486     pavgb        m2, [r0+r2*2]
487     pavgb        m3, [r0+r4]
488     mova       [r0], m0
489     mova    [r0+r2], m1
490     mova  [r0+r2*2], m2
491     mova    [r0+r4], m3
492     sub         r3d, 4
493     lea          r0, [r0+r2*4]
494     jnz       .loop
495     REP_RET