Fixture 76

portfolio rebalance

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

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

Portfolio drift and rebalancing trades. Weights are Q16.16 fractions that must sum to one; the trade vector is the signed difference against target weights, written into a caller-owned buffer.

tests/decompiler_fixtures/src/76_portfolio_rebalance.c source
#include <stdint.h>

/* Portfolio drift and rebalancing trades.  Weights are Q16.16 fractions that
 * must sum to one; the trade vector is the signed difference against target
 * weights, written into a caller-owned buffer. */

#define PORTFOLIO_MAX 8

static int32_t folio_div_q16(int32_t numerator, int32_t denominator) {
    if (denominator == 0) {
        return 0;
    }
    return (int32_t)(((int64_t)numerator << 16) / (int64_t)denominator);
}

__attribute__((noinline)) int32_t
maximum_drift(const int32_t *values, const int32_t *target_weights,
              int32_t count) {
    int64_t total = 0;
    int32_t worst = 0;
    int32_t index;
    if (values == 0 || target_weights == 0 || count < 1 ||
        count > PORTFOLIO_MAX) {
        return -1;
    }
    for (index = 0; index < count; ++index) {
        if (values[index] < 0) {
            return -2;
        }
        total += values[index];
    }
    if (total <= 0) {
        return -3;
    }
    for (index = 0; index < count; ++index) {
        int32_t weight = folio_div_q16(values[index], (int32_t)total);
        int32_t drift = weight - target_weights[index];
        int32_t magnitude = (drift < 0) ? -drift : drift;
        if (magnitude > worst) {
            worst = magnitude;
        }
    }
    return worst;
}

