for(i=0;i<64;i++) block1[i]>>=3; }
void dct_error(const char *name, int is_idct,               void (*fdct_func)(DCTELEM *block),               void (*fdct_ref)(DCTELEM *block), int test){    int it, i, scale;    int err_inf, v;    INT64 err2, ti, ti1, it1;    INT64 sysErr[64], sysErrMax=0;    int maxout=0;    int max_sum=0;    int blockSumErrMax=0, blockSumErr;    srandom(0);    err_inf = 0;    err2 = 0;    for(i=0; i<64; i++) sysErr[i]=0;    for(it=0;it<NB_ITS;it++) {        for(i=0;i<64;i++)            block1[i] = 0;        switch(test){        case 0:             for(i=0;i<64;i++)                block1[i] = (random() % 512) -256;            if (is_idct)                fdct(block1);        break;        case 1:{            int num= (random()%10)+1;            for(i=0;i<num;i++)                block1[random()%64] = (random() % 512) -256;        }break;        case 2:            block1[0]= (random()%4096)-2048;            block1[63]= (block1[0]&1)^1;        break;        }#if 0 // simulate mismatch control{ int sum=0;        for(i=0;i<64;i++)           sum+=block1[i];        if((sum&1)==0) block1[63]^=1; }#endif        for(i=0; i<64; i++)            block_org[i]= block1[i];        if (fdct_func == ff_mmx_idct ||            fdct_func == j_rev_dct || fdct_func == ff_mmxext_idct) {            for(i=0;i<64;i++)                block[idct_mmx_perm[i]] = block1[i];        } else if(fdct_func == simple_idct_mmx ) {            for(i=0;i<64;i++)                block[idct_simple_mmx_perm[i]] = block1[i];	} else {            for(i=0; i<64; i++)                block[i]= block1[i];        }#if 0 // simulate mismatch control for tested IDCT but not the ref{ int sum=0;        for(i=0;i<64;i++)           sum+=block[i];        if((sum&1)==0) block[63]^=1; }#endif        fdct_func(block);        emms(); /* for ff_mmx_idct */        if (fdct_func == fdct_ifast) {            for(i=0; i<64; i++) {                scale = (1 << (AANSCALE_BITS + 11)) / aanscales[i];                block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS;            }        }        if (fdct_func == ff_jpeg_fdct_islow) {            for(i=0; i<64; i++) {                block[i] = (block[i]+3)>>3;            }        }        fdct_ref(block1);        blockSumErr=0;        for(i=0;i<64;i++) {            v = abs(block[i] - block1[i]);            if (v > err_inf)                err_inf = v;            err2 += v * v;	    sysErr[i] += block[i] - block1[i];	    blockSumErr += v;	    if( abs(block[i])>maxout) maxout=abs(block[i]);        }        if(blockSumErrMax < blockSumErr) blockSumErrMax= blockSumErr;#if 0 // print different matrix pairs        if(blockSumErr){            printf("\n");            for(i=0; i<64; i++){                if((i&7)==0) printf("\n");                printf("%4d ", block_org[i]);            }            for(i=0; i<64; i++){                if((i&7)==0) printf("\n");                printf("%4d ", block[i] - block1[i]);            }        }#endif    }    for(i=0; i<64; i++) sysErrMax= MAX(sysErrMax, ABS(sysErr[i]));    #if 1 // dump systematic errors    for(i=0; i<64; i++){	if(i%8==0) printf("\n");        printf("%5d ", (int)sysErr[i]);    }    printf("\n");#endif        printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n",           is_idct ? "IDCT" : "DCT",           name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax);#if 1 //Speed test    /* speed test */    for(i=0;i<64;i++)        block1[i] = 0;    switch(test){    case 0:         for(i=0;i<64;i++)            block1[i] = (random() % 512) -256;        if (is_idct)            fdct(block1);    break;    case 1:{    case 2:        block1[0] = (random() % 512) -256;        block1[1] = (random() % 512) -256;        block1[2] = (random() % 512) -256;        block1[3] = (random() % 512) -256;    }break;    }    if (fdct_func == ff_mmx_idct ||        fdct_func == j_rev_dct || fdct_func == ff_mmxext_idct) {        for(i=0;i<64;i++)            block[idct_mmx_perm[i]] = block1[i];    } else if(fdct_func == simple_idct_mmx ) {        for(i=0;i<64;i++)            block[idct_simple_mmx_perm[i]] = block1[i];    } else {        for(i=0; i<64; i++)            block[i]= block1[i];    }    ti = gettime();    it1 = 0;    do {        for(it=0;it<NB_ITS_SPEED;it++) {            for(i=0; i<64; i++)                block[i]= block1[i];//            memcpy(block, block1, sizeof(DCTELEM) * 64);// dont memcpy especially not fastmemcpy because it does movntq !!!            fdct_func(block);        }        it1 += NB_ITS_SPEED;        ti1 = gettime() - ti;    } while (ti1 < 1000000);    emms();    printf("%s %s: %0.1f kdct/s\n",           is_idct ? "IDCT" : "DCT",           name, (double)it1 * 1000.0 / (double)ti1);#endif}