Fixture 60
integer matrix
C · 3 functions · 4 lanes · 12 of 12 function-lanes behave identically
All 4 lanes recompile and return the same results as the original.
Dense integer matrix multiply, transpose, and a 3x3 determinant. The multiply is the canonical triple loop with two different strides, and the determinant is a flat expression over nine indexed loads.
#include <stdint.h>
/* Dense integer matrix multiply, transpose, and a 3x3 determinant. The
* multiply is the canonical triple loop with two different strides, and the
* determinant is a flat expression over nine indexed loads. */
#define MAT_DIM 4
__attribute__((noinline)) int32_t
matrix_multiply(const int32_t *left, const int32_t *right, int32_t *output,
int32_t dimension) {
int32_t row;
int32_t column;
int32_t inner;
if (left == 0 || right == 0 || output == 0 || dimension < 0 ||
dimension > MAT_DIM) {
return -1;
}
for (row = 0; row < dimension; ++row) {
for (column = 0; column < dimension; ++column) {
int32_t sum = 0;
for (inner = 0; inner < dimension; ++inner) {
sum += left[row * dimension + inner] *
right[inner * dimension + column];
}
output[row * dimension + column] = sum;
}
}
return dimension * dimension;
}
__attribute__((noinline)) int32_t
matrix_transpose(const int32_t *input, int32_t *output, int32_t dimension) {
int32_t row;
int32_t column;
if (input == 0 || output == 0 || dimension < 0 || dimension > MAT_DIM) {
return -1;
}
for (row = 0; row < dimension; ++row) {
for (column = 0; column < dimension; ++column) {
output[column * dimension + row] = input[row * dimension + column];
}
}
return dimension * dimension;
}
__attribute__((noinline)) int32_t
determinant3(const int32_t *matrix) {
if (matrix == 0) {
return 0;
}
return matrix[0] * (matrix[4] * matrix[8] - matrix[5] * matrix[7]) -
matrix[1] * (matrix[3] * matrix[8] - matrix[5] * matrix[6]) +
matrix[2] * (matrix[3] * matrix[7] - matrix[4] * matrix[6]);
} 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
3/3determinant3 pass 9 lines
// glaurung: determinant3 @ 0x12f0
int32_t determinant3(const int32_t * arg0) {
// x86-64 prologue: save rbp
if ((arg0 != 0)) {
return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((long)arg0))) * (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x10)))) * *(int *)(((long)arg0 + 0x20))))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x14)))) * *(int *)(((long)arg0 + 0x1c))))))))))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x4)))) * (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0xc)))) * *(int *)(((long)arg0 + 0x20))))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x14)))) * *(int *)(((long)arg0 + 0x18)))))))))))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x8)))) * (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0xc)))) * *(int *)(((long)arg0 + 0x1c))))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x10)))) * *(int *)(((long)arg0 + 0x18)))))))))))));
} else {
return 0;
}
} matrix_multiply pass 50 lines
// glaurung: matrix_multiply @ 0x1100
int32_t matrix_multiply(const int32_t * arg0, const int32_t * arg1, int32_t * arg2, int32_t arg3) {
int row;
int column;
int sum;
int inner;
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)) == 4) | ((long)(arg3) < 4)) == 0)) {
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
row = 0;
while ((row < arg3)) {
column = 0;
while ((column < arg3)) {
sum = 0;
for (inner = 0; (inner < arg3); inner++) {
sum = ((unsigned int)(((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg3))) + inner)))])) * arg1[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(inner)) * arg3))) + column)))])) + sum);
}
arg2[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg3))) + column)))] = sum;
column = ((unsigned int)(column) + 1);
}
row = ((unsigned int)(row) + 1);
}
local_4 = ((unsigned int)(arg3) * arg3);
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} matrix_transpose pass 37 lines
// glaurung: matrix_transpose @ 0x1220
int32_t matrix_transpose(const int32_t * arg0, int32_t * arg1, int32_t arg2) {
int row;
int column;
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)) == 4) | ((long)(arg2) < 4)) == 0)) {
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
row = 0;
while ((row < arg2)) {
for (column = 0; (column < arg2); column++) {
arg1[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(column)) * arg2))) + row)))] = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg2))) + column)))];
}
row = ((unsigned int)(row) + 1);
}
local_4 = ((unsigned int)(arg2) * arg2);
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} clang -O2
3/3determinant3 pass 19 lines
// glaurung: determinant3 @ 0x1720
int32_t determinant3(const int32_t * arg0) {
long var1;
long var2;
long var20;
long var3;
long var7;
long var8;
if ((arg0 == 0)) {
return 0;
}
var1 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0xc))));
var2 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x10))));
var3 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x20))));
var7 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x14))));
var8 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x1c))));
var20 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x18))));
return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var1 * var8))) - (unsigned long)((unsigned int)((var20 * var2)))))) * *(int *)(((long)arg0 + 0x8))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var7 * var20))) - (unsigned long)((unsigned int)((var3 * var1)))))) * *(int *)(((long)arg0 + 0x4))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var3)) * var2))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var8)) * var7)))))) * *(int *)(((long)arg0))))))))));
} matrix_multiply pass 297 lines
// glaurung: matrix_multiply @ 0x1100
int32_t matrix_multiply(const int32_t * arg0, const int32_t * arg1, int32_t * arg2, int32_t arg3) {
int column;
int inner;
int row;
int sum;
long ret;
long var0;
long var109;
long var110;
long var126;
long var127;
long var141;
long var144;
long var145;
long var165;
int var169;
long var170;
long var171;
long var183;
long var184;
long var200;
long var201;
long var215;
long var218;
long var219;
int var238;
long var239;
long var240;
long var251;
long var252;
int var26;
long var267;
long var268;
long var27;
long var28;
long var3;
long var4;
long var40;
long var41;
long var57;
long var58;
long var74;
long var75;
int var95;
long var96;
long var97;
ret = 0xffffffff;
if (((unsigned long)(4) < (unsigned long)((unsigned long)((unsigned int)(arg3))))) {
goto L_1169;
}
if ((arg0 == 0)) {
goto L_1169;
}
if ((arg1 == 0)) {
goto L_1169;
}
if ((arg2 == 0)) {
goto L_1169;
}
if (((unsigned long)((unsigned int)(arg3)) == 0)) {
goto L_1163;
}
var0 = (unsigned long)((unsigned int)(arg3));
var3 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1)))) * *(int *)(((long)arg0)))));
var4 = var3;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var4 = (unsigned long)((unsigned int)((var3 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4)))) * *(int *)(((long)arg0 + 0x4))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var4 = (unsigned long)((unsigned int)((var4 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8)))) * *(int *)(((long)arg0 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var4 = (unsigned long)((unsigned int)((var4 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1[(var0 + (var0 * 2))])) * *(int *)(((long)arg0 + 0xc))))))));
}
}
}
*(int *)(((long)arg2)) = var4;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
goto L_116a;
}
L_1163: ;
ret = (unsigned long)((unsigned int)((arg3 * arg3)));
L_1169: ;
return ret;
L_116a: ;
var26 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0x4)))) * *(int *)(((long)arg0 + 0x4)))) + (unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0x4)))) * *(int *)(((long)arg0)))));
var27 = (unsigned long)((unsigned int)(var26));
var28 = (unsigned long)((unsigned int)(var26));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var28 = (unsigned long)((unsigned int)((var27 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0x4)))) * *(int *)(((long)arg0 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var28 = (unsigned long)((unsigned int)((var28 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((((long)arg1 + ((var0 + (var0 * 2)) * 4)) + 4)))) * *(int *)(((long)arg0 + 0xc))))))));
}
}
*(int *)(((long)arg2 + 0x4)) = var28;
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var40 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0x8)))) * *(int *)(((long)arg0)))));
var41 = var40;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var41 = (unsigned long)((unsigned int)((var40 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0x8)))) * *(int *)(((long)arg0 + 0x4))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var41 = (unsigned long)((unsigned int)((var41 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0x8)))) * *(int *)(((long)arg0 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var41 = (unsigned long)((unsigned int)((var41 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((((long)arg1 + ((var0 + (var0 * 2)) * 4)) + 8)))) * *(int *)(((long)arg0 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + 0x8)) = var41;
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var57 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0xc)))) * *(int *)(((long)arg0)))));
var58 = var57;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var58 = (unsigned long)((unsigned int)((var57 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0xc)))) * *(int *)(((long)arg0 + 0x4))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var58 = (unsigned long)((unsigned int)((var58 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0xc)))) * *(int *)(((long)arg0 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var58 = (unsigned long)((unsigned int)((var58 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((((long)arg1 + ((var0 + (var0 * 2)) * 4)) + 12)))) * *(int *)(((long)arg0 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + 0xc)) = var58;
if (((unsigned long)((unsigned int)(arg3)) == 1)) {
goto L_1163;
}
}
}
var74 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1)))) * *(int *)(((long)arg0 + var0 * 4)))));
var75 = var74;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var75 = (unsigned long)((unsigned int)((var74 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4)))) * *(int *)(((long)arg0 + var0 * 4 + 0x4))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var75 = (unsigned long)((unsigned int)((var75 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8)))) * *(int *)(((long)arg0 + var0 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var75 = (unsigned long)((unsigned int)((var75 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1[(var0 + (var0 * 2))])) * *(int *)(((long)arg0 + var0 * 4 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + var0 * 4)) = var75;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var95 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0x4)))) * *(int *)(((long)arg0 + var0 * 4 + 0x4)))) + (unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0x4)))) * *(int *)(((long)arg0 + var0 * 4)))));
var96 = (unsigned long)((unsigned int)(var95));
var97 = (unsigned long)((unsigned int)(var95));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var97 = (unsigned long)((unsigned int)((var96 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0x4)))) * *(int *)(((long)arg0 + var0 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var97 = (unsigned long)((unsigned int)((var97 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((((long)arg1 + ((var0 + (var0 * 2)) * 4)) + 4)))) * *(int *)(((long)arg0 + var0 * 4 + 0xc))))))));
}
}
*(int *)(((long)arg2 + var0 * 4 + 0x4)) = var97;
if (((unsigned long)((unsigned int)(arg3)) == 2)) {
goto L_1163;
}
var109 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0x8)))) * *(int *)(((long)arg0 + var0 * 4)))));
var110 = var109;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var110 = (unsigned long)((unsigned int)((var109 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0x8)))) * *(int *)(((long)arg0 + var0 * 4 + 0x4))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var110 = (unsigned long)((unsigned int)((var110 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0x8)))) * *(int *)(((long)arg0 + var0 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var110 = (unsigned long)((unsigned int)((var110 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((((long)arg1 + ((var0 + (var0 * 2)) * 4)) + 8)))) * *(int *)(((long)arg0 + var0 * 4 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + var0 * 4 + 0x8)) = var110;
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var126 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0xc)))) * *(int *)(((long)arg0 + var0 * 4)))));
var127 = var126;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var127 = (unsigned long)((unsigned int)((var126 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0xc)))) * *(int *)(((long)arg0 + var0 * 4 + 0x4))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var127 = (unsigned long)((unsigned int)((var127 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0xc)))) * *(int *)(((long)arg0 + var0 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var127 = (unsigned long)((unsigned int)((var127 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((((long)arg1 + ((var0 + (var0 * 2)) * 4)) + 12)))) * *(int *)(((long)arg0 + var0 * 4 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + var0 * 4 + 0xc)) = var127;
if (((unsigned long)((unsigned int)(arg3)) == 2)) {
goto L_1163;
}
}
}
var141 = (var0 + var0);
var144 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1)))) * *(int *)(((long)arg0 + var0 * 8)))));
var145 = var144;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var145 = (unsigned long)((unsigned int)((var144 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4)))) * *(int *)(((long)arg0 + ((var141 * 4) | 4)))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var145 = (unsigned long)((unsigned int)((var145 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8)))) * *(int *)(((long)arg0 + var141 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var145 = (unsigned long)((unsigned int)((var145 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1[(var0 + (var0 * 2))])) * *(int *)(((long)arg0 + var141 * 4 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + var141 * 4)) = var145;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var165 = ((var141 * 4) | 4);
var169 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0x4)))) * *(int *)(((long)arg0 + var165)))) + (unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0x4)))) * *(int *)(((long)arg0 + var141 * 4)))));
var170 = (unsigned long)((unsigned int)(var169));
var171 = (unsigned long)((unsigned int)(var169));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var171 = (unsigned long)((unsigned int)((var170 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0x4)))) * *(int *)(((long)arg0 + var141 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var171 = (unsigned long)((unsigned int)((var171 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((((long)arg1 + ((var0 + (var0 * 2)) * 4)) + 4)))) * *(int *)(((long)arg0 + var141 * 4 + 0xc))))))));
}
}
*(int *)(((long)arg2 + var165)) = var171;
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var183 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0x8)))) * *(int *)(((long)arg0 + var141 * 4)))));
var184 = var183;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var184 = (unsigned long)((unsigned int)((var183 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0x8)))) * *(int *)(((long)arg0 + var165))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var184 = (unsigned long)((unsigned int)((var184 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0x8)))) * *(int *)(((long)arg0 + var141 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var184 = (unsigned long)((unsigned int)((var184 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((((long)arg1 + ((var0 + (var0 * 2)) * 4)) + 8)))) * *(int *)(((long)arg0 + var141 * 4 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + var141 * 4 + 0x8)) = var184;
if (((unsigned long)((unsigned int)(arg3)) == 3)) {
goto L_1163;
}
var200 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0xc)))) * *(int *)(((long)arg0 + var141 * 4)))));
var201 = var200;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var201 = (unsigned long)((unsigned int)((var200 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0xc)))) * *(int *)(((long)arg0 + var165))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var201 = (unsigned long)((unsigned int)((var201 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0xc)))) * *(int *)(((long)arg0 + var141 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var201 = (unsigned long)((unsigned int)((var201 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((((long)arg1 + ((var0 + (var0 * 2)) * 4)) + 12)))) * *(int *)(((long)arg0 + var141 * 4 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + var141 * 4 + 0xc)) = var201;
if (((unsigned long)((unsigned int)(arg3)) == 3)) {
goto L_1163;
}
}
}
var215 = (var0 + (var0 * 2));
var218 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1)))) * *(int *)(((long)arg0 + var215 * 4)))));
var219 = var218;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var219 = (unsigned long)((unsigned int)((var218 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4)))) * *(int *)(((long)arg0 + var215 * 4 + 0x4))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var219 = (unsigned long)((unsigned int)((var219 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8)))) * *(int *)(((long)arg0 + var215 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var219 = (unsigned long)((unsigned int)((var219 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var215 * 4)))) * *(int *)(((long)arg0 + var215 * 4 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + var215 * 4)) = var219;
if (((unsigned long)((unsigned int)(arg3)) == 1)) {
goto L_1163;
}
var238 = ((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0x4)))) * *(int *)(((long)arg0 + var215 * 4 + 0x4)))) + (unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0x4)))) * *(int *)(((long)arg0 + var215 * 4)))));
var239 = (unsigned long)((unsigned int)(var238));
var240 = (unsigned long)((unsigned int)(var238));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var240 = (unsigned long)((unsigned int)((var239 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0x4)))) * *(int *)(((long)arg0 + var215 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var240 = (unsigned long)((unsigned int)((var240 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var215 * 4 + 0x4)))) * *(int *)(((long)arg0 + var215 * 4 + 0xc))))))));
}
}
*(int *)(((long)arg2 + var215 * 4 + 0x4)) = var240;
if (((unsigned long)((unsigned int)(arg3)) == 2)) {
goto L_1163;
}
var251 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0x8)))) * *(int *)(((long)arg0 + var215 * 4)))));
var252 = var251;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var252 = (unsigned long)((unsigned int)((var251 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0x8)))) * *(int *)(((long)arg0 + var215 * 4 + 0x4))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var252 = (unsigned long)((unsigned int)((var252 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0x8)))) * *(int *)(((long)arg0 + var215 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var252 = (unsigned long)((unsigned int)((var252 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var215 * 4 + 0x8)))) * *(int *)(((long)arg0 + var215 * 4 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + var215 * 4 + 0x8)) = var252;
if (((unsigned long)((unsigned int)(arg3)) == 3)) {
goto L_1163;
}
var267 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + 0xc)))) * *(int *)(((long)arg0 + var215 * 4)))));
var268 = var267;
if (((unsigned long)((unsigned int)(arg3)) != 1)) {
var268 = (unsigned long)((unsigned int)((var267 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 4 + 0xc)))) * *(int *)(((long)arg0 + var215 * 4 + 0x4))))))));
if (((unsigned long)((unsigned int)(arg3)) != 2)) {
var268 = (unsigned long)((unsigned int)((var268 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var0 * 8 + 0xc)))) * *(int *)(((long)arg0 + var215 * 4 + 0x8))))))));
if (((unsigned long)((unsigned int)(arg3)) != 3)) {
var268 = (unsigned long)((unsigned int)((var268 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)(((long)arg1 + var215 * 4 + 0xc)))) * *(int *)(((long)arg0 + var215 * 4 + 0xc))))))));
}
}
}
*(int *)(((long)arg2 + var215 * 4 + 0xc)) = var268;
goto L_1163;
} matrix_transpose pass 77 lines
// glaurung: matrix_transpose @ 0x1600
int32_t matrix_transpose(const int32_t * arg0, int32_t * arg1, int32_t arg2) {
int column;
int row;
long ret;
long var1;
long var12;
long var19;
ret = 0xffffffff;
if (((unsigned long)(4) < (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)) {
*(int *)(((long)arg1)) = *(int *)(((long)arg0));
if (((unsigned long)((unsigned int)(arg2)) == 1)) {
return (unsigned int)((arg2 * arg2));
}
var1 = (unsigned long)((unsigned int)(arg2));
arg1[(unsigned long)((unsigned int)(arg2))] = *(int *)(((long)arg0 + 0x4));
if (((unsigned long)((unsigned int)(arg2)) != 2)) {
*(int *)(((long)arg1 + var1 * 8)) = *(int *)(((long)arg0 + 0x8));
if (((unsigned long)((unsigned int)(arg2)) != 3)) {
arg1[(var1 + (var1 * 2))] = *(int *)(((long)arg0 + 0xc));
if (((unsigned long)((unsigned int)(arg2)) == 1)) {
return (unsigned int)((arg2 * arg2));
}
}
}
*(int *)(((long)arg1 + 0x4)) = *(int *)(((long)arg0 + var1 * 4));
if (((unsigned long)((unsigned int)(arg2)) != 1)) {
*(int *)(((long)arg1 + var1 * 4 + 0x4)) = *(int *)(((long)arg0 + var1 * 4 + 0x4));
if (((unsigned long)((unsigned int)(arg2)) == 2)) {
return (unsigned int)((arg2 * arg2));
}
*(int *)(((long)arg1 + var1 * 8 + 0x4)) = *(int *)(((long)arg0 + var1 * 4 + 0x8));
if (((unsigned long)((unsigned int)(arg2)) != 3)) {
*(int *)((((long)arg1 + ((var1 + (var1 * 2)) * 4)) + 4)) = *(int *)(((long)arg0 + var1 * 4 + 0xc));
if (((unsigned long)((unsigned int)(arg2)) == 2)) {
return (unsigned int)((arg2 * arg2));
}
}
}
*(int *)(((long)arg1 + 0x8)) = *(int *)(((long)arg0 + var1 * 8));
if (((unsigned long)((unsigned int)(arg2)) != 1)) {
var12 = (var1 + var1);
*(int *)(((long)arg1 + var1 * 4 + 0x8)) = *(int *)(((long)arg0 + ((var12 * 4) | 4)));
if (((unsigned long)((unsigned int)(arg2)) != 2)) {
*(int *)(((long)arg1 + var1 * 8 + 0x8)) = *(int *)(((long)arg0 + var12 * 4 + 0x8));
if (((unsigned long)((unsigned int)(arg2)) == 3)) {
return (unsigned int)((arg2 * arg2));
}
*(int *)((((long)arg1 + ((var1 + (var1 * 2)) * 4)) + 8)) = *(int *)(((long)arg0 + var12 * 4 + 0xc));
}
}
var19 = (var1 + (var1 * 2));
*(int *)(((long)arg1 + 0xc)) = *(int *)(((long)arg0 + var19 * 4));
if (((unsigned long)((unsigned int)(arg2)) == 1)) {
return (unsigned int)((arg2 * arg2));
}
*(int *)(((long)arg1 + var1 * 4 + 0xc)) = *(int *)(((long)arg0 + var19 * 4 + 0x4));
if (((unsigned long)((unsigned int)(arg2)) == 2)) {
return (unsigned int)((arg2 * arg2));
}
*(int *)(((long)arg1 + var1 * 8 + 0xc)) = *(int *)(((long)arg0 + var19 * 4 + 0x8));
if (((unsigned long)((unsigned int)(arg2)) == 3)) {
return (unsigned int)((arg2 * arg2));
}
*(int *)(((long)arg1 + var19 * 4 + 0xc)) = *(int *)(((long)arg0 + var19 * 4 + 0xc));
}
return (unsigned int)((arg2 * arg2));
} gcc -O0
3/3determinant3 pass 9 lines
// glaurung: determinant3 @ 0x12ac
int32_t determinant3(const int32_t * arg0) {
// x86-64 prologue: save rbp
if ((arg0 != 0)) {
return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((arg0 + 2)))) * (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((arg0 + 7)))) * (unsigned long)((unsigned int)(*(int *)((arg0 + 3))))))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((arg0 + 6)))) * (unsigned long)((unsigned int)(*(int *)((arg0 + 4))))))))))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((long)arg0))) * (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((arg0 + 8)))) * (unsigned long)((unsigned int)(*(int *)((arg0 + 4))))))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((arg0 + 7)))) * (unsigned long)((unsigned int)(*(int *)((arg0 + 5))))))))))))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((arg0 + 1)))) * (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((arg0 + 8)))) * (unsigned long)((unsigned int)(*(int *)((arg0 + 3))))))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((arg0 + 6)))) * (unsigned long)((unsigned int)(*(int *)((arg0 + 5))))))))))))))))));
} else {
return 0;
}
} matrix_multiply pass 43 lines
// glaurung: matrix_multiply @ 0x10f9
int32_t matrix_multiply(const int32_t * arg0, const int32_t * arg1, int32_t * arg2, int32_t arg3) {
int row;
int column;
int sum;
int inner;
// 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)) == 4) | ((long)(arg3) < 4)) == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
row = 0;
while ((row < arg3)) {
column = 0;
while ((column < arg3)) {
sum = 0;
for (inner = 0; (inner < arg3); inner++) {
sum = (sum + (unsigned int)(((unsigned long)((unsigned int)(arg1[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(inner)) * arg3))))))])) * (unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(inner)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg3))))))])))));
}
arg2[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg3))))))] = sum;
column = (column + 1);
}
row = (row + 1);
}
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(arg3)) * (unsigned long)((unsigned int)(arg3))));
} matrix_transpose pass 31 lines
// glaurung: matrix_transpose @ 0x1203
int32_t matrix_transpose(const int32_t * arg0, int32_t * arg1, int32_t arg2) {
int row;
int column;
// 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)) == 4) | ((long)(arg2) < 4)) == 0)) {
// x86-64 epilogue: restore rbp
return 0xffffffff;
}
row = 0;
while ((row < arg2)) {
for (column = 0; (column < arg2); column++) {
arg1[(long)((int)(((unsigned long)((unsigned int)(row)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(column)) * arg2))))))] = arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * arg2))))))];
}
row = (row + 1);
}
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(arg2)) * (unsigned long)((unsigned int)(arg2))));
} gcc -O2
3/3determinant3 pass 19 lines
// glaurung: determinant3 @ 0x1200
int32_t determinant3(const int32_t * arg0) {
long var2;
long var3;
long var4;
long var5;
long var6;
long var7;
if ((arg0 == 0)) {
return 0;
}
var2 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x10))));
var3 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x14))));
var4 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x20))));
var5 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x1c))));
var6 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0xc))));
var7 = (unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x18))));
return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var2)) * var4))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var3)) * var5)))))) * *(int *)((long)arg0)))) - (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var4 * var6))) - (unsigned long)((unsigned int)((var3 * var7)))))) * *(int *)(((long)arg0 + 0x4)))))))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var5 * var6))) - (unsigned long)((unsigned int)((var2 * var7)))))) * *(int *)(((long)arg0 + 0x8)))))));
} matrix_multiply pass 80 lines
// glaurung: matrix_multiply @ 0x1100
int32_t matrix_multiply(const int32_t * arg0, const int32_t * arg1, int32_t * arg2, int32_t arg3) {
int column;
int inner;
int row;
int sum;
long local_18;
long local_8;
long var1;
long var13;
long var14;
long var15;
long var16;
long var17;
long var2;
long var20;
long var24;
long var25;
long var28;
long var3;
long var31;
int var32;
long var33;
int var34;
long var7;
long var8;
if ((arg0 == 0)) {
return (unsigned int)(-1);
}
local_8 = var1;
var2 = (long)arg1;
local_18 = var3;
if ((arg1 == 0)) {
// x86-64 epilogue: tear down frame
return 0xffffffff;
}
var7 = (long)arg2;
if ((arg2 == 0)) {
// x86-64 epilogue: tear down frame
return 0xffffffff;
}
var8 = (unsigned long)((unsigned int)(arg3));
if (((unsigned long)(4) < (unsigned long)((unsigned long)((unsigned int)(arg3))))) {
// x86-64 epilogue: tear down frame
return 0xffffffff;
}
if (((unsigned long)((unsigned int)(arg3)) != 0)) {
var13 = ((long)(arg3) << 2);
var14 = (long)((((long)arg0 + ((unsigned long)((unsigned int)((arg3 - 1))) * 4)) + 4));
var15 = var16;
var17 = 0;
var20 = (long)arg0;
do {
column = 0;
do {
var24 = (var2 + ((unsigned long)((unsigned int)(column)) * 4));
var25 = var20;
var28 = 0;
do {
var31 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((var25)))) * *(int *)((var24)))));
var25 = (var25 + 4);
var24 = (var24 + var13);
var32 = (var28 + var31);
var33 = (unsigned long)((unsigned int)(var32));
var28 = (unsigned long)((unsigned int)(var32));
} while ((var25 != var14));
*(int *)((var7 + column * 4)) = var33;
var15 = ((unsigned long)((unsigned int)(column)) + 1);
column = var15;
} while (((((unsigned int)(var8) == (unsigned int)(var15)) | ((long)((int)(var8)) < (long)((int)(var15)))) == 0));
var34 = (var17 + 1);
var7 = (var7 + var13);
var20 = (var20 + var13);
var14 = (var14 + var13);
var17 = (unsigned long)((unsigned int)(var34));
} while (((unsigned int)(var8) != (unsigned int)(var34)));
}
// x86-64 epilogue: tear down frame
return (unsigned int)((var8 * var8));
} matrix_transpose pass 52 lines
// glaurung: matrix_transpose @ 0x11a0
int32_t matrix_transpose(const int32_t * arg0, int32_t * arg1, int32_t arg2) {
int column;
int row;
long var0;
int var1;
long var10;
long var11;
long var12;
long var13;
int var14;
long var4;
long var5;
long var8;
long var9;
var0 = (unsigned long)((unsigned int)(arg2));
if ((arg0 == 0)) {
return 0xffffffff;
}
if ((arg1 == 0)) {
return 0xffffffff;
}
if (((unsigned long)(4) < (unsigned long)((unsigned long)((unsigned int)(arg2))))) {
return 0xffffffff;
}
if (((unsigned long)((unsigned int)(arg2)) == 0)) {
var1 = (var0 * var0);
return (unsigned int)(var1);
}
var4 = (long)((((long)arg0 + ((unsigned long)((unsigned int)((arg2 - 1))) * 4)) + 4));
var5 = ((long)(arg2) << 2);
var8 = (long)arg0;
var9 = 0;
var10 = (long)arg1;
do {
var11 = var10;
var12 = var8;
do {
var13 = (unsigned long)((unsigned int)(*(int *)((var12))));
var12 = (var12 + 4);
*(int *)((var11)) = var13;
var11 = (var11 + var5);
} while ((var12 != var4));
var14 = (var9 + 1);
var8 = (var8 + var5);
var10 = (var10 + 4);
var4 = (var4 + var5);
var9 = (unsigned long)((unsigned int)(var14));
} while (((unsigned int)(var0) != (unsigned int)(var14)));
var1 = (var0 * var0);
return (unsigned int)(var1);
}