__attribute__((noinline)) int32_t
rebalance_trades(const int32_t *values, const int32_t *target_weights,
                 int32_t count, int32_t *trades) {
    int64_t total = 0;
    int32_t index;
    int32_t nonzero = 0;
    if (values == 0 || target_weights == 0 || trades == 0 || count < 1 ||
        count > PORTFOLIO_MAX) {
        return -1;
    }
    for (index = 0; index < count; ++index) {
        if (values[index] < 0) {
            return -2;
        }
        total += values[index];
    }
    if (total <= 0 || total > 2147483647LL) {
        return -3;
    }
    for (index = 0; index < count; ++index) {
        int32_t desired =
            (int32_t)(((int64_t)total * (int64_t)target_weights[index]) >> 16);
        trades[index] = desired - values[index];
        if (trades[index] != 0) {
            nonzero += 1;
        }
    }
    return nonzero;
}

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
maximum_drift pass 71 lines
// glaurung: maximum_drift @ 0x1100
int32_t maximum_drift(const int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    extern int folio_div_q16(int, int);
    long total;
    int worst;
    int index;
    int weight;
    int drift;
    int magnitude;
    int local_4;
    int local_40;
    int var15;
    total = 0;
    worst = 0;
    if ((arg0 != 0)) {
        if ((arg1 != 0)) {
            if ((1 <= (long)(arg2))) {
                if ((((unsigned long)((unsigned int)(arg2)) == 8) | ((long)(arg2) < 8))) {
                    goto L_1158;
                }
            }
        }
    }
    local_4 = -1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_1158: ;
    index = 0;
    L_115f: ;
    if ((index < arg2)) {
        if (((long)((int)(arg0[(long)(index)])) < 0)) {
            local_4 = -2;
            // x86-64 epilogue: restore rbp
            return (unsigned int)(local_4);
        }
        total = ((long)((int)(arg0[(long)(index)])) + total);
        index = ((unsigned int)(index) + 1);
        goto L_115f;
    }
    if ((total <= 0)) {
        local_4 = -3;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    index = 0;
    L_11c9: ;
    if ((arg2 <= index)) {
        goto L_1247;
    }
    var15 = folio_div_q16((unsigned long)((unsigned int)(arg0[(long)(index)])), (unsigned long)((unsigned int)(total)));
    weight = var15;
    drift = ((unsigned int)(weight) - arg1[(long)(index)]);
    if (((long)(drift) < 0)) {
        local_40 = (0 - drift);
        goto L_121c;
    }
    local_40 = drift;
    L_121c: ;
    magnitude = local_40;
    if (((((unsigned int)(magnitude) == (unsigned int)(worst)) | (magnitude < worst)) == 0)) {
        worst = magnitude;
    }
    goto L_1239;
    L_1239: ;
    index = ((unsigned int)(index) + 1);
    goto L_11c9;
    L_1247: ;
    local_4 = worst;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
rebalance_trades pass 64 lines
// glaurung: rebalance_trades @ 0x12a0
int32_t rebalance_trades(const int32_t * arg0, const int32_t * arg1, int32_t arg2, int32_t * arg3) {
    long total;
    int nonzero;
    int index;
    int desired;
    int local_4;
    total = 0;
    nonzero = 0;
    if ((arg0 != 0)) {
        if ((arg1 != 0)) {
            if ((arg3 != 0)) {
                if ((1 <= (long)(arg2))) {
                    if ((((unsigned long)((unsigned int)(arg2)) == 8) | ((long)(arg2) < 8))) {
                        goto L_1303;
                    }
                }
            }
        }
    }
    local_4 = -1;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_1303: ;
    index = 0;
    L_130a: ;
    if ((index < arg2)) {
        if (((long)((int)(arg0[(long)(index)])) < 0)) {
            local_4 = -2;
            // x86-64 epilogue: restore rbp
            return (unsigned int)(local_4);
        }
        total = ((long)((int)(arg0[(long)(index)])) + total);
        index = ((unsigned int)(index) + 1);
        goto L_130a;
    }
    if ((0 < total)) {
        if ((total <= 0x7fffffff)) {
            goto L_137b;
        }
    }
    local_4 = -3;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
    L_137b: ;
    index = 0;
    L_1382: ;
    if ((arg2 <= index)) {
        goto L_13f0;
    }
    desired = ((long)((total * (long)((int)(arg1[(long)(index)])))) >> 16);
    arg3[(long)(index)] = ((unsigned long)((unsigned int)(desired)) - arg0[(long)(index)]);
    if (((unsigned long)((unsigned int)(arg3[(long)(index)])) != 0)) {
        nonzero = ((unsigned int)(nonzero) + 1);
    }
    goto L_13e2;
    L_13e2: ;
    index = ((unsigned int)(index) + 1);
    goto L_1382;
    L_13f0: ;
    local_4 = nonzero;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

clang -O2

2/2
maximum_drift pass 145 lines
// glaurung: maximum_drift @ 0x1100
int32_t maximum_drift(const int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int worst;
    int drift;
    int magnitude;
    int index;
    long total;
    int weight;
    long t156;
    int var1;
    long var10;
    long var11;
    long var12;
    long var13;
    long var14;
    long var15;
    long var16;
    long var17;
    long var19;
    long var20;
    long var26;
    long var28;
    long var3;
    long var31;
    long var37;
    long var4;
    long var5;
    long var6;
    long var7;
    long var8;
    long var9;
    var1 = 0xffffffff;
    if ((arg0 == 0)) {
        return (unsigned int)(var1);
    }
    var1 = 0xffffffff;
    if ((arg1 == 0)) {
        return (unsigned int)(var1);
    }
    var1 = 0xffffffff;
    if (((unsigned long)((unsigned long)((unsigned int)((arg2 - 9)))) < (unsigned long)(0xfffffff8))) {
        return (unsigned int)(var1);
    }
    var3 = (unsigned long)((unsigned int)(*(int *)(((long)arg0))));
    var4 = 0xfffffffe;
    var1 = 0xfffffffe;
    if (((long)((int)(var3)) < 0)) {
        return (unsigned int)(var1);
    }
    if (((unsigned long)((unsigned int)(arg2)) != 1)) {
        var5 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x4))));
        var1 = var4;
        if (((long)((int)(var5)) < 0)) {
            return (unsigned int)(var1);
        }
        var6 = (var3 + var5);
        var3 = var6;
        if (((unsigned long)((unsigned int)(arg2)) != 2)) {
            var7 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x8))));
            var1 = var4;
            if (((long)((int)(var7)) < 0)) {
                return (unsigned int)(var1);
            }
            var8 = (var6 + var7);
            var3 = var8;
            if (((unsigned long)((unsigned int)(arg2)) != 3)) {
                var9 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0xc))));
                var1 = var4;
                if (((long)((int)(var9)) < 0)) {
                    return (unsigned int)(var1);
                }
                var10 = (var8 + var9);
                var3 = var10;
                if (((unsigned long)((unsigned int)(arg2)) != 4)) {
                    var11 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x10))));
                    var1 = var4;
                    if (((long)((int)(var11)) < 0)) {
                        return (unsigned int)(var1);
                    }
                    var12 = (var10 + var11);
                    var3 = var12;
                    if (((unsigned long)((unsigned int)(arg2)) != 5)) {
                        var13 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x14))));
                        var1 = var4;
                        if (((long)((int)(var13)) < 0)) {
                            return (unsigned int)(var1);
                        }
                        var14 = (var12 + var13);
                        var3 = var14;
                        if (((unsigned long)((unsigned int)(arg2)) != 6)) {
                            var15 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x18))));
                            var1 = var4;
                            if (((long)((int)(var15)) < 0)) {
                                return (unsigned int)(var1);
                            }
                            var16 = (var14 + var15);
                            var3 = var16;
                            if (((unsigned long)((unsigned int)(arg2)) != 7)) {
                                var17 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x1c))));
                                var1 = var4;
                                if (((long)((int)(var17)) < 0)) {
                                    return (unsigned int)(var1);
                                }
                                var3 = (var16 + var17);
                            }
                        }
                    }
                }
            }
        }
    }
    if ((var3 == 0)) {
        return 0xfffffffd;
    }
    var19 = (long)((int)(var3));
    var20 = (unsigned long)((unsigned int)(arg2));
    worst = 0;
    var26 = 0;
    goto L_11ef;
    L_11d0: ;
    var31 = ((long)((((__int128)(long)(((long)(var28) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(var28)) / (long)(var19)));
    L_11d5: ;
    drift = (unsigned long)((unsigned int)((var31 - *(int *)(((long)arg1 + var26 * 4)))));
    t156 = (-(unsigned long)((unsigned int)(drift)));
    magnitude = (((long)((int)(t156)) < 0) ? drift : t156);
    var37 = (((((unsigned int)(magnitude) == (unsigned int)(worst)) | (magnitude < worst)) == 0) ? magnitude : worst);
    index = (var26 + 1);
    worst = var37;
    var26 = (unsigned long)((unsigned int)(index));
    var1 = var37;
    if ((var20 == index)) {
        return (unsigned int)(var1);
    }
    L_11ef: ;
    var31 = 0;
    if (((unsigned long)((unsigned int)(var3)) == 0)) {
        goto L_11d5;
    }
    var28 = ((long)((int)(*(int *)(((long)arg0 + var26 * 4)))) << 16);
    if ((((unsigned long)((var28 | var19)) >> 32) != 0)) {
        goto L_11d0;
    }
    var31 = ((unsigned int)(((((unsigned long long)(unsigned int)((unsigned long)((unsigned int)(0))) << 32) | (unsigned int)(var28)) / (unsigned int)(var3))));
    goto L_11d5;
}
rebalance_trades pass 179 lines
// glaurung: rebalance_trades @ 0x1220
int32_t rebalance_trades(const int32_t * arg0, const int32_t * arg1, int32_t arg2, int32_t * arg3) {
    int index;
    int desired;
    int nonzero;
    long total;
    long local_8;
    long ret;
    long var0;
    long var11;
    long var15;
    long var2;
    int var22;
    int var33;
    int var37;
    long var38;
    long var4;
    int var48;
    long var5;
    long var54;
    long var55;
    long var56;
    long var57;
    long var58;
    long var59;
    long var60;
    long var61;
    long var62;
    long var63;
    long var64;
    long var65;
    long var66;
    long var8;
    local_8 = var0;
    var2 = 0xffffffff;
    ret = 0xffffffff;
    if (((unsigned long)((unsigned long)((unsigned int)((arg2 - 9)))) < (unsigned long)(0xfffffff8))) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    ret = var2;
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    ret = var2;
    if ((arg1 == 0)) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    ret = var2;
    if ((arg3 == 0)) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    var4 = (unsigned long)((unsigned int)(*(int *)(((long)arg0))));
    var5 = 0xfffffffe;
    ret = 0xfffffffe;
    if (((long)((int)(var4)) < 0)) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg2)) == 1)) {
        L_12f7: ;
        ret = 0xfffffffd;
        if (((unsigned long)((var4 - 0x80000000)) < (unsigned long)(-0x7fffffffLL))) {
            // x86-64 epilogue: tear down frame
            return ret;
        }
        var8 = (unsigned long)((unsigned int)(arg2));
        if (((unsigned long)((unsigned int)(arg2)) != 1)) {
            var11 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var8)) & -2)));
            index = 0;
            var15 = 0;
            do {
                var22 = (((unsigned long)(((long)((int)(*(int *)(((long)arg1 + index * 4)))) * var4)) >> 16) - *(int *)(((long)arg0 + index * 4)));
                *(int *)(((long)arg3 + index * 4)) = var22;
                var33 = (((unsigned long)(((long)((int)(*(int *)(((long)arg1 + index * 4 + 0x4)))) * var4)) >> 16) - *(int *)(((long)arg0 + index * 4 + 0x4)));
                *(int *)(((long)arg3 + index * 4 + 0x4)) = var33;
                var37 = (((unsigned long)((unsigned int)(var33)) != 0) + (unsigned int)((((unsigned long)((unsigned int)(var22)) != 0) + var15)));
                var15 = (unsigned long)((unsigned int)(var37));
                index = (index + 2);
                var38 = (unsigned long)((unsigned int)(index));
                ret = (unsigned long)((unsigned int)(var37));
            } while ((var11 != index));
        } else {
            var38 = 0;
            ret = 0;
        }
        if (((unsigned long)((unsigned char)((var8 & 1))) != 0)) {
            var48 = (((unsigned long)((var4 * (long)((int)(*(int *)(((long)arg1 + var38 * 4)))))) >> 16) - *(int *)(((long)arg0 + var38 * 4)));
            *(int *)(((long)arg3 + var38 * 4)) = var48;
            ret = (unsigned long)((unsigned int)((ret + ((unsigned long)((unsigned int)(var48)) != 0))));
        }
    } else {
        var54 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x4))));
        ret = var5;
        if (((long)((int)(var54)) < 0)) {
            // x86-64 epilogue: tear down frame
            return ret;
        }
        var55 = (var4 + var54);
        var4 = var55;
        if (((unsigned long)((unsigned int)(arg2)) == 2)) {
            goto L_12f7;
        } else {
            var56 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x8))));
            ret = var5;
            if (((long)((int)(var56)) < 0)) {
                // x86-64 epilogue: tear down frame
                return ret;
            }
            var57 = (var55 + var56);
            var4 = var57;
            if (((unsigned long)((unsigned int)(arg2)) == 3)) {
                goto L_12f7;
            } else {
                var58 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0xc))));
                ret = var5;
                if (((long)((int)(var58)) < 0)) {
                    // x86-64 epilogue: tear down frame
                    return ret;
                }
                var59 = (var57 + var58);
                var4 = var59;
                if (((unsigned long)((unsigned int)(arg2)) == 4)) {
                    goto L_12f7;
                } else {
                    var60 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x10))));
                    ret = var5;
                    if (((long)((int)(var60)) < 0)) {
                        // x86-64 epilogue: tear down frame
                        return ret;
                    }
                    var61 = (var59 + var60);
                    var4 = var61;
                    if (((unsigned long)((unsigned int)(arg2)) == 5)) {
                        goto L_12f7;
                    } else {
                        var62 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x14))));
                        ret = var5;
                        if (((long)((int)(var62)) < 0)) {
                            // x86-64 epilogue: tear down frame
                            return ret;
                        }
                        var63 = (var61 + var62);
                        var4 = var63;
                        if (((unsigned long)((unsigned int)(arg2)) == 6)) {
                            goto L_12f7;
                        } else {
                            var64 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x18))));
                            ret = var5;
                            if (((long)((int)(var64)) < 0)) {
                                // x86-64 epilogue: tear down frame
                                return ret;
                            }
                            var65 = (var63 + var64);
                            var4 = var65;
                            if (((unsigned long)((unsigned int)(arg2)) == 7)) {
                                goto L_12f7;
                            } else {
                                var66 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x1c))));
                                ret = var5;
                                if (((long)((int)(var66)) < 0)) {
                                    // x86-64 epilogue: tear down frame
                                    return ret;
                                }
                                var4 = (var65 + var66);
                                goto L_12f7;
                            }
                        }
                    }
                }
            }
        }
    }
    // x86-64 epilogue: tear down frame
    return ret;
}

