Fixture 43

base64

C · 2 functions · 4 lanes · 8 of 8 function-lanes behave identically

All 4 lanes recompile and return the same results as the original.

Base64 encode and decode. Three input bytes become four 6-bit groups, so the shift/mask lattice crosses byte boundaries in both directions -- a precise test of sub-register width tracking.

tests/decompiler_fixtures/src/43_base64.c source
#include <stdint.h>

/* Base64 encode and decode.  Three input bytes become four 6-bit groups, so
 * the shift/mask lattice crosses byte boundaries in both directions -- a
 * precise test of sub-register width tracking. */

#define B64_INPUT_MAX 12
#define B64_OUTPUT_MAX 16

static uint8_t encode_symbol(uint32_t sextet) {
    if (sextet < 26u) {
        return (uint8_t)((uint32_t)'A' + sextet);
    }
    if (sextet < 52u) {
        return (uint8_t)((uint32_t)'a' + (sextet - 26u));
    }
    if (sextet < 62u) {
        return (uint8_t)((uint32_t)'0' + (sextet - 52u));
    }
    if (sextet == 62u) {
        return (uint8_t)'+';
    }
    return (uint8_t)'/';
}

static int32_t decode_symbol(uint8_t symbol) {
    if (symbol >= (uint8_t)'A' && symbol <= (uint8_t)'Z') {
        return (int32_t)symbol - 'A';
    }
    if (symbol >= (uint8_t)'a' && symbol <= (uint8_t)'z') {
        return (int32_t)symbol - 'a' + 26;
    }
    if (symbol >= (uint8_t)'0' && symbol <= (uint8_t)'9') {
        return (int32_t)symbol - '0' + 52;
    }
    if (symbol == (uint8_t)'+') {
        return 62;
    }
    if (symbol == (uint8_t)'/') {
        return 63;
    }
    return -1;
}

__attribute__((noinline)) int32_t
base64_encode(const uint8_t *input, int32_t length, uint8_t *output) {
    int32_t produced = 0;
    int32_t index = 0;
    if (input == 0 || output == 0 || length < 0 || length > B64_INPUT_MAX) {
        return -1;
    }
    while (index < length) {
        uint32_t group = (uint32_t)input[index] << 16;
        int32_t remaining = length - index;
        if (remaining > 1) {
            group |= (uint32_t)input[index + 1] << 8;
        }
        if (remaining > 2) {
            group |= (uint32_t)input[index + 2];
        }
        output[produced] = encode_symbol((group >> 18) & 0x3Fu);
        output[produced + 1] = encode_symbol((group >> 12) & 0x3Fu);
        output[produced + 2] =
            (remaining > 1) ? encode_symbol((group >> 6) & 0x3Fu) : (uint8_t)'=';
        output[produced + 3] =
            (remaining > 2) ? encode_symbol(group & 0x3Fu) : (uint8_t)'=';
        produced += 4;
        index += 3;
    }
    return produced;
}

__attribute__((noinline)) int32_t
base64_decode(const uint8_t *input, int32_t length, uint8_t *output) {
    int32_t produced = 0;
    int32_t index;
    if (input == 0 || output == 0 || length < 0 || length > B64_OUTPUT_MAX ||
        (length % 4) != 0) {
        return -1;
    }
    for (index = 0; index < length; index += 4) {
        int32_t a = decode_symbol(input[index]);
        int32_t b = decode_symbol(input[index + 1]);
        int32_t c = decode_symbol(input[index + 2]);
        int32_t d = decode_symbol(input[index + 3]);
        uint32_t group;
        int32_t pad = 0;
        if (a < 0 || b < 0) {
            return -2;
        }
        if (c < 0) {
            c = 0;
            pad += 1;
        }
        if (d < 0) {
            d = 0;
            pad += 1;
        }
        group = ((uint32_t)a << 18) | ((uint32_t)b << 12) |
                ((uint32_t)c << 6) | (uint32_t)d;
        output[produced] = (uint8_t)((group >> 16) & 0xFFu);
        produced += 1;
        if (pad < 2) {
            output[produced] = (uint8_t)((group >> 8) & 0xFFu);
            produced += 1;
        }
        if (pad < 1) {
            output[produced] = (uint8_t)(group & 0xFFu);
            produced += 1;
        }
    }
    return produced;
}

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 -O0

2/2
base64_decode pass 92 lines
// glaurung: base64_decode @ 0x1330
int32_t base64_decode(const uint8_t * arg0, int32_t arg1, uint8_t * arg2) {
    extern int decode_symbol(unsigned char);
    int produced;
    int index;
    int a;
    int b;
    int c;
    int d;
    int pad;
    unsigned int group;
    int local_4;
    int var16;
    int var23;
    int var30;
    int var4;
    long var5;
    long var60;
    int var9;
    produced = 0;
    if ((arg0 != 0)) {
        if ((arg2 != 0)) {
            if ((0 <= (long)(arg1))) {
                if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) != 0)) {
                    var4 = ((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)(4)));
                    if (((unsigned long)((unsigned int)(var4)) == 0)) {
                        goto L_1394;
                    }
                }
            }
        }
    }
    local_4 = -1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_1394: ;
    index = 0;
    var5 = (unsigned long)((unsigned int)(var4));
    L_139b: ;
    if ((arg1 <= index)) {
        goto L_1504;
    }
    var9 = decode_symbol((unsigned int)((unsigned char)(arg0[index])));
    a = var9;
    var16 = decode_symbol((unsigned int)((unsigned char)(arg0[(long)((int)(((unsigned long)((unsigned int)(index)) + 1)))])));
    b = var16;
    var23 = decode_symbol((unsigned int)((unsigned char)(arg0[(long)((int)(((unsigned long)((unsigned int)(index)) + 2)))])));
    c = var23;
    var30 = decode_symbol((unsigned int)((unsigned char)(arg0[(long)((int)(((unsigned long)((unsigned int)(index)) + 3)))])));
    d = var30;
    pad = 0;
    if ((0 <= (long)(a))) {
        if ((0 <= (long)(b))) {
            goto L_142d;
        }
    }
    local_4 = -2;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_142d: ;
    if (((long)(c) < 0)) {
        c = 0;
        pad = ((unsigned int)(pad) + 1);
    }
    if (((long)(d) < 0)) {
        d = 0;
        pad = ((unsigned int)(pad) + 1);
    }
    group = ((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(a)) << 18))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(b)) << 12)))))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(c)) << 6))))) | d);
    var60 = ((var5 & -256) | ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 16))) & 255))) & 255));
    arg2[produced] = var60;
    produced = ((unsigned int)(produced) + 1);
    if (((long)(pad) < 2)) {
        var60 = ((var60 & -256) | ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 8))) & 255))) & 255));
        arg2[produced] = var60;
        produced = ((unsigned int)(produced) + 1);
    }
    if (((long)(pad) < 1)) {
        var60 = ((var60 & -256) | ((unsigned long)((unsigned int)((group & 255))) & 255));
        arg2[produced] = var60;
        produced = ((unsigned int)(produced) + 1);
    }
    goto L_14f6;
    L_14f6: ;
    index = ((unsigned int)(index) + 4);
    var5 = var60;
    goto L_139b;
    L_1504: ;
    local_4 = produced;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
