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) {
  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 == 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 == 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    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     113b <kernel_dsymv_2_lib4+0x3b>
jmp    194e <kernel_dsymv_2_lib4+0x84e>
movl   $0x4,-0x34(%rbp)
cmpl   $0x1,0x30(%rbp)
jne    116c <kernel_dsymv_2_lib4+0x6c>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
jmp    11b5 <kernel_dsymv_2_lib4+0xb5>
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    14ad <kernel_dsymv_2_lib4+0x3ad>
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    12cf <kernel_dsymv_2_lib4+0x1cf>
jmp    18e7 <kernel_dsymv_2_lib4+0x7e7>
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    1394 <kernel_dsymv_2_lib4+0x294>
jmp    18e7 <kernel_dsymv_2_lib4+0x7e7>
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    1459 <kernel_dsymv_2_lib4+0x359>
jmp    18e7 <kernel_dsymv_2_lib4+0x7e7>
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    14b2 <kernel_dsymv_2_lib4+0x3b2>
mov    -0x38(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    17e1 <kernel_dsymv_2_lib4+0x6e1>
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    14b2 <kernel_dsymv_2_lib4+0x3b2>
jmp    17e6 <kernel_dsymv_2_lib4+0x6e6>
mov    -0x38(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    18e2 <kernel_dsymv_2_lib4+0x7e2>
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    17e6 <kernel_dsymv_2_lib4+0x6e6>
jmp    18e7 <kernel_dsymv_2_lib4+0x7e7>
cmpl   $0x1,0x30(%rbp)
jne    1922 <kernel_dsymv_2_lib4+0x822>
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    194e <kernel_dsymv_2_lib4+0x84e>
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    0x30(%rsp),%r10d
mov    0x28(%rsp),%ebx
movsd  (%rcx),%xmm0
cmp    $0x1,%r10d
jne    1123 <kernel_dsymv_2_lib4+0x23>
movsd  0x8(%rcx),%xmm1
jmp    1138 <kernel_dsymv_2_lib4+0x38>
movapd 0xed5(%rip),%xmm2
xorpd  %xmm2,%xmm0
movsd  0x8(%rcx),%xmm1
xorpd  %xmm2,%xmm1
mov    0x18(%rsp),%r11
mov    0x10(%rsp),%rax
cmp    $0x1,%ebx
jne    124e <kernel_dsymv_2_lib4+0x14e>
movsd  (%r8),%xmm2
movsd  (%rsi),%xmm3
mulsd  (%rax),%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(%rax),%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(%rax),%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(%rax),%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,%rax
lea    -0x4(,%rdx,4),%ecx
movslq %ecx,%rcx
lea    (%rsi,%rcx,8),%rsi
add    $0x20,%rsi
mov    $0x4,%ecx
jmp    1254 <kernel_dsymv_2_lib4+0x154>
xorpd  %xmm2,%xmm2
xor    %ecx,%ecx
lea    -0x3(%rdi),%ebx
cmp    %ebx,%ecx
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  (%rax),%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(%rax),%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(%rax),%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(%rax),%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,%rax
add    $0x4,%ecx
add    %rdx,%rsi
cmp    %ebx,%ecx
jl     1270 <kernel_dsymv_2_lib4+0x170>
addpd  %xmm3,%xmm4
movapd %xmm4,%xmm2
cmp    %edi,%ecx
jge    13e2 <kernel_dsymv_2_lib4+0x2e2>
sub    %ecx,%edi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
movapd %xmm2,%xmm4
movsd  (%rsi,%rcx,8),%xmm2
movsd  0x20(%rsi,%rcx,8),%xmm5
movapd %xmm2,%xmm3
mulsd  %xmm0,%xmm3
addsd  (%r8,%rcx,8),%xmm3
unpcklpd %xmm5,%xmm2
mulsd  %xmm1,%xmm5
addsd  %xmm3,%xmm5
movsd  (%rax,%rcx,8),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm2,%xmm3
movapd %xmm3,%xmm2
addpd  %xmm4,%xmm2
movsd  %xmm5,(%r9,%rcx,8)
add    $0x1,%rcx
cmp    %ecx,%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) {
%12 = alloca i32
%13 = alloca double*
%14 = alloca i32
%15 = alloca double*
%16 = alloca double*
%17 = alloca double*
%18 = alloca double*
%19 = alloca double*
%20 = alloca double*
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca double
%26 = alloca double
%27 = alloca double
%28 = alloca double
%29 = alloca double
%30 = alloca double
%31 = alloca double
%32 = alloca double
store i32 %0, i32* %12
store double* %1, double** %13
store i32 %2, i32* %14
store double* %3, double** %15
store double* %4, double** %16
store double* %5, double** %17
store double* %6, double** %18
store double* %7, double** %19
store double* %8, double** %20
store i32 %9, i32* %21
store i32 %10, i32* %22
%33 = load i32, i32* %12
%34 = icmp sle i32 %33, 0
br i1 %34, label %35, label %36
35: ; preds = %11
br label %419
36: ; preds = %11
store i32 4, i32* %23
%37 = load i32, i32* %22
%38 = icmp eq i32 %37, 1
br i1 %38, label %39, label %46
39: ; preds = %36
%40 = load double*, double** %15
%41 = getelementptr inbounds double, double* %40, i64 0
%42 = load double, double* %41
store double %42, double* %27
%43 = load double*, double** %15
%44 = getelementptr inbounds double, double* %43, i64 1
%45 = load double, double* %44
store double %45, double* %28
br label %55
46: ; preds = %36
%47 = load double*, double** %15
%48 = getelementptr inbounds double, double* %47, i64 0
%49 = load double, double* %48
%50 = fneg double %49
store double %50, double* %27
%51 = load double*, double** %15
%52 = getelementptr inbounds double, double* %51, i64 1
%53 = load double, double* %52
%54 = fneg double %53
store double %54, double* %28
br label %55
55: ; preds = %46, %39
store double 0.000000e+00, double* %31
store double 0.000000e+00, double* %32
store i32 0, i32* %24
%56 = load i32, i32* %21
%57 = icmp eq i32 %56, 1
br i1 %57, label %58, label %192
58: ; preds = %55
%59 = load double*, double** %16
%60 = getelementptr inbounds double, double* %59, i64 0
%61 = load double, double* %60
store double %61, double* %29
%62 = load double*, double** %18
%63 = getelementptr inbounds double, double* %62, i64 0
%64 = load double, double* %63
store double %64, double* %30
%65 = load double*, double** %13
%66 = getelementptr inbounds double, double* %65, i64 0
%67 = load double, double* %66
store double %67, double* %25
%68 = load double, double* %25
%69 = load double, double* %30
%70 = load double, double* %31
%71 = call double @llvm.fmuladd.f64(double %68, double %69, double %70)
store double %71, double* %31
%72 = load double, double* %29
%73 = load double*, double** %17
%74 = getelementptr inbounds double, double* %73, i64 0
store double %72, double* %74
%75 = load double*, double** %16
%76 = getelementptr inbounds double, double* %75, i64 1
%77 = load double, double* %76
store double %77, double* %29
%78 = load double*, double** %18
%79 = getelementptr inbounds double, double* %78, i64 1
%80 = load double, double* %79
store double %80, double* %30
%81 = load double*, double** %13
%82 = getelementptr inbounds double, double* %81, i64 1
%83 = load double, double* %82
store double %83, double* %25
%84 = load double*, double** %13
%85 = getelementptr inbounds double, double* %84, i64 5
%86 = load double, double* %85
store double %86, double* %26
%87 = load double, double* %25
%88 = load double, double* %27
%89 = load double, double* %29
%90 = call double @llvm.fmuladd.f64(double %87, double %88, double %89)
store double %90, double* %29
%91 = load double, double* %25
%92 = load double, double* %30
%93 = load double, double* %31
%94 = call double @llvm.fmuladd.f64(double %91, double %92, double %93)
store double %94, double* %31
%95 = load double, double* %26
%96 = load double, double* %30
%97 = load double, double* %32
%98 = call double @llvm.fmuladd.f64(double %95, double %96, double %97)
store double %98, double* %32
%99 = load double, double* %29
%100 = load double*, double** %17
%101 = getelementptr inbounds double, double* %100, i64 1
store double %99, double* %101
%102 = load i32, i32* %12
%103 = icmp eq i32 %102, 2
br i1 %103, label %104, label %105
104: ; preds = %58
br label %386
105: ; preds = %58
%106 = load double*, double** %16
%107 = getelementptr inbounds double, double* %106, i64 2
%108 = load double, double* %107
store double %108, double* %29
%109 = load double*, double** %18
%110 = getelementptr inbounds double, double* %109, i64 2
%111 = load double, double* %110
store double %111, double* %30
%112 = load double*, double** %13
%113 = getelementptr inbounds double, double* %112, i64 2
%114 = load double, double* %113
store double %114, double* %25
%115 = load double*, double** %13
%116 = getelementptr inbounds double, double* %115, i64 6
%117 = load double, double* %116
store double %117, double* %26
%118 = load double, double* %25
%119 = load double, double* %27
%120 = load double, double* %29
%121 = call double @llvm.fmuladd.f64(double %118, double %119, double %120)
store double %121, double* %29
%122 = load double, double* %25
%123 = load double, double* %30
%124 = load double, double* %31
%125 = call double @llvm.fmuladd.f64(double %122, double %123, double %124)
store double %125, double* %31
%126 = load double, double* %26
%127 = load double, double* %28
%128 = load double, double* %29
%129 = call double @llvm.fmuladd.f64(double %126, double %127, double %128)
store double %129, double* %29
%130 = load double, double* %26
%131 = load double, double* %30
%132 = load double, double* %32
%133 = call double @llvm.fmuladd.f64(double %130, double %131, double %132)
store double %133, double* %32
%134 = load double, double* %29
%135 = load double*, double** %17
%136 = getelementptr inbounds double, double* %135, i64 2
store double %134, double* %136
%137 = load i32, i32* %12
%138 = icmp eq i32 %137, 3
br i1 %138, label %139, label %140
139: ; preds = %105
br label %386
140: ; preds = %105
%141 = load double*, double** %16
%142 = getelementptr inbounds double, double* %141, i64 3
%143 = load double, double* %142
store double %143, double* %29
%144 = load double*, double** %18
%145 = getelementptr inbounds double, double* %144, i64 3
%146 = load double, double* %145
store double %146, double* %30
%147 = load double*, double** %13
%148 = getelementptr inbounds double, double* %147, i64 3
%149 = load double, double* %148
store double %149, double* %25
%150 = load double*, double** %13
%151 = getelementptr inbounds double, double* %150, i64 7
%152 = load double, double* %151
store double %152, double* %26
%153 = load double, double* %25
%154 = load double, double* %27
%155 = load double, double* %29
%156 = call double @llvm.fmuladd.f64(double %153, double %154, double %155)
store double %156, double* %29
%157 = load double, double* %25
%158 = load double, double* %30
%159 = load double, double* %31
%160 = call double @llvm.fmuladd.f64(double %157, double %158, double %159)
store double %160, double* %31
%161 = load double, double* %26
%162 = load double, double* %28
%163 = load double, double* %29
%164 = call double @llvm.fmuladd.f64(double %161, double %162, double %163)
store double %164, double* %29
%165 = load double, double* %26
%166 = load double, double* %30
%167 = load double, double* %32
%168 = call double @llvm.fmuladd.f64(double %165, double %166, double %167)
store double %168, double* %32
%169 = load double, double* %29
%170 = load double*, double** %17
%171 = getelementptr inbounds double, double* %170, i64 3
store double %169, double* %171
%172 = load i32, i32* %12
%173 = icmp eq i32 %172, 4
br i1 %173, label %174, label %175
174: ; preds = %140
br label %386
175: ; preds = %140
%176 = load double*, double** %13
%177 = getelementptr inbounds double, double* %176, i64 4
store double* %177, double** %13
%178 = load double*, double** %16
%179 = getelementptr inbounds double, double* %178, i64 4
store double* %179, double** %16
%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 i32, i32* %24
%185 = add nsw i32 %184, 4
store i32 %185, i32* %24
%186 = load i32, i32* %14
%187 = sub nsw i32 %186, 1
%188 = mul nsw i32 %187, 4
%189 = load double*, double** %13
%190 = sext i32 %188 to i64
%191 = getelementptr inbounds double, double* %189, i64 %190
store double* %191, double** %13
br label %192
192: ; preds = %175, %55
br label %193
193: ; preds = %334, %192
%194 = load i32, i32* %24
%195 = load i32, i32* %12
%196 = sub nsw i32 %195, 3
%197 = icmp slt i32 %194, %196
br i1 %197, label %198, label %337
198: ; preds = %193
%199 = load double*, double** %16
%200 = getelementptr inbounds double, double* %199, i64 0
%201 = load double, double* %200
store double %201, double* %29
%202 = load double*, double** %18
%203 = getelementptr inbounds double, double* %202, i64 0
%204 = load double, double* %203
store double %204, double* %30
%205 = load double*, double** %13
%206 = getelementptr inbounds double, double* %205, i64 0
%207 = load double, double* %206
store double %207, double* %25
%208 = load double*, double** %13
%209 = getelementptr inbounds double, double* %208, i64 4
%210 = load double, double* %209
store double %210, double* %26
%211 = load double, double* %25
%212 = load double, double* %27
%213 = load double, double* %29
%214 = call double @llvm.fmuladd.f64(double %211, double %212, double %213)
store double %214, double* %29
%215 = load double, double* %25
%216 = load double, double* %30
%217 = load double, double* %31
%218 = call double @llvm.fmuladd.f64(double %215, double %216, double %217)
store double %218, double* %31
%219 = load double, double* %26
%220 = load double, double* %28
%221 = load double, double* %29
%222 = call double @llvm.fmuladd.f64(double %219, double %220, double %221)
store double %222, double* %29
%223 = load double, double* %26
%224 = load double, double* %30
%225 = load double, double* %32
%226 = call double @llvm.fmuladd.f64(double %223, double %224, double %225)
store double %226, double* %32
%227 = load double, double* %29
%228 = load double*, double** %17
%229 = getelementptr inbounds double, double* %228, i64 0
store double %227, double* %229
%230 = load double*, double** %16
%231 = getelementptr inbounds double, double* %230, i64 1
%232 = load double, double* %231
store double %232, double* %29
%233 = load double*, double** %18
%234 = getelementptr inbounds double, double* %233, i64 1
%235 = load double, double* %234
store double %235, double* %30
%236 = load double*, double** %13
%237 = getelementptr inbounds double, double* %236, i64 1
%238 = load double, double* %237
store double %238, double* %25
%239 = load double*, double** %13
%240 = getelementptr inbounds double, double* %239, i64 5
%241 = load double, double* %240
store double %241, double* %26
%242 = load double, double* %25
%243 = load double, double* %27
%244 = load double, double* %29
%245 = call double @llvm.fmuladd.f64(double %242, double %243, double %244)
store double %245, double* %29
%246 = load double, double* %25
%247 = load double, double* %30
%248 = load double, double* %31
%249 = call double @llvm.fmuladd.f64(double %246, double %247, double %248)
store double %249, double* %31
%250 = load double, double* %26
%251 = load double, double* %28
%252 = load double, double* %29
%253 = call double @llvm.fmuladd.f64(double %250, double %251, double %252)
store double %253, double* %29
%254 = load double, double* %26
%255 = load double, double* %30
%256 = load double, double* %32
%257 = call double @llvm.fmuladd.f64(double %254, double %255, double %256)
store double %257, double* %32
%258 = load double, double* %29
%259 = load double*, double** %17
%260 = getelementptr inbounds double, double* %259, i64 1
store double %258, double* %260
%261 = load double*, double** %16
%262 = getelementptr inbounds double, double* %261, i64 2
%263 = load double, double* %262
store double %263, double* %29
%264 = load double*, double** %18
%265 = getelementptr inbounds double, double* %264, i64 2
%266 = load double, double* %265
store double %266, double* %30
%267 = load double*, double** %13
%268 = getelementptr inbounds double, double* %267, i64 2
%269 = load double, double* %268
store double %269, double* %25
%270 = load double*, double** %13
%271 = getelementptr inbounds double, double* %270, i64 6
%272 = load double, double* %271
store double %272, double* %26
%273 = load double, double* %25
%274 = load double, double* %27
%275 = load double, double* %29
%276 = call double @llvm.fmuladd.f64(double %273, double %274, double %275)
store double %276, double* %29
%277 = load double, double* %25
%278 = load double, double* %30
%279 = load double, double* %31
%280 = call double @llvm.fmuladd.f64(double %277, double %278, double %279)
store double %280, double* %31
%281 = load double, double* %26
%282 = load double, double* %28
%283 = load double, double* %29
%284 = call double @llvm.fmuladd.f64(double %281, double %282, double %283)
store double %284, double* %29
%285 = load double, double* %26
%286 = load double, double* %30
%287 = load double, double* %32
%288 = call double @llvm.fmuladd.f64(double %285, double %286, double %287)
store double %288, double* %32
%289 = load double, double* %29
%290 = load double*, double** %17
%291 = getelementptr inbounds double, double* %290, i64 2
store double %289, double* %291
%292 = load double*, double** %16
%293 = getelementptr inbounds double, double* %292, i64 3
%294 = load double, double* %293
store double %294, double* %29
%295 = load double*, double** %18
%296 = getelementptr inbounds double, double* %295, i64 3
%297 = load double, double* %296
store double %297, double* %30
%298 = load double*, double** %13
%299 = getelementptr inbounds double, double* %298, i64 3
%300 = load double, double* %299
store double %300, double* %25
%301 = load double*, double** %13
%302 = getelementptr inbounds double, double* %301, i64 7
%303 = load double, double* %302
store double %303, double* %26
%304 = load double, double* %25
%305 = load double, double* %27
%306 = load double, double* %29
%307 = call double @llvm.fmuladd.f64(double %304, double %305, double %306)
store double %307, double* %29
%308 = load double, double* %25
%309 = load double, double* %30
%310 = load double, double* %31
%311 = call double @llvm.fmuladd.f64(double %308, double %309, double %310)
store double %311, double* %31
%312 = load double, double* %26
%313 = load double, double* %28
%314 = load double, double* %29
%315 = call double @llvm.fmuladd.f64(double %312, double %313, double %314)
store double %315, double* %29
%316 = load double, double* %26
%317 = load double, double* %30
%318 = load double, double* %32
%319 = call double @llvm.fmuladd.f64(double %316, double %317, double %318)
store double %319, double* %32
%320 = load double, double* %29
%321 = load double*, double** %17
%322 = getelementptr inbounds double, double* %321, i64 3
store double %320, double* %322
%323 = load i32, i32* %14
%324 = mul nsw i32 %323, 4
%325 = load double*, double** %13
%326 = sext i32 %324 to i64
%327 = getelementptr inbounds double, double* %325, i64 %326
store double* %327, double** %13
%328 = load double*, double** %16
%329 = getelementptr inbounds double, double* %328, i64 4
store double* %329, double** %16
%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
br label %334
334: ; preds = %198
%335 = load i32, i32* %24
%336 = add nsw i32 %335, 4
store i32 %336, i32* %24
br label %193
337: ; preds = %193
br label %338
338: ; preds = %382, %337
%339 = load i32, i32* %24
%340 = load i32, i32* %12
%341 = icmp slt i32 %339, %340
br i1 %341, label %342, label %385
342: ; preds = %338
%343 = load double*, double** %16
%344 = getelementptr inbounds double, double* %343, i64 0
%345 = load double, double* %344
store double %345, double* %29
%346 = load double*, double** %18
%347 = getelementptr inbounds double, double* %346, i64 0
%348 = load double, double* %347
store double %348, double* %30
%349 = load double*, double** %13
%350 = getelementptr inbounds double, double* %349, i64 0
%351 = load double, double* %350
store double %351, double* %25
%352 = load double*, double** %13
%353 = getelementptr inbounds double, double* %352, i64 4
%354 = load double, double* %353
store double %354, double* %26
%355 = load double, double* %25
%356 = load double, double* %27
%357 = load double, double* %29
%358 = call double @llvm.fmuladd.f64(double %355, double %356, double %357)
store double %358, double* %29
%359 = load double, double* %25
%360 = load double, double* %30
%361 = load double, double* %31
%362 = call double @llvm.fmuladd.f64(double %359, double %360, double %361)
store double %362, double* %31
%363 = load double, double* %26
%364 = load double, double* %28
%365 = load double, double* %29
%366 = call double @llvm.fmuladd.f64(double %363, double %364, double %365)
store double %366, double* %29
%367 = load double, double* %26
%368 = load double, double* %30
%369 = load double, double* %32
%370 = call double @llvm.fmuladd.f64(double %367, double %368, double %369)
store double %370, double* %32
%371 = load double, double* %29
%372 = load double*, double** %17
%373 = getelementptr inbounds double, double* %372, i64 0
store double %371, double* %373
%374 = load double*, double** %13
%375 = getelementptr inbounds double, double* %374, i64 1
store double* %375, double** %13
%376 = load double*, double** %16
%377 = getelementptr inbounds double, double* %376, i64 1
store double* %377, double** %16
%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
br label %382
382: ; preds = %342
%383 = load i32, i32* %24
%384 = add nsw i32 %383, 1
store i32 %384, i32* %24
br label %338
385: ; preds = %338
br label %386
386: ; preds = %385, %174, %139, %104
%387 = load i32, i32* %22
%388 = icmp eq i32 %387, 1
br i1 %388, label %389, label %404
389: ; preds = %386
%390 = load double*, double** %19
%391 = getelementptr inbounds double, double* %390, i64 0
%392 = load double, double* %391
%393 = load double, double* %31
%394 = fadd double %392, %393
%395 = load double*, double** %20
%396 = getelementptr inbounds double, double* %395, i64 0
store double %394, double* %396
%397 = load double*, double** %19
%398 = getelementptr inbounds double, double* %397, i64 1
%399 = load double, double* %398
%400 = load double, double* %32
%401 = fadd double %399, %400
%402 = load double*, double** %20
%403 = getelementptr inbounds double, double* %402, i64 1
store double %401, double* %403
br label %419
404: ; preds = %386
%405 = load double*, double** %19
%406 = getelementptr inbounds double, double* %405, i64 0
%407 = load double, double* %406
%408 = load double, double* %31
%409 = fsub double %407, %408
%410 = load double*, double** %20
%411 = getelementptr inbounds double, double* %410, i64 0
store double %409, double* %411
%412 = load double*, double** %19
%413 = getelementptr inbounds double, double* %412, i64 1
%414 = load double, double* %413
%415 = load double, double* %32
%416 = fsub double %414, %415
%417 = load double*, double** %20
%418 = getelementptr inbounds double, double* %417, i64 1
store double %416, double* %418
br label %419
419: ; preds = %35, %404, %389
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) {
%12 = icmp slt i32 %0, 1
br i1 %12, label %240, label %13
13: ; preds = %11
%14 = icmp eq i32 %10, 1
%15 = load double, double* %3
br i1 %14, label %16, label %19
16: ; preds = %13
%17 = getelementptr inbounds double, double* %3, i64 1
%18 = load double, double* %17
br label %24
19: ; preds = %13
%20 = fneg double %15
%21 = getelementptr inbounds double, double* %3, i64 1
%22 = load double, double* %21
%23 = fneg double %22
br label %24
24: ; preds = %19, %16
%25 = phi double [ %15, %16 ], [ %20, %19 ]
%26 = phi double [ %18, %16 ], [ %23, %19 ]
%27 = icmp eq i32 %9, 1
br i1 %27, label %28, label %95
28: ; preds = %24
%29 = load double, double* %4
%30 = load double, double* %6
%31 = load double, double* %1
%32 = tail call double @llvm.fmuladd.f64(double %31, double %30, double 0.000000e+00)
store double %29, double* %5
%33 = getelementptr inbounds double, double* %4, i64 1
%34 = load double, double* %33
%35 = getelementptr inbounds double, double* %6, i64 1
%36 = load double, double* %35
%37 = getelementptr inbounds double, double* %1, i64 1
%38 = load double, double* %37
%39 = getelementptr inbounds double, double* %1, i64 5
%40 = load double, double* %39
%41 = tail call double @llvm.fmuladd.f64(double %38, double %25, double %34)
%42 = insertelement <2 x double> poison, double %38, i64 0
%43 = insertelement <2 x double> %42, double %40, i64 1
%44 = insertelement <2 x double> poison, double %36, i64 0
%45 = shufflevector <2 x double> %44, <2 x double> poison, <2 x i32> zeroinitializer
%46 = insertelement <2 x double> <double poison, double 0.000000e+00>, double %32, i64 0
%47 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %43, <2 x double> %45, <2 x double> %46)
%48 = getelementptr inbounds double, double* %5, i64 1
store double %41, double* %48
%49 = icmp eq i32 %0, 2
br i1 %49, label %220, label %50
50: ; preds = %28
%51 = getelementptr inbounds double, double* %4, i64 2
%52 = load double, double* %51
%53 = getelementptr inbounds double, double* %6, i64 2
%54 = load double, double* %53
%55 = getelementptr inbounds double, double* %1, i64 2
%56 = load double, double* %55
%57 = getelementptr inbounds double, double* %1, i64 6
%58 = load double, double* %57
%59 = tail call double @llvm.fmuladd.f64(double %56, double %25, double %52)
%60 = tail call double @llvm.fmuladd.f64(double %58, double %26, double %59)
%61 = insertelement <2 x double> poison, double %56, i64 0
%62 = insertelement <2 x double> %61, double %58, i64 1
%63 = insertelement <2 x double> poison, double %54, i64 0
%64 = shufflevector <2 x double> %63, <2 x double> poison, <2 x i32> zeroinitializer
%65 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %62, <2 x double> %64, <2 x double> %47)
%66 = getelementptr inbounds double, double* %5, i64 2
store double %60, double* %66
%67 = icmp eq i32 %0, 3
br i1 %67, label %220, label %68
68: ; preds = %50
%69 = getelementptr inbounds double, double* %4, i64 3
%70 = load double, double* %69
%71 = getelementptr inbounds double, double* %6, i64 3
%72 = load double, double* %71
%73 = getelementptr inbounds double, double* %1, i64 3
%74 = load double, double* %73
%75 = getelementptr inbounds double, double* %1, i64 7
%76 = load double, double* %75
%77 = tail call double @llvm.fmuladd.f64(double %74, double %25, double %70)
%78 = tail call double @llvm.fmuladd.f64(double %76, double %26, double %77)
%79 = insertelement <2 x double> poison, double %74, i64 0
%80 = insertelement <2 x double> %79, double %76, i64 1
%81 = insertelement <2 x double> poison, double %72, i64 0
%82 = shufflevector <2 x double> %81, <2 x double> poison, <2 x i32> zeroinitializer
%83 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %80, <2 x double> %82, <2 x double> %65)
%84 = getelementptr inbounds double, double* %5, i64 3
store double %78, double* %84
%85 = icmp eq i32 %0, 4
br i1 %85, label %220, label %86
86: ; preds = %68
%87 = getelementptr inbounds double, double* %1, i64 4
%88 = getelementptr inbounds double, double* %4, i64 4
%89 = getelementptr inbounds double, double* %5, i64 4
%90 = getelementptr inbounds double, double* %6, i64 4
%91 = shl i32 %2, 2
%92 = add i32 %91, -4
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds double, double* %87, i64 %93
br label %95
95: ; preds = %86, %24
%96 = phi double* [ %90, %86 ], [ %6, %24 ]
%97 = phi double* [ %89, %86 ], [ %5, %24 ]
%98 = phi double* [ %88, %86 ], [ %4, %24 ]
%99 = phi double* [ %94, %86 ], [ %1, %24 ]
%100 = phi i32 [ 4, %86 ], [ 0, %24 ]
%101 = phi <2 x double> [ %83, %86 ], [ zeroinitializer, %24 ]
%102 = add nsw i32 %0, -3
%103 = icmp slt i32 %100, %102
br i1 %103, label %104, label %112
104: ; preds = %95
%105 = shl nsw i32 %2, 2
%106 = sext i32 %105 to i64
br label %120
107: ; preds = %120
%108 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %135, <2 x double> %137, <2 x double> %126)
%109 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %150, <2 x double> %152, <2 x double> %108)
%110 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %166, <2 x double> %168, <2 x double> %109)
%111 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %182, <2 x double> %184, <2 x double> %110)
br label %112
112: ; preds = %107, %95
%113 = phi double* [ %96, %95 ], [ %190, %107 ]
%114 = phi double* [ %97, %95 ], [ %189, %107 ]
%115 = phi double* [ %98, %95 ], [ %188, %107 ]
%116 = phi double* [ %99, %95 ], [ %187, %107 ]
%117 = phi i32 [ %100, %95 ], [ %191, %107 ]
%118 = phi <2 x double> [ %101, %95 ], [ %111, %107 ]
%119 = icmp slt i32 %117, %0
br i1 %119, label %193, label %220
120: ; preds = %104, %120
%121 = phi i32 [ %100, %104 ], [ %191, %120 ]
%122 = phi double* [ %99, %104 ], [ %187, %120 ]
%123 = phi double* [ %98, %104 ], [ %188, %120 ]
%124 = phi double* [ %97, %104 ], [ %189, %120 ]
%125 = phi double* [ %96, %104 ], [ %190, %120 ]
%126 = phi <2 x double> [ %101, %104 ], [ %185, %120 ]
%127 = load double, double* %123
%128 = load double, double* %125
%129 = load double, double* %122
%130 = getelementptr inbounds double, double* %122, i64 4
%131 = load double, double* %130
%132 = tail call double @llvm.fmuladd.f64(double %129, double %25, double %127)
%133 = tail call double @llvm.fmuladd.f64(double %131, double %26, double %132)
%134 = insertelement <2 x double> poison, double %129, i64 0
%135 = insertelement <2 x double> %134, double %131, i64 1
%136 = insertelement <2 x double> poison, double %128, i64 0
%137 = shufflevector <2 x double> %136, <2 x double> poison, <2 x i32> zeroinitializer
%138 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %135, <2 x double> %137, <2 x double> %126)
store double %133, double* %124
%139 = getelementptr inbounds double, double* %123, i64 1
%140 = load double, double* %139
%141 = getelementptr inbounds double, double* %125, i64 1
%142 = load double, double* %141
%143 = getelementptr inbounds double, double* %122, i64 1
%144 = load double, double* %143
%145 = getelementptr inbounds double, double* %122, i64 5
%146 = load double, double* %145
%147 = tail call double @llvm.fmuladd.f64(double %144, double %25, double %140)
%148 = tail call double @llvm.fmuladd.f64(double %146, double %26, double %147)
%149 = insertelement <2 x double> poison, double %144, i64 0
%150 = insertelement <2 x double> %149, double %146, i64 1
%151 = insertelement <2 x double> poison, double %142, i64 0
%152 = shufflevector <2 x double> %151, <2 x double> poison, <2 x i32> zeroinitializer
%153 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %150, <2 x double> %152, <2 x double> %138)
%154 = getelementptr inbounds double, double* %124, i64 1
store double %148, double* %154
%155 = getelementptr inbounds double, double* %123, i64 2
%156 = load double, double* %155
%157 = getelementptr inbounds double, double* %125, i64 2
%158 = load double, double* %157
%159 = getelementptr inbounds double, double* %122, i64 2
%160 = load double, double* %159
%161 = getelementptr inbounds double, double* %122, i64 6
%162 = load double, double* %161
%163 = tail call double @llvm.fmuladd.f64(double %160, double %25, double %156)
%164 = tail call double @llvm.fmuladd.f64(double %162, double %26, double %163)
%165 = insertelement <2 x double> poison, double %160, i64 0
%166 = insertelement <2 x double> %165, double %162, i64 1
%167 = insertelement <2 x double> poison, double %158, i64 0
%168 = shufflevector <2 x double> %167, <2 x double> poison, <2 x i32> zeroinitializer
%169 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %166, <2 x double> %168, <2 x double> %153)
%170 = getelementptr inbounds double, double* %124, i64 2
store double %164, double* %170
%171 = getelementptr inbounds double, double* %123, i64 3
%172 = load double, double* %171
%173 = getelementptr inbounds double, double* %125, i64 3
%174 = load double, double* %173
%175 = getelementptr inbounds double, double* %122, i64 3
%176 = load double, double* %175
%177 = getelementptr inbounds double, double* %122, i64 7
%178 = load double, double* %177
%179 = tail call double @llvm.fmuladd.f64(double %176, double %25, double %172)
%180 = tail call double @llvm.fmuladd.f64(double %178, double %26, double %179)
%181 = insertelement <2 x double> poison, double %176, i64 0
%182 = insertelement <2 x double> %181, double %178, i64 1
%183 = insertelement <2 x double> poison, double %174, i64 0
%184 = shufflevector <2 x double> %183, <2 x double> poison, <2 x i32> zeroinitializer
%185 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %182, <2 x double> %184, <2 x double> %169)
%186 = getelementptr inbounds double, double* %124, i64 3
store double %180, double* %186
%187 = getelementptr inbounds double, double* %122, i64 %106
%188 = getelementptr inbounds double, double* %123, i64 4
%189 = getelementptr inbounds double, double* %124, i64 4
%190 = getelementptr inbounds double, double* %125, i64 4
%191 = add nuw nsw i32 %121, 4
%192 = icmp slt i32 %191, %102
br i1 %192, label %120, label %107
193: ; preds = %112, %193
%194 = phi i32 [ %216, %193 ], [ %117, %112 ]
%195 = phi double* [ %212, %193 ], [ %116, %112 ]
%196 = phi double* [ %213, %193 ], [ %115, %112 ]
%197 = phi double* [ %214, %193 ], [ %114, %112 ]
%198 = phi double* [ %215, %193 ], [ %113, %112 ]
%199 = phi <2 x double> [ %211, %193 ], [ %118, %112 ]
%200 = load double, double* %196
%201 = load double, double* %198
%202 = load double, double* %195
%203 = getelementptr inbounds double, double* %195, i64 4
%204 = load double, double* %203
%205 = tail call double @llvm.fmuladd.f64(double %202, double %25, double %200)
%206 = tail call double @llvm.fmuladd.f64(double %204, double %26, double %205)
%207 = insertelement <2 x double> poison, double %202, i64 0
%208 = insertelement <2 x double> %207, double %204, i64 1
%209 = insertelement <2 x double> poison, double %201, i64 0
%210 = shufflevector <2 x double> %209, <2 x double> poison, <2 x i32> zeroinitializer
%211 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %208, <2 x double> %210, <2 x double> %199)
store double %206, double* %197
%212 = getelementptr inbounds double, double* %195, i64 1
%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 = add nuw nsw i32 %194, 1
%217 = icmp eq i32 %216, %0
br i1 %217, label %218, label %193
218: ; preds = %193
%219 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %208, <2 x double> %210, <2 x double> %199)
br label %220
220: ; preds = %218, %112, %68, %50, %28
%221 = phi <2 x double> [ %47, %28 ], [ %65, %50 ], [ %83, %68 ], [ %118, %112 ], [ %219, %218 ]
%222 = load double, double* %7
br i1 %14, label %223, label %230
223: ; preds = %220
%224 = extractelement <2 x double> %221, i64 0
%225 = fadd double %224, %222
store double %225, double* %8
%226 = getelementptr inbounds double, double* %7, i64 1
%227 = load double, double* %226
%228 = extractelement <2 x double> %221, i64 1
%229 = fadd double %228, %227
br label %237
230: ; preds = %220
%231 = extractelement <2 x double> %221, i64 0
%232 = fsub double %222, %231
store double %232, double* %8
%233 = getelementptr inbounds double, double* %7, i64 1
%234 = load double, double* %233
%235 = extractelement <2 x double> %221, i64 1
%236 = fsub double %234, %235
br label %237
237: ; preds = %230, %223
%238 = phi double [ %229, %223 ], [ %236, %230 ]
%239 = getelementptr inbounds double, double* %8, i64 1
store double %238, double* %239
br label %240
240: ; preds = %237, %11
ret void
}