void kernel_dgemm_nt_2x4_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, b_0, b_1, b_2, b_3, c_00 = 0, c_01 = 0, c_02 = 0, c_03 = 0,
                                       c_10 = 0, c_11 = 0, c_12 = 0, c_13 = 0;
  for (k = 0; k < kmax - 3; k += 4) {
    a_0 = A[0 + bs * 0];
    a_1 = A[1 + bs * 0];
    b_0 = B[0 + bs * 0];
    b_1 = B[1 + bs * 0];
    b_2 = B[2 + bs * 0];
    b_3 = B[3 + bs * 0];
    c_00 += a_0 * b_0;
    c_10 += a_1 * b_0;
    c_01 += a_0 * b_1;
    c_11 += a_1 * b_1;
    c_02 += a_0 * b_2;
    c_12 += a_1 * b_2;
    c_03 += a_0 * b_3;
    c_13 += a_1 * b_3;
    a_0 = A[0 + bs * 1];
    a_1 = A[1 + bs * 1];
    b_0 = B[0 + bs * 1];
    b_1 = B[1 + bs * 1];
    b_2 = B[2 + bs * 1];
    b_3 = B[3 + bs * 1];
    c_00 += a_0 * b_0;
    c_10 += a_1 * b_0;
    c_01 += a_0 * b_1;
    c_11 += a_1 * b_1;
    c_02 += a_0 * b_2;
    c_12 += a_1 * b_2;
    c_03 += a_0 * b_3;
    c_13 += a_1 * b_3;
    a_0 = A[0 + bs * 2];
    a_1 = A[1 + bs * 2];
    b_0 = B[0 + bs * 2];
    b_1 = B[1 + bs * 2];
    b_2 = B[2 + bs * 2];
    b_3 = B[3 + bs * 2];
    c_00 += a_0 * b_0;
    c_10 += a_1 * b_0;
    c_01 += a_0 * b_1;
    c_11 += a_1 * b_1;
    c_02 += a_0 * b_2;
    c_12 += a_1 * b_2;
    c_03 += a_0 * b_3;
    c_13 += a_1 * b_3;
    a_0 = A[0 + bs * 3];
    a_1 = A[1 + bs * 3];
    b_0 = B[0 + bs * 3];
    b_1 = B[1 + bs * 3];
    b_2 = B[2 + bs * 3];
    b_3 = B[3 + bs * 3];
    c_00 += a_0 * b_0;
    c_10 += a_1 * b_0;
    c_01 += a_0 * b_1;
    c_11 += a_1 * b_1;
    c_02 += a_0 * b_2;
    c_12 += a_1 * b_2;
    c_03 += a_0 * b_3;
    c_13 += a_1 * b_3;
    A += 16;
    B += 16;
  }
  for (; k < kmax; k++) {
    a_0 = A[0 + bs * 0];
    a_1 = A[1 + bs * 0];
    b_0 = B[0 + bs * 0];
    b_1 = B[1 + bs * 0];
    b_2 = B[2 + bs * 0];
    b_3 = B[3 + bs * 0];
    c_00 += a_0 * b_0;
    c_10 += a_1 * b_0;
    c_01 += a_0 * b_1;
    c_11 += a_1 * b_1;
    c_02 += a_0 * b_2;
    c_12 += a_1 * b_2;
    c_03 += a_0 * b_3;
    c_13 += a_1 * b_3;
    A += 4;
    B += 4;
  }
  double d_00, d_01, d_02, d_03, d_10, d_11, d_12, d_13;
  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_01 = C[0 + bs * 1];
      d_11 = C[1 + bs * 1];
      d_02 = C[0 + bs * 2];
      d_12 = C[1 + bs * 2];
      d_03 = C[0 + bs * 3];
      d_13 = C[1 + bs * 3];
    } else {
      d_00 = C[0 + bs * 0];
      d_01 = C[1 + bs * 0];
      d_02 = C[2 + bs * 0];
      d_03 = C[3 + bs * 0];
      d_10 = C[0 + bs * 1];
      d_11 = C[1 + bs * 1];
      d_12 = C[2 + bs * 1];
      d_13 = C[3 + bs * 1];
    }
    if (alg == 1) {
      c_00 = d_00 + c_00;
      c_10 = d_10 + c_10;
      c_01 = d_01 + c_01;
      c_11 = d_11 + c_11;
      c_02 = d_02 + c_02;
      c_12 = d_12 + c_12;
      c_03 = d_03 + c_03;
      c_13 = d_13 + c_13;
    } else {
      c_00 = d_00 - c_00;
      c_10 = d_10 - c_10;
      c_01 = d_01 - c_01;
      c_11 = d_11 - c_11;
      c_02 = d_02 - c_02;
      c_12 = d_12 - c_12;
      c_03 = d_03 - c_03;
      c_13 = d_13 - c_13;
    }
    if (td == 0) {
      goto store_n;
    } else {
      goto store_t;
    }
  }
