--- trunk/xvidcore/examples/xvid_bench.c 2005/05/23 09:29:43 1617 +++ trunk/xvidcore/examples/xvid_bench.c 2005/08/05 20:49:23 1629 @@ -19,7 +19,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: xvid_bench.c,v 1.19 2005-05-23 09:29:43 Skal Exp $ + * $Id: xvid_bench.c,v 1.23 2005-08-05 20:49:23 Skal Exp $ * ****************************************************************************/ @@ -112,41 +112,27 @@ unsigned int cpu; } CPU; -CPU cpu_list[] = -{ { "PLAINC", 0 } +CPU cpu_list[] = { + { "PLAINC ", 0 }, #ifdef ARCH_IS_IA32 - , { "MMX ", XVID_CPU_MMX } - , { "MMXEXT", XVID_CPU_MMXEXT | XVID_CPU_MMX } - , { "SSE2 ", XVID_CPU_SSE2 | XVID_CPU_MMX } - , { "3DNOW ", XVID_CPU_3DNOW } - , { "3DNOWE", XVID_CPU_3DNOW | XVID_CPU_3DNOWEXT } + { "MMX ", XVID_CPU_MMX }, + { "MMXEXT ", XVID_CPU_MMXEXT | XVID_CPU_MMX }, + { "SSE2 ", XVID_CPU_SSE2 | XVID_CPU_MMX }, + { "3DNOW ", XVID_CPU_3DNOW }, + { "3DNOWE ", XVID_CPU_3DNOW | XVID_CPU_3DNOWEXT }, #endif #ifdef ARCH_IS_PPC - , { "ALTIVEC", XVID_CPU_ALTIVEC } + { "ALTIVEC", XVID_CPU_ALTIVEC }, #endif #ifdef ARCH_IS_X86_64 - , { "X86_64", XVID_CPU_ASM} + { "X86_64 ", XVID_CPU_ASM}, #endif -//, { "IA64 ", XVID_CPU_IA64 } -//, { "TSC ", XVID_CPU_TSC } - , { 0, 0 } }; - -CPU cpu_short_list[] = -{ { "PLAINC", 0 } -#ifdef ARCH_IS_IA32 - , { "MMX ", XVID_CPU_MMX } -//, { "MMXEXT", XVID_CPU_MMXEXT | XVID_CPU_MMX } -#endif -//, { "IA64 ", XVID_CPU_IA64 } - , { 0, 0 } }; - -CPU cpu_short_list2[] = -{ { "PLAINC", 0 } -#ifdef ARCH_IS_IA32 - , { "MMX ", XVID_CPU_MMX } - , { "SSE2 ", XVID_CPU_SSE2 | XVID_CPU_MMX } +#ifdef ARCH_IS_IA64 +// { "IA64 ", XVID_CPU_IA64 }, #endif - , { 0, 0 } }; +// { "TSC ", XVID_CPU_TSC }, + { 0, 0 } +}; int init_cpu(CPU *cpu) @@ -274,6 +260,44 @@ return crc; } +void byte_swap(uint8_t *mem, int len, int element_size) { +#ifdef ARCH_IS_BIG_ENDIAN + int i; + + if(element_size == 1) { + /* No need to swap */ + } else if(element_size == 2) { + uint8_t temp[2]; + + for(i=0; i < (len/2); i++ ) { + temp[0] = mem[0]; + temp[1] = mem[1]; + mem[0] = temp[1]; + mem[1] = temp[0]; + + mem += 2; + } + } else if(element_size == 4) { + uint8_t temp[4]; + + for(i=0; i < (len/4); i++ ) { + temp[0] = mem[0]; + temp[1] = mem[1]; + temp[2] = mem[2]; + temp[3] = mem[3]; + mem[0] = temp[3]; + mem[1] = temp[2]; + mem[2] = temp[1]; + mem[3] = temp[0]; + + mem += 4; + } + } else { + printf("ERROR: byte_swap unsupported element_size(%u)\n", element_size); + } +#endif +} + /********************************************************************* * test DCT *********************************************************************/ @@ -527,7 +551,8 @@ } \ emms(); \ t = (gettime_usec()-t -overhead) / nb_tests;\ -s = calc_crc((uint8_t*)(DST), sizeof((DST)), CRC32_INITIAL) +byte_swap((uint8_t*)(DST), 8*32*sizeof((DST)[0]), sizeof((DST)[0])); \ +s = calc_crc((uint8_t*)(DST), 8*32*sizeof((DST)[0]), CRC32_INITIAL) #define TEST_TRANSFER(FUNC, DST, SRC) \ TEST_TRANSFER_BEGIN(DST); \ @@ -553,7 +578,8 @@ } \ emms(); \ t = (gettime_usec()-t -overhead) / nb_tests;\ -s = calc_crc((uint8_t*)(DST), sizeof((DST)), CRC32_INITIAL) +byte_swap((uint8_t*)(DST), 8*32*sizeof((DST)[0]), sizeof((DST)[0])); \ +s = calc_crc((uint8_t*)(DST), 8*32*sizeof((DST)[0]), CRC32_INITIAL) #define TEST_TRANSFER2(FUNC, DST, SRC, R1) \ TEST_TRANSFER2_BEGIN(DST,SRC); \ @@ -570,8 +596,14 @@ const int nb_tests = 4000*speed_ref; int i; CPU *cpu; - uint8_t Src8[8*32], Dst8[8*32], Ref1[8*32], Ref2[8*32]; - int16_t Src16[8*32], Dst16[8*32]; +// uint8_t Src8[8*32], Dst8[8*32], Ref1[8*32], Ref2[8*32]; +// int16_t Src16[8*32], Dst16[8*32]; + DECLARE_ALIGNED_MATRIX(Src8, 8, 32, uint8_t, CACHE_LINE); + DECLARE_ALIGNED_MATRIX(Dst8, 8, 32, uint8_t, CACHE_LINE); + DECLARE_ALIGNED_MATRIX(Ref1, 8, 32, uint8_t, CACHE_LINE); + DECLARE_ALIGNED_MATRIX(Ref2, 8, 32, uint8_t, CACHE_LINE); + DECLARE_ALIGNED_MATRIX(Src16, 8, 32, uint16_t, CACHE_LINE); + DECLARE_ALIGNED_MATRIX(Dst16, 8, 32, uint16_t, CACHE_LINE); printf( "\n === test transfer ===\n" ); @@ -606,8 +638,8 @@ TEST_TRANSFER2(transfer_8to16sub, Dst16, Src8, Ref1); { int s1, s2; - s1 = calc_crc((uint8_t*)Dst16, sizeof(Dst16), CRC32_INITIAL); - s2 = calc_crc((uint8_t*)Src8, sizeof(Src8), CRC32_INITIAL); + s1 = calc_crc((uint8_t*)Dst16, 8*32*sizeof(Dst16[0]), CRC32_INITIAL); + s2 = calc_crc((uint8_t*)Src8, 8*32*sizeof(Src8[0]), CRC32_INITIAL); printf("%s - 8to16sub %.3f usec crc32(1)=0x%08x crc32(2)=0x%08x %s %s\n", cpu->name, t, s1, s2, (s1!=0xa1e07163)?"| ERROR1": "", @@ -636,7 +668,8 @@ for(q=1; q<=max_Q; ++q) { \ for(tst=0; tstname, t, cbp, (cbp!=0x15)?"| ERROR": ""); - TEST_CBP(calc_cbp, Src2); + TEST_CBP(calc_cbp, Src2, nb_tests); printf("%s - calc_cbp#2 %.3f usec cbp=0x%02x %s\n", cpu->name, t, cbp, (cbp!=0x38)?"| ERROR": ""); - TEST_CBP(calc_cbp, Src3); + TEST_CBP(calc_cbp, Src3, nb_tests); printf("%s - calc_cbp#3 %.3f usec cbp=0x%02x %s\n", cpu->name, t, cbp, (cbp!=0x0f)?"| ERROR": "" ); - TEST_CBP(calc_cbp, Src4); + TEST_CBP(calc_cbp, Src4, nb_tests); printf("%s - calc_cbp#4 %.3f usec cbp=0x%02x %s\n", cpu->name, t, cbp, (cbp!=0x05)?"| ERROR": "" ); printf( " --- \n" ); } + + for(cpu = cpu_list; cpu->name!=0; ++cpu) /* bench suggested by Carlo (carlo dot bramix at libero dot it) */ + { + double t; + int tst, cbp, err; + + if (!init_cpu(cpu)) + continue; + + err = 0; + for(n=0; n<6; ++n) + { + for(m=0; m<64; ++m) + { + for(i=0; i<6*64; ++i) + Src1[i] = (i== (m + n*64)); + + TEST_CBP(calc_cbp, Src1, 1); + if (cbp!= (((m!=0)<<(5-n)))) + { + printf( "%s - calc_cbp#5: ERROR at pos %d / %d!\n", cpu->name, n, m); + err = 1; + break; + } + } + } + if (!err) + printf( " %s - calc_cbp#5 : OK\n", cpu->name ); + + } } /********************************************************************* @@ -1733,7 +1797,7 @@ else if (!strcmp(argv[c], "-c")) cpu_mask = 0 /* PLAIN_C */ | XVID_CPU_FORCE; else if (!strcmp(argv[c], "-mmx")) cpu_mask = XVID_CPU_MMX | XVID_CPU_FORCE; else if (!strcmp(argv[c], "-mmxext")) cpu_mask = XVID_CPU_MMXEXT | XVID_CPU_MMX | XVID_CPU_FORCE; - else if (!strcmp(argv[c], "-sse2")) cpu_mask = XVID_CPU_SSE2 | XVID_CPU_MMX | XVID_CPU_FORCE; + else if (!strcmp(argv[c], "-sse2")) cpu_mask = XVID_CPU_SSE2 | XVID_CPU_MMXEXT | XVID_CPU_MMX | XVID_CPU_FORCE; else if (!strcmp(argv[c], "-3dnow")) cpu_mask = XVID_CPU_3DNOW | XVID_CPU_FORCE; else if (!strcmp(argv[c], "-3dnowe")) cpu_mask = XVID_CPU_3DNOW | XVID_CPU_3DNOWEXT | XVID_CPU_FORCE; else if (!strcmp(argv[c], "-altivec")) cpu_mask = XVID_CPU_ALTIVEC | XVID_CPU_FORCE;