Fixture 70

reaction balance

C · 1 functions · 4 lanes · 4 of 4 function-lanes behave identically

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

Balance a two-reactant, two-product reaction by brute-force search over small integer coefficients, then reduce them by their greatest common divisor. Four nested bounded loops with an early exit on the first conserving assignment.

tests/decompiler_fixtures/src/70_reaction_balance.c source
#include <stdint.h>

/* Balance a two-reactant, two-product reaction by brute-force search over
 * small integer coefficients, then reduce them by their greatest common
 * divisor.  Four nested bounded loops with an early exit on the first
 * conserving assignment. */

#define BALANCE_LIMIT 8
#define BALANCE_ELEMENTS 4

static int32_t balance_gcd(int32_t a, int32_t b) {
    int32_t guard;
    for (guard = 0; guard < 32 && b != 0; ++guard) {
        int32_t remainder = a % b;
        a = b;
        b = remainder;
    }
    return (a == 0) ? 1 : a;
}

__attribute__((noinline)) int32_t
balance_reaction(const int32_t *reactant_a, const int32_t *reactant_b,
                 const int32_t *product_a, const int32_t *product_b,
                 int32_t elements, int32_t *coefficients) {
    int32_t ca;
    int32_t cb;
    int32_t cc;
    int32_t cd;
    if (reactant_a == 0 || reactant_b == 0 || product_a == 0 ||
        product_b == 0 || coefficients == 0 || elements < 1 ||
        elements > BALANCE_ELEMENTS) {
        return -1;
    }
    for (ca = 1; ca <= BALANCE_LIMIT; ++ca) {
        for (cb = 1; cb <= BALANCE_LIMIT; ++cb) {
            for (cc = 1; cc <= BALANCE_LIMIT; ++cc) {
                for (cd = 1; cd <= BALANCE_LIMIT; ++cd) {
                    int32_t element;
                    int32_t conserved = 1;
                    for (element = 0; element < elements; ++element) {
                        int32_t left = ca * reactant_a[element] +
                                       cb * reactant_b[element];
                        int32_t right = cc * product_a[element] +
                                        cd * product_b[element];
                        if (left != right) {
                            conserved = 0;
                            break;
                        }
                    }
                    if (conserved) {
                        int32_t divisor = balance_gcd(balance_gcd(ca, cb),
                                                      balance_gcd(cc, cd));
                        coefficients[0] = ca / divisor;
                        coefficients[1] = cb / divisor;
                        coefficients[2] = cc / divisor;
                        coefficients[3] = cd / divisor;
                        return 1;
                    }
                }
            }
        }
    }
    return 0;
}

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

