Horizontal and vertical prediction functions needed for new lossless mode
[libav.git] / libavcodec / dct-test.c
CommitLineData
04d7f601
DB
1/*
2 * (c) 2001 Fabrice Bellard
3ac35bdb 3 * 2007 Marc Hoffman <marc.hoffman@analog.com>
04d7f601 4 *
b78e7197
DB
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
04d7f601
DB
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
b78e7197 10 * version 2.1 of the License, or (at your option) any later version.
04d7f601 11 *
b78e7197 12 * FFmpeg is distributed in the hope that it will be useful,
04d7f601
DB
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
b78e7197 18 * License along with FFmpeg; if not, write to the Free Software
04d7f601
DB
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
983e3246
MN
22/**
23 * @file dct-test.c
115329f1 24 * DCT test. (c) 2001 Fabrice Bellard.
983e3246
MN
25 * Started from sample code by Juan J. Sierralta P.
26 */
27
de6d9b64
FB
28#include <stdlib.h>
29#include <stdio.h>
30#include <string.h>
31#include <sys/time.h>
32#include <unistd.h>
12807c8d 33#include <math.h>
de6d9b64 34
ae32e509 35#include "libavutil/common.h"
de6d9b64 36
86748dbc 37#include "simple_idct.h"
10ac3618 38#include "aandcttab.h"
65e4c8c9 39#include "faandct.h"
6f08c541 40#include "faanidct.h"
54a0b6e5 41#include "i386/idct_xvid.h"
9e1586fc 42
434df899 43#undef printf
cc61f96f 44#undef random
434df899
MN
45
46void *fast_memcpy(void *a, const void *b, size_t c){return memcpy(a,b,c);};
47
9e1586fc 48/* reference fdct/idct */
9686df2b
DB
49void fdct(DCTELEM *block);
50void idct(DCTELEM *block);
51void init_fdct();
de6d9b64 52
9686df2b
DB
53void ff_mmx_idct(DCTELEM *data);
54void ff_mmxext_idct(DCTELEM *data);
9e1586fc 55
9686df2b 56void odivx_idct_c(short *block);
86748dbc 57
3ac35bdb 58// BFIN
9686df2b
DB
59void ff_bfin_idct(DCTELEM *block);
60void ff_bfin_fdct(DCTELEM *block);
3ac35bdb
MH
61
62// ALTIVEC
9686df2b
DB
63void fdct_altivec(DCTELEM *block);
64//void idct_altivec(DCTELEM *block);?? no routine
3ac35bdb
MH
65
66
67struct algo {
f5b67781 68 const char *name;
3ac35bdb
MH
69 enum { FDCT, IDCT } is_idct;
70 void (* func) (DCTELEM *block);
71 void (* ref) (DCTELEM *block);
dce292bb 72 enum formattag { NO_PERM,MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, SSE2_PERM } format;
3794b928 73 int mm_support;
3ac35bdb
MH
74};
75
76#ifndef FAAN_POSTSCALE
77#define FAAN_SCALE SCALE_PERM
78#else
79#define FAAN_SCALE NO_PERM
80#endif
81
aadd27cd
MN
82static int cpu_flags;
83
3ac35bdb 84struct algo algos[] = {
1a7ee380
AS
85 {"REF-DBL", 0, fdct, fdct, NO_PERM},
86 {"FAAN", 0, ff_faandct, fdct, FAAN_SCALE},
87 {"FAANI", 1, ff_faanidct, idct, NO_PERM},
88 {"IJG-AAN-INT", 0, fdct_ifast, fdct, SCALE_PERM},
89 {"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, fdct, NO_PERM},
90 {"REF-DBL", 1, idct, idct, NO_PERM},
91 {"INT", 1, j_rev_dct, idct, MMX_PERM},
92 {"SIMPLE-C", 1, ff_simple_idct, idct, NO_PERM},
3ac35bdb 93
ee3035f3 94#ifdef HAVE_MMX
82d1605f 95 {"MMX", 0, ff_fdct_mmx, fdct, NO_PERM, FF_MM_MMX},
94254fc0 96#ifdef HAVE_MMX2
82d1605f 97 {"MMX2", 0, ff_fdct_mmx2, fdct, NO_PERM, FF_MM_MMXEXT},
83534418 98 {"SSE2", 0, ff_fdct_sse2, fdct, NO_PERM, FF_MM_SSE2},
94254fc0 99#endif
3ac35bdb 100
b9702de5 101#ifdef CONFIG_GPL
82d1605f
DM
102 {"LIBMPEG2-MMX", 1, ff_mmx_idct, idct, MMX_PERM, FF_MM_MMX},
103 {"LIBMPEG2-MMXEXT", 1, ff_mmxext_idct, idct, MMX_PERM, FF_MM_MMXEXT},
b9702de5 104#endif
82d1605f
DM
105 {"SIMPLE-MMX", 1, ff_simple_idct_mmx, idct, MMX_SIMPLE_PERM, FF_MM_MMX},
106 {"XVID-MMX", 1, ff_idct_xvid_mmx, idct, NO_PERM, FF_MM_MMX},
107 {"XVID-MMX2", 1, ff_idct_xvid_mmx2, idct, NO_PERM, FF_MM_MMXEXT},
108 {"XVID-SSE2", 1, ff_idct_xvid_sse2, idct, SSE2_PERM, FF_MM_SSE2},
3ac35bdb
MH
109#endif
110
111#ifdef HAVE_ALTIVEC
82d1605f 112 {"altivecfdct", 0, fdct_altivec, fdct, NO_PERM, FF_MM_ALTIVEC},
3ac35bdb
MH
113#endif
114
115#ifdef ARCH_BFIN
1a7ee380
AS
116 {"BFINfdct", 0, ff_bfin_fdct, fdct, NO_PERM},
117 {"BFINidct", 1, ff_bfin_idct, idct, NO_PERM},
3ac35bdb
MH
118#endif
119
120 { 0 }
121};
122
de6d9b64 123#define AANSCALE_BITS 12
de6d9b64 124
486497e0 125uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];
86748dbc 126
0c1a9eda 127int64_t gettime(void)
de6d9b64
FB
128{
129 struct timeval tv;
130 gettimeofday(&tv,NULL);
0c1a9eda 131 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
de6d9b64
FB
132}
133
134#define NB_ITS 20000
135#define NB_ITS_SPEED 50000
136
9e1586fc
FB
137static short idct_mmx_perm[64];
138
86748dbc 139static short idct_simple_mmx_perm[64]={
bb270c08
DB
140 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
141 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
142 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
143 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
144 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
145 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
146 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
147 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F,
86748dbc
MN
148};
149
ad246860
AS
150static const uint8_t idct_sse2_row_perm[8] = {0, 4, 1, 5, 2, 6, 3, 7};
151
9e1586fc
FB
152void idct_mmx_init(void)
153{
154 int i;
155
156 /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */
157 for (i = 0; i < 64; i++) {
bb270c08
DB
158 idct_mmx_perm[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2);
159// idct_simple_mmx_perm[i] = simple_block_permute_op(i);
9e1586fc
FB
160 }
161}
162
55727a83 163static DCTELEM block[64] __attribute__ ((aligned (16)));
9e1586fc 164static DCTELEM block1[64] __attribute__ ((aligned (8)));
86748dbc 165static DCTELEM block_org[64] __attribute__ ((aligned (8)));
9e1586fc 166
aadd27cd
MN
167static inline void mmx_emms(void)
168{
169#ifdef HAVE_MMX
82d1605f 170 if (cpu_flags & FF_MM_MMX)
be449fca 171 __asm__ volatile ("emms\n\t");
aadd27cd
MN
172#endif
173}
174
9e1586fc
FB
175void dct_error(const char *name, int is_idct,
176 void (*fdct_func)(DCTELEM *block),
3ac35bdb 177 void (*fdct_ref)(DCTELEM *block), int form, int test)
de6d9b64
FB
178{
179 int it, i, scale;
de6d9b64 180 int err_inf, v;
0c1a9eda
ZK
181 int64_t err2, ti, ti1, it1;
182 int64_t sysErr[64], sysErrMax=0;
86748dbc 183 int maxout=0;
86748dbc 184 int blockSumErrMax=0, blockSumErr;
de6d9b64
FB
185
186 srandom(0);
187
188 err_inf = 0;
189 err2 = 0;
86748dbc 190 for(i=0; i<64; i++) sysErr[i]=0;
de6d9b64 191 for(it=0;it<NB_ITS;it++) {
86748dbc
MN
192 for(i=0;i<64;i++)
193 block1[i] = 0;
194 switch(test){
115329f1 195 case 0:
86748dbc
MN
196 for(i=0;i<64;i++)
197 block1[i] = (random() % 512) -256;
ad324c93 198 if (is_idct){
86748dbc 199 fdct(block1);
ad324c93
MN
200
201 for(i=0;i<64;i++)
202 block1[i]>>=3;
203 }
86748dbc
MN
204 break;
205 case 1:{
206 int num= (random()%10)+1;
207 for(i=0;i<num;i++)
208 block1[random()%64] = (random() % 512) -256;
209 }break;
210 case 2:
211 block1[0]= (random()%4096)-2048;
212 block1[63]= (block1[0]&1)^1;
213 break;
214 }
9e1586fc 215
86748dbc
MN
216#if 0 // simulate mismatch control
217{ int sum=0;
218 for(i=0;i<64;i++)
219 sum+=block1[i];
220
115329f1 221 if((sum&1)==0) block1[63]^=1;
86748dbc
MN
222}
223#endif
224
225 for(i=0; i<64; i++)
226 block_org[i]= block1[i];
9e1586fc 227
3ac35bdb 228 if (form == MMX_PERM) {
86748dbc 229 for(i=0;i<64;i++)
9e1586fc 230 block[idct_mmx_perm[i]] = block1[i];
3ac35bdb 231 } else if (form == MMX_SIMPLE_PERM) {
86748dbc
MN
232 for(i=0;i<64;i++)
233 block[idct_simple_mmx_perm[i]] = block1[i];
234
ad246860
AS
235 } else if (form == SSE2_PERM) {
236 for(i=0; i<64; i++)
237 block[(i&0x38) | idct_sse2_row_perm[i&7]] = block1[i];
bb270c08 238 } else {
86748dbc
MN
239 for(i=0; i<64; i++)
240 block[i]= block1[i];
9e1586fc 241 }
86748dbc
MN
242#if 0 // simulate mismatch control for tested IDCT but not the ref
243{ int sum=0;
244 for(i=0;i<64;i++)
245 sum+=block[i];
246
115329f1 247 if((sum&1)==0) block[63]^=1;
86748dbc
MN
248}
249#endif
9e1586fc 250
de6d9b64 251 fdct_func(block);
aadd27cd 252 mmx_emms();
9e1586fc 253
3ac35bdb 254 if (form == SCALE_PERM) {
de6d9b64 255 for(i=0; i<64; i++) {
10ac3618 256 scale = 8*(1 << (AANSCALE_BITS + 11)) / ff_aanscales[i];
86748dbc
MN
257 block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS;
258 }
259 }
260
9e1586fc 261 fdct_ref(block1);
de6d9b64 262
86748dbc 263 blockSumErr=0;
de6d9b64
FB
264 for(i=0;i<64;i++) {
265 v = abs(block[i] - block1[i]);
266 if (v > err_inf)
267 err_inf = v;
268 err2 += v * v;
bb270c08
DB
269 sysErr[i] += block[i] - block1[i];
270 blockSumErr += v;
271 if( abs(block[i])>maxout) maxout=abs(block[i]);
de6d9b64 272 }
86748dbc
MN
273 if(blockSumErrMax < blockSumErr) blockSumErrMax= blockSumErr;
274#if 0 // print different matrix pairs
275 if(blockSumErr){
276 printf("\n");
277 for(i=0; i<64; i++){
278 if((i&7)==0) printf("\n");
279 printf("%4d ", block_org[i]);
280 }
281 for(i=0; i<64; i++){
282 if((i&7)==0) printf("\n");
283 printf("%4d ", block[i] - block1[i]);
284 }
285 }
286#endif
287 }
ae32e509 288 for(i=0; i<64; i++) sysErrMax= FFMAX(sysErrMax, FFABS(sysErr[i]));
115329f1 289
86748dbc
MN
290#if 1 // dump systematic errors
291 for(i=0; i<64; i++){
bb270c08 292 if(i%8==0) printf("\n");
86748dbc 293 printf("%5d ", (int)sysErr[i]);
de6d9b64 294 }
86748dbc
MN
295 printf("\n");
296#endif
115329f1 297
86748dbc 298 printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",
9e1586fc 299 is_idct ? "IDCT" : "DCT",
86748dbc
MN
300 name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax);
301#if 1 //Speed test
de6d9b64 302 /* speed test */
86748dbc
MN
303 for(i=0;i<64;i++)
304 block1[i] = 0;
305 switch(test){
115329f1 306 case 0:
86748dbc
MN
307 for(i=0;i<64;i++)
308 block1[i] = (random() % 512) -256;
ad324c93 309 if (is_idct){
86748dbc 310 fdct(block1);
ad324c93
MN
311
312 for(i=0;i<64;i++)
313 block1[i]>>=3;
314 }
86748dbc
MN
315 break;
316 case 1:{
317 case 2:
318 block1[0] = (random() % 512) -256;
319 block1[1] = (random() % 512) -256;
320 block1[2] = (random() % 512) -256;
321 block1[3] = (random() % 512) -256;
322 }break;
323 }
de6d9b64 324
3ac35bdb 325 if (form == MMX_PERM) {
86748dbc 326 for(i=0;i<64;i++)
9e1586fc 327 block[idct_mmx_perm[i]] = block1[i];
3ac35bdb 328 } else if(form == MMX_SIMPLE_PERM) {
86748dbc
MN
329 for(i=0;i<64;i++)
330 block[idct_simple_mmx_perm[i]] = block1[i];
331 } else {
332 for(i=0; i<64; i++)
333 block[i]= block1[i];
9e1586fc
FB
334 }
335
de6d9b64
FB
336 ti = gettime();
337 it1 = 0;
338 do {
339 for(it=0;it<NB_ITS_SPEED;it++) {
86748dbc
MN
340 for(i=0; i<64; i++)
341 block[i]= block1[i];
342// memcpy(block, block1, sizeof(DCTELEM) * 64);
755bfeab 343// do not memcpy especially not fastmemcpy because it does movntq !!!
de6d9b64
FB
344 fdct_func(block);
345 }
346 it1 += NB_ITS_SPEED;
347 ti1 = gettime() - ti;
348 } while (ti1 < 1000000);
aadd27cd 349 mmx_emms();
de6d9b64 350
86748dbc 351 printf("%s %s: %0.1f kdct/s\n",
9e1586fc 352 is_idct ? "IDCT" : "DCT",
de6d9b64 353 name, (double)it1 * 1000.0 / (double)ti1);
86748dbc 354#endif
de6d9b64
FB
355}
356
0c1a9eda
ZK
357static uint8_t img_dest[64] __attribute__ ((aligned (8)));
358static uint8_t img_dest1[64] __attribute__ ((aligned (8)));
a46a3ce4 359
0c1a9eda 360void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
a46a3ce4
FB
361{
362 static int init;
363 static double c8[8][8];
364 static double c4[4][4];
365 double block1[64], block2[64], block3[64];
366 double s, sum, v;
367 int i, j, k;
368
369 if (!init) {
370 init = 1;
371
372 for(i=0;i<8;i++) {
373 sum = 0;
374 for(j=0;j<8;j++) {
375 s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0);
376 c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0);
377 sum += c8[i][j] * c8[i][j];
378 }
379 }
115329f1 380
a46a3ce4
FB
381 for(i=0;i<4;i++) {
382 sum = 0;
383 for(j=0;j<4;j++) {
384 s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0);
385 c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0);
386 sum += c4[i][j] * c4[i][j];
387 }
388 }
389 }
390
391 /* butterfly */
652f0197 392 s = 0.5 * sqrt(2.0);
a46a3ce4
FB
393 for(i=0;i<4;i++) {
394 for(j=0;j<8;j++) {
652f0197
FB
395 block1[8*(2*i)+j] = (block[8*(2*i)+j] + block[8*(2*i+1)+j]) * s;
396 block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * s;
a46a3ce4
FB
397 }
398 }
399
400 /* idct8 on lines */
401 for(i=0;i<8;i++) {
402 for(j=0;j<8;j++) {
403 sum = 0;
404 for(k=0;k<8;k++)
405 sum += c8[k][j] * block1[8*i+k];
406 block2[8*i+j] = sum;
407 }
408 }
409
410 /* idct4 */
411 for(i=0;i<8;i++) {
412 for(j=0;j<4;j++) {
413 /* top */
414 sum = 0;
415 for(k=0;k<4;k++)
416 sum += c4[k][j] * block2[8*(2*k)+i];
417 block3[8*(2*j)+i] = sum;
418
419 /* bottom */
420 sum = 0;
421 for(k=0;k<4;k++)
422 sum += c4[k][j] * block2[8*(2*k+1)+i];
423 block3[8*(2*j+1)+i] = sum;
424 }
425 }
426
427 /* clamp and store the result */
428 for(i=0;i<8;i++) {
429 for(j=0;j<8;j++) {
652f0197 430 v = block3[8*i+j];
a46a3ce4
FB
431 if (v < 0)
432 v = 0;
433 else if (v > 255)
434 v = 255;
435 dest[i * linesize + j] = (int)rint(v);
436 }
437 }
438}
439
115329f1 440void idct248_error(const char *name,
0c1a9eda 441 void (*idct248_put)(uint8_t *dest, int line_size, int16_t *block))
a46a3ce4
FB
442{
443 int it, i, it1, ti, ti1, err_max, v;
444
445 srandom(0);
115329f1 446
a46a3ce4
FB
447 /* just one test to see if code is correct (precision is less
448 important here) */
449 err_max = 0;
450 for(it=0;it<NB_ITS;it++) {
115329f1 451
652f0197
FB
452 /* XXX: use forward transform to generate values */
453 for(i=0;i<64;i++)
454 block1[i] = (random() % 256) - 128;
455 block1[0] += 1024;
456
a46a3ce4
FB
457 for(i=0; i<64; i++)
458 block[i]= block1[i];
459 idct248_ref(img_dest1, 8, block);
115329f1 460
652f0197
FB
461 for(i=0; i<64; i++)
462 block[i]= block1[i];
463 idct248_put(img_dest, 8, block);
115329f1 464
652f0197
FB
465 for(i=0;i<64;i++) {
466 v = abs((int)img_dest[i] - (int)img_dest1[i]);
467 if (v == 255)
468 printf("%d %d\n", img_dest[i], img_dest1[i]);
469 if (v > err_max)
470 err_max = v;
471 }
a46a3ce4
FB
472#if 0
473 printf("ref=\n");
474 for(i=0;i<8;i++) {
475 int j;
476 for(j=0;j<8;j++) {
477 printf(" %3d", img_dest1[i*8+j]);
478 }
479 printf("\n");
480 }
115329f1 481
a46a3ce4
FB
482 printf("out=\n");
483 for(i=0;i<8;i++) {
484 int j;
485 for(j=0;j<8;j++) {
486 printf(" %3d", img_dest[i*8+j]);
487 }
488 printf("\n");
489 }
490#endif
a46a3ce4
FB
491 }
492 printf("%s %s: err_inf=%d\n",
493 1 ? "IDCT248" : "DCT248",
494 name, err_max);
495
496 ti = gettime();
497 it1 = 0;
498 do {
499 for(it=0;it<NB_ITS_SPEED;it++) {
500 for(i=0; i<64; i++)
501 block[i]= block1[i];
502// memcpy(block, block1, sizeof(DCTELEM) * 64);
755bfeab 503// do not memcpy especially not fastmemcpy because it does movntq !!!
a46a3ce4
FB
504 idct248_put(img_dest, 8, block);
505 }
506 it1 += NB_ITS_SPEED;
507 ti1 = gettime() - ti;
508 } while (ti1 < 1000000);
aadd27cd 509 mmx_emms();
a46a3ce4
FB
510
511 printf("%s %s: %0.1f kdct/s\n",
512 1 ? "IDCT248" : "DCT248",
513 name, (double)it1 * 1000.0 / (double)ti1);
514}
515
9e1586fc
FB
516void help(void)
517{
86748dbc
MN
518 printf("dct-test [-i] [<test-number>]\n"
519 "test-number 0 -> test with random matrixes\n"
520 " 1 -> test with random sparse matrixes\n"
521 " 2 -> do 3. test from mpeg4 std\n"
a46a3ce4
FB
522 "-i test IDCT implementations\n"
523 "-4 test IDCT248 implementations\n");
9e1586fc
FB
524}
525
de6d9b64
FB
526int main(int argc, char **argv)
527{
a46a3ce4 528 int test_idct = 0, test_248_dct = 0;
86748dbc
MN
529 int c,i;
530 int test=1;
aadd27cd 531 cpu_flags = mm_support();
9e1586fc 532
de6d9b64 533 init_fdct();
9e1586fc 534 idct_mmx_init();
f67a10cd 535
486497e0 536 for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
86748dbc 537 for(i=0;i<MAX_NEG_CROP;i++) {
486497e0
MR
538 cropTbl[i] = 0;
539 cropTbl[i + MAX_NEG_CROP + 256] = 255;
86748dbc 540 }
115329f1 541
9e1586fc 542 for(;;) {
a46a3ce4 543 c = getopt(argc, argv, "ih4");
9e1586fc
FB
544 if (c == -1)
545 break;
546 switch(c) {
547 case 'i':
548 test_idct = 1;
549 break;
a46a3ce4
FB
550 case '4':
551 test_248_dct = 1;
552 break;
86748dbc 553 default :
9e1586fc
FB
554 case 'h':
555 help();
c6bdc908 556 return 0;
9e1586fc
FB
557 }
558 }
115329f1 559
86748dbc 560 if(optind <argc) test= atoi(argv[optind]);
115329f1 561
9e1586fc
FB
562 printf("ffmpeg DCT/IDCT test\n");
563
a46a3ce4 564 if (test_248_dct) {
59e6f60a 565 idct248_error("SIMPLE-C", ff_simple_idct248_put);
9e1586fc 566 } else {
3ac35bdb 567 for (i=0;algos[i].name;i++)
dafe8824 568 if (algos[i].is_idct == test_idct && !(~cpu_flags & algos[i].mm_support)) {
3ac35bdb 569 dct_error (algos[i].name, algos[i].is_idct, algos[i].func, algos[i].ref, algos[i].format, test);
a46a3ce4 570 }
9e1586fc 571 }
de6d9b64
FB
572 return 0;
573}