Fixture 62
gaussian elimination
C · 1 functions · 4 lanes · 3 of 4 function-lanes behave identically
One lane has a function that returns a different result after decompilation: clang-O2 (0/1).
Gaussian elimination with partial pivoting on a Q16.16 augmented matrix. Row swapping through an index indirection, a scaled subtract across a row, and back-substitution in reverse order compose the densest 2D-indexing case in the corpus.
#include <stdint.h>
/* Gaussian elimination with partial pivoting on a Q16.16 augmented matrix.
* Row swapping through an index indirection, a scaled subtract across a row,
* and back-substitution in reverse order compose the densest 2D-indexing case
* in the corpus. */
#define GAUSS_DIM 4
static int32_t gauss_mul_q16(int32_t left, int32_t right) {
return (int32_t)(((int64_t)left * (int64_t)right) >> 16);
}
static int32_t gauss_div_q16(int32_t numerator, int32_t denominator) {
if (denominator == 0) {
return 0;
}
return (int32_t)(((int64_t)numerator << 16) / (int64_t)denominator);
}
__attribute__((noinline)) int32_t
gaussian_solve(int32_t *augmented, int32_t dimension, int32_t *solution) {
int32_t pivot;
int32_t row;
int32_t column;
int32_t stride;
if (augmented == 0 || solution == 0 || dimension < 1 ||
dimension > GAUSS_DIM) {
return -1;
}
stride = dimension + 1;
for (pivot = 0; pivot < dimension; ++pivot) {
int32_t best = pivot;
int32_t best_magnitude;
for (row = pivot + 1; row < dimension; ++row) {
int32_t candidate = augmented[row * stride + pivot];
int32_t current = augmented[best * stride + pivot];
int32_t candidate_magnitude = (candidate < 0) ? -candidate : candidate;
int32_t current_magnitude = (current < 0) ? -current : current;
if (candidate_magnitude > current_magnitude) {
best = row;
}
}
if (best != pivot) {
for (column = 0; column < stride; ++column) {
int32_t swap = augmented[pivot * stride + column];
augmented[pivot * stride + column] =
augmented[best * stride + column];
augmented[best * stride + column] = swap;
}
}
best_magnitude = augmented[pivot * stride + pivot];
if (best_magnitude == 0) {
return -2;
}
for (row = pivot + 1; row < dimension; ++row) {
int32_t factor =
gauss_div_q16(augmented[row * stride + pivot], best_magnitude);
for (column = pivot; column < stride; ++column) {
augmented[row * stride + column] -=
gauss_mul_q16(factor, augmented[pivot * stride + column]);
}
}
}
for (row = dimension - 1; row >= 0; --row) {
int32_t accumulator = augmented[row * stride + dimension];
for (column = row + 1; column < dimension; ++column) {
accumulator -=
gauss_mul_q16(augmented[row * stride + column], solution[column]);
}
solution[row] = gauss_div_q16(accumulator, augmented[row * stride + row]);
}
return dimension;
} 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 -O2
0/1gaussian_solve fail 791 lines
// glaurung: gaussian_solve @ 0x1100
__attribute__((no_stack_protector)) int32_t gaussian_solve(int32_t * arg0, int32_t arg1, int32_t * arg2) {
int stride;
int pivot;
int candidate;
int current;
int row;
int column;
int accumulator;
int best;
int candidate_magnitude;
int current_magnitude;
int swap;
long local_100;
unsigned char local_80[128];
long local_88;
long local_90;
long local_98;
long local_a0;
long local_a8;
long local_b0;
long local_b8;
long local_c0;
long local_c8;
long local_d8;
long local_e0;
long local_e8;
int local_f0;
long ret;
long t1025;
long t1026;
long t1027;
long t1028;
long t1029;
long t1030;
long t1031;
long t1032;
long t1033;
long t1034;
long t1035;
long t1036;
long t1037;
long t1038;
long t1039;
long t1040;
long t1041;
long t1042;
long t1043;
long t1082;
long t1083;
long t1084;
long t1085;
long t1086;
long t1087;
long t1088;
long t1089;
long t1090;
long t1091;
long t1092;
long t1093;
long t1094;
long t1095;
long t1096;
long t1097;
long t1098;
long t1099;
long t110;
long t1100;
long t113;
long t1288;
long t1289;
long t1290;
long t1291;
long t1292;
long t1293;
long t1294;
long t1295;
long t1296;
long t1297;
long t1298;
long t1299;
long t1300;
long t1301;
long t1302;
long t1303;
long t1304;
long t1305;
long t1306;
long t1307;
long t1308;
long t1309;
long t1310;
long t1311;
long t1312;
long t1313;
long t1314;
long t1315;
long t1316;
long t1375;
long t1376;
long t1377;
long t1378;
long t1379;
long t1380;
long t1381;
long t1382;
long t1383;
long t1384;
long t1385;
long t1386;
long t1387;
long t1388;
long t1389;
long t1390;
long t1391;
long t1392;
long t1393;
long t1394;
long t1395;
long t1396;
long t1397;
long t1398;
long t1399;
long t1400;
long t1401;
long t1402;
long t1403;
long t160;
long t163;
long t190;
long t191;
long t85;
long var1;
long var100;
long var102;
long var105;
long var106;
long var107;
long var108;
long var109;
long var110;
long var112;
long var114;
long var118;
long var125;
long var13;
long var130;
long var131;
long var133;
int var143;
int var145;
int var153;
int var155;
long var158;
long var159;
long var16;
long var161;
int var162;
int var163;
int var164;
int var165;
long var20;
long var23;
long var25;
long var26;
int var271;
int var272;
int var273;
int var274;
int var275;
int var276;
int var277;
int var278;
int var279;
int var280;
int var281;
long var3;
long var32;
long var34;
long var36;
long var38;
long var386;
long var388;
int var389;
long var39;
int var390;
int var391;
int var392;
int var40;
long var42;
long var43;
int var498;
int var499;
int var500;
long var511;
long var530;
long var531;
long var535;
long var537;
long var538;
long var543;
long var546;
long var549;
long var551;
long var554;
long var557;
long var559;
int var563;
long var569;
long var572;
long var573;
int var574;
int var575;
int var576;
int var577;
int var579;
int var580;
int var581;
int var582;
long var584;
long var585;
long var586;
int var587;
int var588;
int var589;
long var59;
int var590;
int var591;
int var592;
int var593;
int var594;
int var595;
int var596;
int var597;
int var598;
int var599;
int var600;
int var601;
int var602;
long var63;
long var64;
long var66;
long var68;
long var7;
long var70;
long var72;
long var75;
long var76;
long var79;
long var8;
long var82;
int var869;
int var870;
long var881;
long var894;
long var896;
long var897;
long var9;
long var911;
long var914;
long var916;
long var94;
// x86-64 prologue: save callee registers, frame 48 bytes
ret = 0xffffffff;
if (((unsigned long)((unsigned long)((unsigned int)((arg1 - 5)))) < (unsigned long)(0xfffffffc))) {
// x86-64 epilogue: restore callee registers
return ret;
}
if ((arg0 == 0)) {
// x86-64 epilogue: restore callee registers
return ret;
}
var1 = (long)arg2;
if ((arg2 == 0)) {
// x86-64 epilogue: restore callee registers
return ret;
}
stride = (unsigned long)((unsigned int)((arg1 + 1)));
var3 = (unsigned long)((unsigned int)(arg1));
local_a8 = var1;
local_e8 = (unsigned int)(arg1);
var7 = (unsigned long)((unsigned int)(arg1));
var8 = (unsigned long)((unsigned int)(arg1));
if (((unsigned long)((unsigned int)(arg1)) == 0)) {
goto L_16f0;
}
var9 = ((unsigned long)((unsigned int)(stride)) * 4);
local_88 = (((unsigned long)((unsigned int)(stride)) * 4) + 4);
local_c0 = (-(unsigned long)((unsigned int)(stride)));
var13 = (long)(((long)arg0 + ((unsigned long)((unsigned int)(stride)) * 4)));
local_90 = (long)((((long)arg0 + ((unsigned long)((unsigned int)(stride)) * 4)) + 16));
var16 = (long)((arg0 + 4));
local_98 = ((unsigned long)((unsigned int)(stride)) - 4);
local_a0 = (long)((((long)arg0 + ((unsigned long)((unsigned int)(stride)) * 4)) + 4));
var20 = 1;
var23 = (long)arg0;
*(long *)((&local_80[0] + 32)) = var9;
pivot = 0;
var25 = (long)arg0;
var26 = (unsigned long)((unsigned int)(arg1));
goto L_1208;
L_11c0: ;
var20 = (long)((int)((*(long *)(&local_80[0]) + 1)));
var13 = (*(long *)((&local_80[0] + 16)) + local_88);
local_90 = (local_90 + local_88);
var16 = (var16 + local_88);
local_98 = (local_98 - 1);
local_a0 = (local_a0 + var9);
var23 = (var23 + var9);
var32 = *(long *)((&local_80[0] + 8));
var3 = local_e8;
var1 = local_a8;
pivot = var32;
var7 = local_e8;
var8 = var26;
if ((var32 == local_e8)) {
goto L_16f0;
}
L_1208: ;
var34 = ((unsigned long)((unsigned int)(pivot)) + 1);
*(long *)((&local_80[0] + 8)) = var34;
if (((unsigned long)(var3) <= (unsigned long)(var34))) {
goto L_1270;
}
var36 = var13;
var38 = (unsigned long)((unsigned int)(pivot));
var39 = (unsigned long)((unsigned int)(var20));
goto L_123d;
L_1230: ;
var36 = (var36 + var9);
var40 = (var39 + 1);
var39 = (unsigned long)((unsigned int)(var40));
var38 = (unsigned long)((unsigned int)(var42));
var43 = var42;
if (((unsigned int)(var26) == (unsigned int)(var40))) {
goto L_1273;
}
L_123d: ;
candidate = (unsigned long)((unsigned int)(*(int *)((var36))));
current = (unsigned long)((unsigned int)(*(int *)((var25 + (((long)((int)(((unsigned long)((unsigned int)(stride)) * var38))) + pivot) * 4)))));
t190 = (-(unsigned long)((unsigned int)(candidate)));
t191 = (-(unsigned long)((unsigned int)(current)));
var42 = (unsigned long)((unsigned int)(var39));
if (((unsigned long)((unsigned long)((unsigned int)((((long)((int)(t191)) < 0) ? current : t191)))) < (unsigned long)((unsigned long)((unsigned int)((((long)((int)(t190)) < 0) ? candidate : t190)))))) {
goto L_1230;
}
var42 = (unsigned long)((unsigned int)(var38));
goto L_1230;
L_1270: ;
var43 = (unsigned long)((unsigned int)(pivot));
L_1273: ;
var59 = ((unsigned long)((unsigned int)(pivot)) * (unsigned long)((unsigned int)(stride)));
if ((pivot != (unsigned long)((unsigned int)(var43)))) {
var63 = (long)((int)((var43 * stride)));
var64 = (unsigned long)((unsigned int)(*(int *)((var25 + var59 * 4))));
*(int *)((var25 + var59 * 4)) = *(int *)((var25 + var63 * 4));
*(int *)((var25 + var63 * 4)) = var64;
var66 = (unsigned long)((unsigned int)(*(int *)((var25 + var59 * 4 + 0x4))));
*(int *)((var25 + var59 * 4 + 0x4)) = *(int *)((var25 + var63 * 4 + 0x4));
*(int *)((var25 + var63 * 4 + 0x4)) = var66;
if (((unsigned long)((unsigned int)(stride)) != 2)) {
var68 = (unsigned long)((unsigned int)(*(int *)((var25 + var59 * 4 + 0x8))));
*(int *)((var25 + var59 * 4 + 0x8)) = *(int *)((var25 + var63 * 4 + 0x8));
*(int *)((var25 + var63 * 4 + 0x8)) = var68;
if (((unsigned long)((unsigned int)(stride)) != 3)) {
var70 = (unsigned long)((unsigned int)(*(int *)((var25 + var59 * 4 + 0xc))));
*(int *)((var25 + var59 * 4 + 0xc)) = *(int *)((var25 + var63 * 4 + 0xc));
*(int *)((var25 + var63 * 4 + 0xc)) = var70;
if (((unsigned long)((unsigned int)(stride)) != 4)) {
var72 = (unsigned long)((unsigned int)(*(int *)((var25 + var59 * 4 + 0x10))));
*(int *)((var25 + var59 * 4 + 0x10)) = *(int *)((var25 + var63 * 4 + 0x10));
*(int *)((var25 + var63 * 4 + 0x10)) = var72;
}
}
}
}
var75 = (long)((int)(*(int *)((var25 + ((pivot + var59) * 4)))));
var76 = local_e8;
if ((var75 == 0)) {
// x86-64 epilogue: restore callee registers
return 0xfffffffe;
}
local_e0 = var59;
local_100 = (unsigned long)((unsigned int)(pivot));
*(long *)(&local_80[0]) = var20;
*(long *)((&local_80[0] + 16)) = var13;
if (((unsigned long)(var76) <= (unsigned long)(*(long *)((&local_80[0] + 8))))) {
goto L_11c0;
}
var79 = ((unsigned long)((unsigned int)(stride)) - local_100);
var82 = (var79 - 4);
*(long *)((&local_80[0] + 64)) = var82;
*(long *)((&local_80[0] + 24)) = ((((unsigned long)(local_98) >> 2) + 1) & -2);
*(long *)((&local_80[0] + 56)) = (((unsigned long)(var82) >> 2) + 1);
local_c8 = ((local_88 * local_100) + var25);
local_b0 = (var25 + ((local_e0 + (unsigned long)((unsigned int)(stride))) * 4));
var94 = *(long *)(&local_80[0]);
local_b8 = ((var94 * (unsigned long)((unsigned int)(stride))) + local_100);
*(long *)((&local_80[0] + 72)) = ((var94 + 1) * (unsigned long)((unsigned int)(stride)));
local_f0 = var79;
var100 = (var79 & -4);
*(long *)((&local_80[0] + 48)) = var100;
*(long *)((&local_80[0] + 40)) = (local_100 + var100);
var102 = local_a0;
var105 = 0;
local_d8 = var75;
var106 = local_90;
var107 = var9;
var108 = var94;
var109 = var25;
var110 = var26;
goto L_13ec;
L_13d0: ;
row = (var108 + 1);
var105 = (var105 + 1);
var106 = (var106 + var9);
var102 = (var102 + var9);
var75 = local_d8;
var107 = var9;
var108 = (unsigned long)((unsigned int)(row));
var109 = var25;
var110 = var26;
if (((unsigned int)(row) == (unsigned int)(var26))) {
goto L_11c0;
}
L_13ec: ;
var114 = (var108 * (unsigned long)((unsigned int)(stride)));
var118 = ((long)((int)(*(int *)((var109 + ((local_100 + var114) * 4))))) << 16);
if ((((unsigned long)((var118 | var75)) >> 32) != 0)) {
var125 = ((long)((((__int128)(long)(((long)(var118) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(var118)) / (long)(var75)));
goto L_1424;
}
var125 = ((unsigned int)(((((unsigned long long)(unsigned int)((unsigned long)((unsigned int)(0))) << 32) | (unsigned int)(var118)) / (unsigned int)(var75))));
L_1424: ;
var130 = (long)((int)(var125));
var131 = local_100;
var9 = var107;
var25 = var109;
var26 = var110;
if (((unsigned long)(local_f0) < (unsigned long)(4))) {
goto L_1680;
}
var133 = (var105 * (unsigned long)((unsigned int)(stride)));
if (((unsigned long)((var109 + ((local_b8 + var133) * 4))) < (unsigned long)(local_b0))) {
var133 = (var133 + *(long *)((&local_80[0] + 72)));
var131 = local_100;
var9 = var107;
var25 = var109;
var26 = var110;
if (((unsigned long)(local_c8) < (unsigned long)((var109 + (var133 * 4))))) {
goto L_1680;
}
}
t85 = (((unsigned long)(var130) >> 32) & 0xffffffff);
var143 = (unsigned int)(var130);
var145 = (unsigned int)(var130);
var153 = (unsigned int)(((unsigned long)((t85 | (unsigned int)(var130))) >> 32));
var155 = (unsigned int)(((unsigned long)((t85 | (unsigned int)(var130))) >> 32));
if (((unsigned long)(*(long *)((&local_80[0] + 64))) < (unsigned long)(4))) {
var158 = 0;
goto L_15bb;
}
var159 = *(long *)((&local_80[0] + 24));
var161 = 0;
do {
var162 = *(int *)((var16 + var161 * 4 - 0x10));
var163 = *(int *)((var16 + var161 * 4 - 0xc));
var164 = *(int *)((var16 + var161 * 4 - 0x8));
var165 = *(int *)((var16 + var161 * 4 - 0x4));
t160 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var164)));
t163 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var165)));
t1288 = ((unsigned long)((unsigned int)(var164)) * (unsigned long)((unsigned int)(var153)));
t1375 = ((unsigned long)((unsigned int)(var165)) * (unsigned long)((unsigned int)(var155)));
t1289 = ((unsigned long)((unsigned int)((-(var164 < 0)))) * (unsigned long)((unsigned int)(var143)));
t1376 = ((unsigned long)((unsigned int)((-(var165 < 0)))) * (unsigned long)((unsigned int)(var145)));
t110 = (((((unsigned long)(t1289) >> 32) & 0xffffffff) | (unsigned int)(t1289)) + ((((unsigned long)(t1288) >> 32) & 0xffffffff) | (unsigned int)(t1288)));
t113 = (((((unsigned long)(t1376) >> 32) & 0xffffffff) | (unsigned int)(t1376)) + ((((unsigned long)(t1375) >> 32) & 0xffffffff) | (unsigned int)(t1375)));
/* asm: psllq */
t1025 = (((((unsigned long)(t110) >> 32) & 0xffffffff) | (unsigned int)(t110)) + ((((unsigned long)(t160) >> 32) & 0xffffffff) | (unsigned int)(t160)));
t1082 = (((((unsigned long)(t113) >> 32) & 0xffffffff) | (unsigned int)(t113)) + ((((unsigned long)(t163) >> 32) & 0xffffffff) | (unsigned int)(t163)));
t1290 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var162)));
t1377 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var163)));
t1291 = ((unsigned long)((unsigned int)(var162)) * (unsigned long)((unsigned int)(var153)));
t1378 = ((unsigned long)((unsigned int)(var163)) * (unsigned long)((unsigned int)(var155)));
t1292 = ((unsigned long)((unsigned int)((-(var162 < 0)))) * (unsigned long)((unsigned int)(var143)));
t1379 = ((unsigned long)((unsigned int)((-(var163 < 0)))) * (unsigned long)((unsigned int)(var145)));
t1026 = (((((unsigned long)(t1292) >> 32) & 0xffffffff) | (unsigned int)(t1292)) + ((((unsigned long)(t1291) >> 32) & 0xffffffff) | (unsigned int)(t1291)));
t1083 = (((((unsigned long)(t1379) >> 32) & 0xffffffff) | (unsigned int)(t1379)) + ((((unsigned long)(t1378) >> 32) & 0xffffffff) | (unsigned int)(t1378)));
/* asm: psllq */
t1027 = (((((unsigned long)(t1026) >> 32) & 0xffffffff) | (unsigned int)(t1026)) + ((((unsigned long)(t1290) >> 32) & 0xffffffff) | (unsigned int)(t1290)));
t1084 = (((((unsigned long)(t1083) >> 32) & 0xffffffff) | (unsigned int)(t1083)) + ((((unsigned long)(t1377) >> 32) & 0xffffffff) | (unsigned int)(t1377)));
var271 = (*(int *)((var106 + var161 * 4 - 0xc)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1084) >> 32) & 0xffffffff) | (unsigned int)(t1084))) >> 16)));
var272 = (*(int *)((var106 + var161 * 4 - 0x8)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1025) >> 32) & 0xffffffff) | (unsigned int)(t1025))) >> 16)));
var273 = (*(int *)((var106 + var161 * 4 - 0x4)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1082) >> 32) & 0xffffffff) | (unsigned int)(t1082))) >> 16)));
var274 = *(int *)((var106 + var161 * 4));
var275 = *(int *)((var106 + var161 * 4 + 0x4));
var276 = *(int *)((var106 + var161 * 4 + 0x8));
var277 = *(int *)((var106 + var161 * 4 + 0xc));
*(int *)((var106 + var161 * 4 - 0x10)) = (*(int *)((var106 + var161 * 4 - 0x10)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1027) >> 32) & 0xffffffff) | (unsigned int)(t1027))) >> 16)));
*(int *)((var106 + var161 * 4 - 0xc)) = var271;
*(int *)((var106 + var161 * 4 - 0x8)) = var272;
*(int *)((var106 + var161 * 4 - 0x4)) = var273;
var278 = *(int *)((var16 + var161 * 4));
var279 = *(int *)((var16 + var161 * 4 + 0x4));
var280 = *(int *)((var16 + var161 * 4 + 0x8));
var281 = *(int *)((var16 + var161 * 4 + 0xc));
t1293 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var280)));
t1380 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var281)));
t1294 = ((unsigned long)((unsigned int)(var280)) * (unsigned long)((unsigned int)(var153)));
t1381 = ((unsigned long)((unsigned int)(var281)) * (unsigned long)((unsigned int)(var155)));
t1295 = ((unsigned long)((unsigned int)((-(var280 < 0)))) * (unsigned long)((unsigned int)(var143)));
t1382 = ((unsigned long)((unsigned int)((-(var281 < 0)))) * (unsigned long)((unsigned int)(var145)));
t1028 = (((((unsigned long)(t1295) >> 32) & 0xffffffff) | (unsigned int)(t1295)) + ((((unsigned long)(t1294) >> 32) & 0xffffffff) | (unsigned int)(t1294)));
t1085 = (((((unsigned long)(t1382) >> 32) & 0xffffffff) | (unsigned int)(t1382)) + ((((unsigned long)(t1381) >> 32) & 0xffffffff) | (unsigned int)(t1381)));
/* asm: psllq */
t1029 = (((((unsigned long)(t1028) >> 32) & 0xffffffff) | (unsigned int)(t1028)) + ((((unsigned long)(t1293) >> 32) & 0xffffffff) | (unsigned int)(t1293)));
t1086 = (((((unsigned long)(t1085) >> 32) & 0xffffffff) | (unsigned int)(t1085)) + ((((unsigned long)(t1380) >> 32) & 0xffffffff) | (unsigned int)(t1380)));
t1296 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var278)));
t1383 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var279)));
t1297 = ((unsigned long)((unsigned int)(var278)) * (unsigned long)((unsigned int)(var153)));
t1384 = ((unsigned long)((unsigned int)(var279)) * (unsigned long)((unsigned int)(var155)));
t1298 = ((unsigned long)((unsigned int)((-(var278 < 0)))) * (unsigned long)((unsigned int)(var143)));
t1385 = ((unsigned long)((unsigned int)((-(var279 < 0)))) * (unsigned long)((unsigned int)(var145)));
t1030 = (((((unsigned long)(t1298) >> 32) & 0xffffffff) | (unsigned int)(t1298)) + ((((unsigned long)(t1297) >> 32) & 0xffffffff) | (unsigned int)(t1297)));
t1087 = (((((unsigned long)(t1385) >> 32) & 0xffffffff) | (unsigned int)(t1385)) + ((((unsigned long)(t1384) >> 32) & 0xffffffff) | (unsigned int)(t1384)));
/* asm: psllq */
t1031 = (((((unsigned long)(t1030) >> 32) & 0xffffffff) | (unsigned int)(t1030)) + ((((unsigned long)(t1296) >> 32) & 0xffffffff) | (unsigned int)(t1296)));
t1088 = (((((unsigned long)(t1087) >> 32) & 0xffffffff) | (unsigned int)(t1087)) + ((((unsigned long)(t1383) >> 32) & 0xffffffff) | (unsigned int)(t1383)));
*(int *)((var106 + var161 * 4)) = (var274 - (unsigned int)(((unsigned long)(((((unsigned long)(t1031) >> 32) & 0xffffffff) | (unsigned int)(t1031))) >> 16)));
*(int *)((var106 + var161 * 4 + 0x4)) = (var275 - (unsigned int)(((unsigned long)(((((unsigned long)(t1088) >> 32) & 0xffffffff) | (unsigned int)(t1088))) >> 16)));
*(int *)((var106 + var161 * 4 + 0x8)) = (var276 - (unsigned int)(((unsigned long)(((((unsigned long)(t1029) >> 32) & 0xffffffff) | (unsigned int)(t1029))) >> 16)));
*(int *)((var106 + var161 * 4 + 0xc)) = (var277 - (unsigned int)(((unsigned long)(((((unsigned long)(t1086) >> 32) & 0xffffffff) | (unsigned int)(t1086))) >> 16)));
var161 = (var161 + 8);
var159 = (var159 - 2);
var158 = var161;
} while ((var159 != 0));
L_15bb: ;
var26 = (unsigned long)((unsigned int)(arg1));
var25 = (long)arg0;
var9 = *(long *)((&local_80[0] + 32));
if (((unsigned long)((unsigned char)(((unsigned char)(*(long *)((&local_80[0] + 56))) & 1))) != 0)) {
var386 = (var158 + local_100);
var388 = (local_e0 + var386);
var389 = *(int *)((var25 + var388 * 4));
var390 = *(int *)((var25 + var388 * 4 + 0x4));
var391 = *(int *)((var25 + var388 * 4 + 0x8));
var392 = *(int *)((var25 + var388 * 4 + 0xc));
t1299 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var391)));
t1386 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var392)));
t1300 = ((unsigned long)((unsigned int)(var391)) * (unsigned long)((unsigned int)(var153)));
t1387 = ((unsigned long)((unsigned int)(var392)) * (unsigned long)((unsigned int)(var155)));
t1301 = ((unsigned long)((unsigned int)((-(var391 < 0)))) * (unsigned long)((unsigned int)(var143)));
t1388 = ((unsigned long)((unsigned int)((-(var392 < 0)))) * (unsigned long)((unsigned int)(var145)));
t1032 = (((((unsigned long)(t1301) >> 32) & 0xffffffff) | (unsigned int)(t1301)) + ((((unsigned long)(t1300) >> 32) & 0xffffffff) | (unsigned int)(t1300)));
t1089 = (((((unsigned long)(t1388) >> 32) & 0xffffffff) | (unsigned int)(t1388)) + ((((unsigned long)(t1387) >> 32) & 0xffffffff) | (unsigned int)(t1387)));
/* asm: psllq */
t1033 = (((((unsigned long)(t1032) >> 32) & 0xffffffff) | (unsigned int)(t1032)) + ((((unsigned long)(t1299) >> 32) & 0xffffffff) | (unsigned int)(t1299)));
t1090 = (((((unsigned long)(t1089) >> 32) & 0xffffffff) | (unsigned int)(t1089)) + ((((unsigned long)(t1386) >> 32) & 0xffffffff) | (unsigned int)(t1386)));
t1302 = ((unsigned long)((unsigned int)(var143)) * (unsigned long)((unsigned int)(var389)));
t1389 = ((unsigned long)((unsigned int)(var145)) * (unsigned long)((unsigned int)(var390)));
t1303 = ((unsigned long)((unsigned int)(var389)) * (unsigned long)((unsigned int)(var153)));
t1390 = ((unsigned long)((unsigned int)(var390)) * (unsigned long)((unsigned int)(var155)));
t1304 = ((unsigned long)((unsigned int)((-(var389 < 0)))) * (unsigned long)((unsigned int)(var143)));
t1391 = ((unsigned long)((unsigned int)((-(var390 < 0)))) * (unsigned long)((unsigned int)(var145)));
t1034 = (((((unsigned long)(t1304) >> 32) & 0xffffffff) | (unsigned int)(t1304)) + ((((unsigned long)(t1303) >> 32) & 0xffffffff) | (unsigned int)(t1303)));
t1091 = (((((unsigned long)(t1391) >> 32) & 0xffffffff) | (unsigned int)(t1391)) + ((((unsigned long)(t1390) >> 32) & 0xffffffff) | (unsigned int)(t1390)));
/* asm: psllq */
t1035 = (((((unsigned long)(t1034) >> 32) & 0xffffffff) | (unsigned int)(t1034)) + ((((unsigned long)(t1302) >> 32) & 0xffffffff) | (unsigned int)(t1302)));
t1092 = (((((unsigned long)(t1091) >> 32) & 0xffffffff) | (unsigned int)(t1091)) + ((((unsigned long)(t1389) >> 32) & 0xffffffff) | (unsigned int)(t1389)));
var158 = (var386 + var114);
var498 = (*(int *)((var25 + var158 * 4 + 0x4)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1092) >> 32) & 0xffffffff) | (unsigned int)(t1092))) >> 16)));
var499 = (*(int *)((var25 + var158 * 4 + 0x8)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1033) >> 32) & 0xffffffff) | (unsigned int)(t1033))) >> 16)));
var500 = (*(int *)((var25 + var158 * 4 + 0xc)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1090) >> 32) & 0xffffffff) | (unsigned int)(t1090))) >> 16)));
*(int *)((var25 + var158 * 4)) = (*(int *)((var25 + var158 * 4)) - (unsigned int)(((unsigned long)(((((unsigned long)(t1035) >> 32) & 0xffffffff) | (unsigned int)(t1035))) >> 16)));
*(int *)((var25 + var158 * 4 + 0x4)) = var498;
*(int *)((var25 + var158 * 4 + 0x8)) = var499;
*(int *)((var25 + var158 * 4 + 0xc)) = var500;
}
var131 = *(long *)((&local_80[0] + 40));
var112 = var158;
if ((local_f0 == *(long *)((&local_80[0] + 48)))) {
goto L_13d0;
}
L_1680: ;
var112 = var131;
if (((unsigned long)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(stride)) - var131))) & 1))) != 0)) {
var511 = (var114 + var131);
*(int *)((var25 + var511 * 4)) = (*(int *)((var25 + var511 * 4)) - ((unsigned long)(((long)((int)(*(int *)((var25 + ((local_e0 + var131) * 4))))) * var130)) >> 16));
var112 = (var131 + 1);
}
if (((~var131) == local_c0)) {
goto L_13d0;
}
do {
*(int *)((var102 + var112 * 4 - 0x4)) = (*(int *)((var102 + var112 * 4 - 0x4)) - ((unsigned long)(((long)((int)(*(int *)((var23 + var112 * 4)))) * var130)) >> 16));
*(int *)((var102 + var112 * 4)) = (*(int *)((var102 + var112 * 4)) - ((unsigned long)(((long)((int)(*(int *)((var23 + var112 * 4 + 0x4)))) * var130)) >> 16));
var112 = (var112 + 2);
} while ((stride != var112));
goto L_13d0;
L_16f0: ;
if ((((unsigned long)((unsigned int)(var8)) == 0) | ((long)((int)(var8)) < 0))) {
// x86-64 epilogue: restore callee registers
return (unsigned int)(var8);
}
local_b0 = ((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((var8 - 1))) * stride))) + var8);
local_b8 = (0xfffffffe - var8);
local_c8 = (-var8);
var530 = ((var7 - 1) * (unsigned long)((unsigned int)(stride)));
local_c0 = var530;
var531 = (var530 + var7);
local_e0 = (~(unsigned long)((unsigned int)(stride)));
var535 = (((var7 * 4) + 16) + var1);
var537 = 0;
var538 = 0xffffffff;
column = var7;
goto L_1783;
L_1750: ;
var543 = 0;
L_1752: ;
var7 = local_e8;
*(int *)((var1 + var546 * 4)) = var543;
var537 = (unsigned long)((unsigned int)((var537 + 1)));
var538 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(local_f0)) + 1)));
var531 = (var531 + local_e0);
var535 = (var535 - 4);
local_c0 = (local_c0 - (unsigned long)((unsigned int)(stride)));
column = var546;
if ((local_d8 <= 1)) {
// x86-64 epilogue: restore callee registers
return arg1;
}
L_1783: ;
var549 = ((unsigned long)((unsigned int)(column)) - 1);
var551 = (var549 * (unsigned long)((unsigned int)(stride)));
var554 = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var549)) * stride)));
var557 = (long)arg0;
accumulator = (unsigned long)((unsigned int)(arg0[(unsigned long)((unsigned int)((var551 + arg1)))]));
local_f0 = var538;
local_100 = var549;
local_d8 = (unsigned long)((unsigned int)(column));
if ((column < var7)) {
var559 = (unsigned long)((unsigned int)((var537 - 1)));
var563 = ((unsigned int)(((unsigned long)((unsigned int)(local_b8)) * var537)) + (unsigned int)(local_b0));
var569 = var1;
if ((((unsigned long)(7) <= (unsigned long)((unsigned long)((unsigned int)(var559)))) && ((unsigned long)((unsigned long)((unsigned int)(var563))) <= (unsigned long)((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var563)) + var559))))))) {
var572 = (((unsigned long)((unsigned int)(var538)) + 1) & -8);
var573 = (var559 + 1);
var549 = var573;
var557 = (var573 & -8);
column = (column + var557);
var574 = accumulator;
var575 = 0;
var576 = 0;
var577 = 0;
var579 = 0;
var580 = 0;
var581 = 0;
var582 = 0;
var584 = 0;
var585 = (long)arg0;
do {
var586 = (unsigned long)((unsigned int)((var531 + var584)));
var587 = *(int *)((var585 + var586 * 4));
var588 = *(int *)((var585 + var586 * 4 + 0x4));
var589 = *(int *)((var585 + var586 * 4 + 0x8));
var590 = *(int *)((var585 + var586 * 4 + 0xc));
var591 = *(int *)((var585 + var586 * 4 + 0x10));
var592 = *(int *)((var585 + var586 * 4 + 0x14));
var593 = *(int *)((var585 + var586 * 4 + 0x18));
var594 = *(int *)((var585 + var586 * 4 + 0x1c));
var595 = *(int *)((var535 + var584 * 4 - 0x10));
var596 = *(int *)((var535 + var584 * 4 - 0xc));
var597 = *(int *)((var535 + var584 * 4 - 0x8));
var598 = *(int *)((var535 + var584 * 4 - 0x4));
var599 = *(int *)((var535 + var584 * 4));
var600 = *(int *)((var535 + var584 * 4 + 0x4));
var601 = *(int *)((var535 + var584 * 4 + 0x8));
var602 = *(int *)((var535 + var584 * 4 + 0xc));
t1305 = ((unsigned long)((unsigned int)((-(var589 < 0)))) * (unsigned long)((unsigned int)(var597)));
t1392 = ((unsigned long)((unsigned int)((-(var590 < 0)))) * (unsigned long)((unsigned int)(var598)));
t1306 = ((unsigned long)((unsigned int)(var597)) * (unsigned long)((unsigned int)(var589)));
t1393 = ((unsigned long)((unsigned int)(var598)) * (unsigned long)((unsigned int)(var590)));
t1307 = ((unsigned long)((unsigned int)((-(var597 < 0)))) * (unsigned long)((unsigned int)(var589)));
t1394 = ((unsigned long)((unsigned int)((-(var598 < 0)))) * (unsigned long)((unsigned int)(var590)));
t1036 = (((((unsigned long)(t1305) >> 32) & 0xffffffff) | (unsigned int)(t1305)) + ((((unsigned long)(t1307) >> 32) & 0xffffffff) | (unsigned int)(t1307)));
t1093 = (((((unsigned long)(t1392) >> 32) & 0xffffffff) | (unsigned int)(t1392)) + ((((unsigned long)(t1394) >> 32) & 0xffffffff) | (unsigned int)(t1394)));
/* asm: psllq */
t1037 = (((((unsigned long)(t1036) >> 32) & 0xffffffff) | (unsigned int)(t1036)) + ((((unsigned long)(t1306) >> 32) & 0xffffffff) | (unsigned int)(t1306)));
t1094 = (((((unsigned long)(t1093) >> 32) & 0xffffffff) | (unsigned int)(t1093)) + ((((unsigned long)(t1393) >> 32) & 0xffffffff) | (unsigned int)(t1393)));
t1308 = ((unsigned long)((unsigned int)((-(var587 < 0)))) * (unsigned long)((unsigned int)(var595)));
t1395 = ((unsigned long)((unsigned int)((-(var588 < 0)))) * (unsigned long)((unsigned int)(var596)));
t1309 = ((unsigned long)((unsigned int)(var595)) * (unsigned long)((unsigned int)(var587)));
t1396 = ((unsigned long)((unsigned int)(var596)) * (unsigned long)((unsigned int)(var588)));
t1310 = ((unsigned long)((unsigned int)((-(var595 < 0)))) * (unsigned long)((unsigned int)(var587)));
t1397 = ((unsigned long)((unsigned int)((-(var596 < 0)))) * (unsigned long)((unsigned int)(var588)));
t1038 = (((((unsigned long)(t1308) >> 32) & 0xffffffff) | (unsigned int)(t1308)) + ((((unsigned long)(t1310) >> 32) & 0xffffffff) | (unsigned int)(t1310)));
t1095 = (((((unsigned long)(t1395) >> 32) & 0xffffffff) | (unsigned int)(t1395)) + ((((unsigned long)(t1397) >> 32) & 0xffffffff) | (unsigned int)(t1397)));
/* asm: psllq */
t1039 = (((((unsigned long)(t1038) >> 32) & 0xffffffff) | (unsigned int)(t1038)) + ((((unsigned long)(t1309) >> 32) & 0xffffffff) | (unsigned int)(t1309)));
t1096 = (((((unsigned long)(t1095) >> 32) & 0xffffffff) | (unsigned int)(t1095)) + ((((unsigned long)(t1396) >> 32) & 0xffffffff) | (unsigned int)(t1396)));
t1311 = ((unsigned long)((unsigned int)((-(var593 < 0)))) * (unsigned long)((unsigned int)(var601)));
t1398 = ((unsigned long)((unsigned int)((-(var594 < 0)))) * (unsigned long)((unsigned int)(var602)));
t1312 = ((unsigned long)((unsigned int)(var601)) * (unsigned long)((unsigned int)(var593)));
t1399 = ((unsigned long)((unsigned int)(var602)) * (unsigned long)((unsigned int)(var594)));
t1313 = ((unsigned long)((unsigned int)((-(var601 < 0)))) * (unsigned long)((unsigned int)(var593)));
t1400 = ((unsigned long)((unsigned int)((-(var602 < 0)))) * (unsigned long)((unsigned int)(var594)));
t1040 = (((((unsigned long)(t1311) >> 32) & 0xffffffff) | (unsigned int)(t1311)) + ((((unsigned long)(t1313) >> 32) & 0xffffffff) | (unsigned int)(t1313)));
t1097 = (((((unsigned long)(t1398) >> 32) & 0xffffffff) | (unsigned int)(t1398)) + ((((unsigned long)(t1400) >> 32) & 0xffffffff) | (unsigned int)(t1400)));
/* asm: psllq */
t1041 = (((((unsigned long)(t1040) >> 32) & 0xffffffff) | (unsigned int)(t1040)) + ((((unsigned long)(t1312) >> 32) & 0xffffffff) | (unsigned int)(t1312)));
t1098 = (((((unsigned long)(t1097) >> 32) & 0xffffffff) | (unsigned int)(t1097)) + ((((unsigned long)(t1399) >> 32) & 0xffffffff) | (unsigned int)(t1399)));
t1314 = ((unsigned long)((unsigned int)((-(var591 < 0)))) * (unsigned long)((unsigned int)(var599)));
t1401 = ((unsigned long)((unsigned int)((-(var592 < 0)))) * (unsigned long)((unsigned int)(var600)));
t1315 = ((unsigned long)((unsigned int)(var599)) * (unsigned long)((unsigned int)(var591)));
t1402 = ((unsigned long)((unsigned int)(var600)) * (unsigned long)((unsigned int)(var592)));
t1316 = ((unsigned long)((unsigned int)((-(var599 < 0)))) * (unsigned long)((unsigned int)(var591)));
t1403 = ((unsigned long)((unsigned int)((-(var600 < 0)))) * (unsigned long)((unsigned int)(var592)));
t1042 = (((((unsigned long)(t1314) >> 32) & 0xffffffff) | (unsigned int)(t1314)) + ((((unsigned long)(t1316) >> 32) & 0xffffffff) | (unsigned int)(t1316)));
t1099 = (((((unsigned long)(t1401) >> 32) & 0xffffffff) | (unsigned int)(t1401)) + ((((unsigned long)(t1403) >> 32) & 0xffffffff) | (unsigned int)(t1403)));
/* asm: psllq */
t1043 = (((((unsigned long)(t1042) >> 32) & 0xffffffff) | (unsigned int)(t1042)) + ((((unsigned long)(t1315) >> 32) & 0xffffffff) | (unsigned int)(t1315)));
t1100 = (((((unsigned long)(t1099) >> 32) & 0xffffffff) | (unsigned int)(t1099)) + ((((unsigned long)(t1402) >> 32) & 0xffffffff) | (unsigned int)(t1402)));
var574 = (var574 - (unsigned int)(((unsigned long)(((((unsigned long)(t1039) >> 32) & 0xffffffff) | (unsigned int)(t1039))) >> 16)));
var575 = (var575 - (unsigned int)(((unsigned long)(((((unsigned long)(t1096) >> 32) & 0xffffffff) | (unsigned int)(t1096))) >> 16)));
var576 = (var576 - (unsigned int)(((unsigned long)(((((unsigned long)(t1037) >> 32) & 0xffffffff) | (unsigned int)(t1037))) >> 16)));
var577 = (var577 - (unsigned int)(((unsigned long)(((((unsigned long)(t1094) >> 32) & 0xffffffff) | (unsigned int)(t1094))) >> 16)));
var579 = (var579 - (unsigned int)(((unsigned long)(((((unsigned long)(t1043) >> 32) & 0xffffffff) | (unsigned int)(t1043))) >> 16)));
var580 = (var580 - (unsigned int)(((unsigned long)(((((unsigned long)(t1100) >> 32) & 0xffffffff) | (unsigned int)(t1100))) >> 16)));
var581 = (var581 - (unsigned int)(((unsigned long)(((((unsigned long)(t1041) >> 32) & 0xffffffff) | (unsigned int)(t1041))) >> 16)));
var582 = (var582 - (unsigned int)(((unsigned long)(((((unsigned long)(t1098) >> 32) & 0xffffffff) | (unsigned int)(t1098))) >> 16)));
var584 = (var584 + 8);
} while ((var572 != var584));
var869 = ((var581 + var576) + (var579 + var574));
var870 = ((var582 + var577) + (var580 + var575));
ret = ((unsigned long)((unsigned int)(var870)) | (unsigned long)((unsigned int)(var869)));
accumulator = (unsigned long)((unsigned int)((var870 + var869)));
var569 = local_a8;
var881 = (unsigned long)((unsigned int)(accumulator));
var1 = local_a8;
if ((var549 == var557)) {
goto L_1a30;
}
}
var557 = (unsigned long)((unsigned int)(arg1));
if (((unsigned long)((unsigned char)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) - column))) & 1))) != 0)) {
goto L_19aa;
}
var549 = (unsigned long)((unsigned int)(column));
goto L_19cd;
}
var585 = (long)arg0;
var881 = (unsigned long)((unsigned int)(accumulator));
goto L_1a30;
L_19aa: ;
var557 = (long)arg0;
var549 = ((unsigned long)((unsigned int)(column)) + 1);
accumulator = (unsigned long)((unsigned int)((accumulator - ((unsigned long)(((long)((int)(*(int *)((var569 + column * 4)))) * (long)((int)(arg0[(unsigned long)((unsigned int)((var551 + column)))])))) >> 16))));
L_19cd: ;
var894 = local_c8;
var585 = (long)arg0;
var881 = (unsigned long)((unsigned int)(accumulator));
var1 = var569;
if (((unsigned int)((~column)) == (unsigned int)(local_c8))) {
goto L_1a30;
}
var896 = (var549 + 1);
var549 = (var549 + local_c0);
var897 = var896;
do {
accumulator = (unsigned long)((unsigned int)((accumulator - (unsigned long)((unsigned int)((((unsigned long)(((long)((int)(*(int *)((var569 + var897 * 4)))) * (long)((int)(*(int *)((var585 + ((unsigned long)((unsigned int)((var549 + 1))) * 4))))))) >> 16) + ((unsigned long)(((long)((int)(*(int *)((var569 + var897 * 4 - 0x4)))) * (long)((int)(*(int *)((var585 + ((unsigned long)((unsigned int)(var549)) * 4))))))) >> 16)))))));
var911 = (var897 + 2);
var557 = (unsigned long)((unsigned int)((var894 + var911)));
var549 = (var549 + 2);
var897 = var911;
} while (((unsigned long)((unsigned int)(var557)) != 1));
var881 = (unsigned long)((unsigned int)(accumulator));
var1 = var569;
L_1a30: ;
var546 = local_100;
var914 = (long)((int)(*(int *)((var585 + ((unsigned long)((unsigned int)((var554 + local_100))) * 4)))));
if ((var914 == 0)) {
goto L_1750;
}
var916 = ((long)((int)(var881)) << 16);
if ((((unsigned long)((var916 | var914)) >> 32) != 0)) {
var543 = ((long)((((__int128)(long)(((long)(var916) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(var916)) / (long)(var914)));
goto L_1752;
}
var543 = ((unsigned int)(((((unsigned long long)(unsigned int)((unsigned long)((unsigned int)(0))) << 32) | (unsigned int)(var916)) / (unsigned int)(var914))));
goto L_1752;
} clang -O0
1/1gaussian_solve pass 143 lines
// glaurung: gaussian_solve @ 0x1100
int32_t gaussian_solve(int32_t * arg0, int32_t arg1, int32_t * arg2) {
extern int gauss_div_q16(int, int);
extern int gauss_mul_q16(int, int);
int stride;
int pivot;
int best;
int row;
int candidate;
int current;
int candidate_magnitude;
int current_magnitude;
int column;
int swap;
int best_magnitude;
int factor;
int accumulator;
int local_4;
int local_58;
int local_5c;
int var101;
int var113;
int var120;
int var160;
int var176;
if ((arg0 != 0)) {
if ((arg2 != 0)) {
if ((1 <= (long)(arg1))) {
if ((((unsigned long)((unsigned int)(arg1)) == 4) | ((long)(arg1) < 4))) {
goto L_1149;
}
}
}
}
local_4 = -1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
L_1149: ;
stride = ((unsigned int)(arg1) + 1);
pivot = 0;
L_1159: ;
if ((arg1 <= pivot)) {
goto L_137f;
}
best = pivot;
row = ((unsigned int)(pivot) + 1);
L_1174: ;
if ((arg1 <= row)) {
goto L_1219;
}
candidate = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))) + pivot)))];
current = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))) + pivot)))];
if (((long)(candidate) < 0)) {
local_58 = (0 - candidate);
goto L_11cb;
}
local_58 = candidate;
L_11cb: ;
candidate_magnitude = local_58;
if (((long)(current) < 0)) {
local_5c = (0 - current);
goto L_11ee;
}
local_5c = current;
L_11ee: ;
current_magnitude = local_5c;
if (((((unsigned int)(candidate_magnitude) == (unsigned int)(current_magnitude)) | (candidate_magnitude < current_magnitude)) == 0)) {
best = row;
}
goto L_120b;
L_120b: ;
row = ((unsigned int)(row) + 1);
goto L_1174;
L_1219: ;
if (((unsigned int)(best) == (unsigned int)(pivot))) {
goto L_12a1;
}
column = 0;
L_122c: ;
if ((column < stride)) {
swap = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))) + column)))];
arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))) + column)))] = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))) + column)))];
arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))) + column)))] = swap;
column = ((unsigned int)(column) + 1);
goto L_122c;
}
goto L_12a1;
L_12a1: ;
best_magnitude = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))) + pivot)))];
if (((unsigned long)((unsigned int)(best_magnitude)) == 0)) {
local_4 = -2;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
}
row = ((unsigned int)(pivot) + 1);
L_12d7: ;
if ((arg1 <= row)) {
goto L_136c;
}
var101 = gauss_div_q16((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))) + pivot)))])), (unsigned long)((unsigned int)(best_magnitude)));
factor = var101;
column = pivot;
L_1308: ;
if ((column < stride)) {
var113 = gauss_mul_q16((unsigned long)((unsigned int)(factor)), (unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))) + column)))])));
var120 = ((unsigned int)(((unsigned long)((unsigned int)(row)) * stride)) + column);
arg0[(long)((int)(var120))] = ((unsigned long)((unsigned int)(arg0[(long)((int)(var120))])) - (unsigned long)((unsigned int)(var113)));
column = ((unsigned int)(column) + 1);
goto L_1308;
}
goto L_135e;
L_135e: ;
row = ((unsigned int)(row) + 1);
goto L_12d7;
L_136c: ;
goto L_1371;
L_1371: ;
pivot = ((unsigned int)(pivot) + 1);
goto L_1159;
L_137f: ;
row = ((unsigned int)(arg1) - 1);
L_1388: ;
if (((long)(row) < 0)) {
goto L_1431;
}
accumulator = arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))) + arg1)))];
column = ((unsigned int)(row) + 1);
L_13b2: ;
if ((column < arg1)) {
var160 = gauss_mul_q16((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))) + column)))])), (unsigned long)((unsigned int)(arg2[(long)(column)])));
accumulator = ((unsigned int)(accumulator) - (unsigned int)(var160));
column = ((unsigned int)(column) + 1);
goto L_13b2;
}
var176 = gauss_div_q16((unsigned long)((unsigned int)(accumulator)), (unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))) + row)))])));
arg2[(long)(row)] = var176;
row = ((unsigned int)(row) - 1);
goto L_1388;
L_1431: ;
local_4 = arg1;
// x86-64 epilogue: restore rbp
return (unsigned int)(local_4);
} gcc -O0
1/1gaussian_solve pass 128 lines
// glaurung: gaussian_solve @ 0x114d
int32_t gaussian_solve(int32_t * arg0, int32_t arg1, int32_t * arg2) {
extern int gauss_div_q16(int, int);
extern int gauss_mul_q16(int, int);
int stride;
int pivot;
int best;
int row;
int candidate;
int current;
int candidate_magnitude;
int current_magnitude;
int column;
int swap;
int best_magnitude;
int factor;
int accumulator;
long t151;
long t153;
int var124;
int var141;
int var208;
long var227;
int var229;
if ((arg0 != 0)) {
if ((arg2 != 0)) {
if (((((unsigned long)((unsigned int)(arg1)) == 0) | ((long)(arg1) < 0)) == 0)) {
if ((((unsigned long)((unsigned int)(arg1)) == 4) | ((long)(arg1) < 4))) {
goto L_1189;
}
}
}
}
// x86-64 epilogue: restore rbp
return 0xffffffff;
L_1189: ;
stride = ((unsigned int)(arg1) + 1);
pivot = 0;
goto L_13eb;
L_119e: ;
best = pivot;
row = ((unsigned int)(pivot) + 1);
goto L_1223;
L_11af: ;
candidate = arg0[(long)((int)(((unsigned long)((unsigned int)(pivot)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))];
current = arg0[(long)((int)(((unsigned long)((unsigned int)(pivot)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))))))];
t151 = (-(unsigned long)((unsigned int)(candidate)));
candidate_magnitude = ((0 <= (long)((int)(t151))) ? t151 : (unsigned long)((unsigned int)(candidate)));
t153 = (-(unsigned long)((unsigned int)(current)));
current_magnitude = ((0 <= (long)((int)(t153))) ? t153 : (unsigned long)((unsigned int)(current)));
if (((((unsigned int)(candidate_magnitude) == (unsigned int)(current_magnitude)) | (candidate_magnitude < current_magnitude)) == 0)) {
best = row;
}
row = (row + 1);
L_1223: ;
if ((row < arg1)) {
goto L_11af;
}
if (((unsigned int)(best) == (unsigned int)(pivot))) {
goto L_12de;
}
column = 0;
goto L_12d2;
L_1243: ;
swap = arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))))))];
arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))))))] = arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))))))];
arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(best)) * stride))))))] = swap;
column = (column + 1);
L_12d2: ;
if ((column < stride)) {
goto L_1243;
}
L_12de: ;
best_magnitude = arg0[(long)((int)(((unsigned long)((unsigned int)(pivot)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))))))];
if (((unsigned long)((unsigned int)(best_magnitude)) == 0)) {
// x86-64 epilogue: restore rbp
return 0xfffffffe;
}
row = ((unsigned int)(pivot) + 1);
goto L_13db;
L_1320: ;
var124 = gauss_div_q16((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(pivot)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))])), (unsigned long)((unsigned int)(best_magnitude)));
factor = var124;
column = pivot;
goto L_13cf;
L_1358: ;
var141 = gauss_mul_q16((unsigned long)((unsigned int)(factor)), (unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(pivot)) * stride))))))])));
arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))] = ((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))])) - (unsigned long)((unsigned int)(var141)));
column = (column + 1);
L_13cf: ;
if ((column < stride)) {
goto L_1358;
}
row = (row + 1);
L_13db: ;
if ((row < arg1)) {
goto L_1320;
}
pivot = (pivot + 1);
L_13eb: ;
if ((pivot < arg1)) {
goto L_119e;
}
row = ((unsigned int)(arg1) - 1);
goto L_14cb;
L_1405: ;
accumulator = arg0[(long)((int)(((unsigned long)((unsigned int)(arg1)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))];
column = ((unsigned int)(row) + 1);
goto L_147b;
L_1434: ;
var208 = gauss_mul_q16((unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(column)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))])), (unsigned long)((unsigned int)(arg2[(long)(column)])));
accumulator = (accumulator - var208);
column = (column + 1);
L_147b: ;
if ((column < arg1)) {
goto L_1434;
}
var227 = (long)((((long)(row) * 4) + (long)arg2));
var229 = gauss_div_q16((unsigned long)((unsigned int)(accumulator)), (unsigned long)((unsigned int)(arg0[(long)((int)(((unsigned long)((unsigned int)(row)) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(row)) * stride))))))])));
*(int *)((var227)) = var229;
row = (row - 1);
L_14cb: ;
if ((0 <= (long)(row))) {
goto L_1405;
}
// x86-64 epilogue: restore rbp
return (unsigned int)(arg1);
} gcc -O2
1/1gaussian_solve pass 233 lines
// glaurung: gaussian_solve @ 0x1100
int32_t gaussian_solve(int32_t * arg0, int32_t arg1, int32_t * arg2) {
int stride;
int pivot;
int row;
int best;
int swap;
int column;
int accumulator;
int factor;
long local_10;
long local_18;
long local_20;
long local_30;
int local_34;
long local_48;
long local_50;
long local_58;
long local_60;
long local_68;
long local_70;
int local_74;
long local_8;
long local_80;
long ret;
long t153;
long t155;
long var0;
long var1;
long var10;
long var100;
long var102;
long var108;
long var109;
long var110;
long var111;
long var114;
long var115;
long var119;
long var123;
int var126;
long var13;
long var2;
long var20;
long var21;
long var28;
long var3;
long var30;
long var31;
long var32;
int var35;
long var4;
long var42;
int var45;
int var47;
long var5;
long var50;
long var56;
long var58;
long var6;
long var60;
long var61;
long var62;
long var63;
long var65;
long var67;
long var68;
long var69;
int var74;
long var85;
long var86;
long var87;
long var9;
long var93;
long var95;
long var99;
local_8 = var0;
local_10 = var1;
local_18 = var2;
local_20 = var3;
local_30 = var4;
if ((arg0 == 0)) {
goto L_1393;
}
if ((arg2 == 0)) {
goto L_1393;
}
var5 = (unsigned long)((unsigned int)((arg1 - 1)));
var6 = (unsigned long)((unsigned int)(arg1));
local_34 = var5;
if (((unsigned long)(3) < (unsigned long)((unsigned long)((unsigned int)(var5))))) {
goto L_1393;
}
stride = (unsigned long)((unsigned int)((arg1 + 1)));
local_58 = var5;
var9 = (long)arg0;
var10 = (long)(stride);
local_74 = 0;
var13 = ((long)(stride) * 4);
local_80 = stride;
local_50 = ((long)(stride) + 1);
local_60 = (long)(((long)arg0 - var13));
local_48 = (unsigned int)(arg1);
local_70 = 0;
local_68 = (long)((arg0 + 1));
pivot = 0;
L_1190: ;
row = (unsigned long)((unsigned int)((pivot + 1)));
var20 = (unsigned long)((unsigned int)(pivot));
var21 = (unsigned long)((unsigned int)(pivot));
if ((((unsigned int)(var6) == (unsigned int)(row)) | ((long)((int)(var6)) < (long)(row)))) {
goto L_11f9;
}
var28 = (var9 + (((long)((int)(((unsigned long)((unsigned int)(local_74)) + stride))) + (unsigned long)((unsigned int)(pivot))) * 4));
var30 = (unsigned long)((unsigned int)(row));
var31 = (unsigned long)((unsigned int)(pivot));
do {
var32 = (unsigned long)((unsigned int)(*(int *)((var28))));
t153 = (-(unsigned long)((unsigned int)(var32)));
var35 = (((long)((int)(t153)) < 0) ? var32 : t153);
var42 = (unsigned long)((unsigned int)(*(int *)((var9 + ((long)((int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(stride)) * var31))) + var21))) * 4)))));
t155 = (-(unsigned long)((unsigned int)(var42)));
var45 = (((long)((int)(t155)) < 0) ? var42 : t155);
best = (((((unsigned int)(var35) == (unsigned int)(var45)) | (var35 < var45)) == 0) ? var30 : var31);
var47 = (var30 + 1);
var30 = (unsigned long)((unsigned int)(var47));
var28 = (var28 + var13);
var31 = (unsigned long)((unsigned int)(best));
} while (((unsigned int)(var6) != (unsigned int)(var47)));
if (((unsigned int)(best) != (unsigned int)(pivot))) {
goto L_12ab;
}
L_11f9: ;
var50 = (long)((int)(*(int *)((local_60 + local_80 * 4))));
if (((unsigned long)((unsigned int)(var50)) == 0)) {
goto L_1383;
}
if ((pivot == local_58)) {
goto L_12e7;
}
local_70 = (local_70 + var10);
local_74 = (local_74 + stride);
var56 = (-var10);
var58 = (var9 + (local_80 * 4));
var60 = (local_68 + (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var6)) - var20))) + local_80) * 4));
L_1248: ;
var61 = (long)((int)(*(int *)((var58))));
var62 = var61;
var63 = (var61 << 16);
var65 = ((long)((((__int128)(long)(((long)(var63) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(var63)) / (long)(var50)));
if ((((unsigned int)(stride) == (unsigned int)(pivot)) | (stride < pivot))) {
goto L_1286;
}
var67 = (long)((int)(var65));
var68 = var58;
goto L_126b;
L_1268: ;
var62 = (unsigned long)((unsigned int)(*(int *)((var68))));
L_126b: ;
var69 = (long)((int)(*(int *)((var68 + var56 * 4))));
var68 = (var68 + 4);
*(int *)((var68 - 0x4)) = (var62 - ((long)((var69 * var67)) >> 16));
if ((var60 != var68)) {
goto L_1268;
}
L_1286: ;
var74 = (row + 1);
row = (unsigned long)((unsigned int)(var74));
var58 = (var58 + var13);
var56 = (var56 - var10);
var60 = (var60 + var13);
if (((unsigned int)(var6) != (unsigned int)(var74))) {
goto L_1248;
}
local_80 = (local_80 + local_50);
pivot = (pivot + 1);
goto L_1190;
L_12ab: ;
var85 = (local_68 + ((local_48 + local_70) * 4));
var86 = ((long)((int)((best * stride))) - local_70);
var87 = (var9 + (local_70 * 4));
do {
swap = (unsigned long)((unsigned int)(*(int *)((var87))));
*(int *)((var87)) = *(int *)((var87 + var86 * 4));
*(int *)((var87 + var86 * 4)) = swap;
var87 = (var87 + 4);
} while ((var87 != var85));
goto L_11f9;
L_12e7: ;
var93 = (long)arg2;
var95 = (long)((int)(var6));
var99 = (long)((((long)arg2 + var13) - 8));
var100 = ((long)((int)((~(unsigned long)((unsigned int)(stride))))) << 2);
var102 = (var9 + ((long)((int)(((unsigned long)((unsigned int)((var6 + 2))) * (unsigned long)((unsigned int)(local_34))))) * 4));
var108 = (var9 + ((long)((int)(((unsigned long)((unsigned int)(local_34)) * stride))) * 4));
var109 = (unsigned long)((unsigned int)(arg1));
do {
var110 = (unsigned long)((unsigned int)(*(int *)((var108 + var95 * 4))));
var111 = var110;
if (((((unsigned int)(var6) == (unsigned int)(var109)) | ((long)((int)(var6)) < (long)((int)(var109)))) == 0)) {
column = (long)((int)(var109));
accumulator = var110;
do {
var114 = (long)((int)(*(int *)((var108 + column * 4))));
var115 = (long)((int)(*(int *)((var93 + column * 4))));
column = (column + 1);
accumulator = (unsigned long)((unsigned int)((accumulator - ((long)((var114 * var115)) >> 16))));
var111 = (unsigned long)((unsigned int)(accumulator));
} while (((((unsigned int)(var6) == (unsigned int)(column)) | ((long)((int)(var6)) < (long)(column))) == 0));
}
var119 = (unsigned long)((unsigned int)(*(int *)((var102))));
if (((unsigned long)((unsigned int)(var119)) != 0)) {
var123 = ((long)((int)(var111)) << 16);
var119 = ((long)((((__int128)(long)(((long)(var123) >> 63)) * (((__int128)1) << 64)) + (unsigned long)(var123)) / (long)((long)((int)(var119)))));
}
*(int *)((var99)) = var119;
var102 = (var102 + var100);
var99 = (var99 - 4);
var108 = (var108 - var13);
var126 = (var109 - 1);
var109 = (unsigned long)((unsigned int)(var126));
} while (((unsigned long)((unsigned int)(var126)) != 0));
ret = (unsigned long)((unsigned int)(var6));
L_1378: ;
// x86-64 epilogue: tear down frame
return ret;
L_1383: ;
// x86-64 epilogue: tear down frame
return 0xfffffffe;
L_1393: ;
ret = 0xffffffff;
goto L_1378;
}