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.
#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/4vt188_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/4vt188_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/4vt188_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/4vt188_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);
}