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.

tests/decompiler_fixtures/src/49_crc32.c source
#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/3
crc32_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/3
crc32_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/3
crc32_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/3
crc32_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;
}

← 213 fixtures