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.
#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/2maximum_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/2maximum_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/2maximum_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/2maximum_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;
}