base64_encode pass 80 lines
// glaurung: base64_encode @ 0x1100
int32_t base64_encode(const uint8_t * arg0, int32_t arg1, uint8_t * arg2) {
    extern unsigned char encode_symbol(unsigned int);
    int produced;
    int index;
    unsigned int group;
    int remaining;
    int local_34;
    int local_38;
    int local_4;
    long var0;
    unsigned char var31;
    long var34;
    unsigned char var42;
    long var45;
    unsigned char var57;
    long var62;
    unsigned char var71;
    // x86-64 prologue: save rbp, frame 64 bytes
    produced = 0;
    index = 0;
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if ((arg2 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg1) < 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 12) | ((long)(arg1) < 12)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    var0 = (long)arg2;
    while ((index < arg1)) {
        group = ((unsigned int)((unsigned char)(arg0[index])) << 16);
        remaining = ((unsigned int)(arg1) - index);
        if (((((unsigned long)((unsigned int)(remaining)) == 1) | ((long)(remaining) < 1)) == 0)) {
            group = ((unsigned int)(((unsigned int)((unsigned char)(arg0[(long)((int)(((unsigned long)((unsigned int)(index)) + 1)))])) << 8)) | group);
        }
        if (((((unsigned long)((unsigned int)(remaining)) == 2) | ((long)(remaining) < 2)) == 0)) {
            group = ((unsigned int)((unsigned char)(arg0[(long)((int)(((unsigned long)((unsigned int)(index)) + 2)))])) | group);
        }
        var31 = encode_symbol((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 18))) & 63))));
        var34 = ((var0 & -256) | ((unsigned long)(var31) & 255));
        arg2[produced] = var34;
        var42 = encode_symbol((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 12))) & 63))));
        var45 = ((var34 & -256) | ((unsigned long)(var42) & 255));
        arg2[(long)((int)(((unsigned long)((unsigned int)(produced)) + 1)))] = var45;
        if ((((unsigned long)((unsigned int)(remaining)) == 1) | ((long)(remaining) < 1))) {
            local_34 = 61;
        } else {
            var57 = encode_symbol((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 6))) & 63))));
            local_34 = (unsigned char)((var57 & 255));
        }
        var62 = ((var45 & -256) | ((unsigned long)((unsigned int)(local_34)) & 255));
        arg2[(long)((int)(((unsigned long)((unsigned int)(produced)) + 2)))] = var62;
        if ((((unsigned long)((unsigned int)(remaining)) == 2) | ((long)(remaining) < 2))) {
            local_38 = 61;
        } else {
            var71 = encode_symbol((unsigned long)((unsigned int)((group & 63))));
            local_38 = (unsigned char)((var71 & 255));
        }
        var0 = ((var62 & -256) | ((unsigned long)((unsigned int)(local_38)) & 255));
        arg2[(long)((int)(((unsigned long)((unsigned int)(produced)) + 3)))] = var0;
        produced = ((unsigned int)(produced) + 4);
        index = ((unsigned int)(index) + 3);
    }
    local_4 = produced;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

clang -O2

