]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/hpeldsp.asm
xsubdec: Convert to the new bitstream reader
[ffmpeg] / libavcodec / x86 / hpeldsp.asm
1 ;******************************************************************************
2 ;* SIMD-optimized halfpel 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 ; void ff_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 ; void ff_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 ; void ff_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 ; void ff_put_pixels8_y2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
146 %macro PUT_PIXELS8_Y2 0
147 cglobal put_pixels8_y2, 4,5
148     lea          r4, [r2*2]
149     mova         m0, [r1]
150     sub          r0, r2
151 .loop:
152     mova         m1, [r1+r2]
153     mova         m2, [r1+r4]
154     add          r1, r4
155     PAVGB        m0, m1
156     PAVGB        m1, m2
157     mova    [r0+r2], m0
158     mova    [r0+r4], m1
159     mova         m1, [r1+r2]
160     mova         m0, [r1+r4]
161     add          r0, r4
162     add          r1, r4
163     PAVGB        m2, m1
164     PAVGB        m1, m0
165     mova    [r0+r2], m2
166     mova    [r0+r4], m1
167     add          r0, r4
168     sub         r3d, 4
169     jne .loop
170     REP_RET
171 %endmacro
172
173 INIT_MMX mmxext
174 PUT_PIXELS8_Y2
175 INIT_MMX 3dnow
176 PUT_PIXELS8_Y2
177
178
179 ; void ff_put_no_rnd_pixels8_y2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
180 %macro PUT_NO_RND_PIXELS8_Y2 0
181 cglobal put_no_rnd_pixels8_y2, 4,5
182     mova         m6, [pb_1]
183     lea          r4, [r2+r2]
184     mova         m0, [r1]
185     sub          r0, r2
186 .loop:
187     mova         m1, [r1+r2]
188     mova         m2, [r1+r4]
189     add          r1, r4
190     psubusb      m1, m6
191     PAVGB        m0, m1
192     PAVGB        m1, m2
193     mova    [r0+r2], m0
194     mova    [r0+r4], m1
195     mova         m1, [r1+r2]
196     mova         m0, [r1+r4]
197     add          r0, r4
198     add          r1, r4
199     psubusb      m1, m6
200     PAVGB        m2, m1
201     PAVGB        m1, m0
202     mova    [r0+r2], m2
203     mova    [r0+r4], m1
204     add          r0, r4
205     sub         r3d, 4
206     jne .loop
207     REP_RET
208 %endmacro
209
210 INIT_MMX mmxext
211 PUT_NO_RND_PIXELS8_Y2
212 INIT_MMX 3dnow
213 PUT_NO_RND_PIXELS8_Y2
214
215
216 ; void ff_avg_pixels8(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
217 %macro AVG_PIXELS8 0
218 cglobal avg_pixels8, 4,5
219     lea          r4, [r2*2]
220 .loop:
221     mova         m0, [r0]
222     mova         m1, [r0+r2]
223     PAVGB        m0, [r1]
224     PAVGB        m1, [r1+r2]
225     mova       [r0], m0
226     mova    [r0+r2], m1
227     add          r1, r4
228     add          r0, r4
229     mova         m0, [r0]
230     mova         m1, [r0+r2]
231     PAVGB        m0, [r1]
232     PAVGB        m1, [r1+r2]
233     add          r1, r4
234     mova       [r0], m0
235     mova    [r0+r2], m1
236     add          r0, r4
237     sub         r3d, 4
238     jne .loop
239     REP_RET
240 %endmacro
241
242 INIT_MMX 3dnow
243 AVG_PIXELS8
244
245
246 ; void ff_avg_pixels8_x2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
247 %macro AVG_PIXELS8_X2 0
248 cglobal avg_pixels8_x2, 4,5
249     lea          r4, [r2*2]
250 .loop:
251     mova         m0, [r1]
252     mova         m2, [r1+r2]
253     PAVGB        m0, [r1+1]
254     PAVGB        m2, [r1+r2+1]
255     PAVGB        m0, [r0]
256     PAVGB        m2, [r0+r2]
257     add          r1, r4
258     mova       [r0], m0
259     mova    [r0+r2], m2
260     mova         m0, [r1]
261     mova         m2, [r1+r2]
262     PAVGB        m0, [r1+1]
263     PAVGB        m2, [r1+r2+1]
264     add          r0, r4
265     add          r1, r4
266     PAVGB        m0, [r0]
267     PAVGB        m2, [r0+r2]
268     mova       [r0], m0
269     mova    [r0+r2], m2
270     add          r0, r4
271     sub         r3d, 4
272     jne .loop
273     REP_RET
274 %endmacro
275
276 INIT_MMX mmxext
277 AVG_PIXELS8_X2
278 INIT_MMX 3dnow
279 AVG_PIXELS8_X2
280
281
282 ; void ff_avg_pixels8_y2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
283 %macro AVG_PIXELS8_Y2 0
284 cglobal avg_pixels8_y2, 4,5
285     lea          r4, [r2*2]
286     mova         m0, [r1]
287     sub          r0, r2
288 .loop:
289     mova         m1, [r1+r2]
290     mova         m2, [r1+r4]
291     add          r1, r4
292     PAVGB        m0, m1
293     PAVGB        m1, m2
294     mova         m3, [r0+r2]
295     mova         m4, [r0+r4]
296     PAVGB        m0, m3
297     PAVGB        m1, m4
298     mova    [r0+r2], m0
299     mova    [r0+r4], m1
300     mova         m1, [r1+r2]
301     mova         m0, [r1+r4]
302     PAVGB        m2, m1
303     PAVGB        m1, m0
304     add          r0, r4
305     add          r1, r4
306     mova         m3, [r0+r2]
307     mova         m4, [r0+r4]
308     PAVGB        m2, m3
309     PAVGB        m1, m4
310     mova    [r0+r2], m2
311     mova    [r0+r4], m1
312     add          r0, r4
313     sub         r3d, 4
314     jne .loop
315     REP_RET
316 %endmacro
317
318 INIT_MMX mmxext
319 AVG_PIXELS8_Y2
320 INIT_MMX 3dnow
321 AVG_PIXELS8_Y2
322
323
324 ; void ff_avg_pixels8_xy2(uint8_t *block, const uint8_t *pixels, ptrdiff_t line_size, int h)
325 %macro AVG_PIXELS8_XY2 0
326 cglobal avg_pixels8_xy2, 4,5
327     mova         m6, [pb_1]
328     lea          r4, [r2*2]
329     mova         m0, [r1]
330     PAVGB        m0, [r1+1]
331 .loop:
332     mova         m2, [r1+r4]
333     mova         m1, [r1+r2]
334     psubusb      m2, m6
335     PAVGB        m1, [r1+r2+1]
336     PAVGB        m2, [r1+r4+1]
337     add          r1, r4
338     PAVGB        m0, m1
339     PAVGB        m1, m2
340     PAVGB        m0, [r0]
341     PAVGB        m1, [r0+r2]
342     mova       [r0], m0
343     mova    [r0+r2], m1
344     mova         m1, [r1+r2]
345     mova         m0, [r1+r4]
346     PAVGB        m1, [r1+r2+1]
347     PAVGB        m0, [r1+r4+1]
348     add          r0, r4
349     add          r1, r4
350     PAVGB        m2, m1
351     PAVGB        m1, m0
352     PAVGB        m2, [r0]
353     PAVGB        m1, [r0+r2]
354     mova       [r0], m2
355     mova    [r0+r2], m1
356     add          r0, r4
357     sub         r3d, 4
358     jne .loop
359     REP_RET
360 %endmacro
361
362 INIT_MMX mmxext
363 AVG_PIXELS8_XY2
364 INIT_MMX 3dnow
365 AVG_PIXELS8_XY2