summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Buren <braewoods+rb@braewoods.net>2021-07-13 16:18:32 +0000
committerWilliam Wilgus <me.theuser@yahoo.com>2021-07-18 05:17:31 +0000
commit64a24591aec049682167b193700a07572fc04c4c (patch)
treea42bfabcb60f39fe8417064c9d52f3bbe87174a5
parentcd17decd5a35c9b506bf8433ae56dda00f65ad61 (diff)
downloadrockbox-64a24591aec049682167b193700a07572fc04c4c.tar.gz
rockbox-64a24591aec049682167b193700a07572fc04c4c.zip
crc32: add fast variant of regular crc_32r function
This relies on a macro, CRC32R_FAST, to select which version to compile with. In tests the fast version is 2x faster at the expense of requiring 960 more bytes for the lookup table. For now the default is the space optimized version but in the future I would like to enable this for ports where we can afford the extra storage and/or memory requirements. Change-Id: I25397dadedc3187bb02b2444f8b8ded77c2509b6
-rw-r--r--firmware/common/crc32.c71
1 files changed, 65 insertions, 6 deletions
diff --git a/firmware/common/crc32.c b/firmware/common/crc32.c
index 37e113f538..d4c7cfb795 100644
--- a/firmware/common/crc32.c
+++ b/firmware/common/crc32.c
@@ -19,8 +19,6 @@
19 * 19 *
20 ****************************************************************************/ 20 ****************************************************************************/
21 21
22/* Code copied from firmware_flash plugin. */
23
24#include "crc32.h" 22#include "crc32.h"
25#include "config.h" 23#include "config.h"
26 24
@@ -118,17 +116,77 @@ uint32_t crc_32(const void *src, uint32_t len, uint32_t crc32)
118} 116}
119#endif 117#endif
120 118
121/* crc_32r (derived from tinf crc32 which was taken from zlib) 119/* Tool function to calculate a CRC32 (reversed polynomial) across some buffer */
122 * CRC32 algorithm taken from the zlib source, which is 120/* third argument is either the starting value or value from last piece */
123 * Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler 121/* speed optimized version */
124 */ 122#ifdef CRC32R_FAST
123uint32_t crc_32r(const void *src, uint32_t len, uint32_t crc32)
124{
125 const unsigned char *buf = (const unsigned char *)src;
126
127 /* crc_32r (derived from recent zlib crc32)
128 * CRC32 algorithm taken from the zlib source, which is
129 * Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
130 */
131
132 /* reversed polynomial from other crc32 function -- 0xEDB88320 */
133 static const unsigned crc32_lookup[256] = {
134 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
135 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
136 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
137 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
138 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
139 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
140 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
141 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
142 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
143 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
144 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
145 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
146 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
147 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
148 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
149 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
150 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
151 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
152 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
153 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
154 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
155 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
156 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
157 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
158 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
159 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
160 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
161 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
162 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
163 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
164 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
165 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
166 };
167
168 while (len--) {
169 crc32 = (crc32_lookup[(crc32 ^ *buf) & 0xff] ^ (crc32 >> 8));
170 buf++;
171 }
172
173 return crc32;
174}
175#endif
125 176
126/* Tool function to calculate a CRC32 (reversed polynomial) across some buffer */ 177/* Tool function to calculate a CRC32 (reversed polynomial) across some buffer */
127/* third argument is either the starting value or value from last piece */ 178/* third argument is either the starting value or value from last piece */
179/* space optimized version */
180#ifndef CRC32R_FAST
128uint32_t crc_32r(const void *src, uint32_t len, uint32_t crc32) 181uint32_t crc_32r(const void *src, uint32_t len, uint32_t crc32)
129{ 182{
130 const unsigned char* buf = src; 183 const unsigned char* buf = src;
131 184
185 /* crc_32r (derived from tinf crc32 which was taken from zlib)
186 * CRC32 algorithm taken from the zlib source, which is
187 * Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
188 */
189
132 /* reversed polynomial from other crc32 function -- 0xEDB88320 */ 190 /* reversed polynomial from other crc32 function -- 0xEDB88320 */
133 static const unsigned crc32_lookup[16] = 191 static const unsigned crc32_lookup[16] =
134 { 192 {
@@ -147,3 +205,4 @@ uint32_t crc_32r(const void *src, uint32_t len, uint32_t crc32)
147 205
148 return crc32; 206 return crc32;
149} 207}
208#endif