Fixture 75
order book
C · 1 functions · 4 lanes · 4 of 4 function-lanes behave identically
All 4 lanes recompile and return the same results as the original.
A price-time priority matching engine over two sorted flat arrays. An incoming order walks the opposing side while it crosses, partially filling resting quantities and compacting the book -- array mutation driven by a two-sided comparison.
#include <stdint.h>
/* A price-time priority matching engine over two sorted flat arrays. An
* incoming order walks the opposing side while it crosses, partially filling
* resting quantities and compacting the book -- array mutation driven by a
* two-sided comparison. */
#define BOOK_MAX 8
__attribute__((noinline)) int32_t
match_order(int32_t *resting_prices, int32_t *resting_quantities,
int32_t resting_count, int32_t incoming_price,
int32_t incoming_quantity, int32_t is_buy, int32_t *filled_out) {
int32_t filled = 0;
int32_t level = 0;
int32_t survivors = 0;
int32_t index;
if (resting_prices == 0 || resting_quantities == 0 || filled_out == 0 ||
resting_count < 0 || resting_count > BOOK_MAX ||
incoming_quantity < 0 || incoming_quantity > 1000000) {
return -1;
}
while (level < resting_count && filled < incoming_quantity) {
int32_t price = resting_prices[level];
int32_t available = resting_quantities[level];
int32_t crosses = is_buy ? (price <= incoming_price)
: (price >= incoming_price);
int32_t take;
if (!crosses || available <= 0) {
break;
}
take = incoming_quantity - filled;
if (take > available) {
take = available;
}
resting_quantities[level] = available - take;
filled += take;
level += 1;
}
for (index = 0; index < resting_count; ++index) {
if (resting_quantities[index] > 0) {
resting_prices[survivors] = resting_prices[index];
resting_quantities[survivors] = resting_quantities[index];
survivors += 1;
}
}
for (index = survivors; index < resting_count; ++index) {
resting_prices[index] = 0;
resting_quantities[index] = 0;
}
*filled_out = filled;
return survivors;
} 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/1match_order pass 99 lines
// glaurung: match_order @ 0x1100
int32_t match_order(int32_t * arg0, int32_t * arg1, int32_t arg2, int32_t arg3, int32_t arg4, int32_t arg5, int32_t * arg6) {
int filled;
int level;
int survivors;
int price;
int available;
int crosses;
int take;
int index;
int local_4;
signed char local_49;
int local_50;
long t197;
filled = 0;
level = 0;
survivors = 0;
if ((arg0 != 0)) {
if ((arg1 != 0)) {
if ((arg6 != 0)) {
if ((0 <= (long)(arg2))) {
if (((((unsigned long)((unsigned int)(arg2)) == 8) | ((long)(arg2) < 8)) != 0)) {
if ((0 <= (long)(arg4))) {
if ((((unsigned long)((unsigned int)(arg4)) == 0xf4240) | ((long)(arg4) < 0xf4240))) {
goto L_118b;
}
}
}
}
}
}
}
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
L_118b: ;
goto L_1190;
L_1190: ;
local_49 = 0;
if ((level < arg2)) {
local_49 = (filled < arg4);
}
if (((unsigned long)((unsigned char)((local_49 & 1))) == 0)) {
goto L_126c;
}
price = arg0[(long)(level)];
available = arg1[(long)(level)];
if (((unsigned long)((unsigned int)(arg5)) != 0)) {
local_50 = (unsigned char)(((((unsigned int)(price) == (unsigned int)(arg3)) | (price < arg3)) & 1));
goto L_120a;
}
local_50 = (arg3 <= price);
L_120a: ;
crosses = local_50;
if (((unsigned long)((unsigned int)(crosses)) != 0)) {
if (((((unsigned long)((unsigned int)(available)) == 0) | ((long)(available) < 0)) == 0)) {
goto L_1229;
}
}
goto L_126c;
L_1229: ;
take = ((unsigned int)(arg4) - filled);
if (((((unsigned int)(take) == (unsigned int)(available)) | (take < available)) == 0)) {
take = available;
}
arg1[(long)(level)] = ((unsigned long)((unsigned int)(available)) - take);
filled = ((unsigned int)(take) + filled);
level = ((unsigned int)(level) + 1);
goto L_1190;
L_126c: ;
index = 0;
L_1273: ;
if ((arg2 <= index)) {
goto L_12d9;
}
t197 = arg1[(long)(index)];
if (((((unsigned long)((unsigned int)(t197)) == 0) | ((long)((int)(t197)) < 0)) == 0)) {
arg0[(long)(survivors)] = arg0[(long)(index)];
arg1[(long)(survivors)] = arg1[(long)(index)];
survivors = ((unsigned int)(survivors) + 1);
}
goto L_12cb;
L_12cb: ;
index = ((unsigned int)(index) + 1);
goto L_1273;
L_12d9: ;
index = survivors;
L_12df: ;
if ((index < arg2)) {
arg0[(long)(index)] = 0;
arg1[(long)(index)] = 0;
index = ((unsigned int)(index) + 1);
goto L_12df;
}
*(int *)((long)arg6) = filled;
local_4 = survivors;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} clang -O2
1/1match_order pass 346 lines
// glaurung: match_order @ 0x1100
int32_t match_order(int32_t * arg0, int32_t * arg1, int32_t arg2, int32_t arg3, int32_t arg4, int32_t arg5, int32_t * arg6) {
int filled;
int level;
int available;
int take;
int survivors;
int index;
long local_10;
long local_18;
long local_20;
long local_28;
long local_30;
long ret;
long t10;
long t190;
long t191;
long t192;
long var0;
long var1;
long var100;
long var102;
long var104;
long var106;
long var107;
long var109;
int * var11;
int var110;
int var111;
int var112;
int var113;
long var13;
long var15;
long var2;
long var3;
long var35;
int var39;
long var4;
long var40;
long var43;
long var48;
int var52;
long var53;
int var57;
long var58;
long var59;
int var66;
long var67;
long var68;
long var70;
long var71;
long var76;
long var77;
long var78;
long var79;
long var82;
long var83;
long var86;
long var89;
long var90;
long var92;
long var95;
int var96;
int var97;
int var98;
int var99;
local_10 = var0;
local_18 = var1;
local_20 = var2;
local_28 = var3;
local_30 = var4;
ret = 0xffffffff;
if (((unsigned long)(0xf4240) < (unsigned long)((unsigned long)((unsigned int)(arg4))))) {
// x86-64 epilogue: tear down frame
return ret;
}
if (((unsigned long)(8) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
// x86-64 epilogue: tear down frame
return ret;
}
if ((arg0 == 0)) {
// x86-64 epilogue: tear down frame
return ret;
}
if ((arg1 == 0)) {
// x86-64 epilogue: tear down frame
return ret;
}
var11 = (int *)arg6;
if ((arg6 == 0)) {
// x86-64 epilogue: tear down frame
return ret;
}
ret = 0;
var13 = (unsigned long)((unsigned int)(arg2));
var15 = 0;
if ((((unsigned long)((unsigned int)(arg2)) != 0) && ((unsigned long)((unsigned int)(arg4)) != 0))) {
filled = 0;
level = 1;
while (1) {
t10 = *(int *)(((long)arg0 + level * 4 - 0x4));
var15 = (unsigned long)((unsigned int)(filled));
if (((unsigned long)((unsigned char)(((((unsigned long)((unsigned int)(arg5)) == 0) ? ((long)((int)(t10)) < (long)(arg3)) : ((((unsigned int)(t10) == (unsigned int)(arg3)) | ((long)((int)(t10)) < (long)(arg3))) == 0)) & 255))) != 0)) {
break;
}
available = (unsigned long)((unsigned int)(*(int *)(((long)arg1 + level * 4 - 0x4))));
var15 = (unsigned long)((unsigned int)(filled));
if ((((unsigned long)((unsigned int)(available)) == 0) | ((long)(available) < 0))) {
break;
}
var35 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg4)) - filled)));
take = (((((unsigned int)(var35) == (unsigned int)(available)) | ((long)((int)(var35)) < (long)(available))) == 0) ? available : var35);
*(int *)(((long)arg1 + level * 4 - 0x4)) = (available - take);
var39 = (filled + take);
filled = (unsigned long)((unsigned int)(var39));
var15 = (unsigned long)((unsigned int)(var39));
if (((unsigned long)(var13) <= (unsigned long)(level))) {
break;
}
level = (level + 1);
var15 = (unsigned long)((unsigned int)(filled));
if ((arg4 <= filled)) {
break;
}
}
}
var40 = ret;
if (((unsigned long)((unsigned int)(arg2)) != 0)) {
if (((unsigned long)((unsigned int)(arg2)) != 1)) {
var43 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var13)) & -2)));
ret = 0;
survivors = 0;
var48 = 0;
do {
t191 = *(int *)(((long)arg1 + var48 * 4));
if (((((unsigned long)((unsigned int)(t191)) == 0) | ((long)((int)(t191)) < 0)) == 0)) {
arg0[(long)(survivors)] = *(int *)(((long)arg0 + var48 * 4));
arg1[(long)(survivors)] = *(int *)(((long)arg1 + var48 * 4));
var52 = ((long)(survivors) + 1);
ret = (unsigned long)((unsigned int)(var52));
survivors = (unsigned long)((unsigned int)(var52));
}
t192 = *(int *)(((long)arg1 + var48 * 4 + 0x4));
var53 = (unsigned long)((unsigned int)(survivors));
if (((((unsigned long)((unsigned int)(t192)) == 0) | ((long)((int)(t192)) < 0)) == 0)) {
arg0[(long)(survivors)] = *(int *)(((long)arg0 + var48 * 4 + 0x4));
arg1[(long)(survivors)] = *(int *)(((long)arg1 + var48 * 4 + 0x4));
var57 = ((long)(survivors) + 1);
ret = (unsigned long)((unsigned int)(var57));
var53 = (unsigned long)((unsigned int)(var57));
}
var58 = (var48 + 2);
var59 = var53;
survivors = var53;
var48 = var58;
} while ((var43 != var58));
} else {
ret = 0;
var59 = 0;
var58 = 0;
}
var40 = var59;
if (((unsigned long)((unsigned char)((var13 & 1))) != 0)) {
t190 = *(int *)(((long)arg1 + var58 * 4));
var40 = var59;
if (((((unsigned long)((unsigned int)(t190)) == 0) | ((long)((int)(t190)) < 0)) == 0)) {
arg0[(long)((int)(var59))] = *(int *)(((long)arg0 + var58 * 4));
arg1[(long)((int)(var59))] = *(int *)(((long)arg1 + var58 * 4));
var66 = ((long)((int)(var59)) + 1);
ret = (unsigned long)((unsigned int)(var66));
var40 = (unsigned long)((unsigned int)(var66));
}
}
}
if (((long)((int)(var40)) < (long)(arg2))) {
var67 = (long)((int)(var40));
var68 = (long)(arg2);
var70 = ((long)(arg2) - (long)((int)(var40)));
var71 = (long)((int)(var40));
if (((unsigned long)(var70) < (unsigned long)(8))) {
L_1379: ;
var76 = ((~var71) + var68);
var77 = ((unsigned long)((unsigned int)((arg2 - var71))) & 3);
if ((var77 != 0)) {
var78 = var71;
while ((var77 != 0)) {
*(int *)(((long)arg0 + var78 * 4)) = 0;
*(int *)(((long)arg1 + var78 * 4)) = 0;
var78 = (var78 + 1);
var77 = (var77 - 1);
var71 = var78;
}
}
if (((unsigned long)(3) <= (unsigned long)(var76))) {
do {
*(int *)(((long)arg0 + var71 * 4)) = 0;
*(int *)(((long)arg1 + var71 * 4)) = 0;
*(int *)(((long)arg0 + var71 * 4 + 0x4)) = 0;
*(int *)(((long)arg1 + var71 * 4 + 0x4)) = 0;
*(int *)(((long)arg0 + var71 * 4 + 0x8)) = 0;
*(int *)(((long)arg1 + var71 * 4 + 0x8)) = 0;
*(int *)(((long)arg0 + var71 * 4 + 0xc)) = 0;
*(int *)(((long)arg1 + var71 * 4 + 0xc)) = 0;
var71 = (var71 + 4);
} while ((var68 != var71));
}
} else {
var79 = (long)(((long)arg0 + (var67 * 4)));
if (((unsigned long)(((long)arg1 + (var68 * 4))) <= (unsigned long)(var79))) {
L_1224: ;
var82 = (var70 & -8);
var83 = (var82 - 8);
var86 = (((unsigned long)(var83) >> 3) + 1);
var89 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var86)) & 3)));
if (((unsigned long)(24) <= (unsigned long)(var83))) {
var90 = (var86 & -4);
var92 = (long)((((long)arg1 + (var67 * 4)) + 112));
var79 = (long)((((long)arg0 + (var67 * 4)) + 112));
var95 = 0;
ret = 0;
var96 = 0;
var97 = 0;
var98 = 0;
var99 = 0;
do {
*(int *)((var79 + var95 * 4 - 0x70)) = var96;
*(int *)((var79 + var95 * 4 - 0x6c)) = var97;
*(int *)((var79 + var95 * 4 - 0x68)) = var98;
*(int *)((var79 + var95 * 4 - 0x64)) = var99;
*(int *)((var79 + var95 * 4 - 0x60)) = var96;
*(int *)((var79 + var95 * 4 - 0x5c)) = var97;
*(int *)((var79 + var95 * 4 - 0x58)) = var98;
*(int *)((var79 + var95 * 4 - 0x54)) = var99;
*(int *)((var92 + var95 * 4 - 0x70)) = var96;
*(int *)((var92 + var95 * 4 - 0x6c)) = var97;
*(int *)((var92 + var95 * 4 - 0x68)) = var98;
*(int *)((var92 + var95 * 4 - 0x64)) = var99;
*(int *)((var92 + var95 * 4 - 0x60)) = var96;
*(int *)((var92 + var95 * 4 - 0x5c)) = var97;
*(int *)((var92 + var95 * 4 - 0x58)) = var98;
*(int *)((var92 + var95 * 4 - 0x54)) = var99;
*(int *)((var79 + var95 * 4 - 0x50)) = var96;
*(int *)((var79 + var95 * 4 - 0x4c)) = var97;
*(int *)((var79 + var95 * 4 - 0x48)) = var98;
*(int *)((var79 + var95 * 4 - 0x44)) = var99;
*(int *)((var79 + var95 * 4 - 0x40)) = var96;
*(int *)((var79 + var95 * 4 - 0x3c)) = var97;
*(int *)((var79 + var95 * 4 - 0x38)) = var98;
*(int *)((var79 + var95 * 4 - 0x34)) = var99;
*(int *)((var92 + var95 * 4 - 0x50)) = var96;
*(int *)((var92 + var95 * 4 - 0x4c)) = var97;
*(int *)((var92 + var95 * 4 - 0x48)) = var98;
*(int *)((var92 + var95 * 4 - 0x44)) = var99;
*(int *)((var92 + var95 * 4 - 0x40)) = var96;
*(int *)((var92 + var95 * 4 - 0x3c)) = var97;
*(int *)((var92 + var95 * 4 - 0x38)) = var98;
*(int *)((var92 + var95 * 4 - 0x34)) = var99;
*(int *)((var79 + var95 * 4 - 0x30)) = var96;
*(int *)((var79 + var95 * 4 - 0x2c)) = var97;
*(int *)((var79 + var95 * 4 - 0x28)) = var98;
*(int *)((var79 + var95 * 4 - 0x24)) = var99;
*(int *)((var79 + var95 * 4 - 0x20)) = var96;
*(int *)((var79 + var95 * 4 - 0x1c)) = var97;
*(int *)((var79 + var95 * 4 - 0x18)) = var98;
*(int *)((var79 + var95 * 4 - 0x14)) = var99;
*(int *)((var92 + var95 * 4 - 0x30)) = var96;
*(int *)((var92 + var95 * 4 - 0x2c)) = var97;
*(int *)((var92 + var95 * 4 - 0x28)) = var98;
*(int *)((var92 + var95 * 4 - 0x24)) = var99;
*(int *)((var92 + var95 * 4 - 0x20)) = var96;
*(int *)((var92 + var95 * 4 - 0x1c)) = var97;
*(int *)((var92 + var95 * 4 - 0x18)) = var98;
*(int *)((var92 + var95 * 4 - 0x14)) = var99;
*(int *)((var79 + var95 * 4 - 0x10)) = var96;
*(int *)((var79 + var95 * 4 - 0xc)) = var97;
*(int *)((var79 + var95 * 4 - 0x8)) = var98;
*(int *)((var79 + var95 * 4 - 0x4)) = var99;
*(int *)((var79 + var95 * 4)) = var96;
*(int *)((var79 + var95 * 4 + 0x4)) = var97;
*(int *)((var79 + var95 * 4 + 0x8)) = var98;
*(int *)((var79 + var95 * 4 + 0xc)) = var99;
*(int *)((var92 + var95 * 4 - 0x10)) = var96;
*(int *)((var92 + var95 * 4 - 0xc)) = var97;
*(int *)((var92 + var95 * 4 - 0x8)) = var98;
*(int *)((var92 + var95 * 4 - 0x4)) = var99;
*(int *)((var92 + var95 * 4)) = var96;
*(int *)((var92 + var95 * 4 + 0x4)) = var97;
*(int *)((var92 + var95 * 4 + 0x8)) = var98;
*(int *)((var92 + var95 * 4 + 0xc)) = var99;
var95 = (var95 + 32);
var90 = (var90 - 4);
var100 = var95;
} while ((var90 != 0));
} else {
var100 = 0;
}
if ((var89 != 0)) {
var102 = (var100 + var67);
var104 = (long)((((long)arg1 + (var102 * 4)) + 16));
var106 = (long)((((long)arg0 + (var102 * 4)) + 16));
var107 = (var89 << 5);
var109 = 0;
ret = 0;
var110 = 0;
var111 = 0;
var112 = 0;
var113 = 0;
do {
*(int *)((var106 + var109 - 0x10)) = var110;
*(int *)((var106 + var109 - 0xc)) = var111;
*(int *)((var106 + var109 - 0x8)) = var112;
*(int *)((var106 + var109 - 0x4)) = var113;
*(int *)((var106 + var109)) = var110;
*(int *)((var106 + var109 + 0x4)) = var111;
*(int *)((var106 + var109 + 0x8)) = var112;
*(int *)((var106 + var109 + 0xc)) = var113;
*(int *)((var104 + var109 - 0x10)) = var110;
*(int *)((var104 + var109 - 0xc)) = var111;
*(int *)((var104 + var109 - 0x8)) = var112;
*(int *)((var104 + var109 - 0x4)) = var113;
*(int *)((var104 + var109)) = var110;
*(int *)((var104 + var109 + 0x4)) = var111;
*(int *)((var104 + var109 + 0x8)) = var112;
*(int *)((var104 + var109 + 0xc)) = var113;
var109 = (var109 + 32);
} while ((var107 != var109));
}
if ((var70 != var82)) {
var71 = (var67 + var82);
goto L_1379;
}
} else {
var79 = (long)(((long)arg0 + (var68 * 4)));
var71 = var67;
if (((unsigned long)(((long)arg1 + (var67 * 4))) < (unsigned long)(var79))) {
goto L_1379;
} else {
goto L_1224;
}
}
}
}
*(int *)((var11)) = var15;
// x86-64 epilogue: tear down frame
return ret;
} gcc -O0
1/1match_order pass 77 lines
// glaurung: match_order @ 0x10f9
int32_t match_order(int32_t * arg0, int32_t * arg1, int32_t arg2, int32_t arg3, int32_t arg4, int32_t arg5, int32_t * arg6) {
int filled;
int level;
int survivors;
int price;
int available;
int crosses;
int take;
int index;
long t168;
// x86-64 prologue: save rbp
filled = 0;
level = 0;
survivors = 0;
if ((arg0 == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
if ((arg1 == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
if ((arg6 == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
if (((long)(arg2) < 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
if (((((unsigned long)((unsigned int)(arg2)) == 8) | ((long)(arg2) < 8)) == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
if (((long)(arg4) < 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
if (((((unsigned long)((unsigned int)(arg4)) == 0xf4240) | ((long)(arg4) < 0xf4240)) == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
while ((level < arg2)) {
if ((arg4 <= filled)) {
break;
}
price = arg0[(long)(level)];
available = arg1[(long)(level)];
crosses = (((unsigned long)((unsigned int)(arg5)) == 0) ? (arg3 <= price) : (unsigned int)((unsigned char)(((((unsigned int)(price) == (unsigned int)(arg3)) | (price < arg3)) & 255))));
if ((((unsigned long)((unsigned int)(crosses)) == 0) || (((unsigned long)((unsigned int)(available)) == 0) | ((long)(available) < 0)))) {
break;
}
take = ((unsigned int)(arg4) - filled);
if (((((unsigned int)(take) == (unsigned int)(available)) | (take < available)) == 0)) {
take = available;
}
arg1[(long)(level)] = ((unsigned long)((unsigned int)(available)) - take);
filled = (filled + (unsigned int)(take));
level = (level + 1);
}
for (index = 0; (index < arg2); index++) {
t168 = (unsigned long)((unsigned int)(arg1[(long)(index)]));
if (((((unsigned long)((unsigned int)(t168)) == 0) | ((long)((int)(t168)) < 0)) == 0)) {
arg0[(long)(survivors)] = arg0[(long)(index)];
arg1[(long)(survivors)] = arg1[(long)(index)];
survivors = (survivors + 1);
}
}
for (index = survivors; (index < arg2); index++) {
arg0[(long)(index)] = 0;
arg1[(long)(index)] = 0;
}
*(int *)((long)arg6) = filled;
// x86-64 epilogue: restore rbp
return (unsigned int)(survivors);
} gcc -O2
1/1match_order pass 168 lines
// glaurung: match_order @ 0x1120
int32_t match_order(int32_t * arg0, int32_t * arg1, int32_t arg2, int32_t arg3, int32_t arg4, int32_t arg5, int32_t * arg6) {
extern void * memset(void *, int, __SIZE_TYPE__);
int filled;
int price;
int available;
int take;
int level;
int index;
int crosses;
long ret;
long t156;
int * var0;
long var1;
long var13;
long var17;
long var2;
int var21;
long var27;
long var33;
long var36;
long var44;
long var45;
long var47;
long var50;
long var51;
long var52;
long var53;
long var54;
long var56;
long var59;
long var60;
void * var62;
void * var65;
long var67;
long var68;
long var8;
var0 = (int *)arg6;
if ((arg0 == 0)) {
goto L_129f;
}
if ((arg1 == 0)) {
goto L_129f;
}
if ((var0 == 0)) {
goto L_129f;
}
var1 = (unsigned long)((unsigned int)(arg2));
if (((unsigned long)(8) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
goto L_129f;
}
if (((unsigned long)(0xf4240) < (unsigned long)((unsigned long)((unsigned int)(arg4))))) {
goto L_129f;
}
if ((((unsigned long)((unsigned int)(arg4)) == 0) | ((long)(arg4) < 0))) {
goto L_1294;
}
if ((((unsigned long)((unsigned int)(arg2)) == 0) | ((long)(arg2) < 0))) {
goto L_1298;
}
var2 = (unsigned long)((unsigned int)(arg3));
filled = 0;
var8 = 0;
goto L_11b9;
L_1180: ;
var13 = (unsigned long)((unsigned int)(filled));
if (((unsigned long)((unsigned int)((unsigned char)(((((unsigned int)(price) == (unsigned int)(var2)) | ((long)(price) < (long)((int)(var2)))) & 255)))) == 0)) {
goto L_11d8;
}
L_118d: ;
var13 = (unsigned long)((unsigned int)(filled));
if ((((unsigned long)((unsigned int)(available)) == 0) | ((long)(available) < 0))) {
goto L_11d8;
}
var17 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg4)) - filled)));
take = (((((unsigned int)(var17) == (unsigned int)(available)) | ((long)((int)(var17)) < (long)(available))) == 0) ? available : var17);
var21 = (filled + take);
*(int *)(((long)arg1 + var8 * 4)) = (available - take);
level = (unsigned long)((unsigned int)((var8 + 1)));
var27 = (((unsigned long)((unsigned int)(level)) & -256) | ((((unsigned int)(arg4) == (unsigned int)(var21)) | (arg4 < var21)) == 0));
filled = (unsigned long)((unsigned int)(var21));
var8 = (var8 + 1);
available = var27;
var13 = (unsigned long)((unsigned int)(var21));
if (((unsigned long)((unsigned char)((((((unsigned int)(var1) == (unsigned int)(level)) | ((long)((int)(var1)) < (long)(level))) == 0) & (var27 & 255)))) == 0)) {
goto L_11d8;
}
L_11b9: ;
price = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + var8 * 4))));
available = (unsigned long)((unsigned int)(*(int *)(((long)arg1 + var8 * 4))));
if (((unsigned long)((unsigned int)(arg5)) != 0)) {
goto L_1180;
}
if (((long)((int)(var2)) <= (long)(price))) {
goto L_118d;
}
var13 = (unsigned long)((unsigned int)(filled));
L_11d8: ;
var33 = 0;
var36 = 0;
do {
t156 = (unsigned long)((unsigned int)(*(int *)(((long)arg1 + var33 * 4))));
index = var36;
if (((((unsigned long)((unsigned int)(t156)) == 0) | ((long)((int)(t156)) < 0)) == 0)) {
arg0[(long)((int)(var36))] = *(int *)(((long)arg0 + var33 * 4));
arg1[(long)((int)(var36))] = *(int *)(((long)arg1 + var33 * 4));
index = (unsigned long)((unsigned int)((var36 + 1)));
}
var44 = (var33 + 1);
var36 = (unsigned long)((unsigned int)(index));
var33 = var44;
} while (((((unsigned int)(var1) == (unsigned int)(var44)) | ((long)((int)(var1)) < (long)((int)(var44)))) == 0));
var45 = var13;
if (((long)((int)(var1)) <= (long)(index))) {
goto L_1263;
}
var47 = (long)(index);
var50 = ((long)(index) + 1);
var51 = ((long)(index) * 4);
var52 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var1)) - index))) - 1)));
var53 = (long)(((long)arg1 + var51));
var54 = (long)((var51 + (long)arg0));
var56 = ((var50 + var52) << 2);
if (((unsigned long)(var53) < (unsigned long)(((long)arg0 + var56)))) {
var59 = var47;
if (((unsigned long)(var54) < (unsigned long)((var56 + (long)arg1)))) {
goto L_127c;
}
}
var60 = ((var52 * 4) + 4);
var62 = memset((void *)(var54), 0, (__SIZE_TYPE__)(var60));
var65 = memset((void *)(var53), 0, (__SIZE_TYPE__)(var60));
var45 = var13;
L_1263: ;
*(int *)((var0)) = var45;
var67 = (unsigned long)((unsigned int)(index));
L_1265: ;
ret = (unsigned long)((unsigned int)(var67));
// x86-64 epilogue: tear down frame
return (unsigned int)(var67);
L_1278: ;
var50 = (var50 + 1);
var59 = var68;
L_127c: ;
*(int *)(((long)arg0 + var59 * 4)) = 0;
*(int *)(((long)arg1 + var59 * 4)) = 0;
var68 = var50;
if (((((unsigned int)(var1) == (unsigned int)(var50)) | ((long)((int)(var1)) < (long)((int)(var50)))) == 0)) {
goto L_1278;
}
var45 = var13;
goto L_1263;
L_1294: ;
if (((((unsigned long)((unsigned int)(arg2)) == 0) | ((long)(arg2) < 0)) == 0)) {
goto L_12a7;
}
L_1298: ;
var45 = 0;
index = 0;
goto L_1263;
L_129f: ;
var67 = 0xffffffff;
goto L_1265;
L_12a7: ;
available = ret;
var13 = 0;
goto L_11d8;
}