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.

tests/decompiler_fixtures/src/75_order_book.c source
#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/1
match_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/1
match_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/1
match_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/1
match_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;
}

← 213 fixtures