gcc -O0

2/2
maximum_drift pass 61 lines
// glaurung: maximum_drift @ 0x112a
int32_t maximum_drift(const int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    extern int folio_div_q16(int, int);
    long total;
    int worst;
    int index;
    int weight;
    int drift;
    int magnitude;
    long t160;
    int var22;
    total = 0;
    worst = 0;
    if ((arg0 != 0)) {
        if ((arg1 != 0)) {
            if (((((unsigned long)((unsigned int)(arg2)) == 0) | ((long)(arg2) < 0)) == 0)) {
                if ((((unsigned long)((unsigned int)(arg2)) == 8) | ((long)(arg2) < 8))) {
                    goto L_1174;
                }
            }
        }
    }
    // x86-64 epilogue: restore rbp
    return 0xffffffff;
    L_1174: ;
    index = 0;
    goto L_11c1;
    L_117d: ;
    if (((long)((int)(arg0[(long)(index)])) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0xfffffffe;
    }
    total = (total + (long)((int)(arg0[(long)(index)])));
    index = (index + 1);
    L_11c1: ;
    if ((index < arg2)) {
        goto L_117d;
    }
    if ((total <= 0)) {
        // x86-64 epilogue: restore rbp
        return 0xfffffffd;
    }
    index = 0;
    goto L_1245;
    L_11e0: ;
    var22 = folio_div_q16((unsigned long)((unsigned int)(arg0[(long)(index)])), (unsigned long)((unsigned int)(total)));
    weight = var22;
    drift = ((unsigned int)(weight) - (unsigned int)(arg1[(long)(index)]));
    t160 = (-(unsigned long)((unsigned int)(drift)));
    magnitude = ((0 <= (long)((int)(t160))) ? t160 : (unsigned long)((unsigned int)(drift)));
    if (((((unsigned int)(magnitude) == (unsigned int)(worst)) | (magnitude < worst)) == 0)) {
        worst = magnitude;
    }
    index = (index + 1);
    L_1245: ;
    if ((index < arg2)) {
        goto L_11e0;
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(worst);
}
rebalance_trades pass 59 lines
// glaurung: rebalance_trades @ 0x1252
int32_t rebalance_trades(const int32_t * arg0, const int32_t * arg1, int32_t arg2, int32_t * arg3) {
    long total;
    int nonzero;
    int index;
    int desired;
    total = 0;
    nonzero = 0;
    if ((arg0 != 0)) {
        if ((arg1 != 0)) {
            if ((arg3 != 0)) {
                if (((((unsigned long)((unsigned int)(arg2)) == 0) | ((long)(arg2) < 0)) == 0)) {
                    if ((((unsigned long)((unsigned int)(arg2)) == 8) | ((long)(arg2) < 8))) {
                        goto L_12a3;
                    }
                }
            }
        }
    }
    // x86-64 epilogue: restore rbp
    return 0xffffffff;
    L_12a3: ;
    index = 0;
    goto L_12f0;
    L_12ac: ;
    if (((long)((int)(arg0[(long)(index)])) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0xfffffffe;
    }
    total = (total + (long)((int)(arg0[(long)(index)])));
    index = (index + 1);
    L_12f0: ;
    if ((index < arg2)) {
        goto L_12ac;
    }
    if ((0 < total)) {
        if ((total < 0x80000000)) {
            goto L_1314;
        }
    }
    // x86-64 epilogue: restore rbp
    return 0xfffffffd;
    L_1314: ;
    index = 0;
    goto L_1394;
    L_131d: ;
    desired = ((long)(((long)((int)(arg1[(long)(index)])) * total)) >> 16);
    arg3[(long)(index)] = ((unsigned long)((unsigned int)(desired)) - (unsigned long)((unsigned int)(arg0[(long)(index)])));
    if (((unsigned long)((unsigned int)(arg3[(long)(index)])) != 0)) {
        nonzero = (nonzero + 1);
    }
    index = (index + 1);
    L_1394: ;
    if ((index < arg2)) {
        goto L_131d;
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(nonzero);
}

gcc -O2

2/2
maximum_drift pass 74 lines
// glaurung: maximum_drift @ 0x1100
int32_t maximum_drift(const int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    long total;
    int index;
    int worst;
    int weight;
    long t146;
    long var0;
    long var1;
    long var12;
    long var17;
    long var19;
    long var2;
    long var24;
    int var27;
    long var28;
    long var29;
    long var3;
    int var30;
    long var7;
    var0 = (unsigned long)((unsigned int)(arg2));
    if ((arg0 == 0)) {
        goto L_11a2;
    }
    if ((arg1 == 0)) {
        goto L_11a2;
    }
    var1 = (unsigned long)((unsigned int)((arg2 - 1)));
    if (((unsigned long)(7) < (unsigned long)((unsigned long)((unsigned int)(var1))))) {
        goto L_11a2;
    }
    var2 = (long)arg0;
    var3 = (long)((((long)arg0 + (var1 * 4)) + 4));
    total = 0;
    do {
        var7 = (long)((int)(*(int *)((var2))));
        if (((long)((int)(var7)) < 0)) {
            goto L_1190;
        }
        var2 = (var2 + 4);
        total = (total + var7);
    } while ((var2 != var3));
    if ((total == 0)) {
        goto L_119a;
    }
    index = 0;
    var12 = (long)((int)(total));
    worst = 0;
    do {
        var17 = 0;
        if (((unsigned long)((unsigned int)(total)) != 0)) {
            var19 = ((long)((int)(*(int *)(((long)arg0 + index * 4)))) << 16);
            var17 = ((long)((((__int128)(long)(((long)(var19) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(var19)) / (long)(var12)));
        }
        var24 = (unsigned long)((unsigned int)((var17 - *(int *)(((long)arg1 + index * 4)))));
        t146 = (-(unsigned long)((unsigned int)(var24)));
        var27 = ((0 <= (long)((int)(t146))) ? t146 : var24);
        var28 = ((worst < var27) ? var27 : worst);
        var29 = ((unsigned long)((unsigned int)(index)) + 1);
        worst = var28;
        index = var29;
        var30 = var28;
    } while (((((unsigned int)(var0) == (unsigned int)(var29)) | ((long)((int)(var0)) < (long)((int)(var29)))) == 0));
    L_1186: ;
    return (unsigned int)(var30);
    L_1190: ;
    return 0xfffffffe;
    L_119a: ;
    var30 = 0xfffffffd;
    goto L_1186;
    L_11a2: ;
    var30 = 0xffffffff;
    goto L_1186;
}
rebalance_trades pass 62 lines
// glaurung: rebalance_trades @ 0x11b0
int32_t rebalance_trades(const int32_t * arg0, const int32_t * arg1, int32_t arg2, int32_t * arg3) {
    int index;
    long total;
    int nonzero;
    long var0;
    long var1;
    long var12;
    long var2;
    long var20;
    long var24;
    long var25;
    long var9;
    var0 = (long)arg1;
    var1 = (long)arg3;
    var2 = (unsigned long)((unsigned int)(arg2));
    if ((arg0 == 0)) {
        goto L_123a;
    }
    if ((var0 == 0)) {
        goto L_123a;
    }
    if (((unsigned long)(7) < (unsigned long)((unsigned long)((unsigned int)((arg2 - 1)))))) {
        goto L_123a;
    }
    if ((arg3 == 0)) {
        goto L_123a;
    }
    index = 0;
    total = 0;
    do {
        var9 = (long)((int)(*(int *)(((long)arg0 + index * 4))));
        if (((long)((int)(var9)) < 0)) {
            goto L_1230;
        }
        index = (index + 1);
        total = (total + var9);
    } while (((((unsigned int)(var2) == (unsigned int)(index)) | ((long)((int)(var2)) < (long)(index))) == 0));
    if (((unsigned long)(0x7ffffffe) < (unsigned long)((total - 1)))) {
        goto L_1242;
    }
    var12 = 0;
    nonzero = 0;
    do {
        var20 = (unsigned long)((unsigned int)((((long)(((long)((int)(*(int *)((var0 + var12 * 4)))) * total)) >> 16) - *(int *)(((long)arg0 + var12 * 4)))));
        *(int *)((var1 + var12 * 4)) = var20;
        nonzero = (unsigned int)(((unsigned int)((nonzero + 1)) - ((unsigned long)((unsigned long)((unsigned int)(var20))) < (unsigned long)(1))));
        var24 = (var12 + 1);
        var12 = var24;
        var25 = (unsigned long)((unsigned int)(nonzero));
    } while (((((unsigned int)(var2) == (unsigned int)(var24)) | ((long)((int)(var2)) < (long)((int)(var24)))) == 0));
    L_122a: ;
    return (unsigned int)(var25);
    L_1230: ;
    return 0xfffffffe;
    L_123a: ;
    var25 = 0xffffffff;
    goto L_122a;
    L_1242: ;
    var25 = 0xfffffffd;
    goto L_122a;
}

← 213 fixtures