void kernel_dgemm_nt_4x2_vs_lib4(int km, int kn, int kmax, double *A, double *B,
                                 double *C, double *D, int alg, int tc,
                                 int td) {
  const int bs = 4;
  int k;
  double a_0, a_1, a_2, a_3, b_0, b_1, c_00 = 0, c_01 = 0, c_10 = 0, c_11 = 0,
                                       c_20 = 0, c_21 = 0, c_30 = 0, c_31 = 0;
  for (k = 0; k < kmax - 3; k += 4) {
    a_0 = A[0 + bs * 0];
    a_1 = A[1 + bs * 0];
    a_2 = A[2 + bs * 0];
    a_3 = A[3 + bs * 0];
    b_0 = B[0 + bs * 0];
    b_1 = B[1 + bs * 0];
    c_00 += a_0 * b_0;
    c_10 += a_1 * b_0;
    c_20 += a_2 * b_0;
    c_30 += a_3 * b_0;
    c_01 += a_0 * b_1;
    c_11 += a_1 * b_1;
    c_21 += a_2 * b_1;
    c_31 += a_3 * b_1;
    a_0 = A[0 + bs * 1];
    a_1 = A[1 + bs * 1];
    a_2 = A[2 + bs * 1];
    a_3 = A[3 + bs * 1];
    b_0 = B[0 + bs * 1];
    b_1 = B[1 + bs * 1];
    c_00 += a_0 * b_0;
    c_10 += a_1 * b_0;
    c_20 += a_2 * b_0;
    c_30 += a_3 * b_0;
    c_01 += a_0 * b_1;
    c_11 += a_1 * b_1;
    c_21 += a_2 * b_1;
    c_31 += a_3 * b_1;
    a_0 = A[0 + bs * 2];
    a_1 = A[1 + bs * 2];
    a_2 = A[2 + bs * 2];
    a_3 = A[3 + bs * 2];
    b_0 = B[0 + bs * 2];
    b_1 = B[1 + bs * 2];
    c_00 += a_0 * b_0;
    c_10 += a_1 * b_0;
    c_20 += a_2 * b_0;
    c_30 += a_3 * b_0;
    c_01 += a_0 * b_1;
    c_11 += a_1 * b_1;
    c_21 += a_2 * b_1;
    c_31 += a_3 * b_1;
    a_0 = A[0 + bs * 3];
    a_1 = A[1 + bs * 3];
    a_2 = A[2 + bs * 3];
    a_3 = A[3 + bs * 3];
    b_0 = B[0 + bs * 3];
    b_1 = B[1 + bs * 3];
    c_00 += a_0 * b_0;
    c_10 += a_1 * b_0;
    c_20 += a_2 * b_0;
    c_30 += a_3 * b_0;
    c_01 += a_0 * b_1;
    c_11 += a_1 * b_1;
    c_21 += a_2 * b_1;
    c_31 += a_3 * b_1;
    A += 16;
    B += 16;
  }
  for (; k < kmax; k++) {
    a_0 = A[0 + bs * 0];
    a_1 = A[1 + bs * 0];
    a_2 = A[2 + bs * 0];
    a_3 = A[3 + bs * 0];
    b_0 = B[0 + bs * 0];
    b_1 = B[1 + bs * 0];
    c_00 += a_0 * b_0;
    c_10 += a_1 * b_0;
    c_20 += a_2 * b_0;
    c_30 += a_3 * b_0;
    c_01 += a_0 * b_1;
    c_11 += a_1 * b_1;
    c_21 += a_2 * b_1;
    c_31 += a_3 * b_1;
    A += 4;
    B += 4;
  }
  double d_00, d_01, d_10, d_11, d_20, d_21, d_30, d_31;
  if (alg == 0) {
    if (td == 0) {
      goto store_n;
    } else {
      goto store_t;
    }
  } else {
    if (tc == 0) {
      d_00 = C[0 + bs * 0];
      d_10 = C[1 + bs * 0];
      d_20 = C[2 + bs * 0];
      d_30 = C[3 + bs * 0];
      d_01 = C[0 + bs * 1];
      d_11 = C[1 + bs * 1];
      d_21 = C[2 + bs * 1];
      d_31 = C[3 + bs * 1];
    } else {
      d_00 = C[0 + bs * 0];
      d_01 = C[1 + bs * 0];
      d_10 = C[0 + bs * 1];
      d_11 = C[1 + bs * 1];
      d_20 = C[0 + bs * 2];
      d_21 = C[1 + bs * 2];
      d_30 = C[0 + bs * 3];
      d_31 = C[1 + bs * 3];
    }
    if (alg == 1) {
      c_00 = d_00 + c_00;
      c_10 = d_10 + c_10;
      c_20 = d_20 + c_20;
      c_30 = d_30 + c_30;
      c_01 = d_01 + c_01;
      c_11 = d_11 + c_11;
      c_21 = d_21 + c_21;
      c_31 = d_31 + c_31;
    } else {
      c_00 = d_00 - c_00;
      c_10 = d_10 - c_10;
      c_20 = d_20 - c_20;
      c_30 = d_30 - c_30;
      c_01 = d_01 - c_01;
      c_11 = d_11 - c_11;
      c_21 = d_21 - c_21;
      c_31 = d_31 - c_31;
    }
    if (td == 0) {
      goto store_n;
    } else {
      goto store_t;
    }
  }
store_n:
  if (km >= 4) {
    D[0 + bs * 0] = c_00;
    D[1 + bs * 0] = c_10;
    D[2 + bs * 0] = c_20;
    D[3 + bs * 0] = c_30;
    if (kn >= 2) {
      D[0 + bs * 1] = c_01;
      D[1 + bs * 1] = c_11;
      D[2 + bs * 1] = c_21;
      D[3 + bs * 1] = c_31;
    }
  } else {
    D[0 + bs * 0] = c_00;
    D[1 + bs * 0] = c_10;
    D[2 + bs * 0] = c_20;
    if (kn >= 2) {
      D[0 + bs * 1] = c_01;
      D[1 + bs * 1] = c_11;
      D[2 + bs * 1] = c_21;
    }
  }
  return;
store_t:
  if (kn >= 2) {
    D[0 + bs * 0] = c_00;
    D[1 + bs * 0] = c_01;
    D[0 + bs * 1] = c_10;
    D[1 + bs * 1] = c_11;
    D[0 + bs * 2] = c_20;
    D[1 + bs * 2] = c_21;
    if (km >= 4) {
      D[0 + bs * 3] = c_30;
      D[1 + bs * 3] = c_31;
    }
  } else {
    D[0 + bs * 0] = c_00;
    D[0 + bs * 1] = c_10;
    D[0 + bs * 2] = c_20;
    if (km >= 4) {
      D[0 + bs * 3] = c_30;
    }
  }
  return;
}