store_n:
  if (km >= 2) {
    D[0 + bs * 0] = c_00;
    D[1 + bs * 0] = c_10;
    D[0 + bs * 1] = c_01;
    D[1 + bs * 1] = c_11;
    D[0 + bs * 2] = c_02;
    D[1 + bs * 2] = c_12;
    if (kn >= 4) {
      D[0 + bs * 3] = c_03;
      D[1 + bs * 3] = c_13;
    }
  } else {
    D[0 + bs * 0] = c_00;
    D[0 + bs * 1] = c_01;
    D[0 + bs * 2] = c_02;
    if (kn >= 4) {
      D[0 + bs * 3] = c_03;
    }
  }
  return;
store_t:
  if (kn >= 4) {
    D[0 + bs * 0] = c_00;
    D[1 + bs * 0] = c_01;
    D[2 + bs * 0] = c_02;
    D[3 + bs * 0] = c_03;
    if (km >= 2) {
      D[0 + bs * 1] = c_10;
      D[1 + bs * 1] = c_11;
      D[2 + bs * 1] = c_12;
      D[3 + bs * 1] = c_13;
    }
  } else {
    D[0 + bs * 0] = c_00;
    D[1 + bs * 0] = c_01;
    D[2 + bs * 0] = c_02;
    if (km >= 2) {
      D[0 + bs * 1] = c_10;
      D[1 + bs * 1] = c_11;
      D[2 + bs * 1] = c_12;
    }
  }
  return;
}


