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