diff options
author | H. Peter Anvin <hpa@zytor.com> | 2009-07-16 10:20:14 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2009-07-16 10:20:14 -0400 |
commit | 395d3811143d61f6d0765e678d766185981aae97 (patch) | |
tree | ab5906857aa42ded87daae4dba0ec55c3fee10f5 /misc | |
parent | 80d0fd371f4d70d68ea76e60b79e0845544e230a (diff) | |
download | nasm-395d3811143d61f6d0765e678d766185981aae97.tar.gz nasm-395d3811143d61f6d0765e678d766185981aae97.tar.bz2 nasm-395d3811143d61f6d0765e678d766185981aae97.zip |
crcgen: utility program to generate CRC tables
Small utility program to generate CRC tables in both C and Perl
formats. Note: we don't actually need a true CRC, which is what this
generates. We may want to consider going to a "generalized CRC",
meaning a randomly generated set of 8 bytewise permutations. These
have the advantage of not being linear, while having the same software
implementation as a true CRC.
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'misc')
-rw-r--r-- | misc/crcgen.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/misc/crcgen.c b/misc/crcgen.c new file mode 100644 index 0000000..df8b0c3 --- /dev/null +++ b/misc/crcgen.c @@ -0,0 +1,47 @@ +#include <inttypes.h> +#include <stdio.h> + +int main(int argc, char *argv[]) +{ + /* Polynomial in bit-reversed notation */ + uint64_t poly; + uint64_t crctab[256], v; + int i, j; + + poly = strtoumax(argv[1], NULL, 0); + + printf("/* C */\n"); + printf("static const uint64_t crc64_tab[256] = {\n"); + for (i = 0; i < 256; i++) { + v = i; + for (j = 0; j < 8; j++) + v = (v >> 1) ^ ((v & 1) ? poly : 0); + crctab[i] = v; + } + + for (i = 0; i < 256; i += 2) { + printf(" /* %02x */ UINT64_C(0x%016"PRIx64"), " + "UINT64_C(0x%016"PRIx64")%s\n", + i, crctab[i], crctab[i+1], (i == 254) ? "" : ","); + } + printf("};\n\n"); + + printf("# perl\n"); + printf("@crc64_tab = (\n"); + for (i = 0; i < 256; i += 2) { + printf(" [0x%08"PRIx32", 0x%08"PRIx32"], " + "[0x%08"PRIx32", 0x%08"PRIx32"]%-1s # %02x\n", + (uint32_t)(crctab[i] >> 32), + (uint32_t)(crctab[i]), + (uint32_t)(crctab[i+1] >> 32), + (uint32_t)(crctab[i+1]), + (i == 254) ? "" : ",", + i); + } + printf(");\n"); + + return 0; +} + + + |