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