void kernel_dtrmv_u_t_4_lib4(int kmax, double *A, int sda, double *x, double *y,
                             int alg) {
  __builtin_prefetch(A);
  __builtin_prefetch(A + 8);
  const int lda = 4;
  const int bs = 4;
  int k;
  double x_0, x_1, x_2, x_3, y_0 = 0, y_1 = 0, y_2 = 0, y_3 = 0;
  k = 0;
  for (; k < kmax - 7; k += 8) {
    __builtin_prefetch(A + sda * bs);
    __builtin_prefetch(A + sda * bs + 8);
    x_0 = x[0];
    x_1 = x[1];
    x_2 = x[2];
    x_3 = x[3];
    y_0 += A[0 + lda * 0] * x_0;
    y_1 += A[0 + lda * 1] * x_0;
    y_2 += A[0 + lda * 2] * x_0;
    y_3 += A[0 + lda * 3] * x_0;
    y_0 += A[1 + lda * 0] * x_1;
    y_1 += A[1 + lda * 1] * x_1;
    y_2 += A[1 + lda * 2] * x_1;
    y_3 += A[1 + lda * 3] * x_1;
    y_0 += A[2 + lda * 0] * x_2;
    y_1 += A[2 + lda * 1] * x_2;
    y_2 += A[2 + lda * 2] * x_2;
    y_3 += A[2 + lda * 3] * x_2;
    y_0 += A[3 + lda * 0] * x_3;
    y_1 += A[3 + lda * 1] * x_3;
    y_2 += A[3 + lda * 2] * x_3;
    y_3 += A[3 + lda * 3] * x_3;
    A += sda * bs;
    x += 4;
    __builtin_prefetch(A + sda * bs);
    __builtin_prefetch(A + sda * bs + 8);
    x_0 = x[0];
    x_1 = x[1];
    x_2 = x[2];
    x_3 = x[3];
    y_0 += A[0 + lda * 0] * x_0;
    y_1 += A[0 + lda * 1] * x_0;
    y_2 += A[0 + lda * 2] * x_0;
    y_3 += A[0 + lda * 3] * x_0;
    y_0 += A[1 + lda * 0] * x_1;
    y_1 += A[1 + lda * 1] * x_1;
    y_2 += A[1 + lda * 2] * x_1;
    y_3 += A[1 + lda * 3] * x_1;
    y_0 += A[2 + lda * 0] * x_2;
    y_1 += A[2 + lda * 1] * x_2;
    y_2 += A[2 + lda * 2] * x_2;
    y_3 += A[2 + lda * 3] * x_2;
    y_0 += A[3 + lda * 0] * x_3;
    y_1 += A[3 + lda * 1] * x_3;
    y_2 += A[3 + lda * 2] * x_3;
    y_3 += A[3 + lda * 3] * x_3;
    A += sda * bs;
    x += 4;
  }
  for (; k < kmax - 3; k += 4) {
    __builtin_prefetch(A + sda * bs);
    __builtin_prefetch(A + sda * bs + 8);
    x_0 = x[0];
    x_1 = x[1];
    x_2 = x[2];
    x_3 = x[3];
    y_0 += A[0 + lda * 0] * x_0;
    y_1 += A[0 + lda * 1] * x_0;
    y_2 += A[0 + lda * 2] * x_0;
    y_3 += A[0 + lda * 3] * x_0;
    y_0 += A[1 + lda * 0] * x_1;
    y_1 += A[1 + lda * 1] * x_1;
    y_2 += A[1 + lda * 2] * x_1;
    y_3 += A[1 + lda * 3] * x_1;
    y_0 += A[2 + lda * 0] * x_2;
    y_1 += A[2 + lda * 1] * x_2;
    y_2 += A[2 + lda * 2] * x_2;
    y_3 += A[2 + lda * 3] * x_2;
    y_0 += A[3 + lda * 0] * x_3;
    y_1 += A[3 + lda * 1] * x_3;
    y_2 += A[3 + lda * 2] * x_3;
    y_3 += A[3 + lda * 3] * x_3;
    A += sda * bs;
    x += 4;
  }
  x_0 = x[0];
  x_1 = x[1];
  x_2 = x[2];
  x_3 = x[3];
  y_0 += A[0 + lda * 0] * x_0;
  y_1 += A[0 + lda * 1] * x_0;
  y_2 += A[0 + lda * 2] * x_0;
  y_3 += A[0 + lda * 3] * x_0;
  y_1 += A[1 + lda * 1] * x_1;
  y_2 += A[1 + lda * 2] * x_1;
  y_3 += A[1 + lda * 3] * x_1;
  y_2 += A[2 + lda * 2] * x_2;
  y_3 += A[2 + lda * 3] * x_2;
  y_3 += A[3 + lda * 3] * x_3;
  A += sda * bs;
  x += 4;
  if (alg == 0) {
    y[0] = y_0;
    y[1] = y_1;
    y[2] = y_2;
    y[3] = y_3;
  } else if (alg == 1) {
    y[0] += y_0;
    y[1] += y_1;
    y[2] += y_2;
    y[3] += y_3;
  } else {
    y[0] -= y_0;
    y[1] -= y_1;
    y[2] -= y_2;
    y[3] -= y_3;
  }
}


