]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/hpeldsp.asm
dsputil: x86: Convert mpeg4 qpel and dsputil avg to yasm
[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, int line_size, int h)
29 %macro PUT_PIXELS8_X2 0
30 cglobal put_pixels8_x2, 4,5
31     movsxdifnidn r2, r2d
32     lea          r4, [r2*2]
33 .loop:
34     mova         m0, [r1]
35     mova         m1, [r1+r2]
36     PAVGB        m0, [r1+1]
37     PAVGB        m1, [r1+r2+1]
38     mova       [r0], m0
39     mova    [r0+r2], m1
40     add          r1, r4
41     add          r0, r4
42     mova         m0, [r1]
43     mova         m1, [r1+r2]
44     PAVGB        m0, [r1+1]
45     PAVGB        m1, [r1+r2+1]
46     add          r1, r4
47     mova       [r0], m0
48     mova    [r0+r2], m1
49     add          r0, r4
50     sub         r3d, 4
51     jne .loop
52     REP_RET
53 %endmacro
54
55 INIT_MMX mmxext
56 PUT_PIXELS8_X2
57 INIT_MMX 3dnow
58 PUT_PIXELS8_X2
59
60
61 ; put_pixels16_x2(uint8_t *block, const uint8_t *pixels, int line_size, int h)
62 %macro PUT_PIXELS_16 0
63 cglobal put_pixels16_x2, 4,5
64     movsxdifnidn r2, r2d
65     lea          r4, [r2*2]
66 .loop:
67     mova         m0, [r1]
68     mova         m1, [r1+r2]
69     mova         m2, [r1+8]
70     mova         m3, [r1+r2+8]
71     PAVGB        m0, [r1+1]
72     PAVGB        m1, [r1+r2+1]
73     PAVGB        m2, [r1+9]
74     PAVGB        m3, [r1+r2+9]
75     mova       [r0], m0
76     mova    [r0+r2], m1
77     mova     [r0+8], m2
78     mova  [r0+r2+8], m3
79     add          r1, r4
80     add          r0, r4
81     mova         m0, [r1]
82     mova         m1, [r1+r2]
83     mova         m2, [r1+8]
84     mova         m3, [r1+r2+8]
85     PAVGB        m0, [r1+1]
86     PAVGB        m1, [r1+r2+1]
87     PAVGB        m2, [r1+9]
88     PAVGB        m3, [r1+r2+9]
89     add          r1, r4
90     mova       [r0], m0
91     mova    [r0+r2], m1
92     mova     [r0+8], m2
93     mova  [r0+r2+8], m3
94     add          r0, r4
95     sub         r3d, 4
96     jne .loop
97     REP_RET
98 %endmacro
99
100 INIT_MMX mmxext
101 PUT_PIXELS_16
102 INIT_MMX 3dnow
103 PUT_PIXELS_16
104
105
106 ; put_no_rnd_pixels8_x2(uint8_t *block, const uint8_t *pixels, int line_size, int h)
107 %macro PUT_NO_RND_PIXELS8_X2 0
108 cglobal put_no_rnd_pixels8_x2, 4,5
109     mova         m6, [pb_1]
110     movsxdifnidn r2, r2d
111     lea          r4, [r2*2]
112 .loop:
113     mova         m0, [r1]
114     mova         m2, [r1+r2]
115     mova         m1, [r1+1]
116     mova         m3, [r1+r2+1]
117     add          r1, r4
118     psubusb      m0, m6
119     psubusb      m2, m6
120     PAVGB        m0, m1
121     PAVGB        m2, m3
122     mova       [r0], m0
123     mova    [r0+r2], m2
124     mova         m0, [r1]
125     mova         m1, [r1+1]
126     mova         m2, [r1+r2]
127     mova         m3, [r1+r2+1]
128     add          r0, r4
129     add          r1, r4
130     psubusb      m0, m6
131     psubusb      m2, m6
132     PAVGB        m0, m1
133     PAVGB        m2, m3
134     mova       [r0], m0
135     mova    [r0+r2], m2
136     add          r0, r4
137     sub         r3d, 4
138     jne .loop
139     REP_RET
140 %endmacro
141
142 INIT_MMX mmxext
143 PUT_NO_RND_PIXELS8_X2
144 INIT_MMX 3dnow
145 PUT_NO_RND_PIXELS8_X2
146
147
148 ; put_no_rnd_pixels8_x2_exact(uint8_t *block, const uint8_t *pixels, int line_size, int h)
149 %macro PUT_NO_RND_PIXELS8_X2_EXACT 0
150 cglobal put_no_rnd_pixels8_x2_exact, 4,5
151     movsxdifnidn r2, r2d
152     lea          r4, [r2*3]
153     pcmpeqb      m6, m6
154 .loop:
155     mova         m0, [r1]
156     mova         m2, [r1+r2]
157     mova         m1, [r1+1]
158     mova         m3, [r1+r2+1]
159     pxor         m0, m6
160     pxor         m2, m6
161     pxor         m1, m6
162     pxor         m3, m6
163     PAVGB        m0, m1
164     PAVGB        m2, m3
165     pxor         m0, m6
166     pxor         m2, m6
167     mova       [r0], m0
168     mova    [r0+r2], m2
169     mova         m0, [r1+r2*2]
170     mova         m1, [r1+r2*2+1]
171     mova         m2, [r1+r4]
172     mova         m3, [r1+r4+1]
173     pxor         m0, m6
174     pxor         m1, m6
175     pxor         m2, m6
176     pxor         m3, m6
177     PAVGB        m0, m1
178     PAVGB        m2, m3
179     pxor         m0, m6
180     pxor         m2, m6
181     mova  [r0+r2*2], m0
182     mova    [r0+r4], m2
183     lea          r1, [r1+r2*4]
184     lea          r0, [r0+r2*4]
185     sub         r3d, 4
186     jg .loop
187     REP_RET
188 %endmacro
189
190 INIT_MMX mmxext
191 PUT_NO_RND_PIXELS8_X2_EXACT
192 INIT_MMX 3dnow
193 PUT_NO_RND_PIXELS8_X2_EXACT
194
195
196 ; put_pixels8_y2(uint8_t *block, const uint8_t *pixels, int line_size, int h)
197 %macro PUT_PIXELS8_Y2 0
198 cglobal put_pixels8_y2, 4,5
199     movsxdifnidn r2, r2d
200     lea          r4, [r2*2]
201     mova         m0, [r1]
202     sub          r0, r2
203 .loop:
204     mova         m1, [r1+r2]
205     mova         m2, [r1+r4]
206     add          r1, r4
207     PAVGB        m0, m1
208     PAVGB        m1, m2
209     mova    [r0+r2], m0
210     mova    [r0+r4], m1
211     mova         m1, [r1+r2]
212     mova         m0, [r1+r4]
213     add          r0, r4
214     add          r1, r4
215     PAVGB        m2, m1
216     PAVGB        m1, m0
217     mova    [r0+r2], m2
218     mova    [r0+r4], m1
219     add          r0, r4
220     sub         r3d, 4
221     jne .loop
222     REP_RET
223 %endmacro
224
225 INIT_MMX mmxext
226 PUT_PIXELS8_Y2
227 INIT_MMX 3dnow
228 PUT_PIXELS8_Y2
229
230
231 ; put_no_rnd_pixels8_y2(uint8_t *block, const uint8_t *pixels, int line_size, int h)
232 %macro PUT_NO_RND_PIXELS8_Y2 0
233 cglobal put_no_rnd_pixels8_y2, 4,5
234     mova         m6, [pb_1]
235     movsxdifnidn r2, r2d
236     lea          r4, [r2+r2]
237     mova         m0, [r1]
238     sub          r0, r2
239 .loop:
240     mova         m1, [r1+r2]
241     mova         m2, [r1+r4]
242     add          r1, r4
243     psubusb      m1, m6
244     PAVGB        m0, m1
245     PAVGB        m1, m2
246     mova    [r0+r2], m0
247     mova    [r0+r4], m1
248     mova         m1, [r1+r2]
249     mova         m0, [r1+r4]
250     add          r0, r4
251     add          r1, r4
252     psubusb      m1, m6
253     PAVGB        m2, m1
254     PAVGB        m1, m0
255     mova    [r0+r2], m2
256     mova    [r0+r4], m1
257     add          r0, r4
258     sub         r3d, 4
259     jne .loop
260     REP_RET
261 %endmacro
262
263 INIT_MMX mmxext
264 PUT_NO_RND_PIXELS8_Y2
265 INIT_MMX 3dnow
266 PUT_NO_RND_PIXELS8_Y2
267
268
269 ; put_no_rnd_pixels8_y2_exact(uint8_t *block, const uint8_t *pixels, int line_size, int h)
270 %macro PUT_NO_RND_PIXELS8_Y2_EXACT 0
271 cglobal put_no_rnd_pixels8_y2_exact, 4,5
272     movsxdifnidn r2, r2d
273     lea          r4, [r2*3]
274     mova         m0, [r1]
275     pcmpeqb      m6, m6
276     add          r1, r2
277     pxor         m0, m6
278 .loop:
279     mova         m1, [r1]
280     mova         m2, [r1+r2]
281     pxor         m1, m6
282     pxor         m2, m6
283     PAVGB        m0, m1
284     PAVGB        m1, m2
285     pxor         m0, m6
286     pxor         m1, m6
287     mova       [r0], m0
288     mova    [r0+r2], m1
289     mova         m1, [r1+r2*2]
290     mova         m0, [r1+r4]
291     pxor         m1, m6
292     pxor         m0, m6
293     PAVGB        m2, m1
294     PAVGB        m1, m0
295     pxor         m2, m6
296     pxor         m1, m6
297     mova  [r0+r2*2], m2
298     mova    [r0+r4], m1
299     lea          r1, [r1+r2*4]
300     lea          r0, [r0+r2*4]
301     sub         r3d, 4
302     jg .loop
303     REP_RET
304 %endmacro
305
306 INIT_MMX mmxext
307 PUT_NO_RND_PIXELS8_Y2_EXACT
308 INIT_MMX 3dnow
309 PUT_NO_RND_PIXELS8_Y2_EXACT
310
311
312 ; avg_pixels8(uint8_t *block, const uint8_t *pixels, int line_size, int h)
313 %macro AVG_PIXELS8 0
314 cglobal avg_pixels8, 4,5
315     movsxdifnidn r2, edx
316     lea          r4, [r2+r2]
317 .loop:
318     mova         m0, [r0]
319     mova         m1, [r0+r2]
320     PAVGB        m0, [r1]
321     PAVGB        m1, [r1+r2]
322     mova       [r0], m0
323     mova    [r0+r2], m1
324     add          r1, r4
325     add          r0, r4
326     mova         m0, [r0]
327     mova         m1, [r0+r2]
328     PAVGB        m0, [r1]
329     PAVGB        m1, [r1+r2]
330     add          r1, r4
331     mova       [r0], m0
332     mova    [r0+r2], m1
333     add          r0, r4
334     sub         r3d, 4
335     jne .loop
336     REP_RET
337 %endmacro
338
339 INIT_MMX 3dnow
340 AVG_PIXELS8
341
342
343 ; avg_pixels8_x2(uint8_t *block, const uint8_t *pixels, int line_size, int h)
344 %macro AVG_PIXELS8_X2 0
345 cglobal avg_pixels8_x2, 4,5
346     movsxdifnidn r2, edx
347     lea          r4, [r2*2]
348 .loop:
349     mova         m0, [r1]
350     mova         m2, [r1+r2]
351     PAVGB        m0, [r1+1]
352     PAVGB        m2, [r1+r2+1]
353     PAVGB        m0, [r0]
354     PAVGB        m2, [r0+r2]
355     add          r1, r4
356     mova       [r0], m0
357     mova    [r0+r2], m2
358     mova         m0, [r1]
359     mova         m2, [r1+r2]
360     PAVGB        m0, [r1+1]
361     PAVGB        m2, [r1+r2+1]
362     add          r0, r4
363     add          r1, r4
364     PAVGB        m0, [r0]
365     PAVGB        m2, [r0+r2]
366     mova       [r0], m0
367     mova    [r0+r2], m2
368     add          r0, r4
369     sub         r3d, 4
370     jne .loop
371     REP_RET
372 %endmacro
373
374 INIT_MMX mmxext
375 AVG_PIXELS8_X2
376 INIT_MMX 3dnow
377 AVG_PIXELS8_X2
378
379
380 ; avg_pixels8_y2(uint8_t *block, const uint8_t *pixels, int line_size, int h)
381 %macro AVG_PIXELS8_Y2 0
382 cglobal avg_pixels8_y2, 4,5
383     movsxdifnidn r2, r2d
384     lea          r4, [r2*2]
385     mova         m0, [r1]
386     sub          r0, r2
387 .loop:
388     mova         m1, [r1+r2]
389     mova         m2, [r1+r4]
390     add          r1, r4
391     PAVGB        m0, m1
392     PAVGB        m1, m2
393     mova         m3, [r0+r2]
394     mova         m4, [r0+r4]
395     PAVGB        m0, m3
396     PAVGB        m1, m4
397     mova    [r0+r2], m0
398     mova    [r0+r4], m1
399     mova         m1, [r1+r2]
400     mova         m0, [r1+r4]
401     PAVGB        m2, m1
402     PAVGB        m1, m0
403     add          r0, r4
404     add          r1, r4
405     mova         m3, [r0+r2]
406     mova         m4, [r0+r4]
407     PAVGB        m2, m3
408     PAVGB        m1, m4
409     mova    [r0+r2], m2
410     mova    [r0+r4], m1
411     add          r0, r4
412     sub         r3d, 4
413     jne .loop
414     REP_RET
415 %endmacro
416
417 INIT_MMX mmxext
418 AVG_PIXELS8_Y2
419 INIT_MMX 3dnow
420 AVG_PIXELS8_Y2
421
422
423 ; avg_pixels8_xy2(uint8_t *block, const uint8_t *pixels, int line_size, int h)
424 %macro AVG_PIXELS8_XY2 0
425 cglobal avg_pixels8_xy2, 4,5
426     mova         m6, [pb_1]
427     movsxdifnidn r2, r2d
428     lea          r4, [r2*2]
429     mova         m0, [r1]
430     pavgb        m0, [r1+1]
431 .loop:
432     mova         m2, [r1+r4]
433     mova         m1, [r1+r2]
434     psubusb      m2, m6
435     pavgb        m1, [r1+r2+1]
436     pavgb        m2, [r1+r4+1]
437     add          r1, r4
438     pavgb        m0, m1
439     pavgb        m1, m2
440     pavgb        m0, [r0]
441     pavgb        m1, [r0+r2]
442     mova       [r0], m0
443     mova    [r0+r2], m1
444     mova         m1, [r1+r2]
445     mova         m0, [r1+r4]
446     pavgb        m1, [r1+r2+1]
447     pavgb        m0, [r1+r4+1]
448     add          r0, r4
449     add          r1, r4
450     pavgb        m2, m1
451     pavgb        m1, m0
452     pavgb        m2, [r0]
453     pavgb        m1, [r0+r2]
454     mova       [r0], m2
455     mova    [r0+r2], m2
456     add          r0, r4
457     sub         r3d, 4
458     jne .loop
459     REP_RET
460 %endmacro
461
462 INIT_MMX mmxext
463 AVG_PIXELS8_XY2
464 INIT_MMX 3dnow
465 AVG_PIXELS8_XY2