int simq(A, B, X, n, flag, IPS)
double A[], B[], X[];
int n, flag;
int IPS[];
{
  int i, j, ij, ip, ipj, ipk, ipn;
  int idxpiv, iback;
  int k, kp, kp1, kpj, kpk, kpn;
  int nip, nkp, nm1;
  double em, q, rownrm, big, size, pivot, sum;
  double fabs();
  if (flag < 0)
    goto solve;
  ij = 0;
  for (i = 0; i < n; i++) {
    IPS[i] = i;
    rownrm = 0.0;
    for (j = 0; j < n; j++) {
      q = fabs(A[ij]);
      if (rownrm < q)
        rownrm = q;
      ++ij;
    }
    if (rownrm == 0.0) {
      puts("SIMQ ROWNRM=0");
      return (1);
    }
    X[i] = 1.0 / rownrm;
  }
  nm1 = n - 1;
  for (k = 0; k < nm1; k++) {
    big = 0.0;
    for (i = k; i < n; i++) {
      ip = IPS[i];
      ipk = n * ip + k;
      size = fabs(A[ipk]) * X[ip];
      if (size > big) {
        big = size;
        idxpiv = i;
      }
    }
    if (big == 0.0) {
      puts("SIMQ BIG=0");
      return (2);
    }
    if (idxpiv != k) {
      j = IPS[k];
      IPS[k] = IPS[idxpiv];
      IPS[idxpiv] = j;
    }
    kp = IPS[k];
    kpk = n * kp + k;
    pivot = A[kpk];
    kp1 = k + 1;
    for (i = kp1; i < n; i++) {
      ip = IPS[i];
      ipk = n * ip + k;
      em = -A[ipk] / pivot;
      A[ipk] = -em;
      nip = n * ip;
      nkp = n * kp;
      for (j = kp1; j < n; j++) {
        ipj = nip + j;
        A[ipj] = A[ipj] + em * A[nkp + j];
      }
    }
  }
  kpn = n * IPS[n - 1] + n - 1;
  if (A[kpn] == 0.0) {
    puts("SIMQ A[kpn]=0");
    return (3);
  }
solve:
  ip = IPS[0];
  X[0] = B[ip];
  for (i = 1; i < n; i++) {
    ip = IPS[i];
    ipj = n * ip;
    sum = 0.0;
    for (j = 0; j < i; j++) {
      sum += A[ipj] * X[j];
      ++ipj;
    }
    X[i] = B[ip] - sum;
  }
  ipn = n * IPS[n - 1] + n - 1;
  X[n - 1] = X[n - 1] / A[ipn];
  for (iback = 1; iback < n; iback++) {
    i = nm1 - iback;
    ip = IPS[i];
    nip = n * ip;
    sum = 0.0;
    for (j = i + 1; j < n; j++)
      sum += A[nip + j] * X[j];
    X[i] = (X[i] - sum) / A[nip + i];
  }
  return (0);
}


