void kernel_dgemm_diag_left_2_lib4(int kmax, double *A, double *B, double *C,
                                   double *D, int alg) {
  if (kmax <= 0)
    return;
  const int bs = 4;
  int k;
  double a_0, a_1, b_0, b_1, c_0, c_1;
  if (alg == -1) {
    a_0 = -A[0];
    a_1 = -A[1];
  } else {
    a_0 = A[0];
    a_1 = A[1];
  }
  if (alg == 0) {
    for (k = 0; k < kmax - 3; k += 4) {
      b_0 = B[0 + bs * 0];
      b_1 = B[1 + bs * 0];
      c_0 = a_0 * b_0;
      c_1 = a_1 * b_1;
      D[0 + bs * 0] = c_0;
      D[1 + bs * 0] = c_1;
      b_0 = B[0 + bs * 1];
      b_1 = B[1 + bs * 1];
      c_0 = a_0 * b_0;
      c_1 = a_1 * b_1;
      D[0 + bs * 1] = c_0;
      D[1 + bs * 1] = c_1;
      b_0 = B[0 + bs * 2];
      b_1 = B[1 + bs * 2];
      c_0 = a_0 * b_0;
      c_1 = a_1 * b_1;
      D[0 + bs * 2] = c_0;
      D[1 + bs * 2] = c_1;
      b_0 = B[0 + bs * 3];
      b_1 = B[1 + bs * 3];
      c_0 = a_0 * b_0;
      c_1 = a_1 * b_1;
      D[0 + bs * 3] = c_0;
      D[1 + bs * 3] = c_1;
      B += 16;
      D += 16;
    }
    for (; k < kmax; k++) {
      b_0 = B[0 + bs * 0];
      b_1 = B[1 + bs * 0];
      c_0 = a_0 * b_0;
      c_1 = a_1 * b_1;
      D[0 + bs * 0] = c_0;
      D[1 + bs * 0] = c_1;
      B += 4;
      D += 4;
    }
  } else {
    for (k = 0; k < kmax - 3; k += 4) {
      b_0 = B[0 + bs * 0];
      b_1 = B[1 + bs * 0];
      c_0 = C[0 + bs * 0] + a_0 * b_0;
      c_1 = C[1 + bs * 0] + a_1 * b_1;
      D[0 + bs * 0] = c_0;
      D[1 + bs * 0] = c_1;
      b_0 = B[0 + bs * 1];
      b_1 = B[1 + bs * 1];
      c_0 = C[0 + bs * 1] + a_0 * b_0;
      c_1 = C[1 + bs * 1] + a_1 * b_1;
      D[0 + bs * 1] = c_0;
      D[1 + bs * 1] = c_1;
      b_0 = B[0 + bs * 2];
      b_1 = B[1 + bs * 2];
      c_0 = C[0 + bs * 2] + a_0 * b_0;
      c_1 = C[1 + bs * 2] + a_1 * b_1;
      D[0 + bs * 2] = c_0;
      D[1 + bs * 2] = c_1;
      b_0 = B[0 + bs * 3];
      b_1 = B[1 + bs * 3];
      c_0 = C[0 + bs * 3] + a_0 * b_0;
      c_1 = C[1 + bs * 3] + a_1 * b_1;
      D[0 + bs * 3] = c_0;
      D[1 + bs * 3] = c_1;
      B += 16;
      C += 16;
      D += 16;
    }
    for (; k < kmax; k++) {
      b_0 = B[0 + bs * 0];
      b_1 = B[1 + bs * 0];
      c_0 = C[0 + bs * 0] + a_0 * b_0;
      c_1 = C[1 + bs * 0] + a_1 * b_1;
      D[0 + bs * 0] = c_0;
      D[1 + bs * 0] = c_1;
      B += 4;
      C += 4;
      D += 4;
    }
  }
}