2/2
base64_decode pass 154 lines
// glaurung: base64_decode @ 0x12d0
int32_t base64_decode(const uint8_t * arg0, int32_t arg1, uint8_t * arg2) {
    int produced;
    int index;
    int pad;
    int a;
    int b;
    int c;
    int d;
    long var0;
    int var10;
    int var101;
    long var114;
    long var119;
    long var120;
    long var14;
    long var3;
    int var30;
    long var34;
    int var50;
    long var54;
    long var6;
    long var7;
    int var70;
    long var74;
    long var90;
    var0 = 0xffffffff;
    produced = 0xffffffff;
    if (((unsigned long)((unsigned char)((arg1 & 3))) != 0)) {
        // x86-64 epilogue: tear down frame
        return produced;
    }
    produced = var0;
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        // x86-64 epilogue: tear down frame
        return produced;
    }
    produced = var0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return produced;
    }
    produced = var0;
    if ((arg2 == 0)) {
        // x86-64 epilogue: tear down frame
        return produced;
    }
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        // x86-64 epilogue: tear down frame
        return 0;
    }
    var3 = 62;
    var6 = 0;
    var7 = 0;
    goto L_1330;
    L_1320: ;
    index = (var6 + 4);
    var6 = (unsigned long)((unsigned int)(index));
    var7 = (unsigned long)((unsigned int)(produced));
    if ((arg1 <= index)) {
        // x86-64 epilogue: tear down frame
        return produced;
    }
    L_1330: ;
    var10 = (unsigned int)((unsigned char)(*(char *)(((long)arg0 + var6))));
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var10 - 65))) & 255)))) <= (unsigned long)(25))) {
        var14 = (unsigned long)((unsigned int)((var10 - 65)));
        goto L_1390;
    }
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var10 - 97))) & 255)))) <= (unsigned long)(25))) {
        var14 = (unsigned long)((unsigned int)((var10 - 71)));
        goto L_1390;
    }
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var10 - 48))) & 255)))) <= (unsigned long)(9))) {
        var14 = (unsigned long)((unsigned int)((var10 + 4)));
        goto L_1390;
    }
    var14 = (unsigned long)((unsigned int)((((unsigned long)((unsigned char)((var10 & 255))) == 43) ? var3 : (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((((unsigned long)((unsigned char)((var10 & 255))) == 47) << 6))) - 1))))));
    L_1390: ;
    var30 = (unsigned int)((unsigned char)(*(char *)(((long)arg0 + var6 + 0x1))));
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var30 - 65))) & 255)))) <= (unsigned long)(25))) {
        var34 = (unsigned long)((unsigned int)((var30 - 65)));
        goto L_13f0;
    }
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var30 - 97))) & 255)))) <= (unsigned long)(25))) {
        var34 = (unsigned long)((unsigned int)((var30 - 71)));
        goto L_13f0;
    }
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var30 - 48))) & 255)))) <= (unsigned long)(9))) {
        var34 = (unsigned long)((unsigned int)((var30 + 4)));
        goto L_13f0;
    }
    var34 = (unsigned long)((unsigned int)((((unsigned long)((unsigned char)((var30 & 255))) == 43) ? var3 : (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((((unsigned long)((unsigned char)((var30 & 255))) == 47) << 6))) - 1))))));
    L_13f0: ;
    var50 = (unsigned int)((unsigned char)(*(char *)(((long)arg0 + var6 + 0x2))));
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var50 - 65))) & 255)))) <= (unsigned long)(25))) {
        var54 = (unsigned long)((unsigned int)((var50 - 65)));
        goto L_1450;
    }
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var50 - 97))) & 255)))) <= (unsigned long)(25))) {
        var54 = (unsigned long)((unsigned int)((var50 - 71)));
        goto L_1450;
    }
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var50 - 48))) & 255)))) <= (unsigned long)(9))) {
        var54 = (unsigned long)((unsigned int)((var50 + 4)));
        goto L_1450;
    }
    var54 = (unsigned long)((unsigned int)((((unsigned long)((unsigned char)((var50 & 255))) == 43) ? var3 : (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((((unsigned long)((unsigned char)((var50 & 255))) == 47) << 6))) - 1))))));
    L_1450: ;
    var70 = (unsigned int)((unsigned char)(*(char *)(((long)arg0 + var6 + 0x3))));
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var70 - 65))) & 255)))) <= (unsigned long)(25))) {
        var74 = (unsigned long)((unsigned int)((var70 - 65)));
        goto L_14b0;
    }
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var70 - 97))) & 255)))) <= (unsigned long)(25))) {
        var74 = (unsigned long)((unsigned int)((var70 - 71)));
        goto L_14b0;
    }
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var70 - 48))) & 255)))) <= (unsigned long)(9))) {
        var74 = (unsigned long)((unsigned int)((var70 + 4)));
        goto L_14b0;
    }
    var74 = (unsigned long)((unsigned int)((((unsigned long)((unsigned char)((var70 & 255))) == 43) ? var3 : (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((((unsigned long)((unsigned char)((var70 & 255))) == 47) << 6))) - 1))))));
    L_14b0: ;
    var90 = 0xfffffffe;
    produced = 0xfffffffe;
    if (((long)((int)(var14)) < 0)) {
        // x86-64 epilogue: tear down frame
        return produced;
    }
    produced = var90;
    if (((long)((int)(var34)) < 0)) {
        // x86-64 epilogue: tear down frame
        return produced;
    }
    var101 = ((unsigned int)(((unsigned long)((unsigned int)(var74)) >> 31)) + (unsigned int)(((unsigned long)((unsigned int)(var54)) >> 31)));
    pad = (unsigned long)((unsigned int)(var101));
    var114 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((((0 <= (long)((int)(var54))) ? var54 : 0) << 6))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var34 << 12))) | (unsigned long)((unsigned int)((var14 << 18)))))) | ((0 <= (long)((int)(var74))) ? var74 : 0)))))));
    var119 = (long)((int)(var7));
    arg2[(long)((int)(var7))] = ((unsigned long)((unsigned int)(var114)) >> 16);
    produced = ((long)((int)(var7)) + 1);
    if (((unsigned long)(1) < (unsigned long)((unsigned long)((unsigned int)(var101))))) {
        goto L_1320;
    }
    *(signed char *)(((long)arg2 + produced)) = ((unsigned long)(var114) >> 8);
    var120 = (var119 + 2);
    produced = (unsigned long)((unsigned int)(var120));
    if (((unsigned long)((unsigned int)(pad)) != 0)) {
        goto L_1320;
    }
    *(signed char *)(((long)arg2 + var120)) = var114;
    produced = (unsigned long)((unsigned int)((var7 + 3)));
    goto L_1320;
}
base64_encode pass 138 lines
// glaurung: base64_encode @ 0x1100
int32_t base64_encode(const uint8_t * arg0, int32_t arg1, uint8_t * arg2) {
    int produced;
    unsigned int group;
    int index;
    long ret;
    long var10;
    long var12;
    long var15;
    long var2;
    long var28;
    long var3;
    long var34;
    long var43;
    long var49;
    long var54;
    long var56;
    long var62;
    long var72;
    long var74;
    long var8;
    long var82;
    long var9;
    ret = 0xffffffff;
    if (((unsigned long)(12) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        return ret;
    }
    ret = 0xffffffff;
    if ((arg0 == 0)) {
        return ret;
    }
    ret = 0xffffffff;
    if ((arg2 == 0)) {
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        return 0;
    }
    var2 = (unsigned long)((unsigned int)(arg1));
    var3 = (unsigned long)((unsigned int)((arg1 - 2)));
    var8 = 0;
    var9 = var10;
    produced = 0;
    var12 = (unsigned long)((unsigned int)(arg1));
    do {
        var15 = (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)(((long)arg0 + var8)))) << 16)));
        group = var15;
        if (((long)((int)(var12)) < 2)) {
            L_117a: ;
            var9 = 0;
        } else {
            group = (unsigned long)((unsigned int)((var15 | (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)(((long)arg0 + var8 + 0x1)))) << 8))))));
            if (((unsigned int)(var3) != (unsigned int)(var8))) {
                group = (unsigned long)((unsigned int)((group | (unsigned int)((unsigned char)(*(char *)(((long)arg0 + var8 + 0x2)))))));
                var9 = 1;
            } else {
                goto L_117a;
            }
        }
        var28 = (unsigned long)((unsigned int)(((unsigned int)(group) >> 18)));
        if (((unsigned long)(25) < (unsigned long)((unsigned long)((unsigned int)(var28))))) {
            if (((unsigned long)(51) < (unsigned long)((unsigned long)((unsigned int)(var28))))) {
                if (((unsigned long)(61) < (unsigned long)((unsigned long)((unsigned int)(var28))))) {
                    var34 = ((((((unsigned long)((unsigned int)(var28)) != 62) << 2) & 255) | 43) & 255);
                } else {
                    var34 = (((var28 & 255) - 4) & 255);
                }
            } else {
                var34 = (((var28 & 255) + 71) & 255);
            }
        } else {
            var34 = (((var28 & 255) + 65) & 255);
        }
        *(signed char *)(((long)arg2 + produced)) = var34;
        var43 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 12))) & 63)));
        if (((unsigned long)(25) < (unsigned long)((unsigned long)((unsigned int)(var43))))) {
            if (((unsigned long)(51) < (unsigned long)((unsigned long)((unsigned int)(var43))))) {
                if (((unsigned long)(61) < (unsigned long)((unsigned long)((unsigned int)(var43))))) {
                    var49 = ((((((unsigned long)((unsigned int)(var43)) != 62) << 2) & 255) | 43) & 255);
                } else {
                    var49 = (((var43 & 255) - 4) & 255);
                }
            } else {
                var49 = (((var43 & 255) + 71) & 255);
            }
        } else {
            var49 = (((var43 & 255) + 65) & 255);
        }
        *(signed char *)(((long)arg2 + produced + 0x1)) = var49;
        var54 = 61;
        var56 = 61;
        if ((2 <= (long)((int)(var12)))) {
            var62 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 6))) & 63)));
            if (((unsigned long)(25) < (unsigned long)((unsigned long)((unsigned int)(var62))))) {
                if (((unsigned long)(51) < (unsigned long)((unsigned long)((unsigned int)(var62))))) {
                    if (((unsigned long)(61) < (unsigned long)((unsigned long)((unsigned int)(var62))))) {
                        var56 = ((((((unsigned long)((unsigned int)(var62)) != 62) << 2) & 255) | 43) & 255);
                    } else {
                        var56 = (((var62 & 255) - 4) & 255);
                    }
                } else {
                    var56 = (((var62 & 255) + 71) & 255);
                }
            } else {
                var56 = (((var62 & 255) + 65) & 255);
            }
        }
        *(signed char *)(((long)arg2 + produced + 0x2)) = var56;
        if (((unsigned long)((unsigned char)((var9 & 255))) != 0)) {
            var72 = (unsigned long)((unsigned int)((group & 63)));
            if (((unsigned long)((unsigned long)((unsigned int)(var72))) <= (unsigned long)(25))) {
                var74 = (((var72 & 255) + 65) & 255);
                L_1143: ;
                var54 = (unsigned long)((unsigned int)(var74));
            } else {
                if (((unsigned long)(51) < (unsigned long)((unsigned long)((unsigned int)(var72))))) {
                    if (((unsigned long)(61) < (unsigned long)((unsigned long)((unsigned int)(var72))))) {
                        var54 = ((((((unsigned long)((unsigned int)(var72)) != 62) << 2) & 255) | 43) & 255);
                    } else {
                        var74 = (((var72 & 255) - 4) & 255);
                        goto L_1143;
                    }
                } else {
                    var74 = (((var72 & 255) + 71) & 255);
                    goto L_1143;
                }
            }
        }
        *(signed char *)(((long)arg2 + produced + 0x3)) = var54;
        ret = ((unsigned long)((unsigned int)(produced)) + 4);
        var82 = (var8 + 3);
        var12 = (unsigned long)((unsigned int)((var12 - 3)));
        var8 = var82;
        produced = ret;
    } while (((unsigned long)(var82) < (unsigned long)(var2)));
    // x86-64 epilogue: tear down frame
    return ret;
}