x86 assembly (clang, -O0):
<kernel_dgemm_nt_2x4_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_2x4_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    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%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  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%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    -0x20(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%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  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%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    -0x20(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x58(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%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  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%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    -0x20(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x70(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x78(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%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  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%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_2x4_vs_lib4+0x84>
jmp    16f2 <kernel_dgemm_nt_2x4_vs_lib4+0x5f2>
mov    -0x30(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    186e <kernel_dgemm_nt_2x4_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    -0x20(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x68(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
movsd  -0x88(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x70(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x40(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm2
movsd  -0x90(%rbp),%xmm1
ff
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x38(%rbp),%xmm0
movsd  -0x58(%rbp),%xmm2
movsd  -0x78(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x40(%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  -0x80(%rbp),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x40(%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_2x4_vs_lib4+0x5f2>
cmpl   $0x0,0x18(%rbp)
jne    188c <kernel_dgemm_nt_2x4_vs_lib4+0x78c>
cmpl   $0x0,0x28(%rbp)
jne    1887 <kernel_dgemm_nt_2x4_vs_lib4+0x787>
jmp    1b1c <kernel_dgemm_nt_2x4_vs_lib4+0xa1c>
jmp    1bfb <kernel_dgemm_nt_2x4_vs_lib4+0xafb>
cmpl   $0x0,0x20(%rbp)
jne    1922 <kernel_dgemm_nt_2x4_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,-0xc8(%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,-0xd0(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
jmp    19a9 <kernel_dgemm_nt_2x4_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  0x10(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x28(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
cmpl   $0x1,0x18(%rbp)
jne    1a60 <kernel_dgemm_nt_2x4_vs_lib4+0x960>
movsd  -0xa8(%rbp),%xmm0
ff
addsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0xc8(%rbp),%xmm0
ff
addsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
addsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0xd0(%rbp),%xmm0
ff
addsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0xb8(%rbp),%xmm0
ff
addsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0xd8(%rbp),%xmm0
ff
addsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
addsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0xe0(%rbp),%xmm0
ff
addsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
jmp    1b08 <kernel_dgemm_nt_2x4_vs_lib4+0xa08>
movsd  -0xa8(%rbp),%xmm0
ff
subsd  -0x68(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0xc8(%rbp),%xmm0
ff
subsd  -0x88(%rbp),%xmm0
ff
movsd  %xmm0,-0x88(%rbp)
ff
movsd  -0xb0(%rbp),%xmm0
ff
subsd  -0x70(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0xd0(%rbp),%xmm0
ff
subsd  -0x90(%rbp),%xmm0
ff
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0xb8(%rbp),%xmm0
ff
subsd  -0x78(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0xd8(%rbp),%xmm0
ff
subsd  -0x98(%rbp),%xmm0
ff
movsd  %xmm0,-0x98(%rbp)
ff
movsd  -0xc0(%rbp),%xmm0
ff
subsd  -0x80(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0xe0(%rbp),%xmm0
ff
subsd  -0xa0(%rbp),%xmm0
ff
movsd  %xmm0,-0xa0(%rbp)
ff
cmpl   $0x0,0x28(%rbp)
jne    1b17 <kernel_dgemm_nt_2x4_vs_lib4+0xa17>
jmp    1b1c <kernel_dgemm_nt_2x4_vs_lib4+0xa1c>
jmp    1bfb <kernel_dgemm_nt_2x4_vs_lib4+0xafb>
cmpl   $0x2,-0x4(%rbp)
jl     1bb0 <kernel_dgemm_nt_2x4_vs_lib4+0xab0>
movsd  -0x68(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x48(%rax)
cmpl   $0x4,-0x8(%rbp)
jl     1bab <kernel_dgemm_nt_2x4_vs_lib4+0xaab>
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x68(%rax)
jmp    1bf6 <kernel_dgemm_nt_2x4_vs_lib4+0xaf6>
movsd  -0x68(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x40(%rax)
cmpl   $0x4,-0x8(%rbp)
jl     1bf1 <kernel_dgemm_nt_2x4_vs_lib4+0xaf1>
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x60(%rax)
jmp    1bf6 <kernel_dgemm_nt_2x4_vs_lib4+0xaf6>
jmp    1cff <kernel_dgemm_nt_2x4_vs_lib4+0xbff>
cmpl   $0x4,-0x8(%rbp)
jl     1c8f <kernel_dgemm_nt_2x4_vs_lib4+0xb8f>
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,0x10(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x10(%rbp),%rax
movsd  %xmm0,0x18(%rax)
cmpl   $0x2,-0x4(%rbp)
jl     1c8a <kernel_dgemm_nt_2x4_vs_lib4+0xb8a>
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x98(%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    1cfa <kernel_dgemm_nt_2x4_vs_lib4+0xbfa>
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,0x10(%rax)
cmpl   $0x2,-0x4(%rbp)
jl     1cf5 <kernel_dgemm_nt_2x4_vs_lib4+0xbf5>
movsd  -0x88(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x10(%rbp),%rax
movsd  %xmm0,0x30(%rax)
jmp    1cfa <kernel_dgemm_nt_2x4_vs_lib4+0xbfa>
jmp    1cff <kernel_dgemm_nt_2x4_vs_lib4+0xbff>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgemm_nt_2x4_vs_lib4>:
push   %r15
push   %r14
push   %rbx
cmp    $0x4,%edx
jl     12bd <kernel_dgemm_nt_2x4_vs_lib4+0x1bd>
lea    -0x3(%rdx),%r10d
xorpd  %xmm7,%xmm7
xor    %eax,%eax
xorpd  %xmm1,%xmm1
xorpd  %xmm3,%xmm3
xorpd  %xmm2,%xmm2
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movupd (%rcx),%xmm11
movupd 0x20(%rcx),%xmm10
movupd 0x40(%rcx),%xmm9
movupd 0x60(%rcx),%xmm8
movsd  (%r8),%xmm4
movsd  0x8(%r8),%xmm6
movsd  0x10(%r8),%xmm5
movsd  0x18(%r8),%xmm0
unpcklpd %xmm4,%xmm4
mulpd  %xmm11,%xmm4
addpd  %xmm2,%xmm4
unpcklpd %xmm6,%xmm6
mulpd  %xmm11,%xmm6
addpd  %xmm1,%xmm6
unpcklpd %xmm5,%xmm5
mulpd  %xmm11,%xmm5
addpd  %xmm3,%xmm5
unpcklpd %xmm0,%xmm0
mulpd  %xmm11,%xmm0
addpd  %xmm7,%xmm0
movsd  0x20(%r8),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm10,%xmm1
addpd  %xmm4,%xmm1
movsd  0x28(%r8),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm10,%xmm2
addpd  %xmm6,%xmm2
movsd  0x30(%r8),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm10,%xmm3
addpd  %xmm5,%xmm3
movsd  0x38(%r8),%xmm7
unpcklpd %xmm7,%xmm7
mulpd  %xmm10,%xmm7
addpd  %xmm0,%xmm7
movsd  0x40(%r8),%xmm5
unpcklpd %xmm5,%xmm5
mulpd  %xmm9,%xmm5
addpd  %xmm1,%xmm5
movsd  0x48(%r8),%xmm6
unpcklpd %xmm6,%xmm6
mulpd  %xmm9,%xmm6
addpd  %xmm2,%xmm6
movsd  0x50(%r8),%xmm4
unpcklpd %xmm4,%xmm4
mulpd  %xmm9,%xmm4
addpd  %xmm3,%xmm4
movsd  0x58(%r8),%xmm0
unpcklpd %xmm0,%xmm0
mulpd  %xmm9,%xmm0
addpd  %xmm7,%xmm0
movsd  0x60(%r8),%xmm11
unpcklpd %xmm11,%xmm11
mulpd  %xmm8,%xmm11
movapd %xmm11,%xmm2
addpd  %xmm5,%xmm2
movsd  0x68(%r8),%xmm10
unpcklpd %xmm10,%xmm10
mulpd  %xmm8,%xmm10
movapd %xmm10,%xmm1
addpd  %xmm6,%xmm1
movsd  0x70(%r8),%xmm12
unpcklpd %xmm12,%xmm12
mulpd  %xmm8,%xmm12
movapd %xmm12,%xmm3
addpd  %xmm4,%xmm3
movsd  0x78(%r8),%xmm9
unpcklpd %xmm9,%xmm9
mulpd  %xmm8,%xmm9
movapd %xmm9,%xmm7
addpd  %xmm0,%xmm7
sub    $0xffffffffffffff80,%rcx
sub    $0xffffffffffffff80,%r8
add    $0x4,%eax
cmp    %r10d,%eax
jl     1130 <kernel_dgemm_nt_2x4_vs_lib4+0x30>
addpd  %xmm0,%xmm9
addpd  %xmm4,%xmm12
addpd  %xmm6,%xmm10
addpd  %xmm5,%xmm11
mov    %edx,%eax
and    $0xfffffffc,%eax
jmp    12d3 <kernel_dgemm_nt_2x4_vs_lib4+0x1d3>
xorpd  %xmm9,%xmm9
xor    %eax,%eax
xorpd  %xmm10,%xmm10
xorpd  %xmm12,%xmm12
xorpd  %xmm11,%xmm11
mov    0x28(%rsp),%r10d
cmp    %edx,%eax
jge    139e <kernel_dgemm_nt_2x4_vs_lib4+0x29e>
sub    %eax,%edx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movapd %xmm11,%xmm8
movapd %xmm12,%xmm3
movapd %xmm10,%xmm2
movapd %xmm9,%xmm6
movupd (%rcx,%rax,1),%xmm1
movsd  (%r8,%rax,1),%xmm0
movsd  0x8(%r8,%rax,1),%xmm4
movsd  0x10(%r8,%rax,1),%xmm5
movsd  0x18(%r8,%rax,1),%xmm7
unpcklpd %xmm0,%xmm0
mulpd  %xmm1,%xmm0
movapd %xmm0,%xmm11
addpd  %xmm8,%xmm11
unpcklpd %xmm4,%xmm4
mulpd  %xmm1,%xmm4
movapd %xmm4,%xmm10
addpd  %xmm2,%xmm10
unpcklpd %xmm5,%xmm5
mulpd  %xmm1,%xmm5
movapd %xmm5,%xmm12
addpd  %xmm3,%xmm12
unpcklpd %xmm7,%xmm7
mulpd  %xmm1,%xmm7
movapd %xmm7,%xmm9
addpd  %xmm6,%xmm9
add    $0x20,%rax
add    $0xffffffff,%edx
jne    12f0 <kernel_dgemm_nt_2x4_vs_lib4+0x1f0>
addpd  %xmm6,%xmm7
addpd  %xmm3,%xmm5
addpd  %xmm2,%xmm4
addpd  %xmm8,%xmm0
movapd %xmm7,%xmm9
movapd %xmm4,%xmm10
movapd %xmm5,%xmm12
movapd %xmm0,%xmm11
mov    0x38(%rsp),%r8d
mov    0x20(%rsp),%r11
test   %r10d,%r10d
je     1440 <kernel_dgemm_nt_2x4_vs_lib4+0x340>
lea    0x8(%r9),%rdx
cmpl   $0x0,0x30(%rsp)
je     13d6 <kernel_dgemm_nt_2x4_vs_lib4+0x2d6>
lea    0x10(%r9),%r14
lea    0x18(%r9),%r15
mov    %rdx,%rax
lea    0x20(%r9),%rdx
lea    0x30(%r9),%rcx
mov    $0x7,%ebx
jmp    13eb <kernel_dgemm_nt_2x4_vs_lib4+0x2eb>
lea    0x20(%r9),%rax
lea    0x40(%r9),%r14
lea    0x48(%r9),%rcx
lea    0x60(%r9),%r15
mov    $0xd,%ebx
movsd  (%r9,%rbx,8),%xmm0
movsd  (%rcx),%xmm4
movsd  (%r9),%xmm3
movsd  0x28(%r9),%xmm6
movsd  (%rdx),%xmm7
movsd  (%r15),%xmm1
movsd  (%r14),%xmm2
movsd  (%rax),%xmm5
unpcklpd %xmm7,%xmm3
cmp    $0x1,%r10d
jne    14b4 <kernel_dgemm_nt_2x4_vs_lib4+0x3b4>
addpd  %xmm3,%xmm11
unpcklpd %xmm6,%xmm5
addpd  %xmm5,%xmm10
unpcklpd %xmm4,%xmm2
addpd  %xmm2,%xmm12
unpcklpd %xmm0,%xmm1
addpd  %xmm1,%xmm9
test   %r8d,%r8d
je     14f1 <kernel_dgemm_nt_2x4_vs_lib4+0x3f1>
movapd %xmm12,%xmm2
unpckhpd %xmm9,%xmm2
movapd %xmm10,%xmm4
unpckhpd %xmm10,%xmm4
movapd %xmm11,%xmm1
unpckhpd %xmm11,%xmm1
movapd %xmm9,%xmm0
movapd %xmm2,%xmm9
movsd  %xmm11,(%r11)
movsd  %xmm10,0x8(%r11)
movsd  %xmm12,0x10(%r11)
cmp    $0x4,%esi
jl     151e <kernel_dgemm_nt_2x4_vs_lib4+0x41e>
movsd  %xmm0,0x18(%r11)
cmp    $0x2,%edi
jl     1557 <kernel_dgemm_nt_2x4_vs_lib4+0x457>
movsd  %xmm1,0x20(%r11)
mov    $0x7,%ecx
mov    $0x6,%edx
mov    $0x5,%eax
jmp    1540 <kernel_dgemm_nt_2x4_vs_lib4+0x440>
subpd  %xmm11,%xmm3
unpcklpd %xmm6,%xmm5
subpd  %xmm10,%xmm5
unpcklpd %xmm4,%xmm2
subpd  %xmm12,%xmm2
unpcklpd %xmm0,%xmm1
subpd  %xmm9,%xmm1
movapd %xmm1,%xmm9
movapd %xmm5,%xmm10
movapd %xmm2,%xmm12
movapd %xmm3,%xmm11
test   %r8d,%r8d
jne    1449 <kernel_dgemm_nt_2x4_vs_lib4+0x349>
movlpd %xmm11,(%r11)
cmp    $0x2,%edi
jl     155d <kernel_dgemm_nt_2x4_vs_lib4+0x45d>
movhpd %xmm11,0x8(%r11)
movupd %xmm10,0x20(%r11)
movupd %xmm12,0x40(%r11)
cmp    $0x3,%esi
jle    1557 <kernel_dgemm_nt_2x4_vs_lib4+0x457>
mov    $0xd,%ecx
mov    $0xc,%edx
jmp    1546 <kernel_dgemm_nt_2x4_vs_lib4+0x446>
cmp    $0x2,%edi
jl     1557 <kernel_dgemm_nt_2x4_vs_lib4+0x457>
unpcklpd %xmm9,%xmm4
mov    $0x6,%ecx
mov    $0x5,%edx
mov    $0x4,%eax
movapd %xmm4,%xmm9
movapd %xmm1,%xmm4
movsd  %xmm4,(%r11,%rax,8)
movlpd %xmm9,(%r11,%rdx,8)
unpckhpd %xmm9,%xmm9
movsd  %xmm9,(%r11,%rcx,8)
pop    %rbx
pop    %r14
pop    %r15
ret
movlpd %xmm10,0x20(%r11)
movlpd %xmm12,0x40(%r11)
cmp    $0x3,%esi
jle    1557 <kernel_dgemm_nt_2x4_vs_lib4+0x457>
mov    $0xc,%ecx
jmp    1551 <kernel_dgemm_nt_2x4_vs_lib4+0x451>

LLVM IR (-O0):
define void @kernel_dgemm_nt_2x4_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** %15
%58 = getelementptr inbounds double, double* %57, i64 0
%59 = load double, double* %58
store double %59, double* %25
%60 = load double*, double** %15
%61 = getelementptr inbounds double, double* %60, i64 1
%62 = load double, double* %61
store double %62, double* %26
%63 = load double*, double** %15
%64 = getelementptr inbounds double, double* %63, i64 2
%65 = load double, double* %64
store double %65, double* %27
%66 = load double*, double** %15
%67 = getelementptr inbounds double, double* %66, i64 3
%68 = load double, double* %67
store double %68, double* %28
%69 = load double, double* %23
%70 = load double, double* %25
%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* %25
%75 = load double, double* %33
%76 = call double @llvm.fmuladd.f64(double %73, double %74, double %75)
store double %76, double* %33
%77 = load double, double* %23
%78 = load double, double* %26
%79 = load double, double* %30
%80 = call double @llvm.fmuladd.f64(double %77, double %78, double %79)
store double %80, double* %30
%81 = load double, double* %24
%82 = load double, double* %26
%83 = load double, double* %34
%84 = call double @llvm.fmuladd.f64(double %81, double %82, double %83)
store double %84, double* %34
%85 = load double, double* %23
%86 = load double, double* %27
%87 = load double, double* %31
%88 = call double @llvm.fmuladd.f64(double %85, double %86, double %87)
store double %88, double* %31
%89 = load double, double* %24
%90 = load double, double* %27
%91 = load double, double* %35
%92 = call double @llvm.fmuladd.f64(double %89, double %90, double %91)
store double %92, double* %35
%93 = load double, double* %23
%94 = load double, double* %28
%95 = load double, double* %32
%96 = call double @llvm.fmuladd.f64(double %93, double %94, double %95)
store double %96, double* %32
%97 = load double, double* %24
%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** %15
%108 = getelementptr inbounds double, double* %107, i64 4
%109 = load double, double* %108
store double %109, double* %25
%110 = load double*, double** %15
%111 = getelementptr inbounds double, double* %110, i64 5
%112 = load double, double* %111
store double %112, double* %26
%113 = load double*, double** %15
%114 = getelementptr inbounds double, double* %113, i64 6
%115 = load double, double* %114
store double %115, double* %27
%116 = load double*, double** %15
%117 = getelementptr inbounds double, double* %116, i64 7
%118 = load double, double* %117
store double %118, double* %28
%119 = load double, double* %23
%120 = load double, double* %25
%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* %25
%125 = load double, double* %33
%126 = call double @llvm.fmuladd.f64(double %123, double %124, double %125)
store double %126, double* %33
%127 = load double, double* %23
%128 = load double, double* %26
%129 = load double, double* %30
%130 = call double @llvm.fmuladd.f64(double %127, double %128, double %129)
store double %130, double* %30
%131 = load double, double* %24
%132 = load double, double* %26
%133 = load double, double* %34
%134 = call double @llvm.fmuladd.f64(double %131, double %132, double %133)
store double %134, double* %34
%135 = load double, double* %23
%136 = load double, double* %27
%137 = load double, double* %31
%138 = call double @llvm.fmuladd.f64(double %135, double %136, double %137)
store double %138, double* %31
%139 = load double, double* %24
%140 = load double, double* %27
%141 = load double, double* %35
%142 = call double @llvm.fmuladd.f64(double %139, double %140, double %141)
store double %142, double* %35
%143 = load double, double* %23
%144 = load double, double* %28
%145 = load double, double* %32
%146 = call double @llvm.fmuladd.f64(double %143, double %144, double %145)
store double %146, double* %32
%147 = load double, double* %24
%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** %15
%158 = getelementptr inbounds double, double* %157, i64 8
%159 = load double, double* %158
store double %159, double* %25
%160 = load double*, double** %15
%161 = getelementptr inbounds double, double* %160, i64 9
%162 = load double, double* %161
store double %162, double* %26
%163 = load double*, double** %15
%164 = getelementptr inbounds double, double* %163, i64 10
%165 = load double, double* %164
store double %165, double* %27
%166 = load double*, double** %15
%167 = getelementptr inbounds double, double* %166, i64 11
%168 = load double, double* %167
store double %168, double* %28
%169 = load double, double* %23
%170 = load double, double* %25
%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* %25
%175 = load double, double* %33
%176 = call double @llvm.fmuladd.f64(double %173, double %174, double %175)
store double %176, double* %33
%177 = load double, double* %23
%178 = load double, double* %26
%179 = load double, double* %30
%180 = call double @llvm.fmuladd.f64(double %177, double %178, double %179)
store double %180, double* %30
%181 = load double, double* %24
%182 = load double, double* %26
%183 = load double, double* %34
%184 = call double @llvm.fmuladd.f64(double %181, double %182, double %183)
store double %184, double* %34
%185 = load double, double* %23
%186 = load double, double* %27
%187 = load double, double* %31
%188 = call double @llvm.fmuladd.f64(double %185, double %186, double %187)
store double %188, double* %31
%189 = load double, double* %24
%190 = load double, double* %27
%191 = load double, double* %35
%192 = call double @llvm.fmuladd.f64(double %189, double %190, double %191)
store double %192, double* %35
%193 = load double, double* %23
%194 = load double, double* %28
%195 = load double, double* %32
%196 = call double @llvm.fmuladd.f64(double %193, double %194, double %195)
store double %196, double* %32
%197 = load double, double* %24
%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** %15
%208 = getelementptr inbounds double, double* %207, i64 12
%209 = load double, double* %208
store double %209, double* %25
%210 = load double*, double** %15
%211 = getelementptr inbounds double, double* %210, i64 13
%212 = load double, double* %211
store double %212, double* %26
%213 = load double*, double** %15
%214 = getelementptr inbounds double, double* %213, i64 14
%215 = load double, double* %214
store double %215, double* %27
%216 = load double*, double** %15
%217 = getelementptr inbounds double, double* %216, i64 15
%218 = load double, double* %217
store double %218, double* %28
%219 = load double, double* %23
%220 = load double, double* %25
%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* %25
%225 = load double, double* %33
%226 = call double @llvm.fmuladd.f64(double %223, double %224, double %225)
store double %226, double* %33
%227 = load double, double* %23
%228 = load double, double* %26
%229 = load double, double* %30
%230 = call double @llvm.fmuladd.f64(double %227, double %228, double %229)
store double %230, double* %30
%231 = load double, double* %24
%232 = load double, double* %26
%233 = load double, double* %34
%234 = call double @llvm.fmuladd.f64(double %231, double %232, double %233)
store double %234, double* %34
%235 = load double, double* %23
%236 = load double, double* %27
%237 = load double, double* %31
%238 = call double @llvm.fmuladd.f64(double %235, double %236, double %237)
store double %238, double* %31
%239 = load double, double* %24
%240 = load double, double* %27
%241 = load double, double* %35
%242 = call double @llvm.fmuladd.f64(double %239, double %240, double %241)
store double %242, double* %35
%243 = load double, double* %23
%244 = load double, double* %28
%245 = load double, double* %32
%246 = call double @llvm.fmuladd.f64(double %243, double %244, double %245)
store double %246, double* %32
%247 = load double, double* %24
%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** %15
%271 = getelementptr inbounds double, double* %270, i64 0
%272 = load double, double* %271
store double %272, double* %25
%273 = load double*, double** %15
%274 = getelementptr inbounds double, double* %273, i64 1
%275 = load double, double* %274
store double %275, double* %26
%276 = load double*, double** %15
%277 = getelementptr inbounds double, double* %276, i64 2
%278 = load double, double* %277
store double %278, double* %27
%279 = load double*, double** %15
%280 = getelementptr inbounds double, double* %279, i64 3
%281 = load double, double* %280
store double %281, double* %28
%282 = load double, double* %23
%283 = load double, double* %25
%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* %25
%288 = load double, double* %33
%289 = call double @llvm.fmuladd.f64(double %286, double %287, double %288)
store double %289, double* %33
%290 = load double, double* %23
%291 = load double, double* %26
%292 = load double, double* %30
%293 = call double @llvm.fmuladd.f64(double %290, double %291, double %292)
store double %293, double* %30
%294 = load double, double* %24
%295 = load double, double* %26
%296 = load double, double* %34
%297 = call double @llvm.fmuladd.f64(double %294, double %295, double %296)
store double %297, double* %34
%298 = load double, double* %23
%299 = load double, double* %27
%300 = load double, double* %31
%301 = call double @llvm.fmuladd.f64(double %298, double %299, double %300)
store double %301, double* %31
%302 = load double, double* %24
%303 = load double, double* %27
%304 = load double, double* %35
%305 = call double @llvm.fmuladd.f64(double %302, double %303, double %304)
store double %305, double* %35
%306 = load double, double* %23
%307 = load double, double* %28
%308 = load double, double* %32
%309 = call double @llvm.fmuladd.f64(double %306, double %307, double %308)
store double %309, double* %32
%310 = load double, double* %24
%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 %490
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* %41
%339 = load double*, double** %16
%340 = getelementptr inbounds double, double* %339, i64 4
%341 = load double, double* %340
store double %341, double* %38
%342 = load double*, double** %16
%343 = getelementptr inbounds double, double* %342, i64 5
%344 = load double, double* %343
store double %344, double* %42
%345 = load double*, double** %16
%346 = getelementptr inbounds double, double* %345, i64 8
%347 = load double, double* %346
store double %347, double* %39
%348 = load double*, double** %16
%349 = getelementptr inbounds double, double* %348, i64 9
%350 = load double, double* %349
store double %350, double* %43
%351 = load double*, double** %16
%352 = getelementptr inbounds double, double* %351, i64 12
%353 = load double, double* %352
store double %353, double* %40
%354 = load double*, double** %16
%355 = getelementptr inbounds double, double* %354, i64 13
%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 2
%366 = load double, double* %365
store double %366, double* %39
%367 = load double*, double** %16
%368 = getelementptr inbounds double, double* %367, i64 3
%369 = load double, double* %368
store double %369, double* %40
%370 = load double*, double** %16
%371 = getelementptr inbounds double, double* %370, i64 4
%372 = load double, double* %371
store double %372, double* %41
%373 = load double*, double** %16
%374 = getelementptr inbounds double, double* %373, i64 5
%375 = load double, double* %374
store double %375, double* %42
%376 = load double*, double** %16
%377 = getelementptr inbounds double, double* %376, i64 6
%378 = load double, double* %377
store double %378, double* %43
%379 = load double*, double** %16
%380 = getelementptr inbounds double, double* %379, i64 7
%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* %41
%390 = load double, double* %33
%391 = fadd double %389, %390
store double %391, double* %33
%392 = load double, double* %38
%393 = load double, double* %30
%394 = fadd double %392, %393
store double %394, double* %30
%395 = load double, double* %42
%396 = load double, double* %34
%397 = fadd double %395, %396
store double %397, double* %34
%398 = load double, double* %39
%399 = load double, double* %31
%400 = fadd double %398, %399
store double %400, double* %31
%401 = load double, double* %43
%402 = load double, double* %35
%403 = fadd double %401, %402
store double %403, double* %35
%404 = load double, double* %40
%405 = load double, double* %32
%406 = fadd double %404, %405
store double %406, double* %32
%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* %41
%415 = load double, double* %33
%416 = fsub double %414, %415
store double %416, double* %33
%417 = load double, double* %38
%418 = load double, double* %30
%419 = fsub double %417, %418
store double %419, double* %30
%420 = load double, double* %42
%421 = load double, double* %34
%422 = fsub double %420, %421
store double %422, double* %34
%423 = load double, double* %39
%424 = load double, double* %31
%425 = fsub double %423, %424
store double %425, double* %31
%426 = load double, double* %43
%427 = load double, double* %35
%428 = fsub double %426, %427
store double %428, double* %35
%429 = load double, double* %40
%430 = load double, double* %32
%431 = fsub double %429, %430
store double %431, double* %32
%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 %490
440: ; preds = %438, %327
%441 = load i32, i32* %11
%442 = icmp sge i32 %441, 2
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* %33
%448 = load double*, double** %17
%449 = getelementptr inbounds double, double* %448, i64 1
store double %447, double* %449
%450 = load double, double* %30
%451 = load double*, double** %17
%452 = getelementptr inbounds double, double* %451, i64 4
store double %450, double* %452
%453 = load double, double* %34
%454 = load double*, double** %17
%455 = getelementptr inbounds double, double* %454, i64 5
store double %453, double* %455
%456 = load double, double* %31
%457 = load double*, double** %17
%458 = getelementptr inbounds double, double* %457, i64 8
store double %456, double* %458
%459 = load double, double* %35
%460 = load double*, double** %17
%461 = getelementptr inbounds double, double* %460, i64 9
store double %459, double* %461
%462 = load i32, i32* %12
%463 = icmp sge i32 %462, 4
br i1 %463, label %464, label %471
464: ; preds = %443
%465 = load double, double* %32
%466 = load double*, double** %17
%467 = getelementptr inbounds double, double* %466, i64 12
store double %465, double* %467
%468 = load double, double* %36
%469 = load double*, double** %17
%470 = getelementptr inbounds double, double* %469, i64 13
store double %468, double* %470
br label %471
471: ; preds = %464, %443
br label %489
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* %30
%477 = load double*, double** %17
%478 = getelementptr inbounds double, double* %477, i64 4
store double %476, double* %478
%479 = load double, double* %31
%480 = load double*, double** %17
%481 = getelementptr inbounds double, double* %480, i64 8
store double %479, double* %481
%482 = load i32, i32* %12
%483 = icmp sge i32 %482, 4
br i1 %483, label %484, label %488
484: ; preds = %472
%485 = load double, double* %32
%486 = load double*, double** %17
%487 = getelementptr inbounds double, double* %486, i64 12
store double %485, double* %487
br label %488
488: ; preds = %484, %472
br label %489
489: ; preds = %488, %471
br label %546
490: ; preds = %439, %328
%491 = load i32, i32* %12
%492 = icmp sge i32 %491, 4
br i1 %492, label %493, label %522
493: ; preds = %490
%494 = load double, double* %29
%495 = load double*, double** %17
%496 = getelementptr inbounds double, double* %495, i64 0
store double %494, double* %496
%497 = load double, double* %30
%498 = load double*, double** %17
%499 = getelementptr inbounds double, double* %498, i64 1
store double %497, double* %499
%500 = load double, double* %31
%501 = load double*, double** %17
%502 = getelementptr inbounds double, double* %501, i64 2
store double %500, double* %502
%503 = load double, double* %32
%504 = load double*, double** %17
%505 = getelementptr inbounds double, double* %504, i64 3
store double %503, double* %505
%506 = load i32, i32* %11
%507 = icmp sge i32 %506, 2
br i1 %507, label %508, label %521
508: ; preds = %493
%509 = load double, double* %33
%510 = load double*, double** %17
%511 = getelementptr inbounds double, double* %510, i64 4
store double %509, double* %511
%512 = load double, double* %34
%513 = load double*, double** %17
%514 = getelementptr inbounds double, double* %513, i64 5
store double %512, double* %514
%515 = load double, double* %35
%516 = load double*, double** %17
%517 = getelementptr inbounds double, double* %516, i64 6
store double %515, double* %517
%518 = load double, double* %36
%519 = load double*, double** %17
%520 = getelementptr inbounds double, double* %519, i64 7
store double %518, double* %520
br label %521
521: ; preds = %508, %493
br label %545
522: ; preds = %490
%523 = load double, double* %29
%524 = load double*, double** %17
%525 = getelementptr inbounds double, double* %524, i64 0
store double %523, double* %525
%526 = load double, double* %30
%527 = load double*, double** %17
%528 = getelementptr inbounds double, double* %527, i64 1
store double %526, double* %528
%529 = load double, double* %31
%530 = load double*, double** %17
%531 = getelementptr inbounds double, double* %530, i64 2
store double %529, double* %531
%532 = load i32, i32* %11
%533 = icmp sge i32 %532, 2
br i1 %533, label %534, label %544
534: ; preds = %522
%535 = load double, double* %33
%536 = load double*, double** %17
%537 = getelementptr inbounds double, double* %536, i64 4
store double %535, double* %537
%538 = load double, double* %34
%539 = load double*, double** %17
%540 = getelementptr inbounds double, double* %539, i64 5
store double %538, double* %540
%541 = load double, double* %35
%542 = load double*, double** %17
%543 = getelementptr inbounds double, double* %542, i64 6
store double %541, double* %543
br label %544
544: ; preds = %534, %522
br label %545
545: ; preds = %544, %521
br label %546
546: ; preds = %545, %489
ret void
}

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