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