#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ bmv_(int, double *, double *, int, double *, double *,
                        int *);
int cmprlb_(int n, int m, double *x, double *g, double *ws, double *wy,
            double *sy, double *wt, double *z, double *r, double *wa,
            int *index, double theta, int col, int head, int nfree, int cnstnd,
            int *info) {
  int ws_offset, wy_offset, sy_offset, wt_offset;
  int i, j, k;
  double a1, a2;
  int pointr;
  --index;
  --r;
  --z;
  --g;
  --x;
  --wa;
  wt_offset = 1 + m;
  wt -= wt_offset;
  sy_offset = 1 + m;
  sy -= sy_offset;
  wy_offset = 1 + n;
  wy -= wy_offset;
  ws_offset = 1 + n;
  ws -= ws_offset;
  if (!cnstnd && col > 0) {
    for (i = 1; i <= n; ++i) {
      r[i] = -g[i];
    }
  } else {
    for (i = 1; i <= nfree; ++i) {
      k = index[i];
      r[i] = -theta * (z[k] - x[k]) - g[k];
    }
    bmv_(m, &sy[sy_offset], &wt[wt_offset], col, &wa[2 * m + 1], &wa[1], info);
    if (*info != 0) {
      *info = -8;
      return 0;
    }
    pointr = head;
    for (j = 1; j <= col; ++j) {
      a1 = wa[j];
      a2 = theta * wa[col + j];
      for (i = 1; i <= nfree; ++i) {
        k = index[i];
        r[i] += wy[k + pointr * n] * a1 + ws[k + pointr * n] * a2;
      }
      pointr = pointr % m + 1;
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<cmprlb_>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    0x60(%rbp),%rax
mov    0x58(%rbp),%eax
mov    0x50(%rbp),%eax
mov    0x48(%rbp),%eax
mov    0x40(%rbp),%eax
mov    0x38(%rbp),%rax
mov    0x30(%rbp),%rax
mov    0x28(%rbp),%rax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movsd  %xmm0,-0x38(%rbp)
mov    0x38(%rbp),%rax
add    $0xfffffffffffffffc,%rax
mov    %rax,0x38(%rbp)
mov    0x28(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,0x28(%rbp)
mov    0x20(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,0x20(%rbp)
mov    -0x20(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x18(%rbp)
mov    0x30(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,0x30(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%ecx
mov    0x18(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,0x18(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%ecx
mov    0x10(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,0x10(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%ecx
mov    -0x28(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x28(%rbp)
cmpl   $0x0,0x58(%rbp)
jne    129d <cmprlb_+0x18d>
cmpl   $0x0,0x40(%rbp)
jle    129d <cmprlb_+0x18d>
movl   $0x1,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x8(%rbp),%eax
jg     1298 <cmprlb_+0x188>
mov    -0x20(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    124d <cmprlb_+0x13d>
jmp    1497 <cmprlb_+0x387>
movl   $0x1,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    0x50(%rbp),%eax
jg     133b <cmprlb_+0x22b>
mov    0x38(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x54(%rbp)
movsd  -0x38(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mov    0x20(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm2
mov    -0x18(%rbp),%rax
movslq -0x54(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm2
mov    -0x20(%rbp),%rax
movslq -0x54(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    12a4 <cmprlb_+0x194>
mov    -0xc(%rbp),%edi
mov    0x10(%rbp),%rsi
movslq -0x44(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rsi
mov    0x18(%rbp),%rdx
movslq -0x48(%rbp),%rax
shl    $0x3,%rax
add    %rax,%rdx
mov    0x40(%rbp),%ecx
mov    0x30(%rbp),%r8
mov    -0xc(%rbp),%eax
shl    $0x1,%eax
add    $0x1,%eax
cltq
shl    $0x3,%rax
add    %rax,%r8
mov    0x30(%rbp),%r9
add    $0x8,%r9
mov    0x60(%rbp),%rax
mov    %rax,(%rsp)
call   1030 <bmv_@plt>
mov    0x60(%rbp),%rax
cmpl   $0x0,(%rax)
je     13ad <cmprlb_+0x29d>
mov    0x60(%rbp),%rax
movl   $0xfffffff8,(%rax)
movl   $0x0,-0x4(%rbp)
jmp    149e <cmprlb_+0x38e>
mov    0x48(%rbp),%eax
mov    %eax,-0x6c(%rbp)
movl   $0x1,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    0x40(%rbp),%eax
jg     1492 <cmprlb_+0x382>
mov    0x30(%rbp),%rax
movslq -0x50(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
mov    0x30(%rbp),%rax
mov    0x40(%rbp),%ecx
add    -0x50(%rbp),%ecx
movslq %ecx,%rcx
mulsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x68(%rbp)
movl   $0x1,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    0x50(%rbp),%eax
jg     1477 <cmprlb_+0x367>
mov    0x38(%rbp),%rax
movslq -0x4c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x54(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x54(%rbp),%ecx
mov    -0x6c(%rbp),%edx
imul   -0x8(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  -0x60(%rbp),%xmm2
mov    -0x28(%rbp),%rax
mov    -0x54(%rbp),%ecx
mov    -0x6c(%rbp),%edx
imul   -0x8(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm1
mulsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
mov    0x28(%rbp),%rax
movslq -0x4c(%rbp),%rcx
addsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    13fb <cmprlb_+0x2eb>
mov    -0x6c(%rbp),%eax
cltd
idivl  -0xc(%rbp)
add    $0x1,%edx
mov    %edx,-0x6c(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    13ba <cmprlb_+0x2aa>
jmp    1497 <cmprlb_+0x387>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cmprlb_>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x48,%rsp
mov    %esi,%ebp
mov    %edi,0x14(%rsp)
mov    0xb0(%rsp),%r14d
mov    0x98(%rsp),%r13
test   %r14d,%r14d
jle    12f1 <cmprlb_+0x1e1>
cmpl   $0x0,0xc8(%rsp)
jne    12f1 <cmprlb_+0x1e1>
cmpl   $0x0,0x14(%rsp)
jle    1434 <cmprlb_+0x324>
mov    0x14(%rsp),%edi
mov    %edi,%esi
lea    0x1(%rsi),%rax
mov    $0x1,%edx
cmp    $0x4,%edi
jb     124d <cmprlb_+0x13d>
lea    (%rcx,%rax,8),%rdi
add    $0xfffffffffffffff8,%rdi
cmp    %r13,%rdi
jbe    118f <cmprlb_+0x7f>
lea    -0x8(,%rax,8),%rdi
ff
add    %r13,%rdi
cmp    %rcx,%rdi
ja     124d <cmprlb_+0x13d>
mov    %esi,%edx
and    $0xfffffffc,%edx
lea    -0x4(%rdx),%rdi
mov    %rdi,%rbx
shr    $0x2,%rbx
add    $0x1,%rbx
test   %rdi,%rdi
je     1596 <cmprlb_+0x486>
mov    %rbx,%rbp
and    $0xfffffffffffffffe,%rbp
mov    $0x6,%edi
movapd 0xe40(%rip),%xmm0
movupd -0x30(%rcx,%rdi,8),%xmm1
movupd -0x20(%rcx,%rdi,8),%xmm2
xorpd  %xmm0,%xmm1
xorpd  %xmm0,%xmm2
movupd %xmm1,-0x30(%r13,%rdi,8)
movupd %xmm2,-0x20(%r13,%rdi,8)
movupd -0x10(%rcx,%rdi,8),%xmm1
movupd (%rcx,%rdi,8),%xmm2
xorpd  %xmm0,%xmm1
xorpd  %xmm0,%xmm2
movupd %xmm1,-0x10(%r13,%rdi,8)
movupd %xmm2,0x0(%r13,%rdi,8)
add    $0x8,%rdi
add    $0xfffffffffffffffe,%rbp
jne    11c0 <cmprlb_+0xb0>
add    $0xfffffffffffffffb,%rdi
test   $0x1,%bl
je     1240 <cmprlb_+0x130>
movupd -0x8(%rcx,%rdi,8),%xmm0
movupd 0x8(%rcx,%rdi,8),%xmm1
movapd 0xdd6(%rip),%xmm2
xorpd  %xmm2,%xmm0
xorpd  %xmm2,%xmm1
movupd %xmm0,-0x8(%r13,%rdi,8)
movupd %xmm1,0x8(%r13,%rdi,8)
cmp    %rdx,%rsi
je     1434 <cmprlb_+0x324>
or     $0x1,%rdx
mov    %eax,%edi
sub    %edx,%edi
mov    %rdx,%rsi
not    %rsi
add    %rax,%rsi
and    $0x3,%rdi
je     128b <cmprlb_+0x17b>
movapd 0xd98(%rip),%xmm0
nopl   0x0(%rax,%rax,1)
movsd  -0x8(%rcx,%rdx,8),%xmm1
xorpd  %xmm0,%xmm1
movlpd %xmm1,-0x8(%r13,%rdx,8)
add    $0x1,%rdx
add    $0xffffffffffffffff,%rdi
jne    1270 <cmprlb_+0x160>
cmp    $0x3,%rsi
jb     1434 <cmprlb_+0x324>
movapd 0xd63(%rip),%xmm0
nopl   (%rax)
movsd  -0x8(%rcx,%rdx,8),%xmm1
xorpd  %xmm0,%xmm1
movlpd %xmm1,-0x8(%r13,%rdx,8)
movsd  (%rcx,%rdx,8),%xmm1
xorpd  %xmm0,%xmm1
movlpd %xmm1,0x0(%r13,%rdx,8)
movsd  0x8(%rcx,%rdx,8),%xmm1
xorpd  %xmm0,%xmm1
movlpd %xmm1,0x8(%r13,%rdx,8)
movsd  0x10(%rcx,%rdx,8),%xmm1
xorpd  %xmm0,%xmm1
movlpd %xmm1,0x10(%r13,%rdx,8)
add    $0x4,%rdx
cmp    %rdx,%rax
jne    12a0 <cmprlb_+0x190>
jmp    1434 <cmprlb_+0x324>
mov    %r9,0x20(%rsp)
mov    %r8,0x28(%rsp)
mov    0xd0(%rsp),%r11
mov    0xc0(%rsp),%eax
mov    0xa8(%rsp),%r12
mov    0xa0(%rsp),%r9
mov    0x88(%rsp),%r10
mov    0x80(%rsp),%rsi
lea    -0x8(%r9),%r15
test   %eax,%eax
mov    %rbp,0x18(%rsp)
jle    1402 <cmprlb_+0x2f2>
mov    0x90(%rsp),%rdi
movapd 0xcb5(%rip),%xmm2
xorpd  %xmm0,%xmm2
mov    0xc0(%rsp),%eax
mov    %eax,%r8d
mov    $0x1,%ebx
cmp    $0x1,%eax
je     13d5 <cmprlb_+0x2c5>
mov    %r8d,%eax
and    $0xfffffffe,%eax
neg    %rax
mov    $0x1,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movslq -0x4(%r12,%rbx,4),%rbp
movsd  -0x8(%rdi,%rbp,8),%xmm1
subsd  -0x8(%rdx,%rbp,8),%xmm1
mulsd  %xmm2,%xmm1
subsd  -0x8(%rcx,%rbp,8),%xmm1
movsd  %xmm1,-0x8(%r13,%rbx,8)
movslq (%r12,%rbx,4),%rbp
movsd  -0x8(%rdi,%rbp,8),%xmm1
subsd  -0x8(%rdx,%rbp,8),%xmm1
mulsd  %xmm2,%xmm1
subsd  -0x8(%rcx,%rbp,8),%xmm1
movsd  %xmm1,0x0(%r13,%rbx,8)
lea    (%rax,%rbx,1),%rbp
add    $0x2,%rbp
add    $0x2,%rbx
cmp    $0x1,%rbp
jne    1380 <cmprlb_+0x270>
test   $0x1,%r8b
mov    0x18(%rsp),%rbp
je     1402 <cmprlb_+0x2f2>
movslq -0x4(%r12,%rbx,4),%rax
movsd  -0x8(%rdi,%rax,8),%xmm1
subsd  -0x8(%rdx,%rax,8),%xmm1
mulsd  %xmm1,%xmm2
subsd  -0x8(%rcx,%rax,8),%xmm2
movsd  %xmm2,-0x8(%r13,%rbx,8)
movapd %xmm0,0x30(%rsp)
lea    0x1(%rbp,%rbp,1),%eax
cltq
lea    (%r15,%rax,8),%r8
mov    %r11,(%rsp)
mov    %ebp,%edi
mov    %r10,%rdx
mov    %r14d,%ecx
mov    %r11,%rbx
call   1030 <bmv_@plt>
cmpl   $0x0,(%rbx)
je     1445 <cmprlb_+0x335>
mov    %rbx,%rax
movl   $0xfffffff8,(%rbx)
xor    %eax,%eax
add    $0x48,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
test   %r14d,%r14d
movapd 0x30(%rsp),%xmm4
jle    1434 <cmprlb_+0x324>
mov    0x14(%rsp),%eax
not    %eax
cltq
mov    0xb8(%rsp),%edx
mov    0x20(%rsp),%rcx
lea    (%rcx,%rax,8),%rcx
mov    0x28(%rsp),%rsi
lea    (%rsi,%rax,8),%rsi
mov    0xc0(%rsp),%eax
lea    0x1(%rax),%r9d
mov    %r14d,%r8d
add    $0x1,%r14d
lea    -0x1(%r9),%r10
mov    %r10,%rdi
and    $0xfffffffffffffffe,%rdi
neg    %rdi
mov    $0x1,%r11d
jmp    14b1 <cmprlb_+0x3a1>
nopl   0x0(%rax)
mov    %edx,%eax
cltd
idiv   %ebp
add    $0x1,%edx
add    $0x1,%r11
cmp    %r14,%r11
je     1434 <cmprlb_+0x324>
mov    0xc0(%rsp),%eax
test   %eax,%eax
jle    14a0 <cmprlb_+0x390>
lea    (%r11,%r8,1),%rax
movsd  (%r15,%r11,8),%xmm0
movsd  (%r15,%rax,8),%xmm1
mulsd  %xmm4,%xmm1
mov    %edx,%ebx
imul   0x14(%rsp),%ebx
mov    $0x1,%eax
movslq %ebx,%rbx
cmp    $0x2,%r9d
je     1559 <cmprlb_+0x449>
mov    $0x1,%eax
nopw   0x0(%rax,%rax,1)
movslq -0x4(%r12,%rax,4),%rbp
add    %rbx,%rbp
movsd  (%rsi,%rbp,8),%xmm2
mulsd  %xmm1,%xmm2
movsd  (%rcx,%rbp,8),%xmm3
mulsd  %xmm0,%xmm3
addsd  %xmm2,%xmm3
addsd  -0x8(%r13,%rax,8),%xmm3
movsd  %xmm3,-0x8(%r13,%rax,8)
movslq (%r12,%rax,4),%rbp
add    %rbx,%rbp
movsd  (%rsi,%rbp,8),%xmm2
mulsd  %xmm1,%xmm2
movsd  (%rcx,%rbp,8),%xmm3
mulsd  %xmm0,%xmm3
addsd  %xmm2,%xmm3
addsd  0x0(%r13,%rax,8),%xmm3
movsd  %xmm3,0x0(%r13,%rax,8)
lea    (%rdi,%rax,1),%rbp
add    $0x2,%rbp
add    $0x2,%rax
cmp    $0x1,%rbp
jne    14f0 <cmprlb_+0x3e0>
test   $0x1,%r10b
mov    0x18(%rsp),%rbp
je     14a0 <cmprlb_+0x390>
movslq -0x4(%r12,%rax,4),%rbp
add    %rbx,%rbp
mulsd  (%rsi,%rbp,8),%xmm1
mulsd  (%rcx,%rbp,8),%xmm0
mov    0x18(%rsp),%rbp
addsd  %xmm1,%xmm0
addsd  -0x8(%r13,%rax,8),%xmm0
movsd  %xmm0,-0x8(%r13,%rax,8)
jmp    14a0 <cmprlb_+0x390>
mov    $0x1,%edi
test   $0x1,%bl
jne    1216 <cmprlb_+0x106>
jmp    1240 <cmprlb_+0x130>

LLVM IR (-O0):
define i32 @cmprlb_(i32 %0, i32 %1, double* %2, double* %3, double* %4, double* %5, double* %6, double* %7, double* %8, double* %9, double* %10, i32* %11, double %12, i32 %13, i32 %14, i32 %15, i32 %16, i32* %17) {
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca double*
%23 = alloca double*
%24 = alloca double*
%25 = alloca double*
%26 = alloca double*
%27 = alloca double*
%28 = alloca double*
%29 = alloca double*
%30 = alloca double*
%31 = alloca i32*
%32 = alloca double
%33 = alloca i32
%34 = alloca i32
%35 = alloca i32
%36 = alloca i32
%37 = alloca i32*
%38 = alloca i32
%39 = alloca i32
%40 = alloca i32
%41 = alloca i32
%42 = alloca i32
%43 = alloca i32
%44 = alloca i32
%45 = alloca double
%46 = alloca double
%47 = alloca i32
store i32 %0, i32* %20
store i32 %1, i32* %21
store double* %2, double** %22
store double* %3, double** %23
store double* %4, double** %24
store double* %5, double** %25
store double* %6, double** %26
store double* %7, double** %27
store double* %8, double** %28
store double* %9, double** %29
store double* %10, double** %30
store i32* %11, i32** %31
store double %12, double* %32
store i32 %13, i32* %33
store i32 %14, i32* %34
store i32 %15, i32* %35
store i32 %16, i32* %36
store i32* %17, i32** %37
%48 = load i32*, i32** %31
%49 = getelementptr inbounds i32, i32* %48, i32 -1
store i32* %49, i32** %31
%50 = load double*, double** %29
%51 = getelementptr inbounds double, double* %50, i32 -1
store double* %51, double** %29
%52 = load double*, double** %28
%53 = getelementptr inbounds double, double* %52, i32 -1
store double* %53, double** %28
%54 = load double*, double** %23
%55 = getelementptr inbounds double, double* %54, i32 -1
store double* %55, double** %23
%56 = load double*, double** %22
%57 = getelementptr inbounds double, double* %56, i32 -1
store double* %57, double** %22
%58 = load double*, double** %30
%59 = getelementptr inbounds double, double* %58, i32 -1
store double* %59, double** %30
%60 = load i32, i32* %21
%61 = add nsw i32 1, %60
store i32 %61, i32* %41
%62 = load i32, i32* %41
%63 = load double*, double** %27
%64 = sext i32 %62 to i64
%65 = sub i64 0, %64
%66 = getelementptr inbounds double, double* %63, i64 %65
store double* %66, double** %27
%67 = load i32, i32* %21
%68 = add nsw i32 1, %67
store i32 %68, i32* %40
%69 = load i32, i32* %40
%70 = load double*, double** %26
%71 = sext i32 %69 to i64
%72 = sub i64 0, %71
%73 = getelementptr inbounds double, double* %70, i64 %72
store double* %73, double** %26
%74 = load i32, i32* %20
%75 = add nsw i32 1, %74
store i32 %75, i32* %39
%76 = load i32, i32* %39
%77 = load double*, double** %25
%78 = sext i32 %76 to i64
%79 = sub i64 0, %78
%80 = getelementptr inbounds double, double* %77, i64 %79
store double* %80, double** %25
%81 = load i32, i32* %20
%82 = add nsw i32 1, %81
store i32 %82, i32* %38
%83 = load i32, i32* %38
%84 = load double*, double** %24
%85 = sext i32 %83 to i64
%86 = sub i64 0, %85
%87 = getelementptr inbounds double, double* %84, i64 %86
store double* %87, double** %24
%88 = load i32, i32* %36
%89 = icmp ne i32 %88, 0
br i1 %89, label %113, label %90
90: ; preds = %18
%91 = load i32, i32* %33
%92 = icmp sgt i32 %91, 0
br i1 %92, label %93, label %113
93: ; preds = %90
store i32 1, i32* %42
br label %94
94: ; preds = %109, %93
%95 = load i32, i32* %42
%96 = load i32, i32* %20
%97 = icmp sle i32 %95, %96
br i1 %97, label %98, label %112
98: ; preds = %94
%99 = load double*, double** %23
%100 = load i32, i32* %42
%101 = sext i32 %100 to i64
%102 = getelementptr inbounds double, double* %99, i64 %101
%103 = load double, double* %102
%104 = fneg double %103
%105 = load double*, double** %29
%106 = load i32, i32* %42
%107 = sext i32 %106 to i64
%108 = getelementptr inbounds double, double* %105, i64 %107
store double %104, double* %108
br label %109
109: ; preds = %98
%110 = load i32, i32* %42
%111 = add nsw i32 %110, 1
store i32 %111, i32* %42
br label %94
112: ; preds = %94
br label %248
113: ; preds = %90, %18
store i32 1, i32* %42
br label %114
114: ; preds = %148, %113
%115 = load i32, i32* %42
%116 = load i32, i32* %35
%117 = icmp sle i32 %115, %116
br i1 %117, label %118, label %151
118: ; preds = %114
%119 = load i32*, i32** %31
%120 = load i32, i32* %42
%121 = sext i32 %120 to i64
%122 = getelementptr inbounds i32, i32* %119, i64 %121
%123 = load i32, i32* %122
store i32 %123, i32* %44
%124 = load double, double* %32
%125 = fneg double %124
%126 = load double*, double** %28
%127 = load i32, i32* %44
%128 = sext i32 %127 to i64
%129 = getelementptr inbounds double, double* %126, i64 %128
%130 = load double, double* %129
%131 = load double*, double** %22
%132 = load i32, i32* %44
%133 = sext i32 %132 to i64
%134 = getelementptr inbounds double, double* %131, i64 %133
%135 = load double, double* %134
%136 = fsub double %130, %135
%137 = load double*, double** %23
%138 = load i32, i32* %44
%139 = sext i32 %138 to i64
%140 = getelementptr inbounds double, double* %137, i64 %139
%141 = load double, double* %140
%142 = fneg double %141
%143 = call double @llvm.fmuladd.f64(double %125, double %136, double %142)
%144 = load double*, double** %29
%145 = load i32, i32* %42
%146 = sext i32 %145 to i64
%147 = getelementptr inbounds double, double* %144, i64 %146
store double %143, double* %147
br label %148
148: ; preds = %118
%149 = load i32, i32* %42
%150 = add nsw i32 %149, 1
store i32 %150, i32* %42
br label %114
151: ; preds = %114
%152 = load i32, i32* %21
%153 = load double*, double** %26
%154 = load i32, i32* %40
%155 = sext i32 %154 to i64
%156 = getelementptr inbounds double, double* %153, i64 %155
%157 = load double*, double** %27
%158 = load i32, i32* %41
%159 = sext i32 %158 to i64
%160 = getelementptr inbounds double, double* %157, i64 %159
%161 = load i32, i32* %33
%162 = load double*, double** %30
%163 = load i32, i32* %21
%164 = mul nsw i32 2, %163
%165 = add nsw i32 %164, 1
%166 = sext i32 %165 to i64
%167 = getelementptr inbounds double, double* %162, i64 %166
%168 = load double*, double** %30
%169 = getelementptr inbounds double, double* %168, i64 1
%170 = load i32*, i32** %37
%171 = call i32 @bmv_(i32 %152, double* %156, double* %160, i32 %161, double* %167, double* %169, i32* %170)
%172 = load i32*, i32** %37
%173 = load i32, i32* %172
%174 = icmp ne i32 %173, 0
br i1 %174, label %175, label %177
175: ; preds = %151
%176 = load i32*, i32** %37
store i32 -8, i32* %176
store i32 0, i32* %19
br label %249
177: ; preds = %151
%178 = load i32, i32* %34
store i32 %178, i32* %47
store i32 1, i32* %43
br label %179
179: ; preds = %244, %177
%180 = load i32, i32* %43
%181 = load i32, i32* %33
%182 = icmp sle i32 %180, %181
br i1 %182, label %183, label %247
183: ; preds = %179
%184 = load double*, double** %30
%185 = load i32, i32* %43
%186 = sext i32 %185 to i64
%187 = getelementptr inbounds double, double* %184, i64 %186
%188 = load double, double* %187
store double %188, double* %45
%189 = load double, double* %32
%190 = load double*, double** %30
%191 = load i32, i32* %33
%192 = load i32, i32* %43
%193 = add nsw i32 %191, %192
%194 = sext i32 %193 to i64
%195 = getelementptr inbounds double, double* %190, i64 %194
%196 = load double, double* %195
%197 = fmul double %189, %196
store double %197, double* %46
store i32 1, i32* %42
br label %198
198: ; preds = %236, %183
%199 = load i32, i32* %42
%200 = load i32, i32* %35
%201 = icmp sle i32 %199, %200
br i1 %201, label %202, label %239
202: ; preds = %198
%203 = load i32*, i32** %31
%204 = load i32, i32* %42
%205 = sext i32 %204 to i64
%206 = getelementptr inbounds i32, i32* %203, i64 %205
%207 = load i32, i32* %206
store i32 %207, i32* %44
%208 = load double*, double** %25
%209 = load i32, i32* %44
%210 = load i32, i32* %47
%211 = load i32, i32* %20
%212 = mul nsw i32 %210, %211
%213 = add nsw i32 %209, %212
%214 = sext i32 %213 to i64
%215 = getelementptr inbounds double, double* %208, i64 %214
%216 = load double, double* %215
%217 = load double, double* %45
%218 = load double*, double** %24
%219 = load i32, i32* %44
%220 = load i32, i32* %47
%221 = load i32, i32* %20
%222 = mul nsw i32 %220, %221
%223 = add nsw i32 %219, %222
%224 = sext i32 %223 to i64
%225 = getelementptr inbounds double, double* %218, i64 %224
%226 = load double, double* %225
%227 = load double, double* %46
%228 = fmul double %226, %227
%229 = call double @llvm.fmuladd.f64(double %216, double %217, double %228)
%230 = load double*, double** %29
%231 = load i32, i32* %42
%232 = sext i32 %231 to i64
%233 = getelementptr inbounds double, double* %230, i64 %232
%234 = load double, double* %233
%235 = fadd double %234, %229
store double %235, double* %233
br label %236
236: ; preds = %202
%237 = load i32, i32* %42
%238 = add nsw i32 %237, 1
store i32 %238, i32* %42
br label %198
239: ; preds = %198
%240 = load i32, i32* %47
%241 = load i32, i32* %21
%242 = srem i32 %240, %241
%243 = add nsw i32 %242, 1
store i32 %243, i32* %47
br label %244
244: ; preds = %239
%245 = load i32, i32* %43
%246 = add nsw i32 %245, 1
store i32 %246, i32* %43
br label %179
247: ; preds = %179
br label %248
248: ; preds = %247, %112
store i32 0, i32* %19
br label %249
249: ; preds = %248, %175
%250 = load i32, i32* %19
ret i32 %250
}

LLVM IR (-O2):
define i32 @cmprlb_(i32 %0, i32 %1, double* nocapture %2, double* nocapture %3, double* nocapture %4, double* nocapture %5, double* %6, double* %7, double* nocapture %8, double* nocapture %9, double* %10, i32* nocapture %11, double %12, i32 %13, i32 %14, i32 %15, i32 %16, i32* %17) {
%19 = getelementptr inbounds i32, i32* %11, i64 -1
%20 = getelementptr inbounds double, double* %9, i64 -1
%21 = getelementptr inbounds double, double* %8, i64 -1
%22 = getelementptr inbounds double, double* %3, i64 -1
%23 = getelementptr inbounds double, double* %2, i64 -1
%24 = getelementptr inbounds double, double* %10, i64 -1
%25 = xor i32 %0, -1
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds double, double* %5, i64 %26
%28 = getelementptr inbounds double, double* %4, i64 %26
%29 = icmp eq i32 %16, 0
%30 = icmp sgt i32 %13, 0
%31 = and i1 %30, %29
br i1 %31, label %41, label %32
32: ; preds = %18
%33 = icmp slt i32 %15, 1
br i1 %33, label %208, label %34
34: ; preds = %32
%35 = fneg double %12
%36 = zext i32 %15 to i64
%37 = and i64 %36, 1
%38 = icmp eq i32 %15, 1
br i1 %38, label %191, label %39
39: ; preds = %34
%40 = and i64 %36, 4294967294
br label %159
41: ; preds = %18
%42 = icmp slt i32 %0, 1
br i1 %42, label %294, label %43
43: ; preds = %41
%44 = add nuw i32 %0, 1
%45 = zext i32 %44 to i64
%46 = add nsw i64 %45, -1
%47 = icmp ult i64 %46, 4
br i1 %47, label %117, label %48
48: ; preds = %43
%49 = add nsw i64 %45, -1
%50 = getelementptr double, double* %9, i64 %49
%51 = getelementptr double, double* %3, i64 %49
%52 = icmp ugt double* %51, %9
%53 = icmp ugt double* %50, %3
%54 = and i1 %52, %53
br i1 %54, label %117, label %55
55: ; preds = %48
%56 = and i64 %46, -4
%57 = or i64 %56, 1
%58 = add nsw i64 %56, -4
%59 = lshr exact i64 %58, 2
%60 = add nuw nsw i64 %59, 1
%61 = and i64 %60, 1
%62 = icmp eq i64 %58, 0
br i1 %62, label %99, label %63
63: ; preds = %55
%64 = and i64 %60, 9223372036854775806
br label %65
65: ; preds = %65, %63
%66 = phi i64 [ 0, %63 ], [ %94, %65 ]
%67 = phi i64 [ 0, %63 ], [ %95, %65 ]
%68 = or i64 %66, 1
%69 = getelementptr inbounds double, double* %22, i64 %68
%70 = bitcast double* %69 to <2 x double>*
%71 = load <2 x double>, <2 x double>* %70
%72 = getelementptr inbounds double, double* %69, i64 2
%73 = bitcast double* %72 to <2 x double>*
%74 = load <2 x double>, <2 x double>* %73
%75 = fneg <2 x double> %71
%76 = fneg <2 x double> %74
%77 = getelementptr inbounds double, double* %20, i64 %68
%78 = bitcast double* %77 to <2 x double>*
store <2 x double> %75, <2 x double>* %78
%79 = getelementptr inbounds double, double* %77, i64 2
%80 = bitcast double* %79 to <2 x double>*
store <2 x double> %76, <2 x double>* %80
%81 = or i64 %66, 5
%82 = getelementptr inbounds double, double* %22, i64 %81
%83 = bitcast double* %82 to <2 x double>*
%84 = load <2 x double>, <2 x double>* %83
%85 = getelementptr inbounds double, double* %82, i64 2
%86 = bitcast double* %85 to <2 x double>*
%87 = load <2 x double>, <2 x double>* %86
%88 = fneg <2 x double> %84
%89 = fneg <2 x double> %87
%90 = getelementptr inbounds double, double* %20, i64 %81
%91 = bitcast double* %90 to <2 x double>*
store <2 x double> %88, <2 x double>* %91
%92 = getelementptr inbounds double, double* %90, i64 2
%93 = bitcast double* %92 to <2 x double>*
store <2 x double> %89, <2 x double>* %93
%94 = add nuw i64 %66, 8
%95 = add i64 %67, 2
%96 = icmp eq i64 %95, %64
br i1 %96, label %97, label %65
97: ; preds = %65
%98 = or i64 %94, 1
br label %99
99: ; preds = %97, %55
%100 = phi i64 [ 1, %55 ], [ %98, %97 ]
%101 = icmp eq i64 %61, 0
br i1 %101, label %115, label %102
102: ; preds = %99
%103 = getelementptr inbounds double, double* %22, i64 %100
%104 = bitcast double* %103 to <2 x double>*
%105 = load <2 x double>, <2 x double>* %104
%106 = getelementptr inbounds double, double* %103, i64 2
%107 = bitcast double* %106 to <2 x double>*
%108 = load <2 x double>, <2 x double>* %107
%109 = fneg <2 x double> %105
%110 = fneg <2 x double> %108
%111 = getelementptr inbounds double, double* %20, i64 %100
%112 = bitcast double* %111 to <2 x double>*
store <2 x double> %109, <2 x double>* %112
%113 = getelementptr inbounds double, double* %111, i64 2
%114 = bitcast double* %113 to <2 x double>*
store <2 x double> %110, <2 x double>* %114
br label %115
115: ; preds = %99, %102
%116 = icmp eq i64 %46, %56
br i1 %116, label %294, label %117
117: ; preds = %48, %43, %115
%118 = phi i64 [ 1, %48 ], [ 1, %43 ], [ %57, %115 ]
%119 = sub nsw i64 %45, %118
%120 = xor i64 %118, -1
%121 = add nsw i64 %120, %45
%122 = and i64 %119, 3
%123 = icmp eq i64 %122, 0
br i1 %123, label %134, label %124
124: ; preds = %117, %124
%125 = phi i64 [ %131, %124 ], [ %118, %117 ]
%126 = phi i64 [ %132, %124 ], [ 0, %117 ]
%127 = getelementptr inbounds double, double* %22, i64 %125
%128 = load double, double* %127
%129 = fneg double %128
%130 = getelementptr inbounds double, double* %20, i64 %125
store double %129, double* %130
%131 = add nuw nsw i64 %125, 1
%132 = add i64 %126, 1
%133 = icmp eq i64 %132, %122
br i1 %133, label %134, label %124
134: ; preds = %124, %117
%135 = phi i64 [ %118, %117 ], [ %131, %124 ]
%136 = icmp ult i64 %121, 3
br i1 %136, label %294, label %137
137: ; preds = %134, %137
%138 = phi i64 [ %157, %137 ], [ %135, %134 ]
%139 = getelementptr inbounds double, double* %22, i64 %138
%140 = load double, double* %139
%141 = fneg double %140
%142 = getelementptr inbounds double, double* %20, i64 %138
store double %141, double* %142
%143 = getelementptr inbounds double, double* %3, i64 %138
%144 = load double, double* %143
%145 = fneg double %144
%146 = getelementptr inbounds double, double* %9, i64 %138
store double %145, double* %146
%147 = add nuw nsw i64 %138, 2
%148 = getelementptr inbounds double, double* %22, i64 %147
%149 = load double, double* %148
%150 = fneg double %149
%151 = getelementptr inbounds double, double* %20, i64 %147
store double %150, double* %151
%152 = add nuw nsw i64 %138, 3
%153 = getelementptr inbounds double, double* %22, i64 %152
%154 = load double, double* %153
%155 = fneg double %154
%156 = getelementptr inbounds double, double* %20, i64 %152
store double %155, double* %156
%157 = add nuw nsw i64 %138, 4
%158 = icmp eq i64 %157, %45
br i1 %158, label %294, label %137
159: ; preds = %159, %39
%160 = phi i64 [ 1, %39 ], [ %188, %159 ]
%161 = phi i64 [ 0, %39 ], [ %189, %159 ]
%162 = getelementptr inbounds i32, i32* %19, i64 %160
%163 = load i32, i32* %162
%164 = sext i32 %163 to i64
%165 = getelementptr inbounds double, double* %21, i64 %164
%166 = load double, double* %165
%167 = getelementptr inbounds double, double* %23, i64 %164
%168 = load double, double* %167
%169 = fsub double %166, %168
%170 = getelementptr inbounds double, double* %22, i64 %164
%171 = load double, double* %170
%172 = fneg double %171
%173 = tail call double @llvm.fmuladd.f64(double %35, double %169, double %172)
%174 = getelementptr inbounds double, double* %20, i64 %160
store double %173, double* %174
%175 = getelementptr inbounds i32, i32* %11, i64 %160
%176 = load i32, i32* %175
%177 = sext i32 %176 to i64
%178 = getelementptr inbounds double, double* %21, i64 %177
%179 = load double, double* %178
%180 = getelementptr inbounds double, double* %23, i64 %177
%181 = load double, double* %180
%182 = fsub double %179, %181
%183 = getelementptr inbounds double, double* %22, i64 %177
%184 = load double, double* %183
%185 = fneg double %184
%186 = tail call double @llvm.fmuladd.f64(double %35, double %182, double %185)
%187 = getelementptr inbounds double, double* %9, i64 %160
store double %186, double* %187
%188 = add nuw nsw i64 %160, 2
%189 = add i64 %161, 2
%190 = icmp eq i64 %189, %40
br i1 %190, label %191, label %159
191: ; preds = %159, %34
%192 = phi i64 [ 1, %34 ], [ %188, %159 ]
%193 = icmp eq i64 %37, 0
br i1 %193, label %208, label %194
194: ; preds = %191
%195 = getelementptr inbounds i32, i32* %19, i64 %192
%196 = load i32, i32* %195
%197 = sext i32 %196 to i64
%198 = getelementptr inbounds double, double* %21, i64 %197
%199 = load double, double* %198
%200 = getelementptr inbounds double, double* %23, i64 %197
%201 = load double, double* %200
%202 = fsub double %199, %201
%203 = getelementptr inbounds double, double* %22, i64 %197
%204 = load double, double* %203
%205 = fneg double %204
%206 = tail call double @llvm.fmuladd.f64(double %35, double %202, double %205)
%207 = getelementptr inbounds double, double* %20, i64 %192
store double %206, double* %207
br label %208
208: ; preds = %194, %191, %32
%209 = shl nsw i32 %1, 1
%210 = or i32 %209, 1
%211 = sext i32 %210 to i64
%212 = getelementptr inbounds double, double* %24, i64 %211
%213 = tail call i32 @bmv_(i32 %1, double* %6, double* %7, i32 %13, double* %212, double* %10, i32* %17)
%214 = load i32, i32* %17
%215 = icmp eq i32 %214, 0
br i1 %215, label %216, label %229
216: ; preds = %208
%217 = icmp slt i32 %13, 1
br i1 %217, label %294, label %218
218: ; preds = %216
%219 = add i32 %15, 1
%220 = zext i32 %13 to i64
%221 = add nuw i32 %13, 1
%222 = zext i32 %221 to i64
%223 = zext i32 %219 to i64
%224 = add nsw i64 %223, -1
%225 = and i64 %224, 1
%226 = icmp eq i32 %219, 2
%227 = and i64 %224, -2
%228 = icmp eq i64 %225, 0
br label %230
229: ; preds = %208
store i32 -8, i32* %17
br label %294
230: ; preds = %218, %289
%231 = phi i64 [ 1, %218 ], [ %292, %289 ]
%232 = phi i32 [ %14, %218 ], [ %291, %289 ]
%233 = getelementptr inbounds double, double* %24, i64 %231
%234 = load double, double* %233
%235 = add nuw nsw i64 %231, %220
%236 = getelementptr inbounds double, double* %24, i64 %235
%237 = load double, double* %236
%238 = fmul double %237, %12
br i1 %33, label %289, label %239
239: ; preds = %230
%240 = mul nsw i32 %232, %0
br i1 %226, label %273, label %241
241: ; preds = %239, %241
%242 = phi i64 [ %270, %241 ], [ 1, %239 ]
%243 = phi i64 [ %271, %241 ], [ 0, %239 ]
%244 = getelementptr inbounds i32, i32* %19, i64 %242
%245 = load i32, i32* %244
%246 = add nsw i32 %245, %240
%247 = sext i32 %246 to i64
%248 = getelementptr inbounds double, double* %27, i64 %247
%249 = load double, double* %248
%250 = getelementptr inbounds double, double* %28, i64 %247
%251 = load double, double* %250
%252 = fmul double %238, %251
%253 = tail call double @llvm.fmuladd.f64(double %249, double %234, double %252)
%254 = getelementptr inbounds double, double* %20, i64 %242
%255 = load double, double* %254
%256 = fadd double %255, %253
store double %256, double* %254
%257 = getelementptr inbounds i32, i32* %11, i64 %242
%258 = load i32, i32* %257
%259 = add nsw i32 %258, %240
%260 = sext i32 %259 to i64
%261 = getelementptr inbounds double, double* %27, i64 %260
%262 = load double, double* %261
%263 = getelementptr inbounds double, double* %28, i64 %260
%264 = load double, double* %263
%265 = fmul double %238, %264
%266 = tail call double @llvm.fmuladd.f64(double %262, double %234, double %265)
%267 = getelementptr inbounds double, double* %9, i64 %242
%268 = load double, double* %267
%269 = fadd double %268, %266
store double %269, double* %267
%270 = add nuw nsw i64 %242, 2
%271 = add i64 %243, 2
%272 = icmp eq i64 %271, %227
br i1 %272, label %273, label %241
273: ; preds = %241, %239
%274 = phi i64 [ 1, %239 ], [ %270, %241 ]
br i1 %228, label %289, label %275
275: ; preds = %273
%276 = getelementptr inbounds i32, i32* %19, i64 %274
%277 = load i32, i32* %276
%278 = add nsw i32 %277, %240
%279 = sext i32 %278 to i64
%280 = getelementptr inbounds double, double* %27, i64 %279
%281 = load double, double* %280
%282 = getelementptr inbounds double, double* %28, i64 %279
%283 = load double, double* %282
%284 = fmul double %238, %283
%285 = tail call double @llvm.fmuladd.f64(double %281, double %234, double %284)
%286 = getelementptr inbounds double, double* %20, i64 %274
%287 = load double, double* %286
%288 = fadd double %287, %285
store double %288, double* %286
br label %289
289: ; preds = %275, %273, %230
%290 = srem i32 %232, %1
%291 = add nsw i32 %290, 1
%292 = add nuw nsw i64 %231, 1
%293 = icmp eq i64 %292, %222
br i1 %293, label %294, label %230
294: ; preds = %289, %134, %137, %115, %216, %41, %229
ret i32 0
}