checkasm.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:21k
源码类别:

Audio

开发平台:

Visual C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "common/common.h"
  5. #include "common/cpu.h"
  6. #ifdef HAVE_MMXEXT
  7. #include "common/i386/pixel.h"
  8. #include "common/i386/dct.h"
  9. #include "common/i386/mc.h"
  10. #endif
  11. #ifdef ARCH_PPC
  12. #include "common/ppc/pixel.h"
  13. #include "common/ppc/mc.h"
  14. #endif
  15. /* buf1, buf2: initialised to random data and shouldn't write into them */
  16. uint8_t * buf1, * buf2;
  17. /* buf3, buf4: used to store output */
  18. uint8_t * buf3, * buf4;
  19. /* buf5: temp */
  20. uint8_t * buf5;
  21. #define report( name ) { 
  22.     if( used_asm ) 
  23.         fprintf( stderr, " - %-21s [%s]n", name, ok ? "OK" : "FAILED" ); 
  24.     if( !ok ) ret = -1; 
  25. }
  26. static int check_pixel( int cpu_ref, int cpu_new )
  27. {
  28.     x264_pixel_function_t pixel_c;
  29.     x264_pixel_function_t pixel_ref;
  30.     x264_pixel_function_t pixel_asm;
  31.     int ret = 0, ok, used_asm;
  32.     int i;
  33.     x264_pixel_init( 0, &pixel_c );
  34.     x264_pixel_init( cpu_ref, &pixel_ref );
  35.     x264_pixel_init( cpu_new, &pixel_asm );
  36. #define TEST_PIXEL( name ) 
  37.     for( i = 0, ok = 1, used_asm = 0; i < 7; i++ ) 
  38.     { 
  39.         int res_c, res_asm; 
  40.         if( pixel_asm.name[i] != pixel_ref.name[i] ) 
  41.         { 
  42.             used_asm = 1; 
  43.             res_c   = pixel_c.name[i]( buf1, 32, buf2, 24 ); 
  44.             res_asm = pixel_asm.name[i]( buf1, 32, buf2, 24 ); 
  45.             if( res_c != res_asm ) 
  46.             { 
  47.                 ok = 0; 
  48.                 fprintf( stderr, #name "[%d]: %d != %d [FAILED]n", i, res_c, res_asm ); 
  49.             } 
  50.         } 
  51.     } 
  52.     report( "pixel " #name " :" );
  53.     TEST_PIXEL( sad );
  54.     TEST_PIXEL( ssd );
  55.     TEST_PIXEL( satd );
  56.     return ret;
  57. }
  58. static int check_dct( int cpu_ref, int cpu_new )
  59. {
  60.     x264_dct_function_t dct_c;
  61.     x264_dct_function_t dct_ref;
  62.     x264_dct_function_t dct_asm;
  63.     int ret = 0, ok, used_asm;
  64.     int16_t dct1[16][4][4] __attribute((aligned(16)));
  65.     int16_t dct2[16][4][4] __attribute((aligned(16)));
  66.     x264_dct_init( 0, &dct_c );
  67.     x264_dct_init( cpu_ref, &dct_ref);
  68.     x264_dct_init( cpu_new, &dct_asm );
  69. #define TEST_DCT( name, t1, t2, size ) 
  70.     if( dct_asm.name != dct_ref.name ) 
  71.     { 
  72.         used_asm = 1; 
  73.         dct_c.name( t1, buf1, 32, buf2, 24 ); 
  74.         dct_asm.name( t2, buf1, 32, buf2, 24 ); 
  75.         if( memcmp( t1, t2, size ) ) 
  76.         { 
  77.             ok = 0; 
  78.             fprintf( stderr, #name " [FAILED]n" ); 
  79.         } 
  80.     }
  81.     ok = 1; used_asm = 0;
  82.     TEST_DCT( sub4x4_dct, dct1[0], dct2[0], 16*2 );
  83.     TEST_DCT( sub8x8_dct, dct1, dct2, 16*2*4 );
  84.     TEST_DCT( sub16x16_dct, dct1, dct2, 16*2*16 );
  85.     report( "sub_dct4 :" );
  86.     ok = 1; used_asm = 0;
  87.     TEST_DCT( sub8x8_dct8, (void*)dct1[0], (void*)dct2[0], 64*2 );
  88.     TEST_DCT( sub16x16_dct8, (void*)dct1, (void*)dct2, 64*2*4 );
  89.     report( "sub_dct8 :" );
  90. #undef TEST_DCT
  91.     /* copy coefs because idct8 modifies them in place */
  92.     memcpy( buf5, dct1, 512 );
  93. #define TEST_IDCT( name ) 
  94.     if( dct_asm.name != dct_ref.name ) 
  95.     { 
  96.         used_asm = 1; 
  97.         memcpy( buf3, buf1, 32*32 ); 
  98.         memcpy( buf4, buf1, 32*32 ); 
  99.         memcpy( dct1, buf5, 512 ); 
  100.         memcpy( dct2, buf5, 512 ); 
  101.         dct_c.name( buf3, 32, (void*)dct1 ); 
  102.         dct_asm.name( buf4, 32, (void*)dct2 ); 
  103.         if( memcmp( buf3, buf4, 32*32 ) ) 
  104.         { 
  105.             ok = 0; 
  106.             fprintf( stderr, #name " [FAILED]n" ); 
  107.         } 
  108.     }
  109.     ok = 1; used_asm = 0;
  110.     TEST_IDCT( add4x4_idct );
  111.     TEST_IDCT( add8x8_idct );
  112.     TEST_IDCT( add16x16_idct );
  113.     report( "add_idct4 :" );
  114.     ok = 1; used_asm = 0;
  115.     TEST_IDCT( add8x8_idct8 );
  116.     TEST_IDCT( add16x16_idct8 );
  117.     report( "add_idct8 :" );
  118. #undef TEST_IDCT
  119.     ok = 1; used_asm = 0;
  120.     if( dct_asm.dct4x4dc != dct_ref.dct4x4dc )
  121.     {
  122.         int16_t dct1[4][4] __attribute((aligned(16))) = { {-12, 42, 23, 67},{2, 90, 89,56}, {67,43,-76,91},{56,-78,-54,1}};
  123.         int16_t dct2[4][4] __attribute((aligned(16))) = { {-12, 42, 23, 67},{2, 90, 89,56}, {67,43,-76,91},{56,-78,-54,1}};
  124.         used_asm = 1;
  125.         dct_c.dct4x4dc( dct1 );
  126.         dct_asm.dct4x4dc( dct2 );
  127.         if( memcmp( dct1, dct2, 32 ) )
  128.         {
  129.             ok = 0;
  130.             fprintf( stderr, " - dct4x4dc :        [FAILED]n" );
  131.         }
  132.     }
  133.     if( dct_asm.dct4x4dc != dct_ref.dct4x4dc )
  134.     {
  135.         int16_t dct1[4][4] __attribute((aligned(16))) = { {-12, 42, 23, 67},{2, 90, 89,56}, {67,43,-76,91},{56,-78,-54,1}};
  136.         int16_t dct2[4][4] __attribute((aligned(16))) = { {-12, 42, 23, 67},{2, 90, 89,56}, {67,43,-76,91},{56,-78,-54,1}};
  137.         used_asm = 1;
  138.         dct_c.idct4x4dc( dct1 );
  139.         dct_asm.idct4x4dc( dct2 );
  140.         if( memcmp( dct1, dct2, 32 ) )
  141.         {
  142.             ok = 0;
  143.             fprintf( stderr, " - idct4x4dc :        [FAILED]n" );
  144.         }
  145.     }
  146.     report( "(i)dct4x4dc :" );
  147.     ok = 1; used_asm = 0;
  148.     if( dct_asm.dct2x2dc != dct_ref.dct2x2dc )
  149.     {
  150.         int16_t dct1[2][2] __attribute((aligned(16))) = { {-12, 42},{2, 90}};
  151.         int16_t dct2[2][2] __attribute((aligned(16))) = { {-12, 42},{2, 90}};
  152.         used_asm = 1;
  153.         dct_c.dct2x2dc( dct1 );
  154.         dct_asm.dct2x2dc( dct2 );
  155.         if( memcmp( dct1, dct2, 4*2 ) )
  156.         {
  157.             ok = 0;
  158.             fprintf( stderr, " - dct2x2dc :        [FAILED]n" );
  159.         }
  160.     }
  161.     if( dct_asm.idct2x2dc != dct_ref.idct2x2dc )
  162.     {
  163.         int16_t dct1[2][2] __attribute((aligned(16))) = { {-12, 42},{2, 90}};
  164.         int16_t dct2[2][2] __attribute((aligned(16))) = { {-12, 42},{2, 90}};
  165.         used_asm = 1;
  166.         dct_c.idct2x2dc( dct1 );
  167.         dct_asm.idct2x2dc( dct2 );
  168.         if( memcmp( dct1, dct2, 4*2 ) )
  169.         {
  170.             ok = 0;
  171.             fprintf( stderr, " - idct2x2dc :       [FAILED]n" );
  172.         }
  173.     }
  174.     report( "(i)dct2x2dc :" );
  175.     return ret;
  176. }
  177. static int check_mc( int cpu_ref, int cpu_new )
  178. {
  179.     x264_mc_functions_t mc_c;
  180.     x264_mc_functions_t mc_ref;
  181.     x264_mc_functions_t mc_a;
  182.     uint8_t *src     = &buf1[2*32+2];
  183.     uint8_t *src2[4] = { &buf1[2*32+2],  &buf1[7*32+2],
  184.                          &buf1[12*32+2], &buf1[17*32+2] };
  185.     uint8_t *dst1    = &buf3[2*32+2];
  186.     uint8_t *dst2    = &buf4[2*32+2];
  187.     int dx, dy, i, w;
  188.     int ret = 0, ok, used_asm;
  189.     x264_mc_init( 0, &mc_c );
  190.     x264_mc_init( cpu_ref, &mc_ref );
  191.     x264_mc_init( cpu_new, &mc_a );
  192. #define MC_TEST_LUMA( w, h ) 
  193.         if( mc_a.mc_luma != mc_ref.mc_luma ) 
  194.         { 
  195.             used_asm = 1; 
  196.             memset(buf3, 0xCD, 1024); 
  197.             memset(buf4, 0xCD, 1024); 
  198.             mc_c.mc_luma( src2, 32, dst1, 16, dx, dy, w, h );     
  199.             mc_a.mc_luma( src2, 32, dst2, 16, dx, dy, w, h );   
  200.             if( memcmp( buf3, buf4, 1024 ) )               
  201.             { 
  202.                 fprintf( stderr, "mc_luma[mv(%d,%d) %2dx%-2d]     [FAILED]n", dx, dy, w, h );   
  203.                 ok = 0; 
  204.             } 
  205.         }
  206. #define MC_TEST_CHROMA( w, h ) 
  207.         if( mc_a.mc_chroma != mc_ref.mc_chroma ) 
  208.         { 
  209.             used_asm = 1; 
  210.             memset(buf3, 0xCD, 1024); 
  211.             memset(buf4, 0xCD, 1024); 
  212.             mc_c.mc_chroma( src, 32, dst1, 16, dx, dy, w, h );     
  213.             mc_a.mc_chroma( src, 32, dst2, 16, dx, dy, w, h );   
  214.             if( memcmp( buf3, buf4, 1024 ) )               
  215.             { 
  216.                 fprintf( stderr, "mc_chroma[mv(%d,%d) %2dx%-2d]     [FAILED]n", dx, dy, w, h );   
  217.                 ok = 0; 
  218.             } 
  219.         }
  220.     ok = 1; used_asm = 0;
  221.     for( dy = 0; dy < 4; dy++ )
  222.         for( dx = 0; dx < 4; dx++ )
  223.         {
  224.             MC_TEST_LUMA( 16, 16 );
  225.             MC_TEST_LUMA( 16, 8 );
  226.             MC_TEST_LUMA( 8, 16 );
  227.             MC_TEST_LUMA( 8, 8 );
  228.             MC_TEST_LUMA( 8, 4 );
  229.             MC_TEST_LUMA( 4, 8 );
  230.             MC_TEST_LUMA( 4, 4 );
  231.         }
  232.     report( "mc luma :" );
  233.     ok = 1; used_asm = 0;
  234.     for( dy = 0; dy < 9; dy++ )
  235.         for( dx = 0; dx < 9; dx++ )
  236.         {
  237.             MC_TEST_CHROMA( 8, 8 );
  238.             MC_TEST_CHROMA( 8, 4 );
  239.             MC_TEST_CHROMA( 4, 8 );
  240.             MC_TEST_CHROMA( 4, 4 );
  241.             MC_TEST_CHROMA( 4, 2 );
  242.             MC_TEST_CHROMA( 2, 4 );
  243.             MC_TEST_CHROMA( 2, 2 );
  244.         }
  245.     report( "mc chroma :" );
  246. #undef MC_TEST_LUMA
  247. #undef MC_TEST_CHROMA
  248. #define MC_TEST_AVG( name, ... ) 
  249.     for( i = 0, ok = 1, used_asm = 0; i < 10; i++ ) 
  250.     { 
  251.         memcpy( buf3, buf1, 1024 ); 
  252.         memcpy( buf4, buf1, 1024 ); 
  253.         if( mc_a.name[i] != mc_ref.name[i] ) 
  254.         { 
  255.             used_asm = 1; 
  256.             mc_c.name[i]( buf3, 32, buf2, 24, ##__VA_ARGS__ ); 
  257.             mc_a.name[i]( buf4, 32, buf2, 24, ##__VA_ARGS__ ); 
  258.             if( memcmp( buf3, buf4, 1024 ) )               
  259.             { 
  260.                 ok = 0; 
  261.                 fprintf( stderr, #name "[%d]: [FAILED]n", i ); 
  262.             } 
  263.         } 
  264.     }
  265.     MC_TEST_AVG( avg );
  266.     report( "mc avg :" );
  267.     for( w = -64; w <= 128 && ok; w++ )
  268.         MC_TEST_AVG( avg_weight, w );
  269.     report( "mc wpredb :" );
  270.     return ret;
  271. }
  272. static int check_deblock( int cpu_ref, int cpu_new )
  273. {
  274.     x264_deblock_function_t db_c;
  275.     x264_deblock_function_t db_ref;
  276.     x264_deblock_function_t db_a;
  277.     int ret = 0, ok = 1, used_asm = 0;
  278.     int alphas[36], betas[36];
  279.     int8_t tcs[36][4];
  280.     int a, c, i, j;
  281.     x264_deblock_init( 0, &db_c );
  282.     x264_deblock_init( cpu_ref, &db_ref );
  283.     x264_deblock_init( cpu_new, &db_a );
  284.     /* not exactly the real values of a,b,tc but close enough */
  285.     a = 255; c = 250;
  286.     for( i = 35; i >= 0; i-- )
  287.     {
  288.         alphas[i] = a;
  289.         betas[i] = (i+1)/2;
  290.         tcs[i][0] = tcs[i][2] = (c+6)/10;
  291.         tcs[i][1] = tcs[i][3] = (c+9)/20;
  292.         a = a*9/10;
  293.         c = c*9/10;
  294.     }
  295. #define TEST_DEBLOCK( name, ... ) 
  296.     for( i = 0; i < 36; i++ ) 
  297.     { 
  298.         for( j = 0; j < 1024; j++ ) 
  299.             /* two distributions of random to excersize different failure modes */
  300.             buf1[j] = rand() & (i&1 ? 0xf : 0xff ); 
  301.         memcpy( buf3, buf1, 1024 ); 
  302.         memcpy( buf4, buf1, 1024 ); 
  303.         if( db_a.name != db_ref.name ) 
  304.         { 
  305.             used_asm = 1; 
  306.             db_c.name( &buf3[8*32], 32, alphas[i], betas[i], ##__VA_ARGS__ ); 
  307.             db_a.name( &buf4[8*32], 32, alphas[i], betas[i], ##__VA_ARGS__ ); 
  308.             if( memcmp( buf3, buf4, 1024 ) )               
  309.             { 
  310.                 ok = 0; 
  311.                 fprintf( stderr, #name "(a=%d, b=%d): [FAILED]n", alphas[i], betas[i] ); 
  312.                 break; 
  313.             } 
  314.         } 
  315.     }
  316.     TEST_DEBLOCK( deblock_h_luma, tcs[i] );
  317.     TEST_DEBLOCK( deblock_v_luma, tcs[i] );
  318.     TEST_DEBLOCK( deblock_h_chroma, tcs[i] );
  319.     TEST_DEBLOCK( deblock_v_chroma, tcs[i] );
  320.     TEST_DEBLOCK( deblock_h_luma_intra );
  321.     TEST_DEBLOCK( deblock_v_luma_intra );
  322.     TEST_DEBLOCK( deblock_h_chroma_intra );
  323.     TEST_DEBLOCK( deblock_v_chroma_intra );
  324.     report( "deblock :" );
  325.     return ret;
  326. }
  327. static int check_quant( int cpu_ref, int cpu_new )
  328. {
  329.     x264_quant_function_t qf_c;
  330.     x264_quant_function_t qf_ref;
  331.     x264_quant_function_t qf_a;
  332.     int16_t dct1[64], dct2[64];
  333.     uint8_t cqm_buf[64];
  334.     int ret = 0, ok, used_asm;
  335.     int oks[2] = {1,1}, used_asms[2] = {0,0};
  336.     int i, i_cqm;
  337.     x264_t h_buf;
  338.     x264_t *h = &h_buf;
  339.     h->pps = h->pps_array;
  340.     x264_param_default( &h->param );
  341.     for( i_cqm = 0; i_cqm < 4; i_cqm++ )
  342.     {
  343.         if( i_cqm == 0 )
  344.             for( i = 0; i < 6; i++ )
  345.                 h->pps->scaling_list[i] = x264_cqm_flat16;
  346.         else if( i_cqm == 1 )
  347.             for( i = 0; i < 6; i++ )
  348.                 h->pps->scaling_list[i] = x264_cqm_jvt[i];
  349.         else
  350.         {
  351.             if( i_cqm == 2 )
  352.                 for( i = 0; i < 64; i++ )
  353.                     cqm_buf[i] = 10 + rand() % 246;
  354.             else
  355.                 for( i = 0; i < 64; i++ )
  356.                     cqm_buf[i] = 1;
  357.             for( i = 0; i < 6; i++ )
  358.                 h->pps->scaling_list[i] = cqm_buf;
  359.         }
  360.         x264_cqm_init( h );
  361.         x264_quant_init( h, 0, &qf_c );
  362.         x264_quant_init( h, cpu_ref, &qf_ref );
  363.         x264_quant_init( h, cpu_new, &qf_a );
  364. #define INIT_QUANT8() 
  365.         { 
  366.             static const int scale1d[8] = {32,31,24,31,32,31,24,31}; 
  367.             int x, y; 
  368.             for( y = 0; y < 8; y++ ) 
  369.                 for( x = 0; x < 8; x++ ) 
  370.                 { 
  371.                     unsigned int scale = (255*scale1d[y]*scale1d[x])/16; 
  372.                     dct1[y*8+x] = dct2[y*8+x] = (rand()%(2*scale+1))-scale; 
  373.                 } 
  374.         }
  375. #define INIT_QUANT4() 
  376.         { 
  377.             static const int scale1d[4] = {4,6,4,6}; 
  378.             int x, y; 
  379.             for( y = 0; y < 4; y++ ) 
  380.                 for( x = 0; x < 4; x++ ) 
  381.                 { 
  382.                     unsigned int scale = 255*scale1d[y]*scale1d[x]; 
  383.                     dct1[y*4+x] = dct2[y*4+x] = (rand()%(2*scale+1))-scale; 
  384.                 } 
  385.         }
  386. #define TEST_QUANT( name, cqm ) 
  387.         if( qf_a.name != qf_ref.name ) 
  388.         { 
  389.             used_asms[0] = 1; 
  390.             for( i = 0; i < 64; i++ ) 
  391.                 dct1[i] = dct2[i] = (rand() & 0x1fff) - 0xfff; 
  392.             qf_c.name( (void*)dct1, cqm, 20, (1<<20)/6 ); 
  393.             qf_a.name( (void*)dct2, cqm, 20, (1<<20)/6 ); 
  394.             if( memcmp( dct1, dct2, 64*2 ) )       
  395.             { 
  396.                 oks[0] = 0; 
  397.                 fprintf( stderr, #name "(cqm=%d): [FAILED]n", i_cqm ); 
  398.             } 
  399.         }
  400. #define TEST_QUANT8( qname, cqm, shift, divider ) 
  401.         if( qf_a.qname != qf_ref.qname ) 
  402.         { 
  403.             int qp; 
  404.             used_asms[0] = 1; 
  405.             for( qp = 51; qp > 0; qp-- ) 
  406.             { 
  407.                 INIT_QUANT8() 
  408.                 qf_c.qname( (void*)dct1, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); 
  409.                 qf_a.qname( (void*)dct2, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); 
  410.                 if( memcmp( dct1, dct2, 64*2 ) ) 
  411.                 { 
  412.                     oks[0] = 0; 
  413.                     fprintf( stderr, #qname "(qp=%d, cqm=%d, intra=%d): [FAILED]n", qp, i_cqm, divider==3 ); 
  414.                     break; 
  415.                 } 
  416.             } 
  417.         }
  418. #define TEST_QUANT4( qname, cqm, shift, divider ) 
  419.         if( qf_a.qname != qf_ref.qname ) 
  420.         { 
  421.             int qp; 
  422.             used_asms[0] = 1; 
  423.             for( qp = 51; qp > 0; qp-- ) 
  424.             { 
  425.                 INIT_QUANT4() 
  426.                 qf_c.qname( (void*)dct1, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); 
  427.                 qf_a.qname( (void*)dct2, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); 
  428.                 if( memcmp( dct1, dct2, 16*2 ) ) 
  429.                 { 
  430.                     oks[0] = 0; 
  431.                     fprintf( stderr, #qname "(qp=%d, cqm=%d, intra=%d): [FAILED]n", qp, i_cqm, divider==3 ); 
  432.                     break; 
  433.                 } 
  434.             } 
  435.         }
  436.         TEST_QUANT8( quant_8x8_core, h->quant8_mf[CQM_8IY], 16, 3 );
  437.         TEST_QUANT8( quant_8x8_core, h->quant8_mf[CQM_8PY], 16, 6 );
  438.         TEST_QUANT4( quant_4x4_core, h->quant4_mf[CQM_4IY], 15, 3 );
  439.         TEST_QUANT4( quant_4x4_core, h->quant4_mf[CQM_4PY], 15, 6 );
  440.         TEST_QUANT( quant_4x4_dc_core, ***h->quant4_mf[CQM_4IY] );
  441.         TEST_QUANT( quant_2x2_dc_core, ***h->quant4_mf[CQM_4IC] );
  442. #define TEST_DEQUANT8( qname, dqname, cqm, dqm, shift, divider ) 
  443.         if( qf_a.dqname != qf_ref.dqname ) 
  444.         { 
  445.             int qp; 
  446.             used_asms[1] = 1; 
  447.             for( qp = 51; qp > 0; qp-- ) 
  448.             { 
  449.                 INIT_QUANT8() 
  450.                 qf_c.qname( (void*)dct1, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); 
  451.                 memcpy( dct2, dct1, 64*2 ); 
  452.                 qf_c.dqname( (void*)dct1, dqm, qp ); 
  453.                 qf_a.dqname( (void*)dct2, dqm, qp ); 
  454.                 if( memcmp( dct1, dct2, 64*2 ) ) 
  455.                 { 
  456.                     oks[1] = 0; 
  457.                     fprintf( stderr, #dqname "(qp=%d, cqm=%d, intra=%d): [FAILED]n", qp, i_cqm, divider==3 ); 
  458.                     break; 
  459.                 } 
  460.             } 
  461.         }
  462. #define TEST_DEQUANT4( qname, dqname, cqm, dqm, shift, divider ) 
  463.         if( qf_a.dqname != qf_ref.dqname ) 
  464.         { 
  465.             int qp; 
  466.             used_asms[1] = 1; 
  467.             for( qp = 51; qp > 0; qp-- ) 
  468.             { 
  469.                 INIT_QUANT4() 
  470.                 qf_c.qname( (void*)dct1, cqm[qp%6], shift+qp/6, (1<<(shift+qp/6))/divider ); 
  471.                 memcpy( dct2, dct1, 16*2 ); 
  472.                 qf_c.dqname( (void*)dct1, dqm, qp ); 
  473.                 qf_a.dqname( (void*)dct2, dqm, qp ); 
  474.                 if( memcmp( dct1, dct2, 16*2 ) ) 
  475.                 { 
  476.                     oks[1] = 0; 
  477.                     fprintf( stderr, #dqname "(qp=%d, cqm=%d, intra=%d): [FAILED]n", qp, i_cqm, divider==3 ); 
  478.                     break; 
  479.                 } 
  480.             } 
  481.         }
  482.         TEST_DEQUANT8( quant_8x8_core, dequant_8x8, h->quant8_mf[CQM_8IY], h->dequant8_mf[CQM_8IY], 16, 3 );
  483.         TEST_DEQUANT8( quant_8x8_core, dequant_8x8, h->quant8_mf[CQM_8PY], h->dequant8_mf[CQM_8PY], 16, 6 );
  484.         TEST_DEQUANT4( quant_4x4_core, dequant_4x4, h->quant4_mf[CQM_4IY], h->dequant4_mf[CQM_4IY], 15, 3 );
  485.         TEST_DEQUANT4( quant_4x4_core, dequant_4x4, h->quant4_mf[CQM_4PY], h->dequant4_mf[CQM_4PY], 15, 6 );
  486.     }
  487.     ok = oks[0]; used_asm = used_asms[0];
  488.     report( "quant :" );
  489.     ok = oks[1]; used_asm = used_asms[1];
  490.     report( "dequant :" );
  491.     return ret;
  492. }
  493. static int check_intra( int cpu_ref, int cpu_new )
  494. {
  495.     int ret = 0, ok = 1, used_asm = 0;
  496.     int i;
  497.     struct
  498.     {
  499.         x264_predict_t      predict_16x16[4+3];
  500.         x264_predict_t      predict_8x8c[4+3];
  501.         x264_predict8x8_t   predict_8x8[9+3];
  502.         x264_predict_t      predict_4x4[9+3];
  503.     } ip_c, ip_ref, ip_a;
  504.     x264_predict_16x16_init( 0, ip_c.predict_16x16 );
  505.     x264_predict_8x8c_init( 0, ip_c.predict_8x8c );
  506.     x264_predict_8x8_init( 0, ip_c.predict_8x8 );
  507.     x264_predict_4x4_init( 0, ip_c.predict_4x4 );
  508.     x264_predict_16x16_init( cpu_ref, ip_ref.predict_16x16 );
  509.     x264_predict_8x8c_init( cpu_ref, ip_ref.predict_8x8c );
  510.     x264_predict_8x8_init( cpu_ref, ip_ref.predict_8x8 );
  511.     x264_predict_4x4_init( cpu_ref, ip_ref.predict_4x4 );
  512.     x264_predict_16x16_init( cpu_new, ip_a.predict_16x16 );
  513.     x264_predict_8x8c_init( cpu_new, ip_a.predict_8x8c );
  514.     x264_predict_8x8_init( cpu_new, ip_a.predict_8x8 );
  515.     x264_predict_4x4_init( cpu_new, ip_a.predict_4x4 );
  516. #define INTRA_TEST( name, dir, ... ) 
  517.     if( ip_a.name[dir] != ip_ref.name[dir] )
  518.     { 
  519.         used_asm = 1; 
  520.         memcpy( buf3, buf1, 32*20 );
  521.         memcpy( buf4, buf1, 32*20 );
  522.         ip_c.name[dir]( buf3+48, ##__VA_ARGS__ );
  523.         ip_a.name[dir]( buf4+48, ##__VA_ARGS__ );
  524.         if( memcmp( buf3, buf4, 32*20 ) )
  525.         {
  526.             fprintf( stderr, #name "[%d] :  [FAILED]n", dir );
  527.             ok = 0;
  528.         }
  529.     }
  530.     for( i = 0; i < 12; i++ )
  531.         INTRA_TEST( predict_4x4, i );
  532.     for( i = 0; i < 7; i++ )
  533.         INTRA_TEST( predict_8x8c, i );
  534.     for( i = 0; i < 7; i++ )
  535.         INTRA_TEST( predict_16x16, i );
  536.     for( i = 0; i < 12; i++ )
  537.         INTRA_TEST( predict_8x8, i, 0xf );
  538.     for( i = 0; i < 12; i++ )
  539.         INTRA_TEST( predict_8x8, i, MB_LEFT|MB_TOP|MB_TOPLEFT );
  540.     INTRA_TEST( predict_8x8, I_PRED_8x8_V,  MB_LEFT|MB_TOP );
  541.     INTRA_TEST( predict_8x8, I_PRED_8x8_DC, MB_LEFT|MB_TOP );
  542.     INTRA_TEST( predict_8x8, I_PRED_8x8_DDL,MB_LEFT|MB_TOP );
  543.     INTRA_TEST( predict_8x8, I_PRED_8x8_V,  MB_LEFT|MB_TOP|MB_TOPRIGHT );
  544.     INTRA_TEST( predict_8x8, I_PRED_8x8_DC, MB_LEFT|MB_TOP|MB_TOPRIGHT );
  545.     INTRA_TEST( predict_8x8, I_PRED_8x8_DDL,MB_LEFT|MB_TOP|MB_TOPRIGHT );
  546.     report( "intra pred :" );
  547.     return ret;
  548. }
  549. int check_all( int cpu_ref, int cpu_new )
  550. {
  551.     return check_pixel( cpu_ref, cpu_new )
  552.          + check_dct( cpu_ref, cpu_new )
  553.          + check_mc( cpu_ref, cpu_new )
  554.          + check_intra( cpu_ref, cpu_new )
  555.          + check_deblock( cpu_ref, cpu_new )
  556.          + check_quant( cpu_ref, cpu_new );
  557. }
  558. int main(int argc, char *argv[])
  559. {
  560.     int ret = 0;
  561.     int i;
  562.     buf1 = x264_malloc( 1024 ); /* 32 x 32 */
  563.     buf2 = x264_malloc( 1024 );
  564.     buf3 = x264_malloc( 1024 );
  565.     buf4 = x264_malloc( 1024 );
  566.     buf5 = x264_malloc( 1024 );
  567.     i = ( argc > 1 ) ? atoi(argv[1]) : x264_mdate();
  568.     fprintf( stderr, "x264: using random seed %un", i );
  569.     srand( i );
  570.     for( i = 0; i < 1024; i++ )
  571.     {
  572.         buf1[i] = rand() & 0xFF;
  573.         buf2[i] = rand() & 0xFF;
  574.         buf3[i] = buf4[i] = 0;
  575.     }
  576. #ifdef HAVE_MMXEXT
  577.     fprintf( stderr, "x264: MMXEXT against Cn" );
  578.     ret = check_all( 0, X264_CPU_MMX | X264_CPU_MMXEXT );
  579. #ifdef HAVE_SSE2
  580.     if( x264_cpu_detect() & X264_CPU_SSE2 )
  581.     {
  582.         fprintf( stderr, "nx264: SSE2 against Cn" );
  583.         ret |= check_all( X264_CPU_MMX | X264_CPU_MMXEXT,
  584.                           X264_CPU_MMX | X264_CPU_MMXEXT | X264_CPU_SSE | X264_CPU_SSE2 );
  585.     }
  586. #endif
  587. #elif ARCH_PPC
  588.     fprintf( stderr, "x264: ALTIVEC against Cn" );
  589.     ret = check_all( 0, X264_CPU_ALTIVEC );
  590. #endif
  591.     if( ret == 0 )
  592.     {
  593.         fprintf( stderr, "x264: All tests passed Yeah :)n" );
  594.         return 0;
  595.     }
  596.     fprintf( stderr, "x264: at least one test has failed. Go and fix that Right Now!n" );
  597.     return -1;
  598. }