Fixture 188

vector transport

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

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

128-bit memory transports, in the shapes that actually reach src/ir/vector_copy.rs.

A compiler lowers a plain element copy into packed XMM load/store batches, and the lifter represents each batch as four independent dword lanes so lane-wise arithmetic stays analyzable. Rejoining an untouched load/store pair back into one 16-byte transport is what lets the C backend emit a copy instead of four scalar moves.

Before this fixture the entire pass had one lane — 09_memory_effects at clang:O2 — and nothing covering the shape that matters most: two transports INTERLEAVED, where each load batch is followed by its own scalar-view bridge before either store batch appears. A fix that handled only a single non-interleaved bridge passed its unit tests and still failed on a real binary, because clang emits load A / bridge A / load B / bridge B / store A / store B.

vt188_lane_math is the control. Its loop reads and WRITES individual elements with different values, so the batches are not an untouched transport and must not be rejoined into a 16-byte copy. Recovering a transport is only correct if it is not recovered where none exists.

tests/decompiler_fixtures/src/188_vector_transport.c source
#include <stdint.h>

/* 128-bit memory transports, in the shapes that actually reach
 * `src/ir/vector_copy.rs`.
 *
 * A compiler lowers a plain element copy into packed XMM load/store batches,
 * and the lifter represents each batch as four independent dword lanes so
 * lane-wise arithmetic stays analyzable. Rejoining an untouched load/store pair
 * back into one 16-byte transport is what lets the C backend emit a copy
 * instead of four scalar moves.
 *
 * Before this fixture the entire pass had one lane — `09_memory_effects` at
 * `clang:O2` — and nothing covering the shape that matters most: two transports
 * INTERLEAVED, where each load batch is followed by its own scalar-view bridge
 * before either store batch appears. A fix that handled only a single
 * non-interleaved bridge passed its unit tests and still failed on a real
 * binary, because clang emits `load A / bridge A / load B / bridge B /
 * store A / store B`.
 *
 * `vt188_lane_math` is the control. Its loop reads and WRITES individual
 * elements with different values, so the batches are not an untouched
 * transport and must not be rejoined into a 16-byte copy. Recovering a
 * transport is only correct if it is not recovered where none exists. */

#define VT188_CAP 64

__attribute__((noinline)) int32_t vt188_copy_forward(int32_t *dst,
                                                    const int32_t *src,
                                                    int32_t count) {
    int32_t index;
    if (dst == 0 || src == 0 || count < 0 || count > VT188_CAP) {
        return -1;
    }
    for (index = 0; index < count; ++index) {
        dst[index] = src[index];
    }
    return count;
}

__attribute__((noinline)) int32_t vt188_copy_two_streams(int32_t *first_dst,
                                                        int32_t *second_dst,
                                                        const int32_t *src,
                                                        int32_t count) {
    int32_t index;
    if (first_dst == 0 || second_dst == 0 || src == 0 || count < 0 ||
        count > VT188_CAP) {
        return -1;
    }
    /* Two independent transports in one loop body. Vectorized, this is the
     * interleaved batch layout: both loads (each with its own scalar-view
     * bridge) precede both stores. */
    for (index = 0; index < count; ++index) {
        first_dst[index] = src[index];
        second_dst[index] = src[index];
    }
    return count;
}

__attribute__((noinline)) int32_t vt188_copy_backward(int32_t *dst,
                                                      const int32_t *src,
                                                      int32_t count) {
    int32_t index;
    if (dst == 0 || src == 0 || count < 0 || count > VT188_CAP) {
        return -1;
    }
    /* Descending order: the same transport with the address arithmetic running
     * the other way, so an address-adjacency check keyed on ascending
     * displacement alone does not accidentally pass. */
    for (index = count - 1; index >= 0; --index) {
        dst[index] = src[index];
    }
    return count;
}

__attribute__((noinline)) int32_t vt188_lane_math(int32_t *dst,
                                                  const int32_t *src,
                                                  int32_t count) {
    int32_t index;
    int32_t total = 0;
    if (dst == 0 || src == 0 || count < 0 || count > VT188_CAP) {
        return -1;
    }
    /* CONTROL: every element is transformed, so this is lane computation and
     * not a transport. Rejoining it into a 16-byte copy would silently drop
     * the arithmetic. */
    for (index = 0; index < count; ++index) {
        dst[index] = src[index] * 3 + 1;
        total += dst[index];
    }
    return total;
}

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

4/4
vt188_copy_backward pass 34 lines
// glaurung: vt188_copy_backward @ 0x1240
int32_t vt188_copy_backward(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int index;
    int local_4;
    // x86-64 prologue: save rbp
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if ((arg1 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg2) < 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg2)) == 64) | ((long)(arg2) < 64)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    index = ((unsigned int)(arg2) - 1);
    while ((0 <= (long)(index))) {
        arg0[(long)(index)] = arg1[(long)(index)];
        index = ((unsigned int)(index) - 1);
    }
    local_4 = arg2;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
vt188_copy_forward pass 32 lines
// glaurung: vt188_copy_forward @ 0x1100
int32_t vt188_copy_forward(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int index;
    int local_4;
    // x86-64 prologue: save rbp
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if ((arg1 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg2) < 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg2)) == 64) | ((long)(arg2) < 64)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    for (index = 0; (index < arg2); index++) {
        arg0[(long)(index)] = arg1[(long)(index)];
    }
    local_4 = arg2;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
vt188_copy_two_streams pass 38 lines
// glaurung: vt188_copy_two_streams @ 0x1190
int32_t vt188_copy_two_streams(int32_t * arg0, int32_t * arg1, const int32_t * arg2, int32_t arg3) {
    int index;
    int local_4;
    // x86-64 prologue: save rbp
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if ((arg1 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if ((arg2 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg3) < 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg3)) == 64) | ((long)(arg3) < 64)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    for (index = 0; (index < arg3); index++) {
        arg0[(long)(index)] = arg2[(long)(index)];
        arg1[(long)(index)] = arg2[(long)(index)];
    }
    local_4 = arg3;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}