1/1
balance_reaction pass 109 lines
// glaurung: balance_reaction @ 0x1100
int32_t balance_reaction(const int32_t * arg0, const int32_t * arg1, const int32_t * arg2, const int32_t * arg3, int32_t arg4, int32_t * arg5) {
    extern int balance_gcd(int, int);
    int ca;
    int cb;
    int cc;
    int cd;
    int conserved;
    int element;
    int left;
    int right;
    int divisor;
    int local_4;
    int local_60;
    int var41;
    int var43;
    int var45;
    if ((arg0 != 0)) {
        if ((arg1 != 0)) {
            if ((arg2 != 0)) {
                if ((arg3 != 0)) {
                    if ((arg5 != 0)) {
                        if ((1 <= (long)(arg4))) {
                            if ((((unsigned long)((unsigned int)(arg4)) == 4) | ((long)(arg4) < 4))) {
                                goto L_1177;
                            }
                        }
                    }
                }
            }
        }
    }
    local_4 = -1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_1177: ;
    ca = 1;
    L_117e: ;
    if (((((unsigned long)((unsigned int)(ca)) == 8) | ((long)(ca) < 8)) == 0)) {
        goto L_130d;
    }
    cb = 1;
    L_118f: ;
    if (((((unsigned long)((unsigned int)(cb)) == 8) | ((long)(cb) < 8)) == 0)) {
        goto L_12fa;
    }
    cc = 1;
    L_11a0: ;
    if (((((unsigned long)((unsigned int)(cc)) == 8) | ((long)(cc) < 8)) == 0)) {
        goto L_12e7;
    }
    cd = 1;
    L_11b1: ;
    if (((((unsigned long)((unsigned int)(cd)) == 8) | ((long)(cd) < 8)) == 0)) {
        goto L_12d4;
    }
    conserved = 1;
    element = 0;
    L_11c9: ;
    if ((arg4 <= element)) {
        goto L_1246;
    }
    left = ((unsigned int)(((unsigned long)((unsigned int)(ca)) * arg0[(long)(element)])) + (unsigned int)(((unsigned long)((unsigned int)(cb)) * arg1[(long)(element)])));
    right = ((unsigned int)(((unsigned long)((unsigned int)(cc)) * arg2[(long)(element)])) + (unsigned int)(((unsigned long)((unsigned int)(cd)) * arg3[(long)(element)])));
    if (((unsigned int)(left) != (unsigned int)(right))) {
        conserved = 0;
        goto L_1246;
    }
    goto L_1238;
    L_1238: ;
    element = ((unsigned int)(element) + 1);
    goto L_11c9;
    L_1246: ;
    if (((unsigned long)((unsigned int)(conserved)) != 0)) {
        var41 = balance_gcd((unsigned long)((unsigned int)(ca)), (unsigned long)((unsigned int)(cb)));
        local_60 = var41;
        var43 = balance_gcd((unsigned long)((unsigned int)(cc)), (unsigned long)((unsigned int)(cd)));
        var45 = balance_gcd((unsigned long)((unsigned int)(local_60)), (unsigned long)((unsigned int)(var43)));
        divisor = var45;
        *(int *)((long)arg5) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(ca))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(ca)))) / (int)(divisor)));
        *(int *)(((long)arg5 + 0x4)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cb))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cb)))) / (int)(divisor)));
        *(int *)(((long)arg5 + 0x8)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cc))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cc)))) / (int)(divisor)));
        *(int *)(((long)arg5 + 0xc)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cd))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cd)))) / (int)(divisor)));
        // x86-64 epilogue: restore rbp
        return 1;
    }
    goto L_12c6;
    L_12c6: ;
    cd = ((unsigned int)(cd) + 1);
    goto L_11b1;
    L_12d4: ;
    goto L_12d9;
    L_12d9: ;
    cc = ((unsigned int)(cc) + 1);
    goto L_11a0;
    L_12e7: ;
    goto L_12ec;
    L_12ec: ;
    cb = ((unsigned int)(cb) + 1);
    goto L_118f;
    L_12fa: ;
    goto L_12ff;
    L_12ff: ;
    ca = ((unsigned int)(ca) + 1);
    goto L_117e;
    L_130d: ;
    // x86-64 epilogue: restore rbp
    return 0;
}

clang -O2