x86 assembly (clang, -O0):
<kernel_dtrmv_u_t_4_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
add    $0x40,%rax
prefetcht0 (%rax)
movl   $0x4,-0x30(%rbp)
movl   $0x4,-0x34(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x60(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
movl   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x7,%ecx
cmp    %ecx,%eax
jge    1698 <kernel_dtrmv_u_t_4_lib4+0x598>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
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    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
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    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x38(%rbp),%eax
add    $0x8,%eax
mov    %eax,-0x38(%rbp)
jmp    1161 <kernel_dtrmv_u_t_4_lib4+0x61>
jmp    169d <kernel_dtrmv_u_t_4_lib4+0x59d>
mov    -0x38(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1948 <kernel_dtrmv_u_t_4_lib4+0x848>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
prefetcht0 (%rax)
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0x40,%rax
prefetcht0 (%rax)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
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    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x38(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x38(%rbp)
jmp    169d <kernel_dtrmv_u_t_4_lib4+0x59d>
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x60(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  -0x40(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
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    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jne    1b28 <kernel_dtrmv_u_t_4_lib4+0xa28>
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x70(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x78(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x18(%rax)
jmp    1be0 <kernel_dtrmv_u_t_4_lib4+0xae0>
cmpl   $0x1,-0x2c(%rbp)
jne    1b81 <kernel_dtrmv_u_t_4_lib4+0xa81>
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
addsd  (%rax),%xmm0
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
addsd  0x8(%rax),%xmm0
movsd  %xmm0,0x8(%rax)
movsd  -0x70(%rbp),%xmm0
mov    -0x28(%rbp),%rax
addsd  0x10(%rax),%xmm0
movsd  %xmm0,0x10(%rax)
movsd  -0x78(%rbp),%xmm0
mov    -0x28(%rbp),%rax
addsd  0x18(%rax),%xmm0
movsd  %xmm0,0x18(%rax)
jmp    1bdb <kernel_dtrmv_u_t_4_lib4+0xadb>
movsd  -0x60(%rbp),%xmm1
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm1
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,0x8(%rax)
movsd  -0x70(%rbp),%xmm1
mov    -0x28(%rbp),%rax
movsd  0x10(%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,0x10(%rax)
movsd  -0x78(%rbp),%xmm1
mov    -0x28(%rbp),%rax
movsd  0x18(%rax),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,0x18(%rax)
jmp    1be0 <kernel_dtrmv_u_t_4_lib4+0xae0>
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dtrmv_u_t_4_lib4>:
push   %rbp
push   %rbx
prefetcht0 (%rsi)
prefetcht0 0x40(%rsi)
cmp    $0x8,%edi
jl     1303 <kernel_dtrmv_u_t_4_lib4+0x203>
lea    -0x7(%rdi),%r10d
lea    0x0(,%rdx,4),%eax
movslq %eax,%r11
lea    0x0(,%r11,8),%rax
shl    $0x4,%r11
lea    0x40(%r11),%rbx
xorpd  %xmm5,%xmm5
xor    %ebp,%ebp
xorpd  %xmm4,%xmm4
nopw   0x0(%rax,%rax,1)
prefetcht0 (%rsi,%rax,1)
prefetcht0 0x40(%rsi,%rax,1)
movsd  0x40(%rsi),%xmm10
movhpd 0x60(%rsi),%xmm10
movsd  (%rsi),%xmm7
movsd  0x8(%rsi),%xmm9
movsd  0x10(%rsi),%xmm0
movsd  0x18(%rsi),%xmm8
movhpd 0x20(%rsi),%xmm7
movsd  (%rcx),%xmm2
movsd  0x8(%rcx),%xmm6
movsd  0x10(%rcx),%xmm3
movsd  0x18(%rcx),%xmm1
unpcklpd %xmm2,%xmm2
mulpd  %xmm2,%xmm7
addpd  %xmm5,%xmm7
movhpd 0x28(%rsi),%xmm9
mulpd  %xmm10,%xmm2
movsd  0x48(%rsi),%xmm5
movhpd 0x68(%rsi),%xmm5
addpd  %xmm4,%xmm2
unpcklpd %xmm6,%xmm6
mulpd  %xmm6,%xmm5
addpd  %xmm2,%xmm5
mulpd  %xmm9,%xmm6
movsd  0x50(%rsi),%xmm2
movhpd 0x70(%rsi),%xmm2
addpd  %xmm7,%xmm6
movhpd 0x30(%rsi),%xmm0
unpcklpd %xmm3,%xmm3
mulpd  %xmm3,%xmm0
addpd  %xmm6,%xmm0
movhpd 0x38(%rsi),%xmm8
mulpd  %xmm2,%xmm3
movsd  0x58(%rsi),%xmm7
movhpd 0x78(%rsi),%xmm7
addpd  %xmm5,%xmm3
unpcklpd %xmm1,%xmm1
mulpd  %xmm1,%xmm7
addpd  %xmm3,%xmm7
mulpd  %xmm8,%xmm1
addpd  %xmm0,%xmm1
prefetcht0 -0x40(%rsi,%rbx,1)
prefetcht0 (%rsi,%rbx,1)
movsd  0x40(%rsi,%rax,1),%xmm10
movhpd 0x60(%rsi,%rax,1),%xmm10
movsd  (%rsi,%rax,1),%xmm4
movsd  0x8(%rsi,%rax,1),%xmm9
movsd  0x10(%rsi,%rax,1),%xmm2
movhpd 0x20(%rsi,%rax,1),%xmm4
movsd  0x18(%rsi,%rax,1),%xmm8
movsd  0x20(%rcx),%xmm5
movsd  0x28(%rcx),%xmm6
movsd  0x30(%rcx),%xmm3
movsd  0x38(%rcx),%xmm0
unpcklpd %xmm5,%xmm5
mulpd  %xmm5,%xmm4
addpd  %xmm1,%xmm4
mulpd  %xmm10,%xmm5
addpd  %xmm7,%xmm5
movhpd 0x28(%rsi,%rax,1),%xmm9
movsd  0x48(%rsi,%rax,1),%xmm1
movhpd 0x68(%rsi,%rax,1),%xmm1
unpcklpd %xmm6,%xmm6
mulpd  %xmm6,%xmm1
addpd  %xmm5,%xmm1
mulpd  %xmm9,%xmm6
movsd  0x50(%rsi,%rax,1),%xmm5
movhpd 0x70(%rsi,%rax,1),%xmm5
movhpd 0x30(%rsi,%rax,1),%xmm2
addpd  %xmm4,%xmm6
unpcklpd %xmm3,%xmm3
mulpd  %xmm3,%xmm2
addpd  %xmm6,%xmm2
mulpd  %xmm5,%xmm3
addpd  %xmm1,%xmm3
movhpd 0x38(%rsi,%rax,1),%xmm8
movsd  0x58(%rsi,%rax,1),%xmm1
movhpd 0x78(%rsi,%rax,1),%xmm1
unpcklpd %xmm0,%xmm0
mulpd  %xmm0,%xmm1
movapd %xmm1,%xmm4
addpd  %xmm3,%xmm4
mulpd  %xmm8,%xmm0
movapd %xmm0,%xmm5
addpd  %xmm2,%xmm5
add    $0x40,%rcx
add    $0x8,%ebp
add    %r11,%rsi
cmp    %r10d,%ebp
jl     1140 <kernel_dtrmv_u_t_4_lib4+0x40>
addpd  %xmm2,%xmm0
addpd  %xmm3,%xmm1
mov    %edi,%eax
and    $0xfffffff8,%eax
jmp    130d <kernel_dtrmv_u_t_4_lib4+0x20d>
xorpd  %xmm0,%xmm0
xor    %eax,%eax
xorpd  %xmm1,%xmm1
add    $0xfffffffd,%edi
cmp    %edi,%eax
jge    141e <kernel_dtrmv_u_t_4_lib4+0x31e>
shl    $0x2,%edx
movslq %edx,%rdx
lea    0x40(,%rdx,8),%rbp
shl    $0x3,%rdx
nopw   0x0(%rax,%rax,1)
prefetcht0 -0x40(%rsi,%rbp,1)
prefetcht0 (%rsi,%rbp,1)
movsd  0x40(%rsi),%xmm10
movhpd 0x60(%rsi),%xmm10
movsd  (%rsi),%xmm6
movsd  0x8(%rsi),%xmm9
movsd  0x10(%rsi),%xmm2
movhpd 0x20(%rsi),%xmm6
movsd  0x18(%rsi),%xmm8
movsd  (%rcx),%xmm5
movsd  0x8(%rcx),%xmm7
movsd  0x10(%rcx),%xmm4
movsd  0x18(%rcx),%xmm3
unpcklpd %xmm5,%xmm5
mulpd  %xmm5,%xmm6
addpd  %xmm0,%xmm6
mulpd  %xmm10,%xmm5
addpd  %xmm1,%xmm5
movhpd 0x28(%rsi),%xmm9
movsd  0x48(%rsi),%xmm0
movhpd 0x68(%rsi),%xmm0
unpcklpd %xmm7,%xmm7
mulpd  %xmm7,%xmm0
addpd  %xmm5,%xmm0
mulpd  %xmm9,%xmm7
movsd  0x50(%rsi),%xmm1
movhpd 0x70(%rsi),%xmm1
movhpd 0x30(%rsi),%xmm2
addpd  %xmm6,%xmm7
unpcklpd %xmm4,%xmm4
mulpd  %xmm4,%xmm2
addpd  %xmm7,%xmm2
mulpd  %xmm1,%xmm4
addpd  %xmm0,%xmm4
movhpd 0x38(%rsi),%xmm8
movsd  0x58(%rsi),%xmm6
movhpd 0x78(%rsi),%xmm6
unpcklpd %xmm3,%xmm3
mulpd  %xmm3,%xmm6
movapd %xmm6,%xmm1
addpd  %xmm4,%xmm1
mulpd  %xmm8,%xmm3
movapd %xmm3,%xmm0
addpd  %xmm2,%xmm0
add    $0x20,%rcx
add    $0x4,%eax
add    %rdx,%rsi
cmp    %edi,%eax
jl     1330 <kernel_dtrmv_u_t_4_lib4+0x230>
addpd  %xmm2,%xmm3
addpd  %xmm4,%xmm6
movapd %xmm3,%xmm0
movapd %xmm6,%xmm1
movupd (%rcx),%xmm4
movupd 0x10(%rcx),%xmm8
movapd %xmm0,%xmm2
unpckhpd %xmm0,%xmm2
movsd  0x20(%rsi),%xmm6
mulsd  %xmm4,%xmm6
addsd  %xmm2,%xmm6
movapd %xmm1,%xmm2
unpckhpd %xmm1,%xmm2
movsd  0x60(%rsi),%xmm7
mulsd  %xmm4,%xmm7
addsd  %xmm2,%xmm7
movsd  (%rsi),%xmm3
movsd  0x40(%rsi),%xmm5
movsd  0x48(%rsi),%xmm9
movsd  0x50(%rsi),%xmm2
movhpd 0x28(%rsi),%xmm3
unpcklpd %xmm6,%xmm0
mulpd  %xmm4,%xmm3
addpd  %xmm0,%xmm3
movhpd 0x68(%rsi),%xmm5
unpcklpd %xmm7,%xmm1
mulpd  %xmm4,%xmm5
addpd  %xmm1,%xmm5
movhpd 0x70(%rsi),%xmm9
shufpd $0x1,%xmm8,%xmm4
mulpd  %xmm9,%xmm4
movhpd 0x78(%rsi),%xmm2
addpd  %xmm5,%xmm4
mulpd  %xmm8,%xmm2
addpd  %xmm4,%xmm2
cmp    $0x1,%r9d
je     14c3 <kernel_dtrmv_u_t_4_lib4+0x3c3>
test   %r9d,%r9d
jne    14e3 <kernel_dtrmv_u_t_4_lib4+0x3e3>
movupd %xmm3,(%r8)
movupd %xmm2,0x10(%r8)
jmp    1501 <kernel_dtrmv_u_t_4_lib4+0x401>
movupd (%r8),%xmm0
movupd 0x10(%r8),%xmm1
addpd  %xmm0,%xmm3
movupd %xmm3,(%r8)
addpd  %xmm1,%xmm2
movupd %xmm2,0x10(%r8)
jmp    1501 <kernel_dtrmv_u_t_4_lib4+0x401>
movupd (%r8),%xmm0
movupd 0x10(%r8),%xmm1
subpd  %xmm3,%xmm0
movupd %xmm0,(%r8)
subpd  %xmm2,%xmm1
movupd %xmm1,0x10(%r8)
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define void @kernel_dtrmv_u_t_4_lib4(i32 %0, double* %1, i32 %2, double* %3, double* %4, i32 %5) {
%7 = alloca i32
%8 = alloca double*
%9 = alloca i32
%10 = alloca double*
%11 = alloca double*
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca double
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
store i32 %0, i32* %7
store double* %1, double** %8
store i32 %2, i32* %9
store double* %3, double** %10
store double* %4, double** %11
store i32 %5, i32* %12
%24 = load double*, double** %8
%25 = bitcast double* %24 to i8*
%26 = load double*, double** %8
%27 = getelementptr inbounds double, double* %26, i64 8
%28 = bitcast double* %27 to i8*
store i32 4, i32* %13
store i32 4, i32* %14
store double 0.000000e+00, double* %20
store double 0.000000e+00, double* %21
store double 0.000000e+00, double* %22
store double 0.000000e+00, double* %23
store i32 0, i32* %15
br label %29
29: ; preds = %291, %6
%30 = load i32, i32* %15
%31 = load i32, i32* %7
%32 = sub nsw i32 %31, 7
%33 = icmp slt i32 %30, %32
br i1 %33, label %34, label %294
34: ; preds = %29
%35 = load double*, double** %8
%36 = load i32, i32* %9
%37 = mul nsw i32 %36, 4
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds double, double* %35, i64 %38
%40 = bitcast double* %39 to i8*
%41 = load double*, double** %8
%42 = load i32, i32* %9
%43 = mul nsw i32 %42, 4
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds double, double* %41, i64 %44
%46 = getelementptr inbounds double, double* %45, i64 8
%47 = bitcast double* %46 to i8*
%48 = load double*, double** %10
%49 = getelementptr inbounds double, double* %48, i64 0
%50 = load double, double* %49
store double %50, double* %16
%51 = load double*, double** %10
%52 = getelementptr inbounds double, double* %51, i64 1
%53 = load double, double* %52
store double %53, double* %17
%54 = load double*, double** %10
%55 = getelementptr inbounds double, double* %54, i64 2
%56 = load double, double* %55
store double %56, double* %18
%57 = load double*, double** %10
%58 = getelementptr inbounds double, double* %57, i64 3
%59 = load double, double* %58
store double %59, double* %19
%60 = load double*, double** %8
%61 = getelementptr inbounds double, double* %60, i64 0
%62 = load double, double* %61
%63 = load double, double* %16
%64 = load double, double* %20
%65 = call double @llvm.fmuladd.f64(double %62, double %63, double %64)
store double %65, double* %20
%66 = load double*, double** %8
%67 = getelementptr inbounds double, double* %66, i64 4
%68 = load double, double* %67
%69 = load double, double* %16
%70 = load double, double* %21
%71 = call double @llvm.fmuladd.f64(double %68, double %69, double %70)
store double %71, double* %21
%72 = load double*, double** %8
%73 = getelementptr inbounds double, double* %72, i64 8
%74 = load double, double* %73
%75 = load double, double* %16
%76 = load double, double* %22
%77 = call double @llvm.fmuladd.f64(double %74, double %75, double %76)
store double %77, double* %22
%78 = load double*, double** %8
%79 = getelementptr inbounds double, double* %78, i64 12
%80 = load double, double* %79
%81 = load double, double* %16
%82 = load double, double* %23
%83 = call double @llvm.fmuladd.f64(double %80, double %81, double %82)
store double %83, double* %23
%84 = load double*, double** %8
%85 = getelementptr inbounds double, double* %84, i64 1
%86 = load double, double* %85
%87 = load double, double* %17
%88 = load double, double* %20
%89 = call double @llvm.fmuladd.f64(double %86, double %87, double %88)
store double %89, double* %20
%90 = load double*, double** %8
%91 = getelementptr inbounds double, double* %90, i64 5
%92 = load double, double* %91
%93 = load double, double* %17
%94 = load double, double* %21
%95 = call double @llvm.fmuladd.f64(double %92, double %93, double %94)
store double %95, double* %21
%96 = load double*, double** %8
%97 = getelementptr inbounds double, double* %96, i64 9
%98 = load double, double* %97
%99 = load double, double* %17
%100 = load double, double* %22
%101 = call double @llvm.fmuladd.f64(double %98, double %99, double %100)
store double %101, double* %22
%102 = load double*, double** %8
%103 = getelementptr inbounds double, double* %102, i64 13
%104 = load double, double* %103
%105 = load double, double* %17
%106 = load double, double* %23
%107 = call double @llvm.fmuladd.f64(double %104, double %105, double %106)
store double %107, double* %23
%108 = load double*, double** %8
%109 = getelementptr inbounds double, double* %108, i64 2
%110 = load double, double* %109
%111 = load double, double* %18
%112 = load double, double* %20
%113 = call double @llvm.fmuladd.f64(double %110, double %111, double %112)
store double %113, double* %20
%114 = load double*, double** %8
%115 = getelementptr inbounds double, double* %114, i64 6
%116 = load double, double* %115
%117 = load double, double* %18
%118 = load double, double* %21
%119 = call double @llvm.fmuladd.f64(double %116, double %117, double %118)
store double %119, double* %21
%120 = load double*, double** %8
%121 = getelementptr inbounds double, double* %120, i64 10
%122 = load double, double* %121
%123 = load double, double* %18
%124 = load double, double* %22
%125 = call double @llvm.fmuladd.f64(double %122, double %123, double %124)
store double %125, double* %22
%126 = load double*, double** %8
%127 = getelementptr inbounds double, double* %126, i64 14
%128 = load double, double* %127
%129 = load double, double* %18
%130 = load double, double* %23
%131 = call double @llvm.fmuladd.f64(double %128, double %129, double %130)
store double %131, double* %23
%132 = load double*, double** %8
%133 = getelementptr inbounds double, double* %132, i64 3
%134 = load double, double* %133
%135 = load double, double* %19
%136 = load double, double* %20
%137 = call double @llvm.fmuladd.f64(double %134, double %135, double %136)
store double %137, double* %20
%138 = load double*, double** %8
%139 = getelementptr inbounds double, double* %138, i64 7
%140 = load double, double* %139
%141 = load double, double* %19
%142 = load double, double* %21
%143 = call double @llvm.fmuladd.f64(double %140, double %141, double %142)
store double %143, double* %21
%144 = load double*, double** %8
%145 = getelementptr inbounds double, double* %144, i64 11
%146 = load double, double* %145
%147 = load double, double* %19
%148 = load double, double* %22
%149 = call double @llvm.fmuladd.f64(double %146, double %147, double %148)
store double %149, double* %22
%150 = load double*, double** %8
%151 = getelementptr inbounds double, double* %150, i64 15
%152 = load double, double* %151
%153 = load double, double* %19
%154 = load double, double* %23
%155 = call double @llvm.fmuladd.f64(double %152, double %153, double %154)
store double %155, double* %23
%156 = load i32, i32* %9
%157 = mul nsw i32 %156, 4
%158 = load double*, double** %8
%159 = sext i32 %157 to i64
%160 = getelementptr inbounds double, double* %158, i64 %159
store double* %160, double** %8
%161 = load double*, double** %10
%162 = getelementptr inbounds double, double* %161, i64 4
store double* %162, double** %10
%163 = load double*, double** %8
%164 = load i32, i32* %9
%165 = mul nsw i32 %164, 4
%166 = sext i32 %165 to i64
%167 = getelementptr inbounds double, double* %163, i64 %166
%168 = bitcast double* %167 to i8*
%169 = load double*, double** %8
%170 = load i32, i32* %9
%171 = mul nsw i32 %170, 4
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds double, double* %169, i64 %172
%174 = getelementptr inbounds double, double* %173, i64 8
%175 = bitcast double* %174 to i8*
%176 = load double*, double** %10
%177 = getelementptr inbounds double, double* %176, i64 0
%178 = load double, double* %177
store double %178, double* %16
%179 = load double*, double** %10
%180 = getelementptr inbounds double, double* %179, i64 1
%181 = load double, double* %180
store double %181, double* %17
%182 = load double*, double** %10
%183 = getelementptr inbounds double, double* %182, i64 2
%184 = load double, double* %183
store double %184, double* %18
%185 = load double*, double** %10
%186 = getelementptr inbounds double, double* %185, i64 3
%187 = load double, double* %186
store double %187, double* %19
%188 = load double*, double** %8
%189 = getelementptr inbounds double, double* %188, i64 0
%190 = load double, double* %189
%191 = load double, double* %16
%192 = load double, double* %20
%193 = call double @llvm.fmuladd.f64(double %190, double %191, double %192)
store double %193, double* %20
%194 = load double*, double** %8
%195 = getelementptr inbounds double, double* %194, i64 4
%196 = load double, double* %195
%197 = load double, double* %16
%198 = load double, double* %21
%199 = call double @llvm.fmuladd.f64(double %196, double %197, double %198)
store double %199, double* %21
%200 = load double*, double** %8
%201 = getelementptr inbounds double, double* %200, i64 8
%202 = load double, double* %201
%203 = load double, double* %16
%204 = load double, double* %22
%205 = call double @llvm.fmuladd.f64(double %202, double %203, double %204)
store double %205, double* %22
%206 = load double*, double** %8
%207 = getelementptr inbounds double, double* %206, i64 12
%208 = load double, double* %207
%209 = load double, double* %16
%210 = load double, double* %23
%211 = call double @llvm.fmuladd.f64(double %208, double %209, double %210)
store double %211, double* %23
%212 = load double*, double** %8
%213 = getelementptr inbounds double, double* %212, i64 1
%214 = load double, double* %213
%215 = load double, double* %17
%216 = load double, double* %20
%217 = call double @llvm.fmuladd.f64(double %214, double %215, double %216)
store double %217, double* %20
%218 = load double*, double** %8
%219 = getelementptr inbounds double, double* %218, i64 5
%220 = load double, double* %219
%221 = load double, double* %17
%222 = load double, double* %21
%223 = call double @llvm.fmuladd.f64(double %220, double %221, double %222)
store double %223, double* %21
%224 = load double*, double** %8
%225 = getelementptr inbounds double, double* %224, i64 9
%226 = load double, double* %225
%227 = load double, double* %17
%228 = load double, double* %22
%229 = call double @llvm.fmuladd.f64(double %226, double %227, double %228)
store double %229, double* %22
%230 = load double*, double** %8
%231 = getelementptr inbounds double, double* %230, i64 13
%232 = load double, double* %231
%233 = load double, double* %17
%234 = load double, double* %23
%235 = call double @llvm.fmuladd.f64(double %232, double %233, double %234)
store double %235, double* %23
%236 = load double*, double** %8
%237 = getelementptr inbounds double, double* %236, i64 2
%238 = load double, double* %237
%239 = load double, double* %18
%240 = load double, double* %20
%241 = call double @llvm.fmuladd.f64(double %238, double %239, double %240)
store double %241, double* %20
%242 = load double*, double** %8
%243 = getelementptr inbounds double, double* %242, i64 6
%244 = load double, double* %243
%245 = load double, double* %18
%246 = load double, double* %21
%247 = call double @llvm.fmuladd.f64(double %244, double %245, double %246)
store double %247, double* %21
%248 = load double*, double** %8
%249 = getelementptr inbounds double, double* %248, i64 10
%250 = load double, double* %249
%251 = load double, double* %18
%252 = load double, double* %22
%253 = call double @llvm.fmuladd.f64(double %250, double %251, double %252)
store double %253, double* %22
%254 = load double*, double** %8
%255 = getelementptr inbounds double, double* %254, i64 14
%256 = load double, double* %255
%257 = load double, double* %18
%258 = load double, double* %23
%259 = call double @llvm.fmuladd.f64(double %256, double %257, double %258)
store double %259, double* %23
%260 = load double*, double** %8
%261 = getelementptr inbounds double, double* %260, i64 3
%262 = load double, double* %261
%263 = load double, double* %19
%264 = load double, double* %20
%265 = call double @llvm.fmuladd.f64(double %262, double %263, double %264)
store double %265, double* %20
%266 = load double*, double** %8
%267 = getelementptr inbounds double, double* %266, i64 7
%268 = load double, double* %267
%269 = load double, double* %19
%270 = load double, double* %21
%271 = call double @llvm.fmuladd.f64(double %268, double %269, double %270)
store double %271, double* %21
%272 = load double*, double** %8
%273 = getelementptr inbounds double, double* %272, i64 11
%274 = load double, double* %273
%275 = load double, double* %19
%276 = load double, double* %22
%277 = call double @llvm.fmuladd.f64(double %274, double %275, double %276)
store double %277, double* %22
%278 = load double*, double** %8
%279 = getelementptr inbounds double, double* %278, i64 15
%280 = load double, double* %279
%281 = load double, double* %19
%282 = load double, double* %23
%283 = call double @llvm.fmuladd.f64(double %280, double %281, double %282)
store double %283, double* %23
%284 = load i32, i32* %9
%285 = mul nsw i32 %284, 4
%286 = load double*, double** %8
%287 = sext i32 %285 to i64
%288 = getelementptr inbounds double, double* %286, i64 %287
store double* %288, double** %8
%289 = load double*, double** %10
%290 = getelementptr inbounds double, double* %289, i64 4
store double* %290, double** %10
br label %291
291: ; preds = %34
%292 = load i32, i32* %15
%293 = add nsw i32 %292, 8
store i32 %293, i32* %15
br label %29
294: ; preds = %29
br label %295
295: ; preds = %429, %294
%296 = load i32, i32* %15
%297 = load i32, i32* %7
%298 = sub nsw i32 %297, 3
%299 = icmp slt i32 %296, %298
br i1 %299, label %300, label %432
300: ; preds = %295
%301 = load double*, double** %8
%302 = load i32, i32* %9
%303 = mul nsw i32 %302, 4
%304 = sext i32 %303 to i64
%305 = getelementptr inbounds double, double* %301, i64 %304
%306 = bitcast double* %305 to i8*
%307 = load double*, double** %8
%308 = load i32, i32* %9
%309 = mul nsw i32 %308, 4
%310 = sext i32 %309 to i64
%311 = getelementptr inbounds double, double* %307, i64 %310
%312 = getelementptr inbounds double, double* %311, i64 8
%313 = bitcast double* %312 to i8*
%314 = load double*, double** %10
%315 = getelementptr inbounds double, double* %314, i64 0
%316 = load double, double* %315
store double %316, double* %16
%317 = load double*, double** %10
%318 = getelementptr inbounds double, double* %317, i64 1
%319 = load double, double* %318
store double %319, double* %17
%320 = load double*, double** %10
%321 = getelementptr inbounds double, double* %320, i64 2
%322 = load double, double* %321
store double %322, double* %18
%323 = load double*, double** %10
%324 = getelementptr inbounds double, double* %323, i64 3
%325 = load double, double* %324
store double %325, double* %19
%326 = load double*, double** %8
%327 = getelementptr inbounds double, double* %326, i64 0
%328 = load double, double* %327
%329 = load double, double* %16
%330 = load double, double* %20
%331 = call double @llvm.fmuladd.f64(double %328, double %329, double %330)
store double %331, double* %20
%332 = load double*, double** %8
%333 = getelementptr inbounds double, double* %332, i64 4
%334 = load double, double* %333
%335 = load double, double* %16
%336 = load double, double* %21
%337 = call double @llvm.fmuladd.f64(double %334, double %335, double %336)
store double %337, double* %21
%338 = load double*, double** %8
%339 = getelementptr inbounds double, double* %338, i64 8
%340 = load double, double* %339
%341 = load double, double* %16
%342 = load double, double* %22
%343 = call double @llvm.fmuladd.f64(double %340, double %341, double %342)
store double %343, double* %22
%344 = load double*, double** %8
%345 = getelementptr inbounds double, double* %344, i64 12
%346 = load double, double* %345
%347 = load double, double* %16
%348 = load double, double* %23
%349 = call double @llvm.fmuladd.f64(double %346, double %347, double %348)
store double %349, double* %23
%350 = load double*, double** %8
%351 = getelementptr inbounds double, double* %350, i64 1
%352 = load double, double* %351
%353 = load double, double* %17
%354 = load double, double* %20
%355 = call double @llvm.fmuladd.f64(double %352, double %353, double %354)
store double %355, double* %20
%356 = load double*, double** %8
%357 = getelementptr inbounds double, double* %356, i64 5
%358 = load double, double* %357
%359 = load double, double* %17
%360 = load double, double* %21
%361 = call double @llvm.fmuladd.f64(double %358, double %359, double %360)
store double %361, double* %21
%362 = load double*, double** %8
%363 = getelementptr inbounds double, double* %362, i64 9
%364 = load double, double* %363
%365 = load double, double* %17
%366 = load double, double* %22
%367 = call double @llvm.fmuladd.f64(double %364, double %365, double %366)
store double %367, double* %22
%368 = load double*, double** %8
%369 = getelementptr inbounds double, double* %368, i64 13
%370 = load double, double* %369
%371 = load double, double* %17
%372 = load double, double* %23
%373 = call double @llvm.fmuladd.f64(double %370, double %371, double %372)
store double %373, double* %23
%374 = load double*, double** %8
%375 = getelementptr inbounds double, double* %374, i64 2
%376 = load double, double* %375
%377 = load double, double* %18
%378 = load double, double* %20
%379 = call double @llvm.fmuladd.f64(double %376, double %377, double %378)
store double %379, double* %20
%380 = load double*, double** %8
%381 = getelementptr inbounds double, double* %380, i64 6
%382 = load double, double* %381
%383 = load double, double* %18
%384 = load double, double* %21
%385 = call double @llvm.fmuladd.f64(double %382, double %383, double %384)
store double %385, double* %21
%386 = load double*, double** %8
%387 = getelementptr inbounds double, double* %386, i64 10
%388 = load double, double* %387
%389 = load double, double* %18
%390 = load double, double* %22
%391 = call double @llvm.fmuladd.f64(double %388, double %389, double %390)
store double %391, double* %22
%392 = load double*, double** %8
%393 = getelementptr inbounds double, double* %392, i64 14
%394 = load double, double* %393
%395 = load double, double* %18
%396 = load double, double* %23
%397 = call double @llvm.fmuladd.f64(double %394, double %395, double %396)
store double %397, double* %23
%398 = load double*, double** %8
%399 = getelementptr inbounds double, double* %398, i64 3
%400 = load double, double* %399
%401 = load double, double* %19
%402 = load double, double* %20
%403 = call double @llvm.fmuladd.f64(double %400, double %401, double %402)
store double %403, double* %20
%404 = load double*, double** %8
%405 = getelementptr inbounds double, double* %404, i64 7
%406 = load double, double* %405
%407 = load double, double* %19
%408 = load double, double* %21
%409 = call double @llvm.fmuladd.f64(double %406, double %407, double %408)
store double %409, double* %21
%410 = load double*, double** %8
%411 = getelementptr inbounds double, double* %410, i64 11
%412 = load double, double* %411
%413 = load double, double* %19
%414 = load double, double* %22
%415 = call double @llvm.fmuladd.f64(double %412, double %413, double %414)
store double %415, double* %22
%416 = load double*, double** %8
%417 = getelementptr inbounds double, double* %416, i64 15
%418 = load double, double* %417
%419 = load double, double* %19
%420 = load double, double* %23
%421 = call double @llvm.fmuladd.f64(double %418, double %419, double %420)
store double %421, double* %23
%422 = load i32, i32* %9
%423 = mul nsw i32 %422, 4
%424 = load double*, double** %8
%425 = sext i32 %423 to i64
%426 = getelementptr inbounds double, double* %424, i64 %425
store double* %426, double** %8
%427 = load double*, double** %10
%428 = getelementptr inbounds double, double* %427, i64 4
store double* %428, double** %10
br label %429
429: ; preds = %300
%430 = load i32, i32* %15
%431 = add nsw i32 %430, 4
store i32 %431, i32* %15
br label %295
432: ; preds = %295
%433 = load double*, double** %10
%434 = getelementptr inbounds double, double* %433, i64 0
%435 = load double, double* %434
store double %435, double* %16
%436 = load double*, double** %10
%437 = getelementptr inbounds double, double* %436, i64 1
%438 = load double, double* %437
store double %438, double* %17
%439 = load double*, double** %10
%440 = getelementptr inbounds double, double* %439, i64 2
%441 = load double, double* %440
store double %441, double* %18
%442 = load double*, double** %10
%443 = getelementptr inbounds double, double* %442, i64 3
%444 = load double, double* %443
store double %444, double* %19
%445 = load double*, double** %8
%446 = getelementptr inbounds double, double* %445, i64 0
%447 = load double, double* %446
%448 = load double, double* %16
%449 = load double, double* %20
%450 = call double @llvm.fmuladd.f64(double %447, double %448, double %449)
store double %450, double* %20
%451 = load double*, double** %8
%452 = getelementptr inbounds double, double* %451, i64 4
%453 = load double, double* %452
%454 = load double, double* %16
%455 = load double, double* %21
%456 = call double @llvm.fmuladd.f64(double %453, double %454, double %455)
store double %456, double* %21
%457 = load double*, double** %8
%458 = getelementptr inbounds double, double* %457, i64 8
%459 = load double, double* %458
%460 = load double, double* %16
%461 = load double, double* %22
%462 = call double @llvm.fmuladd.f64(double %459, double %460, double %461)
store double %462, double* %22
%463 = load double*, double** %8
%464 = getelementptr inbounds double, double* %463, i64 12
%465 = load double, double* %464
%466 = load double, double* %16
%467 = load double, double* %23
%468 = call double @llvm.fmuladd.f64(double %465, double %466, double %467)
store double %468, double* %23
%469 = load double*, double** %8
%470 = getelementptr inbounds double, double* %469, i64 5
%471 = load double, double* %470
%472 = load double, double* %17
%473 = load double, double* %21
%474 = call double @llvm.fmuladd.f64(double %471, double %472, double %473)
store double %474, double* %21
%475 = load double*, double** %8
%476 = getelementptr inbounds double, double* %475, i64 9
%477 = load double, double* %476
%478 = load double, double* %17
%479 = load double, double* %22
%480 = call double @llvm.fmuladd.f64(double %477, double %478, double %479)
store double %480, double* %22
%481 = load double*, double** %8
%482 = getelementptr inbounds double, double* %481, i64 13
%483 = load double, double* %482
%484 = load double, double* %17
%485 = load double, double* %23
%486 = call double @llvm.fmuladd.f64(double %483, double %484, double %485)
store double %486, double* %23
%487 = load double*, double** %8
%488 = getelementptr inbounds double, double* %487, i64 10
%489 = load double, double* %488
%490 = load double, double* %18
%491 = load double, double* %22
%492 = call double @llvm.fmuladd.f64(double %489, double %490, double %491)
store double %492, double* %22
%493 = load double*, double** %8
%494 = getelementptr inbounds double, double* %493, i64 14
%495 = load double, double* %494
%496 = load double, double* %18
%497 = load double, double* %23
%498 = call double @llvm.fmuladd.f64(double %495, double %496, double %497)
store double %498, double* %23
%499 = load double*, double** %8
%500 = getelementptr inbounds double, double* %499, i64 15
%501 = load double, double* %500
%502 = load double, double* %19
%503 = load double, double* %23
%504 = call double @llvm.fmuladd.f64(double %501, double %502, double %503)
store double %504, double* %23
%505 = load i32, i32* %9
%506 = mul nsw i32 %505, 4
%507 = load double*, double** %8
%508 = sext i32 %506 to i64
%509 = getelementptr inbounds double, double* %507, i64 %508
store double* %509, double** %8
%510 = load double*, double** %10
%511 = getelementptr inbounds double, double* %510, i64 4
store double* %511, double** %10
%512 = load i32, i32* %12
%513 = icmp eq i32 %512, 0
br i1 %513, label %514, label %527
514: ; preds = %432
%515 = load double, double* %20
%516 = load double*, double** %11
%517 = getelementptr inbounds double, double* %516, i64 0
store double %515, double* %517
%518 = load double, double* %21
%519 = load double*, double** %11
%520 = getelementptr inbounds double, double* %519, i64 1
store double %518, double* %520
%521 = load double, double* %22
%522 = load double*, double** %11
%523 = getelementptr inbounds double, double* %522, i64 2
store double %521, double* %523
%524 = load double, double* %23
%525 = load double*, double** %11
%526 = getelementptr inbounds double, double* %525, i64 3
store double %524, double* %526
br label %573
527: ; preds = %432
%528 = load i32, i32* %12
%529 = icmp eq i32 %528, 1
br i1 %529, label %530, label %551
530: ; preds = %527
%531 = load double, double* %20
%532 = load double*, double** %11
%533 = getelementptr inbounds double, double* %532, i64 0
%534 = load double, double* %533
%535 = fadd double %534, %531
store double %535, double* %533
%536 = load double, double* %21
%537 = load double*, double** %11
%538 = getelementptr inbounds double, double* %537, i64 1
%539 = load double, double* %538
%540 = fadd double %539, %536
store double %540, double* %538
%541 = load double, double* %22
%542 = load double*, double** %11
%543 = getelementptr inbounds double, double* %542, i64 2
%544 = load double, double* %543
%545 = fadd double %544, %541
store double %545, double* %543
%546 = load double, double* %23
%547 = load double*, double** %11
%548 = getelementptr inbounds double, double* %547, i64 3
%549 = load double, double* %548
%550 = fadd double %549, %546
store double %550, double* %548
br label %572
551: ; preds = %527
%552 = load double, double* %20
%553 = load double*, double** %11
%554 = getelementptr inbounds double, double* %553, i64 0
%555 = load double, double* %554
%556 = fsub double %555, %552
store double %556, double* %554
%557 = load double, double* %21
%558 = load double*, double** %11
%559 = getelementptr inbounds double, double* %558, i64 1
%560 = load double, double* %559
%561 = fsub double %560, %557
store double %561, double* %559
%562 = load double, double* %22
%563 = load double*, double** %11
%564 = getelementptr inbounds double, double* %563, i64 2
%565 = load double, double* %564
%566 = fsub double %565, %562
store double %566, double* %564
%567 = load double, double* %23
%568 = load double*, double** %11
%569 = getelementptr inbounds double, double* %568, i64 3
%570 = load double, double* %569
%571 = fsub double %570, %567
store double %571, double* %569
br label %572
572: ; preds = %551, %530
br label %573
573: ; preds = %572, %514
ret void
}

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