x86 assembly (clang, -O0):
<simq>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    %r8d,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
cmpl   $0x0,-0x28(%rbp)
jge    1141 <simq+0x31>
jmp    1533 <simq+0x423>
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1248 <simq+0x138>
mov    -0x34(%rbp),%edx
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    11e8 <simq+0xd8>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movaps 0xe65(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x90(%rbp),%xmm1
ff
movsd  -0x88(%rbp),%xmm0
ff
ucomisd %xmm1,%xmm0
jbe    11d1 <simq+0xc1>
movsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    117b <simq+0x6b>
movsd  -0x90(%rbp),%xmm0
ff
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    121d <simq+0x10d>
jp     121d <simq+0x10d>
lea    0xe0e(%rip),%rdi
mov    $0x0,%al
call   1030 <puts@plt>
movl   $0x1,-0x4(%rbp)
jmp    1743 <simq+0x633>
movsd  0xdeb(%rip),%xmm0
divsd  -0x90(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    114f <simq+0x3f>
mov    -0x24(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x78(%rbp)
movl   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x78(%rbp),%eax
jge    14d7 <simq+0x3c7>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x58(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1308 <simq+0x1f8>
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x40(%rbp)
mov    -0x24(%rbp),%eax
imul   -0x40(%rbp),%eax
add    -0x58(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movaps 0xd50(%rip),%xmm1
pand   %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movslq -0x40(%rbp),%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movsd  -0xa0(%rbp),%xmm0
ff
ucomisd -0x98(%rbp),%xmm0
ff
jbe    12f5 <simq+0x1e5>
movsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x34(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    12fa <simq+0x1ea>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1275 <simq+0x165>
movsd  -0x98(%rbp),%xmm0
ff
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    133d <simq+0x22d>
jp     133d <simq+0x22d>
lea    0xcfc(%rip),%rdi
mov    $0x0,%al
call   1030 <puts@plt>
movl   $0x2,-0x4(%rbp)
jmp    1743 <simq+0x633>
mov    -0x50(%rbp),%eax
cmp    -0x58(%rbp),%eax
je     137b <simq+0x26b>
mov    -0x30(%rbp),%rax
movslq -0x58(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x50(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x30(%rbp),%rax
movslq -0x58(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x38(%rbp),%edx
mov    -0x30(%rbp),%rax
movslq -0x50(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x30(%rbp),%rax
movslq -0x58(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x5c(%rbp)
mov    -0x24(%rbp),%eax
imul   -0x5c(%rbp),%eax
add    -0x58(%rbp),%eax
mov    %eax,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x68(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x60(%rbp)
mov    -0x60(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    14c4 <simq+0x3b4>
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x40(%rbp)
mov    -0x24(%rbp),%eax
imul   -0x40(%rbp),%eax
add    -0x58(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
divsd  -0xa8(%rbp),%xmm0
ff
movsd  %xmm0,-0x80(%rbp)
movsd  -0x80(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
imul   -0x40(%rbp),%eax
mov    %eax,-0x70(%rbp)
mov    -0x24(%rbp),%eax
imul   -0x5c(%rbp),%eax
mov    %eax,-0x74(%rbp)
mov    -0x60(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    14b1 <simq+0x3a1>
mov    -0x70(%rbp),%eax
add    -0x38(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x80(%rbp),%xmm0
mov    -0x10(%rbp),%rax
mov    -0x74(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1455 <simq+0x345>
jmp    14b6 <simq+0x3a6>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    13ba <simq+0x2aa>
jmp    14c9 <simq+0x3b9>
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    1258 <simq+0x148>
mov    -0x24(%rbp),%eax
mov    -0x30(%rbp),%rcx
mov    -0x24(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
imul   (%rcx,%rdx,4),%eax
add    -0x24(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    152e <simq+0x41e>
jp     152e <simq+0x41e>
lea    0xb16(%rip),%rdi
mov    $0x0,%al
call   1030 <puts@plt>
movl   $0x3,-0x4(%rbp)
jmp    1743 <simq+0x633>
jmp    1533 <simq+0x423>
mov    -0x30(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x40(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movsd  %xmm0,(%rax)
movl   $0x1,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1613 <simq+0x503>
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x40(%rbp)
mov    -0x24(%rbp),%eax
imul   -0x40(%rbp),%eax
mov    %eax,-0x44(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x34(%rbp),%eax
jge    15e3 <simq+0x4d3>
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0xb0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    158e <simq+0x47e>
mov    -0x18(%rbp),%rax
movslq -0x40(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0xb0(%rbp),%xmm0
ff
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1558 <simq+0x448>
mov    -0x24(%rbp),%eax
mov    -0x30(%rbp),%rcx
mov    -0x24(%rbp),%edx
sub    $0x1,%edx
movslq %edx,%rdx
imul   (%rcx,%rdx,4),%eax
add    -0x24(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
divsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsd  %xmm0,(%rax,%rcx,8)
movl   $0x1,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    173c <simq+0x62c>
mov    -0x78(%rbp),%eax
sub    -0x54(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x34(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x40(%rbp)
mov    -0x24(%rbp),%eax
imul   -0x40(%rbp),%eax
mov    %eax,-0x70(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    16fa <simq+0x5ea>
mov    -0x10(%rbp),%rax
mov    -0x70(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
movsd  -0xb0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    16a9 <simq+0x599>
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
subsd  -0xb0(%rbp),%xmm0
ff
mov    -0x10(%rbp),%rax
mov    -0x70(%rbp),%ecx
add    -0x34(%rbp),%ecx
movslq %ecx,%rcx
divsd  (%rax,%rcx,8),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x34(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1668 <simq+0x558>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<simq>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x88,%rsp
mov    %rsi,0x30(%rsp)
movslq %ecx,%rax
mov    %rax,0x18(%rsp)
test   %r8d,%r8d
js     1517 <simq+0x407>
lea    -0x1(%rcx),%eax
mov    %eax,0x4(%rsp)
test   %ecx,%ecx
jle    1519 <simq+0x409>
mov    0x4(%rsp),%r11d
mov    %r11d,%eax
mov    %rax,0x40(%rsp)
lea    0x1(%rax),%r10
mov    %ecx,%r14d
mov    %ecx,%r8d
and    $0xfffffffe,%r8d
xor    %esi,%esi
lea    0xebe(%rip),%r15
xorpd  %xmm1,%xmm1
movsd  0xeaa(%rip),%xmm2
movapd 0xe81(%rip),%xmm9
movapd 0xe79(%rip),%xmm3
xor    %ebp,%ebp
nopl   0x0(%rax)
mov    %esi,(%r9,%rsi,4)
movslq %ebp,%rbp
mov    %rbp,%rax
xorpd  %xmm4,%xmm4
test   %r11d,%r11d
je     11d8 <simq+0xc8>
xorpd  %xmm5,%xmm5
mov    %r8d,%ebx
mov    %rbp,%rax
nopl   (%rax)
movsd  (%rdi,%rax,8),%xmm6
movsd  0x8(%rdi,%rax,8),%xmm4
andpd  %xmm3,%xmm6
maxsd  %xmm5,%xmm6
andpd  %xmm3,%xmm4
maxsd  %xmm6,%xmm4
add    $0x2,%rax
movapd %xmm4,%xmm5
add    $0xfffffffe,%ebx
jne    11b0 <simq+0xa0>
test   $0x1,%cl
je     11ef <simq+0xdf>
movsd  (%rdi,%rax,8),%xmm5
andpd  %xmm9,%xmm5
maxsd  %xmm4,%xmm5
movapd %xmm5,%xmm4
ucomisd %xmm1,%xmm4
jne    11fb <simq+0xeb>
jnp    172a <simq+0x61a>
add    %r10,%rbp
movapd %xmm2,%xmm5
divsd  %xmm4,%xmm5
movsd  %xmm5,(%rdx,%rsi,8)
add    $0x1,%rsi
cmp    %r14,%rsi
jne    1190 <simq+0x80>
cmp    $0x2,%ecx
jl     1519 <simq+0x409>
mov    %r14,%rax
neg    %rax
mov    %rax,0x80(%rsp)
lea    -0x1(%r14),%r8
lea    0x18(%rdi),%rax
mov    %rax,0x8(%rsp)
lea    0x8(%rdi),%rax
mov    %rax,0x28(%rsp)
mov    $0x1,%r12d
xor    %r15d,%r15d
xorpd  %xmm8,%xmm8
movapd 0xdb5(%rip),%xmm2
mov    %rcx,0x38(%rsp)
jmp    1298 <simq+0x188>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x1,%r12
mov    0x50(%rsp),%r8
add    $0xffffffffffffffff,%r8
addq   $0x8,0x8(%rsp)
mov    0x48(%rsp),%r15
cmp    0x40(%rsp),%r15
mov    0x38(%rsp),%rcx
je     1519 <simq+0x409>
mov    $0x2,%r13d
cmp    %r14,%r15
je     1732 <simq+0x622>
mov    %r8,%rsi
and    $0xfffffffffffffffc,%rsi
mov    %r15,%rax
not    %rax
add    %r14,%rax
mov    %rax,0x10(%rsp)
lea    (%rdi,%rax,8),%rax
mov    %rax,0x20(%rsp)
xorpd  %xmm3,%xmm3
mov    %r15,%rax
nopl   0x0(%rax)
movapd %xmm3,%xmm4
movslq (%r9,%rax,4),%rbp
mov    %ebp,%ebx
imul   %ecx,%ebx
add    %r15d,%ebx
movslq %ebx,%rbx
movsd  (%rdi,%rbx,8),%xmm3
andpd  %xmm9,%xmm3
mulsd  (%rdx,%rbp,8),%xmm3
ucomisd %xmm4,%xmm3
cmova  %eax,%r10d
maxsd  %xmm4,%xmm3
add    $0x1,%rax
cmp    %rax,%r14
jne    12d0 <simq+0x1c0>
ucomisd %xmm8,%xmm3
jne    1314 <simq+0x204>
jnp    1732 <simq+0x622>
mov    %r8,0x50(%rsp)
mov    %r10d,%eax
cmp    %rax,%r15
je     1334 <simq+0x224>
mov    (%r9,%r15,4),%eax
movslq %r10d,%rcx
mov    (%r9,%rcx,4),%ebx
mov    %ebx,(%r9,%r15,4)
mov    %eax,(%r9,%rcx,4)
lea    0x1(%r15),%rax
mov    %rax,0x48(%rsp)
cmp    %r14,%rax
jae    1270 <simq+0x160>
movslq (%r9,%r15,4),%rbp
imul   0x18(%rsp),%rbp
lea    (%r15,%rbp,1),%eax
cltq
movsd  (%rdi,%rax,8),%xmm3
lea    (%r12,%rbp,1),%rax
lea    (%rdi,%rax,8),%rcx
mov    %rcx,0x68(%rsp)
mov    0x20(%rsp),%rcx
lea    (%rcx,%rax,8),%rax
mov    %rax,0x78(%rsp)
mov    0x10(%rsp),%rax
and    $0xfffffffffffffffc,%rax
mov    %rax,0x60(%rsp)
add    %r12,%rax
mov    %rax,0x58(%rsp)
mov    0x8(%rsp),%rax
lea    (%rax,%rbp,8),%r11
mov    0x28(%rsp),%rax
mov    %rbp,0x70(%rsp)
lea    (%rax,%rbp,8),%rax
mov    %r12,%r8
jmp    13bd <simq+0x2ad>
nopl   0x0(%rax,%rax,1)
add    $0x1,%r8
cmp    %r14,%r8
je     1270 <simq+0x160>
movslq (%r9,%r8,4),%r13
imul   0x18(%rsp),%r13
lea    (%r15,%r13,1),%ecx
movslq %ecx,%rcx
movsd  (%rdi,%rcx,8),%xmm4
xorpd  %xmm2,%xmm4
divsd  %xmm3,%xmm4
movapd %xmm4,%xmm5
xorpd  %xmm2,%xmm5
movlpd %xmm5,(%rdi,%rcx,8)
mov    %r12,%rcx
cmpq   $0x4,0x10(%rsp)
jb     1490 <simq+0x380>
lea    (%r12,%r13,1),%rcx
lea    (%rdi,%rcx,8),%rbx
cmp    0x78(%rsp),%rbx
jae    1419 <simq+0x309>
mov    0x20(%rsp),%rbx
lea    (%rbx,%rcx,8),%rbx
mov    %r12,%rcx
cmp    %rbx,0x68(%rsp)
jb     1490 <simq+0x380>
movapd %xmm4,%xmm5
unpcklpd %xmm4,%xmm5
mov    0x8(%rsp),%rcx
lea    (%rcx,%r13,8),%rcx
xor    %ebx,%ebx
nopl   0x0(%rax)
movupd -0x10(%rcx,%rbx,8),%xmm6
movupd (%rcx,%rbx,8),%xmm7
movupd -0x10(%r11,%rbx,8),%xmm1
movupd (%r11,%rbx,8),%xmm0
mulpd  %xmm5,%xmm1
addpd  %xmm6,%xmm1
mulpd  %xmm5,%xmm0
addpd  %xmm7,%xmm0
movupd %xmm1,-0x10(%rcx,%rbx,8)
movupd %xmm0,(%rcx,%rbx,8)
add    $0x4,%rbx
cmp    %rbx,%rsi
jne    1430 <simq+0x320>
mov    0x58(%rsp),%rcx
mov    0x60(%rsp),%rbx
cmp    %rbx,0x10(%rsp)
je     13b0 <simq+0x2a0>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    %r14d,%ebp
sub    %ecx,%ebp
mov    %rcx,%rbx
test   $0x1,%bpl
je     14c1 <simq+0x3b1>
lea    (%rcx,%r13,1),%rbx
mov    0x70(%rsp),%rbp
add    %rcx,%rbp
movsd  (%rdi,%rbp,8),%xmm0
mulsd  %xmm4,%xmm0
addsd  (%rdi,%rbx,8),%xmm0
movsd  %xmm0,(%rdi,%rbx,8)
lea    0x1(%rcx),%rbx
not    %rcx
cmp    0x80(%rsp),%rcx
je     13b0 <simq+0x2a0>
mov    0x28(%rsp),%rcx
lea    (%rcx,%r13,8),%rcx
nopl   0x0(%rax,%rax,1)
movsd  -0x8(%rax,%rbx,8),%xmm0
mulsd  %xmm4,%xmm0
addsd  -0x8(%rcx,%rbx,8),%xmm0
movsd  %xmm0,-0x8(%rcx,%rbx,8)
movsd  (%rax,%rbx,8),%xmm0
mulsd  %xmm4,%xmm0
addsd  (%rcx,%rbx,8),%xmm0
movsd  %xmm0,(%rcx,%rbx,8)
add    $0x2,%rbx
cmp    %rbx,%r14
jne    14e0 <simq+0x3d0>
jmp    13b0 <simq+0x2a0>
jmp    1550 <simq+0x440>
mov    0x4(%rsp),%r12d
movslq %r12d,%rax
mov    (%r9,%rax,4),%eax
imul   %ecx,%eax
add    %r12d,%eax
cltq
movsd  (%rdi,%rax,8),%xmm0
xorpd  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1550 <simq+0x440>
jp     1550 <simq+0x440>
mov    $0x3,%r13d
lea    0xaf6(%rip),%r15
jmp    1739 <simq+0x629>
movslq (%r9),%rax
mov    0x30(%rsp),%rsi
movsd  (%rsi,%rax,8),%xmm0
movsd  %xmm0,(%rdx)
cmp    $0x2,%ecx
jl     167d <simq+0x56d>
mov    %ecx,%r10d
lea    0x18(%rdi),%r8
mov    $0x1,%r13d
xor    %r15d,%r15d
jmp    15a6 <simq+0x496>
nopl   0x0(%rax)
mov    0x30(%rsp),%rax
movsd  (%rax,%r11,8),%xmm1
subsd  %xmm0,%xmm1
movsd  %xmm1,(%rdx,%r13,8)
add    $0x1,%r13
add    $0x1,%r15
cmp    %r10,%r13
je     167d <simq+0x56d>
movslq (%r9,%r13,4),%r11
mov    %r11d,%eax
imul   %ecx,%eax
movslq %eax,%r14
cmp    $0x3,%r15
jae    15d0 <simq+0x4c0>
xorpd  %xmm0,%xmm0
xor    %esi,%esi
test   $0x3,%r13b
jne    1644 <simq+0x534>
jmp    1580 <simq+0x470>
nopw   0x0(%rax,%rax,1)
mov    %r13,%rbp
and    $0xfffffffffffffffc,%rbp
lea    (%r8,%r14,8),%rbx
xorpd  %xmm0,%xmm0
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  -0x18(%rbx,%rsi,8),%xmm1
movsd  -0x10(%rbx,%rsi,8),%xmm2
mulsd  (%rdx,%rsi,8),%xmm1
mulsd  0x8(%rdx,%rsi,8),%xmm2
addsd  %xmm0,%xmm1
movsd  -0x8(%rbx,%rsi,8),%xmm3
mulsd  0x10(%rdx,%rsi,8),%xmm3
addsd  %xmm1,%xmm2
movsd  (%rbx,%rsi,8),%xmm0
mulsd  0x18(%rdx,%rsi,8),%xmm0
addsd  %xmm2,%xmm3
addsd  %xmm3,%xmm0
add    $0x4,%rsi
cmp    %rsi,%rbp
jne    15f0 <simq+0x4e0>
add    %rsi,%r14
test   $0x3,%r13b
je     1580 <simq+0x470>
mov    %r13d,%ebx
and    $0x3,%ebx
lea    (%rdi,%r14,8),%rbp
lea    (%rdx,%rsi,8),%rax
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movsd  0x0(%rbp,%rsi,8),%xmm1
mulsd  (%rax,%rsi,8),%xmm1
addsd  %xmm1,%xmm0
add    $0x1,%rsi
cmp    %rsi,%rbx
jne    1660 <simq+0x550>
jmp    1580 <simq+0x470>
lea    -0x1(%rcx),%eax
cltq
mov    (%r9,%rax,4),%esi
imul   %ecx,%esi
xor    %r13d,%r13d
add    %ecx,%esi
add    $0xffffffff,%esi
movsd  (%rdx,%rax,8),%xmm0
movslq %esi,%rsi
divsd  (%rdi,%rsi,8),%xmm0
movsd  %xmm0,(%rdx,%rax,8)
cmp    $0x2,%ecx
jl     1743 <simq+0x633>
mov    %ecx,%eax
movslq %r12d,%r8
mov    $0x1,%r10d
jmp    16e7 <simq+0x5d7>
nopl   0x0(%rax)
xorpd  %xmm0,%xmm0
movsd  (%rdx,%rcx,8),%xmm1
subsd  %xmm0,%xmm1
add    %rcx,%rbx
divsd  (%rdi,%rbx,8),%xmm1
movsd  %xmm1,(%rdx,%rcx,8)
add    $0x1,%r10
add    $0xffffffff,%r12d
cmp    %rax,%r10
je     1743 <simq+0x633>
mov    %r8,%rcx
sub    %r10,%rcx
movslq (%r9,%rcx,4),%rbx
imul   0x18(%rsp),%rbx
lea    0x1(%rcx),%rsi
cmp    %rax,%rsi
jge    16c0 <simq+0x5b0>
movslq %r12d,%rsi
movslq %ebx,%rbx
lea    (%rdi,%rbx,8),%rbp
xorpd  %xmm0,%xmm0
xchg   %ax,%ax
movsd  0x0(%rbp,%rsi,8),%xmm1
mulsd  (%rdx,%rsi,8),%xmm1
addsd  %xmm1,%xmm0
add    $0x1,%rsi
cmp    %rax,%rsi
jl     1710 <simq+0x600>
jmp    16c4 <simq+0x5b4>
mov    $0x1,%r13d
jmp    1739 <simq+0x629>
lea    0x8fd(%rip),%r15
mov    %r15,%rdi
xor    %eax,%eax
call   1030 <puts@plt>
mov    %r13d,%eax
add    $0x88,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [14 x i8] c"SIMQ ROWNRM=0\00"
@.str.1 = [11 x i8] c"SIMQ BIG=0\00"
@.str.2 = [14 x i8] c"SIMQ A[kpn]=0\00"
define i32 @simq(double* %0, double* %1, double* %2, i32 %3, i32 %4, i32* %5) {
%7 = alloca i32
%8 = alloca double*
%9 = alloca double*
%10 = alloca double*
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32*
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
%27 = alloca i32
%28 = alloca i32
%29 = alloca i32
%30 = alloca i32
%31 = alloca i32
%32 = alloca double
%33 = alloca double
%34 = alloca double
%35 = alloca double
%36 = alloca double
%37 = alloca double
%38 = alloca double
store double* %0, double** %8
store double* %1, double** %9
store double* %2, double** %10
store i32 %3, i32* %11
store i32 %4, i32* %12
store i32* %5, i32** %13
%39 = load i32, i32* %12
%40 = icmp slt i32 %39, 0
br i1 %40, label %41, label %42
41: ; preds = %6
br label %278
42: ; preds = %6
store i32 0, i32* %16
store i32 0, i32* %14
br label %43
43: ; preds = %87, %42
%44 = load i32, i32* %14
%45 = load i32, i32* %11
%46 = icmp slt i32 %44, %45
br i1 %46, label %47, label %90
47: ; preds = %43
%48 = load i32, i32* %14
%49 = load i32*, i32** %13
%50 = load i32, i32* %14
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i32, i32* %49, i64 %51
store i32 %48, i32* %52
store double 0.000000e+00, double* %34
store i32 0, i32* %15
br label %53
53: ; preds = %72, %47
%54 = load i32, i32* %15
%55 = load i32, i32* %11
%56 = icmp slt i32 %54, %55
br i1 %56, label %57, label %75
57: ; preds = %53
%58 = load double*, double** %8
%59 = load i32, i32* %16
%60 = sext i32 %59 to i64
%61 = getelementptr inbounds double, double* %58, i64 %60
%62 = load double, double* %61
%63 = call double @llvm.fabs.f64(double %62)
store double %63, double* %33
%64 = load double, double* %34
%65 = load double, double* %33
%66 = fcmp olt double %64, %65
br i1 %66, label %67, label %69
67: ; preds = %57
%68 = load double, double* %33
store double %68, double* %34
br label %69
69: ; preds = %67, %57
%70 = load i32, i32* %16
%71 = add nsw i32 %70, 1
store i32 %71, i32* %16
br label %72
72: ; preds = %69
%73 = load i32, i32* %15
%74 = add nsw i32 %73, 1
store i32 %74, i32* %15
br label %53
75: ; preds = %53
%76 = load double, double* %34
%77 = fcmp oeq double %76, 0.000000e+00
br i1 %77, label %78, label %80
78: ; preds = %75
%79 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0))
store i32 1, i32* %7
br label %432
80: ; preds = %75
%81 = load double, double* %34
%82 = fdiv double 1.000000e+00, %81
%83 = load double*, double** %10
%84 = load i32, i32* %14
%85 = sext i32 %84 to i64
%86 = getelementptr inbounds double, double* %83, i64 %85
store double %82, double* %86
br label %87
87: ; preds = %80
%88 = load i32, i32* %14
%89 = add nsw i32 %88, 1
store i32 %89, i32* %14
br label %43
90: ; preds = %43
%91 = load i32, i32* %11
%92 = sub nsw i32 %91, 1
store i32 %92, i32* %31
store i32 0, i32* %23
br label %93
93: ; preds = %254, %90
%94 = load i32, i32* %23
%95 = load i32, i32* %31
%96 = icmp slt i32 %94, %95
br i1 %96, label %97, label %257
97: ; preds = %93
store double 0.000000e+00, double* %35
%98 = load i32, i32* %23
store i32 %98, i32* %14
br label %99
99: ; preds = %133, %97
%100 = load i32, i32* %14
%101 = load i32, i32* %11
%102 = icmp slt i32 %100, %101
br i1 %102, label %103, label %136
103: ; preds = %99
%104 = load i32*, i32** %13
%105 = load i32, i32* %14
%106 = sext i32 %105 to i64
%107 = getelementptr inbounds i32, i32* %104, i64 %106
%108 = load i32, i32* %107
store i32 %108, i32* %17
%109 = load i32, i32* %11
%110 = load i32, i32* %17
%111 = mul nsw i32 %109, %110
%112 = load i32, i32* %23
%113 = add nsw i32 %111, %112
store i32 %113, i32* %19
%114 = load double*, double** %8
%115 = load i32, i32* %19
%116 = sext i32 %115 to i64
%117 = getelementptr inbounds double, double* %114, i64 %116
%118 = load double, double* %117
%119 = call double @llvm.fabs.f64(double %118)
%120 = load double*, double** %10
%121 = load i32, i32* %17
%122 = sext i32 %121 to i64
%123 = getelementptr inbounds double, double* %120, i64 %122
%124 = load double, double* %123
%125 = fmul double %119, %124
store double %125, double* %36
%126 = load double, double* %36
%127 = load double, double* %35
%128 = fcmp ogt double %126, %127
br i1 %128, label %129, label %132
129: ; preds = %103
%130 = load double, double* %36
store double %130, double* %35
%131 = load i32, i32* %14
store i32 %131, i32* %21
br label %132
132: ; preds = %129, %103
br label %133
133: ; preds = %132
%134 = load i32, i32* %14
%135 = add nsw i32 %134, 1
store i32 %135, i32* %14
br label %99
136: ; preds = %99
%137 = load double, double* %35
%138 = fcmp oeq double %137, 0.000000e+00
br i1 %138, label %139, label %141
139: ; preds = %136
%140 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0))
store i32 2, i32* %7
br label %432
141: ; preds = %136
%142 = load i32, i32* %21
%143 = load i32, i32* %23
%144 = icmp ne i32 %142, %143
br i1 %144, label %145, label %165
145: ; preds = %141
%146 = load i32*, i32** %13
%147 = load i32, i32* %23
%148 = sext i32 %147 to i64
%149 = getelementptr inbounds i32, i32* %146, i64 %148
%150 = load i32, i32* %149
store i32 %150, i32* %15
%151 = load i32*, i32** %13
%152 = load i32, i32* %21
%153 = sext i32 %152 to i64
%154 = getelementptr inbounds i32, i32* %151, i64 %153
%155 = load i32, i32* %154
%156 = load i32*, i32** %13
%157 = load i32, i32* %23
%158 = sext i32 %157 to i64
%159 = getelementptr inbounds i32, i32* %156, i64 %158
store i32 %155, i32* %159
%160 = load i32, i32* %15
%161 = load i32*, i32** %13
%162 = load i32, i32* %21
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds i32, i32* %161, i64 %163
store i32 %160, i32* %164
br label %165
165: ; preds = %145, %141
%166 = load i32*, i32** %13
%167 = load i32, i32* %23
%168 = sext i32 %167 to i64
%169 = getelementptr inbounds i32, i32* %166, i64 %168
%170 = load i32, i32* %169
store i32 %170, i32* %24
%171 = load i32, i32* %11
%172 = load i32, i32* %24
%173 = mul nsw i32 %171, %172
%174 = load i32, i32* %23
%175 = add nsw i32 %173, %174
store i32 %175, i32* %27
%176 = load double*, double** %8
%177 = load i32, i32* %27
%178 = sext i32 %177 to i64
%179 = getelementptr inbounds double, double* %176, i64 %178
%180 = load double, double* %179
store double %180, double* %37
%181 = load i32, i32* %23
%182 = add nsw i32 %181, 1
store i32 %182, i32* %25
%183 = load i32, i32* %25
store i32 %183, i32* %14
br label %184
184: ; preds = %250, %165
%185 = load i32, i32* %14
%186 = load i32, i32* %11
%187 = icmp slt i32 %185, %186
br i1 %187, label %188, label %253
188: ; preds = %184
%189 = load i32*, i32** %13
%190 = load i32, i32* %14
%191 = sext i32 %190 to i64
%192 = getelementptr inbounds i32, i32* %189, i64 %191
%193 = load i32, i32* %192
store i32 %193, i32* %17
%194 = load i32, i32* %11
%195 = load i32, i32* %17
%196 = mul nsw i32 %194, %195
%197 = load i32, i32* %23
%198 = add nsw i32 %196, %197
store i32 %198, i32* %19
%199 = load double*, double** %8
%200 = load i32, i32* %19
%201 = sext i32 %200 to i64
%202 = getelementptr inbounds double, double* %199, i64 %201
%203 = load double, double* %202
%204 = fneg double %203
%205 = load double, double* %37
%206 = fdiv double %204, %205
store double %206, double* %32
%207 = load double, double* %32
%208 = fneg double %207
%209 = load double*, double** %8
%210 = load i32, i32* %19
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds double, double* %209, i64 %211
store double %208, double* %212
%213 = load i32, i32* %11
%214 = load i32, i32* %17
%215 = mul nsw i32 %213, %214
store i32 %215, i32* %29
%216 = load i32, i32* %11
%217 = load i32, i32* %24
%218 = mul nsw i32 %216, %217
store i32 %218, i32* %30
%219 = load i32, i32* %25
store i32 %219, i32* %15
br label %220
220: ; preds = %246, %188
%221 = load i32, i32* %15
%222 = load i32, i32* %11
%223 = icmp slt i32 %221, %222
br i1 %223, label %224, label %249
224: ; preds = %220
%225 = load i32, i32* %29
%226 = load i32, i32* %15
%227 = add nsw i32 %225, %226
store i32 %227, i32* %18
%228 = load double*, double** %8
%229 = load i32, i32* %18
%230 = sext i32 %229 to i64
%231 = getelementptr inbounds double, double* %228, i64 %230
%232 = load double, double* %231
%233 = load double, double* %32
%234 = load double*, double** %8
%235 = load i32, i32* %30
%236 = load i32, i32* %15
%237 = add nsw i32 %235, %236
%238 = sext i32 %237 to i64
%239 = getelementptr inbounds double, double* %234, i64 %238
%240 = load double, double* %239
%241 = call double @llvm.fmuladd.f64(double %233, double %240, double %232)
%242 = load double*, double** %8
%243 = load i32, i32* %18
%244 = sext i32 %243 to i64
%245 = getelementptr inbounds double, double* %242, i64 %244
store double %241, double* %245
br label %246
246: ; preds = %224
%247 = load i32, i32* %15
%248 = add nsw i32 %247, 1
store i32 %248, i32* %15
br label %220
249: ; preds = %220
br label %250
250: ; preds = %249
%251 = load i32, i32* %14
%252 = add nsw i32 %251, 1
store i32 %252, i32* %14
br label %184
253: ; preds = %184
br label %254
254: ; preds = %253
%255 = load i32, i32* %23
%256 = add nsw i32 %255, 1
store i32 %256, i32* %23
br label %93
257: ; preds = %93
%258 = load i32, i32* %11
%259 = load i32*, i32** %13
%260 = load i32, i32* %11
%261 = sub nsw i32 %260, 1
%262 = sext i32 %261 to i64
%263 = getelementptr inbounds i32, i32* %259, i64 %262
%264 = load i32, i32* %263
%265 = mul nsw i32 %258, %264
%266 = load i32, i32* %11
%267 = add nsw i32 %265, %266
%268 = sub nsw i32 %267, 1
store i32 %268, i32* %28
%269 = load double*, double** %8
%270 = load i32, i32* %28
%271 = sext i32 %270 to i64
%272 = getelementptr inbounds double, double* %269, i64 %271
%273 = load double, double* %272
%274 = fcmp oeq double %273, 0.000000e+00
br i1 %274, label %275, label %277
275: ; preds = %257
%276 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.2, i64 0, i64 0))
store i32 3, i32* %7
br label %432
277: ; preds = %257
br label %278
278: ; preds = %277, %41
%279 = load i32*, i32** %13
%280 = getelementptr inbounds i32, i32* %279, i64 0
%281 = load i32, i32* %280
store i32 %281, i32* %17
%282 = load double*, double** %9
%283 = load i32, i32* %17
%284 = sext i32 %283 to i64
%285 = getelementptr inbounds double, double* %282, i64 %284
%286 = load double, double* %285
%287 = load double*, double** %10
%288 = getelementptr inbounds double, double* %287, i64 0
store double %286, double* %288
store i32 1, i32* %14
br label %289
289: ; preds = %336, %278
%290 = load i32, i32* %14
%291 = load i32, i32* %11
%292 = icmp slt i32 %290, %291
br i1 %292, label %293, label %339
293: ; preds = %289
%294 = load i32*, i32** %13
%295 = load i32, i32* %14
%296 = sext i32 %295 to i64
%297 = getelementptr inbounds i32, i32* %294, i64 %296
%298 = load i32, i32* %297
store i32 %298, i32* %17
%299 = load i32, i32* %11
%300 = load i32, i32* %17
%301 = mul nsw i32 %299, %300
store i32 %301, i32* %18
store double 0.000000e+00, double* %38
store i32 0, i32* %15
br label %302
302: ; preds = %321, %293
%303 = load i32, i32* %15
%304 = load i32, i32* %14
%305 = icmp slt i32 %303, %304
br i1 %305, label %306, label %324
306: ; preds = %302
%307 = load double*, double** %8
%308 = load i32, i32* %18
%309 = sext i32 %308 to i64
%310 = getelementptr inbounds double, double* %307, i64 %309
%311 = load double, double* %310
%312 = load double*, double** %10
%313 = load i32, i32* %15
%314 = sext i32 %313 to i64
%315 = getelementptr inbounds double, double* %312, i64 %314
%316 = load double, double* %315
%317 = load double, double* %38
%318 = call double @llvm.fmuladd.f64(double %311, double %316, double %317)
store double %318, double* %38
%319 = load i32, i32* %18
%320 = add nsw i32 %319, 1
store i32 %320, i32* %18
br label %321
321: ; preds = %306
%322 = load i32, i32* %15
%323 = add nsw i32 %322, 1
store i32 %323, i32* %15
br label %302
324: ; preds = %302
%325 = load double*, double** %9
%326 = load i32, i32* %17
%327 = sext i32 %326 to i64
%328 = getelementptr inbounds double, double* %325, i64 %327
%329 = load double, double* %328
%330 = load double, double* %38
%331 = fsub double %329, %330
%332 = load double*, double** %10
%333 = load i32, i32* %14
%334 = sext i32 %333 to i64
%335 = getelementptr inbounds double, double* %332, i64 %334
store double %331, double* %335
br label %336
336: ; preds = %324
%337 = load i32, i32* %14
%338 = add nsw i32 %337, 1
store i32 %338, i32* %14
br label %289
339: ; preds = %289
%340 = load i32, i32* %11
%341 = load i32*, i32** %13
%342 = load i32, i32* %11
%343 = sub nsw i32 %342, 1
%344 = sext i32 %343 to i64
%345 = getelementptr inbounds i32, i32* %341, i64 %344
%346 = load i32, i32* %345
%347 = mul nsw i32 %340, %346
%348 = load i32, i32* %11
%349 = add nsw i32 %347, %348
%350 = sub nsw i32 %349, 1
store i32 %350, i32* %20
%351 = load double*, double** %10
%352 = load i32, i32* %11
%353 = sub nsw i32 %352, 1
%354 = sext i32 %353 to i64
%355 = getelementptr inbounds double, double* %351, i64 %354
%356 = load double, double* %355
%357 = load double*, double** %8
%358 = load i32, i32* %20
%359 = sext i32 %358 to i64
%360 = getelementptr inbounds double, double* %357, i64 %359
%361 = load double, double* %360
%362 = fdiv double %356, %361
%363 = load double*, double** %10
%364 = load i32, i32* %11
%365 = sub nsw i32 %364, 1
%366 = sext i32 %365 to i64
%367 = getelementptr inbounds double, double* %363, i64 %366
store double %362, double* %367
store i32 1, i32* %22
br label %368
368: ; preds = %428, %339
%369 = load i32, i32* %22
%370 = load i32, i32* %11
%371 = icmp slt i32 %369, %370
br i1 %371, label %372, label %431
372: ; preds = %368
%373 = load i32, i32* %31
%374 = load i32, i32* %22
%375 = sub nsw i32 %373, %374
store i32 %375, i32* %14
%376 = load i32*, i32** %13
%377 = load i32, i32* %14
%378 = sext i32 %377 to i64
%379 = getelementptr inbounds i32, i32* %376, i64 %378
%380 = load i32, i32* %379
store i32 %380, i32* %17
%381 = load i32, i32* %11
%382 = load i32, i32* %17
%383 = mul nsw i32 %381, %382
store i32 %383, i32* %29
store double 0.000000e+00, double* %38
%384 = load i32, i32* %14
%385 = add nsw i32 %384, 1
store i32 %385, i32* %15
br label %386
386: ; preds = %405, %372
%387 = load i32, i32* %15
%388 = load i32, i32* %11
%389 = icmp slt i32 %387, %388
br i1 %389, label %390, label %408
390: ; preds = %386
%391 = load double*, double** %8
%392 = load i32, i32* %29
%393 = load i32, i32* %15
%394 = add nsw i32 %392, %393
%395 = sext i32 %394 to i64
%396 = getelementptr inbounds double, double* %391, i64 %395
%397 = load double, double* %396
%398 = load double*, double** %10
%399 = load i32, i32* %15
%400 = sext i32 %399 to i64
%401 = getelementptr inbounds double, double* %398, i64 %400
%402 = load double, double* %401
%403 = load double, double* %38
%404 = call double @llvm.fmuladd.f64(double %397, double %402, double %403)
store double %404, double* %38
br label %405
405: ; preds = %390
%406 = load i32, i32* %15
%407 = add nsw i32 %406, 1
store i32 %407, i32* %15
br label %386
408: ; preds = %386
%409 = load double*, double** %10
%410 = load i32, i32* %14
%411 = sext i32 %410 to i64
%412 = getelementptr inbounds double, double* %409, i64 %411
%413 = load double, double* %412
%414 = load double, double* %38
%415 = fsub double %413, %414
%416 = load double*, double** %8
%417 = load i32, i32* %29
%418 = load i32, i32* %14
%419 = add nsw i32 %417, %418
%420 = sext i32 %419 to i64
%421 = getelementptr inbounds double, double* %416, i64 %420
%422 = load double, double* %421
%423 = fdiv double %415, %422
%424 = load double*, double** %10
%425 = load i32, i32* %14
%426 = sext i32 %425 to i64
%427 = getelementptr inbounds double, double* %424, i64 %426
store double %423, double* %427
br label %428
428: ; preds = %408
%429 = load i32, i32* %22
%430 = add nsw i32 %429, 1
store i32 %430, i32* %22
br label %368
431: ; preds = %368
store i32 0, i32* %7
br label %432
432: ; preds = %431, %275, %139, %78
%433 = load i32, i32* %7
ret i32 %433
}

LLVM IR (-O2):
@.str = [14 x i8] c"SIMQ ROWNRM=0\00"
@.str.1 = [11 x i8] c"SIMQ BIG=0\00"
@.str.2 = [14 x i8] c"SIMQ A[kpn]=0\00"
define i32 @simq(double* nocapture %0, double* nocapture %1, double* nocapture %2, i32 %3, i32 %4, i32* nocapture %5) {
%7 = icmp slt i32 %4, 0
br i1 %7, label %233, label %8
8: ; preds = %6
%9 = icmp sgt i32 %3, 0
%10 = add i32 %3, -1
br i1 %9, label %11, label %223
11: ; preds = %8
%12 = zext i32 %10 to i64
%13 = add nuw nsw i64 %12, 1
%14 = zext i32 %3 to i64
%15 = and i32 %3, 1
%16 = icmp eq i32 %10, 0
%17 = and i32 %3, -2
%18 = icmp eq i32 %15, 0
br label %19
19: ; preds = %57, %11
%20 = phi i64 [ 0, %11 ], [ %61, %57 ]
%21 = phi i64 [ 0, %11 ], [ %58, %57 ]
%22 = getelementptr inbounds i32, i32* %5, i64 %20
%23 = trunc i64 %20 to i32
store i32 %23, i32* %22
%24 = shl i64 %21, 32
%25 = ashr exact i64 %24, 32
br i1 %16, label %44, label %26
26: ; preds = %19, %26
%27 = phi i64 [ %41, %26 ], [ %25, %19 ]
%28 = phi double [ %40, %26 ], [ 0.000000e+00, %19 ]
%29 = phi i32 [ %42, %26 ], [ 0, %19 ]
%30 = getelementptr inbounds double, double* %0, i64 %27
%31 = load double, double* %30
%32 = tail call double @llvm.fabs.f64(double %31)
%33 = fcmp olt double %28, %32
%34 = select i1 %33, double %32, double %28
%35 = add nsw i64 %27, 1
%36 = getelementptr inbounds double, double* %0, i64 %35
%37 = load double, double* %36
%38 = tail call double @llvm.fabs.f64(double %37)
%39 = fcmp olt double %34, %38
%40 = select i1 %39, double %38, double %34
%41 = add nsw i64 %27, 2
%42 = add i32 %29, 2
%43 = icmp eq i32 %42, %17
br i1 %43, label %44, label %26
44: ; preds = %26, %19
%45 = phi double [ undef, %19 ], [ %40, %26 ]
%46 = phi i64 [ %25, %19 ], [ %41, %26 ]
%47 = phi double [ 0.000000e+00, %19 ], [ %40, %26 ]
br i1 %18, label %54, label %48
48: ; preds = %44
%49 = getelementptr inbounds double, double* %0, i64 %46
%50 = load double, double* %49
%51 = tail call double @llvm.fabs.f64(double %50)
%52 = fcmp olt double %47, %51
%53 = select i1 %52, double %51, double %47
br label %54
54: ; preds = %44, %48
%55 = phi double [ %45, %44 ], [ %53, %48 ]
%56 = fcmp oeq double %55, 0.000000e+00
br i1 %56, label %372, label %57
57: ; preds = %54
%58 = add nsw i64 %13, %25
%59 = fdiv double 1.000000e+00, %55
%60 = getelementptr inbounds double, double* %2, i64 %20
store double %59, double* %60
%61 = add nuw nsw i64 %20, 1
%62 = icmp eq i64 %61, %14
br i1 %62, label %63, label %19
63: ; preds = %57
%64 = icmp sgt i32 %3, 1
br i1 %64, label %65, label %223
65: ; preds = %63
%66 = sub nsw i64 0, %14
br label %70
67: ; preds = %220, %115
%68 = add nuw nsw i64 %71, 1
%69 = icmp eq i64 %123, %12
br i1 %69, label %223, label %70
70: ; preds = %65, %67
%71 = phi i64 [ %68, %67 ], [ 1, %65 ]
%72 = phi i64 [ %123, %67 ], [ 0, %65 ]
%73 = phi i32 [ %100, %67 ], [ undef, %65 ]
%74 = xor i64 %72, -1
%75 = add nsw i64 %74, %14
%76 = xor i64 %72, -1
%77 = add nsw i64 %76, %14
%78 = getelementptr double, double* %0, i64 %77
%79 = icmp eq i64 %72, %14
br i1 %79, label %372, label %80
80: ; preds = %70
%81 = trunc i64 %72 to i32
br label %82
82: ; preds = %80, %82
%83 = phi i64 [ %72, %80 ], [ %102, %82 ]
%84 = phi double [ 0.000000e+00, %80 ], [ %101, %82 ]
%85 = phi i32 [ %73, %80 ], [ %100, %82 ]
%86 = getelementptr inbounds i32, i32* %5, i64 %83
%87 = load i32, i32* %86
%88 = mul nsw i32 %87, %3
%89 = add nsw i32 %88, %81
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds double, double* %0, i64 %90
%92 = load double, double* %91
%93 = tail call double @llvm.fabs.f64(double %92)
%94 = sext i32 %87 to i64
%95 = getelementptr inbounds double, double* %2, i64 %94
%96 = load double, double* %95
%97 = fmul double %93, %96
%98 = fcmp ogt double %97, %84
%99 = trunc i64 %83 to i32
%100 = select i1 %98, i32 %99, i32 %85
%101 = select i1 %98, double %97, double %84
%102 = add nuw nsw i64 %83, 1
%103 = icmp eq i64 %102, %14
br i1 %103, label %104, label %82
104: ; preds = %82
%105 = fcmp oeq double %101, 0.000000e+00
br i1 %105, label %372, label %106
106: ; preds = %104
%107 = zext i32 %100 to i64
%108 = icmp eq i64 %72, %107
br i1 %108, label %115, label %109
109: ; preds = %106
%110 = getelementptr inbounds i32, i32* %5, i64 %72
%111 = load i32, i32* %110
%112 = sext i32 %100 to i64
%113 = getelementptr inbounds i32, i32* %5, i64 %112
%114 = load i32, i32* %113
store i32 %114, i32* %110
store i32 %111, i32* %113
br label %115
115: ; preds = %109, %106
%116 = getelementptr inbounds i32, i32* %5, i64 %72
%117 = load i32, i32* %116
%118 = mul nsw i32 %117, %3
%119 = add nsw i32 %118, %81
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds double, double* %0, i64 %120
%122 = load double, double* %121
%123 = add nuw nsw i64 %72, 1
%124 = icmp ult i64 %123, %14
br i1 %124, label %125, label %67
125: ; preds = %115
%126 = sext i32 %118 to i64
%127 = add i64 %71, %126
%128 = getelementptr double, double* %0, i64 %127
%129 = getelementptr double, double* %78, i64 %127
%130 = icmp ult i64 %75, 4
%131 = and i64 %75, -4
%132 = add i64 %71, %131
%133 = icmp eq i64 %75, %131
br label %134
134: ; preds = %220, %125
%135 = phi i64 [ %71, %125 ], [ %221, %220 ]
%136 = getelementptr inbounds i32, i32* %5, i64 %135
%137 = load i32, i32* %136
%138 = mul nsw i32 %137, %3
%139 = add nsw i32 %138, %81
%140 = sext i32 %139 to i64
%141 = getelementptr inbounds double, double* %0, i64 %140
%142 = load double, double* %141
%143 = fneg double %142
%144 = fdiv double %143, %122
%145 = fneg double %144
store double %145, double* %141
%146 = sext i32 %138 to i64
br i1 %130, label %183, label %147
147: ; preds = %134
%148 = add nsw i64 %71, %146
%149 = getelementptr double, double* %0, i64 %148
%150 = getelementptr double, double* %78, i64 %148
%151 = icmp ult double* %149, %129
%152 = icmp ult double* %128, %150
%153 = and i1 %151, %152
br i1 %153, label %183, label %154
154: ; preds = %147
%155 = insertelement <2 x double> poison, double %144, i64 0
%156 = shufflevector <2 x double> %155, <2 x double> poison, <2 x i32> zeroinitializer
%157 = insertelement <2 x double> poison, double %144, i64 0
%158 = shufflevector <2 x double> %157, <2 x double> poison, <2 x i32> zeroinitializer
br label %159
159: ; preds = %159, %154
%160 = phi i64 [ 0, %154 ], [ %180, %159 ]
%161 = add i64 %71, %160
%162 = add nsw i64 %161, %146
%163 = getelementptr inbounds double, double* %0, i64 %162
%164 = bitcast double* %163 to <2 x double>*
%165 = load <2 x double>, <2 x double>* %164
%166 = getelementptr inbounds double, double* %163, i64 2
%167 = bitcast double* %166 to <2 x double>*
%168 = load <2 x double>, <2 x double>* %167
%169 = add nsw i64 %161, %126
%170 = getelementptr inbounds double, double* %0, i64 %169
%171 = bitcast double* %170 to <2 x double>*
%172 = load <2 x double>, <2 x double>* %171
%173 = getelementptr inbounds double, double* %170, i64 2
%174 = bitcast double* %173 to <2 x double>*
%175 = load <2 x double>, <2 x double>* %174
%176 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %156, <2 x double> %172, <2 x double> %165)
%177 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %158, <2 x double> %175, <2 x double> %168)
%178 = bitcast double* %163 to <2 x double>*
store <2 x double> %176, <2 x double>* %178
%179 = bitcast double* %166 to <2 x double>*
store <2 x double> %177, <2 x double>* %179
%180 = add nuw i64 %160, 4
%181 = icmp eq i64 %180, %131
br i1 %181, label %182, label %159
182: ; preds = %159
br i1 %133, label %220, label %183
183: ; preds = %147, %134, %182
%184 = phi i64 [ %71, %147 ], [ %71, %134 ], [ %132, %182 ]
%185 = sub i64 %14, %184
%186 = xor i64 %184, -1
%187 = and i64 %185, 1
%188 = icmp eq i64 %187, 0
br i1 %188, label %198, label %189
189: ; preds = %183
%190 = add nsw i64 %184, %146
%191 = getelementptr inbounds double, double* %0, i64 %190
%192 = load double, double* %191
%193 = add nsw i64 %184, %126
%194 = getelementptr inbounds double, double* %0, i64 %193
%195 = load double, double* %194
%196 = tail call double @llvm.fmuladd.f64(double %144, double %195, double %192)
store double %196, double* %191
%197 = add nuw nsw i64 %184, 1
br label %198
198: ; preds = %189, %183
%199 = phi i64 [ %184, %183 ], [ %197, %189 ]
%200 = icmp eq i64 %186, %66
br i1 %200, label %220, label %201
201: ; preds = %198, %201
%202 = phi i64 [ %218, %201 ], [ %199, %198 ]
%203 = add nsw i64 %202, %146
%204 = getelementptr inbounds double, double* %0, i64 %203
%205 = load double, double* %204
%206 = add nsw i64 %202, %126
%207 = getelementptr inbounds double, double* %0, i64 %206
%208 = load double, double* %207
%209 = tail call double @llvm.fmuladd.f64(double %144, double %208, double %205)
store double %209, double* %204
%210 = add nuw nsw i64 %202, 1
%211 = add nsw i64 %210, %146
%212 = getelementptr inbounds double, double* %0, i64 %211
%213 = load double, double* %212
%214 = add nsw i64 %210, %126
%215 = getelementptr inbounds double, double* %0, i64 %214
%216 = load double, double* %215
%217 = tail call double @llvm.fmuladd.f64(double %144, double %216, double %213)
store double %217, double* %212
%218 = add nuw nsw i64 %202, 2
%219 = icmp eq i64 %218, %14
br i1 %219, label %220, label %201
220: ; preds = %198, %201, %182
%221 = add nuw nsw i64 %135, 1
%222 = icmp eq i64 %221, %14
br i1 %222, label %67, label %134
223: ; preds = %67, %8, %63
%224 = sext i32 %10 to i64
%225 = getelementptr inbounds i32, i32* %5, i64 %224
%226 = load i32, i32* %225
%227 = mul nsw i32 %226, %3
%228 = add i32 %227, %10
%229 = sext i32 %228 to i64
%230 = getelementptr inbounds double, double* %0, i64 %229
%231 = load double, double* %230
%232 = fcmp oeq double %231, 0.000000e+00
br i1 %232, label %372, label %233
233: ; preds = %223, %6
%234 = phi i32 [ undef, %6 ], [ %10, %223 ]
%235 = load i32, i32* %5
%236 = sext i32 %235 to i64
%237 = getelementptr inbounds double, double* %1, i64 %236
%238 = load double, double* %237
store double %238, double* %2
%239 = icmp sgt i32 %3, 1
br i1 %239, label %240, label %318
240: ; preds = %233
%241 = zext i32 %3 to i64
br label %242
242: ; preds = %240, %308
%243 = phi i64 [ 0, %240 ], [ %317, %308 ]
%244 = phi i64 [ 1, %240 ], [ %315, %308 ]
%245 = getelementptr inbounds i32, i32* %5, i64 %244
%246 = load i32, i32* %245
%247 = mul i32 %246, %3
%248 = sext i32 %247 to i64
%249 = and i64 %244, 3
%250 = icmp ult i64 %243, 3
br i1 %250, label %288, label %251
251: ; preds = %242
%252 = and i64 %244, 9223372036854775804
br label %253
253: ; preds = %253, %251
%254 = phi i64 [ %248, %251 ], [ %284, %253 ]
%255 = phi i64 [ 0, %251 ], [ %285, %253 ]
%256 = phi double [ 0.000000e+00, %251 ], [ %283, %253 ]
%257 = phi i64 [ 0, %251 ], [ %286, %253 ]
%258 = getelementptr inbounds double, double* %0, i64 %254
%259 = load double, double* %258
%260 = getelementptr inbounds double, double* %2, i64 %255
%261 = load double, double* %260
%262 = tail call double @llvm.fmuladd.f64(double %259, double %261, double %256)
%263 = add nsw i64 %254, 1
%264 = or i64 %255, 1
%265 = getelementptr inbounds double, double* %0, i64 %263
%266 = load double, double* %265
%267 = getelementptr inbounds double, double* %2, i64 %264
%268 = load double, double* %267
%269 = tail call double @llvm.fmuladd.f64(double %266, double %268, double %262)
%270 = add nsw i64 %254, 2
%271 = or i64 %255, 2
%272 = getelementptr inbounds double, double* %0, i64 %270
%273 = load double, double* %272
%274 = getelementptr inbounds double, double* %2, i64 %271
%275 = load double, double* %274
%276 = tail call double @llvm.fmuladd.f64(double %273, double %275, double %269)
%277 = add nsw i64 %254, 3
%278 = or i64 %255, 3
%279 = getelementptr inbounds double, double* %0, i64 %277
%280 = load double, double* %279
%281 = getelementptr inbounds double, double* %2, i64 %278
%282 = load double, double* %281
%283 = tail call double @llvm.fmuladd.f64(double %280, double %282, double %276)
%284 = add nsw i64 %254, 4
%285 = add nuw nsw i64 %255, 4
%286 = add i64 %257, 4
%287 = icmp eq i64 %286, %252
br i1 %287, label %288, label %253
288: ; preds = %253, %242
%289 = phi double [ undef, %242 ], [ %283, %253 ]
%290 = phi i64 [ %248, %242 ], [ %284, %253 ]
%291 = phi i64 [ 0, %242 ], [ %285, %253 ]
%292 = phi double [ 0.000000e+00, %242 ], [ %283, %253 ]
%293 = icmp eq i64 %249, 0
br i1 %293, label %308, label %294
294: ; preds = %288, %294
%295 = phi i64 [ %304, %294 ], [ %290, %288 ]
%296 = phi i64 [ %305, %294 ], [ %291, %288 ]
%297 = phi double [ %303, %294 ], [ %292, %288 ]
%298 = phi i64 [ %306, %294 ], [ 0, %288 ]
%299 = getelementptr inbounds double, double* %0, i64 %295
%300 = load double, double* %299
%301 = getelementptr inbounds double, double* %2, i64 %296
%302 = load double, double* %301
%303 = tail call double @llvm.fmuladd.f64(double %300, double %302, double %297)
%304 = add nsw i64 %295, 1
%305 = add nuw nsw i64 %296, 1
%306 = add i64 %298, 1
%307 = icmp eq i64 %306, %249
br i1 %307, label %308, label %294
308: ; preds = %294, %288
%309 = phi double [ %289, %288 ], [ %303, %294 ]
%310 = sext i32 %246 to i64
%311 = getelementptr inbounds double, double* %1, i64 %310
%312 = load double, double* %311
%313 = fsub double %312, %309
%314 = getelementptr inbounds double, double* %2, i64 %244
store double %313, double* %314
%315 = add nuw nsw i64 %244, 1
%316 = icmp eq i64 %315, %241
%317 = add i64 %243, 1
br i1 %316, label %318, label %242
318: ; preds = %308, %233
%319 = add i32 %3, -1
%320 = sext i32 %319 to i64
%321 = getelementptr inbounds i32, i32* %5, i64 %320
%322 = load i32, i32* %321
%323 = mul nsw i32 %322, %3
%324 = add i32 %323, %319
%325 = getelementptr inbounds double, double* %2, i64 %320
%326 = load double, double* %325
%327 = sext i32 %324 to i64
%328 = getelementptr inbounds double, double* %0, i64 %327
%329 = load double, double* %328
%330 = fdiv double %326, %329
store double %330, double* %325
br i1 %239, label %331, label %376
331: ; preds = %318
%332 = zext i32 %3 to i64
%333 = sext i32 %234 to i64
br label %334
334: ; preds = %331, %359
%335 = phi i64 [ 1, %331 ], [ %369, %359 ]
%336 = phi i32 [ %234, %331 ], [ %370, %359 ]
%337 = sub nsw i64 %333, %335
%338 = getelementptr inbounds i32, i32* %5, i64 %337
%339 = load i32, i32* %338
%340 = mul nsw i32 %339, %3
%341 = add nsw i64 %337, 1
%342 = icmp slt i64 %341, %332
br i1 %342, label %345, label %343
343: ; preds = %334
%344 = sext i32 %340 to i64
br label %359
345: ; preds = %334
%346 = sext i32 %336 to i64
%347 = sext i32 %340 to i64
br label %348
348: ; preds = %345, %348
%349 = phi i64 [ %346, %345 ], [ %357, %348 ]
%350 = phi double [ 0.000000e+00, %345 ], [ %356, %348 ]
%351 = add nsw i64 %349, %347
%352 = getelementptr inbounds double, double* %0, i64 %351
%353 = load double, double* %352
%354 = getelementptr inbounds double, double* %2, i64 %349
%355 = load double, double* %354
%356 = tail call double @llvm.fmuladd.f64(double %353, double %355, double %350)
%357 = add nsw i64 %349, 1
%358 = icmp slt i64 %357, %332
br i1 %358, label %348, label %359
359: ; preds = %348, %343
%360 = phi i64 [ %344, %343 ], [ %347, %348 ]
%361 = phi double [ 0.000000e+00, %343 ], [ %356, %348 ]
%362 = getelementptr inbounds double, double* %2, i64 %337
%363 = load double, double* %362
%364 = fsub double %363, %361
%365 = add nsw i64 %360, %337
%366 = getelementptr inbounds double, double* %0, i64 %365
%367 = load double, double* %366
%368 = fdiv double %364, %367
store double %368, double* %362
%369 = add nuw nsw i64 %335, 1
%370 = add i32 %336, -1
%371 = icmp eq i64 %369, %332
br i1 %371, label %376, label %334
372: ; preds = %54, %104, %70, %223
%373 = phi i8* [ getelementptr inbounds ([14 x i8], [14 x i8]* @.str.2, i64 0, i64 0), %223 ], [ getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), %70 ], [ getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), %104 ], [ getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0), %54 ]
%374 = phi i32 [ 3, %223 ], [ 2, %70 ], [ 2, %104 ], [ 1, %54 ]
%375 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* %373)
br label %376
376: ; preds = %359, %372, %318
%377 = phi i32 [ 0, %318 ], [ %374, %372 ], [ 0, %359 ]
ret i32 %377
}