void kernel_dsymv_2_lib4(int kmax, double *A, int sda, double *x_n, double *y_n,
                         double *z_n, double *x_t, double *y_t, double *z_t,
                         int tri, int alg_n, int alg_t) {
  if (kmax <= 0)
    return;
  const int bs = 4;
  int k;
  double a_00, a_01, x_n_0, x_n_1, y_n_0, x_t_0, y_t_0, y_t_1;
  if (alg_n == 1) {
    x_n_0 = x_n[0];
    x_n_1 = x_n[1];
  } else {
    x_n_0 = -x_n[0];
    x_n_1 = -x_n[1];
  }
  y_t_0 = 0;
  y_t_1 = 0;
  k = 0;
  if (tri == 1) {
    y_n_0 = y_n[0];
    x_t_0 = x_t[0];
    a_00 = A[0 + bs * 0];
    y_t_0 += a_00 * x_t_0;
    z_n[0] = y_n_0;
    y_n_0 = y_n[1];
    x_t_0 = x_t[1];
    a_00 = A[1 + bs * 0];
    a_01 = A[1 + bs * 1];
    y_n_0 += a_00 * x_n_0;
    y_t_0 += a_00 * x_t_0;
    y_t_1 += a_01 * x_t_0;
    z_n[1] = y_n_0;
    if (kmax == 2)
      goto STORE_2;
    y_n_0 = y_n[2];
    x_t_0 = x_t[2];
    a_00 = A[2 + bs * 0];
    a_01 = A[2 + bs * 1];
    y_n_0 += a_00 * x_n_0;
    y_t_0 += a_00 * x_t_0;
    y_n_0 += a_01 * x_n_1;
    y_t_1 += a_01 * x_t_0;
    z_n[2] = y_n_0;
    if (kmax == 3)
      goto STORE_2;
    y_n_0 = y_n[3];
    x_t_0 = x_t[3];
    a_00 = A[3 + bs * 0];
    a_01 = A[3 + bs * 1];
    y_n_0 += a_00 * x_n_0;
    y_t_0 += a_00 * x_t_0;
    y_n_0 += a_01 * x_n_1;
    y_t_1 += a_01 * x_t_0;
    z_n[3] = y_n_0;
    if (kmax == 4)
      goto STORE_2;
    A += 4;
    y_n += 4;
    z_n += 4;
    x_t += 4;
    k += 4;
    A += (sda - 1) * bs;
  }
  for (; k < kmax - 3; k += bs) {
    y_n_0 = y_n[0];
    x_t_0 = x_t[0];
    a_00 = A[0 + bs * 0];
    a_01 = A[0 + bs * 1];
    y_n_0 += a_00 * x_n_0;
    y_t_0 += a_00 * x_t_0;
    y_n_0 += a_01 * x_n_1;
    y_t_1 += a_01 * x_t_0;
    z_n[0] = y_n_0;
    y_n_0 = y_n[1];
    x_t_0 = x_t[1];
    a_00 = A[1 + bs * 0];
    a_01 = A[1 + bs * 1];
    y_n_0 += a_00 * x_n_0;
    y_t_0 += a_00 * x_t_0;
    y_n_0 += a_01 * x_n_1;
    y_t_1 += a_01 * x_t_0;
    z_n[1] = y_n_0;
    y_n_0 = y_n[2];
    x_t_0 = x_t[2];
    a_00 = A[2 + bs * 0];
    a_01 = A[2 + bs * 1];
    y_n_0 += a_00 * x_n_0;
    y_t_0 += a_00 * x_t_0;
    y_n_0 += a_01 * x_n_1;
    y_t_1 += a_01 * x_t_0;
    z_n[2] = y_n_0;
    y_n_0 = y_n[3];
    x_t_0 = x_t[3];
    a_00 = A[3 + bs * 0];
    a_01 = A[3 + bs * 1];
    y_n_0 += a_00 * x_n_0;
    y_t_0 += a_00 * x_t_0;
    y_n_0 += a_01 * x_n_1;
    y_t_1 += a_01 * x_t_0;
    z_n[3] = y_n_0;
    A += sda * bs;
    y_n += 4;
    z_n += 4;
    x_t += 4;
  }
  for (; k < kmax; k++) {
    y_n_0 = y_n[0];
    x_t_0 = x_t[0];
    a_00 = A[0 + bs * 0];
    a_01 = A[0 + bs * 1];
    y_n_0 += a_00 * x_n_0;
    y_t_0 += a_00 * x_t_0;
    y_n_0 += a_01 * x_n_1;
    y_t_1 += a_01 * x_t_0;
    z_n[0] = y_n_0;
    A += 1;
    y_n += 1;
    z_n += 1;
    x_t += 1;
  }
STORE_2:
  if (alg_t == 1) {
    z_t[0] = y_t[0] + y_t_0;
    z_t[1] = y_t[1] + y_t_1;
  } else {
    z_t[0] = y_t[0] - y_t_0;
    z_t[1] = y_t[1] - y_t_1;
  }
}