1/1
balance_reaction pass 231 lines
// glaurung: balance_reaction @ 0x1100
int32_t balance_reaction(const int32_t * arg0, const int32_t * arg1, const int32_t * arg2, const int32_t * arg3, int32_t arg4, int32_t * arg5) {
    int cb;
    int cc;
    int cd;
    int left;
    int divisor;
    int ca;
    int conserved;
    int element;
    int guard;
    int right;
    long local_38;
    long local_48;
    long local_50;
    long local_58;
    int local_5c;
    int local_60;
    int local_64;
    int local_68;
    long var1;
    long var101;
    long var105;
    long var107;
    long var108;
    long var109;
    long var110;
    long var113;
    long var12;
    long var120;
    long var121;
    long var122;
    long var123;
    int var127;
    long var13;
    long var20;
    long var21;
    long var22;
    int var23;
    long var3;
    long var4;
    long var5;
    int var55;
    long var56;
    long var6;
    int var63;
    int var71;
    int var78;
    int var82;
    int var87;
    long var94;
    long var96;
    long var97;
    long var98;
    var1 = 0xffffffff;
    if (((unsigned long)((unsigned long)((unsigned int)((arg4 - 5)))) < (unsigned long)(0xfffffffc))) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(var1);
    }
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(var1);
    }
    if ((arg1 == 0)) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(var1);
    }
    if ((arg2 == 0)) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(var1);
    }
    if ((arg3 == 0)) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(var1);
    }
    if ((arg5 == 0)) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(var1);
    }
    local_38 = (unsigned int)(arg4);
    var3 = (unsigned long)((unsigned int)(*(int *)(((long)arg0))));
    var4 = (unsigned long)((unsigned int)(*(int *)(((long)arg1))));
    var5 = (unsigned long)((unsigned int)(*(int *)(((long)arg2))));
    var6 = (unsigned long)((unsigned int)(*(int *)(((long)arg3))));
    local_58 = var3;
    local_50 = var4;
    local_48 = var5;
    var12 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var3 + var4))) - var6))) - var5)));
    local_68 = 1;
    L_117e: ;
    local_64 = var12;
    var13 = (unsigned long)((unsigned int)(var12));
    cb = 1;
    L_118b: ;
    local_60 = var13;
    cc = 1;
    L_1196: ;
    local_5c = var13;
    cd = 1;
    goto L_11ca;
    L_11b0: ;
    var4 = var21;
    var22 = var21;
    if (((unsigned long)(local_38) <= (unsigned long)(var20))) {
        goto L_12f4;
    }
    L_11bb: ;
    var23 = (cd + 1);
    var13 = (unsigned long)((unsigned int)((var13 - var6)));
    cd = (unsigned long)((unsigned int)(var23));
    if (((unsigned long)((unsigned int)(var23)) == 9)) {
        goto L_12a0;
    }
    L_11ca: ;
    if (((unsigned long)((unsigned int)(var13)) != 0)) {
        goto L_11bb;
    }
    var22 = var4;
    if (((unsigned long)((unsigned int)(arg4)) == 1)) {
        goto L_12f4;
    }
    var22 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg2 + 0x4)))) * cc)));
    var20 = 1;
    var21 = var22;
    if (((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0x4)))) * cb))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x4)))) * local_68))))) != (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg3 + 0x4)))) * cd))) + var22)))) {
        goto L_11b0;
    }
    if (((unsigned long)((unsigned int)(arg4)) == 2)) {
        goto L_12f4;
    }
    var55 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg3 + 0x8)))) * cd)) + (unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg2 + 0x8)))) * cc)));
    var56 = (unsigned long)((unsigned int)(var55));
    var20 = 2;
    var21 = (unsigned long)((unsigned int)(var55));
    if (((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0x8)))) * cb))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x8)))) * local_68))))) != (unsigned int)(var55))) {
        goto L_11b0;
    }
    var22 = var56;
    if (((unsigned long)((unsigned int)(arg4)) == 3)) {
        goto L_12f4;
    }
    var63 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0xc)))) * cb)) + (unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0xc)))) * local_68)));
    left = (unsigned long)((unsigned int)(var63));
    var71 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg3 + 0xc)))) * cd)) + (unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg2 + 0xc)))) * cc)));
    var20 = (4 - ((unsigned int)(var63) != (unsigned int)(var71)));
    var21 = (unsigned long)((unsigned int)(var63));
    if (((unsigned int)(var63) != (unsigned int)(var71))) {
        goto L_11b0;
    }
    var21 = (unsigned long)((unsigned int)(left));
    if (((unsigned long)((unsigned int)(arg4)) != 4)) {
        goto L_11b0;
    }
    var22 = (unsigned long)((unsigned int)(left));
    goto L_12f4;
    L_12a0: ;
    var78 = (cc + 1);
    var13 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(local_5c)) - (unsigned int)(local_48))));
    cc = (unsigned long)((unsigned int)(var78));
    if (((unsigned long)((unsigned int)(var78)) != 9)) {
        goto L_1196;
    }
    var82 = (cb + 1);
    var13 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(local_60)) + (unsigned int)(local_50))));
    cb = (unsigned long)((unsigned int)(var82));
    if (((unsigned long)((unsigned int)(var82)) != 9)) {
        goto L_118b;
    }
    var87 = ((unsigned int)(local_68) + 1);
    var12 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(local_64)) + (unsigned int)(local_58))));
    var1 = 0;
    local_68 = var87;
    var4 = (unsigned long)((unsigned int)(var87));
    if (((unsigned long)((unsigned int)(var87)) != 9)) {
        goto L_117e;
    }
    // x86-64 epilogue: tear down frame
    return (unsigned int)(var1);
    L_12f4: ;
    var94 = (unsigned long)((unsigned int)(local_68));
    var96 = (unsigned long)((unsigned int)(cb));
    var97 = 0;
    L_1300: ;
    var98 = (unsigned long)((unsigned int)(var96));
    var101 = ((int)((((long long)(int)((((unsigned long)((long)((int)(var94))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)(var94)) % (int)((unsigned long)((unsigned int)(var96)))));
    if (((unsigned long)((unsigned long)((unsigned int)(var97))) <= (unsigned long)(30))) {
        var97 = (unsigned long)((unsigned int)((var97 + 1)));
        var94 = (unsigned long)((unsigned int)(var98));
        var96 = var101;
        if (((unsigned long)((unsigned int)(var101)) != 0)) {
            goto L_1300;
        }
    }
    var105 = (unsigned long)((unsigned int)(cc));
    var107 = (long)arg5;
    var108 = 0;
    var109 = (unsigned long)((unsigned int)(cd));
    L_1320: ;
    var110 = (unsigned long)((unsigned int)(var109));
    var113 = ((int)((((long long)(int)((((unsigned long)((long)((int)(var105))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)(var105)) % (int)((unsigned long)((unsigned int)(var109)))));
    if (((unsigned long)((unsigned long)((unsigned int)(var108))) <= (unsigned long)(30))) {
        var108 = (unsigned long)((unsigned int)((var108 + 1)));
        var105 = (unsigned long)((unsigned int)(var110));
        var109 = var113;
        if (((unsigned long)((unsigned int)(var113)) != 0)) {
            goto L_1320;
        }
    }
    var120 = 0;
    var121 = (((unsigned long)((unsigned int)(var98)) == 0) ? 1 : var98);
    var122 = (((unsigned long)((unsigned int)(var110)) == 0) ? 1 : var110);
    L_1350: ;
    var123 = (unsigned long)((unsigned int)(var122));
    var127 = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(var121))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(var121)))) % (int)(var122)));
    if (((unsigned long)((unsigned long)((unsigned int)(var120))) <= (unsigned long)(30))) {
        var120 = (unsigned long)((unsigned int)((var120 + 1)));
        var121 = (unsigned long)((unsigned int)(var123));
        var122 = (unsigned long)((unsigned int)(var127));
        if (((unsigned long)((unsigned int)(var127)) != 0)) {
            goto L_1350;
        }
    }
    var1 = 1;
    divisor = (((unsigned long)((unsigned int)(var123)) == 0) ? 1 : var123);
    *(int *)((var107)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(local_68))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(local_68)))) / (int)(divisor)));
    *(int *)((var107 + 0x4)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cb))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cb)))) / (int)(divisor)));
    *(int *)((var107 + 0x8)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cc))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cc)))) / (int)(divisor)));
    *(int *)((var107 + 0xc)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cd))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cd)))) / (int)(divisor)));
    // x86-64 epilogue: tear down frame
    return 1;
}

