Fixture 49
crc32
C · 3 functions · 4 lanes · 11 of 12 function-lanes behave identically
One lane has a function that returns a different result after decompilation: clang-O2 (2/3).
Table-driven CRC-32 (reflected, polynomial 0xEDB88320) alongside the bitwise reference and an Internet checksum. The table is built on the stack each call, so a 256-entry initializer loop precedes the data loop.
#include <stdint.h>
/* Table-driven CRC-32 (reflected, polynomial 0xEDB88320) alongside the
* bitwise reference and an Internet checksum. The table is built on the stack
* each call, so a 256-entry initializer loop precedes the data loop. */
#define CRC_MAX 16
__attribute__((noinline)) uint32_t
crc32_bitwise(const uint8_t *data, int32_t length) {
uint32_t crc = 0xFFFFFFFFu;
int32_t index;
int32_t bit;
if (data == 0 || length < 0 || length > CRC_MAX) {
return 0;
}
for (index = 0; index < length; ++index) {
crc ^= (uint32_t)data[index];
for (bit = 0; bit < 8; ++bit) {
uint32_t mask = (uint32_t)(-(int32_t)(crc & 1u));
crc = (crc >> 1) ^ (0xEDB88320u & mask);
}
}
return ~crc;
}
__attribute__((noinline)) uint32_t
crc32_table_driven(const uint8_t *data, int32_t length) {
uint32_t table[256];
uint32_t crc = 0xFFFFFFFFu;
uint32_t entry;
int32_t index;
int32_t bit;
if (data == 0 || length < 0 || length > CRC_MAX) {
return 0;
}
for (index = 0; index < 256; ++index) {
entry = (uint32_t)index;
for (bit = 0; bit < 8; ++bit) {
uint32_t mask = (uint32_t)(-(int32_t)(entry & 1u));
entry = (entry >> 1) ^ (0xEDB88320u & mask);
}
table[index] = entry;
}
for (index = 0; index < length; ++index) {
crc = table[(crc ^ (uint32_t)data[index]) & 0xFFu] ^ (crc >> 8);
}
return ~crc;
}
__attribute__((noinline)) uint32_t
internet_checksum(const uint8_t *data, int32_t length) {
uint32_t sum = 0;
int32_t index;
if (data == 0 || length < 0 || length > CRC_MAX) {
return 0;
}
for (index = 0; index + 1 < length; index += 2) {
sum += ((uint32_t)data[index] << 8) | (uint32_t)data[index + 1];
}
if ((length % 2) != 0) {
sum += (uint32_t)data[length - 1] << 8;
}
while ((sum >> 16) != 0u) {
sum = (sum & 0xFFFFu) + (sum >> 16);
}
return (~sum) & 0xFFFFu;
} Recovered C
Generated by glaurung decompile --style decbench at b47f6b43.
baseline.json records the result after recompiling the C and calling it beside the
original with seeded inputs.
clang -O2
2/3crc32_bitwise pass 44 lines
// glaurung: crc32_bitwise @ 0x1100
uint32_t crc32_bitwise(const uint8_t * arg0, int32_t arg1) {
int index;
int bit;
unsigned int crc;
unsigned int mask;
long ret;
long var11;
long var18;
long var28;
long var3;
long var38;
long var48;
long var58;
long var68;
long var7;
long var78;
long var93;
ret = 0;
if (((unsigned long)(15) < (unsigned long)((unsigned long)((unsigned int)((arg1 - 1)))))) {
return ret;
}
ret = 0;
if ((arg0 == 0)) {
return ret;
}
var3 = (unsigned long)((unsigned int)(arg1));
var7 = 0xffffffff;
index = 0;
do {
var11 = (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)(((long)arg0 + index)))) ^ var7)));
var18 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var11)) >> 1)));
var28 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var11)) & 1)))) & -0x12477ce0LL))) ^ var18))) >> 1)));
var38 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)((var18 & 1)))) & -0x12477ce0LL))) ^ var28))) >> 1)));
var48 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)((var28 & 1)))) & -0x12477ce0LL))) ^ var38))) >> 1)));
var58 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)((var38 & 1)))) & -0x12477ce0LL))) ^ var48))) >> 1)));
var68 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)((var48 & 1)))) & -0x12477ce0LL))) ^ var58))) >> 1)));
var78 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)((var58 & 1)))) & -0x12477ce0LL))) ^ var68))) >> 1)));
var93 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)((var78 & 1)))) & -0x12477ce0LL))) ^ (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)((var68 & 1)))) & -0x12477ce0LL))) ^ var78))) >> 1))))));
index = (index + 1);
var7 = var93;
} while ((var3 != index));
return (~var93);
} crc32_table_driven pass 149 lines
// glaurung: crc32_table_driven @ 0x11d0
__attribute__((no_stack_protector)) uint32_t crc32_table_driven(const uint8_t * arg0, int32_t arg1) {
int index;
unsigned int crc;
unsigned char local_408[1032];
long ret;
int var10;
int var11;
int var119;
int var12;
int var120;
int var121;
int var122;
int var13;
int var14;
int var144;
int var145;
int var146;
int var147;
int var15;
int var16;
int var169;
int var17;
int var170;
int var171;
int var172;
int var18;
int var19;
int var194;
int var195;
int var196;
int var197;
int var2;
long var232;
long var235;
long var239;
long var248;
long var257;
long var258;
long var262;
int var3;
int var4;
int var44;
int var45;
int var46;
int var47;
int var5;
int var69;
long var7;
int var70;
int var71;
int var72;
int var8;
int var9;
int var94;
int var95;
int var96;
int var97;
ret = 0;
if ((arg0 == 0)) {
return ret;
}
ret = 0;
if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
return ret;
}
var2 = 0;
var3 = 1;
var4 = 2;
var5 = 3;
ret = 1;
var7 = 0;
var8 = 1;
var9 = 1;
var10 = 1;
var11 = 1;
var12 = 0xedb88320;
var13 = 0xedb88320;
var14 = 0xedb88320;
var15 = 0xedb88320;
var16 = 4;
var17 = 4;
var18 = 4;
var19 = 4;
do {
var44 = ((unsigned int)(var2) >> 1);
var45 = ((unsigned int)(var3) >> 1);
var46 = ((unsigned int)(var4) >> 1);
var47 = ((unsigned int)(var5) >> 1);
var69 = ((unsigned int)((((0 - (var2 & var8)) & var12) ^ var44)) >> 1);
var70 = ((unsigned int)((((0 - (var3 & var9)) & var13) ^ var45)) >> 1);
var71 = ((unsigned int)((((0 - (var4 & var10)) & var14) ^ var46)) >> 1);
var72 = ((unsigned int)((((0 - (var5 & var11)) & var15) ^ var47)) >> 1);
var94 = ((unsigned int)((((0 - (var44 & var8)) & var12) ^ var69)) >> 1);
var95 = ((unsigned int)((((0 - (var45 & var9)) & var13) ^ var70)) >> 1);
var96 = ((unsigned int)((((0 - (var46 & var10)) & var14) ^ var71)) >> 1);
var97 = ((unsigned int)((((0 - (var47 & var11)) & var15) ^ var72)) >> 1);
var119 = ((unsigned int)((((0 - (var69 & var8)) & var12) ^ var94)) >> 1);
var120 = ((unsigned int)((((0 - (var70 & var9)) & var13) ^ var95)) >> 1);
var121 = ((unsigned int)((((0 - (var71 & var10)) & var14) ^ var96)) >> 1);
var122 = ((unsigned int)((((0 - (var72 & var11)) & var15) ^ var97)) >> 1);
var144 = ((unsigned int)((((0 - (var94 & var8)) & var12) ^ var119)) >> 1);
var145 = ((unsigned int)((((0 - (var95 & var9)) & var13) ^ var120)) >> 1);
var146 = ((unsigned int)((((0 - (var96 & var10)) & var14) ^ var121)) >> 1);
var147 = ((unsigned int)((((0 - (var97 & var11)) & var15) ^ var122)) >> 1);
var169 = ((unsigned int)((((0 - (var119 & var8)) & var12) ^ var144)) >> 1);
var170 = ((unsigned int)((((0 - (var120 & var9)) & var13) ^ var145)) >> 1);
var171 = ((unsigned int)((((0 - (var121 & var10)) & var14) ^ var146)) >> 1);
var172 = ((unsigned int)((((0 - (var122 & var11)) & var15) ^ var147)) >> 1);
var194 = ((unsigned int)((((0 - (var144 & var8)) & var12) ^ var169)) >> 1);
var195 = ((unsigned int)((((0 - (var145 & var9)) & var13) ^ var170)) >> 1);
var196 = ((unsigned int)((((0 - (var146 & var10)) & var14) ^ var171)) >> 1);
var197 = ((unsigned int)((((0 - (var147 & var11)) & var15) ^ var172)) >> 1);
*(int *)((&local_408[0] + (var7 * 4))) = (((0 - (var194 & var8)) & var12) ^ ((unsigned int)((((0 - (var169 & var8)) & var12) ^ var194)) >> 1));
*(int *)((&local_408[0] + ((var7 * 4) + 4))) = (((0 - (var195 & var9)) & var13) ^ ((unsigned int)((((0 - (var170 & var9)) & var13) ^ var195)) >> 1));
*(int *)((&local_408[0] + ((var7 * 4) + 8))) = (((0 - (var196 & var10)) & var14) ^ ((unsigned int)((((0 - (var171 & var10)) & var14) ^ var196)) >> 1));
*(int *)((&local_408[0] + ((var7 * 4) + 12))) = (((0 - (var197 & var11)) & var15) ^ ((unsigned int)((((0 - (var172 & var11)) & var15) ^ var197)) >> 1));
var7 = (var7 + 4);
var2 = (var2 + var16);
var3 = (var3 + var17);
var4 = (var4 + var18);
var5 = (var5 + var19);
ret = ((unsigned long)((unsigned int)(var3)) | (unsigned long)((unsigned int)(var2)));
} while ((var7 != 256));
if ((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0))) {
return 0;
}
var232 = (unsigned long)((unsigned int)(arg1));
if (((unsigned long)((unsigned int)(arg1)) != 1)) {
var235 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var232)) & -2)));
index = 0;
var239 = 0xffffffff;
do {
var248 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var239)) >> 8))) ^ *(int *)((&local_408[0] + ((unsigned long)((unsigned int)(((unsigned int)((unsigned char)((var239 & 255))) ^ (unsigned int)((unsigned char)(*(char *)(((long)arg0 + index))))))) * 4))))));
var257 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var248)) >> 8))) ^ *(int *)((&local_408[0] + ((unsigned long)((unsigned int)(((unsigned int)((unsigned char)((var248 & 255))) ^ (unsigned int)((unsigned char)(*(char *)(((long)arg0 + index + 0x1))))))) * 4))))));
index = (index + 2);
var239 = var257;
var258 = (unsigned long)((unsigned int)(index));
} while ((var235 != index));
} else {
var257 = 0xffffffff;
var258 = 0;
}
var262 = var257;
if (((unsigned long)((unsigned char)((var232 & 1))) != 0)) {
var262 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var257)) >> 8))) ^ *(int *)((&local_408[0] + ((unsigned long)((unsigned int)(((unsigned int)((unsigned char)((var257 & 255))) ^ (unsigned int)((unsigned char)(*(char *)(((long)arg0 + var258))))))) * 4))))));
}
return (~var262);
} internet_checksum fail 126 lines
// glaurung: internet_checksum @ 0x1380
uint32_t internet_checksum(const uint8_t * arg0, int32_t arg1) {
extern long __unknown(long, ...);
int index;
unsigned int sum;
long ret;
long var10;
long var11;
long var13;
int var133;
int var134;
int var149;
int var15;
int var150;
int var16;
long var184;
long var185;
long var189;
long var190;
int var197;
long var20;
long var204;
long var205;
int var211;
int var22;
int var23;
int var24;
int var25;
int var27;
int var28;
int var29;
int var30;
long var4;
long var5;
long var6;
int var67;
int var68;
int var77;
int var78;
long var8;
ret = 0;
if ((arg0 == 0)) {
return ret;
}
ret = 0;
if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
return ret;
}
var4 = 0;
if (((unsigned long)(2) <= (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
var5 = (unsigned long)((unsigned int)(arg1));
var6 = ((unsigned long)((unsigned int)(arg1)) - 2);
if (((unsigned long)(14) <= (unsigned long)(var6))) {
var8 = (((unsigned long)(var6) >> 1) + 1);
var10 = (var8 & -8);
var11 = (var10 + var10);
var13 = ((var10 + var10) + 1);
var15 = 0;
var16 = 0;
var20 = 0;
var22 = 0;
var23 = 0;
var24 = 0;
var25 = 0;
var27 = 0;
var28 = 0;
var29 = 0;
var30 = 0;
do {
var67 = __unknown(0);
var68 = __unknown(0);
var77 = __unknown(0);
var78 = __unknown(0);
var133 = __unknown(0);
var134 = __unknown(0);
var22 = (var22 + (((unsigned int)((unsigned short)(var133)) | ((unsigned int)((unsigned short)(var15)) << 16)) | (((unsigned int)((unsigned short)(var67)) | ((unsigned int)((unsigned short)(var15)) << 16)) << 8)));
var23 = (var23 + (((unsigned int)((unsigned short)((((unsigned int)(var133) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var15) >> 16) & 0xffff))) << 16)) | (((unsigned int)((unsigned short)((((unsigned int)(var67) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var15) >> 16) & 0xffff))) << 16)) << 8)));
var24 = (var24 + (((unsigned int)((unsigned short)(var134)) | ((unsigned int)((unsigned short)(var16)) << 16)) | (((unsigned int)((unsigned short)(var68)) | ((unsigned int)((unsigned short)(var16)) << 16)) << 8)));
var25 = (var25 + (((unsigned int)((unsigned short)((((unsigned int)(var134) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var16) >> 16) & 0xffff))) << 16)) | (((unsigned int)((unsigned short)((((unsigned int)(var68) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var16) >> 16) & 0xffff))) << 16)) << 8)));
var149 = __unknown(0);
var150 = __unknown(0);
var27 = (var27 + (((unsigned int)((unsigned short)(var149)) | ((unsigned int)((unsigned short)(var15)) << 16)) | (((unsigned int)((unsigned short)(var77)) | ((unsigned int)((unsigned short)(var15)) << 16)) << 8)));
var28 = (var28 + (((unsigned int)((unsigned short)((((unsigned int)(var149) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var15) >> 16) & 0xffff))) << 16)) | (((unsigned int)((unsigned short)((((unsigned int)(var77) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var15) >> 16) & 0xffff))) << 16)) << 8)));
var29 = (var29 + (((unsigned int)((unsigned short)(var150)) | ((unsigned int)((unsigned short)(var16)) << 16)) | (((unsigned int)((unsigned short)(var78)) | ((unsigned int)((unsigned short)(var16)) << 16)) << 8)));
var30 = (var30 + (((unsigned int)((unsigned short)((((unsigned int)(var150) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var16) >> 16) & 0xffff))) << 16)) | (((unsigned int)((unsigned short)((((unsigned int)(var78) >> 16) & 0xffff))) | ((unsigned int)((unsigned short)((((unsigned int)(var16) >> 16) & 0xffff))) << 16)) << 8)));
ret = ((unsigned long)((unsigned int)(var28)) | (unsigned long)((unsigned int)(var27)));
var20 = (var20 + 8);
} while ((var10 != var20));
var184 = (unsigned long)((unsigned int)((((var30 + var25) + (var28 + var23)) + ((var29 + var24) + (var27 + var22)))));
var185 = var184;
var4 = var184;
if ((var8 == var10)) {
goto L_151d;
}
goto L_14f9;
} else {
var11 = 0;
var13 = 1;
var185 = 0;
L_14f9: ;
var189 = (var11 + 1);
var190 = var185;
do {
var197 = (var190 + (unsigned int)(((unsigned int)((unsigned char)(*(char *)(((long)arg0 + var13)))) | (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)(((long)arg0 + var189 - 0x1)))) << 8))))));
var190 = (unsigned long)((unsigned int)(var197));
var13 = (var13 + 2);
var189 = (var189 + 2);
var4 = (unsigned long)((unsigned int)(var197));
} while (((unsigned long)(var189) < (unsigned long)(var5)));
}
}
L_151d: ;
if (((unsigned long)((unsigned char)((arg1 & 1))) != 0)) {
var4 = (unsigned long)((unsigned int)((var4 + (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)((((long)(arg1) + (long)arg0) - 1)))) << 8))))));
}
var204 = var4;
if (((unsigned long)(0x10000) <= (unsigned long)((unsigned long)((unsigned int)(var4))))) {
var205 = var4;
do {
var211 = ((unsigned int)((unsigned short)((var205 & 0xffff))) + (unsigned int)(((unsigned long)((unsigned int)(var205)) >> 16)));
var205 = (unsigned long)((unsigned int)(var211));
var204 = (unsigned long)((unsigned int)(var211));
} while (((unsigned long)(0xffff) < (unsigned long)((unsigned long)((unsigned int)(var211)))));
}
return (unsigned int)((var204 ^ 0xffff));
} clang -O0
3/3crc32_bitwise pass 34 lines
// glaurung: crc32_bitwise @ 0x1100
uint32_t crc32_bitwise(const uint8_t * arg0, int32_t arg1) {
unsigned int crc;
int index;
int bit;
unsigned int mask;
int local_4;
// x86-64 prologue: save rbp
crc = -1;
if ((arg0 == 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
if (((long)(arg1) < 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
index = 0;
while ((index < arg1)) {
crc = ((unsigned int)((unsigned char)(arg0[index])) ^ crc);
for (bit = 0; ((long)(bit) < 8); bit++) {
mask = (0 - (unsigned int)((crc & 1)));
crc = ((unsigned int)(((unsigned int)(crc) >> 1)) ^ (unsigned int)((mask & -0x12477ce0LL)));
}
index = ((unsigned int)(index) + 1);
}
local_4 = (crc ^ -1);
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} crc32_table_driven pass 40 lines
// glaurung: crc32_table_driven @ 0x11d0
__attribute__((no_stack_protector)) uint32_t crc32_table_driven(const uint8_t * arg0, int32_t arg1) {
unsigned int crc;
int index;
unsigned int entry;
int bit;
unsigned int mask;
int local_4;
unsigned char local_420[1024];
// x86-64 prologue: save rbp, frame 960 bytes
crc = -1;
if ((arg0 == 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
if (((long)(arg1) < 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
index = 0;
while (((long)(index) < 256)) {
entry = index;
for (bit = 0; ((long)(bit) < 8); bit++) {
mask = (0 - (unsigned int)((entry & 1)));
entry = ((unsigned int)(((unsigned int)(entry) >> 1)) ^ (unsigned int)((mask & -0x12477ce0LL)));
}
*(int *)((&local_420[0] + ((long)(index) * 4))) = entry;
index = ((unsigned int)(index) + 1);
}
for (index = 0; (index < arg1); index++) {
crc = ((unsigned int)(*(int *)((&local_420[0] + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((crc ^ (unsigned int)((unsigned char)(arg0[index]))))) & 255))) * 4)))) ^ (unsigned int)(((unsigned int)(crc) >> 8)));
}
local_4 = (crc ^ -1);
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} internet_checksum pass 34 lines
// glaurung: internet_checksum @ 0x1340
uint32_t internet_checksum(const uint8_t * arg0, int32_t arg1) {
unsigned int sum;
int index;
int local_4;
// x86-64 prologue: save rbp
sum = 0;
if ((arg0 == 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
if (((long)(arg1) < 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
index = 0;
while (((long)((int)(((unsigned long)((unsigned int)(index)) + 1))) < (long)(arg1))) {
sum = ((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)((unsigned char)(arg0[index])) << 8))) | (unsigned int)((unsigned char)(arg0[(long)((int)(((unsigned long)((unsigned int)(index)) + 1)))])))) + sum);
index = ((unsigned int)(index) + 2);
}
if (((unsigned long)((unsigned int)(((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(arg1))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(arg1)))) % (int)(2))))) != 0)) {
sum = ((unsigned int)(((unsigned int)((unsigned char)(arg0[(long)((int)(((unsigned long)((unsigned int)(arg1)) - 1)))])) << 8)) + sum);
}
while (((unsigned long)((unsigned int)(((unsigned int)(sum) >> 16))) != 0)) {
sum = ((unsigned int)((sum & 0xffff)) + (unsigned int)(((unsigned int)(sum) >> 16)));
}
local_4 = ((unsigned int)((sum ^ -1)) & 0xffff);
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} gcc -O0
3/3crc32_bitwise pass 32 lines
// glaurung: crc32_bitwise @ 0x1119
uint32_t crc32_bitwise(const uint8_t * arg0, int32_t arg1) {
unsigned int crc;
int index;
int bit;
unsigned int mask;
// x86-64 prologue: save rbp
crc = -1;
if ((arg0 == 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
if (((long)(arg1) < 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
index = 0;
while ((index < arg1)) {
crc = (crc ^ (unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[index])) & 255))));
for (bit = 0; ((((unsigned long)((unsigned int)(bit)) == 7) | ((long)(bit) < 7)) != 0); bit++) {
mask = (-(unsigned long)((unsigned int)((crc & 1))));
crc = ((unsigned int)((mask & -0x12477ce0LL)) ^ (unsigned int)(((unsigned int)(crc) >> 1)));
}
index = (index + 1);
}
// x86-64 epilogue: restore rbp
return (~(unsigned long)(crc));
} crc32_table_driven pass 38 lines
// glaurung: crc32_table_driven @ 0x11ad
uint32_t crc32_table_driven(const uint8_t * arg0, int32_t arg1) {
extern __attribute__((noreturn)) void __stack_chk_fail(void);
unsigned int crc;
int index;
unsigned int entry;
int bit;
unsigned int mask;
unsigned char local_410[1024];
long local_8;
long ret;
// x86-64 prologue: save rbp, frame 1088 bytes
local_8 = (long)(0x28);
crc = -1;
if ((((arg0 == 0) || ((long)(arg1) < 0)) || (((unsigned long)((unsigned int)(arg1)) != 16) && (16 <= (long)(arg1))))) {
ret = 0;
} else {
index = 0;
while (((((unsigned long)((unsigned int)(index)) == 255) | ((long)(index) < 255)) != 0)) {
entry = index;
for (bit = 0; ((((unsigned long)((unsigned int)(bit)) == 7) | ((long)(bit) < 7)) != 0); bit++) {
mask = (-(unsigned long)((unsigned int)((entry & 1))));
entry = ((unsigned int)((mask & -0x12477ce0LL)) ^ (unsigned int)(((unsigned int)(entry) >> 1)));
}
*(int *)((&local_410[0] + ((long)(index) * 4))) = entry;
index = (index + 1);
}
for (index = 0; (index < arg1); index++) {
crc = ((unsigned int)(((unsigned int)(crc) >> 8)) ^ (unsigned int)(*(int *)((&local_410[0] + ((unsigned long)((unsigned int)((unsigned char)(((unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[index])) & 255))) ^ crc))) & 255)))) * 4)))));
}
ret = (~(unsigned long)(crc));
}
if ((local_8 != 0x28)) {
__stack_chk_fail();
}
// x86-64 epilogue: restore rbp
return ret;
} internet_checksum pass 37 lines
// glaurung: internet_checksum @ 0x130d
uint32_t internet_checksum(const uint8_t * arg0, int32_t arg1) {
unsigned int sum;
int index;
int var1;
// x86-64 prologue: save rbp
sum = 0;
if ((arg0 == 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
if (((long)(arg1) < 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) == 0)) {
// x86-64 epilogue: restore rbp
return 0;
}
index = 0;
while (1) {
var1 = ((unsigned int)(index) + 1);
if (((((unsigned int)(arg1) == (unsigned int)(var1)) | (arg1 < var1)) != 0)) {
break;
}
sum = (sum + (unsigned int)(((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[((long)(index) + 1)])) & 255))) | (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[index])) & 255))) << 8))))));
index = (index + 2);
}
if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) & 1))) != 0)) {
sum = (sum + (unsigned int)(((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[((long)(arg1) - 1)])) & 255))) << 8)));
}
while (((unsigned long)((unsigned int)(((unsigned int)(sum) >> 16))) != 0)) {
sum = ((unsigned int)(((unsigned int)(sum) >> 16)) + (unsigned int)((unsigned short)((sum & 0xffff))));
}
// x86-64 epilogue: restore rbp
return (unsigned int)((unsigned short)(((~(unsigned long)(sum)) & 0xffff)));
} gcc -O2
3/3crc32_bitwise pass 39 lines
// glaurung: crc32_bitwise @ 0x1120
uint32_t crc32_bitwise(const uint8_t * arg0, int32_t arg1) {
int bit;
unsigned int crc;
int index;
unsigned int mask;
long var2;
long var20;
int var21;
long var4;
long var5;
long var8;
long var9;
if ((arg0 == 0)) {
return 0;
}
if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
return 0;
}
if (((unsigned long)((unsigned int)(arg1)) == 0)) {
return 0;
}
var2 = (long)((((long)arg0 + (unsigned long)((unsigned int)((arg1 - 1)))) + 1));
var4 = 0xffffffff;
var5 = (long)arg0;
do {
var8 = (unsigned long)((unsigned int)((var4 ^ (unsigned int)((unsigned char)(*(char *)((var5)))))));
var9 = 8;
do {
var20 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)((var8 & 1)))) & -0x12477ce0LL))) ^ (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var8)) >> 1))))));
var21 = (var9 - 1);
var9 = (unsigned long)((unsigned int)(var21));
var8 = var20;
} while (((unsigned long)((unsigned int)(var21)) != 0));
var5 = (var5 + 1);
var4 = var20;
} while ((var2 != var5));
return (~var20);
} crc32_table_driven pass 56 lines
// glaurung: crc32_table_driven @ 0x1180
uint32_t crc32_table_driven(const uint8_t * arg0, int32_t arg1) {
extern __attribute__((noreturn)) void __stack_chk_fail(void);
int index;
int bit;
unsigned int crc;
unsigned int entry;
unsigned int mask;
long local_10;
unsigned char local_418[1024];
long var11;
long var12;
long var23;
int var24;
long var25;
long var29;
long var30;
long var31;
int var32;
long var5;
local_10 = (long)(0x28);
if (((arg0 == 0) || ((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1)))))) {
var5 = 0;
} else {
index = 0;
do {
var11 = 8;
var12 = (unsigned long)((unsigned int)(index));
do {
var23 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((-(unsigned long)((unsigned int)((var12 & 1)))) & -0x12477ce0LL))) ^ (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var12)) >> 1))))));
var24 = (var11 - 1);
var11 = (unsigned long)((unsigned int)(var24));
var12 = var23;
} while (((unsigned long)((unsigned int)(var24)) != 0));
*(int *)((&local_418[0] + (index * 4))) = var23;
var25 = ((unsigned long)((unsigned int)(index)) + 1);
index = var25;
} while ((var25 != 256));
var5 = var11;
if (((unsigned long)((unsigned int)(arg1)) != 0)) {
var29 = (long)((((long)arg0 + (unsigned long)((unsigned int)((arg1 - 1)))) + 1));
var30 = 0xffffffff;
var31 = (long)arg0;
do {
var32 = (unsigned int)((unsigned char)(*(char *)((var31))));
var31 = (var31 + 1);
var30 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var30)) >> 8))) ^ *(int *)((&local_418[0] + ((unsigned int)((unsigned char)(((unsigned long)((unsigned int)((var32 ^ var30))) & 255))) * 4))))));
} while ((var29 != var31));
var5 = (~var30);
}
}
if ((local_10 != 0x28)) {
__stack_chk_fail();
}
return (unsigned int)(var5);
} internet_checksum pass 76 lines
// glaurung: internet_checksum @ 0x1250
uint32_t internet_checksum(const uint8_t * arg0, int32_t arg1) {
int index;
unsigned int sum;
long var0;
long var12;
int var13;
int var14;
long var20;
long var21;
int var26;
long var27;
long var3;
int var30;
long var31;
long var32;
long var33;
int var39;
long var5;
long var9;
var0 = (long)arg0;
if ((arg0 == 0)) {
goto L_12d0;
}
if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
goto L_12d0;
}
var3 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) & 1)));
if ((((unsigned long)((unsigned int)(arg1)) == 1) | ((long)(arg1) < 1))) {
goto L_12d8;
}
var5 = (long)arg0;
var9 = (long)((((long)arg0 + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((arg1 - 2))) >> 1))) * 2)) + 2));
var12 = 0;
do {
var13 = (unsigned int)((unsigned char)(*(char *)((var5))));
var14 = (unsigned int)((unsigned char)(*(char *)((var5 + 0x1))));
var5 = (var5 + 2);
var12 = (unsigned long)((unsigned int)((var12 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var13 << 8))) | var14))))));
} while ((var9 != var5));
var20 = var12;
var21 = var12;
if (((unsigned long)((unsigned int)(var3)) == 0)) {
goto L_12bd;
}
L_129c: ;
var26 = (var20 + (unsigned int)(((unsigned int)((unsigned char)(*(char *)(((var0 + (long)(arg1)) - 1)))) << 8)));
var27 = (unsigned long)((unsigned int)(var26));
var30 = ((unsigned long)((unsigned int)(var26)) >> 16);
var31 = (unsigned long)((unsigned int)(var30));
var32 = (unsigned long)((unsigned int)(var26));
if (((unsigned long)((unsigned int)(var30)) == 0)) {
goto L_12c4;
}
var33 = var27;
L_12b8: ;
var21 = (unsigned long)((unsigned int)(((unsigned int)((unsigned short)((var33 & 0xffff))) + var31)));
L_12bd: ;
var39 = ((unsigned long)((unsigned int)(var21)) >> 16);
var31 = (unsigned long)((unsigned int)(var39));
var33 = var21;
var32 = var21;
if (((unsigned long)((unsigned int)(var39)) != 0)) {
goto L_12b8;
}
L_12c4: ;
return (unsigned int)((var32 ^ 0xffff));
L_12d0: ;
return 0;
L_12d8: ;
if (((unsigned long)((unsigned int)(var3)) == 0)) {
return 0xffff;
}
var20 = 0;
goto L_129c;
}