FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/x86/qpeldsp_init.c
Date: 2026-04-24 19:58:39
Exec Total Coverage
Lines: 20 20 100.0%
Functions: 91 91 100.0%
Branches: 4 4 100.0%

Line Branch Exec Source
1 /*
2 * quarterpel DSP functions
3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 #include <stddef.h>
24 #include <stdint.h>
25
26 #include "config.h"
27 #include "libavutil/attributes.h"
28 #include "libavutil/cpu.h"
29 #include "libavutil/x86/cpu.h"
30 #include "libavcodec/qpeldsp.h"
31 #include "fpel.h"
32 #include "qpel.h"
33
34 void ff_put_pixels8x9_l2_mmxext(uint8_t *dst,
35 const uint8_t *src1, const uint8_t *src2,
36 ptrdiff_t dstStride, ptrdiff_t src1Stride);
37 void ff_put_pixels16x17_l2_mmxext(uint8_t *dst,
38 const uint8_t *src1, const uint8_t *src2,
39 ptrdiff_t dstStride, ptrdiff_t src1Stride);
40 void ff_put_no_rnd_pixels8x8_l2_mmxext(uint8_t *dst,
41 const uint8_t *src1, const uint8_t *src2,
42 ptrdiff_t dstStride, ptrdiff_t src1Stride);
43 void ff_put_no_rnd_pixels8x9_l2_mmxext(uint8_t *dst,
44 const uint8_t *src1, const uint8_t *src2,
45 ptrdiff_t dstStride, ptrdiff_t src1Stride);
46 void ff_put_no_rnd_pixels16x16_l2_mmxext(uint8_t *dst,
47 const uint8_t *src1, const uint8_t *src2,
48 ptrdiff_t dstStride, ptrdiff_t src1Stride);
49 void ff_put_no_rnd_pixels16x17_l2_mmxext(uint8_t *dst,
50 const uint8_t *src1, const uint8_t *src2,
51 ptrdiff_t dstStride, ptrdiff_t src1Stride);
52 void ff_put_mpeg4_qpel16_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
53 ptrdiff_t dstStride, ptrdiff_t srcStride, int h);
54 void ff_avg_mpeg4_qpel16_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
55 ptrdiff_t dstStride, ptrdiff_t srcStride, int h);
56 void ff_put_no_rnd_mpeg4_qpel16_h_lowpass_mmxext(uint8_t *dst,
57 const uint8_t *src,
58 ptrdiff_t dstStride, ptrdiff_t srcStride,
59 int h);
60 void ff_put_mpeg4_qpel8_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
61 ptrdiff_t dstStride, ptrdiff_t srcStride, int h);
62 void ff_avg_mpeg4_qpel8_h_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
63 ptrdiff_t dstStride, ptrdiff_t srcStride, int h);
64 void ff_put_no_rnd_mpeg4_qpel8_h_lowpass_mmxext(uint8_t *dst,
65 const uint8_t *src,
66 ptrdiff_t dstStride, ptrdiff_t srcStride,
67 int h);
68 void ff_put_mpeg4_qpel16_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
69 ptrdiff_t dstStride, ptrdiff_t srcStride);
70 void ff_avg_mpeg4_qpel16_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
71 ptrdiff_t dstStride, ptrdiff_t srcStride);
72 void ff_put_no_rnd_mpeg4_qpel16_v_lowpass_mmxext(uint8_t *dst,
73 const uint8_t *src,
74 ptrdiff_t dstStride, ptrdiff_t srcStride);
75 void ff_put_mpeg4_qpel8_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
76 ptrdiff_t dstStride, ptrdiff_t srcStride);
77 void ff_avg_mpeg4_qpel8_v_lowpass_mmxext(uint8_t *dst, const uint8_t *src,
78 ptrdiff_t dstStride, ptrdiff_t srcStride);
79 void ff_put_no_rnd_mpeg4_qpel8_v_lowpass_mmxext(uint8_t *dst,
80 const uint8_t *src,
81 ptrdiff_t dstStride, ptrdiff_t srcStride);
82
83 #define QPEL_OP(OPNAME, RND, MMX) \
84 static void OPNAME ## qpel8_mc10_ ## MMX(uint8_t *dst, \
85 const uint8_t *src, \
86 ptrdiff_t stride) \
87 { \
88 uint64_t temp[8]; \
89 uint8_t *const half = (uint8_t *) temp; \
90 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(half, src, 8, \
91 stride, 8); \
92 ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, src, half, \
93 stride, stride); \
94 } \
95 \
96 static void OPNAME ## qpel8_mc20_ ## MMX(uint8_t *dst, \
97 const uint8_t *src, \
98 ptrdiff_t stride) \
99 { \
100 ff_ ## OPNAME ## mpeg4_qpel8_h_lowpass_ ## MMX(dst, src, stride, \
101 stride, 8); \
102 } \
103 \
104 static void OPNAME ## qpel8_mc30_ ## MMX(uint8_t *dst, \
105 const uint8_t *src, \
106 ptrdiff_t stride) \
107 { \
108 uint64_t temp[8]; \
109 uint8_t *const half = (uint8_t *) temp; \
110 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(half, src, 8, \
111 stride, 8); \
112 ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, src + 1, half, \
113 stride, stride); \
114 } \
115 \
116 static void OPNAME ## qpel8_mc01_ ## MMX(uint8_t *dst, \
117 const uint8_t *src, \
118 ptrdiff_t stride) \
119 { \
120 uint64_t temp[8]; \
121 uint8_t *const half = (uint8_t *) temp; \
122 ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(half, src, \
123 8, stride); \
124 ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, src, half, \
125 stride, stride); \
126 } \
127 \
128 static void OPNAME ## qpel8_mc02_ ## MMX(uint8_t *dst, \
129 const uint8_t *src, \
130 ptrdiff_t stride) \
131 { \
132 ff_ ## OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, src, \
133 stride, stride); \
134 } \
135 \
136 static void OPNAME ## qpel8_mc03_ ## MMX(uint8_t *dst, \
137 const uint8_t *src, \
138 ptrdiff_t stride) \
139 { \
140 uint64_t temp[8]; \
141 uint8_t *const half = (uint8_t *) temp; \
142 ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(half, src, \
143 8, stride); \
144 ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, src + stride, half, \
145 stride, stride); \
146 } \
147 \
148 static void OPNAME ## qpel8_mc11_ ## MMX(uint8_t *dst, \
149 const uint8_t *src, \
150 ptrdiff_t stride) \
151 { \
152 uint64_t half[8 + 9]; \
153 uint8_t *const halfH = (uint8_t *) half + 64; \
154 uint8_t *const halfHV = (uint8_t *) half; \
155 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
156 stride, 9); \
157 ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src, halfH, 8, \
158 stride); \
159 ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
160 ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH, halfHV, \
161 stride, 8); \
162 } \
163 \
164 static void OPNAME ## qpel8_mc31_ ## MMX(uint8_t *dst, \
165 const uint8_t *src, \
166 ptrdiff_t stride) \
167 { \
168 uint64_t half[8 + 9]; \
169 uint8_t *const halfH = (uint8_t *) half + 64; \
170 uint8_t *const halfHV = (uint8_t *) half; \
171 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
172 stride, 9); \
173 ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src + 1, halfH, 8, \
174 stride); \
175 ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
176 ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH, halfHV, \
177 stride, 8); \
178 } \
179 \
180 static void OPNAME ## qpel8_mc13_ ## MMX(uint8_t *dst, \
181 const uint8_t *src, \
182 ptrdiff_t stride) \
183 { \
184 uint64_t half[8 + 9]; \
185 uint8_t *const halfH = (uint8_t *) half + 64; \
186 uint8_t *const halfHV = (uint8_t *) half; \
187 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
188 stride, 9); \
189 ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src, halfH, 8, \
190 stride); \
191 ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
192 ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH + 8, halfHV, \
193 stride, 8); \
194 } \
195 \
196 static void OPNAME ## qpel8_mc33_ ## MMX(uint8_t *dst, \
197 const uint8_t *src, \
198 ptrdiff_t stride) \
199 { \
200 uint64_t half[8 + 9]; \
201 uint8_t *const halfH = (uint8_t *) half + 64; \
202 uint8_t *const halfHV = (uint8_t *) half; \
203 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
204 stride, 9); \
205 ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src + 1, halfH, 8, \
206 stride); \
207 ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
208 ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH + 8, halfHV, \
209 stride, 8); \
210 } \
211 \
212 static void OPNAME ## qpel8_mc21_ ## MMX(uint8_t *dst, \
213 const uint8_t *src, \
214 ptrdiff_t stride) \
215 { \
216 uint64_t half[8 + 9]; \
217 uint8_t *const halfH = (uint8_t *) half + 64; \
218 uint8_t *const halfHV = (uint8_t *) half; \
219 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
220 stride, 9); \
221 ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
222 ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH, halfHV, \
223 stride, 8); \
224 } \
225 \
226 static void OPNAME ## qpel8_mc23_ ## MMX(uint8_t *dst, \
227 const uint8_t *src, \
228 ptrdiff_t stride) \
229 { \
230 uint64_t half[8 + 9]; \
231 uint8_t *const halfH = (uint8_t *) half + 64; \
232 uint8_t *const halfHV = (uint8_t *) half; \
233 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
234 stride, 9); \
235 ff_put ## RND ## mpeg4_qpel8_v_lowpass_ ## MMX(halfHV, halfH, 8, 8);\
236 ff_ ## OPNAME ## pixels8x8_l2_ ## MMX(dst, halfH + 8, halfHV, \
237 stride, 8); \
238 } \
239 \
240 static void OPNAME ## qpel8_mc12_ ## MMX(uint8_t *dst, \
241 const uint8_t *src, \
242 ptrdiff_t stride) \
243 { \
244 uint64_t half[8 + 9]; \
245 uint8_t *const halfH = (uint8_t *) half; \
246 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
247 stride, 9); \
248 ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src, halfH, \
249 8, stride); \
250 ff_ ## OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, halfH, \
251 stride, 8); \
252 } \
253 \
254 static void OPNAME ## qpel8_mc32_ ## MMX(uint8_t *dst, \
255 const uint8_t *src, \
256 ptrdiff_t stride) \
257 { \
258 uint64_t half[8 + 9]; \
259 uint8_t *const halfH = (uint8_t *) half; \
260 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
261 stride, 9); \
262 ff_put ## RND ## pixels8x9_l2_ ## MMX(halfH, src + 1, halfH, 8, \
263 stride); \
264 ff_ ## OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, halfH, \
265 stride, 8); \
266 } \
267 \
268 static void OPNAME ## qpel8_mc22_ ## MMX(uint8_t *dst, \
269 const uint8_t *src, \
270 ptrdiff_t stride) \
271 { \
272 uint64_t half[9]; \
273 uint8_t *const halfH = (uint8_t *) half; \
274 ff_put ## RND ## mpeg4_qpel8_h_lowpass_ ## MMX(halfH, src, 8, \
275 stride, 9); \
276 ff_ ## OPNAME ## mpeg4_qpel8_v_lowpass_ ## MMX(dst, halfH, \
277 stride, 8); \
278 } \
279 \
280 static void OPNAME ## qpel16_mc10_ ## MMX(uint8_t *dst, \
281 const uint8_t *src, \
282 ptrdiff_t stride) \
283 { \
284 uint64_t temp[32]; \
285 uint8_t *const half = (uint8_t *) temp; \
286 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(half, src, 16, \
287 stride, 16); \
288 ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, src, half, \
289 stride, stride); \
290 } \
291 \
292 static void OPNAME ## qpel16_mc20_ ## MMX(uint8_t *dst, \
293 const uint8_t *src, \
294 ptrdiff_t stride) \
295 { \
296 ff_ ## OPNAME ## mpeg4_qpel16_h_lowpass_ ## MMX(dst, src, \
297 stride, stride, 16);\
298 } \
299 \
300 static void OPNAME ## qpel16_mc30_ ## MMX(uint8_t *dst, \
301 const uint8_t *src, \
302 ptrdiff_t stride) \
303 { \
304 uint64_t temp[32]; \
305 uint8_t *const half = (uint8_t*) temp; \
306 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(half, src, 16, \
307 stride, 16); \
308 ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, src + 1, half, \
309 stride, stride); \
310 } \
311 \
312 static void OPNAME ## qpel16_mc01_ ## MMX(uint8_t *dst, \
313 const uint8_t *src, \
314 ptrdiff_t stride) \
315 { \
316 uint64_t temp[32]; \
317 uint8_t *const half = (uint8_t *) temp; \
318 ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(half, src, 16, \
319 stride); \
320 ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, src, half, \
321 stride, stride); \
322 } \
323 \
324 static void OPNAME ## qpel16_mc02_ ## MMX(uint8_t *dst, \
325 const uint8_t *src, \
326 ptrdiff_t stride) \
327 { \
328 ff_ ## OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, src, \
329 stride, stride); \
330 } \
331 \
332 static void OPNAME ## qpel16_mc03_ ## MMX(uint8_t *dst, \
333 const uint8_t *src, \
334 ptrdiff_t stride) \
335 { \
336 uint64_t temp[32]; \
337 uint8_t *const half = (uint8_t *) temp; \
338 ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(half, src, 16, \
339 stride); \
340 ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, src+stride, half, \
341 stride, stride); \
342 } \
343 \
344 static void OPNAME ## qpel16_mc11_ ## MMX(uint8_t *dst, \
345 const uint8_t *src, \
346 ptrdiff_t stride) \
347 { \
348 uint64_t half[16 * 2 + 17 * 2]; \
349 uint8_t *const halfH = (uint8_t *) half + 256; \
350 uint8_t *const halfHV = (uint8_t *) half; \
351 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
352 stride, 17); \
353 ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src, halfH, 16, \
354 stride); \
355 ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
356 16, 16); \
357 ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH, halfHV, \
358 stride, 16); \
359 } \
360 \
361 static void OPNAME ## qpel16_mc31_ ## MMX(uint8_t *dst, \
362 const uint8_t *src, \
363 ptrdiff_t stride) \
364 { \
365 uint64_t half[16 * 2 + 17 * 2]; \
366 uint8_t *const halfH = (uint8_t *) half + 256; \
367 uint8_t *const halfHV = (uint8_t *) half; \
368 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
369 stride, 17); \
370 ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src + 1, halfH, 16, \
371 stride); \
372 ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
373 16, 16); \
374 ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH, halfHV, \
375 stride, 16); \
376 } \
377 \
378 static void OPNAME ## qpel16_mc13_ ## MMX(uint8_t *dst, \
379 const uint8_t *src, \
380 ptrdiff_t stride) \
381 { \
382 uint64_t half[16 * 2 + 17 * 2]; \
383 uint8_t *const halfH = (uint8_t *) half + 256; \
384 uint8_t *const halfHV = (uint8_t *) half; \
385 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
386 stride, 17); \
387 ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src, halfH, 16, \
388 stride); \
389 ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
390 16, 16); \
391 ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH + 16, halfHV, \
392 stride, 16); \
393 } \
394 \
395 static void OPNAME ## qpel16_mc33_ ## MMX(uint8_t *dst, \
396 const uint8_t *src, \
397 ptrdiff_t stride) \
398 { \
399 uint64_t half[16 * 2 + 17 * 2]; \
400 uint8_t *const halfH = (uint8_t *) half + 256; \
401 uint8_t *const halfHV = (uint8_t *) half; \
402 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
403 stride, 17); \
404 ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src + 1, halfH, 16, \
405 stride); \
406 ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
407 16, 16); \
408 ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH + 16, halfHV, \
409 stride, 16); \
410 } \
411 \
412 static void OPNAME ## qpel16_mc21_ ## MMX(uint8_t *dst, \
413 const uint8_t *src, \
414 ptrdiff_t stride) \
415 { \
416 uint64_t half[16 * 2 + 17 * 2]; \
417 uint8_t *const halfH = (uint8_t *) half + 256; \
418 uint8_t *const halfHV = (uint8_t *) half; \
419 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
420 stride, 17); \
421 ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
422 16, 16); \
423 ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH, halfHV, \
424 stride, 16); \
425 } \
426 \
427 static void OPNAME ## qpel16_mc23_ ## MMX(uint8_t *dst, \
428 const uint8_t *src, \
429 ptrdiff_t stride) \
430 { \
431 uint64_t half[16 * 2 + 17 * 2]; \
432 uint8_t *const halfH = (uint8_t *) half + 256; \
433 uint8_t *const halfHV = (uint8_t *) half; \
434 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
435 stride, 17); \
436 ff_put ## RND ## mpeg4_qpel16_v_lowpass_ ## MMX(halfHV, halfH, \
437 16, 16); \
438 ff_ ## OPNAME ## pixels16x16_l2_ ## MMX(dst, halfH + 16, halfHV, \
439 stride, 16); \
440 } \
441 \
442 static void OPNAME ## qpel16_mc12_ ## MMX(uint8_t *dst, \
443 const uint8_t *src, \
444 ptrdiff_t stride) \
445 { \
446 uint64_t half[17 * 2]; \
447 uint8_t *const halfH = (uint8_t *) half; \
448 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
449 stride, 17); \
450 ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src, halfH, 16, \
451 stride); \
452 ff_ ## OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, halfH, \
453 stride, 16); \
454 } \
455 \
456 static void OPNAME ## qpel16_mc32_ ## MMX(uint8_t *dst, \
457 const uint8_t *src, \
458 ptrdiff_t stride) \
459 { \
460 uint64_t half[17 * 2]; \
461 uint8_t *const halfH = (uint8_t *) half; \
462 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
463 stride, 17); \
464 ff_put ## RND ## pixels16x17_l2_ ## MMX(halfH, src + 1, halfH, 16, \
465 stride); \
466 ff_ ## OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, halfH, \
467 stride, 16); \
468 } \
469 \
470 static void OPNAME ## qpel16_mc22_ ## MMX(uint8_t *dst, \
471 const uint8_t *src, \
472 ptrdiff_t stride) \
473 { \
474 uint64_t half[17 * 2]; \
475 uint8_t *const halfH = (uint8_t *) half; \
476 ff_put ## RND ## mpeg4_qpel16_h_lowpass_ ## MMX(halfH, src, 16, \
477 stride, 17); \
478 ff_ ## OPNAME ## mpeg4_qpel16_v_lowpass_ ## MMX(dst, halfH, \
479 stride, 16); \
480 }
481
482 60 QPEL_OP(put_, _, mmxext)
483 60 QPEL_OP(avg_, _, mmxext)
484 60 QPEL_OP(put_no_rnd_, _no_rnd_, mmxext)
485
486 #define SET_QPEL_FUNCS(PFX, IDX, SIZE, CPU, PREFIX) \
487 do { \
488 c->PFX ## _pixels_tab[IDX][ 1] = PREFIX ## PFX ## SIZE ## _mc10_ ## CPU; \
489 c->PFX ## _pixels_tab[IDX][ 2] = PREFIX ## PFX ## SIZE ## _mc20_ ## CPU; \
490 c->PFX ## _pixels_tab[IDX][ 3] = PREFIX ## PFX ## SIZE ## _mc30_ ## CPU; \
491 c->PFX ## _pixels_tab[IDX][ 4] = PREFIX ## PFX ## SIZE ## _mc01_ ## CPU; \
492 c->PFX ## _pixels_tab[IDX][ 5] = PREFIX ## PFX ## SIZE ## _mc11_ ## CPU; \
493 c->PFX ## _pixels_tab[IDX][ 6] = PREFIX ## PFX ## SIZE ## _mc21_ ## CPU; \
494 c->PFX ## _pixels_tab[IDX][ 7] = PREFIX ## PFX ## SIZE ## _mc31_ ## CPU; \
495 c->PFX ## _pixels_tab[IDX][ 8] = PREFIX ## PFX ## SIZE ## _mc02_ ## CPU; \
496 c->PFX ## _pixels_tab[IDX][ 9] = PREFIX ## PFX ## SIZE ## _mc12_ ## CPU; \
497 c->PFX ## _pixels_tab[IDX][10] = PREFIX ## PFX ## SIZE ## _mc22_ ## CPU; \
498 c->PFX ## _pixels_tab[IDX][11] = PREFIX ## PFX ## SIZE ## _mc32_ ## CPU; \
499 c->PFX ## _pixels_tab[IDX][12] = PREFIX ## PFX ## SIZE ## _mc03_ ## CPU; \
500 c->PFX ## _pixels_tab[IDX][13] = PREFIX ## PFX ## SIZE ## _mc13_ ## CPU; \
501 c->PFX ## _pixels_tab[IDX][14] = PREFIX ## PFX ## SIZE ## _mc23_ ## CPU; \
502 c->PFX ## _pixels_tab[IDX][15] = PREFIX ## PFX ## SIZE ## _mc33_ ## CPU; \
503 } while (0)
504
505 298 av_cold void ff_qpeldsp_init_x86(QpelDSPContext *c)
506 {
507 298 int cpu_flags = av_get_cpu_flags();
508
509
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 250 times.
298 if (X86_MMXEXT(cpu_flags)) {
510 #if HAVE_MMXEXT_EXTERNAL
511 48 SET_QPEL_FUNCS(avg_qpel, 0, 16, mmxext, );
512 48 c->avg_qpel_pixels_tab[1][0] = ff_avg_pixels8x8_mmxext;
513 48 SET_QPEL_FUNCS(avg_qpel, 1, 8, mmxext, );
514
515 48 SET_QPEL_FUNCS(put_qpel, 0, 16, mmxext, );
516 48 SET_QPEL_FUNCS(put_qpel, 1, 8, mmxext, );
517 48 SET_QPEL_FUNCS(put_no_rnd_qpel, 0, 16, mmxext, );
518 48 SET_QPEL_FUNCS(put_no_rnd_qpel, 1, 8, mmxext, );
519 #endif /* HAVE_MMXEXT_EXTERNAL */
520 }
521 #if HAVE_SSE2_EXTERNAL
522
2/2
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 252 times.
298 if (EXTERNAL_SSE2(cpu_flags)) {
523 46 c->put_no_rnd_qpel_pixels_tab[0][0] =
524 46 c->put_qpel_pixels_tab[0][0] = ff_put_pixels16x16_sse2;
525 46 c->put_no_rnd_qpel_pixels_tab[1][0] =
526 46 c->put_qpel_pixels_tab[1][0] = ff_put_pixels8x8_sse2;
527 46 c->avg_qpel_pixels_tab[0][0] = ff_avg_pixels16x16_sse2;
528 }
529 #endif
530 298 }
531