gcc -O0

1/1
balance_reaction pass 98 lines
// glaurung: balance_reaction @ 0x1148
int32_t balance_reaction(const int32_t * arg0, const int32_t * arg1, const int32_t * arg2, const int32_t * arg3, int32_t arg4, int32_t * arg5) {
    extern int balance_gcd(int, int);
    int ca;
    int cb;
    int cc;
    int cd;
    int conserved;
    int element;
    int left;
    int right;
    int divisor;
    int var48;
    long var50;
    int var53;
    int var55;
    if ((arg0 != 0)) {
        if ((arg1 != 0)) {
            if ((arg2 != 0)) {
                if ((arg3 != 0)) {
                    if ((arg5 != 0)) {
                        if (((((unsigned long)((unsigned int)(arg4)) == 0) | ((long)(arg4) < 0)) == 0)) {
                            if ((((unsigned long)((unsigned int)(arg4)) == 4) | ((long)(arg4) < 4))) {
                                goto L_11a6;
                            }
                        }
                    }
                }
            }
        }
    }
    // x86-64 epilogue: restore rbp
    return 0xffffffff;
    L_11a6: ;
    ca = 1;
    goto L_1329;
    L_11b2: ;
    cb = 1;
    goto L_131b;
    L_11be: ;
    cc = 1;
    goto L_130d;
    L_11ca: ;
    cd = 1;
    goto L_12ff;
    L_11d6: ;
    conserved = 1;
    element = 0;
    goto L_1274;
    L_11e9: ;
    left = ((unsigned int)(((unsigned long)((unsigned int)(arg1[(long)(element)])) * cb)) + (unsigned int)(((unsigned long)((unsigned int)(arg0[(long)(element)])) * ca)));
    right = ((unsigned int)(((unsigned long)((unsigned int)(arg3[(long)(element)])) * cd)) + (unsigned int)(((unsigned long)((unsigned int)(arg2[(long)(element)])) * cc)));
    if (((unsigned int)(left) != (unsigned int)(right))) {
        conserved = 0;
        goto L_1280;
    }
    element = (element + 1);
    L_1274: ;
    if ((element < arg4)) {
        goto L_11e9;
    }
    L_1280: ;
    if (((unsigned long)((unsigned int)(conserved)) != 0)) {
        var48 = balance_gcd((unsigned long)((unsigned int)(cc)), (unsigned long)((unsigned int)(cd)));
        var50 = (unsigned long)((unsigned int)(var48));
        var53 = balance_gcd((unsigned long)((unsigned int)(ca)), (unsigned long)((unsigned int)(cb)));
        var55 = balance_gcd((unsigned long)((unsigned int)(var53)), (unsigned long)((unsigned int)(var50)));
        divisor = var55;
        *(int *)((long)arg5) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(ca))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(ca)))) / (int)(divisor)));
        *(int *)((arg5 + 1)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cb))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cb)))) / (int)(divisor)));
        *(int *)((arg5 + 2)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cc))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cc)))) / (int)(divisor)));
        *(int *)((arg5 + 3)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cd))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cd)))) / (int)(divisor)));
        // x86-64 epilogue: restore rbp
        return 1;
    }
    cd = (cd + 1);
    L_12ff: ;
    if ((((unsigned long)((unsigned int)(cd)) == 8) | ((long)(cd) < 8))) {
        goto L_11d6;
    }
    cc = (cc + 1);
    L_130d: ;
    if ((((unsigned long)((unsigned int)(cc)) == 8) | ((long)(cc) < 8))) {
        goto L_11ca;
    }
    cb = (cb + 1);
    L_131b: ;
    if ((((unsigned long)((unsigned int)(cb)) == 8) | ((long)(cb) < 8))) {
        goto L_11be;
    }
    ca = (ca + 1);
    L_1329: ;
    if ((((unsigned long)((unsigned int)(ca)) == 8) | ((long)(ca) < 8))) {
        goto L_11b2;
    }
    // x86-64 epilogue: restore rbp
    return 0;
}