x86 assembly (clang, -O0):
<kernel_dgemm_nt_4x2_vs_lib4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%rax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
movl   $0x4,-0x2c(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x68(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x70(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x78(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x80(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
xorps  %xmm0,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    16ed <kernel_dgemm_nt_4x2_vs_lib4+0x5ed>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x30(%rbp)
jmp    1184 <kernel_dgemm_nt_4x2_vs_lib4+0x84>
jmp    16f2 <kernel_dgemm_nt_4x2_vs_lib4+0x5f2>
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    186e <kernel_dgemm_nt_4x2_vs_lib4+0x76e>
mov    -0x18(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x18(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x98(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x50(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
movsd  -0xa0(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x18(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x18(%rbp)
mov    -0x20(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x20(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    16f2 <kernel_dgemm_nt_4x2_vs_lib4+0x5f2>
cmpl   $0x0,0x18(%rbp)
jne    188c <kernel_dgemm_nt_4x2_vs_lib4+0x78c>
cmpl   $0x0,0x28(%rbp)
jne    1887 <kernel_dgemm_nt_4x2_vs_lib4+0x787>
jmp    1b1c <kernel_dgemm_nt_4x2_vs_lib4+0xa1c>
jmp    1c1d <kernel_dgemm_nt_4x2_vs_lib4+0xb1d>
cmpl   $0x0,0x20(%rbp)
jne    1922 <kernel_dgemm_nt_4x2_vs_lib4+0x822>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
jmp    19a9 <kernel_dgemm_nt_4x2_vs_lib4+0x8a9>
mov    -0x28(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
cmpl   $0x1,0x18(%rbp)
jne    1a60 <kernel_dgemm_nt_4x2_vs_lib4+0x960>
movsd  -0xa8(%rbp),%xmm0
ff
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0xb8(%rbp),%xmm0
ff
addsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0xc8(%rbp),%xmm0
ff
addsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0xd8(%rbp),%xmm0
ff
addsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
addsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0xc0(%rbp),%xmm0
ff
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0xd0(%rbp),%xmm0
ff
addsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0xe0(%rbp),%xmm0
ff
addsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
jmp    1b08 <kernel_dgemm_nt_4x2_vs_lib4+0xa08>
movsd  -0xa8(%rbp),%xmm0
ff
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0xb8(%rbp),%xmm0
ff
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0xc8(%rbp),%xmm0
ff
subsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0xd8(%rbp),%xmm0
ff
subsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0xc0(%rbp),%xmm0
ff
subsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0xd0(%rbp),%xmm0
ff
subsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0xe0(%rbp),%xmm0
ff
subsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
cmpl   $0x0,0x28(%rbp)
jne    1b17 <kernel_dgemm_nt_4x2_vs_lib4+0xa17>
jmp    1b1c <kernel_dgemm_nt_4x2_vs_lib4+0xa1c>
jmp    1c1d <kernel_dgemm_nt_4x2_vs_lib4+0xb1d>
cmpl   $0x4,-0x4(%rbp)
jl     1bb0 <kernel_dgemm_nt_4x2_vs_lib4+0xab0>
movsd  -0x68(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x18(%rax)
cmpl   $0x2,-0x8(%rbp)
jl     1bab <kernel_dgemm_nt_4x2_vs_lib4+0xaab>
movsd  -0x70(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x38(%rax)
jmp    1c18 <kernel_dgemm_nt_4x2_vs_lib4+0xb18>
movsd  -0x68(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x10(%rax)
cmpl   $0x2,-0x8(%rbp)
jl     1c13 <kernel_dgemm_nt_4x2_vs_lib4+0xb13>
movsd  -0x70(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x30(%rax)
jmp    1c18 <kernel_dgemm_nt_4x2_vs_lib4+0xb18>
jmp    1d02 <kernel_dgemm_nt_4x2_vs_lib4+0xc02>
cmpl   $0x2,-0x8(%rbp)
jl     1cb1 <kernel_dgemm_nt_4x2_vs_lib4+0xbb1>
movsd  -0x68(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x48(%rax)
cmpl   $0x4,-0x4(%rbp)
jl     1cac <kernel_dgemm_nt_4x2_vs_lib4+0xbac>
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x68(%rax)
jmp    1cfd <kernel_dgemm_nt_4x2_vs_lib4+0xbfd>
movsd  -0x68(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x40(%rax)
cmpl   $0x4,-0x4(%rbp)
jl     1cf8 <kernel_dgemm_nt_4x2_vs_lib4+0xbf8>
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x60(%rax)
jmp    1cfd <kernel_dgemm_nt_4x2_vs_lib4+0xbfd>
jmp    1d02 <kernel_dgemm_nt_4x2_vs_lib4+0xc02>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgemm_nt_4x2_vs_lib4>:
push   %r15
push   %r14
push   %rbx
cmp    $0x4,%edx
jl     12ae <kernel_dgemm_nt_4x2_vs_lib4+0x1ae>
lea    -0x3(%rdx),%r10d
xorpd  %xmm11,%xmm11
xor    %eax,%eax
xorpd  %xmm7,%xmm7
xorpd  %xmm1,%xmm1
xorpd  %xmm2,%xmm2
cs nopw 0x0(%rax,%rax,1)
nop
movupd (%rcx),%xmm9
movupd (%r8),%xmm3
movupd 0x20(%r8),%xmm8
movupd 0x40(%r8),%xmm0
movupd 0x60(%r8),%xmm12
movapd %xmm3,%xmm5
movsd  0x10(%rcx),%xmm6
unpcklpd %xmm6,%xmm6
mulpd  %xmm3,%xmm6
movsd  0x18(%rcx),%xmm4
unpcklpd %xmm4,%xmm4
mulpd  %xmm3,%xmm4
unpcklpd %xmm3,%xmm3
mulpd  %xmm9,%xmm3
addpd  %xmm7,%xmm3
unpckhpd %xmm5,%xmm5
mulpd  %xmm9,%xmm5
addpd  %xmm1,%xmm5
addpd  %xmm2,%xmm6
addpd  %xmm11,%xmm4
movupd 0x20(%rcx),%xmm9
movapd %xmm8,%xmm1
movsd  0x30(%rcx),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm8,%xmm2
movsd  0x38(%rcx),%xmm7
unpcklpd %xmm7,%xmm7
mulpd  %xmm8,%xmm7
unpcklpd %xmm8,%xmm8
mulpd  %xmm9,%xmm8
addpd  %xmm3,%xmm8
unpckhpd %xmm1,%xmm1
mulpd  %xmm9,%xmm1
addpd  %xmm5,%xmm1
addpd  %xmm6,%xmm2
addpd  %xmm4,%xmm7
movupd 0x40(%rcx),%xmm3
movapd %xmm0,%xmm4
movsd  0x50(%rcx),%xmm6
unpcklpd %xmm6,%xmm6
mulpd  %xmm0,%xmm6
movsd  0x58(%rcx),%xmm5
unpcklpd %xmm5,%xmm5
mulpd  %xmm0,%xmm5
unpcklpd %xmm0,%xmm0
mulpd  %xmm3,%xmm0
addpd  %xmm8,%xmm0
unpckhpd %xmm4,%xmm4
mulpd  %xmm3,%xmm4
addpd  %xmm1,%xmm4
addpd  %xmm2,%xmm6
addpd  %xmm7,%xmm5
movupd 0x60(%rcx),%xmm1
movapd %xmm12,%xmm9
movsd  0x70(%rcx),%xmm10
unpcklpd %xmm10,%xmm10
mulpd  %xmm12,%xmm10
movsd  0x78(%rcx),%xmm8
unpcklpd %xmm8,%xmm8
mulpd  %xmm12,%xmm8
unpcklpd %xmm12,%xmm12
mulpd  %xmm1,%xmm12
movapd %xmm12,%xmm7
addpd  %xmm0,%xmm7
unpckhpd %xmm9,%xmm9
mulpd  %xmm1,%xmm9
movapd %xmm9,%xmm1
addpd  %xmm4,%xmm1
movapd %xmm10,%xmm2
addpd  %xmm6,%xmm2
movapd %xmm8,%xmm11
addpd  %xmm5,%xmm11
sub    $0xffffffffffffff80,%rcx
sub    $0xffffffffffffff80,%r8
add    $0x4,%eax
cmp    %r10d,%eax
jl     1130 <kernel_dgemm_nt_4x2_vs_lib4+0x30>
addpd  %xmm5,%xmm8
addpd  %xmm6,%xmm10
addpd  %xmm4,%xmm9
addpd  %xmm0,%xmm12
mov    %edx,%eax
and    $0xfffffffc,%eax
jmp    12c4 <kernel_dgemm_nt_4x2_vs_lib4+0x1c4>
xorpd  %xmm8,%xmm8
xor    %eax,%eax
xorpd  %xmm12,%xmm12
xorpd  %xmm9,%xmm9
xorpd  %xmm10,%xmm10
mov    0x28(%rsp),%r10d
cmp    %edx,%eax
jge    1385 <kernel_dgemm_nt_4x2_vs_lib4+0x285>
sub    %eax,%edx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nop
movapd %xmm10,%xmm2
movapd %xmm9,%xmm1
movapd %xmm12,%xmm11
movapd %xmm8,%xmm4
movupd (%rcx,%rax,1),%xmm0
movupd (%r8,%rax,1),%xmm3
movapd %xmm3,%xmm5
movsd  0x10(%rcx,%rax,1),%xmm6
unpcklpd %xmm6,%xmm6
mulpd  %xmm3,%xmm6
movsd  0x18(%rcx,%rax,1),%xmm7
unpcklpd %xmm7,%xmm7
mulpd  %xmm3,%xmm7
unpcklpd %xmm3,%xmm3
mulpd  %xmm0,%xmm3
movapd %xmm3,%xmm12
addpd  %xmm11,%xmm12
unpckhpd %xmm5,%xmm5
mulpd  %xmm0,%xmm5
movapd %xmm5,%xmm9
addpd  %xmm1,%xmm9
movapd %xmm6,%xmm10
addpd  %xmm2,%xmm10
movapd %xmm7,%xmm8
addpd  %xmm4,%xmm8
add    $0x20,%rax
add    $0xffffffff,%edx
jne    12e0 <kernel_dgemm_nt_4x2_vs_lib4+0x1e0>
addpd  %xmm4,%xmm7
addpd  %xmm2,%xmm6
addpd  %xmm1,%xmm5
addpd  %xmm11,%xmm3
movapd %xmm7,%xmm8
movapd %xmm3,%xmm12
movapd %xmm5,%xmm9
movapd %xmm6,%xmm10
mov    0x38(%rsp),%r8d
mov    0x20(%rsp),%r11
test   %r10d,%r10d
je     1423 <kernel_dgemm_nt_4x2_vs_lib4+0x323>
lea    0x8(%r9),%rdx
cmpl   $0x0,0x30(%rsp)
je     13bd <kernel_dgemm_nt_4x2_vs_lib4+0x2bd>
mov    %rdx,%r14
lea    0x20(%r9),%rdx
lea    0x40(%r9),%r15
lea    0x48(%r9),%rcx
lea    0x60(%r9),%rbx
mov    $0xd,%eax
jmp    13d2 <kernel_dgemm_nt_4x2_vs_lib4+0x2d2>
lea    0x10(%r9),%r15
lea    0x18(%r9),%rbx
lea    0x20(%r9),%r14
lea    0x30(%r9),%rcx
mov    $0x7,%eax
movsd  (%r9,%rax,8),%xmm2
movsd  (%rbx),%xmm0
movsd  (%rcx),%xmm5
movsd  (%r15),%xmm1
movsd  (%r9),%xmm6
movsd  0x28(%r9),%xmm3
movsd  (%rdx),%xmm7
movsd  (%r14),%xmm4
unpcklpd %xmm7,%xmm6
cmp    $0x1,%r10d
jne    146a <kernel_dgemm_nt_4x2_vs_lib4+0x36a>
addpd  %xmm6,%xmm12
unpcklpd %xmm3,%xmm4
addpd  %xmm4,%xmm9
unpcklpd %xmm5,%xmm1
addpd  %xmm1,%xmm10
unpcklpd %xmm2,%xmm0
addpd  %xmm0,%xmm8
test   %r8d,%r8d
je     14a3 <kernel_dgemm_nt_4x2_vs_lib4+0x3a3>
movapd %xmm12,%xmm0
unpckhpd %xmm9,%xmm0
movsd  %xmm12,(%r11)
cmp    $0x2,%esi
jl     14ee <kernel_dgemm_nt_4x2_vs_lib4+0x3ee>
movsd  %xmm9,0x8(%r11)
movupd %xmm0,0x20(%r11)
movupd %xmm10,0x40(%r11)
cmp    $0x3,%edi
jle    1541 <kernel_dgemm_nt_4x2_vs_lib4+0x441>
mov    $0xd,%ecx
mov    $0xc,%edx
jmp    1530 <kernel_dgemm_nt_4x2_vs_lib4+0x430>
subpd  %xmm12,%xmm6
unpcklpd %xmm3,%xmm4
subpd  %xmm9,%xmm4
unpcklpd %xmm5,%xmm1
subpd  %xmm10,%xmm1
unpcklpd %xmm2,%xmm0
subpd  %xmm8,%xmm0
movapd %xmm0,%xmm8
movapd %xmm6,%xmm12
movapd %xmm4,%xmm9
movapd %xmm1,%xmm10
test   %r8d,%r8d
jne    1428 <kernel_dgemm_nt_4x2_vs_lib4+0x328>
movapd %xmm10,%xmm1
unpckhpd %xmm8,%xmm1
movapd %xmm8,%xmm0
movapd %xmm1,%xmm8
movupd %xmm12,(%r11)
movsd  %xmm10,0x10(%r11)
cmp    $0x4,%edi
jl     1506 <kernel_dgemm_nt_4x2_vs_lib4+0x406>
movsd  %xmm0,0x18(%r11)
cmp    $0x2,%esi
jl     1541 <kernel_dgemm_nt_4x2_vs_lib4+0x441>
movlpd %xmm9,0x20(%r11)
unpckhpd %xmm9,%xmm9
mov    $0x7,%ecx
mov    $0x6,%edx
mov    $0x5,%eax
jmp    152a <kernel_dgemm_nt_4x2_vs_lib4+0x42a>
movlpd %xmm0,0x20(%r11)
movlpd %xmm10,0x40(%r11)
cmp    $0x3,%edi
jle    1541 <kernel_dgemm_nt_4x2_vs_lib4+0x441>
mov    $0xc,%ecx
jmp    153b <kernel_dgemm_nt_4x2_vs_lib4+0x43b>
cmp    $0x1,%esi
jle    1541 <kernel_dgemm_nt_4x2_vs_lib4+0x441>
movapd %xmm9,%xmm0
shufpd $0x1,%xmm8,%xmm0
mov    $0x6,%ecx
mov    $0x5,%edx
mov    $0x4,%eax
movapd %xmm0,%xmm8
movsd  %xmm9,(%r11,%rax,8)
movlpd %xmm8,(%r11,%rdx,8)
unpckhpd %xmm8,%xmm8
movsd  %xmm8,(%r11,%rcx,8)
pop    %rbx
pop    %r14
pop    %r15
ret

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

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