x86 assembly (clang, -O0):
<kernel_dsymv_2_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    0x38(%rbp),%eax
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%rax
mov    0x18(%rbp),%rax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     113e <kernel_dsymv_2_lib4+0x3e>
jmp    1951 <kernel_dsymv_2_lib4+0x851>
movl   $0x4,-0x34(%rbp)
cmpl   $0x1,0x30(%rbp)
jne    116f <kernel_dsymv_2_lib4+0x6f>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    11b8 <kernel_dsymv_2_lib4+0xb8>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x58(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x0,-0x38(%rbp)
cmpl   $0x1,0x28(%rbp)
jne    14b0 <kernel_dsymv_2_lib4+0x3b0>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x8(%rax)
cmpl   $0x2,-0x4(%rbp)
jne    12d2 <kernel_dsymv_2_lib4+0x1d2>
jmp    18ea <kernel_dsymv_2_lib4+0x7ea>
mov    -0x28(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x10(%rax)
cmpl   $0x3,-0x4(%rbp)
jne    1397 <kernel_dsymv_2_lib4+0x297>
jmp    18ea <kernel_dsymv_2_lib4+0x7ea>
mov    -0x28(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x18(%rax)
cmpl   $0x4,-0x4(%rbp)
jne    145c <kernel_dsymv_2_lib4+0x35c>
jmp    18ea <kernel_dsymv_2_lib4+0x7ea>
mov    -0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x10(%rbp)
mov    -0x28(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x30(%rbp)
mov    0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,0x10(%rbp)
mov    -0x38(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x38(%rbp)
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
jmp    14b5 <kernel_dsymv_2_lib4+0x3b5>
mov    -0x38(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    17e4 <kernel_dsymv_2_lib4+0x6e4>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x28(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x10(%rax)
mov    -0x28(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x28(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x30(%rbp)
mov    0x10(%rbp),%rax
add    $0x20,%rax
mov    %rax,0x10(%rbp)
mov    -0x38(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x38(%rbp)
jmp    14b5 <kernel_dsymv_2_lib4+0x3b5>
jmp    17e9 <kernel_dsymv_2_lib4+0x6e9>
mov    -0x38(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    18e5 <kernel_dsymv_2_lib4+0x7e5>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x68(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x28(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x30(%rbp)
mov    0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,0x10(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    17e9 <kernel_dsymv_2_lib4+0x6e9>
jmp    18ea <kernel_dsymv_2_lib4+0x7ea>
cmpl   $0x1,0x38(%rbp)
jne    1925 <kernel_dsymv_2_lib4+0x825>
mov    0x18(%rbp),%rax
movsd  (%rax),%xmm0
addsd  -0x70(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
addsd  -0x78(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
jmp    1951 <kernel_dsymv_2_lib4+0x851>
mov    0x18(%rbp),%rax
movsd  (%rax),%xmm0
subsd  -0x70(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,(%rax)
mov    0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  -0x78(%rbp),%xmm0
mov    0x20(%rbp),%rax
movsd  %xmm0,0x8(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dsymv_2_lib4>:
test   %edi,%edi
jle    142a <kernel_dsymv_2_lib4+0x32a>
push   %rbx
mov    0x28(%rsp),%eax
cmpl   $0x1,0x30(%rsp)
movsd  (%rcx),%xmm0
jne    111f <kernel_dsymv_2_lib4+0x1f>
movsd  0x8(%rcx),%xmm1
jmp    1134 <kernel_dsymv_2_lib4+0x34>
movapd 0xed9(%rip),%xmm2
xorpd  %xmm2,%xmm0
movsd  0x8(%rcx),%xmm1
xorpd  %xmm2,%xmm1
mov    0x38(%rsp),%r10d
mov    0x18(%rsp),%r11
mov    0x10(%rsp),%rcx
cmp    $0x1,%eax
jne    124e <kernel_dsymv_2_lib4+0x14e>
movsd  (%r8),%xmm2
movsd  (%rsi),%xmm3
mulsd  (%rcx),%xmm3
xorpd  %xmm4,%xmm4
movsd  %xmm2,(%r9)
movsd  0x8(%rsi),%xmm2
movapd %xmm2,%xmm5
mulsd  %xmm0,%xmm5
addsd  0x8(%r8),%xmm5
movhpd 0x28(%rsi),%xmm2
addsd  %xmm3,%xmm4
movsd  0x8(%rcx),%xmm6
unpcklpd %xmm6,%xmm6
mulpd  %xmm2,%xmm6
movq   %xmm4,%xmm3
addpd  %xmm6,%xmm3
movsd  %xmm5,0x8(%r9)
cmp    $0x2,%edi
je     13e6 <kernel_dsymv_2_lib4+0x2e6>
movsd  0x10(%rsi),%xmm2
movsd  0x30(%rsi),%xmm4
movapd %xmm2,%xmm5
mulsd  %xmm0,%xmm5
addsd  0x10(%r8),%xmm5
unpcklpd %xmm4,%xmm2
mulsd  %xmm1,%xmm4
addsd  %xmm5,%xmm4
movsd  0x10(%rcx),%xmm5
unpcklpd %xmm5,%xmm5
mulpd  %xmm2,%xmm5
addpd  %xmm5,%xmm3
movsd  %xmm4,0x10(%r9)
cmp    $0x3,%edi
je     13e6 <kernel_dsymv_2_lib4+0x2e6>
movsd  0x18(%rsi),%xmm4
movsd  0x38(%rsi),%xmm5
movapd %xmm4,%xmm2
mulsd  %xmm0,%xmm2
addsd  0x18(%r8),%xmm2
unpcklpd %xmm5,%xmm4
mulsd  %xmm1,%xmm5
addsd  %xmm2,%xmm5
movsd  0x18(%rcx),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm4,%xmm2
addpd  %xmm3,%xmm2
movsd  %xmm5,0x18(%r9)
cmp    $0x4,%edi
je     13e2 <kernel_dsymv_2_lib4+0x2e2>
add    $0x20,%r8
add    $0x20,%r9
add    $0x20,%rcx
lea    -0x4(,%rdx,4),%eax
cltq
lea    (%rsi,%rax,8),%rsi
add    $0x20,%rsi
mov    $0x4,%eax
jmp    1254 <kernel_dsymv_2_lib4+0x154>
xorpd  %xmm2,%xmm2
xor    %eax,%eax
lea    -0x3(%rdi),%ebx
cmp    %ebx,%eax
jge    137e <kernel_dsymv_2_lib4+0x27e>
shl    $0x2,%edx
movslq %edx,%rdx
shl    $0x3,%rdx
nopl   0x0(%rax)
movsd  (%rsi),%xmm3
movsd  0x20(%rsi),%xmm4
movapd %xmm3,%xmm5
mulsd  %xmm0,%xmm5
addsd  (%r8),%xmm5
unpcklpd %xmm4,%xmm3
mulsd  %xmm1,%xmm4
addsd  %xmm5,%xmm4
movsd  (%rcx),%xmm5
unpcklpd %xmm5,%xmm5
mulpd  %xmm3,%xmm5
addpd  %xmm2,%xmm5
movsd  %xmm4,(%r9)
movsd  0x8(%rsi),%xmm2
movsd  0x28(%rsi),%xmm3
movapd %xmm2,%xmm4
mulsd  %xmm0,%xmm4
addsd  0x8(%r8),%xmm4
unpcklpd %xmm3,%xmm2
mulsd  %xmm1,%xmm3
addsd  %xmm4,%xmm3
movsd  0x8(%rcx),%xmm4
unpcklpd %xmm4,%xmm4
mulpd  %xmm2,%xmm4
addpd  %xmm5,%xmm4
movsd  %xmm3,0x8(%r9)
movsd  0x10(%rsi),%xmm2
movapd %xmm2,%xmm3
mulsd  %xmm0,%xmm3
addsd  0x10(%r8),%xmm3
movsd  0x30(%rsi),%xmm5
unpcklpd %xmm5,%xmm2
mulsd  %xmm1,%xmm5
addsd  %xmm3,%xmm5
movsd  0x10(%rcx),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm2,%xmm3
addpd  %xmm4,%xmm3
movsd  %xmm5,0x10(%r9)
movsd  0x18(%rsi),%xmm2
movsd  0x38(%rsi),%xmm5
movapd %xmm2,%xmm4
mulsd  %xmm0,%xmm4
addsd  0x18(%r8),%xmm4
unpcklpd %xmm5,%xmm2
mulsd  %xmm1,%xmm5
addsd  %xmm4,%xmm5
movsd  0x18(%rcx),%xmm4
unpcklpd %xmm4,%xmm4
mulpd  %xmm2,%xmm4
movapd %xmm4,%xmm2
addpd  %xmm3,%xmm2
movsd  %xmm5,0x18(%r9)
add    $0x20,%r8
add    $0x20,%r9
add    $0x20,%rcx
add    $0x4,%eax
add    %rdx,%rsi
cmp    %ebx,%eax
jl     1270 <kernel_dsymv_2_lib4+0x170>
addpd  %xmm3,%xmm4
movapd %xmm4,%xmm2
cmp    %edi,%eax
jge    13e2 <kernel_dsymv_2_lib4+0x2e2>
sub    %eax,%edi
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
movapd %xmm2,%xmm4
movsd  (%rsi,%rax,8),%xmm2
movsd  0x20(%rsi,%rax,8),%xmm5
movapd %xmm2,%xmm3
mulsd  %xmm0,%xmm3
addsd  (%r8,%rax,8),%xmm3
unpcklpd %xmm5,%xmm2
mulsd  %xmm1,%xmm5
addsd  %xmm3,%xmm5
movsd  (%rcx,%rax,8),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm2,%xmm3
movapd %xmm3,%xmm2
addpd  %xmm4,%xmm2
movsd  %xmm5,(%r9,%rax,8)
add    $0x1,%rax
cmp    %eax,%edi
jne    1390 <kernel_dsymv_2_lib4+0x290>
addpd  %xmm4,%xmm3
jmp    13e6 <kernel_dsymv_2_lib4+0x2e6>
movapd %xmm2,%xmm3
mov    0x20(%rsp),%rax
movsd  (%r11),%xmm0
cmp    $0x1,%r10d
jne    140a <kernel_dsymv_2_lib4+0x30a>
addsd  %xmm3,%xmm0
movsd  %xmm0,(%rax)
unpckhpd %xmm3,%xmm3
addsd  0x8(%r11),%xmm3
jmp    1424 <kernel_dsymv_2_lib4+0x324>
subsd  %xmm3,%xmm0
movsd  %xmm0,(%rax)
movsd  0x8(%r11),%xmm0
unpckhpd %xmm3,%xmm3
subsd  %xmm3,%xmm0
movapd %xmm0,%xmm3
movsd  %xmm3,0x8(%rax)
pop    %rbx
ret

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

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