vt188_lane_math pass 35 lines
// glaurung: vt188_lane_math @ 0x12d0
int32_t vt188_lane_math(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int total;
    int index;
    int local_4;
    // x86-64 prologue: save rbp
    total = 0;
    if ((arg0 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if ((arg1 == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((long)(arg2) < 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    if (((((unsigned long)((unsigned int)(arg2)) == 64) | ((long)(arg2) < 64)) == 0)) {
        local_4 = -1;
        // x86-64 epilogue: restore rbp
        return (unsigned int)(local_4);
    }
    for (index = 0; (index < arg2); index++) {
        arg0[(long)(index)] = ((arg1[(long)(index)] * 3) + 1);
        total = ((unsigned int)(arg0[(long)(index)]) + total);
    }
    local_4 = total;
    // x86-64 epilogue: restore rbp
    return (unsigned int)(local_4);
}

clang -O2

4/4
vt188_copy_backward pass 264 lines
// glaurung: vt188_copy_backward @ 0x1420
int32_t vt188_copy_backward(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    long ret;
    long var1;
    int var101;
    int var102;
    int var103;
    long var11;
    long var17;
    long var18;
    int var19;
    long var2;
    int var20;
    int var21;
    int var22;
    int var24;
    int var25;
    int var26;
    long var27;
    int var29;
    long var3;
    int var31;
    int var32;
    int var33;
    int var34;
    int var36;
    int var37;
    int var38;
    int var40;
    int var42;
    int var43;
    int var44;
    int var45;
    int var47;
    int var48;
    int var49;
    long var5;
    int var51;
    int var53;
    int var54;
    int var55;
    int var56;
    int var58;
    int var59;
    long var6;
    int var60;
    int var62;
    int var64;
    int var65;
    int var66;
    int var67;
    int var69;
    int var70;
    int var71;
    int var73;
    int var75;
    int var76;
    int var77;
    int var78;
    int var80;
    int var81;
    int var82;
    int var84;
    int var86;
    int var87;
    int var88;
    int var89;
    int var91;
    int var92;
    int var93;
    int var94;
    int var96;
    int var97;
    int var98;
    int var99;
    ret = 0xffffffff;
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        return ret;
    }
    if ((arg0 == 0)) {
        return ret;
    }
    if ((arg1 == 0)) {
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        return 0;
    }
    var1 = (unsigned long)((unsigned int)(arg2));
    if (((unsigned long)((unsigned long)((unsigned int)(arg2))) < (unsigned long)(8))) {
        L_15c4: ;
        var2 = (var1 + 1);
        do {
            var3 = (unsigned long)((unsigned int)((var2 - 2)));
            *(int *)(((long)arg0 + var3 * 4)) = *(int *)(((long)arg1 + var3 * 4));
            var2 = (var2 - 1);
        } while (((unsigned long)(1) < (unsigned long)(var2)));
    } else {
        var5 = (var1 - 1);
        var6 = (unsigned long)((unsigned int)((arg2 - 1)));
        if (((unsigned long)((unsigned long)((unsigned int)(var6))) < (unsigned long)((unsigned long)((unsigned int)(var5))))) {
            goto L_15c4;
        } else {
            if ((((unsigned long)(var5) >> 32) != 0)) {
                goto L_15c4;
            } else {
                var11 = ((var6 + (-var1)) + 1);
                if ((((unsigned long)((((long)arg1 + (var6 * 4)) + 4)) <= (unsigned long)(((long)arg0 + (var11 * 4)))) || ((unsigned long)((((long)arg0 + (var6 * 4)) + 4)) <= (unsigned long)(((long)arg1 + (var11 * 4)))))) {
                    var17 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var1)) & -8)));
                    var18 = (unsigned long)((unsigned int)((var1 - 1)));
                    var19 = *(int *)(((long)arg1 + var18 * 4 - 0x1c));
                    var20 = *(int *)(((long)arg1 + var18 * 4 - 0x18));
                    var21 = *(int *)(((long)arg1 + var18 * 4 - 0x14));
                    var22 = *(int *)(((long)arg1 + var18 * 4 - 0x10));
                    var24 = *(int *)(((long)arg1 + var18 * 4 - 0x8));
                    var25 = *(int *)(((long)arg1 + var18 * 4 - 0x4));
                    var26 = *(int *)(((long)arg1 + var18 * 4));
                    *(int *)(((long)arg0 + var18 * 4 - 0xc)) = *(int *)(((long)arg1 + var18 * 4 - 0xc));
                    *(int *)(((long)arg0 + var18 * 4 - 0x8)) = var24;
                    *(int *)(((long)arg0 + var18 * 4 - 0x4)) = var25;
                    *(int *)(((long)arg0 + var18 * 4)) = var26;
                    *(int *)(((long)arg0 + var18 * 4 - 0x1c)) = var19;
                    *(int *)(((long)arg0 + var18 * 4 - 0x18)) = var20;
                    *(int *)(((long)arg0 + var18 * 4 - 0x14)) = var21;
                    *(int *)(((long)arg0 + var18 * 4 - 0x10)) = var22;
                    if ((var17 != 8)) {
                        var27 = 0xffffffc7;
                        var29 = ((unsigned int)((0xffffffc7 + var1)) + 48);
                        var31 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var29)) * 4)) - 28));
                        var32 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var29)) * 4)) - 24));
                        var33 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var29)) * 4)) - 20));
                        var34 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var29)) * 4)) - 16));
                        var36 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var29)) * 4)) - 8));
                        var37 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var29)) * 4)) - 4));
                        var38 = arg1[(unsigned long)((unsigned int)(var29))];
                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var29)) * 4)) - 12)) = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var29)) * 4)) - 12));
                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var29)) * 4)) - 8)) = var36;
                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var29)) * 4)) - 4)) = var37;
                        arg0[(unsigned long)((unsigned int)(var29))] = var38;
                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var29)) * 4)) - 28)) = var31;
                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var29)) * 4)) - 24)) = var32;
                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var29)) * 4)) - 20)) = var33;
                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var29)) * 4)) - 16)) = var34;
                        if (((unsigned long)((unsigned int)(var17)) != 16)) {
                            var40 = ((unsigned int)((var27 + var1)) + 40);
                            var42 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var40)) * 4)) - 28));
                            var43 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var40)) * 4)) - 24));
                            var44 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var40)) * 4)) - 20));
                            var45 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var40)) * 4)) - 16));
                            var47 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var40)) * 4)) - 8));
                            var48 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var40)) * 4)) - 4));
                            var49 = arg1[(unsigned long)((unsigned int)(var40))];
                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var40)) * 4)) - 12)) = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var40)) * 4)) - 12));
                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var40)) * 4)) - 8)) = var47;
                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var40)) * 4)) - 4)) = var48;
                            arg0[(unsigned long)((unsigned int)(var40))] = var49;
                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var40)) * 4)) - 28)) = var42;
                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var40)) * 4)) - 24)) = var43;
                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var40)) * 4)) - 20)) = var44;
                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var40)) * 4)) - 16)) = var45;
                            if (((unsigned long)((unsigned int)(var17)) != 24)) {
                                var51 = ((unsigned int)((var27 + var1)) + 32);
                                var53 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var51)) * 4)) - 28));
                                var54 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var51)) * 4)) - 24));
                                var55 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var51)) * 4)) - 20));
                                var56 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var51)) * 4)) - 16));
                                var58 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var51)) * 4)) - 8));
                                var59 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var51)) * 4)) - 4));
                                var60 = arg1[(unsigned long)((unsigned int)(var51))];
                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var51)) * 4)) - 12)) = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var51)) * 4)) - 12));
                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var51)) * 4)) - 8)) = var58;
                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var51)) * 4)) - 4)) = var59;
                                arg0[(unsigned long)((unsigned int)(var51))] = var60;
                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var51)) * 4)) - 28)) = var53;
                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var51)) * 4)) - 24)) = var54;
                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var51)) * 4)) - 20)) = var55;
                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var51)) * 4)) - 16)) = var56;
                                if (((unsigned long)((unsigned int)(var17)) != 32)) {
                                    var62 = ((unsigned int)((var27 + var1)) + 24);
                                    var64 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var62)) * 4)) - 28));
                                    var65 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var62)) * 4)) - 24));
                                    var66 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var62)) * 4)) - 20));
                                    var67 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var62)) * 4)) - 16));
                                    var69 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var62)) * 4)) - 8));
                                    var70 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var62)) * 4)) - 4));
                                    var71 = arg1[(unsigned long)((unsigned int)(var62))];
                                    *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var62)) * 4)) - 12)) = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var62)) * 4)) - 12));
                                    *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var62)) * 4)) - 8)) = var69;
                                    *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var62)) * 4)) - 4)) = var70;
                                    arg0[(unsigned long)((unsigned int)(var62))] = var71;
                                    *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var62)) * 4)) - 28)) = var64;
                                    *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var62)) * 4)) - 24)) = var65;
                                    *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var62)) * 4)) - 20)) = var66;
                                    *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var62)) * 4)) - 16)) = var67;
                                    if (((unsigned long)((unsigned int)(var17)) != 40)) {
                                        var73 = ((unsigned int)((var27 + var1)) + 16);
                                        var75 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var73)) * 4)) - 28));
                                        var76 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var73)) * 4)) - 24));
                                        var77 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var73)) * 4)) - 20));
                                        var78 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var73)) * 4)) - 16));
                                        var80 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var73)) * 4)) - 8));
                                        var81 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var73)) * 4)) - 4));
                                        var82 = arg1[(unsigned long)((unsigned int)(var73))];
                                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var73)) * 4)) - 12)) = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var73)) * 4)) - 12));
                                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var73)) * 4)) - 8)) = var80;
                                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var73)) * 4)) - 4)) = var81;
                                        arg0[(unsigned long)((unsigned int)(var73))] = var82;
                                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var73)) * 4)) - 28)) = var75;
                                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var73)) * 4)) - 24)) = var76;
                                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var73)) * 4)) - 20)) = var77;
                                        *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var73)) * 4)) - 16)) = var78;
                                        if (((unsigned long)((unsigned int)(var17)) != 48)) {
                                            var84 = ((unsigned int)((var27 + var1)) + 8);
                                            var86 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var84)) * 4)) - 28));
                                            var87 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var84)) * 4)) - 24));
                                            var88 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var84)) * 4)) - 20));
                                            var89 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var84)) * 4)) - 16));
                                            var91 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var84)) * 4)) - 8));
                                            var92 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var84)) * 4)) - 4));
                                            var93 = arg1[(unsigned long)((unsigned int)(var84))];
                                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var84)) * 4)) - 12)) = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var84)) * 4)) - 12));
                                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var84)) * 4)) - 8)) = var91;
                                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var84)) * 4)) - 4)) = var92;
                                            arg0[(unsigned long)((unsigned int)(var84))] = var93;
                                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var84)) * 4)) - 28)) = var86;
                                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var84)) * 4)) - 24)) = var87;
                                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var84)) * 4)) - 20)) = var88;
                                            *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var84)) * 4)) - 16)) = var89;
                                            if (((unsigned long)((unsigned int)(var17)) != 56)) {
                                                var94 = (var27 + var1);
                                                var96 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var94)) * 4)) - 28));
                                                var97 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var94)) * 4)) - 24));
                                                var98 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var94)) * 4)) - 20));
                                                var99 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var94)) * 4)) - 16));
                                                var101 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var94)) * 4)) - 8));
                                                var102 = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var94)) * 4)) - 4));
                                                var103 = arg1[(unsigned long)((unsigned int)(var94))];
                                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var94)) * 4)) - 12)) = *(int *)((((long)arg1 + ((unsigned long)((unsigned int)(var94)) * 4)) - 12));
                                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var94)) * 4)) - 8)) = var101;
                                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var94)) * 4)) - 4)) = var102;
                                                arg0[(unsigned long)((unsigned int)(var94))] = var103;
                                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var94)) * 4)) - 28)) = var96;
                                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var94)) * 4)) - 24)) = var97;
                                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var94)) * 4)) - 20)) = var98;
                                                *(int *)((((long)arg0 + ((unsigned long)((unsigned int)(var94)) * 4)) - 16)) = var99;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if ((var17 != var1)) {
                        var1 = (unsigned long)((unsigned int)((var1 & 7)));
                        goto L_15c4;
                    }
                } else {
                    goto L_15c4;
                }
            }
        }
    }
    return (unsigned int)(arg2);
}
vt188_copy_forward pass 205 lines
// glaurung: vt188_copy_forward @ 0x1100
int32_t vt188_copy_forward(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int index;
    long local_8;
    long ret;
    long var0;
    long var1;
    long var11;
    long var22;
    long var23;
    long var26;
    long var29;
    long var31;
    long var32;
    long var34;
    int var36;
    int var37;
    int var38;
    int var40;
    int var41;
    int var42;
    int var44;
    int var45;
    int var46;
    int var48;
    int var49;
    int var50;
    int var52;
    int var53;
    int var54;
    int var56;
    int var57;
    int var58;
    long var6;
    int var60;
    int var61;
    int var62;
    int var63;
    int var64;
    int var65;
    int var66;
    long var67;
    long var68;
    long var69;
    long var71;
    int var72;
    int var73;
    int var74;
    int var75;
    long var9;
    local_8 = var0;
    ret = 0xffffffff;
    if (((unsigned long)(64) < (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;
    }
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        goto L_11ac;
    }
    var1 = (unsigned long)((unsigned int)(arg2));
    if (((unsigned long)(4) <= (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        if (((unsigned long)(((long)arg1 + (var1 * 4))) <= (unsigned long)((long)arg0))) {
            goto L_11b0;
        }
        if (((unsigned long)(((long)arg0 + (var1 * 4))) <= (unsigned long)((long)arg1))) {
            goto L_11b0;
        }
    }
    var6 = 0;
    L_1145: ;
    var9 = ((~var6) + var1);
    var11 = (var1 & 3);
    if ((var11 != 0)) {
        index = var6;
        while ((var11 != 0)) {
            *(int *)(((long)arg0 + index * 4)) = *(int *)(((long)arg1 + index * 4));
            index = (index + 1);
            var11 = (var11 - 1);
            var6 = (unsigned long)((unsigned int)(index));
        }
    }
    if (((unsigned long)(var9) < (unsigned long)(3))) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(arg2);
    }
    do {
        *(int *)(((long)arg0 + var6 * 4)) = *(int *)(((long)arg1 + var6 * 4));
        *(int *)(((long)arg0 + var6 * 4 + 0x4)) = *(int *)(((long)arg1 + var6 * 4 + 0x4));
        *(int *)(((long)arg0 + var6 * 4 + 0x8)) = *(int *)(((long)arg1 + var6 * 4 + 0x8));
        *(int *)(((long)arg0 + var6 * 4 + 0xc)) = *(int *)(((long)arg1 + var6 * 4 + 0xc));
        var6 = (var6 + 4);
    } while ((var1 != var6));
    // x86-64 epilogue: tear down frame
    return (unsigned int)(arg2);
    L_11ac: ;
    // x86-64 epilogue: tear down frame
    return 0;
    L_11b0: ;
    var22 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var1)) & -4)));
    var23 = (var22 - 4);
    var26 = (((unsigned long)(var23) >> 2) + 1);
    var29 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var26)) & 7)));
    if (((unsigned long)(var23) < (unsigned long)(28))) {
        var31 = 0;
        goto L_1238;
    }
    var32 = (var26 & -8);
    var34 = 0;
    do {
        var36 = *(int *)(((long)arg1 + var34 * 4 + 0x4));
        var37 = *(int *)(((long)arg1 + var34 * 4 + 0x8));
        var38 = *(int *)(((long)arg1 + var34 * 4 + 0xc));
        *(int *)(((long)arg0 + var34 * 4)) = *(int *)(((long)arg1 + var34 * 4));
        *(int *)(((long)arg0 + var34 * 4 + 0x4)) = var36;
        *(int *)(((long)arg0 + var34 * 4 + 0x8)) = var37;
        *(int *)(((long)arg0 + var34 * 4 + 0xc)) = var38;
        var40 = *(int *)(((long)arg1 + var34 * 4 + 0x14));
        var41 = *(int *)(((long)arg1 + var34 * 4 + 0x18));
        var42 = *(int *)(((long)arg1 + var34 * 4 + 0x1c));
        *(int *)(((long)arg0 + var34 * 4 + 0x10)) = *(int *)(((long)arg1 + var34 * 4 + 0x10));
        *(int *)(((long)arg0 + var34 * 4 + 0x14)) = var40;
        *(int *)(((long)arg0 + var34 * 4 + 0x18)) = var41;
        *(int *)(((long)arg0 + var34 * 4 + 0x1c)) = var42;
        var44 = *(int *)(((long)arg1 + var34 * 4 + 0x24));
        var45 = *(int *)(((long)arg1 + var34 * 4 + 0x28));
        var46 = *(int *)(((long)arg1 + var34 * 4 + 0x2c));
        *(int *)(((long)arg0 + var34 * 4 + 0x20)) = *(int *)(((long)arg1 + var34 * 4 + 0x20));
        *(int *)(((long)arg0 + var34 * 4 + 0x24)) = var44;
        *(int *)(((long)arg0 + var34 * 4 + 0x28)) = var45;
        *(int *)(((long)arg0 + var34 * 4 + 0x2c)) = var46;
        var48 = *(int *)(((long)arg1 + var34 * 4 + 0x34));
        var49 = *(int *)(((long)arg1 + var34 * 4 + 0x38));
        var50 = *(int *)(((long)arg1 + var34 * 4 + 0x3c));
        *(int *)(((long)arg0 + var34 * 4 + 0x30)) = *(int *)(((long)arg1 + var34 * 4 + 0x30));
        *(int *)(((long)arg0 + var34 * 4 + 0x34)) = var48;
        *(int *)(((long)arg0 + var34 * 4 + 0x38)) = var49;
        *(int *)(((long)arg0 + var34 * 4 + 0x3c)) = var50;
        var52 = *(int *)(((long)arg1 + var34 * 4 + 0x44));
        var53 = *(int *)(((long)arg1 + var34 * 4 + 0x48));
        var54 = *(int *)(((long)arg1 + var34 * 4 + 0x4c));
        *(int *)(((long)arg0 + var34 * 4 + 0x40)) = *(int *)(((long)arg1 + var34 * 4 + 0x40));
        *(int *)(((long)arg0 + var34 * 4 + 0x44)) = var52;
        *(int *)(((long)arg0 + var34 * 4 + 0x48)) = var53;
        *(int *)(((long)arg0 + var34 * 4 + 0x4c)) = var54;
        var56 = *(int *)(((long)arg1 + var34 * 4 + 0x54));
        var57 = *(int *)(((long)arg1 + var34 * 4 + 0x58));
        var58 = *(int *)(((long)arg1 + var34 * 4 + 0x5c));
        *(int *)(((long)arg0 + var34 * 4 + 0x50)) = *(int *)(((long)arg1 + var34 * 4 + 0x50));
        *(int *)(((long)arg0 + var34 * 4 + 0x54)) = var56;
        *(int *)(((long)arg0 + var34 * 4 + 0x58)) = var57;
        *(int *)(((long)arg0 + var34 * 4 + 0x5c)) = var58;
        var60 = *(int *)(((long)arg1 + var34 * 4 + 0x64));
        var61 = *(int *)(((long)arg1 + var34 * 4 + 0x68));
        var62 = *(int *)(((long)arg1 + var34 * 4 + 0x6c));
        *(int *)(((long)arg0 + var34 * 4 + 0x60)) = *(int *)(((long)arg1 + var34 * 4 + 0x60));
        *(int *)(((long)arg0 + var34 * 4 + 0x64)) = var60;
        *(int *)(((long)arg0 + var34 * 4 + 0x68)) = var61;
        *(int *)(((long)arg0 + var34 * 4 + 0x6c)) = var62;
        var63 = *(int *)(((long)arg1 + var34 * 4 + 0x70));
        var64 = *(int *)(((long)arg1 + var34 * 4 + 0x74));
        var65 = *(int *)(((long)arg1 + var34 * 4 + 0x78));
        var66 = *(int *)(((long)arg1 + var34 * 4 + 0x7c));
        ret = ((unsigned long)((unsigned int)(var64)) | (unsigned long)((unsigned int)(var63)));
        *(int *)(((long)arg0 + var34 * 4 + 0x70)) = var63;
        *(int *)(((long)arg0 + var34 * 4 + 0x74)) = var64;
        *(int *)(((long)arg0 + var34 * 4 + 0x78)) = var65;
        *(int *)(((long)arg0 + var34 * 4 + 0x7c)) = var66;
        var34 = (var34 + 32);
        var32 = (var32 - 8);
        var31 = var34;
    } while ((var32 != 0));
    L_1238: ;
    if ((var29 != 0)) {
        var67 = (long)(((long)arg0 + (var31 * 4)));
        var68 = (long)(((long)arg1 + (var31 * 4)));
        var69 = (var29 << 4);
        var71 = 0;
        do {
            var72 = *(int *)((var68 + var71));
            var73 = *(int *)((var68 + var71 + 0x4));
            var74 = *(int *)((var68 + var71 + 0x8));
            var75 = *(int *)((var68 + var71 + 0xc));
            ret = ((unsigned long)((unsigned int)(var73)) | (unsigned long)((unsigned int)(var72)));
            *(int *)((var67 + var71)) = var72;
            *(int *)((var67 + var71 + 0x4)) = var73;
            *(int *)((var67 + var71 + 0x8)) = var74;
            *(int *)((var67 + var71 + 0xc)) = var75;
            var71 = (var71 + 16);
        } while ((var69 != var71));
    }
    var6 = var22;
    if ((var22 != var1)) {
        goto L_1145;
    }
    // x86-64 epilogue: tear down frame
    return (unsigned int)(arg2);
}
vt188_copy_two_streams pass 203 lines
// glaurung: vt188_copy_two_streams @ 0x1270
int32_t vt188_copy_two_streams(int32_t * arg0, int32_t * arg1, const int32_t * arg2, int32_t arg3) {
    int index;
    long ret;
    long var0;
    long var10;
    long var12;
    long var14;
    long var16;
    long var18;
    long var19;
    long var2;
    long var27;
    long var30;
    long var33;
    long var35;
    long var36;
    long var38;
    int var39;
    long var4;
    int var40;
    int var41;
    int var42;
    int var43;
    int var44;
    int var45;
    int var46;
    int var47;
    int var48;
    int var49;
    int var50;
    int var51;
    int var52;
    int var53;
    int var54;
    long var55;
    long var56;
    long var57;
    long var58;
    long var60;
    int var61;
    int var62;
    int var63;
    int var64;
    long var66;
    long var7;
    ret = 0xffffffff;
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg3))))) {
        // 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;
    }
    if ((arg2 == 0)) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg3)) != 0)) {
        var0 = (unsigned long)((unsigned int)(arg3));
        if (((unsigned long)(4) <= (unsigned long)((unsigned long)((unsigned int)(arg3))))) {
            goto L_12bb;
        }
        var2 = 0;
        goto L_13cd;
    }
    // x86-64 epilogue: tear down frame
    return 0;
    L_12bb: ;
    var4 = (long)(((long)arg1 + (var0 * 4)));
    var7 = (long)(((long)arg0 + (var0 * 4)));
    var10 = (long)(((long)arg2 + (var0 * 4)));
    var12 = ((unsigned long)((long)arg0) < (unsigned long)(var10));
    var14 = ((unsigned long)((long)arg2) < (unsigned long)(var7));
    var16 = ((unsigned long)((long)arg1) < (unsigned long)(var10));
    var19 = ((var18 & -256) | ((unsigned long)((long)arg2) < (unsigned long)(var4)));
    var2 = 0;
    if ((((unsigned long)((long)arg0) < (unsigned long)(var4)) && ((unsigned long)((long)arg1) < (unsigned long)(var7)))) {
        goto L_13cd;
    }
    if (((unsigned long)((unsigned char)(((var12 & 255) & (var14 & 255)))) != 0)) {
        goto L_13cd;
    }
    if (((unsigned long)((unsigned char)(((var16 & 255) & (var19 & 255)))) != 0)) {
        goto L_13cd;
    }
    var2 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var0)) & -4)));
    var27 = (var2 - 4);
    var30 = (((unsigned long)(var27) >> 2) + 1);
    var33 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var30)) & 3)));
    if (((unsigned long)(var27) < (unsigned long)(12))) {
        var35 = 0;
        goto L_138f;
    }
    var36 = (var30 & -4);
    var38 = 0;
    do {
        var39 = *(int *)(((long)arg2 + var38 * 4));
        var40 = *(int *)(((long)arg2 + var38 * 4 + 0x4));
        var41 = *(int *)(((long)arg2 + var38 * 4 + 0x8));
        var42 = *(int *)(((long)arg2 + var38 * 4 + 0xc));
        *(int *)(((long)arg0 + var38 * 4)) = var39;
        *(int *)(((long)arg0 + var38 * 4 + 0x4)) = var40;
        *(int *)(((long)arg0 + var38 * 4 + 0x8)) = var41;
        *(int *)(((long)arg0 + var38 * 4 + 0xc)) = var42;
        *(int *)(((long)arg1 + var38 * 4)) = var39;
        *(int *)(((long)arg1 + var38 * 4 + 0x4)) = var40;
        *(int *)(((long)arg1 + var38 * 4 + 0x8)) = var41;
        *(int *)(((long)arg1 + var38 * 4 + 0xc)) = var42;
        var43 = *(int *)(((long)arg2 + var38 * 4 + 0x10));
        var44 = *(int *)(((long)arg2 + var38 * 4 + 0x14));
        var45 = *(int *)(((long)arg2 + var38 * 4 + 0x18));
        var46 = *(int *)(((long)arg2 + var38 * 4 + 0x1c));
        *(int *)(((long)arg0 + var38 * 4 + 0x10)) = var43;
        *(int *)(((long)arg0 + var38 * 4 + 0x14)) = var44;
        *(int *)(((long)arg0 + var38 * 4 + 0x18)) = var45;
        *(int *)(((long)arg0 + var38 * 4 + 0x1c)) = var46;
        *(int *)(((long)arg1 + var38 * 4 + 0x10)) = var43;
        *(int *)(((long)arg1 + var38 * 4 + 0x14)) = var44;
        *(int *)(((long)arg1 + var38 * 4 + 0x18)) = var45;
        *(int *)(((long)arg1 + var38 * 4 + 0x1c)) = var46;
        var47 = *(int *)(((long)arg2 + var38 * 4 + 0x20));
        var48 = *(int *)(((long)arg2 + var38 * 4 + 0x24));
        var49 = *(int *)(((long)arg2 + var38 * 4 + 0x28));
        var50 = *(int *)(((long)arg2 + var38 * 4 + 0x2c));
        *(int *)(((long)arg0 + var38 * 4 + 0x20)) = var47;
        *(int *)(((long)arg0 + var38 * 4 + 0x24)) = var48;
        *(int *)(((long)arg0 + var38 * 4 + 0x28)) = var49;
        *(int *)(((long)arg0 + var38 * 4 + 0x2c)) = var50;
        *(int *)(((long)arg1 + var38 * 4 + 0x20)) = var47;
        *(int *)(((long)arg1 + var38 * 4 + 0x24)) = var48;
        *(int *)(((long)arg1 + var38 * 4 + 0x28)) = var49;
        *(int *)(((long)arg1 + var38 * 4 + 0x2c)) = var50;
        var51 = *(int *)(((long)arg2 + var38 * 4 + 0x30));
        var52 = *(int *)(((long)arg2 + var38 * 4 + 0x34));
        var53 = *(int *)(((long)arg2 + var38 * 4 + 0x38));
        var54 = *(int *)(((long)arg2 + var38 * 4 + 0x3c));
        *(int *)(((long)arg0 + var38 * 4 + 0x30)) = var51;
        *(int *)(((long)arg0 + var38 * 4 + 0x34)) = var52;
        *(int *)(((long)arg0 + var38 * 4 + 0x38)) = var53;
        *(int *)(((long)arg0 + var38 * 4 + 0x3c)) = var54;
        *(int *)(((long)arg1 + var38 * 4 + 0x30)) = var51;
        *(int *)(((long)arg1 + var38 * 4 + 0x34)) = var52;
        *(int *)(((long)arg1 + var38 * 4 + 0x38)) = var53;
        *(int *)(((long)arg1 + var38 * 4 + 0x3c)) = var54;
        var38 = (var38 + 16);
        var36 = (var36 - 4);
        var35 = var38;
    } while ((var36 != 0));
    L_138f: ;
    if ((var33 != 0)) {
        var55 = (long)(((long)arg1 + (var35 * 4)));
        var56 = (long)(((long)arg0 + (var35 * 4)));
        var57 = (long)(((long)arg2 + (var35 * 4)));
        var58 = (var33 << 4);
        var60 = 0;
        do {
            var61 = *(int *)((var57 + var60));
            var62 = *(int *)((var57 + var60 + 0x4));
            var63 = *(int *)((var57 + var60 + 0x8));
            var64 = *(int *)((var57 + var60 + 0xc));
            *(int *)((var56 + var60)) = var61;
            *(int *)((var56 + var60 + 0x4)) = var62;
            *(int *)((var56 + var60 + 0x8)) = var63;
            *(int *)((var56 + var60 + 0xc)) = var64;
            *(int *)((var55 + var60)) = var61;
            *(int *)((var55 + var60 + 0x4)) = var62;
            *(int *)((var55 + var60 + 0x8)) = var63;
            *(int *)((var55 + var60 + 0xc)) = var64;
            var60 = (var60 + 16);
        } while ((var58 != var60));
    }
    if ((var2 == var0)) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(arg3);
    }
    L_13cd: ;
    var66 = (~var2);
    index = var2;
    if (((unsigned long)((unsigned char)((var0 & 1))) != 0)) {
        *(int *)(((long)arg0 + var2 * 4)) = *(int *)(((long)arg2 + var2 * 4));
        *(int *)(((long)arg1 + var2 * 4)) = *(int *)(((long)arg2 + var2 * 4));
        index = (var2 | 1);
    }
    if (((var66 + var0) == 0)) {
        // x86-64 epilogue: tear down frame
        return (unsigned int)(arg3);
    }
    do {
        *(int *)(((long)arg0 + index * 4)) = *(int *)(((long)arg2 + index * 4));
        *(int *)(((long)arg1 + index * 4)) = *(int *)(((long)arg2 + index * 4));
        *(int *)(((long)arg0 + index * 4 + 0x4)) = *(int *)(((long)arg2 + index * 4 + 0x4));
        *(int *)(((long)arg1 + index * 4 + 0x4)) = *(int *)(((long)arg2 + index * 4 + 0x4));
        index = (index + 2);
    } while ((var0 != index));
    // x86-64 epilogue: tear down frame
    return (unsigned int)(arg3);
}
vt188_lane_math pass 287 lines
// glaurung: vt188_lane_math @ 0x15f0
int32_t vt188_lane_math(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int index;
    int total;
    long local_8;
    long ret;
    long var0;
    long var1;
    int var100;
    int var101;
    int var102;
    int var103;
    int var104;
    int var105;
    int var106;
    long var11;
    int var120;
    int var121;
    int var122;
    int var123;
    long var13;
    int var132;
    int var133;
    int var134;
    int var135;
    int var150;
    int var151;
    int var152;
    int var153;
    long var154;
    int var155;
    int var156;
    int var157;
    int var158;
    int var160;
    int var161;
    int var162;
    int var163;
    long var164;
    long var165;
    long var166;
    long var168;
    int var169;
    int var170;
    int var171;
    int var172;
    int var173;
    int var174;
    int var175;
    int var176;
    int var191;
    int var192;
    int var193;
    int var194;
    long var212;
    long var23;
    long var24;
    long var30;
    int var32;
    int var34;
    long var38;
    long var41;
    long var44;
    long var45;
    int var46;
    int var47;
    int var48;
    int var49;
    long var5;
    long var51;
    int var52;
    int var53;
    int var54;
    int var55;
    int var56;
    int var57;
    int var58;
    int var59;
    long var7;
    int var74;
    int var75;
    int var76;
    int var77;
    int var82;
    int var83;
    int var84;
    int var85;
    int var99;
    local_8 = var0;
    var1 = 0xffffffff;
    ret = 0xffffffff;
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    ret = var1;
    if ((arg0 == 0)) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    ret = var1;
    if ((arg1 == 0)) {
        // x86-64 epilogue: tear down frame
        return ret;
    }
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        // x86-64 epilogue: tear down frame
        return 0;
    }
    var5 = (unsigned long)((unsigned int)(arg2));
    if (((unsigned long)((unsigned long)((unsigned int)(arg2))) < (unsigned long)(4))) {
        L_1633: ;
        var7 = 0;
        ret = 0;
        L_1637: ;
        var11 = (~var7);
        index = var7;
        if (((unsigned long)((unsigned char)((var5 & 1))) != 0)) {
            var13 = (unsigned long)((unsigned int)(*(int *)(((long)arg1 + var7 * 4))));
            *(int *)(((long)arg0 + var7 * 4)) = ((unsigned long)((unsigned int)((var13 + (var13 * 2)))) + 1);
            ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)((ret + (unsigned long)((unsigned int)((var13 + (var13 * 2))))))) + 1)));
            index = (var7 | 1);
        }
        if (((var11 + var5) == 0)) {
            // x86-64 epilogue: tear down frame
            return ret;
        }
        var23 = ret;
        do {
            var24 = (unsigned long)((unsigned int)(*(int *)(((long)arg1 + index * 4))));
            *(int *)(((long)arg0 + index * 4)) = ((unsigned long)((unsigned int)((var24 + (var24 * 2)))) + 1);
            var30 = (unsigned long)((unsigned int)(*(int *)(((long)arg1 + index * 4 + 0x4))));
            var32 = ((unsigned int)((var30 + (var30 * 2))) + 1);
            *(int *)(((long)arg0 + index * 4 + 0x4)) = var32;
            var34 = ((unsigned int)(((var23 + (unsigned long)((unsigned int)((var24 + (var24 * 2))))) + 1)) + (unsigned int)(var32));
            var23 = (unsigned long)((unsigned int)(var34));
            index = (index + 2);
            ret = (unsigned long)((unsigned int)(var34));
        } while ((var5 != index));
    } else {
        if (((unsigned long)(((long)arg1 + (var5 * 4))) <= (unsigned long)((long)arg0))) {
            L_16a2: ;
            var7 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var5)) & -4)));
            var38 = (var7 - 4);
            var41 = (((unsigned long)(var38) >> 2) + 1);
            var44 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var41)) & 3)));
            if (((unsigned long)(12) <= (unsigned long)(var38))) {
                var45 = (var41 & -4);
                ret = 0;
                var46 = 0;
                var47 = 0;
                var48 = 0;
                var49 = 0;
                var51 = 0;
                var52 = -1;
                var53 = -1;
                var54 = -1;
                var55 = -1;
                do {
                    var56 = *(int *)(((long)arg1 + var51 * 4));
                    var57 = *(int *)(((long)arg1 + var51 * 4 + 0x4));
                    var58 = *(int *)(((long)arg1 + var51 * 4 + 0x8));
                    var59 = *(int *)(((long)arg1 + var51 * 4 + 0xc));
                    var74 = (((var56 + var56) + var56) - var52);
                    var75 = (((var57 + var57) + var57) - var53);
                    var76 = (((var58 + var58) + var58) - var54);
                    var77 = (((var59 + var59) + var59) - var55);
                    *(int *)(((long)arg0 + var51 * 4)) = var74;
                    *(int *)(((long)arg0 + var51 * 4 + 0x4)) = var75;
                    *(int *)(((long)arg0 + var51 * 4 + 0x8)) = var76;
                    *(int *)(((long)arg0 + var51 * 4 + 0xc)) = var77;
                    var82 = *(int *)(((long)arg1 + var51 * 4 + 0x10));
                    var83 = *(int *)(((long)arg1 + var51 * 4 + 0x14));
                    var84 = *(int *)(((long)arg1 + var51 * 4 + 0x18));
                    var85 = *(int *)(((long)arg1 + var51 * 4 + 0x1c));
                    ret = ((unsigned long)((unsigned int)(var83)) | (unsigned long)((unsigned int)(var82)));
                    var99 = (((var82 + var82) + var82) - var52);
                    var100 = (((var83 + var83) + var83) - var53);
                    var101 = (((var84 + var84) + var84) - var54);
                    var102 = (((var85 + var85) + var85) - var55);
                    *(int *)(((long)arg0 + var51 * 4 + 0x10)) = var99;
                    *(int *)(((long)arg0 + var51 * 4 + 0x14)) = var100;
                    *(int *)(((long)arg0 + var51 * 4 + 0x18)) = var101;
                    *(int *)(((long)arg0 + var51 * 4 + 0x1c)) = var102;
                    var103 = *(int *)(((long)arg1 + var51 * 4 + 0x20));
                    var104 = *(int *)(((long)arg1 + var51 * 4 + 0x24));
                    var105 = *(int *)(((long)arg1 + var51 * 4 + 0x28));
                    var106 = *(int *)(((long)arg1 + var51 * 4 + 0x2c));
                    ret = ((unsigned long)((unsigned int)(var104)) | (unsigned long)((unsigned int)(var103)));
                    var120 = (((var103 + var103) + var103) - var52);
                    var121 = (((var104 + var104) + var104) - var53);
                    var122 = (((var105 + var105) + var105) - var54);
                    var123 = (((var106 + var106) + var106) - var55);
                    *(int *)(((long)arg0 + var51 * 4 + 0x20)) = var120;
                    *(int *)(((long)arg0 + var51 * 4 + 0x24)) = var121;
                    *(int *)(((long)arg0 + var51 * 4 + 0x28)) = var122;
                    *(int *)(((long)arg0 + var51 * 4 + 0x2c)) = var123;
                    var132 = *(int *)(((long)arg1 + var51 * 4 + 0x30));
                    var133 = *(int *)(((long)arg1 + var51 * 4 + 0x34));
                    var134 = *(int *)(((long)arg1 + var51 * 4 + 0x38));
                    var135 = *(int *)(((long)arg1 + var51 * 4 + 0x3c));
                    var150 = (((var132 + var132) + var132) - var52);
                    var151 = (((var133 + var133) + var133) - var53);
                    var152 = (((var134 + var134) + var134) - var54);
                    var153 = (((var135 + var135) + var135) - var55);
                    *(int *)(((long)arg0 + var51 * 4 + 0x30)) = var150;
                    *(int *)(((long)arg0 + var51 * 4 + 0x34)) = var151;
                    *(int *)(((long)arg0 + var51 * 4 + 0x38)) = var152;
                    *(int *)(((long)arg0 + var51 * 4 + 0x3c)) = var153;
                    var46 = (var150 + ((var120 + var99) + (var74 + var46)));
                    var47 = (var151 + ((var121 + var100) + (var75 + var47)));
                    var48 = (var152 + ((var122 + var101) + (var76 + var48)));
                    var49 = (var153 + ((var123 + var102) + (var77 + var49)));
                    ret = ((unsigned long)((unsigned int)(var47)) | (unsigned long)((unsigned int)(var46)));
                    var51 = (var51 + 16);
                    var45 = (var45 - 4);
                    var154 = var51;
                    var41 = var45;
                    var155 = var46;
                    var156 = var47;
                    var157 = var48;
                    var158 = var49;
                } while ((var45 != 0));
            } else {
                ret = 0;
                var155 = 0;
                var156 = 0;
                var157 = 0;
                var158 = 0;
                var154 = 0;
            }
            var160 = var155;
            var161 = var156;
            var162 = var157;
            var163 = var158;
            if ((var44 != 0)) {
                var164 = (long)(((long)arg0 + (var154 * 4)));
                var165 = (long)(((long)arg1 + (var154 * 4)));
                var166 = (var44 << 4);
                var168 = 0;
                var169 = -1;
                var170 = -1;
                var171 = -1;
                var172 = -1;
                do {
                    var173 = *(int *)((var165 + var168));
                    var174 = *(int *)((var165 + var168 + 0x4));
                    var175 = *(int *)((var165 + var168 + 0x8));
                    var176 = *(int *)((var165 + var168 + 0xc));
                    var191 = (((var173 + var173) + var173) - var169);
                    var192 = (((var174 + var174) + var174) - var170);
                    var193 = (((var175 + var175) + var175) - var171);
                    var194 = (((var176 + var176) + var176) - var172);
                    *(int *)((var164 + var168)) = var191;
                    *(int *)((var164 + var168 + 0x4)) = var192;
                    *(int *)((var164 + var168 + 0x8)) = var193;
                    *(int *)((var164 + var168 + 0xc)) = var194;
                    var155 = (var155 + var191);
                    var156 = (var156 + var192);
                    var157 = (var157 + var193);
                    var158 = (var158 + var194);
                    var168 = (var168 + 16);
                    var160 = var155;
                    var161 = var156;
                    var162 = var157;
                    var163 = var158;
                } while ((var166 != var168));
            }
            var212 = (unsigned long)((unsigned int)(((var163 + var161) + (var162 + var160))));
            ret = var212;
            if ((var7 != var5)) {
                goto L_1637;
            } else {
                ret = var212;
            }
        } else {
            var1 = (long)(((long)arg0 + (var5 * 4)));
            if (((unsigned long)(var1) <= (unsigned long)((long)arg1))) {
                goto L_16a2;
            } else {
                goto L_1633;
            }
        }
    }
    // x86-64 epilogue: tear down frame
    return ret;
}

