Blame view
lib/gen_crc32table.c
3.25 KB
1da177e4c Linux-2.6.12-rc2 |
1 |
#include <stdio.h> |
324eb0f17 crc32: add slice-... |
2 |
#include "../include/generated/autoconf.h" |
1da177e4c Linux-2.6.12-rc2 |
3 4 5 6 |
#include "crc32defs.h" #include <inttypes.h> #define ENTRIES_PER_LINE 4 |
324eb0f17 crc32: add slice-... |
7 8 9 |
#if CRC_LE_BITS > 8 # define LE_TABLE_ROWS (CRC_LE_BITS/8) # define LE_TABLE_SIZE 256 |
9a1dbf6a2 crc32: make CRC_*... |
10 |
#else |
324eb0f17 crc32: add slice-... |
11 12 |
# define LE_TABLE_ROWS 1 # define LE_TABLE_SIZE (1 << CRC_LE_BITS) |
9a1dbf6a2 crc32: make CRC_*... |
13 |
#endif |
324eb0f17 crc32: add slice-... |
14 15 16 |
#if CRC_BE_BITS > 8 # define BE_TABLE_ROWS (CRC_BE_BITS/8) # define BE_TABLE_SIZE 256 |
9a1dbf6a2 crc32: make CRC_*... |
17 |
#else |
324eb0f17 crc32: add slice-... |
18 19 |
# define BE_TABLE_ROWS 1 # define BE_TABLE_SIZE (1 << CRC_BE_BITS) |
9a1dbf6a2 crc32: make CRC_*... |
20 |
#endif |
1da177e4c Linux-2.6.12-rc2 |
21 |
|
324eb0f17 crc32: add slice-... |
22 23 |
static uint32_t crc32table_le[LE_TABLE_ROWS][256]; static uint32_t crc32table_be[BE_TABLE_ROWS][256]; |
46c5801ea crc32: bolt on cr... |
24 |
static uint32_t crc32ctable_le[LE_TABLE_ROWS][256]; |
1da177e4c Linux-2.6.12-rc2 |
25 26 27 28 29 30 31 32 |
/** * crc32init_le() - allocate and initialize LE table data * * crc is the crc of the byte i; other entries are filled in based on the * fact that crctable[i^j] = crctable[i] ^ crctable[j]. * */ |
46c5801ea crc32: bolt on cr... |
33 34 |
static void crc32init_le_generic(const uint32_t polynomial, uint32_t (*tab)[256]) |
1da177e4c Linux-2.6.12-rc2 |
35 36 37 |
{ unsigned i, j; uint32_t crc = 1; |
46c5801ea crc32: bolt on cr... |
38 |
tab[0][0] = 0; |
1da177e4c Linux-2.6.12-rc2 |
39 |
|
9a1dbf6a2 crc32: make CRC_*... |
40 |
for (i = LE_TABLE_SIZE >> 1; i; i >>= 1) { |
46c5801ea crc32: bolt on cr... |
41 |
crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0); |
1da177e4c Linux-2.6.12-rc2 |
42 |
for (j = 0; j < LE_TABLE_SIZE; j += 2 * i) |
46c5801ea crc32: bolt on cr... |
43 |
tab[0][i + j] = crc ^ tab[0][j]; |
836e2af92 crc32: major opti... |
44 45 |
} for (i = 0; i < LE_TABLE_SIZE; i++) { |
46c5801ea crc32: bolt on cr... |
46 |
crc = tab[0][i]; |
324eb0f17 crc32: add slice-... |
47 |
for (j = 1; j < LE_TABLE_ROWS; j++) { |
46c5801ea crc32: bolt on cr... |
48 49 |
crc = tab[0][crc & 0xff] ^ (crc >> 8); tab[j][i] = crc; |
836e2af92 crc32: major opti... |
50 |
} |
1da177e4c Linux-2.6.12-rc2 |
51 52 |
} } |
46c5801ea crc32: bolt on cr... |
53 54 55 56 57 58 59 60 61 |
static void crc32init_le(void) { crc32init_le_generic(CRCPOLY_LE, crc32table_le); } static void crc32cinit_le(void) { crc32init_le_generic(CRC32C_POLY_LE, crc32ctable_le); } |
1da177e4c Linux-2.6.12-rc2 |
62 63 64 65 66 67 68 |
/** * crc32init_be() - allocate and initialize BE table data */ static void crc32init_be(void) { unsigned i, j; uint32_t crc = 0x80000000; |
836e2af92 crc32: major opti... |
69 |
crc32table_be[0][0] = 0; |
1da177e4c Linux-2.6.12-rc2 |
70 71 72 73 |
for (i = 1; i < BE_TABLE_SIZE; i <<= 1) { crc = (crc << 1) ^ ((crc & 0x80000000) ? CRCPOLY_BE : 0); for (j = 0; j < i; j++) |
836e2af92 crc32: major opti... |
74 75 76 77 |
crc32table_be[0][i + j] = crc ^ crc32table_be[0][j]; } for (i = 0; i < BE_TABLE_SIZE; i++) { crc = crc32table_be[0][i]; |
324eb0f17 crc32: add slice-... |
78 |
for (j = 1; j < BE_TABLE_ROWS; j++) { |
836e2af92 crc32: major opti... |
79 80 81 |
crc = crc32table_be[0][(crc >> 24) & 0xff] ^ (crc << 8); crc32table_be[j][i] = crc; } |
1da177e4c Linux-2.6.12-rc2 |
82 83 |
} } |
324eb0f17 crc32: add slice-... |
84 |
static void output_table(uint32_t (*table)[256], int rows, int len, char *trans) |
1da177e4c Linux-2.6.12-rc2 |
85 |
{ |
836e2af92 crc32: major opti... |
86 |
int i, j; |
1da177e4c Linux-2.6.12-rc2 |
87 |
|
324eb0f17 crc32: add slice-... |
88 |
for (j = 0 ; j < rows; j++) { |
836e2af92 crc32: major opti... |
89 90 91 92 93 94 95 96 97 |
printf("{"); for (i = 0; i < len - 1; i++) { if (i % ENTRIES_PER_LINE == 0) printf(" "); printf("%s(0x%8.8xL), ", trans, table[j][i]); } printf("%s(0x%8.8xL)}, ", trans, table[j][len - 1]); |
1da177e4c Linux-2.6.12-rc2 |
98 |
} |
1da177e4c Linux-2.6.12-rc2 |
99 100 101 102 103 104 105 106 107 108 |
} int main(int argc, char** argv) { printf("/* this file is generated - do not edit */ "); if (CRC_LE_BITS > 1) { crc32init_le(); |
f5e38b928 lib: crc32: const... |
109 |
printf("static const u32 ____cacheline_aligned " |
324eb0f17 crc32: add slice-... |
110 111 112 113 |
"crc32table_le[%d][%d] = {", LE_TABLE_ROWS, LE_TABLE_SIZE); output_table(crc32table_le, LE_TABLE_ROWS, LE_TABLE_SIZE, "tole"); |
1da177e4c Linux-2.6.12-rc2 |
114 115 116 117 118 119 |
printf("}; "); } if (CRC_BE_BITS > 1) { crc32init_be(); |
f5e38b928 lib: crc32: const... |
120 |
printf("static const u32 ____cacheline_aligned " |
324eb0f17 crc32: add slice-... |
121 122 123 124 |
"crc32table_be[%d][%d] = {", BE_TABLE_ROWS, BE_TABLE_SIZE); output_table(crc32table_be, LE_TABLE_ROWS, BE_TABLE_SIZE, "tobe"); |
1da177e4c Linux-2.6.12-rc2 |
125 126 127 |
printf("}; "); } |
46c5801ea crc32: bolt on cr... |
128 129 |
if (CRC_LE_BITS > 1) { crc32cinit_le(); |
f5e38b928 lib: crc32: const... |
130 |
printf("static const u32 ____cacheline_aligned " |
46c5801ea crc32: bolt on cr... |
131 132 133 134 135 136 137 |
"crc32ctable_le[%d][%d] = {", LE_TABLE_ROWS, LE_TABLE_SIZE); output_table(crc32ctable_le, LE_TABLE_ROWS, LE_TABLE_SIZE, "tole"); printf("}; "); } |
1da177e4c Linux-2.6.12-rc2 |
138 139 140 |
return 0; } |