77#define LE_TABLE_SIZE (1 << CRC_LE_BITS)
88#define BE_TABLE_SIZE (1 << CRC_BE_BITS)
99
10- static uint32_t crc32table_le [LE_TABLE_SIZE ];
11- static uint32_t crc32table_be [BE_TABLE_SIZE ];
10+ static uint32_t crc32table_le [4 ][ LE_TABLE_SIZE ];
11+ static uint32_t crc32table_be [4 ][ BE_TABLE_SIZE ];
1212
1313/**
1414 * crc32init_le() - allocate and initialize LE table data
@@ -22,12 +22,19 @@ static void crc32init_le(void)
2222 unsigned i , j ;
2323 uint32_t crc = 1 ;
2424
25- crc32table_le [0 ] = 0 ;
25+ crc32table_le [0 ][ 0 ] = 0 ;
2626
2727 for (i = 1 << (CRC_LE_BITS - 1 ); i ; i >>= 1 ) {
2828 crc = (crc >> 1 ) ^ ((crc & 1 ) ? CRCPOLY_LE : 0 );
2929 for (j = 0 ; j < LE_TABLE_SIZE ; j += 2 * i )
30- crc32table_le [i + j ] = crc ^ crc32table_le [j ];
30+ crc32table_le [0 ][i + j ] = crc ^ crc32table_le [0 ][j ];
31+ }
32+ for (i = 0 ; i < LE_TABLE_SIZE ; i ++ ) {
33+ crc = crc32table_le [0 ][i ];
34+ for (j = 1 ; j < 4 ; j ++ ) {
35+ crc = crc32table_le [0 ][crc & 0xff ] ^ (crc >> 8 );
36+ crc32table_le [j ][i ] = crc ;
37+ }
3138 }
3239}
3340
@@ -39,25 +46,35 @@ static void crc32init_be(void)
3946 unsigned i , j ;
4047 uint32_t crc = 0x80000000 ;
4148
42- crc32table_be [0 ] = 0 ;
49+ crc32table_be [0 ][ 0 ] = 0 ;
4350
4451 for (i = 1 ; i < BE_TABLE_SIZE ; i <<= 1 ) {
4552 crc = (crc << 1 ) ^ ((crc & 0x80000000 ) ? CRCPOLY_BE : 0 );
4653 for (j = 0 ; j < i ; j ++ )
47- crc32table_be [i + j ] = crc ^ crc32table_be [j ];
54+ crc32table_be [0 ][i + j ] = crc ^ crc32table_be [0 ][j ];
55+ }
56+ for (i = 0 ; i < BE_TABLE_SIZE ; i ++ ) {
57+ crc = crc32table_be [0 ][i ];
58+ for (j = 1 ; j < 4 ; j ++ ) {
59+ crc = crc32table_be [0 ][(crc >> 24 ) & 0xff ] ^ (crc << 8 );
60+ crc32table_be [j ][i ] = crc ;
61+ }
4862 }
4963}
5064
51- static void output_table (uint32_t table [], int len , char * trans )
65+ static void output_table (uint32_t table [4 ][ 256 ], int len , char * trans )
5266{
53- int i ;
67+ int i , j ;
5468
55- for (i = 0 ; i < len - 1 ; i ++ ) {
56- if (i % ENTRIES_PER_LINE == 0 )
57- printf ("\n" );
58- printf ("%s(0x%8.8xL), " , trans , table [i ]);
69+ for (j = 0 ; j < 4 ; j ++ ) {
70+ printf ("{" );
71+ for (i = 0 ; i < len - 1 ; i ++ ) {
72+ if (i % ENTRIES_PER_LINE == 0 )
73+ printf ("\n" );
74+ printf ("%s(0x%8.8xL), " , trans , table [j ][i ]);
75+ }
76+ printf ("%s(0x%8.8xL)},\n" , trans , table [j ][len - 1 ]);
5977 }
60- printf ("%s(0x%8.8xL)\n" , trans , table [len - 1 ]);
6178}
6279
6380int main (int argc , char * * argv )
@@ -66,14 +83,14 @@ int main(int argc, char** argv)
6683
6784 if (CRC_LE_BITS > 1 ) {
6885 crc32init_le ();
69- printf ("static const u32 crc32table_le[] = {" );
86+ printf ("static const u32 crc32table_le[4][256 ] = {" );
7087 output_table (crc32table_le , LE_TABLE_SIZE , "tole" );
7188 printf ("};\n" );
7289 }
7390
7491 if (CRC_BE_BITS > 1 ) {
7592 crc32init_be ();
76- printf ("static const u32 crc32table_be[] = {" );
93+ printf ("static const u32 crc32table_be[4][256 ] = {" );
7794 output_table (crc32table_be , BE_TABLE_SIZE , "tobe" );
7895 printf ("};\n" );
7996 }
0 commit comments