gcc -O0

4/4
vt188_copy_backward pass 28 lines
// glaurung: vt188_copy_backward @ 0x1227
int32_t vt188_copy_backward(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int index;
    // x86-64 prologue: save rbp
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((arg1 == 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)) == 64) | ((long)(arg2) < 64)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    index = ((unsigned int)(arg2) - 1);
    while ((0 <= (long)(index))) {
        arg0[(long)(index)] = arg1[(long)(index)];
        index = (index - 1);
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(arg2);
}
vt188_copy_forward pass 26 lines
// glaurung: vt188_copy_forward @ 0x10f9
int32_t vt188_copy_forward(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int index;
    // x86-64 prologue: save rbp
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((arg1 == 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)) == 64) | ((long)(arg2) < 64)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    for (index = 0; (index < arg2); index++) {
        arg0[(long)(index)] = arg1[(long)(index)];
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(arg2);
}
vt188_copy_two_streams pass 31 lines
// glaurung: vt188_copy_two_streams @ 0x1174
int32_t vt188_copy_two_streams(int32_t * arg0, int32_t * arg1, const int32_t * arg2, int32_t arg3) {
    int index;
    // x86-64 prologue: save rbp
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((arg1 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((arg2 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((long)(arg3) < 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if (((((unsigned long)((unsigned int)(arg3)) == 64) | ((long)(arg3) < 64)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    for (index = 0; (index < arg3); index++) {
        arg0[(long)(index)] = arg2[(long)(index)];
        arg1[(long)(index)] = arg2[(long)(index)];
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(arg3);
}
vt188_lane_math pass 31 lines
// glaurung: vt188_lane_math @ 0x12a2
int32_t vt188_lane_math(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int total;
    int index;
    long var6;
    // x86-64 prologue: save rbp
    total = 0;
    if ((arg0 == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    if ((arg1 == 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)) == 64) | ((long)(arg2) < 64)) == 0)) {
        // x86-64 epilogue: restore rbp
        return 0xffffffff;
    }
    for (index = 0; (index < arg2); index++) {
        var6 = (unsigned long)((unsigned int)(arg1[(long)(index)]));
        arg0[(long)(index)] = ((unsigned long)((unsigned int)((var6 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var6)) + (unsigned long)((unsigned int)(var6)))))))) + 1);
        total = (total + (unsigned int)(arg0[(long)(index)]));
    }
    // x86-64 epilogue: restore rbp
    return (unsigned int)(total);
}

gcc -O2

4/4
vt188_copy_backward pass 24 lines
// glaurung: vt188_copy_backward @ 0x1190
int32_t vt188_copy_backward(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int index;
    long ret;
    ret = (unsigned long)((unsigned int)(arg2));
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    if ((arg1 == 0)) {
        return 0xffffffff;
    }
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        return 0xffffffff;
    }
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        return 0;
    }
    index = (long)((int)((arg2 - 1)));
    do {
        *(int *)(((long)arg0 + index * 4)) = *(int *)(((long)arg1 + index * 4));
        index = (index - 1);
    } while (((unsigned long)((unsigned int)(index)) != 0xffffffff));
    return ret;
}
vt188_copy_forward pass 25 lines
// glaurung: vt188_copy_forward @ 0x1100
int32_t vt188_copy_forward(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int index;
    long var0;
    long zf_8;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    if ((arg1 == 0)) {
        return 0xffffffff;
    }
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        return 0xffffffff;
    }
    var0 = (unsigned long)((unsigned int)((arg2 - 1)));
    index = 0;
    if (((unsigned long)((unsigned int)(arg2)) != 0)) {
        do {
            *(int *)(((long)arg0 + index * 4)) = *(int *)(((long)arg1 + index * 4));
            zf_8 = (index == var0);
            index = (index + 1);
        } while ((zf_8 == 0));
    }
    return (unsigned int)(arg2);
}
vt188_copy_two_streams pass 31 lines
// glaurung: vt188_copy_two_streams @ 0x1140
int32_t vt188_copy_two_streams(int32_t * arg0, int32_t * arg1, const int32_t * arg2, int32_t arg3) {
    int index;
    long var0;
    long var3;
    long zf_9;
    if ((arg0 == 0)) {
        return 0xffffffff;
    }
    if ((arg1 == 0)) {
        return 0xffffffff;
    }
    if ((arg2 == 0)) {
        return 0xffffffff;
    }
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg3))))) {
        return 0xffffffff;
    }
    var0 = (unsigned long)((unsigned int)((arg3 - 1)));
    index = 0;
    if (((unsigned long)((unsigned int)(arg3)) != 0)) {
        do {
            var3 = (unsigned long)((unsigned int)(*(int *)(((long)arg2 + index * 4))));
            *(int *)(((long)arg0 + index * 4)) = var3;
            *(int *)(((long)arg1 + index * 4)) = var3;
            zf_9 = (var0 == index);
            index = (index + 1);
        } while ((zf_9 == 0));
    }
    return (unsigned int)(arg3);
}
vt188_lane_math pass 40 lines
// glaurung: vt188_lane_math @ 0x11e0
int32_t vt188_lane_math(int32_t * arg0, const int32_t * arg1, int32_t arg2) {
    int index;
    int total;
    long var1;
    long var10;
    long var11;
    long var4;
    long var9;
    long zf_10;
    if ((arg0 == 0)) {
        var1 = 0xffffffff;
        return 0xffffffff;
    }
    if ((arg1 == 0)) {
        var1 = 0xffffffff;
        return 0xffffffff;
    }
    if (((unsigned long)(64) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
        var1 = 0xffffffff;
        return 0xffffffff;
    }
    if (((unsigned long)((unsigned int)(arg2)) == 0)) {
        return 0;
    }
    var4 = (unsigned long)((unsigned int)((arg2 - 1)));
    index = 0;
    var9 = 0;
    do {
        var10 = (unsigned long)((unsigned int)(*(int *)(((long)arg1 + index * 4))));
        var11 = (unsigned long)((unsigned int)(((var10 + (var10 * 2)) + 1)));
        *(int *)(((long)arg0 + index * 4)) = var11;
        total = (var9 + var11);
        var9 = (unsigned long)((unsigned int)(total));
        zf_10 = (var4 == index);
        index = (index + 1);
        var1 = (unsigned long)((unsigned int)(total));
    } while ((zf_10 == 0));
    return (unsigned int)(var1);
}

← 213 fixtures