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