gcc -O0

2/2
base64_decode pass 80 lines
// glaurung: base64_decode @ 0x131e
int32_t base64_decode(const uint8_t * arg0, int32_t arg1, uint8_t * arg2) {
    extern int decode_symbol(unsigned char);
    int produced;
    int index;
    int a;
    int b;
    int c;
    int d;
    int pad;
    unsigned int group;
    int var11;
    int var20;
    int var29;
    int var38;
    long var61;
    produced = 0;
    if ((arg0 != 0)) {
        if ((arg2 != 0)) {
            if ((0 <= (long)(arg1))) {
                if (((((unsigned long)((unsigned int)(arg1)) == 16) | ((long)(arg1) < 16)) != 0)) {
                    if (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) & 3))) == 0)) {
                        goto L_136a;
                    }
                }
            }
        }
    }
    // x86-64 epilogue: restore rbp
    return 0xffffffff;
    L_136a: ;
    index = 0;
    goto L_14b2;
    L_1376: ;
    var11 = decode_symbol((unsigned long)((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[index])) & 255)))));
    a = var11;
    var20 = decode_symbol((unsigned long)((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[((long)(index) + 1)])) & 255)))));
    b = var20;
    var29 = decode_symbol((unsigned long)((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[((long)(index) + 2)])) & 255)))));
    c = var29;
    var38 = decode_symbol((unsigned long)((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[((long)(index) + 3)])) & 255)))));
    d = var38;
    pad = 0;
    if ((0 <= (long)(a))) {
        if ((0 <= (long)(b))) {
            goto L_1410;
        }
    }
    // x86-64 epilogue: restore rbp
    return 0xfffffffe;
    L_1410: ;
    if (((long)(c) < 0)) {
        c = 0;
        pad = (pad + 1);
    }
    if (((long)(d) < 0)) {
        d = 0;
        pad = (pad + 1);
    }
    group = ((unsigned int)(d) | (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(a)) << 18))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(b)) << 12)))))) | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(c)) << 6))))));
    var61 = (unsigned long)((unsigned int)(((unsigned int)(group) >> 16)));
    arg2[produced] = var61;
    produced = (produced + 1);
    if (((((unsigned long)((unsigned int)(pad)) == 1) | ((long)(pad) < 1)) != 0)) {
        var61 = (unsigned long)((unsigned int)(((unsigned int)(group) >> 8)));
        arg2[produced] = var61;
        produced = (produced + 1);
    }
    if (((((unsigned long)((unsigned int)(pad)) == 0) | ((long)(pad) < 0)) != 0)) {
        arg2[produced] = group;
        produced = (produced + 1);
    }
    index = (index + 4);
    L_14b2: ;
    if ((index < arg1)) {
        goto L_1376;
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(produced);
}
base64_encode pass 69 lines
// glaurung: base64_encode @ 0x11af
int32_t base64_encode(const uint8_t * arg0, int32_t arg1, uint8_t * arg2) {
    extern unsigned char encode_symbol(unsigned int);
    int produced;
    int index;
    unsigned int group;
    int remaining;
    long var38;
    unsigned char var39;
    long var51;
    unsigned char var52;
    long var54;
    unsigned char var61;
    long var67;
    unsigned char var71;
    // x86-64 prologue: save rbp, frame 8 bytes
    produced = 0;
    index = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((arg2 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((long)(arg1) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((((unsigned long)((unsigned int)(arg1)) == 12) | ((long)(arg1) < 12)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    while ((index < arg1)) {
        group = ((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[index])) & 255))) << 16);
        remaining = ((unsigned int)(arg1) - index);
        if (((((unsigned long)((unsigned int)(remaining)) == 1) | ((long)(remaining) < 1)) == 0)) {
            group = (group | (unsigned int)(((unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[((long)(index) + 1)])) & 255))) << 8)));
        }
        if (((((unsigned long)((unsigned int)(remaining)) == 2) | ((long)(remaining) < 2)) == 0)) {
            group = (group | (unsigned int)((unsigned char)(((unsigned int)((unsigned char)(arg0[((long)(index) + 2)])) & 255))));
        }
        var38 = (long)(((long)(produced) + (long)arg2));
        var39 = encode_symbol((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 18))) & 63))));
        *(signed char *)((var38)) = var39;
        var51 = (long)((((long)(produced) + 1) + (long)arg2));
        var52 = encode_symbol((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 12))) & 63))));
        *(signed char *)((var51)) = var52;
        if ((((unsigned long)((unsigned int)(remaining)) == 1) | ((long)(remaining) < 1))) {
            var54 = 61;
        } else {
            var61 = encode_symbol((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 6))) & 63))));
            var54 = (unsigned long)(var61);
        }
        arg2[((long)(produced) + 2)] = var54;
        if ((((unsigned long)((unsigned int)(remaining)) == 2) | ((long)(remaining) < 2))) {
            var67 = 61;
        } else {
            var71 = encode_symbol((unsigned long)((unsigned int)((group & 63))));
            var67 = (unsigned long)(var71);
        }
        arg2[((long)(produced) + 3)] = var67;
        produced = (produced + 4);
        index = (index + 3);
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(produced);
}

