void kernel_dgemm_nn_2x4_vs_lib4(int km, int kn, int kmax, double *A, double *B,
                                 int sdb, 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[0 + bs * 1];
    b_2 = B[0 + bs * 2];
    b_3 = B[0 + 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_0 = A[0 + bs * 1];
    a_1 = A[1 + bs * 1];
    b_0 = B[1 + bs * 0];
    b_1 = B[1 + bs * 1];
    b_2 = B[1 + bs * 2];
    b_3 = B[1 + 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_0 = A[0 + bs * 2];
    a_1 = A[1 + bs * 2];
    b_0 = B[2 + bs * 0];
    b_1 = B[2 + bs * 1];
    b_2 = B[2 + bs * 2];
    b_3 = B[2 + 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_0 = A[0 + bs * 3];
    a_1 = A[1 + bs * 3];
    b_0 = B[3 + bs * 0];
    b_1 = B[3 + bs * 1];
    b_2 = B[3 + bs * 2];
    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 += 4 * sdb;
  }
  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[0 + bs * 1];
    b_2 = B[0 + bs * 2];
    b_3 = B[0 + 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 += 4;
    B += 1;
  }
  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_nn_2x4_vs_lib4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    0x30(%rbp),%eax
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%rax
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    %r9d,-0x24(%rbp)
movl   $0x4,-0x28(%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,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0xc(%rbp),%ecx
sub    $0x3,%ecx
cmp    %ecx,%eax
jge    16fb <kernel_dgemm_nn_2x4_vs_lib4+0x5fb>
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  0x20(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x60(%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  0x8(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x68(%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  0x10(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x50(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x70(%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  0x18(%rax),%xmm0
movsd  %xmm0,-0x48(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x58(%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    -0x24(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x20(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x4,%eax
mov    %eax,-0x2c(%rbp)
jmp    1188 <kernel_dgemm_nn_2x4_vs_lib4+0x88>
jmp    1700 <kernel_dgemm_nn_2x4_vs_lib4+0x600>
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    187c <kernel_dgemm_nn_2x4_vs_lib4+0x77c>
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  0x20(%rax),%xmm0
movsd  %xmm0,-0x50(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0x58(%rbp)
mov    -0x20(%rbp),%rax
movsd  0x60(%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    $0x8,%rax
mov    %rax,-0x20(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1700 <kernel_dgemm_nn_2x4_vs_lib4+0x600>
cmpl   $0x0,0x20(%rbp)
jne    189a <kernel_dgemm_nn_2x4_vs_lib4+0x79a>
cmpl   $0x0,0x30(%rbp)
jne    1895 <kernel_dgemm_nn_2x4_vs_lib4+0x795>
jmp    1b2a <kernel_dgemm_nn_2x4_vs_lib4+0xa2a>
jmp    1c09 <kernel_dgemm_nn_2x4_vs_lib4+0xb09>
cmpl   $0x0,0x28(%rbp)
jne    1930 <kernel_dgemm_nn_2x4_vs_lib4+0x830>
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x40(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x48(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x60(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x68(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
jmp    19b7 <kernel_dgemm_nn_2x4_vs_lib4+0x8b7>
mov    0x10(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x20(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x28(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x30(%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    0x10(%rbp),%rax
movsd  0x38(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
cmpl   $0x1,0x20(%rbp)
jne    1a6e <kernel_dgemm_nn_2x4_vs_lib4+0x96e>
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    1b16 <kernel_dgemm_nn_2x4_vs_lib4+0xa16>
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,0x30(%rbp)
jne    1b25 <kernel_dgemm_nn_2x4_vs_lib4+0xa25>
jmp    1b2a <kernel_dgemm_nn_2x4_vs_lib4+0xa2a>
jmp    1c09 <kernel_dgemm_nn_2x4_vs_lib4+0xb09>
cmpl   $0x2,-0x4(%rbp)
jl     1bbe <kernel_dgemm_nn_2x4_vs_lib4+0xabe>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x48(%rax)
cmpl   $0x4,-0x8(%rbp)
jl     1bb9 <kernel_dgemm_nn_2x4_vs_lib4+0xab9>
movsd  -0x80(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x68(%rax)
jmp    1c04 <kernel_dgemm_nn_2x4_vs_lib4+0xb04>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x40(%rax)
cmpl   $0x4,-0x8(%rbp)
jl     1bff <kernel_dgemm_nn_2x4_vs_lib4+0xaff>
movsd  -0x80(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x60(%rax)
jmp    1c04 <kernel_dgemm_nn_2x4_vs_lib4+0xb04>
jmp    1d0d <kernel_dgemm_nn_2x4_vs_lib4+0xc0d>
cmpl   $0x4,-0x8(%rbp)
jl     1c9d <kernel_dgemm_nn_2x4_vs_lib4+0xb9d>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x80(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x18(%rax)
cmpl   $0x2,-0x4(%rbp)
jl     1c98 <kernel_dgemm_nn_2x4_vs_lib4+0xb98>
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x38(%rax)
jmp    1d08 <kernel_dgemm_nn_2x4_vs_lib4+0xc08>
movsd  -0x68(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x70(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x78(%rbp),%xmm0
mov    0x18(%rbp),%rax
movsd  %xmm0,0x10(%rax)
cmpl   $0x2,-0x4(%rbp)
jl     1d03 <kernel_dgemm_nn_2x4_vs_lib4+0xc03>
movsd  -0x88(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    0x18(%rbp),%rax
movsd  %xmm0,0x30(%rax)
jmp    1d08 <kernel_dgemm_nn_2x4_vs_lib4+0xc08>
jmp    1d0d <kernel_dgemm_nn_2x4_vs_lib4+0xc0d>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<kernel_dgemm_nn_2x4_vs_lib4>:
push   %r15
push   %r14
push   %rbx
cmp    $0x4,%edx
jl     12b7 <kernel_dgemm_nn_2x4_vs_lib4+0x1b7>
lea    -0x3(%rdx),%r10d
shl    $0x2,%r9d
movslq %r9d,%r9
shl    $0x3,%r9
xorpd  %xmm7,%xmm7
xor    %eax,%eax
xorpd  %xmm2,%xmm2
xorpd  %xmm3,%xmm3
xorpd  %xmm1,%xmm1
nop
movupd (%rcx),%xmm5
movupd 0x20(%rcx),%xmm11
movupd 0x40(%rcx),%xmm10
movupd 0x60(%rcx),%xmm8
movsd  (%r8),%xmm6
movsd  0x8(%r8),%xmm0
movsd  0x10(%r8),%xmm4
movsd  0x18(%r8),%xmm9
unpcklpd %xmm6,%xmm6
mulpd  %xmm5,%xmm6
addpd  %xmm1,%xmm6
movsd  0x20(%r8),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm5,%xmm1
addpd  %xmm2,%xmm1
movsd  0x40(%r8),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm5,%xmm2
addpd  %xmm3,%xmm2
movsd  0x60(%r8),%xmm3
unpcklpd %xmm3,%xmm3
mulpd  %xmm5,%xmm3
addpd  %xmm7,%xmm3
unpcklpd %xmm0,%xmm0
mulpd  %xmm11,%xmm0
addpd  %xmm6,%xmm0
movsd  0x28(%r8),%xmm7
unpcklpd %xmm7,%xmm7
mulpd  %xmm11,%xmm7
addpd  %xmm1,%xmm7
movsd  0x48(%r8),%xmm1
unpcklpd %xmm1,%xmm1
mulpd  %xmm11,%xmm1
addpd  %xmm2,%xmm1
movsd  0x68(%r8),%xmm2
unpcklpd %xmm2,%xmm2
mulpd  %xmm11,%xmm2
addpd  %xmm3,%xmm2
unpcklpd %xmm4,%xmm4
mulpd  %xmm10,%xmm4
addpd  %xmm0,%xmm4
movsd  0x30(%r8),%xmm6
unpcklpd %xmm6,%xmm6
mulpd  %xmm10,%xmm6
addpd  %xmm7,%xmm6
movsd  0x50(%r8),%xmm5
unpcklpd %xmm5,%xmm5
mulpd  %xmm10,%xmm5
addpd  %xmm1,%xmm5
movsd  0x70(%r8),%xmm0
unpcklpd %xmm0,%xmm0
mulpd  %xmm10,%xmm0
addpd  %xmm2,%xmm0
unpcklpd %xmm9,%xmm9
mulpd  %xmm8,%xmm9
movapd %xmm9,%xmm1
addpd  %xmm4,%xmm1
movsd  0x38(%r8),%xmm11
unpcklpd %xmm11,%xmm11
mulpd  %xmm8,%xmm11
movapd %xmm11,%xmm2
addpd  %xmm6,%xmm2
movsd  0x58(%r8),%xmm12
unpcklpd %xmm12,%xmm12
mulpd  %xmm8,%xmm12
movapd %xmm12,%xmm3
addpd  %xmm5,%xmm3
movsd  0x78(%r8),%xmm10
unpcklpd %xmm10,%xmm10
mulpd  %xmm8,%xmm10
movapd %xmm10,%xmm7
addpd  %xmm0,%xmm7
sub    $0xffffffffffffff80,%rcx
add    $0x4,%eax
add    %r9,%r8
cmp    %r10d,%eax
jl     1130 <kernel_dgemm_nn_2x4_vs_lib4+0x30>
addpd  %xmm0,%xmm10
addpd  %xmm5,%xmm12
addpd  %xmm6,%xmm11
addpd  %xmm4,%xmm9
mov    %edx,%eax
and    $0xfffffffc,%eax
jmp    12cd <kernel_dgemm_nn_2x4_vs_lib4+0x1cd>
xorpd  %xmm10,%xmm10
xor    %eax,%eax
xorpd  %xmm11,%xmm11
xorpd  %xmm12,%xmm12
xorpd  %xmm9,%xmm9
mov    0x30(%rsp),%r9d
cmp    %edx,%eax
jge    1390 <kernel_dgemm_nn_2x4_vs_lib4+0x290>
sub    %eax,%edx
xor    %eax,%eax
xchg   %ax,%ax
movapd %xmm9,%xmm8
movapd %xmm12,%xmm3
movapd %xmm11,%xmm2
movapd %xmm10,%xmm6
movupd (%rcx),%xmm1
movsd  (%r8,%rax,8),%xmm0
movsd  0x20(%r8,%rax,8),%xmm4
movsd  0x40(%r8,%rax,8),%xmm5
movsd  0x60(%r8,%rax,8),%xmm7
unpcklpd %xmm0,%xmm0
mulpd  %xmm1,%xmm0
movapd %xmm0,%xmm9
addpd  %xmm8,%xmm9
unpcklpd %xmm4,%xmm4
mulpd  %xmm1,%xmm4
movapd %xmm4,%xmm11
addpd  %xmm2,%xmm11
unpcklpd %xmm5,%xmm5
mulpd  %xmm1,%xmm5
movapd %xmm5,%xmm12
addpd  %xmm3,%xmm12
unpcklpd %xmm7,%xmm7
mulpd  %xmm1,%xmm7
movapd %xmm7,%xmm10
addpd  %xmm6,%xmm10
add    $0x20,%rcx
add    $0x1,%rax
cmp    %eax,%edx
jne    12e0 <kernel_dgemm_nn_2x4_vs_lib4+0x1e0>
addpd  %xmm6,%xmm7
addpd  %xmm3,%xmm5
addpd  %xmm2,%xmm4
addpd  %xmm8,%xmm0
movapd %xmm7,%xmm10
movapd %xmm4,%xmm11
movapd %xmm5,%xmm12
movapd %xmm0,%xmm9
mov    0x40(%rsp),%r8d
mov    0x28(%rsp),%r10
test   %r9d,%r9d
je     1435 <kernel_dgemm_nn_2x4_vs_lib4+0x335>
mov    0x20(%rsp),%rdx
lea    0x8(%rdx),%rcx
cmpl   $0x0,0x38(%rsp)
je     13cd <kernel_dgemm_nn_2x4_vs_lib4+0x2cd>
lea    0x10(%rdx),%r11
lea    0x18(%rdx),%r14
mov    %rcx,%r15
lea    0x20(%rdx),%rcx
lea    0x30(%rdx),%rbx
mov    $0x7,%eax
jmp    13e2 <kernel_dgemm_nn_2x4_vs_lib4+0x2e2>
lea    0x20(%rdx),%r15
lea    0x40(%rdx),%r11
lea    0x48(%rdx),%rbx
lea    0x60(%rdx),%r14
mov    $0xd,%eax
movsd  (%rdx,%rax,8),%xmm0
movsd  (%rbx),%xmm4
movsd  (%rdx),%xmm3
movsd  0x28(%rdx),%xmm6
movsd  (%rcx),%xmm7
movsd  (%r14),%xmm1
movsd  (%r11),%xmm2
movsd  (%r15),%xmm5
unpcklpd %xmm7,%xmm3
cmp    $0x1,%r9d
jne    14a9 <kernel_dgemm_nn_2x4_vs_lib4+0x3a9>
addpd  %xmm3,%xmm9
unpcklpd %xmm6,%xmm5
addpd  %xmm5,%xmm11
unpcklpd %xmm4,%xmm2
addpd  %xmm2,%xmm12
unpcklpd %xmm0,%xmm1
addpd  %xmm1,%xmm10
test   %r8d,%r8d
je     14e6 <kernel_dgemm_nn_2x4_vs_lib4+0x3e6>
movapd %xmm12,%xmm2
unpckhpd %xmm10,%xmm2
movapd %xmm11,%xmm4
unpckhpd %xmm11,%xmm4
movapd %xmm9,%xmm1
unpckhpd %xmm9,%xmm1
movapd %xmm10,%xmm0
movapd %xmm2,%xmm10
movsd  %xmm9,(%r10)
movsd  %xmm11,0x8(%r10)
movsd  %xmm12,0x10(%r10)
cmp    $0x4,%esi
jl     1513 <kernel_dgemm_nn_2x4_vs_lib4+0x413>
movsd  %xmm0,0x18(%r10)
cmp    $0x2,%edi
jl     154c <kernel_dgemm_nn_2x4_vs_lib4+0x44c>
movsd  %xmm1,0x20(%r10)
mov    $0x7,%ecx
mov    $0x6,%eax
mov    $0x5,%edx
jmp    1535 <kernel_dgemm_nn_2x4_vs_lib4+0x435>
subpd  %xmm9,%xmm3
unpcklpd %xmm6,%xmm5
subpd  %xmm11,%xmm5
unpcklpd %xmm4,%xmm2
subpd  %xmm12,%xmm2
unpcklpd %xmm0,%xmm1
subpd  %xmm10,%xmm1
movapd %xmm1,%xmm10
movapd %xmm5,%xmm11
movapd %xmm2,%xmm12
movapd %xmm3,%xmm9
test   %r8d,%r8d
jne    143e <kernel_dgemm_nn_2x4_vs_lib4+0x33e>
movlpd %xmm9,(%r10)
cmp    $0x2,%edi
jl     1552 <kernel_dgemm_nn_2x4_vs_lib4+0x452>
movhpd %xmm9,0x8(%r10)
movupd %xmm11,0x20(%r10)
movupd %xmm12,0x40(%r10)
cmp    $0x3,%esi
jle    154c <kernel_dgemm_nn_2x4_vs_lib4+0x44c>
mov    $0xd,%ecx
mov    $0xc,%eax
jmp    153b <kernel_dgemm_nn_2x4_vs_lib4+0x43b>
cmp    $0x2,%edi
jl     154c <kernel_dgemm_nn_2x4_vs_lib4+0x44c>
unpcklpd %xmm10,%xmm4
mov    $0x6,%ecx
mov    $0x5,%eax
mov    $0x4,%edx
movapd %xmm4,%xmm10
movapd %xmm1,%xmm4
movsd  %xmm4,(%r10,%rdx,8)
movlpd %xmm10,(%r10,%rax,8)
unpckhpd %xmm10,%xmm10
movsd  %xmm10,(%r10,%rcx,8)
pop    %rbx
pop    %r14
pop    %r15
ret
movlpd %xmm11,0x20(%r10)
movlpd %xmm12,0x40(%r10)
cmp    $0x3,%esi
jle    154c <kernel_dgemm_nn_2x4_vs_lib4+0x44c>
mov    $0xc,%ecx
jmp    1546 <kernel_dgemm_nn_2x4_vs_lib4+0x446>

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

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