Universal_crc is a utility for generating optimized ANSI C code for CRC calculation. It is developed by Danjel McGougan <danjel.mcgougan@gmail.com> and is licensed under the GPL.
Download version 1.3a - source only
Download version 1.3a - source and win32 exe
Compile the source with "gcc -Os -o universal_crc universal_crc.c".
This is from the help text of the utility and serves as documentation:
universal_crc version 1.3a Copyright (C) 2011 Danjel McGougan <danjel.mcgougan@gmail.com> Usage: universal_crc <parameters> Parameters: -b <bits> | --bits=<bits> Number of bits in the CRC register, 1-64 is supported Mandatory parameter -p <polynomial> | --poly=<polynomial> CRC polynomial value; Coefficient of x^0 is bit 0 (LSB) of this value Coefficient of x^1 is bit 1 of this value, etc. Coefficient of x^<bits> is implied 1 Bit-reversed automatically if -r is used Mandatory parameter -i <init> | --init=<init> Initial value of the CRC register Not bit-reversed even if -r is used Default 0 if not specified -x <xor> | --xor=<xor> Value that is XORed to the final CRC register value Not bit-reversed even if -r is used Default 0 if not specified -r | --reverse Bit-reverse the CRC register (LSB is shifted out and MSB in) This also means that message bits are processed LSB first Default is not to reverse -n | --non-direct Shift in message bits into the CRC register and augment the message. This is equivalent to the direct method of not augmenting the message and XORing the message bits with the bits shifted out of the CRC register, but the initial CRC register value needs to be converted (if it is non-zero) for compatibility. Default is direct mode. -a <algorithm> | --algorithm=<algorithm> CRC algorithm to use: bit standard bit-at-a-time algorithm (default, smallest cache footprint) tab16 table-driven algorithm with small cache footprint (16 table entries) tab16i table-driven using two independent lookups (32 table entries) good for superscalar cores tab standard table-driven algorithm (256 table entries) tabw standard table-driven algorithm, word-at-a-time same as tab but reads 32 bits at a time from memory tabi table-driven algorithm, four independent lookups (1024 entries) good for superscalar cores inspired by crc32 algorithm in zlib originally by Rodney Brown tabiw table-driven algorithm, four independent lookups, word-at-a-time same as tabi but reads 32 bits at a time from memory --crc-type=<type> Use <type> as the unsigned integer type to hold the CRC value --tab-type=<type> Use <type> as the unsigned integer type to hold the CRC table entries --test Generate test code Examples: universal_crc -b 32 -p 0x04c11db7 -i 0xffffffff -x 0xffffffff -r (CRC used in i.e. Ethernet, commonly known as CRC-32) universal_crc -b 16 -p 0x1021 (CRC used in XMODEM/CRC) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
Here is some example output produced when invoking the utility like this:
universal_crc -b 32 -p 0x04c11db7 -i 0xffffffff -x 0xffffffff -r -a tab
The tabiw algorithm at around 2 CPU cycles per byte represents state of the art performance for software CRC calculation.
The generated CRC code was compiled using gcc 4.7.2 from Ubuntu 12.10 using optimization flag -O2.
bits algo cycles/byte ---- ---- ----------- 3 bit 41.00 5 bit 41.00 8 bit 41.00 13 bit 41.00 16 bit 41.00 23 bit 41.00 32 bit 41.00 49 bit 27.00 64 bit 27.00 3 tab16 13.12 5 tab16 13.00 8 tab16 13.00 13 tab16 12.12 16 tab16 12.13 23 tab16 13.00 32 tab16 13.00 49 tab16 12.13 64 tab16 12.13 3 tab16i 8.00 5 tab16i 8.00 8 tab16i 8.00 13 tab16i 10.00 16 tab16i 10.00 23 tab16i 10.12 32 tab16i 10.13 49 tab16i 9.12 64 tab16i 9.12 3 tab 6.12 5 tab 6.12 8 tab 6.12 13 tab 8.00 16 tab 8.00 23 tab 7.00 32 tab 7.00 49 tab 7.00 64 tab 7.00 3 tabw 5.13 5 tabw 5.13 8 tabw 5.13 13 tabw 6.25 16 tabw 6.25 23 tabw 5.06 32 tabw 5.06 49 tabw 5.06 64 tabw 5.06 3 tabi 3.08 5 tabi 3.08 8 tabi 3.08 13 tabi 3.26 16 tabi 3.27 23 tabi 3.73 32 tabi 3.73 49 tabi 4.28 64 tabi 4.28 3 tabiw 2.08 5 tabiw 2.08 8 tabiw 2.08 13 tabiw 1.77 16 tabiw 1.77 23 tabiw 2.27 32 tabiw 2.27 49 tabiw 2.57 64 tabiw 2.57
Bug reports or any kind of feedback is highly welcome! Contact me at danjel.mcgougan@gmail.com.