gcc -O2

2/2
base64_decode pass 395 lines
// glaurung: base64_decode @ 0x1360
int32_t base64_decode(const uint8_t * arg0, int32_t arg1, uint8_t * arg2) {
    int produced;
    int a;
    int d;
    int c;
    int pad;
    unsigned int group;
    int b;
    int index;
    long t187;
    long t191;
    long t206;
    long var107;
    int var11;
    long var111;
    long var112;
    long var116;
    long var117;
    long var12;
    long var120;
    long var153;
    long var158;
    long var16;
    long var17;
    long var2;
    long var21;
    int var22;
    long var26;
    long var27;
    int var28;
    long var29;
    long var30;
    long var31;
    int var33;
    long var34;
    long var36;
    long var37;
    long var38;
    int var42;
    long var43;
    long var44;
    long var45;
    long var46;
    long var47;
    int var48;
    long var49;
    long var50;
    long var51;
    long var53;
    long var54;
    long var55;
    long var56;
    int var59;
    long var60;
    long var61;
    long var62;
    long var63;
    int var64;
    long var65;
    long var66;
    long var67;
    long var68;
    long var69;
    long var70;
    long var72;
    long var73;
    long var74;
    long var75;
    long var76;
    long var80;
    long var81;
    long var88;
    var2 = (long)arg2;
    if (((arg0 == 0) || (arg2 == 0))) {
        goto L_16c7;
    }
    if (((unsigned long)(16) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        goto L_16c7;
    }
    if (((unsigned long)((unsigned char)((arg1 & 3))) != 0)) {
        goto L_16c7;
    }
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        goto L_16bf;
    }
    var11 = 63;
    var12 = 0xffffffff;
    var16 = 1;
    var17 = (long)((((long)arg0 + ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((arg1 - 1))) >> 2))) * 4)) + 4));
    produced = 0;
    var21 = (long)arg0;
    goto L_14e0;
    L_13c0: ;
    if (((unsigned long)(47) < (unsigned long)((unsigned long)((unsigned char)((var22 & 255)))))) {
        goto L_1690;
    }
    if (((unsigned long)((unsigned char)((var22 & 255))) == 43)) {
        goto L_15e8;
    }
    t187 = ((unsigned long)((unsigned int)(var22)) & 255);
    var26 = ((unsigned long)((unsigned char)(t187)) != 47);
    var27 = (((unsigned long)((unsigned char)(t187)) != 47) ? var12 : (unsigned long)((unsigned int)(var11)));
    L_13e3: ;
    var28 = (unsigned int)((unsigned char)(*(char *)((var21 + 0x1))));
    var29 = (unsigned long)((unsigned int)(var28));
    var30 = var27;
    var31 = var26;
    a = var27;
    var33 = var28;
    var34 = (unsigned long)((unsigned int)(var28));
    if (((unsigned long)(57) < (unsigned long)((unsigned long)((unsigned char)((var28 & 255)))))) {
        goto L_151f;
    }
    L_13f1: ;
    if (((unsigned long)(47) < (unsigned long)((unsigned long)((unsigned char)((var28 & 255)))))) {
        goto L_1650;
    }
    var36 = var26;
    var37 = var30;
    var38 = 62;
    if (((unsigned long)((unsigned char)((var29 & 255))) == 43)) {
        goto L_1410;
    }
    t191 = (var29 & 255);
    var36 = (((unsigned long)((unsigned char)(t191)) != 47) ? var16 : var26);
    var37 = var30;
    var38 = (((unsigned long)((unsigned char)(t191)) != 47) ? var12 : (unsigned long)((unsigned int)(var11)));
    L_1410: ;
    var42 = (unsigned int)((unsigned char)(*(char *)((var21 + 0x2))));
    var43 = (unsigned long)((unsigned int)(var42));
    var44 = var36;
    var45 = var37;
    var46 = var38;
    var47 = (unsigned long)((unsigned int)(var42));
    var48 = var42;
    if (((unsigned long)(57) < (unsigned long)((unsigned long)((unsigned char)((var42 & 255)))))) {
        goto L_1544;
    }
    var49 = var36;
    var50 = var37;
    var51 = var38;
    L_1420: ;
    if (((unsigned long)(47) < (unsigned long)((unsigned long)((unsigned char)((var42 & 255)))))) {
        goto L_1660;
    }
    var53 = var49;
    var54 = var50;
    var55 = var51;
    var56 = 62;
    if (((unsigned long)((unsigned char)((var43 & 255))) == 43)) {
        goto L_143c;
    }
    var53 = var49;
    var54 = var50;
    var55 = var51;
    var56 = (((unsigned long)((unsigned char)((var43 & 255))) != 47) ? var12 : (unsigned long)((unsigned int)(var11)));
    L_143c: ;
    var59 = (unsigned int)((unsigned char)(*(char *)((var21 + 0x3))));
    var60 = (unsigned long)((unsigned int)(var59));
    var61 = var53;
    var62 = var54;
    var63 = var55;
    var64 = var59;
    var65 = var56;
    var66 = (unsigned long)((unsigned int)(var59));
    if (((unsigned long)(57) < (unsigned long)((unsigned long)((unsigned char)((var59 & 255)))))) {
        goto L_1566;
    }
    var67 = var53;
    var68 = var54;
    var69 = var55;
    var70 = var56;
    L_1450: ;
    if (((unsigned long)(47) < (unsigned long)((unsigned long)((unsigned char)((var59 & 255)))))) {
        goto L_1680;
    }
    var72 = var67;
    var73 = var68;
    var74 = var69;
    var75 = 62;
    var76 = var70;
    if (((unsigned long)((unsigned char)((var60 & 255))) == 43)) {
        goto L_146e;
    }
    var72 = var67;
    var73 = var68;
    var74 = var69;
    var75 = (((unsigned long)((unsigned char)((var60 & 255))) != 47) ? var12 : (unsigned long)((unsigned int)(var11)));
    var76 = var70;
    L_146e: ;
    if (((unsigned long)((unsigned char)((var72 & 255))) != 0)) {
        goto L_157f;
    }
    var80 = var73;
    var81 = var74;
    d = var75;
    c = var76;
    L_1480: ;
    if (((unsigned long)((unsigned int)(c)) == 0xffffffff)) {
        goto L_1630;
    }
    var88 = (unsigned long)((unsigned int)((c << 6)));
    pad = 0;
    L_148e: ;
    if (((unsigned long)((unsigned int)(d)) == 0xffffffff)) {
        goto L_1600;
    }
    group = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var81 << 12))) | (unsigned long)((unsigned int)((var80 << 18)))))) | var88))) | d)));
    *(signed char *)((var2 + (long)(produced))) = ((unsigned int)(group) >> 16);
    *(signed char *)((var2 + (long)((int)((produced + 1))))) = ((unsigned int)(group) >> 8);
    var107 = (unsigned long)((unsigned int)((produced + 2)));
    if (((unsigned long)((unsigned int)(pad)) != 0)) {
        goto L_16a0;
    }
    *(signed char *)((var2 + (long)((int)(var107)))) = group;
    produced = (unsigned long)((unsigned int)((produced + 3)));
    L_14d3: ;
    var21 = (var21 + 4);
    var111 = (unsigned long)((unsigned int)(produced));
    if ((var21 == var17)) {
        goto L_1585;
    }
    L_14e0: ;
    var22 = (unsigned int)((unsigned char)(*(char *)((var21))));
    var112 = (unsigned long)((unsigned int)(var22));
    if (((unsigned long)((unsigned long)((unsigned char)((var22 & 255)))) <= (unsigned long)(57))) {
        goto L_13c0;
    }
    if (((unsigned long)(90) < (unsigned long)((unsigned long)((unsigned char)((var22 & 255)))))) {
        goto L_15a8;
    }
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned char)((var22 & 255)))))) {
        goto L_1670;
    }
    L_1505: ;
    var28 = (unsigned int)((unsigned char)(*(char *)((var21 + 0x1))));
    var26 = 1;
    var29 = (unsigned long)((unsigned int)(var28));
    var30 = 0xffffffff;
    var31 = 1;
    a = 0xffffffff;
    var33 = var28;
    var34 = (unsigned long)((unsigned int)(var28));
    if (((unsigned long)((unsigned long)((unsigned char)((var28 & 255)))) <= (unsigned long)(57))) {
        goto L_13f1;
    }
    L_151f: ;
    if (((unsigned long)(90) < (unsigned long)((unsigned long)((unsigned char)((var33 & 255)))))) {
        goto L_15c0;
    }
    t206 = (var34 & 255);
    var42 = (unsigned int)((unsigned char)(*(char *)((var21 + 0x2))));
    var116 = (((unsigned long)((unsigned long)((unsigned char)(t206))) <= (unsigned long)(64)) ? var16 : var31);
    var117 = (((unsigned long)((unsigned long)((unsigned char)(t206))) <= (unsigned long)(64)) ? var12 : (unsigned long)((unsigned int)((var33 - 65))));
    var43 = (unsigned long)((unsigned int)(var42));
    var49 = var116;
    var50 = (unsigned long)((unsigned int)(a));
    var51 = var117;
    var44 = var116;
    var45 = (unsigned long)((unsigned int)(a));
    var46 = var117;
    var47 = (unsigned long)((unsigned int)(var42));
    var48 = var42;
    if (((unsigned long)((unsigned long)((unsigned char)((var42 & 255)))) <= (unsigned long)(57))) {
        goto L_1420;
    }
    L_1544: ;
    if (((unsigned long)(90) < (unsigned long)((unsigned long)((unsigned char)((var48 & 255)))))) {
        goto L_15d0;
    }
    var59 = (unsigned int)((unsigned char)(*(char *)((var21 + 0x3))));
    var120 = (((unsigned long)((unsigned long)((unsigned char)((var47 & 255)))) <= (unsigned long)(64)) ? var12 : (unsigned long)((unsigned int)((var48 - 65))));
    var60 = (unsigned long)((unsigned int)(var59));
    var67 = var44;
    var68 = var45;
    var69 = var46;
    var70 = var120;
    var61 = var44;
    var62 = var45;
    var63 = var46;
    var64 = var59;
    var65 = var120;
    var66 = (unsigned long)((unsigned int)(var59));
    if (((unsigned long)((unsigned long)((unsigned char)((var59 & 255)))) <= (unsigned long)(57))) {
        goto L_1450;
    }
    L_1566: ;
    if (((unsigned long)(90) < (unsigned long)((unsigned long)((unsigned char)((var64 & 255)))))) {
        goto L_1590;
    }
    var80 = var62;
    var81 = var63;
    d = (((unsigned long)((unsigned long)((unsigned char)((var66 & 255)))) <= (unsigned long)(64)) ? var12 : (unsigned long)((unsigned int)((var64 - 65))));
    c = var65;
    var60 = var66;
    if (((unsigned long)((unsigned char)((var61 & 255))) == 0)) {
        goto L_1480;
    }
    L_157f: ;
    var111 = 0xfffffffe;
    L_1585: ;
    // x86-64 epilogue: tear down frame
    return (unsigned int)(var111);
    L_1590: ;
    var60 = (unsigned long)((unsigned int)((var66 - 97)));
    var72 = var61;
    var73 = var62;
    var74 = var63;
    var75 = (((unsigned long)(26) <= (unsigned long)((unsigned long)((unsigned char)((var60 & 255))))) ? var12 : (unsigned long)((unsigned int)((var64 - 71))));
    var76 = var65;
    goto L_146e;
    L_15a8: ;
    var26 = 0;
    var27 = (unsigned long)((unsigned int)((var22 - 71)));
    if (((unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var112 - 97))) & 255)))) <= (unsigned long)(25))) {
        goto L_13e3;
    }
    goto L_1505;
    L_15c0: ;
    if (((unsigned long)(25) < (unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var34 - 97))) & 255)))))) {
        goto L_1640;
    }
    var36 = var31;
    var37 = (unsigned long)((unsigned int)(a));
    var38 = (unsigned long)((unsigned int)((var33 - 71)));
    goto L_1410;
    L_15d0: ;
    var53 = var44;
    var54 = var45;
    var55 = var46;
    var56 = (((unsigned long)(26) <= (unsigned long)((unsigned long)((unsigned char)(((unsigned long)((unsigned int)((var47 - 97))) & 255))))) ? var12 : (unsigned long)((unsigned int)((var48 - 71))));
    goto L_143c;
    L_15e8: ;
    var26 = 0;
    var27 = 62;
    goto L_13e3;
    L_1600: ;
    var153 = (unsigned long)((unsigned int)((var88 | (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var80 << 18))) | (unsigned long)((unsigned int)((var81 << 12)))))))));
    *(signed char *)((var2 + (long)(produced))) = ((unsigned long)((unsigned int)(var153)) >> 16);
    var158 = (unsigned long)((unsigned int)((produced + 1)));
    if (((unsigned long)((unsigned int)(pad)) != 1)) {
        goto L_16b0;
    }
    produced = (unsigned long)((unsigned int)(var158));
    goto L_14d3;
    L_1630: ;
    var88 = 0;
    pad = 1;
    goto L_148e;
    L_1640: ;
    var36 = 1;
    var37 = (unsigned long)((unsigned int)(a));
    var38 = 0xffffffff;
    goto L_1410;
    L_1650: ;
    var36 = var26;
    var37 = var30;
    var38 = (unsigned long)((unsigned int)((var28 + 4)));
    goto L_1410;
    L_1660: ;
    var53 = var49;
    var54 = var50;
    var55 = var51;
    var56 = (unsigned long)((unsigned int)((var42 + 4)));
    goto L_143c;
    L_1670: ;
    var26 = 0;
    var27 = (unsigned long)((unsigned int)((var22 - 65)));
    goto L_13e3;
    L_1680: ;
    var72 = var67;
    var73 = var68;
    var74 = var69;
    var75 = (unsigned long)((unsigned int)((var59 + 4)));
    var76 = var70;
    goto L_146e;
    L_1690: ;
    var26 = 0;
    var27 = (unsigned long)((unsigned int)((var22 + 4)));
    goto L_13e3;
    L_16a0: ;
    produced = (unsigned long)((unsigned int)(var107));
    goto L_14d3;
    L_16b0: ;
    produced = (unsigned long)((unsigned int)((produced + 2)));
    *(signed char *)((var2 + (long)((int)(var158)))) = ((unsigned long)(var153) >> 8);
    goto L_14d3;
    L_16bf: ;
    var111 = 0;
    goto L_1585;
    L_16c7: ;
    var111 = 0xffffffff;
    goto L_1585;
}
base64_encode pass 108 lines
// glaurung: base64_encode @ 0x1100
int32_t base64_encode(const uint8_t * arg0, int32_t arg1, uint8_t * arg2) {
    int remaining;
    unsigned int group;
    int index;
    int produced;
    long var0;
    long var13;
    long var2;
    long var24;
    long var26;
    long var36;
    long var38;
    long var43;
    long var45;
    long var51;
    int var52;
    long var53;
    long var55;
    long var69;
    long var7;
    long var8;
    long var9;
    var0 = (unsigned long)((unsigned int)(arg1));
    if ((arg0 == 0)) {
        var2 = 0xffffffff;
        return 0xffffffff;
    }
    if ((arg2 == 0)) {
        var2 = 0xffffffff;
        return 0xffffffff;
    }
    if (((unsigned long)(12) < (unsigned long)((unsigned long)((unsigned int)(arg1))))) {
        var2 = 0xffffffff;
        return 0xffffffff;
    }
    if (((unsigned long)((unsigned int)(arg1)) == 0)) {
        return 0;
    }
    var7 = (unsigned long)((unsigned int)((4 - (long)arg2)));
    var8 = (long)arg0;
    var9 = (long)arg2;
    remaining = arg1;
    do {
        var13 = (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)((var8)))) << 16)));
        group = var13;
        if (((((unsigned long)((unsigned int)(remaining)) == 1) | ((long)(remaining) < 1)) == 0)) {
            group = (unsigned long)((unsigned int)((var13 | (unsigned long)((unsigned int)(((unsigned int)((unsigned char)(*(char *)((var8 + 0x1)))) << 8))))));
            if (((unsigned long)((unsigned int)(remaining)) != 2)) {
                group = (unsigned long)((unsigned int)((group | (unsigned int)((unsigned char)(*(char *)((var8 + 0x2)))))));
            }
        }
        var24 = (unsigned long)((unsigned int)(((unsigned int)(group) >> 18)));
        var26 = (((unsigned long)(group) <= (unsigned long)(0x67ffff)) ? (unsigned long)((unsigned int)((var24 + 65))) : (((unsigned long)((unsigned long)((unsigned int)(var24))) <= (unsigned long)(51)) ? (unsigned long)((unsigned int)((var24 + 71))) : (((unsigned long)((unsigned long)((unsigned int)(var24))) <= (unsigned long)(61)) ? (unsigned long)((unsigned int)((var24 - 4))) : (unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var24)) != 62) * 4) + 43))))));
        var36 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 12))) & 63)));
        var38 = (((unsigned long)((unsigned long)((unsigned int)(var36))) <= (unsigned long)(25)) ? (unsigned long)((unsigned int)((var36 + 65))) : (((unsigned long)((unsigned long)((unsigned int)(var36))) <= (unsigned long)(51)) ? (unsigned long)((unsigned int)((var36 + 71))) : (((unsigned long)((unsigned long)((unsigned int)(var36))) <= (unsigned long)(61)) ? (unsigned long)((unsigned int)((var36 - 4))) : (unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var36)) != 62) * 4) + 43))))));
        if ((((unsigned long)((unsigned int)(remaining)) == 1) | ((long)(remaining) < 1))) {
            var43 = 61;
            var45 = 61;
        } else {
            var51 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned int)(group) >> 6))) & 63)));
            if (((unsigned long)((unsigned long)((unsigned int)(var51))) <= (unsigned long)(25))) {
                var52 = (var51 + 65);
                var43 = (unsigned long)((unsigned int)(var52));
                var53 = (unsigned long)((unsigned int)(var52));
                if (((unsigned long)((unsigned int)(remaining)) != 2)) {
                    L_1203: ;
                    var55 = (unsigned long)((unsigned int)((group & 63)));
                    if (((unsigned long)((unsigned long)((unsigned int)(var55))) <= (unsigned long)(25))) {
                        var45 = (unsigned long)((unsigned int)((var55 + 65)));
                    } else {
                        if (((unsigned long)((unsigned long)((unsigned int)(var55))) <= (unsigned long)(51))) {
                            var45 = (unsigned long)((unsigned int)((var55 + 71)));
                        } else {
                            if (((unsigned long)((unsigned long)((unsigned int)(var55))) <= (unsigned long)(61))) {
                                var45 = (unsigned long)((unsigned int)((var55 - 4)));
                            } else {
                                var45 = (unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var55)) != 62) * 4) + 43)));
                            }
                        }
                    }
                } else {
                    L_12bd: ;
                    var43 = var53;
                    var45 = 61;
                }
            } else {
                var43 = (((unsigned long)((unsigned long)((unsigned int)(var51))) <= (unsigned long)(51)) ? (unsigned long)((unsigned int)((var51 + 71))) : (((unsigned long)((unsigned long)((unsigned int)(var51))) <= (unsigned long)(61)) ? (unsigned long)((unsigned int)((var51 - 4))) : (unsigned long)((unsigned int)(((((unsigned long)((unsigned int)(var51)) != 62) * 4) + 43)))));
                var53 = var43;
                if (((unsigned long)((unsigned int)(remaining)) == 2)) {
                    goto L_12bd;
                } else {
                    goto L_1203;
                }
            }
        }
        *(signed char *)((var9 + 0x3)) = var45;
        remaining = (unsigned long)((unsigned int)((remaining - 3)));
        var8 = (var8 + 3);
        var69 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var0)) - remaining)));
        *(signed char *)((var9 + 0x2)) = var43;
        var2 = (unsigned long)((unsigned int)((var7 + var9)));
        var9 = (var9 + 4);
        *(signed char *)((var9 - 0x4)) = var26;
        *(signed char *)((var9 - 0x3)) = var38;
    } while (((((unsigned int)(var0) == (unsigned int)(var69)) | ((long)((int)(var0)) < (long)((int)(var69)))) == 0));
    return (unsigned int)(var2);
}

← 213 fixtures