gcc -O2

1/1
balance_reaction pass 180 lines
// glaurung: balance_reaction @ 0x1100
int32_t balance_reaction(const int32_t * arg0, const int32_t * arg1, const int32_t * arg2, const int32_t * arg3, int32_t arg4, int32_t * arg5) {
    int ca;
    int cb;
    int cc;
    int cd;
    int element;
    int remainder;
    int guard;
    int divisor;
    long local_10;
    long local_18;
    long local_28;
    long local_8;
    long ret;
    long var0;
    long var1;
    int var100;
    int var102;
    long var2;
    long var3;
    long var37;
    long var4;
    long var40;
    long var41;
    long var43;
    long var44;
    int var45;
    long var49;
    long var5;
    long var52;
    long var53;
    long var54;
    long var56;
    int var57;
    long var6;
    long var62;
    int var64;
    long var66;
    long var67;
    int var68;
    long var8;
    int var97;
    int var98;
    if ((arg0 == 0)) {
        goto L_1260;
    }
    var0 = (long)arg1;
    if ((arg1 == 0)) {
        goto L_1260;
    }
    var1 = (long)arg2;
    if ((arg2 == 0)) {
        goto L_1260;
    }
    local_8 = var2;
    local_10 = var3;
    local_18 = var4;
    local_28 = var5;
    var6 = (long)arg3;
    if ((arg3 == 0)) {
        goto L_1250;
    }
    if (((unsigned long)(3) < (unsigned long)((unsigned long)((unsigned int)((arg4 - 1)))))) {
        goto L_1250;
    }
    if ((arg5 == 0)) {
        goto L_1250;
    }
    var8 = (long)arg0;
    ca = 1;
    L_1158: ;
    cb = 1;
    L_115e: ;
    cc = 1;
    L_1163: ;
    cd = 1;
    L_1170: ;
    element = 0;
    do {
        if (((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var8 + element * 4)))) * ca))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var0 + element * 4)))) * cb))))) != (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var1 + element * 4)))) * cc))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var6 + element * 4)))) * cd))))))) {
            goto L_1270;
        }
        element = (element + 1);
    } while (((((unsigned int)(arg4) == (unsigned int)(element)) | (arg4 < element)) == 0));
    var37 = (unsigned long)((unsigned int)(cc));
    var40 = (unsigned long)((unsigned int)(cd));
    var41 = 0;
    goto L_11bc;
    L_11b8: ;
    var40 = (unsigned long)((unsigned int)(remainder));
    var41 = var43;
    if (((unsigned long)((unsigned int)(remainder)) == 0)) {
        goto L_11cb;
    }
    L_11bc: ;
    var44 = (unsigned long)((unsigned int)(var40));
    var45 = (var41 + 1);
    var43 = (unsigned long)((unsigned int)(var45));
    remainder = ((int)((((long long)(int)((((unsigned long)((long)((int)(var37))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)(var37)) % (int)((unsigned long)((unsigned int)(var40)))));
    var37 = (unsigned long)((unsigned int)(var40));
    if ((((unsigned long)((unsigned int)(var45)) == 31) | ((long)((int)(var45)) < 31))) {
        goto L_11b8;
    }
    L_11cb: ;
    var49 = (unsigned long)((unsigned int)(ca));
    var52 = 0;
    var53 = (unsigned long)((unsigned int)(cb));
    goto L_11e4;
    L_11e0: ;
    var52 = (unsigned long)((unsigned int)(guard));
    var53 = var54;
    if (((unsigned long)((unsigned int)(var54)) == 0)) {
        goto L_11f5;
    }
    L_11e4: ;
    var56 = (unsigned long)((unsigned int)(var53));
    var57 = (var52 + 1);
    guard = (unsigned long)((unsigned int)(var57));
    var54 = ((int)((((long long)(int)((((unsigned long)((long)((int)(var49))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)(var49)) % (int)((unsigned long)((unsigned int)(var53)))));
    var49 = (unsigned long)((unsigned int)(var53));
    if ((((unsigned long)((unsigned int)(var57)) == 31) | ((long)((int)(var57)) < 31))) {
        goto L_11e0;
    }
    L_11f5: ;
    var62 = 0;
    divisor = var44;
    goto L_1206;
    L_1200: ;
    if (((unsigned long)((unsigned int)(var64)) == 0)) {
        goto L_1217;
    }
    var62 = var66;
    divisor = (unsigned long)((unsigned int)(var64));
    L_1206: ;
    var67 = (unsigned long)((unsigned int)(var56));
    var68 = (var62 + 1);
    var66 = (unsigned long)((unsigned int)(var68));
    var56 = (unsigned long)((unsigned int)(divisor));
    var64 = ((int)((((long long)(int)((((unsigned long)((long)((int)(var67))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)(var67)) % (int)(divisor)));
    if ((((unsigned long)((unsigned int)(var68)) == 31) | ((long)((int)(var68)) < 31))) {
        goto L_1200;
    }
    L_1217: ;
    *(int *)(((long)arg5)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(ca))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(ca)))) / (int)(divisor)));
    *(int *)(((long)arg5 + 0x4)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cb))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cb)))) / (int)(divisor)));
    *(int *)(((long)arg5 + 0x8)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cc))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cc)))) / (int)(divisor)));
    *(int *)(((long)arg5 + 0xc)) = ((int)((((long long)(int)((((unsigned long)((long)((int)((unsigned long)((unsigned int)(cd))))) >> 32) & 0xffffffff)) * (((long long)1) << 32)) + (unsigned int)((unsigned long)((unsigned int)(cd)))) / (int)(divisor)));
    return 1;
    L_1250: ;
    ret = 0xffffffff;
    L_1255: ;
    // x86-64 epilogue: tear down frame
    return ret;
    L_1260: ;
    return 0xffffffff;
    L_1270: ;
    var97 = (cd + 1);
    cd = (unsigned long)((unsigned int)(var97));
    if (((unsigned long)((unsigned int)(var97)) != 9)) {
        goto L_1170;
    }
    var98 = (cc + 1);
    cc = (unsigned long)((unsigned int)(var98));
    if (((unsigned long)((unsigned int)(var98)) != 9)) {
        goto L_1163;
    }
    var100 = (cb + 1);
    cb = (unsigned long)((unsigned int)(var100));
    if (((unsigned long)((unsigned int)(var100)) != 9)) {
        goto L_115e;
    }
    var102 = (ca + 1);
    ca = (unsigned long)((unsigned int)(var102));
    if (((unsigned long)((unsigned int)(var102)) != 9)) {
        goto L_1158;
    }
    ret = 0;
    goto L_1255;
}

← 213 fixtures