x86 assembly (clang, -O0):
<kernel_dgemm_diag_left_2_lib4>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
cmpl   $0x0,-0x4(%rbp)
jg     112a <kernel_dgemm_diag_left_2_lib4+0x2a>
jmp    16c0 <kernel_dgemm_diag_left_2_lib4+0x5c0>
movl   $0x4,-0x30(%rbp)
cmpl   $0xffffffff,-0x2c(%rbp)
jne    1189 <kernel_dgemm_diag_left_2_lib4+0x89>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x48(%rbp)
jmp    11a4 <kernel_dgemm_diag_left_2_lib4+0xa4>
mov    -0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
cmpl   $0x0,-0x2c(%rbp)
jne    13d6 <kernel_dgemm_diag_left_2_lib4+0x2d6>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1346 <kernel_dgemm_diag_left_2_lib4+0x246>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x28(%rax)
mov    -0x18(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x48(%rax)
mov    -0x18(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x68(%rax)
mov    -0x18(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x34(%rbp)
jmp    11b5 <kernel_dgemm_diag_left_2_lib4+0xb5>
jmp    134b <kernel_dgemm_diag_left_2_lib4+0x24b>
mov    -0x34(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    13d1 <kernel_dgemm_diag_left_2_lib4+0x2d1>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x40(%rbp),%xmm0
mulsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    134b <kernel_dgemm_diag_left_2_lib4+0x24b>
jmp    16c0 <kernel_dgemm_diag_left_2_lib4+0x5c0>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    1603 <kernel_dgemm_diag_left_2_lib4+0x503>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x28(%rax)
mov    -0x18(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x40(%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x48(%rax),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x48(%rax)
mov    -0x18(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x60(%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x68(%rax),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x68(%rax)
mov    -0x18(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x34(%rbp)
jmp    13dd <kernel_dgemm_diag_left_2_lib4+0x2dd>
jmp    1608 <kernel_dgemm_diag_left_2_lib4+0x508>
mov    -0x34(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    16bb <kernel_dgemm_diag_left_2_lib4+0x5bb>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm1
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm1
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x60(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x68(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x28(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1608 <kernel_dgemm_diag_left_2_lib4+0x508>
jmp    16c0 <kernel_dgemm_diag_left_2_lib4+0x5c0>
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgemm_diag_left_2_lib4>:
test   %edi,%edi
jle    1392 <kernel_dgemm_diag_left_2_lib4+0x292>
movsd  (%rsi),%xmm0
cmp    $0xffffffff,%r9d
je     1220 <kernel_dgemm_diag_left_2_lib4+0x120>
movhpd 0x8(%rsi),%xmm0
test   %r9d,%r9d
jne    122d <kernel_dgemm_diag_left_2_lib4+0x12d>
xor    %eax,%eax
cmp    $0x4,%edi
jb     117e <kernel_dgemm_diag_left_2_lib4+0x7e>
lea    -0x3(%rdi),%eax
xor    %ecx,%ecx
movupd (%rdx),%xmm1
mulpd  %xmm0,%xmm1
movupd %xmm1,(%r8)
movupd 0x20(%rdx),%xmm1
mulpd  %xmm0,%xmm1
movupd %xmm1,0x20(%r8)
movupd 0x40(%rdx),%xmm1
mulpd  %xmm0,%xmm1
movupd %xmm1,0x40(%r8)
movupd 0x60(%rdx),%xmm1
mulpd  %xmm0,%xmm1
movupd %xmm1,0x60(%r8)
sub    $0xffffffffffffff80,%rdx
sub    $0xffffffffffffff80,%r8
add    $0x4,%ecx
cmp    %eax,%ecx
jl     1130 <kernel_dgemm_diag_left_2_lib4+0x30>
mov    %edi,%eax
and    $0xfffffffc,%eax
cmp    %edi,%eax
jge    1392 <kernel_dgemm_diag_left_2_lib4+0x292>
mov    %eax,%r9d
not    %r9d
add    %edi,%r9d
mov    %edi,%esi
and    $0x3,%esi
je     11be <kernel_dgemm_diag_left_2_lib4+0xbe>
neg    %esi
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movupd (%rdx),%xmm1
mulpd  %xmm0,%xmm1
movupd %xmm1,(%r8)
add    $0x20,%rdx
add    $0x20,%r8
add    $0xffffffff,%ecx
cmp    %ecx,%esi
jne    11a0 <kernel_dgemm_diag_left_2_lib4+0xa0>
sub    %ecx,%eax
cmp    $0x3,%r9d
jb     1392 <kernel_dgemm_diag_left_2_lib4+0x292>
sub    %eax,%edi
xor    %eax,%eax
nopl   0x0(%rax)
movupd (%rdx,%rax,1),%xmm1
mulpd  %xmm0,%xmm1
movupd %xmm1,(%r8,%rax,1)
movupd 0x20(%rdx,%rax,1),%xmm1
mulpd  %xmm0,%xmm1
movupd %xmm1,0x20(%r8,%rax,1)
movupd 0x40(%rdx,%rax,1),%xmm1
mulpd  %xmm0,%xmm1
movupd %xmm1,0x40(%r8,%rax,1)
movupd 0x60(%rdx,%rax,1),%xmm1
mulpd  %xmm0,%xmm1
movupd %xmm1,0x60(%r8,%rax,1)
sub    $0xffffffffffffff80,%rax
add    $0xfffffffc,%edi
jne    11d0 <kernel_dgemm_diag_left_2_lib4+0xd0>
jmp    1392 <kernel_dgemm_diag_left_2_lib4+0x292>
movhpd 0x8(%rsi),%xmm0
xorpd  0xdd3(%rip),%xmm0
xor    %r10d,%r10d
cmp    $0x4,%edi
jb     12b7 <kernel_dgemm_diag_left_2_lib4+0x1b7>
lea    -0x3(%rdi),%eax
xor    %esi,%esi
xchg   %ax,%ax
movupd (%rdx),%xmm1
movupd (%rcx),%xmm2
mulpd  %xmm0,%xmm1
addpd  %xmm2,%xmm1
movupd %xmm1,(%r8)
movupd 0x20(%rdx),%xmm1
movupd 0x20(%rcx),%xmm2
mulpd  %xmm0,%xmm1
addpd  %xmm2,%xmm1
movupd %xmm1,0x20(%r8)
movupd 0x40(%rdx),%xmm1
movupd 0x40(%rcx),%xmm2
mulpd  %xmm0,%xmm1
addpd  %xmm2,%xmm1
movupd %xmm1,0x40(%r8)
movupd 0x60(%rdx),%xmm1
movupd 0x60(%rcx),%xmm2
mulpd  %xmm0,%xmm1
addpd  %xmm2,%xmm1
movupd %xmm1,0x60(%r8)
sub    $0xffffffffffffff80,%rdx
sub    $0xffffffffffffff80,%rcx
sub    $0xffffffffffffff80,%r8
add    $0x4,%esi
cmp    %eax,%esi
jl     1240 <kernel_dgemm_diag_left_2_lib4+0x140>
mov    %edi,%r10d
and    $0xfffffffc,%r10d
cmp    %edi,%r10d
jge    1392 <kernel_dgemm_diag_left_2_lib4+0x292>
mov    %r10d,%r9d
not    %r9d
add    %edi,%r9d
mov    %edi,%esi
and    $0x3,%esi
je     130b <kernel_dgemm_diag_left_2_lib4+0x20b>
neg    %esi
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movupd (%rdx),%xmm1
movupd (%rcx),%xmm2
mulpd  %xmm0,%xmm1
addpd  %xmm2,%xmm1
movupd %xmm1,(%r8)
add    $0x20,%rdx
add    $0x20,%rcx
add    $0x20,%r8
add    $0xffffffff,%eax
cmp    %eax,%esi
jne    12e0 <kernel_dgemm_diag_left_2_lib4+0x1e0>
sub    %eax,%r10d
cmp    $0x3,%r9d
jb     1392 <kernel_dgemm_diag_left_2_lib4+0x292>
sub    %r10d,%edi
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movupd (%rdx,%rax,1),%xmm1
movupd (%rcx,%rax,1),%xmm2
mulpd  %xmm0,%xmm1
addpd  %xmm2,%xmm1
movupd %xmm1,(%r8,%rax,1)
movupd 0x20(%rdx,%rax,1),%xmm1
movupd 0x20(%rcx,%rax,1),%xmm2
mulpd  %xmm0,%xmm1
addpd  %xmm2,%xmm1
movupd %xmm1,0x20(%r8,%rax,1)
movupd 0x40(%rdx,%rax,1),%xmm1
movupd 0x40(%rcx,%rax,1),%xmm2
mulpd  %xmm0,%xmm1
addpd  %xmm2,%xmm1
movupd %xmm1,0x40(%r8,%rax,1)
movupd 0x60(%rdx,%rax,1),%xmm1
movupd 0x60(%rcx,%rax,1),%xmm2
mulpd  %xmm0,%xmm1
addpd  %xmm2,%xmm1
movupd %xmm1,0x60(%r8,%rax,1)
sub    $0xffffffffffffff80,%rax
add    $0xfffffffc,%edi
jne    1320 <kernel_dgemm_diag_left_2_lib4+0x220>
ret

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

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